diff --git a/.dockerignore b/.dockerignore index 5c69ffc54..386c86a71 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,6 @@ node_modules -/dist/* -!/dist/dashboard +/dist logs +c2d_storage .env.local .env \ No newline at end of file diff --git a/.env.example b/.env.example index 264e0dfdc..16e6c68c7 100644 --- a/.env.example +++ b/.env.example @@ -20,17 +20,25 @@ export FEE_AMOUNT= export ADDRESS_FILE= export NODE_ENV= export AUTHORIZED_DECRYPTERS= +export AUTHORIZED_DECRYPTERS_LIST= export OPERATOR_SERVICE_URL= +export POLICY_SERVER_URL export INTERFACES= export ALLOWED_VALIDATORS= +export ALLOWED_VALIDATORS_LIST= +export AUTHORIZED_PUBLISHERS= +export AUTHORIZED_PUBLISHERS_LIST= export INDEXER_INTERVAL= export ALLOWED_ADMINS= -export DASHBOARD=true +export ALLOWED_ADMINS_LIST= +export CONTROL_PANEL=true export RATE_DENY_LIST= -export MAX_REQ_PER_SECOND= +export MAX_REQ_PER_MINUTE= export MAX_CHECKSUM_LENGTH= export LOG_LEVEL= export HTTP_API_PORT= +export VALIDATE_UNSIGNED_DDO= +export JWT_SECRET= ## p2p @@ -55,4 +63,9 @@ export P2P_ENABLE_AUTONAT= export P2P_ENABLE_CIRCUIT_RELAY_SERVER= export P2P_ENABLE_CIRCUIT_RELAY_CLIENT= export P2P_BOOTSTRAP_NODES= -export P2P_FILTER_ANNOUNCED_ADDRESSES= \ No newline at end of file +export P2P_FILTER_ANNOUNCED_ADDRESSES= + +## compute +export DOCKER_COMPUTE_ENVIRONMENTS= + + diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d980860e6..bd625b872 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @alexcos20 \ No newline at end of file +- @alexcos20 diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 000000000..b294aa687 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,288 @@ +# Ocean Node - AI Coding Agent Instructions + +## Project Overview + +**Ocean Node** is a unified Node.js service that consolidates three core Ocean Protocol components: + +- **Provider** (data access control & payment verification) +- **Aquarius** (metadata/DDO indexing and caching) +- **Subgraph** (blockchain event tracking) + +Nodes communicate via HTTP API and libp2p P2P network, support multi-chain operations (Ethereum, Optimism, Polygon, etc.), and enable data asset discovery, compute-to-data (C2D), and transaction validation. + +## Architecture Patterns + +### Handler-Registry Command Pattern + +All P2P and HTTP requests follow a handler-based architecture: + +1. **Command arrives** (via P2P or HTTP) → request validated → handler resolved from `CoreHandlersRegistry` +2. **Handler execution**: Each extends `CommandHandler` or `AdminCommandHandler`, implements `validate()` and `handle()` methods +3. **Response returned**: Streams P2PCommandResponse (JSON or binary) to caller + +**Key files**: [src/components/core/handler/coreHandlersRegistry.ts](src/components/core/handler/coreHandlersRegistry.ts), [src/components/core/handler/handler.ts](src/components/core/handler/handler.ts) + +Example handler structure: + +```typescript +export class FileInfoHandler extends CommandHandler { + validate(command: FileInfoCommand): ValidateParams { + return validateCommandParameters(command, ['fileIndex', 'documentId', 'serviceId']) + } + async handle(task: FileInfoCommand): Promise { + // Implementation + } +} +``` + +**Protocol commands** defined in [src/utils/constants.ts](src/utils/constants.ts): `PROTOCOL_COMMANDS` object with 40+ commands (download, encrypt, compute operations, admin tasks, etc.) + +### Database Abstraction Layer + +Multiple database backends via `DatabaseFactory` pattern: + +- **Elasticsearch**: DDO metadata, indexer state, orders (async) +- **Typesense**: Search-optimized metadata queries +- **SQLite**: Nonce tracking, config storage, c2d Database (local) + +Access via singleton `Database` class: `db.ddo`, `db.indexer`, `db.order`, `db.c2d`, `db.nonce`, etc. + +### OceanNode Singleton + +Central coordinator managing all components. Initialize with configuration and optional database/P2P/Provider/Indexer instances. Accessed via `OceanNode.getInstance()`. + +## Critical Workflows + +### Adding a New Command Handler + +1. Define command type in [src/@types/commands.ts](src/@types/commands.ts) +2. Create handler class extending `CommandHandler` in `src/components/core/handler/` +3. Register in `CoreHandlersRegistry` constructor: `this.registerCoreHandler(PROTOCOL_COMMANDS.MY_COMMAND, new MyHandler(node))` +4. Add to `SUPPORTED_PROTOCOL_COMMANDS` in [src/utils/constants.ts](src/utils/constants.ts) +5. Handlers receive `OceanNode` in constructor for accessing escrow, config, database, P2P network + +### Building & Testing + +- **Build**: `npm run build` → compiles TypeScript to `./dist/` +- **Tests**: `npm run test` runs unit + integration (requires Docker Compose for Typesense) +- **Dev**: Use `npm run build:tsc` in watch mode, or Node's `--experimental-specifier-resolution=node` for ESM imports + +### Configuration + +Environment-driven via `.env` or `CONFIG_PATH=/path/to/config.json`: + +- **PRIVATE_KEY** (required): Node identity for P2P + crypto operations +- **DB_URL**: Elasticsearch/Typesense connection +- **RPCS**: JSON mapping network IDs to RPC endpoints +- **OPERATOR_SERVICE_URL**: C2D cluster URLs (array of strings) +- See [docs/env.md](docs/env.md) for 40+ environment variables + +## Project-Specific Patterns & Conventions + +### Module-Specific Loggers + +Use module-specific loggers instead of `console.log`. Import from [src/utils/logging/common.ts](src/utils/logging/common.ts): + +```typescript +import { + CORE_LOGGER, + INDEXER_LOGGER, + P2P_LOGGER, + PROVIDER_LOGGER +} from './utils/logging/common.js' +``` + +Prevents log message mixing; enables module-level filtering/transport config. + +### Validation Pattern + +Commands validate parameters before execution. Use `validateCommandParameters()` in handlers: + +```typescript +validateCommandParameters(command, ['required', 'fields']) // throws ValidateParams response +``` + +### Rate Limiting & Request Tracking + +`BaseHandler.checkRequestData()` tracks per-IP/peer-ID requests within time windows. Respect `MAX_REQ_PER_MINUTE` config. + +### DDO/Asset Schema Validation + +DDOs validated against SHACL schemas in [schemas/](schemas/) (v1, v3, v5, v7). Indexer enforces validation; check `ValidateDDOHandler` for signature verification. + +### Error Response Format + +All handlers return `P2PCommandResponse`: `{ httpStatus, body?, stream?, error? }`. Stream responses use Node.js Readable for large data (downloads, logs). + +### TypeScript ES Module Configuration + +- Target: ES2022 +- Module resolution: Node +- Config: [tsconfig.json](tsconfig.json) includes source maps for debugging +- Run node with: `node --experimental-specifier-resolution=node dist/index.js` + +## Key Files Quick Reference + +| File | Purpose | +| ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | +| [src/index.ts](src/index.ts) | Entry point; Express app setup, component initialization | +| [src/OceanNode.ts](src/OceanNode.ts) | Singleton coordinator; escrow, auth, rate limiting | +| [src/components/core/handler/coreHandlersRegistry.ts](src/components/core/handler/coreHandlersRegistry.ts) | Command handler registry (40+ handlers) | +| [src/components/database/](src/components/database/) | Database abstraction & factory | +| [src/components/P2P/](src/components/P2P/) | libp2p networking, P2P command routing | +| [src/components/Indexer/](src/components/Indexer/) | Blockchain event crawling, DDO indexing | +| [src/components/Provider/](src/components/Provider/) | Payment validation, access control | +| [src/utils/constants.ts](src/utils/constants.ts) | 40+ protocol commands, network IDs, environment variable definitions | +| [src/@types/](src/@types/) | Command & data type definitions | +| [docs/Arhitecture.md](docs/Arhitecture.md) | Detailed architecture (layers, components, modules) | + +## Testing Approach + +- **Unit tests**: [src/test/unit/](src/test/unit/) - handler validation, command parsing (no DB required) +- **Integration tests**: [src/test/integration/](src/test/integration/) - full stack with Docker Compose services +- **Performance tests**: [src/test/performance/](src/test/performance/) - k6 load/stress tests + +Run specific suite: `npm run test:unit` | `npm run test:integration` | `npm run mocha "dist/test/unit/**/*.test.js"` + +## P2P Communication (libp2p) + +### Network Topology & Peer Discovery + +- **Transport layers**: TCP, WebSockets, Circuit Relay (NAT traversal) +- **Peer discovery mechanisms**: + - mDNS (local network discovery) + - Kademlia DHT (global peer discovery) + - Bootstrap nodes (static list from config) +- **Core protocols**: Identify (peer metadata), Ping, AutoNAT (public address detection), UPnP (port forwarding) + +### Command Flow + +1. P2P request arrives on protocol stream +2. `handleProtocolCommands()` in [src/components/P2P/handleProtocolCommands.ts](src/components/P2P/handleProtocolCommands.ts) parses incoming JSON command +3. Rate limiting checks per peer ID and IP address +4. Handler resolved from `CoreHandlersRegistry.getHandler(command.command)` +5. Response streamed back (JSON metadata + optional binary payload for large data) +6. Stream automatically closed by libp2p after transmission + +### Rate Limiting + +P2P enforces two-tier rate limiting: + +- **Per-peer limits**: `MAX_REQ_PER_MINUTE` (default 30) per peer ID +- **Global limits**: `MAX_CONNECTIONS_PER_MINUTE` (default 120) across all peers +- **Deny list**: `RATE_DENY_LIST` can block specific peer IDs or IP addresses + +### Key Files + +- [src/components/P2P/index.ts](src/components/P2P/index.ts) - libp2p initialization, topology +- [src/components/P2P/handleProtocolCommands.ts](src/components/P2P/handleProtocolCommands.ts) - command routing & rate limiting + +## HTTP API + +### Request Flow + +1. Express route receives HTTP request (JSON or multipart) +2. Route handler maps to corresponding handler class +3. Handler executes same command logic as P2P +4. Response serialized as JSON or streamed binary data + +### API Route Categories + +- **Provider routes** (`/api/services/`): decrypt, encrypt, download, initialize, nonce - data access & payment +- **Aquarius routes** (`/api/aquarius/`): DDO retrieval, metadata querying, validation, state tracking +- **Compute routes** (`/api/services/compute`): start/stop jobs, get environments, fetch results/logs +- **P2P routes** (`/p2pRoutes`): get peer list, network stats +- **Admin routes** (`/admin/`): fetch/push config, reindex, stop node (requires ALLOWED_ADMINS) +- **Direct command route** (`/directCommand`): low-level handler invocation with raw command objects + +### Key Pattern: Handler Reuse + +HTTP routes instantiate handlers directly instead of going through P2P: + +```typescript +const response = await new ComputeGetEnvironmentsHandler(req.oceanNode).handle(task) +``` + +This ensures **identical business logic** between P2P and HTTP endpoints. + +### Streaming Large Data + +Binary responses (encrypted files, logs) use Node.js Readable streams to avoid loading into memory: + +```typescript +if (response.stream) { + res.setHeader('Content-Type', 'application/octet-stream') + response.stream.pipe(res) +} +``` + +### Key Files + +- [src/components/httpRoutes/index.ts](src/components/httpRoutes/index.ts) - route aggregation +- [src/components/httpRoutes/commands.ts](src/components/httpRoutes/commands.ts) - `/directCommand` handler +- [src/components/httpRoutes/compute.ts](src/components/httpRoutes/compute.ts) - compute endpoints +- [src/components/httpRoutes/validateCommands.ts](src/components/httpRoutes/validateCommands.ts) - request validation + +## Compute-to-Data (C2D) + +### Architecture + +C2D enables running algorithms on datasets without downloading them. The node coordinates with C2D clusters: + +1. **Multiple C2D engines**: Support different deployment types (Docker-based, Kubernetes) +2. **Job tracking**: `C2DDatabase` stores job metadata, status, results +3. **Payment validation**: Escrow holds funds until job completes +4. **Result retrieval**: Users can fetch results/logs after completion + +### C2D Engine Types + +- **Docker**: Local or remote Docker daemon (light-weight, suitable for edge nodes) +- **Kubernetes**: Full Ocean C2D infrastructure (production scaling) + +### Workflow Steps + +1. **Initialize compute** (`COMPUTE_INITIALIZE`) - validates payment credentials, reserves escrow +2. **Start compute** (`COMPUTE_START` or `FREE_COMPUTE_START`) - submits job to C2D engine +3. **Get status** (`COMPUTE_GET_STATUS`) - polls job progress +4. **Fetch results** (`COMPUTE_GET_RESULT`) - retrieves algorithm output +5. **Stream logs** (`COMPUTE_GET_STREAMABLE_LOGS`) - live job log access +6. **Stop compute** (`COMPUTE_STOP`) - cancels running job, releases escrow (if applicable) + +### Configuration + +C2D clusters configured via `OPERATOR_SERVICE_URL`: + +```json +{ + "c2dClusters": [ + { + "type": "docker", + "url": "http://localhost:8050", + "node": "local-docker-node" + } + ] +} +``` + +### Key Files + +- [src/components/c2d/compute_engines.ts](src/components/c2d/compute_engines.ts) - engine coordination +- [src/components/c2d/compute_engine_base.ts](src/components/c2d/compute_engine_base.ts) - base class interface +- [src/components/c2d/compute_engine_docker.ts](src/components/c2d/compute_engine_docker.ts) - Docker implementation +- [src/components/core/compute/](src/components/core/compute/) - compute handlers +- [src/components/database/C2DDatabase.ts](src/components/database/C2DDatabase.ts) - job persistence + +## Common Tasks + +| Task | Command | +| --------------------- | --------------------------------------------------------------- | +| Check code quality | `npm run lint` | +| Format code | `npm run format` | +| Type check only | `npm run type-check` | +| Start node locally | `npm run start` (requires `.env` setup) | +| Quick start in Docker | `npm run quickstart` or `bash scripts/ocean-node-quickstart.sh` | +| View logs | `./scripts/logs.sh` or `npm run logs` | + +--- + +**When adding features or fixing bugs**: Verify the handler pattern/architecture applies, use module-specific loggers, follow rate-limit conventions, and ensure integration tests cover new command flows. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 72e8444fc..794c6e343 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 'v20.16.0' + node-version: 'v22.15.0' - name: Cache node_modules uses: actions/cache@v3 env: @@ -42,7 +42,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - node: ['18.20.4', 'v20.16.0', 'v22.5.1'] + node: ['18.20.4', 'v20.19.0', 'v22.15.0'] steps: - uses: actions/checkout@v4 @@ -66,7 +66,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 'v20.16.0' + node-version: 'v22.15.0' - name: Cache node_modules uses: actions/cache@v3 env: @@ -85,8 +85,10 @@ jobs: IPFS_GATEWAY: http://172.15.0.16:8080/ ARWEAVE_GATEWAY: https://arweave.net/ RPCS: '{ "1": {"rpc": "https://rpc.eth.gateway.fm", "chainId": 1, "network": "mainet", "chunkSize": 100}, "137": {"rpc": "https://polygon.meowrpc.com", "chainId": 137, "network": "polygon", "chunkSize": 100 }, "80001": {"rpc": "https://rpc-mumbai.maticvigil.com","chainId": 80001, "network": "polygon-mumbai", "chunkSize": 100 } }' - DB_URL: 'http://localhost:8108/?apiKey=xyz' DB_TYPE: 'typesense' + DB_URL: 'http://localhost:8108/?apiKey=xyz' + DB_USERNAME: 'elastic' + DB_PASSWORD: 'changeme' FEE_TOKENS: '{ "1": "0x967da4048cD07aB37855c090aAF366e4ce1b9F48", "137": "0x282d8efCe846A88B159800bd4130ad77443Fa1A1", "80001": "0xd8992Ed72C445c35Cb4A2be468568Ed1079357c8", "56": "0xDCe07662CA8EbC241316a15B611c89711414Dd1a" }' FEE_AMOUNT: '{ "amount": 1, "unit": "MB" }' - uses: actions/upload-artifact@v4 @@ -100,7 +102,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 'v20.16.0' + node-version: 'v22.15.0' - name: Cache node_modules uses: actions/cache@v3 env: @@ -126,36 +128,27 @@ jobs: - name: Run Barge working-directory: ${{ github.workspace }}/barge run: | - bash -x start_ocean.sh --no-aquarius --no-provider --no-dashboard --with-c2d --with-typesense 2>&1 > start_ocean.log & + bash -x start_ocean.sh --no-node --with-typesense 2>&1 > start_ocean.log & - run: npm ci - run: npm run build - run: docker image ls - name: Delete default runner images run: | - docker image rm node:20 - docker image rm node:20-alpine - docker image rm node:18 - docker image rm node:18-alpine - docker image rm debian:10 - docker image rm debian:11 - docker image rm ubuntu:22.04 - docker image rm ubuntu:20.04 - docker image rm moby/buildkit:latest rm -rf /usr/share/swift/ - - name: Wait for contracts deployment and C2D cluster to be ready + - name: Wait for contracts deployment working-directory: ${{ github.workspace }}/barge run: | for i in $(seq 1 250); do - sleep 10 - [ -f "$HOME/.ocean/ocean-contracts/artifacts/ready" -a -f "$HOME/.ocean/ocean-c2d/ready" ] && break + sleep 5 + [ -f "$HOME/.ocean/ocean-contracts/artifacts/ready" ] && break done - name: docker logs - run: docker logs ocean-ocean-contracts-1 && docker logs ocean-kindcluster-1 && docker logs ocean-computetodata-1 && docker logs ocean-typesense-1 + run: docker logs ocean-ocean-contracts-1 && docker logs ocean-typesense-1 if: ${{ failure() }} - name: integration tests run: npm run test:integration:cover env: - OPERATOR_SERVICE_URL: '["http://172.15.0.13:31000"]' + # OPERATOR_SERVICE_URL: '["http://172.15.0.13:31000"]' PRIVATE_KEY: ${{ secrets.NODE1_PRIVATE_KEY }} NODE1_PRIVATE_KEY: ${{ secrets.NODE1_PRIVATE_KEY }} NODE2_PRIVATE_KEY: ${{ secrets.NODE2_PRIVATE_KEY }} @@ -163,14 +156,16 @@ jobs: IPFS_GATEWAY: http://172.15.0.16:8080/ ARWEAVE_GATEWAY: https://arweave.net/ RPCS: '{ "8996": {"rpc": "http://127.0.0.1:8545", "chainId": 8996, "network": "development", "chunkSize": 100}}' - DB_URL: 'http://localhost:9200' - DB_TYPE: 'elasticsearch' + DB_TYPE: 'typesense' + DB_URL: 'http://localhost:8108/?apiKey=xyz' + DB_USERNAME: 'elastic' + DB_PASSWORD: 'changeme' FEE_TOKENS: '{ "1": "0x967da4048cD07aB37855c090aAF366e4ce1b9F48", "137": "0x282d8efCe846A88B159800bd4130ad77443Fa1A1", "80001": "0xd8992Ed72C445c35Cb4A2be468568Ed1079357c8", "56": "0xDCe07662CA8EbC241316a15B611c89711414Dd1a" }' FEE_AMOUNT: '{ "amount": 1, "unit": "MB" }' ASSET_PURGATORY_URL: 'https://raw.githubusercontent.com/oceanprotocol/list-purgatory/main/list-assets.json' ACCOUNT_PURGATORY_URL: 'https://raw.githubusercontent.com/oceanprotocol/list-purgatory/main/list-accounts.json' - name: docker logs - run: docker logs ocean-ocean-contracts-1 && docker logs ocean-kindcluster-1 && docker logs ocean-computetodata-1 && docker logs ocean-typesense-1 + run: docker logs ocean-ocean-contracts-1 && docker logs ocean-typesense-1 if: ${{ failure() }} - uses: actions/upload-artifact@v4 with: @@ -187,7 +182,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: 'v20.16.0' + node-version: 'v22.15.0' - name: Cache node_modules uses: actions/cache@v3 @@ -206,7 +201,6 @@ jobs: with: repository: 'oceanprotocol/barge' path: 'barge' - - name: Login to Docker Hub if: ${{ env.DOCKERHUB_PASSWORD && env.DOCKERHUB_USERNAME }} run: | @@ -219,22 +213,12 @@ jobs: - name: Run Barge working-directory: ${{ github.workspace }}/barge run: | - bash -x start_ocean.sh --no-aquarius --no-provider --no-dashboard --with-c2d --with-typesense 2>&1 > start_ocean.log & - + bash -x start_ocean.sh --no-node --with-typesense 2>&1 > start_ocean.log & - run: npm ci - run: npm run build - run: docker image ls - name: Delete default runner images run: | - docker image rm node:20 - docker image rm node:20-alpine - docker image rm node:18 - docker image rm node:18-alpine - docker image rm debian:10 - docker image rm debian:11 - docker image rm ubuntu:22.04 - docker image rm ubuntu:20.04 - docker image rm moby/buildkit:latest rm -rf /usr/share/swift/ - name: Wait for contracts deployment and C2D cluster to be ready @@ -242,11 +226,11 @@ jobs: run: | for i in $(seq 1 250); do sleep 10 - [ -f "$HOME/.ocean/ocean-contracts/artifacts/ready" -a -f "$HOME/.ocean/ocean-c2d/ready" ] && break + [ -f "$HOME/.ocean/ocean-contracts/artifacts/ready" ] && break done - name: docker logs - run: docker logs ocean-ocean-contracts-1 && docker logs ocean-kindcluster-1 && docker logs ocean-computetodata-1 && docker logs ocean-typesense-1 + run: docker logs ocean-contracts-1 && docker logs ocean-typesense-1 if: ${{ failure() }} - name: Checkout Ocean Node @@ -261,7 +245,7 @@ jobs: run: | npm ci npm run build - npm run start & + npm run start > ocean-node.log 2>&1 & env: PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} IPFS_GATEWAY: http://172.15.0.16:8080/ @@ -270,7 +254,6 @@ jobs: HTTP_API_PORT: 8001 RPCS: '{ "8996": {"rpc": "http://127.0.0.1:8545", "chainId": 8996, "network": "development", "chunkSize": 100} }' INDEXER_NETWORKS: '[8996]' - DB_URL: 'http://localhost:9200' FEE_TOKENS: '{ "1": "0x967da4048cD07aB37855c090aAF366e4ce1b9F48", "137": "0x282d8efCe846A88B159800bd4130ad77443Fa1A1", "80001": "0xd8992Ed72C445c35Cb4A2be468568Ed1079357c8", "56": "0xDCe07662CA8EbC241316a15B611c89711414Dd1a" }' FEE_AMOUNT: '{ "amount": 1, "unit": "MB" }' AUTHORIZED_DECRYPTERS: '["0xe2DD09d719Da89e5a3D0F2549c7E24566e947260"]' @@ -278,10 +261,16 @@ jobs: P2P_ENABLE_AUTONAT: 'false' ALLOWED_ADMINS: '["0xe2DD09d719Da89e5a3D0F2549c7E24566e947260"]' DB_TYPE: 'elasticsearch' + DB_URL: 'http://localhost:9200' + DB_USERNAME: 'elastic' + DB_PASSWORD: 'changeme' + MAX_REQ_PER_MINUTE: 320 + MAX_CONNECTIONS_PER_MINUTE: 320 + DOCKER_COMPUTE_ENVIRONMENTS: '[{"socketPath":"/var/run/docker.sock","resources":[{"id":"disk","total":10}],"storageExpiry":604800,"maxJobDuration":3600,"minJobDuration": 60,"fees":{"8996":[{"prices":[{"id":"cpu","price":1}]}]},"free":{"maxJobDuration":60,"minJobDuration": 10,"maxJobs":3,"resources":[{"id":"cpu","max":1},{"id":"ram","max":1},{"id":"disk","max":1}]}}]' - name: Check Ocean Node is running run: | for i in $(seq 1 90); do - if curl --output /dev/null --silent --head --fail "http://localhost:8001"; then + if curl --output /dev/null --silent --max-time 1 --head --fail "http://localhost:8001"; then echo "Ocean Node is up" exit 0 fi @@ -294,7 +283,6 @@ jobs: with: repository: 'oceanprotocol/ocean-cli' path: 'ocean-cli' - ref: 'main' - name: Setup Ocean CLI working-directory: ${{ github.workspace }}/ocean-cli run: | @@ -303,3 +291,39 @@ jobs: - name: Run system tests working-directory: ${{ github.workspace }}/ocean-cli run: npm run test:system + env: + AVOID_LOOP_RUN: true + - name: Show Ocean Node logs on failure + if: failure() + working-directory: ${{ github.workspace }}/ocean-node + run: | + echo "=== Ocean Node Logs ===" + if [ -f ocean-node.log ]; then + cat ocean-node.log + else + echo "No ocean-node.log file found" + fi + echo "=== Docker Logs ===" + docker logs ocean-contracts-1 || echo "No ocean-contracts-1 container" + docker logs ocean-typesense-1 || echo "No ocean-typesense-1 container" + echo "=== System Processes ===" + ps aux | grep -E "(node|ocean)" || echo "No node/ocean processes found" + + control_panel_build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 'v22.15.0' + - name: Cache node_modules + uses: actions/cache@v3 + env: + cache-name: cache-node-modules + with: + path: ~/.npm + key: ${{ runner.os }}-control-panel-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: ${{ runner.os }}-control-panel-${{ env.cache-name }}- + - run: npm ci + - name: Build control panel + run: npm run build:controlpanel diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 0fb699baf..e4b1454d6 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -14,13 +14,11 @@ on: jobs: build: runs-on: ubuntu-latest + if: ${{ github.actor != 'dependabot[bot]' }} strategy: fail-fast: false matrix: - platform: - - linux/amd64 - - linux/arm64 - - linux/arm/v7 + platform: ${{ github.event_name == 'pull_request' && fromJSON('["linux/amd64"]') || fromJSON('["linux/amd64","linux/arm64","linux/arm/v7"]') }} steps: - name: Prepare run: | @@ -38,11 +36,11 @@ jobs: uses: docker/setup-buildx-action@v3 with: platforms: ${{ matrix.platform }} - #- name: Login to Docker Hub - # uses: docker/login-action@v1 - # with: - # username: ${{ secrets.DOCKERHUB_USERNAME }} - # password: ${{ secrets.DOCKER_PUSH_TOKEN }} + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKER_PUSH_TOKEN }} - name: Set Docker metadata id: ocean_node_meta @@ -81,3 +79,45 @@ jobs: path: /tmp/digests/* if-no-files-found: error retention-days: 1 + + merge: + runs-on: ubuntu-latest + if: ${{ github.actor != 'dependabot[bot]' }} + needs: + - build + steps: + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Set Docker metadata + id: ocean_node_meta + uses: docker/metadata-action@v5 + with: + images: | + ocnenterprise/ocean-node + # generate Docker tags based on the following events/attributes + tags: | + type=ref,event=branch + type=semver,pattern={{version}} + type=ref,event=pr + # type=semver,pattern={{major}}.{{minor}} + # type=semver,pattern={{major}} + # type=sha + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKER_PUSH_TOKEN }} + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf 'ocnenterprise/ocean-node@sha256:%s ' *) + - name: Inspect image + run: | + docker buildx imagetools inspect ocnenterprise/ocean-node:${{ steps.ocean_node_meta.outputs.version }} diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml new file mode 100644 index 000000000..b48d25f28 --- /dev/null +++ b/.github/workflows/n8n.yml @@ -0,0 +1,57 @@ +name: Trigger N8N Security Scan + +on: + issue_comment: + types: [created] + +jobs: + trigger-n8n: + if: github.event.issue.pull_request && contains(github.event.comment.body, '/run-security-scan') + runs-on: ubuntu-latest + steps: + - name: Prepare hybrid payload + id: payload + run: | + echo "Building payload.json" + # Ensure overrides is always valid JSON + OVERRIDES='${{ github.event.inputs.overrides }}' + if [ -z "$OVERRIDES" ]; then + OVERRIDES="{}" + fi + + cat < payload.json + { + "htmlUrl": "${{ github.event.issue.html_url }}", + "repo": "${{ github.repository }}", + "owner": "${{ github.repository_owner }}", + "branch": "${{ github.ref_name }}", + "commit": "${{ github.sha }}", + "actor": "${{ github.actor }}", + + "before": "${{ github.event.before || '' }}", + "after": "${{ github.event.after || '' }}", + + "pr": ${{ github.event.pull_request.number || 'null' }}, + "prIssue": ${{ github.event.issue.pull_request.number || 'null' }}, + + "headSha": "${{ github.event.pull_request.head.sha || '' }}", + "headRef": "${{ github.event.pull_request.head.ref || '' }}", + "baseSha": "${{ github.event.pull_request.base.sha || '' }}", + "baseRef": "${{ github.event.pull_request.base.ref || '' }}", + + "cloneUrl": "${{ github.event.repository.clone_url || '' }}", + + "overrides": $OVERRIDES + + } + EOF + + echo "Payload built:" + cat payload.json + + - name: Send payload to n8n webhook + run: | + curl -X POST \ + -H "Content-Type: application/json" \ + -d @payload.json \ + https://pandoras-box.oceanprotocol.io/webhook/66d5c38a-7df7-4106-a8e3-f3070fcb6858 diff --git a/.gitignore b/.gitignore index a14357002..203f0ecd9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ -# Dahsboard -dashboard/.env +# Control panel +controlpanel/.env + +# Docker compose +**/docker-compose.yml # Logs logs @@ -94,7 +97,7 @@ out .nuxt /dist/* -!/dist/dashboard +!/dist/controlpanel # Gatsby files .cache/ @@ -155,3 +158,4 @@ html-report.html # databases *.sqlite databases/* +c2d_storage/* diff --git a/.nvmrc b/.nvmrc index b427e2ae2..42126c054 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1,2 @@ -v20.16.0 \ No newline at end of file +22 + diff --git a/.vscode/settings.json b/.vscode/settings.json index a521a7d3d..c7470c51c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,5 +8,6 @@ "search.exclude": { "**/.next": true, "**/out": true - } + }, + "typescript.tsdk": "node_modules/typescript/lib" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 123905f44..3013c787e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,99 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [v0.2.3](https://github.com/oceanprotocol/ocean-node/compare/v0.2.1...v0.2.3) + +- Update node script - C2D [`#896`](https://github.com/oceanprotocol/ocean-node/pull/896) +- fix docker-compose [`#895`](https://github.com/oceanprotocol/ocean-node/pull/895) +- re-indexing old DDOs [`#867`](https://github.com/oceanprotocol/ocean-node/pull/867) +- Upgrade tsx dep to v4.x [`#893`](https://github.com/oceanprotocol/ocean-node/pull/893) +- C2D Docker [`#705`](https://github.com/oceanprotocol/ocean-node/pull/705) +- Updating codeowners [`#887`](https://github.com/oceanprotocol/ocean-node/pull/887) +- fix issue with empty nft fields [`#886`](https://github.com/oceanprotocol/ocean-node/pull/886) +- add allowed admins access list [`#841`](https://github.com/oceanprotocol/ocean-node/pull/841) +- Update error message for invalid peer connection [`#874`](https://github.com/oceanprotocol/ocean-node/pull/874) +- add AUTHORIZED_DECRYPTERS_LIST [`#836`](https://github.com/oceanprotocol/ocean-node/pull/836) +- fix status code if policy server not available [`#869`](https://github.com/oceanprotocol/ocean-node/pull/869) +- Fix DDO: Stats and Prices for exchanges/dispensers [`#774`](https://github.com/oceanprotocol/ocean-node/pull/774) +- move p2p getters as handlers [`#862`](https://github.com/oceanprotocol/ocean-node/pull/862) +- always check remote peerId [`#864`](https://github.com/oceanprotocol/ocean-node/pull/864) +- Test if dashboard changes are already committed [`#842`](https://github.com/oceanprotocol/ocean-node/pull/842) +- add AUTHORIZED_PUBLISHERS_*** env variables [`#826`](https://github.com/oceanprotocol/ocean-node/pull/826) +- Issue 814 credentials types [`#823`](https://github.com/oceanprotocol/ocean-node/pull/823) +- remove echo command [`#839`](https://github.com/oceanprotocol/ocean-node/pull/839) +- Issue 808 - new accesslist credentials type [`#819`](https://github.com/oceanprotocol/ocean-node/pull/819) +- add ALLOWED_VALIDATORS_LIST [`#829`](https://github.com/oceanprotocol/ocean-node/pull/829) +- update build files and hash [`#821`](https://github.com/oceanprotocol/ocean-node/pull/821) +- add * as match all rule for address types [`#837`](https://github.com/oceanprotocol/ocean-node/pull/837) +- fix: return correct message on policy server call [`#834`](https://github.com/oceanprotocol/ocean-node/pull/834) +- add policyServerPassthrough routes [`#832`](https://github.com/oceanprotocol/ocean-node/pull/832) +- Bump fast-xml-parser from 4.3.6 to 4.5.0 in /dashboard [`#711`](https://github.com/oceanprotocol/ocean-node/pull/711) +- Bump secp256k1 from 5.0.0 to 5.0.1 in /dashboard [`#725`](https://github.com/oceanprotocol/ocean-node/pull/725) +- Bump elliptic from 6.5.5 to 6.6.0 in /dashboard [`#746`](https://github.com/oceanprotocol/ocean-node/pull/746) +- Bump cross-spawn and aegir (UPDATE: delete deps) [`#757`](https://github.com/oceanprotocol/ocean-node/pull/757) +- fix corner case issue, cannot start indexing on ganache without ADDRESS_FILE [`#775`](https://github.com/oceanprotocol/ocean-node/pull/775) +- add findPeer & dht refactor [`#793`](https://github.com/oceanprotocol/ocean-node/pull/793) +- add support for identifyPush protocol [`#794`](https://github.com/oceanprotocol/ocean-node/pull/794) +- no need to store everything in peerStore [`#795`](https://github.com/oceanprotocol/ocean-node/pull/795) +- add multiAddrs for directCommand [`#796`](https://github.com/oceanprotocol/ocean-node/pull/796) +- Refactor connections rate, rate per minute instead of second [`#785`](https://github.com/oceanprotocol/ocean-node/pull/785) +- add missing check for ddo DB on republish ddos [`#789`](https://github.com/oceanprotocol/ocean-node/pull/789) +- recalculate code hash if needed [`#790`](https://github.com/oceanprotocol/ocean-node/pull/790) +- fix usage of getBoolEnvValue [`#784`](https://github.com/oceanprotocol/ocean-node/pull/784) +- refactor handlers interfaces [`37cbfa5`](https://github.com/oceanprotocol/ocean-node/commit/37cbfa5076d6b665d9ba524156a8f48a656fe93f) +- mv unit test to integration (need contracts deployment) [`7236ac5`](https://github.com/oceanprotocol/ocean-node/commit/7236ac5a603b2ef9c66ccf68a8a6d52acdb96855) +- refactor, move getAdmins fn to auth [`5ba8bd5`](https://github.com/oceanprotocol/ocean-node/commit/5ba8bd528286a5c18acda572a1ce6170672415e6) + +#### [v0.2.1](https://github.com/oceanprotocol/ocean-node/compare/v0.2.0...v0.2.1) + +> 5 December 2024 + +- have bootstrap config var [`#782`](https://github.com/oceanprotocol/ocean-node/pull/782) +- Removing unused express dependency from dashboard [`#761`](https://github.com/oceanprotocol/ocean-node/pull/761) +- check if rpcs and indexer_networks are aligned, log [`#750`](https://github.com/oceanprotocol/ocean-node/pull/750) +- remove node 16 image references [`#759`](https://github.com/oceanprotocol/ocean-node/pull/759) +- try debug and fix randomly logs failing test [`#752`](https://github.com/oceanprotocol/ocean-node/pull/752) +- fix dashboard hash out of sync [`#744`](https://github.com/oceanprotocol/ocean-node/pull/744) +- improve reindex command, optional block, also check if thread is running [`#747`](https://github.com/oceanprotocol/ocean-node/pull/747) +- Add cleaner logging when idexing and getting/updating block info from db [`#743`](https://github.com/oceanprotocol/ocean-node/pull/743) +- Add INDEXER_NETWORKS env var within CI job. [`#734`](https://github.com/oceanprotocol/ocean-node/pull/734) +- fix system tests. Running old version of node? [`#733`](https://github.com/oceanprotocol/ocean-node/pull/733) +- rm console.logs [`#731`](https://github.com/oceanprotocol/ocean-node/pull/731) +- fix wrong block for log [`#727`](https://github.com/oceanprotocol/ocean-node/pull/727) +- nonce db sql lite [`#723`](https://github.com/oceanprotocol/ocean-node/pull/723) +- Bump version axios 1.6.0 -> 1.7.4. [`#716`](https://github.com/oceanprotocol/ocean-node/pull/716) +- Bump version express 4.18.2 -> 4.21.0. [`#717`](https://github.com/oceanprotocol/ocean-node/pull/717) +- Feature/ add Elasticsearch database alternative for typesense [`#599`](https://github.com/oceanprotocol/ocean-node/pull/599) +- Database tests 2db [`#707`](https://github.com/oceanprotocol/ocean-node/pull/707) +- add credentials at service level, on schemas [`#710`](https://github.com/oceanprotocol/ocean-node/pull/710) +- Bump micromatch from 4.0.5 to 4.0.8 in /dashboard [`#649`](https://github.com/oceanprotocol/ocean-node/pull/649) +- Bump undici from 5.27.0 to 5.28.4 [`#610`](https://github.com/oceanprotocol/ocean-node/pull/610) +- testing changes [`#718`](https://github.com/oceanprotocol/ocean-node/pull/718) +- Policy Server [`#694`](https://github.com/oceanprotocol/ocean-node/pull/694) +- fix missing/invalid db_url log message, put warn at startup [`#654`](https://github.com/oceanprotocol/ocean-node/pull/654) +- move c2d engines under OceanNode class [`#702`](https://github.com/oceanprotocol/ocean-node/pull/702) +- improve error message, transfer fees and tweak node response [`#701`](https://github.com/oceanprotocol/ocean-node/pull/701) +- fix default filtered p2p ip list (non routable ips that should not be announced) [`#699`](https://github.com/oceanprotocol/ocean-node/pull/699) +- chore: add datatokenaddress in order table [`#700`](https://github.com/oceanprotocol/ocean-node/pull/700) +- fixing tests [`#703`](https://github.com/oceanprotocol/ocean-node/pull/703) +- Updating deprecated actions [`#681`](https://github.com/oceanprotocol/ocean-node/pull/681) +- add access control to service level [`#698`](https://github.com/oceanprotocol/ocean-node/pull/698) +- customize boostrap params [`#696`](https://github.com/oceanprotocol/ocean-node/pull/696) +- Issue 668 oasis decryption [`#679`](https://github.com/oceanprotocol/ocean-node/pull/679) +- Add max ram memory in node start cmd [`#697`](https://github.com/oceanprotocol/ocean-node/pull/697) +- Feature/add elasticdb search [`#695`](https://github.com/oceanprotocol/ocean-node/pull/695) +- fix: search and nonce [`#688`](https://github.com/oceanprotocol/ocean-node/pull/688) +- Issue 501 - C2D getJobStatus - did vs documentId vs agreementId [`#502`](https://github.com/oceanprotocol/ocean-node/pull/502) +- Feature/add elasticdb tvl [`#677`](https://github.com/oceanprotocol/ocean-node/pull/677) +- Renaming dashboard as Control Panel [`#674`](https://github.com/oceanprotocol/ocean-node/pull/674) +- add new schema + tests [`a648cb3`](https://github.com/oceanprotocol/ocean-node/commit/a648cb38df2dea537ca28e67ae4bf1113c9b287d) +- normalize responses [`584b6c0`](https://github.com/oceanprotocol/ocean-node/commit/584b6c09c67fb66fee7d0d01cca51693ea2a3723) +- first draft [`b3afc02`](https://github.com/oceanprotocol/ocean-node/commit/b3afc02219233af4026c43b886bf97c0a2edb323) + #### [v0.2.0](https://github.com/oceanprotocol/ocean-node/compare/v0.1.0...v0.2.0) +> 9 September 2024 + - Downgrade indexer errors [`#675`](https://github.com/oceanprotocol/ocean-node/pull/675) - Update system requirements: change iOS to macOS [`#673`](https://github.com/oceanprotocol/ocean-node/pull/673) - Fix crash on connection reset - P2P streams [`#659`](https://github.com/oceanprotocol/ocean-node/pull/659) diff --git a/Dockerfile b/Dockerfile index 85400da14..a146f3dd1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,34 +1,35 @@ -FROM ubuntu:22.04 as base +FROM ubuntu:22.04 AS base RUN apt-get update && apt-get -y install bash curl git wget libatomic1 python3 build-essential COPY .nvmrc /usr/src/app/ RUN rm /bin/sh && ln -s /bin/bash /bin/sh -ENV NVM_DIR /usr/local/nvm +ENV NVM_DIR=/usr/local/nvm RUN mkdir $NVM_DIR -ENV NODE_VERSION=v20.16.0 +ENV NODE_VERSION=v22.15.0 # Install nvm with node and npm RUN curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash \ && source $NVM_DIR/nvm.sh \ && nvm install $NODE_VERSION \ && nvm alias default $NODE_VERSION \ && nvm use default -ENV NODE_PATH $NVM_DIR/$NODE_VERSION/lib/node_modules -ENV PATH $NVM_DIR/versions/node/$NODE_VERSION/bin:$PATH +ENV NODE_PATH=$NVM_DIR/$NODE_VERSION/lib/node_modules +ENV PATH=$NVM_DIR/versions/node/$NODE_VERSION/bin:$PATH ENV IPFS_GATEWAY='https://ipfs.io/' ENV ARWEAVE_GATEWAY='https://arweave.net/' -FROM base as builder +FROM base AS builder COPY package*.json /usr/src/app/ +COPY scripts/ /usr/src/app/scripts/ WORKDIR /usr/src/app/ RUN npm ci --maxsockets 1 -FROM base as runner +FROM base AS runner COPY . /usr/src/app WORKDIR /usr/src/app/ COPY --from=builder /usr/src/app/node_modules/ /usr/src/app/node_modules/ RUN npm run build -# Remove the dashboard folder to reduce the image size and avoid shipping development files -RUN rm -rf dashboard +# Remove the controlpanel folder to reduce the image size and avoid shipping development files +RUN rm -rf controlpanel ENV P2P_ipV4BindTcpPort=9000 EXPOSE 9000 ENV P2P_ipV4BindWsPort=9001 @@ -37,7 +38,9 @@ ENV P2P_ipV6BindTcpPort=9002 EXPOSE 9002 ENV P2P_ipV6BindWsPort=9003 EXPOSE 9003 +ENV P2P_ipV4BindWssPort=9005 +EXPOSE 9005 ENV HTTP_API_PORT=8000 EXPOSE 8000 ENV NODE_ENV='production' -CMD ["npm","run","start"] \ No newline at end of file +CMD ["npm","run","start"] diff --git a/README.md b/README.md index 0861e3650..51b4f27b4 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,11 @@ npm run quickstart This command will run you through the process of setting up the environmental variables for your node. +> [!NOTE] +> The quickstart script attempts to automatically detect GPUs (NVIDIA via `nvidia-smi`, others via `lspci`) and appends them to your `DOCKER_COMPUTE_ENVIRONMENTS`. +> If you choose to manually configure `DOCKER_COMPUTE_ENVIRONMENTS` before running the script (e.g. via environment variable), be aware that auto-detected GPUs will be **merged** into your configuration, which could lead to duplication if you already manually defined them. +> For most users, it is recommended to let the script handle GPU detection automatically. + ## Option 3: Running Ocean Nodes with PM2 PM2 is a process manager that makes it easy to manage and monitor your Node.js applications. @@ -58,6 +63,14 @@ export PRIVATE_KEY="0x_your_private_key_here" The `PRIVATE_KEY` is the only mandatory environmental variable, you must include the `0x` at the front of your private key. Additional configurations can be set as needed. For all available configurations, refer to the [Environment Variables](docs/env.md) documentation. +2.1. If the config is a JSON file, run: + +``` +export CONFIG_PATH='' +``` + +Config file should be absolute path. + 3. Quick start the Ocean Node with PM2 ```bash @@ -137,5 +150,19 @@ Your node is now running, the control panel will be available at `http://localho - [Testing Guide](docs/testing.md) - [Network Configuration](docs/networking.md) - [Logging & accessing logs](docs/networking.md) -- [Control Panel: Local development](dashboard/README.md) +- [Control Panel: Local development](controlpanel/README.md) - [Docker Deployment Guide](docs/dockerDeployment.md) +- [C2D GPU Guide](docs/GPU.md) +- [Compute pricing](docs/compute-pricing.md) + +## Control Panel + +The control panel is available at `http://localhost:8000/controlpanel/` when your node is running. The built files are included in the distribution, so you **don't need to rebuild it** unless you make changes to the control panel code. + +To rebuild after changes: + +```bash +npm run build:controlpanel +``` + +For more details, see the [Control Panel Development Guide](controlpanel/README.md). diff --git a/config.json b/config.json new file mode 100644 index 000000000..7917ba87c --- /dev/null +++ b/config.json @@ -0,0 +1,150 @@ +{ + "authorizedDecrypters": [], + "authorizedDecryptersList": null, + "allowedValidators": [], + "allowedValidatorsList": null, + "authorizedPublishers": [], + "authorizedPublishersList": null, + "keys": {}, + "hasIndexer": true, + "hasHttp": true, + "hasP2P": true, + "p2pConfig": { + "bootstrapTimeout": 20000, + "bootstrapTagName": "bootstrap", + "bootstrapTagValue": 50, + "bootstrapTTL": 0, + "enableIPV4": true, + "enableIPV6": true, + "ipV4BindAddress": "0.0.0.0", + "ipV4BindTcpPort": 9000, + "ipV4BindWsPort": 9001, + "ipV4BindWssPort": 9005, + "ipV6BindAddress": "::", + "ipV6BindTcpPort": 9002, + "ipV6BindWsPort": 9003, + "announceAddresses": [], + "pubsubPeerDiscoveryInterval": 10000, + "dhtMaxInboundStreams": 500, + "dhtMaxOutboundStreams": 500, + "dhtFilter": null, + "mDNSInterval": 20000, + "connectionsMaxParallelDials": 15, + "connectionsDialTimeout": 30000, + "upnp": true, + "autoNat": true, + "enableCircuitRelayServer": false, + "enableCircuitRelayClient": false, + "circuitRelays": 0, + "announcePrivateIp": false, + "filterAnnouncedAddresses": [ + "127.0.0.0/8", + "10.0.0.0/8", + "172.16.0.0/12", + "192.168.0.0/16", + "100.64.0.0/10", + "169.254.0.0/16", + "192.0.0.0/24", + "192.0.2.0/24", + "198.51.100.0/24", + "203.0.113.0/24", + "224.0.0.0/4", + "240.0.0.0/4" + ], + "minConnections": 1, + "maxConnections": 300, + "autoDialPeerRetryThreshold": 7200000, + "autoDialConcurrency": 5, + "maxPeerAddrsToDial": 5, + "autoDialInterval": 5000, + "enableNetworkStats": false + }, + "hasControlPanel": true, + "httpPort": 8001, + "dbConfig": { + "url": "http://localhost:8108/?apiKey=xyz", + "username": "", + "password": "", + "dbType": "typesense" + }, + "supportedNetworks": { + "8996": { + "rpc": "http://127.0.0.1:8545", + "chainId": 8996, + "network": "development", + "chunkSize": 100 + } + }, + "feeStrategy": {}, + "c2dClusters": [], + "ipfsGateway": "https://ipfs.io/", + "arweaveGateway": "https://arweave.net/", + "accountPurgatoryUrl": null, + "assetPurgatoryUrl": null, + "allowedAdmins": [], + "allowedAdminsList": null, + "rateLimit": 30, + "maxConnections": 30, + "denyList": { + "peers": [], + "ips": [] + }, + "unsafeURLs": [], + "isBootstrap": false, + "claimDurationTimeout": 3600, + "validateUnsignedDDO": true, + "jwtSecret": "ocean-node-secret", + "dockerComputeEnvironments": [ + { + "socketPath": "/var/run/docker.sock", + "resources": [ + { + "id": "disk", + "total": 1 + } + ], + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "access": { + "addresses": [], + "accessLists": [] + }, + "fees": { + "8996": [ + { + "prices": [ + { + "id": "cpu", + "price": 1 + } + ] + } + ] + }, + "free": { + "maxJobDuration": 3600, + "minJobDuration": 60, + "maxJobs": 3, + "access": { + "addresses": [], + "accessLists": [] + }, + "resources": [ + { + "id": "cpu", + "max": 1 + }, + { + "id": "ram", + "max": 1 + }, + { + "id": "disk", + "max": 1 + } + ] + } + } + ] +} \ No newline at end of file diff --git a/dashboard/.DS_Store b/controlpanel/.DS_Store similarity index 100% rename from dashboard/.DS_Store rename to controlpanel/.DS_Store diff --git a/dashboard/README.md b/controlpanel/README.md similarity index 81% rename from dashboard/README.md rename to controlpanel/README.md index 7491d63b0..488800d72 100644 --- a/dashboard/README.md +++ b/controlpanel/README.md @@ -1,6 +1,6 @@ # Control Panel -The static dashbaord files are included in ocean nodes so the control panel doesn't have to be rebuilt every time the node is built. If there are changes to the control panel it will be built by default with the Ocean Node. There is a [script](scripts/dashboardChanges.js) running to check for changes in this directory. +The static controlpanel files are included in ocean nodes so the control panel doesn't have to be rebuilt every time the node is built. If there are changes to the control panel it should be rebuilt with `npm run build:controlpanel`. When you start your node the control panel will be made available at: `http://localhost:8000/controlpanel/` diff --git a/dashboard/additional.d.ts b/controlpanel/additional.d.ts similarity index 100% rename from dashboard/additional.d.ts rename to controlpanel/additional.d.ts diff --git a/dashboard/next-env.d.ts b/controlpanel/next-env.d.ts similarity index 100% rename from dashboard/next-env.d.ts rename to controlpanel/next-env.d.ts diff --git a/dashboard/next.config.js b/controlpanel/next.config.js similarity index 86% rename from dashboard/next.config.js rename to controlpanel/next.config.js index 95e3eee38..7e12e384f 100644 --- a/dashboard/next.config.js +++ b/controlpanel/next.config.js @@ -7,7 +7,7 @@ const nextConfig = { unoptimized: true }, output: 'export', - distDir: '../dist/dashboard' + distDir: '../dist/controlpanel' } module.exports = nextConfig diff --git a/dashboard/package-lock.json b/controlpanel/package-lock.json similarity index 95% rename from dashboard/package-lock.json rename to controlpanel/package-lock.json index 8696673c6..b2ed8f46b 100644 --- a/dashboard/package-lock.json +++ b/controlpanel/package-lock.json @@ -1,11 +1,11 @@ { - "name": "ocean-node-dashboard", + "name": "ocean-node-control-panel", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "ocean-node-dashboard", + "name": "ocean-node-control-panel", "version": "0.1.0", "license": "Apache-2.0", "dependencies": { @@ -18,9 +18,8 @@ "classnames": "^2.5.0", "dayjs": "^1.11.10", "ethers": "^6.10.0", - "express": "^4.18.2", "micromodal": "^0.4.10", - "next": "^13.5.6", + "next": "^14.2.35", "react": "^18", "react-data-table-component": "^7.5.4", "react-dom": "^18", @@ -70,11 +69,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -468,17 +469,19 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -507,102 +510,28 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "license": "MIT", "peer": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "license": "MIT", "peer": true, + "dependencies": { + "@babel/types": "^7.27.0" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -2192,9 +2121,10 @@ "peer": true }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2203,14 +2133,15 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" @@ -2247,13 +2178,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2479,10 +2410,11 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2620,10 +2552,11 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3556,9 +3489,10 @@ } }, "node_modules/@next/env": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.6.tgz", - "integrity": "sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==", + "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { "version": "14.0.4", @@ -3570,12 +3504,13 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz", - "integrity": "sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3585,12 +3520,13 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz", - "integrity": "sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3600,12 +3536,13 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz", - "integrity": "sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -3615,12 +3552,13 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz", - "integrity": "sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -3630,12 +3568,13 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz", - "integrity": "sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -3645,12 +3584,13 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz", - "integrity": "sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -3660,12 +3600,13 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz", - "integrity": "sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -3675,12 +3616,13 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz", - "integrity": "sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -3690,12 +3632,13 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz", - "integrity": "sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -3800,6 +3743,7 @@ "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "android" @@ -3838,6 +3782,7 @@ "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3857,6 +3802,7 @@ "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -3876,6 +3822,7 @@ "cpu": [ "arm" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -3895,6 +3842,7 @@ "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -3914,6 +3862,7 @@ "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -3933,6 +3882,7 @@ "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -3952,6 +3902,7 @@ "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -3996,6 +3947,7 @@ "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -4015,6 +3967,7 @@ "cpu": [ "ia32" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -4034,6 +3987,7 @@ "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -4192,9 +4146,10 @@ } }, "node_modules/@react-native-community/cli-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", "peer": true, "dependencies": { "argparse": "^1.0.7", @@ -4356,9 +4311,10 @@ } }, "node_modules/@react-native-community/cli-server-api/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "peer": true, "engines": { "node": ">=8.3.0" @@ -4650,9 +4606,10 @@ } }, "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", "peer": true, "dependencies": { "async-limiter": "~1.0.0" @@ -5054,11 +5011,19 @@ "@stablelib/wipe": "^1.0.1" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "license": "Apache-2.0", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -5712,9 +5677,10 @@ } }, "node_modules/@walletconnect/jsonrpc-ws-connection/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -5978,6 +5944,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "peer": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -6136,11 +6103,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, "node_modules/array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", @@ -6343,9 +6305,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -6548,52 +6514,17 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -6726,20 +6657,51 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -7229,32 +7191,24 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", "peer": true, "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7270,11 +7224,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "peer": true }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "peer": true + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -7358,47 +7316,16 @@ "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/cookie-es": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz", - "integrity": "sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==" - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" }, "node_modules/core-js-compat": { "version": "3.36.1", @@ -7453,9 +7380,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -7668,6 +7595,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -7696,14 +7625,17 @@ } }, "node_modules/destr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", - "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -7773,6 +7705,20 @@ "csstype": "^3.0.2" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexify": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", @@ -7810,7 +7756,8 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "peer": true }, "node_modules/electron-to-chromium": { "version": "1.4.711", @@ -7819,9 +7766,10 @@ "peer": true }, "node_modules/elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -7852,6 +7800,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "peer": true, "engines": { "node": ">= 0.8" } @@ -8021,12 +7970,10 @@ "dev": true }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -8065,6 +8012,18 @@ "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", @@ -8116,7 +8075,8 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "peer": true }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -8325,10 +8285,11 @@ } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8407,10 +8368,11 @@ } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8471,10 +8433,11 @@ } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8559,10 +8522,11 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8655,6 +8619,8 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -8873,60 +8839,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/extension-port-stream": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/extension-port-stream/-/extension-port-stream-2.1.1.tgz", @@ -8998,9 +8910,9 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fast-xml-parser": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", - "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", + "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", "funding": [ { "type": "github", @@ -9068,36 +8980,6 @@ "node": ">=0.10.0" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -9168,25 +9050,26 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "is-callable": "^1.2.7" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -9284,15 +9167,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9314,6 +9203,19 @@ "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==" }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -9386,15 +9288,11 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9462,11 +9360,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9484,20 +9383,29 @@ "dev": true }, "node_modules/h3": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.11.1.tgz", - "integrity": "sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.5.tgz", + "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", + "license": "MIT", "dependencies": { - "cookie-es": "^1.0.0", - "crossws": "^0.2.2", + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", "defu": "^6.1.4", - "destr": "^2.0.3", - "iron-webcrypto": "^1.0.0", - "ohash": "^1.1.3", - "radix3": "^1.1.0", - "ufo": "^1.4.0", - "uncrypto": "^0.1.3", - "unenv": "^1.9.0" + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/h3/node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" } }, "node_modules/has-bigints": { @@ -9532,6 +9440,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -9540,9 +9449,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9574,9 +9484,10 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -9655,6 +9566,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "peer": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -9715,17 +9628,6 @@ "@babel/runtime": "^7.23.2" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/idb-keyval": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", @@ -9760,9 +9662,10 @@ } }, "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", "peer": true, "dependencies": { "queue": "6.0.2" @@ -9833,18 +9736,11 @@ "loose-envify": "^1.0.0" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/iron-webcrypto": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.1.0.tgz", - "integrity": "sha512-5vgYsCakNlaQub1orZK5QmNYhwYtcllTkZBp5sfIaCqY93Cf6l+v2rtE+E4TMbcfjxDMCdrO8wmp7+ZvhDECLA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/brc-dd" } @@ -10245,11 +10141,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -10332,8 +10229,7 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", @@ -10605,10 +10501,11 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -11111,6 +11008,15 @@ "remove-accents": "0.5.0" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-query-parser": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", @@ -11119,25 +11025,12 @@ "@babel/runtime": "^7.12.5" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "peer": true }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, "node_modules/merge-options": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", @@ -11163,14 +11056,6 @@ "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/metro": { "version": "0.80.7", "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.7.tgz", @@ -11335,9 +11220,10 @@ } }, "node_modules/metro-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", "peer": true, "dependencies": { "argparse": "^1.0.7", @@ -11600,9 +11486,10 @@ } }, "node_modules/metro/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "peer": true, "engines": { "node": ">=8.3.0" @@ -11690,6 +11577,8 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "peer": true, "bin": { "mime": "cli.js" }, @@ -11701,6 +11590,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "peer": true, "engines": { "node": ">= 0.6" } @@ -11709,6 +11599,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -11925,15 +11816,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -11951,6 +11843,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "peer": true, "engines": { "node": ">= 0.6" } @@ -11962,37 +11855,39 @@ "peer": true }, "node_modules/next": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/next/-/next-13.5.6.tgz", - "integrity": "sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", + "license": "MIT", "dependencies": { - "@next/env": "13.5.6", - "@swc/helpers": "0.5.2", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", "postcss": "8.4.31", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0" + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.14.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.5.6", - "@next/swc-darwin-x64": "13.5.6", - "@next/swc-linux-arm64-gnu": "13.5.6", - "@next/swc-linux-arm64-musl": "13.5.6", - "@next/swc-linux-x64-gnu": "13.5.6", - "@next/swc-linux-x64-musl": "13.5.6", - "@next/swc-win32-arm64-msvc": "13.5.6", - "@next/swc-win32-ia32-msvc": "13.5.6", - "@next/swc-win32-x64-msvc": "13.5.6" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -12001,6 +11896,9 @@ "@opentelemetry/api": { "optional": true }, + "@playwright/test": { + "optional": true + }, "sass": { "optional": true } @@ -12039,9 +11937,10 @@ } }, "node_modules/node-dir/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0", @@ -12085,9 +11984,10 @@ "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==" }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -12108,6 +12008,12 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "peer": true }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -12184,6 +12090,7 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12304,11 +12211,6 @@ "ufo": "^1.3.0" } }, - "node_modules/ohash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", - "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==" - }, "node_modules/on-exit-leak-free": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", @@ -12318,6 +12220,8 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -12326,9 +12230,10 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8" @@ -12491,6 +12396,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "peer": true, "engines": { "node": ">= 0.8" } @@ -12524,11 +12430,6 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -12709,6 +12610,15 @@ "node": ">=12.0.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -12862,18 +12772,6 @@ "react-is": "^16.13.1" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/proxy-compare": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.5.1.tgz", @@ -12935,20 +12833,6 @@ "qrcode-terminal": "bin/qrcode-terminal.js" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/query-string": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", @@ -13001,32 +12885,21 @@ "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, "node_modules/radix3": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.1.tgz", - "integrity": "sha512-yUUd5VTiFtcMEx0qFUxGAv5gbMc1un4RvEO1JZdP7ZUl/RHygZK6PknIKntmQRZxnMY3ZXD2ISaw1ij8GYW1yg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -13066,9 +12939,10 @@ } }, "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "peer": true, "engines": { "node": ">=8.3.0" @@ -13247,9 +13121,10 @@ } }, "node_modules/react-native/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", "peer": true, "dependencies": { "async-limiter": "~1.0.0" @@ -13897,11 +13772,6 @@ "node": ">=10" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -13911,17 +13781,17 @@ } }, "node_modules/secp256k1": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz", - "integrity": "sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.1.tgz", + "integrity": "sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==", "hasInstallScript": true, "dependencies": { - "elliptic": "^6.5.4", + "elliptic": "^6.5.7", "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/secp256k1/node_modules/node-addon-api": { @@ -13944,9 +13814,11 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "peer": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -13970,6 +13842,8 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -13977,12 +13851,16 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT", + "peer": true }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT", + "peer": true }, "node_modules/serialize-error": { "version": "2.1.0", @@ -13994,35 +13872,48 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "peer": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14045,18 +13936,28 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC", + "peer": true }, "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" }, "bin": { "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/shallow-clone": { @@ -14108,6 +14009,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -14325,6 +14227,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -14719,12 +14623,18 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "peer": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, "node_modules/to-regex-range": { @@ -14742,6 +14652,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "peer": true, "engines": { "node": ">=0.6" } @@ -14813,27 +14725,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typed-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", - "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", - "dev": true, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -14926,9 +14826,10 @@ } }, "node_modules/ufo": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", - "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" }, "node_modules/uint8arrays": { "version": "3.1.1", @@ -14963,29 +14864,6 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "node_modules/unenv": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.9.0.tgz", - "integrity": "sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==", - "dependencies": { - "consola": "^3.2.3", - "defu": "^6.1.3", - "mime": "^3.0.0", - "node-fetch-native": "^1.6.1", - "pathe": "^1.1.1" - } - }, - "node_modules/unenv/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/unfetch": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", @@ -15053,6 +14931,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "peer": true, "engines": { "node": ">= 0.8" } @@ -15244,20 +15123,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -15279,6 +15144,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -15319,6 +15185,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "peer": true, "engines": { "node": ">= 0.8" } @@ -15424,18 +15291,6 @@ "makeerror": "1.0.12" } }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -15561,15 +15416,18 @@ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" diff --git a/dashboard/package.json b/controlpanel/package.json similarity index 93% rename from dashboard/package.json rename to controlpanel/package.json index 3e158da0c..1da3bce69 100644 --- a/dashboard/package.json +++ b/controlpanel/package.json @@ -1,5 +1,5 @@ { - "name": "ocean-node-dashboard", + "name": "ocean-node-control-panel", "author": "Ocean Protocol Foundation", "license": "Apache-2.0", "version": "0.1.0", @@ -20,9 +20,8 @@ "classnames": "^2.5.0", "dayjs": "^1.11.10", "ethers": "^6.10.0", - "express": "^4.18.2", "micromodal": "^0.4.10", - "next": "^13.5.6", + "next": "^14.2.35", "react": "^18", "react-data-table-component": "^7.5.4", "react-dom": "^18", @@ -43,4 +42,4 @@ "prettier": "^3.1.1", "typescript": "^5" } -} +} \ No newline at end of file diff --git a/dashboard/src/.DS_Store b/controlpanel/src/.DS_Store similarity index 100% rename from dashboard/src/.DS_Store rename to controlpanel/src/.DS_Store diff --git a/dashboard/src/assets/chevron.svg b/controlpanel/src/assets/chevron.svg similarity index 100% rename from dashboard/src/assets/chevron.svg rename to controlpanel/src/assets/chevron.svg diff --git a/dashboard/src/assets/copy.svg b/controlpanel/src/assets/copy.svg similarity index 100% rename from dashboard/src/assets/copy.svg rename to controlpanel/src/assets/copy.svg diff --git a/dashboard/src/assets/download.svg b/controlpanel/src/assets/download.svg similarity index 100% rename from dashboard/src/assets/download.svg rename to controlpanel/src/assets/download.svg diff --git a/dashboard/src/assets/error.svg b/controlpanel/src/assets/error.svg similarity index 100% rename from dashboard/src/assets/error.svg rename to controlpanel/src/assets/error.svg diff --git a/dashboard/src/assets/logo-nodes.svg b/controlpanel/src/assets/logo-nodes.svg similarity index 100% rename from dashboard/src/assets/logo-nodes.svg rename to controlpanel/src/assets/logo-nodes.svg diff --git a/dashboard/src/assets/logo.svg b/controlpanel/src/assets/logo.svg similarity index 100% rename from dashboard/src/assets/logo.svg rename to controlpanel/src/assets/logo.svg diff --git a/dashboard/src/assets/no-error.svg b/controlpanel/src/assets/no-error.svg similarity index 100% rename from dashboard/src/assets/no-error.svg rename to controlpanel/src/assets/no-error.svg diff --git a/dashboard/src/assets/search-icon.svg b/controlpanel/src/assets/search-icon.svg similarity index 100% rename from dashboard/src/assets/search-icon.svg rename to controlpanel/src/assets/search-icon.svg diff --git a/dashboard/src/components/Admin/DownloadLogs.tsx b/controlpanel/src/components/Admin/DownloadLogs.tsx similarity index 100% rename from dashboard/src/components/Admin/DownloadLogs.tsx rename to controlpanel/src/components/Admin/DownloadLogs.tsx diff --git a/dashboard/src/components/Admin/ReindexChain.tsx b/controlpanel/src/components/Admin/ReindexChain.tsx similarity index 100% rename from dashboard/src/components/Admin/ReindexChain.tsx rename to controlpanel/src/components/Admin/ReindexChain.tsx diff --git a/dashboard/src/components/Admin/ReindexTransaction.tsx b/controlpanel/src/components/Admin/ReindexTransaction.tsx similarity index 100% rename from dashboard/src/components/Admin/ReindexTransaction.tsx rename to controlpanel/src/components/Admin/ReindexTransaction.tsx diff --git a/dashboard/src/components/Admin/StopNode.tsx b/controlpanel/src/components/Admin/StopNode.tsx similarity index 90% rename from dashboard/src/components/Admin/StopNode.tsx rename to controlpanel/src/components/Admin/StopNode.tsx index 8b7040269..c50fad7e2 100644 --- a/dashboard/src/components/Admin/StopNode.tsx +++ b/controlpanel/src/components/Admin/StopNode.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import { useState } from 'react' import styles from './index.module.css' import { useAdminContext } from '@context/AdminProvider' import Button from '@mui/material/Button' @@ -25,7 +25,7 @@ export default function StopNode() { }) }) } - alert('The node has been stopped. The dashboard will no longer be displayed.') + alert('The node has been stopped. The control panel will no longer be displayed.') window.location.reload() } catch (error) { console.error('error', error) diff --git a/dashboard/src/components/Admin/TransferFees.tsx b/controlpanel/src/components/Admin/TransferFees.tsx similarity index 100% rename from dashboard/src/components/Admin/TransferFees.tsx rename to controlpanel/src/components/Admin/TransferFees.tsx diff --git a/dashboard/src/components/Admin/index.module.css b/controlpanel/src/components/Admin/index.module.css similarity index 100% rename from dashboard/src/components/Admin/index.module.css rename to controlpanel/src/components/Admin/index.module.css diff --git a/dashboard/src/components/Admin/index.tsx b/controlpanel/src/components/Admin/index.tsx similarity index 91% rename from dashboard/src/components/Admin/index.tsx rename to controlpanel/src/components/Admin/index.tsx index 456c8e4b0..74b87a9c3 100644 --- a/dashboard/src/components/Admin/index.tsx +++ b/controlpanel/src/components/Admin/index.tsx @@ -1,7 +1,6 @@ -import React from 'react' import styles from './index.module.css' -import DownloadLogs from '../Admin/DownloadLogs' -import StopNode from '../Admin/StopNode' +import DownloadLogs from './DownloadLogs' +import StopNode from './StopNode' import { useAdminContext } from '@/context/AdminProvider' import { useAccount } from 'wagmi' import { ConnectButton } from '@rainbow-me/rainbowkit' diff --git a/dashboard/src/components/Dashboard/AdminAccounts.tsx b/controlpanel/src/components/ControlPanel/AdminAccounts.tsx similarity index 100% rename from dashboard/src/components/Dashboard/AdminAccounts.tsx rename to controlpanel/src/components/ControlPanel/AdminAccounts.tsx diff --git a/dashboard/src/components/Dashboard/Indexer.tsx b/controlpanel/src/components/ControlPanel/Indexer.tsx similarity index 100% rename from dashboard/src/components/Dashboard/Indexer.tsx rename to controlpanel/src/components/ControlPanel/Indexer.tsx diff --git a/dashboard/src/components/Dashboard/Menu.module.css b/controlpanel/src/components/ControlPanel/Menu.module.css similarity index 100% rename from dashboard/src/components/Dashboard/Menu.module.css rename to controlpanel/src/components/ControlPanel/Menu.module.css diff --git a/dashboard/src/components/Dashboard/Menu.tsx b/controlpanel/src/components/ControlPanel/Menu.tsx similarity index 100% rename from dashboard/src/components/Dashboard/Menu.tsx rename to controlpanel/src/components/ControlPanel/Menu.tsx diff --git a/dashboard/src/components/Dashboard/NodePlatform.tsx b/controlpanel/src/components/ControlPanel/NodePlatform.tsx similarity index 100% rename from dashboard/src/components/Dashboard/NodePlatform.tsx rename to controlpanel/src/components/ControlPanel/NodePlatform.tsx diff --git a/dashboard/src/components/Dashboard/SupportedNetworks.tsx b/controlpanel/src/components/ControlPanel/SupportedNetworks.tsx similarity index 100% rename from dashboard/src/components/Dashboard/SupportedNetworks.tsx rename to controlpanel/src/components/ControlPanel/SupportedNetworks.tsx diff --git a/dashboard/src/components/Dashboard/SupportedStorage.tsx b/controlpanel/src/components/ControlPanel/SupportedStorage.tsx similarity index 100% rename from dashboard/src/components/Dashboard/SupportedStorage.tsx rename to controlpanel/src/components/ControlPanel/SupportedStorage.tsx diff --git a/dashboard/src/components/Dashboard/index.module.css b/controlpanel/src/components/ControlPanel/index.module.css similarity index 100% rename from dashboard/src/components/Dashboard/index.module.css rename to controlpanel/src/components/ControlPanel/index.module.css diff --git a/dashboard/src/components/Dashboard/index.tsx b/controlpanel/src/components/ControlPanel/index.tsx similarity index 97% rename from dashboard/src/components/Dashboard/index.tsx rename to controlpanel/src/components/ControlPanel/index.tsx index 75714c6ef..1507ffb0b 100644 --- a/dashboard/src/components/Dashboard/index.tsx +++ b/controlpanel/src/components/ControlPanel/index.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import { useEffect, useState } from 'react' import styles from './index.module.css' import { useAdminContext } from '@/context/AdminProvider' import AdminActions from '../Admin' @@ -13,7 +13,7 @@ import AdminAccounts from './AdminAccounts' import NodePlatform from './NodePlatform' import { Box, Typography, Divider } from '@mui/material' -export default function Dashboard() { +export default function ControlPanel() { const [data, setData] = useState() const [isLoading, setLoading] = useState(true) const [ipAddress, setIpAddress] = useState('') diff --git a/dashboard/src/components/Copy/index.module.css b/controlpanel/src/components/Copy/index.module.css similarity index 100% rename from dashboard/src/components/Copy/index.module.css rename to controlpanel/src/components/Copy/index.module.css diff --git a/dashboard/src/components/Copy/index.tsx b/controlpanel/src/components/Copy/index.tsx similarity index 100% rename from dashboard/src/components/Copy/index.tsx rename to controlpanel/src/components/Copy/index.tsx diff --git a/dashboard/src/components/ErrorCheck/index.module.css b/controlpanel/src/components/ErrorCheck/index.module.css similarity index 100% rename from dashboard/src/components/ErrorCheck/index.module.css rename to controlpanel/src/components/ErrorCheck/index.module.css diff --git a/dashboard/src/components/ErrorCheck/index.tsx b/controlpanel/src/components/ErrorCheck/index.tsx similarity index 100% rename from dashboard/src/components/ErrorCheck/index.tsx rename to controlpanel/src/components/ErrorCheck/index.tsx diff --git a/dashboard/src/components/Footer/index.tsx b/controlpanel/src/components/Footer/index.tsx similarity index 100% rename from dashboard/src/components/Footer/index.tsx rename to controlpanel/src/components/Footer/index.tsx diff --git a/dashboard/src/components/Footer/style.module.css b/controlpanel/src/components/Footer/style.module.css similarity index 100% rename from dashboard/src/components/Footer/style.module.css rename to controlpanel/src/components/Footer/style.module.css diff --git a/dashboard/src/components/IndexQueue.tsx b/controlpanel/src/components/IndexQueue.tsx similarity index 97% rename from dashboard/src/components/IndexQueue.tsx rename to controlpanel/src/components/IndexQueue.tsx index 9152095bf..ce2f21beb 100644 --- a/dashboard/src/components/IndexQueue.tsx +++ b/controlpanel/src/components/IndexQueue.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react' +import { useState, useEffect } from 'react' import { Table, TableBody, @@ -7,7 +7,7 @@ import { TableHead, TableRow } from '@mui/material' -import styles from './Dashboard/index.module.css' +import styles from './ControlPanel/index.module.css' import { useAdminContext } from '@/context/AdminProvider' import Alert from '@mui/material/Alert' diff --git a/dashboard/src/components/JobStatusPanel/index.tsx b/controlpanel/src/components/JobStatusPanel/index.tsx similarity index 100% rename from dashboard/src/components/JobStatusPanel/index.tsx rename to controlpanel/src/components/JobStatusPanel/index.tsx diff --git a/dashboard/src/components/Navigation/index.tsx b/controlpanel/src/components/Navigation/index.tsx similarity index 100% rename from dashboard/src/components/Navigation/index.tsx rename to controlpanel/src/components/Navigation/index.tsx diff --git a/dashboard/src/components/Navigation/style.module.css b/controlpanel/src/components/Navigation/style.module.css similarity index 100% rename from dashboard/src/components/Navigation/style.module.css rename to controlpanel/src/components/Navigation/style.module.css diff --git a/dashboard/src/components/NodeDetails/index.module.css b/controlpanel/src/components/NodeDetails/index.module.css similarity index 100% rename from dashboard/src/components/NodeDetails/index.module.css rename to controlpanel/src/components/NodeDetails/index.module.css diff --git a/dashboard/src/components/NodeDetails/index.tsx b/controlpanel/src/components/NodeDetails/index.tsx similarity index 100% rename from dashboard/src/components/NodeDetails/index.tsx rename to controlpanel/src/components/NodeDetails/index.tsx diff --git a/dashboard/src/components/NodePeers/index.tsx b/controlpanel/src/components/NodePeers/index.tsx similarity index 100% rename from dashboard/src/components/NodePeers/index.tsx rename to controlpanel/src/components/NodePeers/index.tsx diff --git a/dashboard/src/components/NodePeers/style.module.css b/controlpanel/src/components/NodePeers/style.module.css similarity index 100% rename from dashboard/src/components/NodePeers/style.module.css rename to controlpanel/src/components/NodePeers/style.module.css diff --git a/dashboard/src/components/Spinner/index.tsx b/controlpanel/src/components/Spinner/index.tsx similarity index 100% rename from dashboard/src/components/Spinner/index.tsx rename to controlpanel/src/components/Spinner/index.tsx diff --git a/dashboard/src/components/Spinner/style.module.css b/controlpanel/src/components/Spinner/style.module.css similarity index 100% rename from dashboard/src/components/Spinner/style.module.css rename to controlpanel/src/components/Spinner/style.module.css diff --git a/dashboard/src/components/Table/_styles.ts b/controlpanel/src/components/Table/_styles.ts similarity index 100% rename from dashboard/src/components/Table/_styles.ts rename to controlpanel/src/components/Table/_styles.ts diff --git a/dashboard/src/components/Table/data.ts b/controlpanel/src/components/Table/data.ts similarity index 100% rename from dashboard/src/components/Table/data.ts rename to controlpanel/src/components/Table/data.ts diff --git a/dashboard/src/components/Table/index.module.css b/controlpanel/src/components/Table/index.module.css similarity index 100% rename from dashboard/src/components/Table/index.module.css rename to controlpanel/src/components/Table/index.module.css diff --git a/dashboard/src/components/Table/index.tsx b/controlpanel/src/components/Table/index.tsx similarity index 94% rename from dashboard/src/components/Table/index.tsx rename to controlpanel/src/components/Table/index.tsx index 6b22f5528..d8d5a50e5 100644 --- a/dashboard/src/components/Table/index.tsx +++ b/controlpanel/src/components/Table/index.tsx @@ -1,4 +1,3 @@ -import React from 'react' import Image from 'next/image' import DataTable, { TableColumn } from 'react-data-table-component' @@ -39,7 +38,7 @@ export default function Table() { return (
-

Ocean Nodes Dashboard

+

Ocean Node Control Panel

- Ocean nodes - + Ocean Node Control Panel + @@ -18,7 +18,7 @@ export default function Home() {
- + {/* */}
diff --git a/dashboard/src/shared/types/JobTypes.ts b/controlpanel/src/shared/types/JobTypes.ts similarity index 100% rename from dashboard/src/shared/types/JobTypes.ts rename to controlpanel/src/shared/types/JobTypes.ts diff --git a/dashboard/src/shared/types/RowDataType.ts b/controlpanel/src/shared/types/RowDataType.ts similarity index 100% rename from dashboard/src/shared/types/RowDataType.ts rename to controlpanel/src/shared/types/RowDataType.ts diff --git a/dashboard/src/shared/types/dataTypes.ts b/controlpanel/src/shared/types/dataTypes.ts similarity index 100% rename from dashboard/src/shared/types/dataTypes.ts rename to controlpanel/src/shared/types/dataTypes.ts diff --git a/dashboard/src/shared/utils/chains.ts b/controlpanel/src/shared/utils/chains.ts similarity index 100% rename from dashboard/src/shared/utils/chains.ts rename to controlpanel/src/shared/utils/chains.ts diff --git a/dashboard/src/shared/utils/jobs.ts b/controlpanel/src/shared/utils/jobs.ts similarity index 100% rename from dashboard/src/shared/utils/jobs.ts rename to controlpanel/src/shared/utils/jobs.ts diff --git a/dashboard/src/styles/Home.module.css b/controlpanel/src/styles/Home.module.css similarity index 100% rename from dashboard/src/styles/Home.module.css rename to controlpanel/src/styles/Home.module.css diff --git a/dashboard/src/styles/globals.css b/controlpanel/src/styles/globals.css similarity index 100% rename from dashboard/src/styles/globals.css rename to controlpanel/src/styles/globals.css diff --git a/dashboard/tsconfig.json b/controlpanel/tsconfig.json similarity index 100% rename from dashboard/tsconfig.json rename to controlpanel/tsconfig.json diff --git a/dist/dashboard/404.html b/dist/controlpanel/404.html similarity index 93% rename from dist/dashboard/404.html rename to dist/controlpanel/404.html index 83df82bf5..eec1f17b7 100644 --- a/dist/dashboard/404.html +++ b/dist/controlpanel/404.html @@ -1 +1 @@ -404: This page could not be found

404

This page could not be found.

\ No newline at end of file +404: This page could not be found

404

This page could not be found.

\ No newline at end of file diff --git a/dist/dashboard/_next/static/chunks/1194.680c7fabd6caf412.js b/dist/controlpanel/_next/static/chunks/1194.680c7fabd6caf412.js similarity index 100% rename from dist/dashboard/_next/static/chunks/1194.680c7fabd6caf412.js rename to dist/controlpanel/_next/static/chunks/1194.680c7fabd6caf412.js diff --git a/dist/dashboard/_next/static/chunks/135.67fab15ebc7d852e.js b/dist/controlpanel/_next/static/chunks/135.67fab15ebc7d852e.js similarity index 100% rename from dist/dashboard/_next/static/chunks/135.67fab15ebc7d852e.js rename to dist/controlpanel/_next/static/chunks/135.67fab15ebc7d852e.js diff --git a/dist/dashboard/_next/static/chunks/1391.a012fc4679900c0c.js b/dist/controlpanel/_next/static/chunks/1391.a012fc4679900c0c.js similarity index 100% rename from dist/dashboard/_next/static/chunks/1391.a012fc4679900c0c.js rename to dist/controlpanel/_next/static/chunks/1391.a012fc4679900c0c.js diff --git a/dist/dashboard/_next/static/chunks/1424.c15d7e6321ca35d6.js b/dist/controlpanel/_next/static/chunks/1424.c15d7e6321ca35d6.js similarity index 100% rename from dist/dashboard/_next/static/chunks/1424.c15d7e6321ca35d6.js rename to dist/controlpanel/_next/static/chunks/1424.c15d7e6321ca35d6.js diff --git a/dist/dashboard/_next/static/chunks/1608.ec04f07937386922.js b/dist/controlpanel/_next/static/chunks/1608.ec04f07937386922.js similarity index 100% rename from dist/dashboard/_next/static/chunks/1608.ec04f07937386922.js rename to dist/controlpanel/_next/static/chunks/1608.ec04f07937386922.js diff --git a/dist/dashboard/_next/static/chunks/1711.ae2b84d9f5645069.js b/dist/controlpanel/_next/static/chunks/1711.ae2b84d9f5645069.js similarity index 100% rename from dist/dashboard/_next/static/chunks/1711.ae2b84d9f5645069.js rename to dist/controlpanel/_next/static/chunks/1711.ae2b84d9f5645069.js diff --git a/dist/dashboard/_next/static/chunks/1727.af62bd633f21ee69.js b/dist/controlpanel/_next/static/chunks/1727.af62bd633f21ee69.js similarity index 100% rename from dist/dashboard/_next/static/chunks/1727.af62bd633f21ee69.js rename to dist/controlpanel/_next/static/chunks/1727.af62bd633f21ee69.js diff --git a/dist/dashboard/_next/static/chunks/1748.f63b451fd93f590b.js b/dist/controlpanel/_next/static/chunks/1748.f63b451fd93f590b.js similarity index 100% rename from dist/dashboard/_next/static/chunks/1748.f63b451fd93f590b.js rename to dist/controlpanel/_next/static/chunks/1748.f63b451fd93f590b.js diff --git a/dist/dashboard/_next/static/chunks/1950.c8039f3dc9bb92f5.js b/dist/controlpanel/_next/static/chunks/1950.c8039f3dc9bb92f5.js similarity index 100% rename from dist/dashboard/_next/static/chunks/1950.c8039f3dc9bb92f5.js rename to dist/controlpanel/_next/static/chunks/1950.c8039f3dc9bb92f5.js diff --git a/dist/dashboard/_next/static/chunks/1961.e8c3dc6172d4bfaa.js b/dist/controlpanel/_next/static/chunks/1961.e8c3dc6172d4bfaa.js similarity index 100% rename from dist/dashboard/_next/static/chunks/1961.e8c3dc6172d4bfaa.js rename to dist/controlpanel/_next/static/chunks/1961.e8c3dc6172d4bfaa.js diff --git a/dist/dashboard/_next/static/chunks/2499.512d762af08bf6a6.js b/dist/controlpanel/_next/static/chunks/2499.512d762af08bf6a6.js similarity index 100% rename from dist/dashboard/_next/static/chunks/2499.512d762af08bf6a6.js rename to dist/controlpanel/_next/static/chunks/2499.512d762af08bf6a6.js diff --git a/dist/dashboard/_next/static/chunks/2604.250be1a3b8354750.js b/dist/controlpanel/_next/static/chunks/2604.250be1a3b8354750.js similarity index 100% rename from dist/dashboard/_next/static/chunks/2604.250be1a3b8354750.js rename to dist/controlpanel/_next/static/chunks/2604.250be1a3b8354750.js diff --git a/dist/dashboard/_next/static/chunks/2746.0a838d09eabc5b43.js b/dist/controlpanel/_next/static/chunks/2746.0a838d09eabc5b43.js similarity index 100% rename from dist/dashboard/_next/static/chunks/2746.0a838d09eabc5b43.js rename to dist/controlpanel/_next/static/chunks/2746.0a838d09eabc5b43.js diff --git a/dist/dashboard/_next/static/chunks/2840.7001450c4c1f4ea0.js b/dist/controlpanel/_next/static/chunks/2840.7001450c4c1f4ea0.js similarity index 100% rename from dist/dashboard/_next/static/chunks/2840.7001450c4c1f4ea0.js rename to dist/controlpanel/_next/static/chunks/2840.7001450c4c1f4ea0.js diff --git a/dist/dashboard/_next/static/chunks/2896.5ee6626961037489.js b/dist/controlpanel/_next/static/chunks/2896.5ee6626961037489.js similarity index 100% rename from dist/dashboard/_next/static/chunks/2896.5ee6626961037489.js rename to dist/controlpanel/_next/static/chunks/2896.5ee6626961037489.js diff --git a/dist/dashboard/_next/static/chunks/2898.f370a64b5af02f0b.js b/dist/controlpanel/_next/static/chunks/2898.f370a64b5af02f0b.js similarity index 100% rename from dist/dashboard/_next/static/chunks/2898.f370a64b5af02f0b.js rename to dist/controlpanel/_next/static/chunks/2898.f370a64b5af02f0b.js diff --git a/dist/dashboard/_next/static/chunks/3138.03458a939e06d647.js b/dist/controlpanel/_next/static/chunks/3138.03458a939e06d647.js similarity index 100% rename from dist/dashboard/_next/static/chunks/3138.03458a939e06d647.js rename to dist/controlpanel/_next/static/chunks/3138.03458a939e06d647.js diff --git a/dist/dashboard/_next/static/chunks/3200.07a96119d145f2e1.js b/dist/controlpanel/_next/static/chunks/3200.07a96119d145f2e1.js similarity index 100% rename from dist/dashboard/_next/static/chunks/3200.07a96119d145f2e1.js rename to dist/controlpanel/_next/static/chunks/3200.07a96119d145f2e1.js diff --git a/dist/dashboard/_next/static/chunks/3525.53072abba3ca74b8.js b/dist/controlpanel/_next/static/chunks/3525.53072abba3ca74b8.js similarity index 100% rename from dist/dashboard/_next/static/chunks/3525.53072abba3ca74b8.js rename to dist/controlpanel/_next/static/chunks/3525.53072abba3ca74b8.js diff --git a/dist/dashboard/_next/static/chunks/3688.d161b107f65da93d.js b/dist/controlpanel/_next/static/chunks/3688.d161b107f65da93d.js similarity index 100% rename from dist/dashboard/_next/static/chunks/3688.d161b107f65da93d.js rename to dist/controlpanel/_next/static/chunks/3688.d161b107f65da93d.js diff --git a/dist/dashboard/_next/static/chunks/3760.527e299df66f1ddf.js b/dist/controlpanel/_next/static/chunks/3760.527e299df66f1ddf.js similarity index 100% rename from dist/dashboard/_next/static/chunks/3760.527e299df66f1ddf.js rename to dist/controlpanel/_next/static/chunks/3760.527e299df66f1ddf.js diff --git a/dist/dashboard/_next/static/chunks/422.665eb3093c049d41.js b/dist/controlpanel/_next/static/chunks/422.665eb3093c049d41.js similarity index 100% rename from dist/dashboard/_next/static/chunks/422.665eb3093c049d41.js rename to dist/controlpanel/_next/static/chunks/422.665eb3093c049d41.js diff --git a/dist/dashboard/_next/static/chunks/4253.6be69df622e36e45.js b/dist/controlpanel/_next/static/chunks/4253.6be69df622e36e45.js similarity index 100% rename from dist/dashboard/_next/static/chunks/4253.6be69df622e36e45.js rename to dist/controlpanel/_next/static/chunks/4253.6be69df622e36e45.js diff --git a/dist/dashboard/_next/static/chunks/4419.c4f2007bfe36ec14.js b/dist/controlpanel/_next/static/chunks/4419.c4f2007bfe36ec14.js similarity index 100% rename from dist/dashboard/_next/static/chunks/4419.c4f2007bfe36ec14.js rename to dist/controlpanel/_next/static/chunks/4419.c4f2007bfe36ec14.js diff --git a/dist/dashboard/_next/static/chunks/4507.929b32e591e50f8b.js b/dist/controlpanel/_next/static/chunks/4507.929b32e591e50f8b.js similarity index 100% rename from dist/dashboard/_next/static/chunks/4507.929b32e591e50f8b.js rename to dist/controlpanel/_next/static/chunks/4507.929b32e591e50f8b.js diff --git a/dist/dashboard/_next/static/chunks/4583.205bbdd6677d7c00.js b/dist/controlpanel/_next/static/chunks/4583.205bbdd6677d7c00.js similarity index 100% rename from dist/dashboard/_next/static/chunks/4583.205bbdd6677d7c00.js rename to dist/controlpanel/_next/static/chunks/4583.205bbdd6677d7c00.js diff --git a/dist/dashboard/_next/static/chunks/499.6095a9b4c3d3fa0b.js b/dist/controlpanel/_next/static/chunks/499.6095a9b4c3d3fa0b.js similarity index 100% rename from dist/dashboard/_next/static/chunks/499.6095a9b4c3d3fa0b.js rename to dist/controlpanel/_next/static/chunks/499.6095a9b4c3d3fa0b.js diff --git a/dist/dashboard/_next/static/chunks/5119.33e08a0525159056.js b/dist/controlpanel/_next/static/chunks/5119.33e08a0525159056.js similarity index 100% rename from dist/dashboard/_next/static/chunks/5119.33e08a0525159056.js rename to dist/controlpanel/_next/static/chunks/5119.33e08a0525159056.js diff --git a/dist/dashboard/_next/static/chunks/5488.ea86c6ce443ba3bd.js b/dist/controlpanel/_next/static/chunks/5488.ea86c6ce443ba3bd.js similarity index 100% rename from dist/dashboard/_next/static/chunks/5488.ea86c6ce443ba3bd.js rename to dist/controlpanel/_next/static/chunks/5488.ea86c6ce443ba3bd.js diff --git a/dist/dashboard/_next/static/chunks/5515.4b5c8b150669b6f5.js b/dist/controlpanel/_next/static/chunks/5515.4b5c8b150669b6f5.js similarity index 100% rename from dist/dashboard/_next/static/chunks/5515.4b5c8b150669b6f5.js rename to dist/controlpanel/_next/static/chunks/5515.4b5c8b150669b6f5.js diff --git a/dist/dashboard/_next/static/chunks/5679-bec633b225238aa1.js b/dist/controlpanel/_next/static/chunks/5679-bec633b225238aa1.js similarity index 100% rename from dist/dashboard/_next/static/chunks/5679-bec633b225238aa1.js rename to dist/controlpanel/_next/static/chunks/5679-bec633b225238aa1.js diff --git a/dist/dashboard/_next/static/chunks/5710.5bdbdbf21f1c3db3.js b/dist/controlpanel/_next/static/chunks/5710.5bdbdbf21f1c3db3.js similarity index 100% rename from dist/dashboard/_next/static/chunks/5710.5bdbdbf21f1c3db3.js rename to dist/controlpanel/_next/static/chunks/5710.5bdbdbf21f1c3db3.js diff --git a/dist/dashboard/_next/static/chunks/5806.7abe5840ceba140e.js b/dist/controlpanel/_next/static/chunks/5806.7abe5840ceba140e.js similarity index 100% rename from dist/dashboard/_next/static/chunks/5806.7abe5840ceba140e.js rename to dist/controlpanel/_next/static/chunks/5806.7abe5840ceba140e.js diff --git a/dist/dashboard/_next/static/chunks/5811.2ad46e0bdf042ab8.js b/dist/controlpanel/_next/static/chunks/5811.2ad46e0bdf042ab8.js similarity index 100% rename from dist/dashboard/_next/static/chunks/5811.2ad46e0bdf042ab8.js rename to dist/controlpanel/_next/static/chunks/5811.2ad46e0bdf042ab8.js diff --git a/dist/dashboard/_next/static/chunks/5850.b782d289eb0cb77f.js b/dist/controlpanel/_next/static/chunks/5850.b782d289eb0cb77f.js similarity index 100% rename from dist/dashboard/_next/static/chunks/5850.b782d289eb0cb77f.js rename to dist/controlpanel/_next/static/chunks/5850.b782d289eb0cb77f.js diff --git a/dist/dashboard/_next/static/chunks/5883.e4477e9126daa625.js b/dist/controlpanel/_next/static/chunks/5883.e4477e9126daa625.js similarity index 100% rename from dist/dashboard/_next/static/chunks/5883.e4477e9126daa625.js rename to dist/controlpanel/_next/static/chunks/5883.e4477e9126daa625.js diff --git a/dist/dashboard/_next/static/chunks/5939.0a433dc6f963fc41.js b/dist/controlpanel/_next/static/chunks/5939.0a433dc6f963fc41.js similarity index 100% rename from dist/dashboard/_next/static/chunks/5939.0a433dc6f963fc41.js rename to dist/controlpanel/_next/static/chunks/5939.0a433dc6f963fc41.js diff --git a/dist/dashboard/_next/static/chunks/6210.e879386a01d249b4.js b/dist/controlpanel/_next/static/chunks/6210.e879386a01d249b4.js similarity index 100% rename from dist/dashboard/_next/static/chunks/6210.e879386a01d249b4.js rename to dist/controlpanel/_next/static/chunks/6210.e879386a01d249b4.js diff --git a/dist/dashboard/_next/static/chunks/6237.f7b1d24c812922e4.js b/dist/controlpanel/_next/static/chunks/6237.f7b1d24c812922e4.js similarity index 100% rename from dist/dashboard/_next/static/chunks/6237.f7b1d24c812922e4.js rename to dist/controlpanel/_next/static/chunks/6237.f7b1d24c812922e4.js diff --git a/dist/dashboard/_next/static/chunks/6253.dcdff54f0dceda1f.js b/dist/controlpanel/_next/static/chunks/6253.dcdff54f0dceda1f.js similarity index 100% rename from dist/dashboard/_next/static/chunks/6253.dcdff54f0dceda1f.js rename to dist/controlpanel/_next/static/chunks/6253.dcdff54f0dceda1f.js diff --git a/dist/dashboard/_next/static/chunks/6328.ea13afa99496d818.js b/dist/controlpanel/_next/static/chunks/6328.ea13afa99496d818.js similarity index 100% rename from dist/dashboard/_next/static/chunks/6328.ea13afa99496d818.js rename to dist/controlpanel/_next/static/chunks/6328.ea13afa99496d818.js diff --git a/dist/dashboard/_next/static/chunks/6551.432f96462db0d036.js b/dist/controlpanel/_next/static/chunks/6551.432f96462db0d036.js similarity index 100% rename from dist/dashboard/_next/static/chunks/6551.432f96462db0d036.js rename to dist/controlpanel/_next/static/chunks/6551.432f96462db0d036.js diff --git a/dist/dashboard/_next/static/chunks/6626.1c904d6d48510b00.js b/dist/controlpanel/_next/static/chunks/6626.1c904d6d48510b00.js similarity index 100% rename from dist/dashboard/_next/static/chunks/6626.1c904d6d48510b00.js rename to dist/controlpanel/_next/static/chunks/6626.1c904d6d48510b00.js diff --git a/dist/dashboard/_next/static/chunks/6878.5657c32e06476a2e.js b/dist/controlpanel/_next/static/chunks/6878.5657c32e06476a2e.js similarity index 100% rename from dist/dashboard/_next/static/chunks/6878.5657c32e06476a2e.js rename to dist/controlpanel/_next/static/chunks/6878.5657c32e06476a2e.js diff --git a/dist/dashboard/_next/static/chunks/704.484bcd9e0a7f5626.js b/dist/controlpanel/_next/static/chunks/704.484bcd9e0a7f5626.js similarity index 100% rename from dist/dashboard/_next/static/chunks/704.484bcd9e0a7f5626.js rename to dist/controlpanel/_next/static/chunks/704.484bcd9e0a7f5626.js diff --git a/dist/dashboard/_next/static/chunks/7682.b0a3567fac8e0052.js b/dist/controlpanel/_next/static/chunks/7682.b0a3567fac8e0052.js similarity index 100% rename from dist/dashboard/_next/static/chunks/7682.b0a3567fac8e0052.js rename to dist/controlpanel/_next/static/chunks/7682.b0a3567fac8e0052.js diff --git a/dist/dashboard/_next/static/chunks/794.f18da82915d63734.js b/dist/controlpanel/_next/static/chunks/794.f18da82915d63734.js similarity index 100% rename from dist/dashboard/_next/static/chunks/794.f18da82915d63734.js rename to dist/controlpanel/_next/static/chunks/794.f18da82915d63734.js diff --git a/dist/dashboard/_next/static/chunks/8137.d6c500ddcf42e542.js b/dist/controlpanel/_next/static/chunks/8137.d6c500ddcf42e542.js similarity index 100% rename from dist/dashboard/_next/static/chunks/8137.d6c500ddcf42e542.js rename to dist/controlpanel/_next/static/chunks/8137.d6c500ddcf42e542.js diff --git a/dist/dashboard/_next/static/chunks/8366.656bbd943f76fa86.js b/dist/controlpanel/_next/static/chunks/8366.656bbd943f76fa86.js similarity index 100% rename from dist/dashboard/_next/static/chunks/8366.656bbd943f76fa86.js rename to dist/controlpanel/_next/static/chunks/8366.656bbd943f76fa86.js diff --git a/dist/dashboard/_next/static/chunks/8881.8c985300b37d631a.js b/dist/controlpanel/_next/static/chunks/8881.8c985300b37d631a.js similarity index 100% rename from dist/dashboard/_next/static/chunks/8881.8c985300b37d631a.js rename to dist/controlpanel/_next/static/chunks/8881.8c985300b37d631a.js diff --git a/dist/dashboard/_next/static/chunks/8906.7becb64cf75ab6af.js b/dist/controlpanel/_next/static/chunks/8906.7becb64cf75ab6af.js similarity index 100% rename from dist/dashboard/_next/static/chunks/8906.7becb64cf75ab6af.js rename to dist/controlpanel/_next/static/chunks/8906.7becb64cf75ab6af.js diff --git a/dist/dashboard/_next/static/chunks/8989.5d8eeb3ff417836a.js b/dist/controlpanel/_next/static/chunks/8989.5d8eeb3ff417836a.js similarity index 100% rename from dist/dashboard/_next/static/chunks/8989.5d8eeb3ff417836a.js rename to dist/controlpanel/_next/static/chunks/8989.5d8eeb3ff417836a.js diff --git a/dist/dashboard/_next/static/chunks/9212.79924379b5549586.js b/dist/controlpanel/_next/static/chunks/9212.79924379b5549586.js similarity index 100% rename from dist/dashboard/_next/static/chunks/9212.79924379b5549586.js rename to dist/controlpanel/_next/static/chunks/9212.79924379b5549586.js diff --git a/dist/dashboard/_next/static/chunks/9223.882cd6b61a640a13.js b/dist/controlpanel/_next/static/chunks/9223.882cd6b61a640a13.js similarity index 100% rename from dist/dashboard/_next/static/chunks/9223.882cd6b61a640a13.js rename to dist/controlpanel/_next/static/chunks/9223.882cd6b61a640a13.js diff --git a/dist/dashboard/_next/static/chunks/934.405a73de74b58e27.js b/dist/controlpanel/_next/static/chunks/934.405a73de74b58e27.js similarity index 100% rename from dist/dashboard/_next/static/chunks/934.405a73de74b58e27.js rename to dist/controlpanel/_next/static/chunks/934.405a73de74b58e27.js diff --git a/dist/dashboard/_next/static/chunks/9343.a7f54a99eddb02df.js b/dist/controlpanel/_next/static/chunks/9343.a7f54a99eddb02df.js similarity index 100% rename from dist/dashboard/_next/static/chunks/9343.a7f54a99eddb02df.js rename to dist/controlpanel/_next/static/chunks/9343.a7f54a99eddb02df.js diff --git a/dist/dashboard/_next/static/chunks/9600.5accbcbb008d261e.js b/dist/controlpanel/_next/static/chunks/9600.5accbcbb008d261e.js similarity index 100% rename from dist/dashboard/_next/static/chunks/9600.5accbcbb008d261e.js rename to dist/controlpanel/_next/static/chunks/9600.5accbcbb008d261e.js diff --git a/dist/dashboard/_next/static/chunks/9941.44044767831d9eb0.js b/dist/controlpanel/_next/static/chunks/9941.44044767831d9eb0.js similarity index 100% rename from dist/dashboard/_next/static/chunks/9941.44044767831d9eb0.js rename to dist/controlpanel/_next/static/chunks/9941.44044767831d9eb0.js diff --git a/dist/dashboard/_next/static/chunks/framework-ca706bf673a13738.js b/dist/controlpanel/_next/static/chunks/framework-ca706bf673a13738.js similarity index 100% rename from dist/dashboard/_next/static/chunks/framework-ca706bf673a13738.js rename to dist/controlpanel/_next/static/chunks/framework-ca706bf673a13738.js diff --git a/dist/dashboard/_next/static/chunks/main-66d85fc6f7952338.js b/dist/controlpanel/_next/static/chunks/main-66d85fc6f7952338.js similarity index 100% rename from dist/dashboard/_next/static/chunks/main-66d85fc6f7952338.js rename to dist/controlpanel/_next/static/chunks/main-66d85fc6f7952338.js diff --git a/dist/dashboard/_next/static/chunks/pages/_app-8a605b014f26ab32.js b/dist/controlpanel/_next/static/chunks/pages/_app-d357969f021822f1.js similarity index 90% rename from dist/dashboard/_next/static/chunks/pages/_app-8a605b014f26ab32.js rename to dist/controlpanel/_next/static/chunks/pages/_app-d357969f021822f1.js index 3cd53e612..50fd30975 100644 --- a/dist/dashboard/_next/static/chunks/pages/_app-8a605b014f26ab32.js +++ b/dist/controlpanel/_next/static/chunks/pages/_app-d357969f021822f1.js @@ -1,4 +1,4 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2888],{65987:function(e){"use strict";var t={single_source_shortest_paths:function(e,n,o){var i,s,l,c,u,d,p,f={},m={};m[n]=0;var b=t.PriorityQueue.make();for(b.push(n,0);!b.empty();)for(l in s=(i=b.pop()).value,c=i.cost,u=e[s]||{})u.hasOwnProperty(l)&&(d=c+u[l],p=m[l],(void 0===m[l]||p>d)&&(m[l]=d,b.push(l,d),f[l]=s));if(void 0!==o&&void 0===m[o])throw Error(["Could not find a path from ",n," to ",o,"."].join(""));return f},extract_shortest_path_from_predecessor_list:function(e,t){for(var n=[],o=t;o;)n.push(o),e[o],o=e[o];return n.reverse(),n},find_path:function(e,n,o){var i=t.single_source_shortest_paths(e,n,o);return t.extract_shortest_path_from_predecessor_list(i,o)},PriorityQueue:{make:function(e){var n,o=t.PriorityQueue,i={};for(n in e=e||{},o)o.hasOwnProperty(n)&&(i[n]=o[n]);return i.queue=[],i.sorter=e.sorter||o.default_sorter,i},default_sorter:function(e,t){return e.cost-t.cost},push:function(e,t){this.queue.push({value:e,cost:t}),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return 0===this.queue.length}}};e.exports=t},62378:function(e){"use strict";e.exports=function(e){for(var t=[],n=e.length,o=0;o=55296&&i<=56319&&n>o+1){var s=e.charCodeAt(o+1);s>=56320&&s<=57343&&(i=(i-55296)*1024+s-56320+65536,o+=1)}if(i<128){t.push(i);continue}if(i<2048){t.push(i>>6|192),t.push(63&i|128);continue}if(i<55296||i>=57344&&i<65536){t.push(i>>12|224),t.push(i>>6&63|128),t.push(63&i|128);continue}if(i>=65536&&i<=1114111){t.push(i>>18|240),t.push(i>>12&63|128),t.push(i>>6&63|128),t.push(63&i|128);continue}t.push(239,191,189)}return new Uint8Array(t).buffer}},26729:function(e){"use strict";var t=Object.prototype.hasOwnProperty,n="~";function Events(){}function EE(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function addListener(e,t,o,i,s){if("function"!=typeof o)throw TypeError("The listener must be a function");var l=new EE(o,i||e,s),c=n?n+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],l]:e._events[c].push(l):(e._events[c]=l,e._eventsCount++),e}function clearEvent(e,t){0==--e._eventsCount?e._events=new Events:delete e._events[t]}function EventEmitter(){this._events=new Events,this._eventsCount=0}Object.create&&(Events.prototype=Object.create(null),new Events().__proto__||(n=!1)),EventEmitter.prototype.eventNames=function(){var e,o,i=[];if(0===this._eventsCount)return i;for(o in e=this._events)t.call(e,o)&&i.push(n?o.slice(1):o);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(e)):i},EventEmitter.prototype.listeners=function(e){var t=n?n+e:e,o=this._events[t];if(!o)return[];if(o.fn)return[o.fn];for(var i=0,s=o.length,l=Array(s);ie.trim());for(let n=0;n>4]+t[15&e[o]];return n}if("object"==typeof e&&"function"==typeof e.toJSON)return stringify(e.toJSON());switch(typeof e){case"boolean":case"symbol":case"number":return e.toString();case"bigint":return BigInt(e).toString();case"string":return JSON.stringify(e);case"object":{let t=Object.keys(e);return t.sort(),"{ "+t.map(t=>`${stringify(t)}: ${stringify(e[t])}`).join(", ")+" }"}}return"[ COULD NOT SERIALIZE ]"}function errors_assert(e,t,n,o){if(!e)throw function(e,t,n){let o,i=e;{let o=[];if(n){if("message"in n||"code"in n||"name"in n)throw Error(`value will overwrite populated values: ${stringify(n)}`);for(let e in n){if("shortMessage"===e)continue;let t=n[e];o.push(e+"="+stringify(t))}}o.push(`code=${t}`),o.push("version=6.11.1"),o.length&&(e+=" ("+o.join(", ")+")")}switch(t){case"INVALID_ARGUMENT":o=TypeError(e);break;case"NUMERIC_FAULT":case"BUFFER_OVERRUN":o=RangeError(e);break;default:o=Error(e)}return defineProperties(o,{code:t}),n&&Object.assign(o,n),null==o.shortMessage&&defineProperties(o,{shortMessage:i}),o}(t,n,o)}function assertArgument(e,t,n,o){errors_assert(e,t,"INVALID_ARGUMENT",{argument:n,value:o})}let u=["NFD","NFC","NFKD","NFKC"].reduce((e,t)=>{try{if("test"!=="test".normalize(t))throw Error("bad");if("NFD"===t){let e=String.fromCharCode(233).normalize("NFD"),t=String.fromCharCode(101,769);if(e!==t)throw Error("broken")}e.push(t)}catch(e){}return e},[]);function _getBytes(e,t,n){if(e instanceof Uint8Array)return n?new Uint8Array(e):e;if("string"==typeof e&&e.match(/^0x([0-9a-f][0-9a-f])*$/i)){let t=new Uint8Array((e.length-2)/2),n=2;for(let o=0;o>4]+d[15&o]}return n}function concat(e){return"0x"+e.map(e=>data_hexlify(e).substring(2)).join("")}function dataLength(e){return isHexString(e,!0)?(e.length-2)/2:data_getBytes(e).length}let p=!1,_keccak256=function(e){return(0,c.fr)(e)},f=_keccak256;function keccak256(e){let t=data_getBytes(e,"data");return data_hexlify(f(t))}keccak256._=_keccak256,keccak256.lock=function(){p=!0},keccak256.register=function(e){if(p)throw TypeError("keccak256 is locked");f=e},Object.freeze(keccak256);let m=BigInt(0),b=BigInt(36);function getChecksumAddress(e){e=e.toLowerCase();let t=e.substring(2).split(""),n=new Uint8Array(40);for(let e=0;e<40;e++)n[e]=t[e].charCodeAt(0);let o=data_getBytes(keccak256(n));for(let e=0;e<40;e+=2)o[e>>1]>>4>=8&&(t[e]=t[e].toUpperCase()),(15&o[e>>1])>=8&&(t[e+1]=t[e+1].toUpperCase());return"0x"+t.join("")}let g={};for(let e=0;e<10;e++)g[String(e)]=String(e);for(let e=0;e<26;e++)g[String.fromCharCode(65+e)]=String(10+e);let y=function(){let e={};for(let t=0;t<36;t++){let n="0123456789abcdefghijklmnopqrstuvwxyz"[t];e[n]=BigInt(t)}return e}();var v=n(11606),w=n(27499);/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */let C=BigInt(0),E=BigInt(1),x=BigInt(2),A=BigInt(3),k=BigInt(4),B=BigInt(5),S=BigInt(8);function modular_mod(e,t){let n=e%t;return n>=C?n:t+n}function pow2(e,t,n){let o=e;for(;t-- >C;)o*=o,o%=n;return o}function invert(e,t){if(e===C||t<=C)throw Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=modular_mod(e,t),o=t,i=C,s=E,l=E,c=C;for(;n!==C;){let e=o/n,t=o%n,u=i-l*e,d=s-c*e;o=n,n=t,i=l,s=c,l=u,c=d}let u=o;if(u!==E)throw Error("invert: does not exist");return modular_mod(i,t)}BigInt(9),BigInt(16);let I=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function nLength(e,t){let n=void 0!==t?t:e.toString(2).length;return{nBitLength:n,nByteLength:Math.ceil(n/8)}}function getFieldBytesLength(e){if("bigint"!=typeof e)throw Error("field order must be bigint");let t=e.toString(2).length;return Math.ceil(t/8)}function getMinHashLength(e){let t=getFieldBytesLength(e);return t+Math.ceil(t/2)}var j=n(93527),T=n(66409);let HMAC=class HMAC extends T.kb{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,(0,j.vp)(e);let n=(0,T.O0)(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;let o=this.blockLen,i=new Uint8Array(o);i.set(n.length>o?e.create().update(n).digest():n);for(let e=0;enew HMAC(e,t).update(n).digest();hmac.create=(e,t)=>new HMAC(e,t);/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */let P=BigInt(0),M=BigInt(1);function validateBasic(e){return!function(e){let t=I.reduce((e,t)=>(e[t]="function",e),{ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"});(0,w.FF)(e,t)}(e.Fp),(0,w.FF)(e,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...nLength(e.n,e.nBitLength),...e,p:e.Fp.ORDER})}let{bytesToNumberBE:O,hexToBytes:R}=w,U={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){let{Err:t}=U;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");let n=e[1],o=e.subarray(2,n+2);if(!n||o.length!==n)throw new t("Invalid signature integer: wrong length");if(128&o[0])throw new t("Invalid signature integer: negative");if(0===o[0]&&!(128&o[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:O(o),l:e.subarray(n+2)}},toSig(e){let{Err:t}=U,n="string"==typeof e?R(e):e;if(!(n instanceof Uint8Array))throw Error("ui8a expected");let o=n.length;if(o<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==o-2)throw new t("Invalid signature: incorrect length");let{d:i,l:s}=U._parseInt(n.subarray(2)),{d:l,l:c}=U._parseInt(s);if(c.length)throw new t("Invalid signature: left bytes after parsing");return{r:i,s:l}},hexFromSig(e){let slice=e=>8&Number.parseInt(e[0],16)?"00"+e:e,h=e=>{let t=e.toString(16);return 1&t.length?`0${t}`:t},t=slice(h(e.s)),n=slice(h(e.r)),o=t.length/2,i=n.length/2,s=h(o),l=h(i);return`30${h(i+o+4)}02${l}${n}02${s}${t}`}},F=BigInt(0),N=BigInt(1),D=(BigInt(2),BigInt(3));BigInt(4);/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */let _=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),L=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),z=BigInt(1),q=BigInt(2),divNearest=(e,t)=>(e+t/q)/t,G=function(e,t,n=!1,o={}){if(e<=C)throw Error(`Expected Field ORDER > 0, got ${e}`);let{nBitLength:i,nByteLength:s}=nLength(e,t);if(s>2048)throw Error("Field lengths over 2048 bytes are not supported");let l=function(e){if(e%k===A){let t=(e+E)/k;return function(e,n){let o=e.pow(n,t);if(!e.eql(e.sqr(o),n))throw Error("Cannot find square root");return o}}if(e%S===B){let t=(e-B)/S;return function(e,n){let o=e.mul(n,x),i=e.pow(o,t),s=e.mul(n,i),l=e.mul(e.mul(s,x),i),c=e.mul(s,e.sub(l,e.ONE));if(!e.eql(e.sqr(c),n))throw Error("Cannot find square root");return c}}return function(e){let t,n,o;let i=(e-E)/x;for(t=e-E,n=0;t%x===C;t/=x,n++);for(o=x;o 0");if(n===E)return C;let o=E;for(;t>C;)t&E&&(o=o*e%n),e=e*e%n,t>>=E;return o}(o,i,e)!==e-E;o++);if(1===n){let t=(e+E)/k;return function(e,n){let o=e.pow(n,t);if(!e.eql(e.sqr(o),n))throw Error("Cannot find square root");return o}}let s=(t+E)/x;return function(e,l){if(e.pow(l,i)===e.neg(e.ONE))throw Error("Cannot find square root");let c=n,u=e.pow(e.mul(e.ONE,o),t),d=e.pow(l,s),p=e.pow(l,t);for(;!e.eql(p,e.ONE);){if(e.eql(p,e.ZERO))return e.ZERO;let t=1;for(let n=e.sqr(p);tmodular_mod(t,e),isValid:t=>{if("bigint"!=typeof t)throw Error(`Invalid field element: expected bigint, got ${typeof t}`);return C<=t&&te===C,isOdd:e=>(e&E)===E,neg:t=>modular_mod(-t,e),eql:(e,t)=>e===t,sqr:t=>modular_mod(t*t,e),add:(t,n)=>modular_mod(t+n,e),sub:(t,n)=>modular_mod(t-n,e),mul:(t,n)=>modular_mod(t*n,e),pow:(e,t)=>(function(e,t,n){if(n 0");if(n===C)return e.ONE;if(n===E)return t;let o=e.ONE,i=t;for(;n>C;)n&E&&(o=e.mul(o,i)),i=e.sqr(i),n>>=E;return o})(c,e,t),div:(t,n)=>modular_mod(t*invert(n,e),e),sqrN:e=>e*e,addN:(e,t)=>e+t,subN:(e,t)=>e-t,mulN:(e,t)=>e*t,inv:t=>invert(t,e),sqrt:o.sqrt||(e=>l(c,e)),invertBatch:e=>(function(e,t){let n=Array(t.length),o=t.reduce((t,o,i)=>e.is0(o)?t:(n[i]=t,e.mul(t,o)),e.ONE),i=e.inv(o);return t.reduceRight((t,o,i)=>e.is0(o)?t:(n[i]=e.mul(t,n[i]),e.mul(t,o)),i),n})(c,e),cmov:(e,t,n)=>n?t:e,toBytes:e=>n?(0,w.S5)(e,s):(0,w.tL)(e,s),fromBytes:e=>{if(e.length!==s)throw Error(`Fp.fromBytes: expected ${s}, got ${e.length}`);return n?(0,w.ty)(e):(0,w.bytesToNumberBE)(e)}});return Object.freeze(c)}(_,void 0,void 0,{sqrt:function(e){let t=BigInt(3),n=BigInt(6),o=BigInt(11),i=BigInt(22),s=BigInt(23),l=BigInt(44),c=BigInt(88),u=e*e*e%_,d=u*u*e%_,p=pow2(d,t,_)*d%_,f=pow2(p,t,_)*d%_,m=pow2(f,q,_)*u%_,b=pow2(m,o,_)*m%_,g=pow2(b,i,_)*b%_,y=pow2(g,l,_)*g%_,v=pow2(y,c,_)*y%_,w=pow2(v,l,_)*g%_,C=pow2(w,t,_)*d%_,E=pow2(C,s,_)*b%_,x=pow2(E,n,_)*u%_,A=pow2(x,q,_);if(!G.eql(G.sqr(A),e))throw Error("Cannot find square root");return A}}),W=function(e,t){let create=t=>(function(e){let t=function(e){let t=validateBasic(e);return w.FF(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}(e),{Fp:n,n:o}=t,i=n.BYTES+1,s=2*n.BYTES+1;function modN(e){return modular_mod(e,o)}let{ProjectivePoint:l,normPrivateKeyToScalar:c,weierstrassEquation:u,isWithinCurveOrder:d}=function(e){let t=/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function(e){let t=validateBasic(e);w.FF(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});let{endo:n,Fp:o,a:i}=t;if(n){if(!o.eql(i,o.ZERO))throw Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}(e),{Fp:n}=t,o=t.toBytes||((e,t,o)=>{let i=t.toAffine();return w.eV(Uint8Array.from([4]),n.toBytes(i.x),n.toBytes(i.y))}),i=t.fromBytes||(e=>{let t=e.subarray(1),o=n.fromBytes(t.subarray(0,n.BYTES)),i=n.fromBytes(t.subarray(n.BYTES,2*n.BYTES));return{x:o,y:i}});function weierstrassEquation(e){let{a:o,b:i}=t,s=n.sqr(e),l=n.mul(s,e);return n.add(n.add(l,n.mul(e,o)),i)}if(!n.eql(n.sqr(t.Gy),weierstrassEquation(t.Gx)))throw Error("bad generator point: equation left != right");function isWithinCurveOrder(e){return"bigint"==typeof e&&Fn.eql(e,n.ZERO);return is0(t)&&is0(o)?Point.ZERO:new Point(t,o,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){let t=n.invertBatch(e.map(e=>e.pz));return e.map((e,n)=>e.toAffine(t[n])).map(Point.fromAffine)}static fromHex(e){let t=Point.fromAffine(i((0,w.ql)("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return Point.BASE.multiply(normPrivateKeyToScalar(e))}_setWindowSize(e){this._WINDOW_SIZE=e,s.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint&&!n.is0(this.py))return;throw Error("bad point: ZERO")}let{x:e,y:o}=this.toAffine();if(!n.isValid(e)||!n.isValid(o))throw Error("bad point: x or y not FE");let i=n.sqr(o),s=weierstrassEquation(e);if(!n.eql(i,s))throw Error("bad point: equation left != right");if(!this.isTorsionFree())throw Error("bad point: not in prime-order subgroup")}hasEvenY(){let{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw Error("Field doesn't support isOdd")}equals(e){assertPrjPoint(e);let{px:t,py:o,pz:i}=this,{px:s,py:l,pz:c}=e,u=n.eql(n.mul(t,c),n.mul(s,i)),d=n.eql(n.mul(o,c),n.mul(l,i));return u&&d}negate(){return new Point(this.px,n.neg(this.py),this.pz)}double(){let{a:e,b:o}=t,i=n.mul(o,D),{px:s,py:l,pz:c}=this,u=n.ZERO,d=n.ZERO,p=n.ZERO,f=n.mul(s,s),m=n.mul(l,l),b=n.mul(c,c),g=n.mul(s,l);return g=n.add(g,g),p=n.mul(s,c),p=n.add(p,p),u=n.mul(e,p),d=n.mul(i,b),d=n.add(u,d),u=n.sub(m,d),d=n.add(m,d),d=n.mul(u,d),u=n.mul(g,u),p=n.mul(i,p),b=n.mul(e,b),g=n.sub(f,b),g=n.mul(e,g),g=n.add(g,p),p=n.add(f,f),f=n.add(p,f),f=n.add(f,b),f=n.mul(f,g),d=n.add(d,f),b=n.mul(l,c),b=n.add(b,b),f=n.mul(b,g),u=n.sub(u,f),p=n.mul(b,m),p=n.add(p,p),p=n.add(p,p),new Point(u,d,p)}add(e){assertPrjPoint(e);let{px:o,py:i,pz:s}=this,{px:l,py:c,pz:u}=e,d=n.ZERO,p=n.ZERO,f=n.ZERO,m=t.a,b=n.mul(t.b,D),g=n.mul(o,l),y=n.mul(i,c),v=n.mul(s,u),w=n.add(o,i),C=n.add(l,c);w=n.mul(w,C),C=n.add(g,y),w=n.sub(w,C),C=n.add(o,s);let E=n.add(l,u);return C=n.mul(C,E),E=n.add(g,v),C=n.sub(C,E),E=n.add(i,s),d=n.add(c,u),E=n.mul(E,d),d=n.add(y,v),E=n.sub(E,d),f=n.mul(m,C),d=n.mul(b,v),f=n.add(d,f),d=n.sub(y,f),f=n.add(y,f),p=n.mul(d,f),y=n.add(g,g),y=n.add(y,g),v=n.mul(m,v),C=n.mul(b,C),y=n.add(y,v),v=n.sub(g,v),v=n.mul(m,v),C=n.add(C,v),g=n.mul(y,C),p=n.add(p,g),g=n.mul(E,C),d=n.mul(w,d),d=n.sub(d,g),g=n.mul(w,y),f=n.mul(E,f),f=n.add(f,g),new Point(d,p,f)}subtract(e){return this.add(e.negate())}is0(){return this.equals(Point.ZERO)}wNAF(e){return c.wNAFCached(this,s,e,e=>{let t=n.invertBatch(e.map(e=>e.pz));return e.map((e,n)=>e.toAffine(t[n])).map(Point.fromAffine)})}multiplyUnsafe(e){let o=Point.ZERO;if(e===F)return o;if(assertGE(e),e===N)return this;let{endo:i}=t;if(!i)return c.unsafeLadder(this,e);let{k1neg:s,k1:l,k2neg:u,k2:d}=i.splitScalar(e),p=o,f=o,m=this;for(;l>F||d>F;)l&N&&(p=p.add(m)),d&N&&(f=f.add(m)),m=m.double(),l>>=N,d>>=N;return s&&(p=p.negate()),u&&(f=f.negate()),f=new Point(n.mul(f.px,i.beta),f.py,f.pz),p.add(f)}multiply(e){let o,i;assertGE(e);let{endo:s}=t;if(s){let{k1neg:t,k1:l,k2neg:u,k2:d}=s.splitScalar(e),{p:p,f:f}=this.wNAF(l),{p:m,f:b}=this.wNAF(d);p=c.constTimeNegate(t,p),m=c.constTimeNegate(u,m),m=new Point(n.mul(m.px,s.beta),m.py,m.pz),o=p.add(m),i=f.add(b)}else{let{p:t,f:n}=this.wNAF(e);o=t,i=n}return Point.normalizeZ([o,i])[0]}multiplyAndAddUnsafe(e,t,n){let o=Point.BASE,mul=(e,t)=>t!==F&&t!==N&&e.equals(o)?e.multiply(t):e.multiplyUnsafe(t),i=mul(this,t).add(mul(e,n));return i.is0()?void 0:i}toAffine(e){let{px:t,py:o,pz:i}=this,s=this.is0();null==e&&(e=s?n.ONE:n.inv(i));let l=n.mul(t,e),c=n.mul(o,e),u=n.mul(i,e);if(s)return{x:n.ZERO,y:n.ZERO};if(!n.eql(u,n.ONE))throw Error("invZ was invalid");return{x:l,y:c}}isTorsionFree(){let{h:e,isTorsionFree:n}=t;if(e===N)return!0;if(n)return n(Point,this);throw Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){let{h:e,clearCofactor:n}=t;return e===N?this:n?n(Point,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),o(Point,this,e)}toHex(e=!0){return w.ci(this.toRawBytes(e))}};Point.BASE=new Point(t.Gx,t.Gy,n.ONE),Point.ZERO=new Point(n.ZERO,n.ONE,n.ZERO);let l=t.nBitLength,c=function(e,t){let constTimeNegate=(e,t)=>{let n=t.negate();return e?n:t},opts=e=>({windows:Math.ceil(t/e)+1,windowSize:2**(e-1)});return{constTimeNegate,unsafeLadder(t,n){let o=e.ZERO,i=t;for(;n>P;)n&M&&(o=o.add(i)),i=i.double(),n>>=M;return o},precomputeWindow(e,t){let{windows:n,windowSize:o}=opts(t),i=[],s=e,l=s;for(let e=0;e>=p,i>s&&(i-=d,o+=M);let f=t+Math.abs(i)-1,m=e%2!=0,b=i<0;0===i?c=c.add(constTimeNegate(m,n[t])):l=l.add(constTimeNegate(b,n[f]))}return{p:l,f:c}},wNAFCached(e,t,n,o){let i=e._WINDOW_SIZE||1,s=t.get(e);return s||(s=this.precomputeWindow(e,i),1!==i&&t.set(e,o(s))),this.wNAF(i,s,n)}}}(Point,t.endo?Math.ceil(l/2):l);return{CURVE:t,ProjectivePoint:Point,normPrivateKeyToScalar,weierstrassEquation,isWithinCurveOrder}}({...t,toBytes(e,t,o){let i=t.toAffine(),s=n.toBytes(i.x),l=w.eV;return o?l(Uint8Array.from([t.hasEvenY()?2:3]),s):l(Uint8Array.from([4]),s,n.toBytes(i.y))},fromBytes(e){let t=e.length,o=e[0],l=e.subarray(1);if(t===i&&(2===o||3===o)){let e=w.bytesToNumberBE(l);if(!(Fw.ci(w.tL(e,t.nByteLength));function isBiggerThanHalfOrder(e){let t=o>>N;return e>t}let slcNum=(e,t,n)=>w.bytesToNumberBE(e.slice(t,n));let Signature=class Signature{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){let n=t.nByteLength;return e=(0,w.ql)("compactSignature",e,2*n),new Signature(slcNum(e,0,n),slcNum(e,n,2*n))}static fromDER(e){let{r:t,s:n}=U.toSig((0,w.ql)("DER",e));return new Signature(t,n)}assertValidity(){if(!d(this.r))throw Error("r must be 0 < r < CURVE.n");if(!d(this.s))throw Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new Signature(this.r,this.s,e)}recoverPublicKey(e){let{r:i,s,recovery:c}=this,u=f((0,w.ql)("msgHash",e));if(null==c||![0,1,2,3].includes(c))throw Error("recovery id invalid");let d=2===c||3===c?i+t.n:i;if(d>=n.ORDER)throw Error("recovery id 2 or 3 invalid");let p=(1&c)==0?"02":"03",m=l.fromHex(p+numToNByteStr(d)),b=invert(d,o),g=modN(-u*b),y=modN(s*b),v=l.BASE.multiplyAndAddUnsafe(m,g,y);if(!v)throw Error("point at infinify");return v.assertValidity(),v}hasHighS(){return isBiggerThanHalfOrder(this.s)}normalizeS(){return this.hasHighS()?new Signature(this.r,modN(-this.s),this.recovery):this}toDERRawBytes(){return w.hexToBytes(this.toDERHex())}toDERHex(){return U.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return w.hexToBytes(this.toCompactHex())}toCompactHex(){return numToNByteStr(this.r)+numToNByteStr(this.s)}};function isProbPub(e){let t=e instanceof Uint8Array,n="string"==typeof e,o=(t||n)&&e.length;return t?o===i||o===s:n?o===2*i||o===2*s:e instanceof l}let p=t.bits2int||function(e){let n=w.bytesToNumberBE(e),o=8*e.length-t.nBitLength;return o>0?n>>BigInt(o):n},f=t.bits2int_modN||function(e){return modN(p(e))},m=w.dQ(t.nBitLength);function int2octets(e){if("bigint"!=typeof e)throw Error("bigint expected");if(!(F<=e&&ee in s))throw Error("sign() legacy options not supported");let{hash:u,randomBytes:m}=t,{lowS:g,prehash:y,extraEntropy:v}=s;null==g&&(g=!0),e=(0,w.ql)("msgHash",e),y&&(e=(0,w.ql)("prehashed msgHash",u(e)));let C=f(e),E=c(i),x=[int2octets(E),int2octets(C)];if(null!=v){let e=!0===v?m(n.BYTES):v;x.push((0,w.ql)("extraEntropy",e))}let A=w.eV(...x);return{seed:A,k2sig:function(e){let t=p(e);if(!d(t))return;let n=invert(t,o),i=l.BASE.multiply(t).toAffine(),s=modN(i.x);if(s===F)return;let c=modN(n*modN(C+s*E));if(c===F)return;let u=(i.x===s?0:2)|Number(i.y&N),f=c;return g&&isBiggerThanHalfOrder(c)&&(f=isBiggerThanHalfOrder(c)?modN(-c):c,u^=1),new Signature(s,f,u)}}}(e,i,s),g=w.n$(t.hash.outputLen,t.nByteLength,t.hmac);return g(u,m)},verify:function(e,n,i,s=g){let c,u;if(n=(0,w.ql)("msgHash",n),i=(0,w.ql)("publicKey",i),"strict"in s)throw Error("options.strict was renamed to lowS");let{lowS:d,prehash:p}=s;try{if("string"==typeof e||e instanceof Uint8Array)try{u=Signature.fromDER(e)}catch(t){if(!(t instanceof U.Err))throw t;u=Signature.fromCompact(e)}else if("object"==typeof e&&"bigint"==typeof e.r&&"bigint"==typeof e.s){let{r:t,s:n}=e;u=new Signature(t,n)}else throw Error("PARSE");c=l.fromHex(i)}catch(e){if("PARSE"===e.message)throw Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(d&&u.hasHighS())return!1;p&&(n=t.hash(n));let{r:m,s:b}=u,y=f(n),v=invert(b,o),C=modN(y*v),E=modN(m*v),x=l.BASE.multiplyAndAddUnsafe(c,C,E)?.toAffine();if(!x)return!1;let A=modN(x.x);return A===m},ProjectivePoint:l,Signature,utils:{isValidPrivateKey(e){try{return c(e),!0}catch(e){return!1}},normPrivateKeyToScalar:c,randomPrivateKey:()=>{let e=getMinHashLength(t.n);return function(e,t,n=!1){let o=e.length,i=getFieldBytesLength(t),s=getMinHashLength(t);if(o<16||o1024)throw Error(`expected ${s}-1024 bytes of input, got ${o}`);let l=n?(0,w.bytesToNumberBE)(e):(0,w.ty)(e),c=modular_mod(l,t-E)+E;return n?(0,w.S5)(c,i):(0,w.tL)(c,i)}(t.randomBytes(e),t.n)},precompute:(e=8,t=l.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)}}})({...e,hash:t,hmac:(e,...n)=>hmac(t,e,(0,T.eV)(...n)),randomBytes:T.O6});return Object.freeze({...create(t),create})}({a:BigInt(0),b:BigInt(7),Fp:G,n:L,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{let t=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),n=-z*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),o=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),i=BigInt("0x100000000000000000000000000000000"),s=divNearest(t*e,L),l=divNearest(-n*e,L),c=modular_mod(e-s*t-l*o,L),u=modular_mod(-s*n-l*t,L),d=c>i,p=u>i;if(d&&(c=L-c),p&&(u=L-u),c>i||u>i)throw Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:d,k1:c,k2neg:p,k2:u}}}},v.J),H=(BigInt(0),W.ProjectivePoint,BigInt(0));function getBigInt(e,t){switch(typeof e){case"bigint":return e;case"number":return assertArgument(Number.isInteger(e),"underflow",t||"value",e),assertArgument(e>=-9007199254740991&&e<=9007199254740991,"overflow",t||"value",e),BigInt(e);case"string":try{if(""===e)throw Error("empty string");if("-"===e[0]&&"-"!==e[1])return-BigInt(e.substring(1));return BigInt(e)}catch(n){assertArgument(!1,`invalid BigNumberish string: ${n.message}`,t||"value",e)}}assertArgument(!1,"invalid BigNumberish value",t||"value",e)}function getUint(e,t){let n=getBigInt(e,t);return errors_assert(n>=H,"unsigned value cannot be negative","NUMERIC_FAULT",{fault:"overflow",operation:"getUint",value:e}),n}function getNumber(e,t){switch(typeof e){case"bigint":return assertArgument(e>=-9007199254740991&&e<=9007199254740991,"overflow",t||"value",e),Number(e);case"number":return assertArgument(Number.isInteger(e),"underflow",t||"value",e),assertArgument(e>=-9007199254740991&&e<=9007199254740991,"overflow",t||"value",e),e;case"string":try{if(""===e)throw Error("empty string");return getNumber(BigInt(e),t)}catch(n){assertArgument(!1,`invalid numeric string: ${n.message}`,t||"value",e)}}assertArgument(!1,"invalid numeric value",t||"value",e)}function toBeHex(e,t){let n=getUint(e,"value"),o=n.toString(16);if(null==t)o.length%2&&(o="0"+o);else{let n=getNumber(t,"width");for(errors_assert(2*n>=o.length,`value exceeds width (${n} bytes)`,"NUMERIC_FAULT",{operation:"toBeHex",fault:"overflow",value:e});o.length<2*n;)o="0"+o}return"0x"+o}BigInt(1);let Q="0x0000000000000000000000000000000000000000000000000000000000000000",K=BigInt(0),V=BigInt(1),Z=BigInt(2),J=BigInt(27),X=BigInt(28),Y=BigInt(35),$={};function toUint256(e){return function(e,t,n){let o=data_getBytes(e);errors_assert(t>=o.length,"padding exceeds data length","BUFFER_OVERRUN",{buffer:new Uint8Array(o),length:t,offset:t+1});let i=new Uint8Array(t);return i.fill(0),n?i.set(o,t-o.length):i.set(o,0),data_hexlify(i)}(function(e){let t=getUint(e,"value");if(t===H)return new Uint8Array([]);let n=t.toString(16);n.length%2&&(n="0"+n);let o=new Uint8Array(n.length/2);for(let e=0;eparseInt(t.substring(0,3)),"non-canonical s","value",t),this.#t=t}get v(){return this.#r}set v(e){let t=getNumber(e,"value");assertArgument(27===t||28===t,"invalid v","v",e),this.#r=t}get networkV(){return this.#n}get legacyChainId(){let e=this.networkV;return null==e?null:Signature.getChainId(e)}get yParity(){return 27===this.v?0:1}get yParityAndS(){let e=data_getBytes(this.s);return this.yParity&&(e[0]|=128),data_hexlify(e)}get compactSerialized(){return concat([this.r,this.yParityAndS])}get serialized(){return concat([this.r,this.s,this.yParity?"0x1c":"0x1b"])}constructor(e,t,n,o){!function(e,t,n){if(null==n&&(n=""),e!==t){let e=n,t="new";n&&(e+=".",t+=" "+n),errors_assert(!1,`private constructor; use ${e}from* methods`,"UNSUPPORTED_OPERATION",{operation:t})}}(e,$,"Signature"),this.#e=t,this.#t=n,this.#r=o,this.#n=null}[Symbol.for("nodejs.util.inspect.custom")](){return`Signature { r: "${this.r}", s: "${this.s}", yParity: ${this.yParity}, networkV: ${this.networkV} }`}clone(){let e=new Signature($,this.r,this.s,this.v);return this.networkV&&(e.#n=this.networkV),e}toJSON(){let e=this.networkV;return{_type:"signature",networkV:null!=e?e.toString():null,r:this.r,s:this.s,v:this.v}}static getChainId(e){let t=getBigInt(e,"v");return t==J||t==X?K:(assertArgument(t>=Y,"invalid EIP-155 v","v",e),(t-Y)/Z)}static getChainIdV(e,t){return getBigInt(e)*Z+BigInt(35+t-27)}static getNormalizedV(e){let t=getBigInt(e);return t===K||t===J?27:t===V||t===X?28:(assertArgument(t>=Y,"invalid v","v",e),t&V?27:28)}static from(e){function assertError(t,n){assertArgument(t,n,"signature",e)}if(null==e)return new Signature($,Q,Q,27);if("string"==typeof e){let t=data_getBytes(e,"signature");if(64===t.length){let e=data_hexlify(t.slice(0,32)),n=t.slice(32,64),o=128&n[0]?28:27;return n[0]&=127,new Signature($,e,data_hexlify(n),o)}if(65===t.length){let e=data_hexlify(t.slice(0,32)),n=t.slice(32,64);assertError((128&n[0])==0,"non-canonical s");let o=Signature.getNormalizedV(t[64]);return new Signature($,e,data_hexlify(n),o)}assertError(!1,"invalid raw signature length")}if(e instanceof Signature)return e.clone();let t=e.r;assertError(null!=t,"missing r");let n=toUint256(t),o=function(e,t){if(null!=e)return toUint256(e);if(null!=t){assertError(isHexString(t,32),"invalid yParityAndS");let e=data_getBytes(t);return e[0]&=127,data_hexlify(e)}assertError(!1,"missing s")}(e.s,e.yParityAndS);assertError((128&data_getBytes(o)[0])==0,"non-canonical s");let{networkV:i,v:s}=function(e,t,n){if(null!=e){let t=getBigInt(e);return{networkV:t>=Y?t:void 0,v:Signature.getNormalizedV(t)}}if(null!=t)return assertError(isHexString(t,32),"invalid yParityAndS"),{v:128&data_getBytes(t)[0]?28:27};if(null!=n){switch(getNumber(n,"sig.yParity")){case 0:return{v:27};case 1:return{v:28}}assertError(!1,"invalid yParity")}assertError(!1,"missing v")}(e.v,e.yParityAndS,e.yParity),l=new Signature($,n,o,s);return i&&(l.#n=i),assertError(null==e.yParity||getNumber(e.yParity,"sig.yParity")===l.yParity,"yParity mismatch"),assertError(null==e.yParityAndS||e.yParityAndS===l.yParityAndS,"yParityAndS mismatch"),l}};let SigningKey=class SigningKey{#a;constructor(e){assertArgument(32===dataLength(e),"invalid private key","privateKey","[REDACTED]"),this.#a=data_hexlify(e)}get privateKey(){return this.#a}get publicKey(){return SigningKey.computePublicKey(this.#a)}get compressedPublicKey(){return SigningKey.computePublicKey(this.#a,!0)}sign(e){assertArgument(32===dataLength(e),"invalid digest length","digest",e);let t=W.sign(getBytesCopy(e),getBytesCopy(this.#a),{lowS:!0});return Signature.from({r:toBeHex(t.r,32),s:toBeHex(t.s,32),v:t.recovery?28:27})}computeSharedSecret(e){let t=SigningKey.computePublicKey(e);return data_hexlify(W.getSharedSecret(getBytesCopy(this.#a),data_getBytes(t),!1))}static computePublicKey(e,t){let n=data_getBytes(e,"key");if(32===n.length){let e=W.getPublicKey(n,!!t);return data_hexlify(e)}if(64===n.length){let e=new Uint8Array(65);e[0]=4,e.set(n,1),n=e}let o=W.ProjectivePoint.fromHex(n);return data_hexlify(o.toRawBytes(t))}static recoverPublicKey(e,t){assertArgument(32===dataLength(e),"invalid digest length","digest",e);let n=Signature.from(t),o=W.Signature.fromCompact(getBytesCopy(concat([n.r,n.s])));o=o.addRecoveryBit(n.yParity);let i=o.recoverPublicKey(getBytesCopy(e));return assertArgument(null!=i,"invalid signautre for digest","signature",t),"0x"+i.toHex(!1)}static addPoints(e,t,n){let o=W.ProjectivePoint.fromHex(SigningKey.computePublicKey(e).substring(2)),i=W.ProjectivePoint.fromHex(SigningKey.computePublicKey(t).substring(2));return"0x"+o.add(i).toHex(!!n)}};function ignoreFunc(e,t,n,o,i){if("BAD_PREFIX"===e||"UNEXPECTED_CONTINUE"===e){let e=0;for(let o=t+1;o>6==2;o++)e++;return e}return"OVERRUN"===e?n.length-t-1:0}function toUtf8Bytes(e,t){assertArgument("string"==typeof e,"invalid string value","str",e),null!=t&&(errors_assert(u.indexOf(t)>=0,"platform missing String.prototype.normalize","UNSUPPORTED_OPERATION",{operation:"String.prototype.normalize",info:{form:t}}),e=e.normalize(t));let n=[];for(let t=0;t>6|192),n.push(63&o|128);else if((64512&o)==55296){t++;let i=e.charCodeAt(t);assertArgument(t>18|240),n.push(s>>12&63|128),n.push(s>>6&63|128),n.push(63&s|128)}else n.push(o>>12|224),n.push(o>>6&63|128),n.push(63&o|128)}return new Uint8Array(n)}Object.freeze({error:function(e,t,n,o,i){assertArgument(!1,`invalid codepoint at offset ${t}; ${e}`,"bytes",n)},ignore:ignoreFunc,replace:function(e,t,n,o,i){return"OVERLONG"===e?(assertArgument("number"==typeof i,"invalid bad code point for replacement","badCodepoint",i),o.push(i),0):(o.push(65533),ignoreFunc(e,t,n,o,i))}});let ee=(0,i.createContext)(void 0),AdminProvider=e=>{let{children:t}=e,{address:n,isConnected:c}=(0,s.m)(),{signMessage:u,data:d}=(0,l.Q)(),[p,f]=(0,i.useState)(!1),[v,w]=(0,i.useState)([]),[C,E]=(0,i.useState)(),[x,A]=(0,i.useState)(),[k,B]=(0,i.useState)(!0),[S,I]=(0,i.useState)([]);return(0,i.useEffect)(()=>{c&&n||(A(void 0),E(void 0))},[n,c]),(0,i.useEffect)(()=>{let e=localStorage.getItem("expiryTimestamp"),t=e?parseInt(e,10):null;if(t&&t>Date.now()){E(t);let e=localStorage.getItem("signature");e&&A(e)}},[n,c]),(0,i.useEffect)(()=>{C&&C>Date.now()&&(localStorage.setItem("expiryTimestamp",C.toString()),x&&localStorage.setItem("signature",x))},[C,x,n,c]),(0,i.useEffect)(()=>{d&&A(d)},[d,n,c]),(0,i.useEffect)(()=>{let e=setInterval(()=>{if(C){let e=Date.now();B(eclearInterval(e)},[C,n,c]),(0,i.useEffect)(()=>{if(C&&x){var e;let t=null===(e=function(e,t){var n,o;let i=("string"==typeof(n=e)&&(n=toUtf8Bytes(n)),keccak256(concat([toUtf8Bytes("\x19Ethereum Signed Message:\n"),toUtf8Bytes(String(n.length)),n])));return function(e){if(assertArgument("string"==typeof e,"invalid address","address",e),e.match(/^(0x)?[0-9a-fA-F]{40}$/)){e.startsWith("0x")||(e="0x"+e);let t=getChecksumAddress(e);return assertArgument(!e.match(/([A-F].*[a-f])|([a-f].*[A-F])/)||t===e,"bad address checksum","address",e),t}if(e.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)){assertArgument(e.substring(2,4)===function(e){let t=(e=(e=e.toUpperCase()).substring(4)+e.substring(0,2)+"00").split("").map(e=>g[e]).join("");for(;t.length>=15;){let e=t.substring(0,15);t=parseInt(e,10)%97+t.substring(e.length)}let n=String(98-parseInt(t,10)%97);for(;n.length<2;)n="0"+n;return n}(e),"bad icap checksum","address",e);let t=(function(e){e=e.toLowerCase();let t=m;for(let n=0;n{let e=v.some(e=>n&&(null==e?void 0:e.toLowerCase())===(null==n?void 0:n.toLowerCase()));f(e)},[n,v,c]),(0,o.jsx)(ee.Provider,{value:{admin:p,setAdmin:f,allAdmins:v,setAllAdmins:w,expiryTimestamp:C,setExpiryTimestamp:E,generateSignature:()=>{let e=Date.now()+432e5;u({message:e.toString()}),E(e)},signature:x,setSignature:A,validTimestamp:k,setValidTimestamp:B,networks:S,setNetworks:I},children:t})},useAdminContext=()=>{let e=(0,i.useContext)(ee);if(void 0===e)throw Error("AdminContext must be used within an AdminProvider");return e}},38492:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return App}});var o=n(85893);n(32352);var i=n(59581);n(56953);var s=n(89192),l=n(99931),c=n(24139),u=n(56888),d=n(27037),p=n(7506),f=class extends p.l{constructor(e={}){super(),this.config=e,this.#o=new Map}#o;build(e,t,n){let o=t.queryKey,i=t.queryHash??(0,c.Rm)(o,t),s=this.get(i);return s||(s=new u.A({cache:this,queryKey:o,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(o)}),this.add(s)),s}add(e){this.#o.has(e.queryHash)||(this.#o.set(e.queryHash,e),this.notify({type:"added",query:e}))}remove(e){let t=this.#o.get(e.queryHash);t&&(e.destroy(),t===e&&this.#o.delete(e.queryHash),this.notify({type:"removed",query:e}))}clear(){d.V.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#o.get(e)}getAll(){return[...this.#o.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>(0,c._x)(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>(0,c._x)(e,t)):t}notify(e){d.V.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){d.V.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){d.V.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},m=n(59289),b=class extends p.l{constructor(e={}){super(),this.config=e,this.#i=[],this.#s=0}#i;#s;#l;build(e,t,n){let o=new m.m({mutationCache:this,mutationId:++this.#s,options:e.defaultMutationOptions(t),state:n});return this.add(o),o}add(e){this.#i.push(e),this.notify({type:"added",mutation:e})}remove(e){this.#i=this.#i.filter(t=>t!==e),this.notify({type:"removed",mutation:e})}clear(){d.V.batch(()=>{this.#i.forEach(e=>{this.remove(e)})})}getAll(){return this.#i}find(e){let t={exact:!0,...e};return this.#i.find(e=>(0,c.X7)(t,e))}findAll(e={}){return this.#i.filter(t=>(0,c.X7)(e,t))}notify(e){d.V.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){return this.#l=(this.#l??Promise.resolve()).then(()=>{let e=this.#i.filter(e=>e.state.isPaused);return d.V.batch(()=>e.reduce((e,t)=>e.then(()=>t.continue().catch(c.ZT)),Promise.resolve()))}).then(()=>{this.#l=void 0}),this.#l}},g=n(66474),y=n(14304);function getNextPageParam(e,{pages:t,pageParams:n}){let o=t.length-1;return e.getNextPageParam(t[o],t,n[o],n)}function getPreviousPageParam(e,{pages:t,pageParams:n}){return e.getPreviousPageParam?.(t[0],t,n[0],n)}var v=class{#c;#u;#d;#p;#h;#f;#m;#b;constructor(e={}){this.#c=e.queryCache||new f,this.#u=e.mutationCache||new b,this.#d=e.defaultOptions||{},this.#p=new Map,this.#h=new Map,this.#f=0}mount(){this.#f++,1===this.#f&&(this.#m=g.j.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#c.onFocus())}),this.#b=y.N.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#c.onOnline())}))}unmount(){this.#f--,0===this.#f&&(this.#m?.(),this.#m=void 0,this.#b?.(),this.#b=void 0)}isFetching(e){return this.#c.findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return this.#u.findAll({...e,status:"pending"}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#c.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.getQueryData(e.queryKey);if(void 0===t)return this.fetchQuery(e);{let n=this.defaultQueryOptions(e),o=this.#c.build(this,n);return e.revalidateIfStale&&o.isStaleByTime(n.staleTime)&&this.prefetchQuery(n),Promise.resolve(t)}}getQueriesData(e){return this.getQueryCache().findAll(e).map(({queryKey:e,state:t})=>{let n=t.data;return[e,n]})}setQueryData(e,t,n){let o=this.defaultQueryOptions({queryKey:e}),i=this.#c.get(o.queryHash),s=i?.state.data,l=(0,c.SE)(t,s);if(void 0!==l)return this.#c.build(this,o).setData(l,{...n,manual:!0})}setQueriesData(e,t,n){return d.V.batch(()=>this.getQueryCache().findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#c.get(t.queryHash)?.state}removeQueries(e){let t=this.#c;d.V.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#c,o={type:"active",...e};return d.V.batch(()=>(n.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries(o,t)))}cancelQueries(e={},t={}){let n={revert:!0,...t},o=d.V.batch(()=>this.#c.findAll(e).map(e=>e.cancel(n)));return Promise.all(o).then(c.ZT).catch(c.ZT)}invalidateQueries(e={},t={}){return d.V.batch(()=>{if(this.#c.findAll(e).forEach(e=>{e.invalidate()}),"none"===e.refetchType)return Promise.resolve();let n={...e,type:e.refetchType??e.type??"active"};return this.refetchQueries(n,t)})}refetchQueries(e={},t){let n={...t,cancelRefetch:t?.cancelRefetch??!0},o=d.V.batch(()=>this.#c.findAll(e).filter(e=>!e.isDisabled()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(c.ZT)),"paused"===e.state.fetchStatus?Promise.resolve():t}));return Promise.all(o).then(c.ZT)}fetchQuery(e){let t=this.defaultQueryOptions(e);void 0===t.retry&&(t.retry=!1);let n=this.#c.build(this,t);return n.isStaleByTime(t.staleTime)?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(c.ZT).catch(c.ZT)}fetchInfiniteQuery(e){var t;return e.behavior=(t=e.pages,{onFetch:(e,n)=>{let fetchFn=async()=>{let n;let o=e.options,i=e.fetchOptions?.meta?.fetchMore?.direction,s=e.state.data?.pages||[],l=e.state.data?.pageParams||[],u=!1,addSignalProperty=t=>{Object.defineProperty(t,"signal",{enumerable:!0,get:()=>(e.signal.aborted?u=!0:e.signal.addEventListener("abort",()=>{u=!0}),e.signal)})},d=e.options.queryFn&&e.options.queryFn!==c.CN?e.options.queryFn:()=>Promise.reject(Error(`Missing queryFn: '${e.options.queryHash}'`)),fetchPage=async(t,n,o)=>{if(u)return Promise.reject();if(null==n&&t.pages.length)return Promise.resolve(t);let i={queryKey:e.queryKey,pageParam:n,direction:o?"backward":"forward",meta:e.options.meta};addSignalProperty(i);let s=await d(i),{maxPages:l}=e.options,p=o?c.Ht:c.VX;return{pages:p(t.pages,s,l),pageParams:p(t.pageParams,n,l)}};if(i&&s.length){let e="backward"===i,t=e?getPreviousPageParam:getNextPageParam,c={pages:s,pageParams:l},u=t(o,c);n=await fetchPage(c,u,e)}else{n=await fetchPage({pages:[],pageParams:[]},l[0]??o.initialPageParam);let e=t??s.length;for(let t=1;te.options.persister?.(fetchFn,{queryKey:e.queryKey,meta:e.options.meta,signal:e.signal},n):e.fetchFn=fetchFn}}),this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(c.ZT).catch(c.ZT)}resumePausedMutations(){return y.N.isOnline()?this.#u.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#c}getMutationCache(){return this.#u}getDefaultOptions(){return this.#d}setDefaultOptions(e){this.#d=e}setQueryDefaults(e,t){this.#p.set((0,c.Ym)(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#p.values()],n={};return t.forEach(t=>{(0,c.to)(e,t.queryKey)&&(n={...n,...t.defaultOptions})}),n}setMutationDefaults(e,t){this.#h.set((0,c.Ym)(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#h.values()],n={};return t.forEach(t=>{(0,c.to)(e,t.mutationKey)&&(n={...n,...t.defaultOptions})}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#d.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=(0,c.Rm)(t.queryKey,t)),void 0===t.refetchOnReconnect&&(t.refetchOnReconnect="always"!==t.networkMode),void 0===t.throwOnError&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),!0!==t.enabled&&t.queryFn===c.CN&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#d.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#c.clear(),this.#u.clear()}},w=n(30202),C=n(86164);let E=(0,C.a)({id:31337,name:"Hardhat",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["http://127.0.0.1:8545"]}}});var x=n(66403);let A=(0,C.a)({id:5,name:"Goerli",nativeCurrency:{name:"Goerli Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.ankr.com/eth_goerli"]}},blockExplorers:{default:{name:"Etherscan",url:"https://goerli.etherscan.io",apiUrl:"https://api-goerli.etherscan.io/api"}},contracts:{ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},ensUniversalResolver:{address:"0xfc4AC75C46C914aF5892d6d3eFFcebD7917293F1",blockCreated:10339206},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:6507670}},testnet:!0});var k=n(95946),B=n(43310),S=n(6073),I=n(30866);let j={block:(0,B.G)({format(e){let t=e.transactions?.map(e=>{if("string"==typeof e)return e;let t=S.Tr(e);return"0x7e"===t.typeHex&&(t.isSystemTx=e.isSystemTx,t.mint=e.mint?k.y_(e.mint):void 0,t.sourceHash=e.sourceHash,t.type="deposit"),t});return{transactions:t,stateRoot:e.stateRoot}}}),transaction:(0,S.y_)({format(e){let t={};return"0x7e"===e.type&&(t.isSystemTx=e.isSystemTx,t.mint=e.mint?(0,k.y_)(e.mint):void 0,t.sourceHash=e.sourceHash,t.type="deposit"),t}}),transactionReceipt:(0,I.d)({format:e=>({l1GasPrice:e.l1GasPrice?(0,k.y_)(e.l1GasPrice):null,l1GasUsed:e.l1GasUsed?(0,k.y_)(e.l1GasUsed):null,l1Fee:e.l1Fee?(0,k.y_)(e.l1Fee):null,l1FeeScalar:e.l1FeeScalar?Number(e.l1FeeScalar):null})})};var T=n(26087),P=n(60480),M=n(57040),O=n(92106),R=n(62027),U=n(11221),F=n(11187);function toRlp(e,t="hex"){let n=function getEncodable(e){return Array.isArray(e)?function(e){let t=e.reduce((e,t)=>e+t.length,0),n=getSizeOfLength(t),o=t<=55?1+t:1+n+t;return{length:o,encode(o){for(let{encode:i}of(t<=55?o.pushByte(192+t):(o.pushByte(247+n),1===n?o.pushUint8(t):2===n?o.pushUint16(t):3===n?o.pushUint24(t):o.pushUint32(t)),e))i(o)}}}(e.map(e=>getEncodable(e))):function(e){let t="string"==typeof e?(0,F.nr)(e):e,n=getSizeOfLength(t.length),o=1===t.length&&t[0]<128?1:t.length<=55?1+t.length:1+n+t.length;return{length:o,encode(e){1===t.length&&t[0]<128||(t.length<=55?e.pushByte(128+t.length):(e.pushByte(183+n),1===n?e.pushUint8(t.length):2===n?e.pushUint16(t.length):3===n?e.pushUint24(t.length):e.pushUint32(t.length))),e.pushBytes(t)}}}(e)}(e),o=(0,U.q)(new Uint8Array(n.length));return(n.encode(o),"hex"===t)?(0,O.ci)(o.bytes):o.bytes}function getSizeOfLength(e){if(e<256)return 1;if(e<65536)return 2;if(e<16777216)return 3;if(e<4294967296)return 4;throw new R.G("Length is too large.")}var N=n(33639);function blobsToCommitments(e){let{kzg:t}=e,n=e.to??("string"==typeof e.blobs[0]?"hex":"bytes"),o="string"==typeof e.blobs[0]?e.blobs.map(e=>(0,F.nr)(e)):e.blobs,i=[];for(let e of o)i.push(Uint8Array.from(t.blobToKzgCommitment(e)));return"bytes"===n?i:i.map(e=>(0,O.ci)(e))}function blobsToProofs(e){let{kzg:t}=e,n=e.to??("string"==typeof e.blobs[0]?"hex":"bytes"),o="string"==typeof e.blobs[0]?e.blobs.map(e=>(0,F.nr)(e)):e.blobs,i="string"==typeof e.commitments[0]?e.commitments.map(e=>(0,F.nr)(e)):e.commitments,s=[];for(let e=0;e(0,O.ci)(e))}var D=n(11606),_=n(15102);let BlobSizeTooLargeError=class BlobSizeTooLargeError extends R.G{constructor({maxSize:e,size:t}){super("Blob size is too large.",{metaMessages:[`Max: ${e} bytes`,`Given: ${t} bytes`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"BlobSizeTooLargeError"})}};let EmptyBlobError=class EmptyBlobError extends R.G{constructor(){super("Blob data must not be empty."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EmptyBlobError"})}};let InvalidVersionedHashSizeError=class InvalidVersionedHashSizeError extends R.G{constructor({hash:e,size:t}){super(`Versioned hash "${e}" size is invalid.`,{metaMessages:["Expected: 32",`Received: ${t}`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidVersionedHashSizeError"})}};let InvalidVersionedHashVersionError=class InvalidVersionedHashVersionError extends R.G{constructor({hash:e,version:t}){super(`Versioned hash "${e}" version is invalid.`,{metaMessages:["Expected: 1",`Received: ${t}`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidVersionedHashVersionError"})}};var L=n(39135),z=n(61836),q=n(80377),G=n(26445),W=n(3972);function assertTransactionEIP1559(e){let{chainId:t,maxPriorityFeePerGas:n,maxFeePerGas:o,to:i}=e;if(t<=0)throw new q.hJ({chainId:t});if(i&&!(0,P.U)(i))throw new T.b({address:i});if(o&&o>2n**256n-1n)throw new G.Hh({maxFeePerGas:o});if(n&&o&&n>o)throw new G.cs({maxFeePerGas:o,maxPriorityFeePerGas:n})}var H=n(82994);function serializeAccessList(e){if(!e||0===e.length)return[];let t=[];for(let n=0;n2n**256n-1n)throw new G.Hh({maxFeePerGas:o})}(e);let p=serializeAccessList(u),f=[(0,O.NC)(n),s?(0,O.NC)(s):"0x",d?(0,O.NC)(d):"0x",o?(0,O.NC)(o):"0x",l??"0x",c?(0,O.NC)(c):"0x",i??"0x",p,...toYParitySignatureArray(e,t)];return(0,M.SM)(["0x01",toRlp(f)])}(e,t):"eip4844"===n?function(e,t){let{chainId:n,gas:o,nonce:i,to:s,value:l,maxFeePerBlobGas:c,maxFeePerGas:u,maxPriorityFeePerGas:d,accessList:p,data:f}=e;!function(e){let{blobVersionedHashes:t}=e;if(t){if(0===t.length)throw new EmptyBlobError;for(let e of t){let t=(0,L.d)(e),n=(0,k.ly)((0,W.tP)(e,0,1));if(32!==t)throw new InvalidVersionedHashSizeError({hash:e,size:t});if(1!==n)throw new InvalidVersionedHashVersionError({hash:e,version:n})}}assertTransactionEIP1559(e)}(e);let m=e.blobVersionedHashes,b=e.sidecars;if(e.blobs){let t="string"==typeof e.blobs[0]?e.blobs:e.blobs.map(e=>(0,O.ci)(e)),n=e.kzg,o=blobsToCommitments({blobs:t,kzg:n}),i=blobsToProofs({blobs:t,commitments:o,kzg:n});m=function(e){let{commitments:t,version:n}=e,o=e.to??("string"==typeof t[0]?"hex":"bytes"),i=[];for(let e of t)i.push(function(e){let{commitment:t,version:n=1}=e,o=e.to??("string"==typeof t?"hex":"bytes"),i=function(e,t){let n=(0,D.J)((0,_.v)(e,{strict:!1})?(0,F.O0)(e):e);return"bytes"===(t||"hex")?n:(0,O.NC)(n)}(t,"bytes");return i.set([n],0),"bytes"===o?i:(0,O.ci)(i)}({commitment:e,to:o,version:n}));return i}({commitments:o}),!1!==b&&(b=function(e){let{data:t,kzg:n,to:o}=e,i=e.blobs??function(e){let t=e.to??("string"==typeof e.data?"hex":"bytes"),n="string"==typeof e.data?(0,F.nr)(e.data):e.data,o=(0,L.d)(n);if(!o)throw new EmptyBlobError;if(o>253951)throw new BlobSizeTooLargeError({maxSize:253951,size:o});let i=[],s=!0,l=0;for(;s;){let e=(0,U.q)(new Uint8Array(131072)),t=0;for(;t<4096;){let o=n.slice(l,l+31);if(e.pushByte(0),e.pushBytes(o),o.length<31){e.pushByte(128),s=!1;break}t++,l+=31}i.push(e)}return"bytes"===t?i.map(e=>e.bytes):i.map(e=>(0,O.ci)(e.bytes))}({data:t,to:o}),s=e.commitments??blobsToCommitments({blobs:i,kzg:n,to:o}),l=e.proofs??blobsToProofs({blobs:i,commitments:s,kzg:n,to:o}),c=[];for(let e=0;e2n**256n-1n)throw new G.Hh({maxFeePerGas:o});if(l)throw new R.G("`accessList` is not a valid Legacy Transaction attribute.")}(e);let d=[s?(0,O.NC)(s):"0x",u?(0,O.NC)(u):"0x",o?(0,O.NC)(o):"0x",l??"0x",c?(0,O.NC)(c):"0x",i??"0x"];if(t){let e=(()=>{if(t.v>=35n){let e=(t.v-35n)/2n;return e>0?t.v:27n+(35n===t.v?0n:1n)}if(n>0)return BigInt(2*n)+BigInt(35n+t.v-27n);let e=27n+(27n===t.v?0n:1n);if(t.v!==e)throw new N.vl({v:t.v});return e})();d=[...d,(0,O.NC)(e),t.r,t.s]}else n>0&&(d=[...d,(0,O.NC)(n),"0x","0x"]);return toRlp(d)}(e,t)}function toYParitySignatureArray(e,t){let{r:n,s:o,v:i,yParity:s}=t??e;if(void 0===n||void 0===o||void 0===i&&void 0===s)return[];let l="number"==typeof s?s?(0,O.NC)(1):"0x":0n===i?"0x":1n===i?(0,O.NC)(1):27n===i?"0x":(0,O.NC)(1);return[l,(0,z.f)(n),(0,z.f)(o)]}let Q={contracts:{gasPriceOracle:{address:"0x420000000000000000000000000000000000000F"},l1Block:{address:"0x4200000000000000000000000000000000000015"},l2CrossDomainMessenger:{address:"0x4200000000000000000000000000000000000007"},l2Erc721Bridge:{address:"0x4200000000000000000000000000000000000014"},l2StandardBridge:{address:"0x4200000000000000000000000000000000000010"},l2ToL1MessagePasser:{address:"0x4200000000000000000000000000000000000016"}},formatters:j,serializers:{transaction:function(e,t){return"deposit"===e.type||void 0!==e.sourceHash?function(e){!function(e){let{from:t,to:n}=e;if(t&&!(0,P.U)(t))throw new T.b({address:t});if(n&&!(0,P.U)(n))throw new T.b({address:n})}(e);let{sourceHash:t,data:n,from:o,gas:i,isSystemTx:s,mint:l,to:c,value:u}=e,d=[t,o,c??"0x",l?(0,O.NC)(l):"0x",u?(0,O.NC)(u):"0x",i?(0,O.NC)(i):"0x",s?"0x1":"0x",n??"0x"];return(0,M.SM)(["0x7e",toRlp(d)])}(e):serializeTransaction(e,t)}}},K=(0,C.a)({...Q,id:10,name:"OP Mainnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.optimism.io"]}},blockExplorers:{default:{name:"Optimism Explorer",url:"https://optimistic.etherscan.io",apiUrl:"https://api-optimistic.etherscan.io/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0xdfe97868233d1aa22e815a266982f2cf17685a27"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:4286263},portal:{1:{address:"0xbEb5Fc579115071764c7423A4f12eDde41f106Ed"}},l1StandardBridge:{1:{address:"0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1"}}},sourceId:1}),V=(0,C.a)({id:14,name:"Flare Mainnet",nativeCurrency:{decimals:18,name:"flare",symbol:"FLR"},rpcUrls:{default:{http:["https://flare-api.flare.network/ext/C/rpc"]}},blockExplorers:{default:{name:"Flare Explorer",url:"https://flare-explorer.flare.network",apiUrl:"https://flare-explorer.flare.network/api"}}}),Z=(0,C.a)({id:16,name:"Coston",nativeCurrency:{decimals:18,name:"costonflare",symbol:"CFLR"},rpcUrls:{default:{http:["https://coston-api.flare.network/ext/C/rpc"]}},blockExplorers:{default:{name:"Coston Explorer",url:"https://coston-explorer.flare.network",apiUrl:"https://coston-explorer.flare.network/api"}},testnet:!0}),J=(0,C.a)({id:19,name:"Songbird Mainnet",nativeCurrency:{decimals:18,name:"songbird",symbol:"SGB"},rpcUrls:{default:{http:["https://songbird-api.flare.network/ext/C/rpc"]}},blockExplorers:{default:{name:"Songbird Explorer",url:"https://songbird-explorer.flare.network",apiUrl:"https://songbird-explorer.flare.network/api"}}}),X=(0,C.a)({id:25,name:"Cronos Mainnet",nativeCurrency:{decimals:18,name:"Cronos",symbol:"CRO"},rpcUrls:{default:{http:["https://evm.cronos.org"]}},blockExplorers:{default:{name:"Cronos Explorer",url:"https://explorer.cronos.org",apiUrl:"https://explorer-api.cronos.org/mainnet/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:1963112}}}),Y=(0,C.a)({id:30,name:"Rootstock Mainnet",network:"rootstock",nativeCurrency:{decimals:18,name:"Rootstock Bitcoin",symbol:"RBTC"},rpcUrls:{default:{http:["https://public-node.rsk.co"]}},blockExplorers:{default:{name:"RSK Explorer",url:"https://explorer.rsk.co"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:4249540}}}),$=(0,C.a)({id:40,name:"Telos",nativeCurrency:{decimals:18,name:"Telos",symbol:"TLOS"},rpcUrls:{default:{http:["https://mainnet.telos.net/evm"]}},blockExplorers:{default:{name:"Teloscan",url:"https://www.teloscan.io/"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:246530709}}}),ee=(0,C.a)({id:41,name:"Telos",nativeCurrency:{decimals:18,name:"Telos",symbol:"TLOS"},rpcUrls:{default:{http:["https://testnet.telos.net/evm"]}},blockExplorers:{default:{name:"Teloscan (testnet)",url:"https://testnet.teloscan.io/"}},testnet:!0}),et=(0,C.a)({id:42,network:"lukso",name:"LUKSO",nativeCurrency:{name:"LUKSO",symbol:"LYX",decimals:18},rpcUrls:{default:{http:["https://rpc.mainnet.lukso.network"],webSocket:["wss://ws-rpc.mainnet.lukso.network"]}},blockExplorers:{default:{name:"LUKSO Mainnet Explorer",url:"https://explorer.execution.mainnet.lukso.network",apiUrl:"https://api.explorer.execution.mainnet.lukso.network/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:468183}}}),er=(0,C.a)({id:50,name:"XinFin Network",nativeCurrency:{decimals:18,name:"XDC",symbol:"XDC"},rpcUrls:{default:{http:["https://rpc.xinfin.network"]}},blockExplorers:{xinfin:{name:"XinFin",url:"https://explorer.xinfin.network"},default:{name:"Blocksscan",url:"https://xdc.blocksscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:71542788}}}),en=(0,C.a)({id:51,name:"Apothem Network",nativeCurrency:{decimals:18,name:"TXDC",symbol:"TXDC"},rpcUrls:{default:{http:["https://erpc.apothem.network"]}},blockExplorers:{default:{name:"Blocksscan",url:"https://apothem.blocksscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:59765389}}}),ea=(0,C.a)({id:56,name:"BNB Smart Chain",nativeCurrency:{decimals:18,name:"BNB",symbol:"BNB"},rpcUrls:{default:{http:["https://rpc.ankr.com/bsc"]}},blockExplorers:{default:{name:"BscScan",url:"https://bscscan.com",apiUrl:"https://api.bscscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:15921452}}}),eo=(0,C.a)({id:57,name:"Syscoin Mainnet",nativeCurrency:{decimals:18,name:"Syscoin",symbol:"SYS"},rpcUrls:{default:{http:["https://rpc.syscoin.org"],webSocket:["wss://rpc.syscoin.org/wss"]}},blockExplorers:{default:{name:"SyscoinExplorer",url:"https://explorer.syscoin.org",apiUrl:"https://explorer.syscoin.org/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:287139}}}),ei=(0,C.a)({id:61,name:"Ethereum Classic",nativeCurrency:{decimals:18,name:"ETC",symbol:"ETC"},rpcUrls:{default:{http:["https://etc.rivet.link"]}},blockExplorers:{default:{name:"Blockscout",url:"https://blockscout.com/etc/mainnet"}}}),es=(0,C.a)({id:66,name:"OKC",nativeCurrency:{decimals:18,name:"OKT",symbol:"OKT"},rpcUrls:{default:{http:["https://exchainrpc.okex.org"]}},blockExplorers:{default:{name:"oklink",url:"https://www.oklink.com/okc"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:10364792}}}),el=(0,C.a)({id:71,name:"Conflux eSpace Testnet",network:"cfx-espace-testnet",testnet:!0,nativeCurrency:{name:"Conflux",symbol:"CFX",decimals:18},rpcUrls:{default:{http:["https://evmtestnet.confluxrpc.org"],webSocket:["wss://evmtestnet.confluxrpc.org/ws"]}},blockExplorers:{default:{name:"ConfluxScan",url:"https://evmtestnet.confluxscan.io"}},contracts:{multicall3:{address:"0xEFf0078910f638cd81996cc117bccD3eDf2B072F",blockCreated:117499050}}}),ec=(0,C.a)({id:82,name:"Meter",nativeCurrency:{decimals:18,name:"MTR",symbol:"MTR"},rpcUrls:{default:{http:["https://rpc.meter.io"]}},blockExplorers:{default:{name:"MeterScan",url:"https://scan.meter.io"}}}),eu=(0,C.a)({id:83,name:"Meter Testnet",nativeCurrency:{decimals:18,name:"MTR",symbol:"MTR"},rpcUrls:{default:{http:["https://rpctest.meter.io"]}},blockExplorers:{default:{name:"MeterTestnetScan",url:"https://scan-warringstakes.meter.io"}}}),ed=(0,C.a)({id:97,name:"Binance Smart Chain Testnet",nativeCurrency:{decimals:18,name:"BNB",symbol:"tBNB"},rpcUrls:{default:{http:["https://data-seed-prebsc-1-s1.bnbchain.org:8545"]}},blockExplorers:{default:{name:"BscScan",url:"https://testnet.bscscan.com",apiUrl:"https://testnet.bscscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:17422483}},testnet:!0}),ep=(0,C.a)({id:100,name:"Gnosis",nativeCurrency:{decimals:18,name:"Gnosis",symbol:"xDAI"},rpcUrls:{default:{http:["https://rpc.gnosischain.com"],webSocket:["wss://rpc.gnosischain.com/wss"]}},blockExplorers:{default:{name:"Gnosisscan",url:"https://gnosisscan.io",apiUrl:"https://api.gnosisscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:21022491}}}),eh=(0,C.a)({id:109,name:"Shibarium",network:"shibarium",nativeCurrency:{name:"Bone",symbol:"BONE",decimals:18},rpcUrls:{default:{http:["https://rpc.shibrpc.com"]}},blockExplorers:{default:{name:"Blockscout",url:"https://shibariumscan.io"}},contracts:{multicall3:{address:"0x864Bf681ADD6052395188A89101A1B37d3B4C961",blockCreated:265900}}}),ef=(0,C.a)({id:114,name:"Coston2",nativeCurrency:{decimals:18,name:"coston2flare",symbol:"C2FLR"},rpcUrls:{default:{http:["https://coston2-api.flare.network/ext/C/rpc"]}},blockExplorers:{default:{name:"Coston2 Explorer",url:"https://coston2-explorer.flare.network",apiUrl:"https://coston2-explorer.flare.network/api"}},testnet:!0}),em=(0,C.a)({id:122,name:"Fuse",nativeCurrency:{name:"Fuse",symbol:"FUSE",decimals:18},rpcUrls:{default:{http:["https://rpc.fuse.io"]}},blockExplorers:{default:{name:"Fuse Explorer",url:"https://explorer.fuse.io",apiUrl:"https://explorer.fuse.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:16146628}}}),eb=(0,C.a)({id:123,name:"Fuse Sparknet",nativeCurrency:{name:"Spark",symbol:"SPARK",decimals:18},rpcUrls:{default:{http:["https://rpc.fusespark.io"]}},blockExplorers:{default:{name:"Sparkent Explorer",url:"https://explorer.fusespark.io",apiUrl:"https://explorer.fusespark.io/api"}}}),eg=(0,C.a)({id:137,name:"Polygon",nativeCurrency:{name:"MATIC",symbol:"MATIC",decimals:18},rpcUrls:{default:{http:["https://polygon-rpc.com"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://polygonscan.com",apiUrl:"https://api.polygonscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:25770160}}}),ey=(0,C.a)({id:148,name:"Shimmer",network:"shimmer",nativeCurrency:{decimals:18,name:"Shimmer",symbol:"SMR"},rpcUrls:{default:{http:["https://json-rpc.evm.shimmer.network"]}},blockExplorers:{default:{name:"Shimmer Network Explorer",url:"https://explorer.evm.shimmer.network",apiUrl:"https://explorer.evm.shimmer.network/api"}}}),ev=(0,C.a)({id:169,name:"Manta Pacific Mainnet",network:"manta",nativeCurrency:{decimals:18,name:"ETH",symbol:"ETH"},rpcUrls:{default:{http:["https://pacific-rpc.manta.network/http"]}},blockExplorers:{default:{name:"Manta Explorer",url:"https://pacific-explorer.manta.network",apiUrl:"https://pacific-explorer.manta.network/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:332890}}}),ew=(0,C.a)({id:195,name:"X1 Testnet",nativeCurrency:{decimals:18,name:"OKB",symbol:"OKB"},rpcUrls:{default:{http:["https://x1testrpc.okx.com"]}},blockExplorers:{default:{name:"OKLink",url:"https://www.oklink.com/x1-test"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:624344}},testnet:!0}),eC=(0,C.a)({id:199,name:"BitTorrent",network:"bittorrent-chain-mainnet",nativeCurrency:{name:"BitTorrent",symbol:"BTT",decimals:18},rpcUrls:{default:{http:["https://rpc.bittorrentchain.io"]},public:{http:["https://rpc.bittorrentchain.io"]}},blockExplorers:{default:{name:"Bttcscan",url:"https://bttcscan.com",apiUrl:"https://api.bttcscan.com/api"}}}),eE=(0,C.a)({id:204,name:"opBNB",nativeCurrency:{name:"BNB",symbol:"BNB",decimals:18},rpcUrls:{default:{http:["https://opbnb-mainnet-rpc.bnbchain.org"]}},blockExplorers:{default:{name:"opbnbscan",url:"https://mainnet.opbnbscan.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:512881}}}),ex=(0,C.a)({id:240,name:"Nexilix Smart Chain",nativeCurrency:{decimals:18,name:"Nexilix",symbol:"NEXILIX"},rpcUrls:{default:{http:["https://rpcurl.pos.nexilix.com"]}},blockExplorers:{default:{name:"NexilixScan",url:"https://scan.nexilix.com"}},contracts:{multicall3:{address:"0x58381c8e2BF9d0C2C4259cA14BdA9Afe02831244",blockCreated:74448}}}),eA=(0,C.a)({id:242,name:"Plinga",nativeCurrency:{name:"Plinga",symbol:"PLINGA",decimals:18},rpcUrls:{default:{http:["https://rpcurl.mainnet.plgchain.com"]}},blockExplorers:{default:{name:"Plgscan",url:"https://www.plgscan.com"}},contracts:{multicall3:{address:"0x0989576160f2e7092908BB9479631b901060b6e4",blockCreated:204489}}}),ek=(0,C.a)({id:248,name:"Oasys",nativeCurrency:{name:"Oasys",symbol:"OAS",decimals:18},rpcUrls:{default:{http:["https://rpc.mainnet.oasys.games"]}},blockExplorers:{default:{name:"OasysScan",url:"https://scan.oasys.games",apiUrl:"https://scan.oasys.games/api"}}}),eB=(0,C.a)({id:250,name:"Fantom",nativeCurrency:{decimals:18,name:"Fantom",symbol:"FTM"},rpcUrls:{default:{http:["https://rpc.ankr.com/fantom"]}},blockExplorers:{default:{name:"FTMScan",url:"https://ftmscan.com",apiUrl:"https://api.ftmscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:33001987}}}),eS=(0,C.a)({...Q,id:252,name:"Fraxtal",nativeCurrency:{name:"Frax Ether",symbol:"frxETH",decimals:18},rpcUrls:{default:{http:["https://rpc.frax.com"]}},blockExplorers:{default:{name:"fraxscan",url:"https://fraxscan.com",apiUrl:"https://api.fraxscan.com/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0x66CC916Ed5C6C2FA97014f7D1cD141528Ae171e4"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11"},portal:{1:{address:"0x36cb65c1967A0Fb0EEE11569C51C2f2aA1Ca6f6D",blockCreated:19135323}},l1StandardBridge:{1:{address:"0x34C0bD5877A5Ee7099D0f5688D65F4bB9158BDE2",blockCreated:19135323}}},sourceId:1}),eI=(0,C.a)({id:255,name:"Kroma",nativeCurrency:{name:"ETH",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://api.kroma.network"]}},blockExplorers:{default:{name:"Kroma Explorer",url:"https://blockscout.kroma.network",apiUrl:"https://blockscout.kroma.network/api"}},testnet:!1}),ej=(0,C.a)({id:260,name:"zkSync InMemory Node",network:"zksync-in-memory-node",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["http://localhost:8011"]}},testnet:!0}),eT=(0,C.a)({id:270,name:"zkSync CLI Local Node",network:"zksync-cli-local-node",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["http://localhost:3050"]}},testnet:!0}),eP=(0,C.a)({id:288,name:"Boba Network",nativeCurrency:{decimals:18,name:"Boba",symbol:"BOBA"},rpcUrls:{default:{http:["https://mainnet.boba.network"]}},blockExplorers:{default:{name:"BOBAScan",url:"https://bobascan.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:446859}}}),eM=(0,C.a)({id:295,name:"Hedera Mainnet",network:"hedera-mainnet",nativeCurrency:{symbol:"HBAR",name:"HBAR",decimals:18},rpcUrls:{default:{http:["https://mainnet.hashio.io/api"]}},blockExplorers:{default:{name:"Hashscan",url:"https://hashscan.io/mainnet"}},testnet:!1}),eO=(0,C.a)({id:296,name:"Hedera Testnet",network:"hedera-testnet",nativeCurrency:{symbol:"HBAR",name:"HBAR",decimals:18},rpcUrls:{default:{http:["https://testnet.hashio.io/api"]}},blockExplorers:{default:{name:"Hashscan",url:"https://hashscan.io/testnet"}},testnet:!0}),eR=(0,C.a)({id:297,name:"Hedera Previewnet",network:"hedera-previewnet",nativeCurrency:{symbol:"HBAR",name:"HBAR",decimals:18},rpcUrls:{default:{http:["https://previewnet.hashio.io/api"]}},blockExplorers:{default:{name:"Hashscan",url:"https://hashscan.io/previewnet"}},testnet:!0});var eU=n(53992),eF=n(74688);let eN={block:(0,B.G)({format(e){let t=e.transactions?.map(e=>{if("string"==typeof e)return e;let t=eN.transaction?.format(e);return"0x71"===t.typeHex?t.type="eip712":"0xff"===t.typeHex&&(t.type="priority"),t});return{l1BatchNumber:e.l1BatchNumber?(0,k.y_)(e.l1BatchNumber):null,l1BatchTimestamp:e.l1BatchTimestamp?(0,k.y_)(e.l1BatchTimestamp):null,transactions:t}}}),transaction:(0,S.y_)({format(e){let t={};return"0x71"===e.type?t.type="eip712":"0xff"===e.type&&(t.type="priority"),{...t,l1BatchNumber:e.l1BatchNumber?(0,k.y_)(e.l1BatchNumber):null,l1BatchTxIndex:e.l1BatchTxIndex?(0,k.y_)(e.l1BatchTxIndex):null}}}),transactionReceipt:(0,I.d)({format:e=>({l1BatchNumber:e.l1BatchNumber?(0,k.y_)(e.l1BatchNumber):null,l1BatchTxIndex:e.l1BatchTxIndex?(0,k.y_)(e.l1BatchTxIndex):null,logs:e.logs.map(e=>({...(0,eU.U)(e),l1BatchNumber:e.l1BatchNumber?(0,k.y_)(e.l1BatchNumber):null,transactionLogIndex:(0,k.ly)(e.transactionLogIndex),logType:e.logType})),l2ToL1Logs:e.l2ToL1Logs.map(e=>({blockNumber:(0,k.y_)(e.blockHash),blockHash:e.blockHash,l1BatchNumber:(0,k.y_)(e.l1BatchNumber),transactionIndex:(0,k.y_)(e.transactionIndex),shardId:(0,k.y_)(e.shardId),isService:e.isService,sender:e.sender,key:e.key,value:e.value,transactionHash:e.transactionHash,logIndex:(0,k.y_)(e.logIndex)}))})}),transactionRequest:(0,eF.iy)({exclude:["customSignature","factoryDeps","gasPerPubdata","paymaster","paymasterInput"],format:e=>e.gasPerPubdata||e.paymaster&&e.paymasterInput||e.factoryDeps||e.customSignature?{eip712Meta:{...e.gasPerPubdata?{gasPerPubdata:(0,O.NC)(e.gasPerPubdata)}:{},...e.paymaster&&e.paymasterInput?{paymasterParams:{paymaster:e.paymaster,paymasterInput:Array.from((0,F.nr)(e.paymasterInput))}}:{},...e.factoryDeps?{factoryDeps:e.factoryDeps}:{},...e.customSignature?{customSignature:Array.from((0,F.nr)(e.customSignature))}:{}},type:"0x71"}:{}})};let InvalidEip712TransactionError=class InvalidEip712TransactionError extends R.G{constructor(){super('Transaction is not an EIP712 transaction.\n\nTransaction must:\n - include `type: "eip712"`\n - include one of the following: `customSignature`, `paymaster`, `paymasterInput`, `gasPerPubdata`, `factoryDeps`'),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidEip712TransactionError"})}};function isEIP712Transaction(e){return"eip712"===e.type||"customSignature"in e&&!!e.customSignature||"paymaster"in e&&!!e.paymaster||"paymasterInput"in e&&!!e.paymasterInput||"gasPerPubdata"in e&&"bigint"==typeof e.gasPerPubdata||"factoryDeps"in e&&!!e.factoryDeps}function assertEip712Transaction(e){let{chainId:t,to:n,from:o,paymaster:i,paymasterInput:s}=e;if(!isEIP712Transaction(e))throw new InvalidEip712TransactionError;if(!t||t<=0)throw new q.hJ({chainId:t});if(n&&!(0,P.U)(n))throw new T.b({address:n});if(o&&!(0,P.U)(o))throw new T.b({address:o});if(i&&!(0,P.U)(i))throw new T.b({address:i});if(i&&!s)throw new R.G("`paymasterInput` must be provided when `paymaster` is defined");if(!i&&s)throw new R.G("`paymaster` must be provided when `paymasterInput` is defined")}let eD={formatters:eN,serializers:{transaction:function(e,t){return isEIP712Transaction(e)?function(e){let{chainId:t,gas:n,nonce:o,to:i,from:s,value:l,maxFeePerGas:c,maxPriorityFeePerGas:u,customSignature:d,factoryDeps:p,paymaster:f,paymasterInput:m,gasPerPubdata:b,data:g}=e;assertEip712Transaction(e);let y=[o?(0,O.NC)(o):"0x",u?(0,O.NC)(u):"0x",c?(0,O.NC)(c):"0x",n?(0,O.NC)(n):"0x",i??"0x",l?(0,O.NC)(l):"0x",g??"0x0",(0,O.NC)(t),(0,O.NC)(""),(0,O.NC)(""),(0,O.NC)(t),s??"0x",b?(0,O.NC)(b):"0x",p??[],d??"0x",f&&m?[f,m]:[]];return(0,M.SM)(["0x71",toRlp(y)])}(e):serializeTransaction(e,t)}},custom:{getEip712Domain:e=>{assertEip712Transaction(e);let t=function(e){let{gas:t,nonce:n,to:o,from:i,value:s,maxFeePerGas:l,maxPriorityFeePerGas:c,factoryDeps:u,paymaster:d,paymasterInput:p,gasPerPubdata:f,data:m}=e;return{txType:113n,from:BigInt(i),to:o?BigInt(o):0n,gasLimit:t??0n,gasPerPubdataByteLimit:f??0n,maxFeePerGas:l??0n,maxPriorityFeePerGas:c??0n,paymaster:d?BigInt(d):0n,nonce:n?BigInt(n):0n,value:s??0n,data:m||"0x0",factoryDeps:u??[],paymasterInput:p||"0x0"}}(e);return{domain:{name:"zkSync",version:"2",chainId:e.chainId},types:{Transaction:[{name:"txType",type:"uint256"},{name:"from",type:"uint256"},{name:"to",type:"uint256"},{name:"gasLimit",type:"uint256"},{name:"gasPerPubdataByteLimit",type:"uint256"},{name:"maxFeePerGas",type:"uint256"},{name:"maxPriorityFeePerGas",type:"uint256"},{name:"paymaster",type:"uint256"},{name:"nonce",type:"uint256"},{name:"value",type:"uint256"},{name:"data",type:"bytes"},{name:"factoryDeps",type:"bytes32[]"},{name:"paymasterInput",type:"bytes"}]},primaryType:"Transaction",message:t}}}},e_=(0,C.a)({...eD,id:300,name:"zkSync Sepolia Testnet",network:"zksync-sepolia-testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.era.zksync.dev"],webSocket:["wss://sepolia.era.zksync.dev/ws"]}},blockExplorers:{default:{name:"zkExplorer",url:"https://sepolia.explorer.zksync.io/"}},contracts:{multicall3:{address:"0xF9cda624FBC7e059355ce98a31693d299FACd963"}},testnet:!0}),eL=(0,C.a)({id:314,name:"Filecoin Mainnet",nativeCurrency:{decimals:18,name:"filecoin",symbol:"FIL"},rpcUrls:{default:{http:["https://api.node.glif.io/rpc/v1"]}},blockExplorers:{default:{name:"Filfox",url:"https://filfox.info/en"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3328594}}}),ez=(0,C.a)({id:321,name:"KCC Mainnet",network:"KCC Mainnet",nativeCurrency:{decimals:18,name:"KCS",symbol:"KCS"},rpcUrls:{default:{http:["https://kcc-rpc.com"]},public:{http:["https://kcc-rpc.com"]}},blockExplorers:{default:{name:"KCC Explorer",url:"https://explorer.kcc.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:11760430}},testnet:!1}),eq=(0,C.a)({...eD,id:324,name:"zkSync Era",network:"zksync-era",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://mainnet.era.zksync.io"],webSocket:["wss://mainnet.era.zksync.io/ws"]}},blockExplorers:{default:{name:"Etherscan",url:"https://era.zksync.network/",apiUrl:"https://api-era.zksync.network/api"}},contracts:{multicall3:{address:"0xF9cda624FBC7e059355ce98a31693d299FACd963"}}}),eG=(0,C.a)({id:338,name:"Cronos Testnet",nativeCurrency:{decimals:18,name:"CRO",symbol:"tCRO"},rpcUrls:{default:{http:["https://evm-t3.cronos.org"]}},blockExplorers:{default:{name:"Cronos Explorer",url:"https://cronos.org/explorer/testnet3"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:10191251}},testnet:!0}),eW=(0,C.a)({id:369,name:"PulseChain",nativeCurrency:{name:"Pulse",symbol:"PLS",decimals:18},testnet:!1,rpcUrls:{default:{http:["https://rpc.pulsechain.com"],webSocket:["wss://ws.pulsechain.com"]}},blockExplorers:{default:{name:"PulseScan",url:"https://scan.pulsechain.com",apiUrl:"https://api.scan.pulsechain.com/api"}},contracts:{ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14353601}}}),eH=(0,C.a)({...Q,id:420,name:"Optimism Goerli",nativeCurrency:{name:"Goerli Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://goerli.optimism.io"]}},blockExplorers:{default:{name:"Etherscan",url:"https://goerli-optimism.etherscan.io",apiUrl:"https://goerli-optimism.etherscan.io/api"}},contracts:{...Q.contracts,l2OutputOracle:{5:{address:"0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:49461},portal:{5:{address:"0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383"}},l1StandardBridge:{5:{address:"0x636Af16bf2f682dD3109e60102b8E1A089FedAa8"}}},testnet:!0,sourceId:5}),eQ=(0,C.a)({id:424,network:"pgn",name:"PGN",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.publicgoods.network"]}},blockExplorers:{default:{name:"PGN Explorer",url:"https://explorer.publicgoods.network",apiUrl:"https://explorer.publicgoods.network/api"},blocksout:{name:"PGN Explorer",url:"https://explorer.publicgoods.network",apiUrl:"https://explorer.publicgoods.network/api"}},contracts:{l2OutputOracle:{1:{address:"0x9E6204F750cD866b299594e2aC9eA824E2e5f95c"}},multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3380209},portal:{1:{address:"0xb26Fd985c5959bBB382BAFdD0b879E149e48116c"}},l1StandardBridge:{1:{address:"0xD0204B9527C1bA7bD765Fa5CCD9355d38338272b"}}},formatters:j,sourceId:1}),eK=(0,C.a)({id:570,name:"Rollux Mainnet",nativeCurrency:{decimals:18,name:"Syscoin",symbol:"SYS"},rpcUrls:{default:{http:["https://rpc.rollux.com"],webSocket:["wss://rpc.rollux.com/wss"]}},blockExplorers:{default:{name:"RolluxExplorer",url:"https://explorer.rollux.com",apiUrl:"https://explorer.rollux.com/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:119222}}}),eV=(0,C.a)({id:571,name:"MetaChain Mainnet",nativeCurrency:{name:"Metatime Coin",symbol:"MTC",decimals:18},rpcUrls:{default:{http:["https://rpc.metatime.com"]}},blockExplorers:{default:{name:"MetaExplorer",url:"https://explorer.metatime.com"}},contracts:{multicall3:{address:"0x0000000000000000000000000000000000003001",blockCreated:0}}}),eZ=(0,C.a)({id:592,name:"Astar",network:"astar-mainnet",nativeCurrency:{name:"Astar",symbol:"ASTR",decimals:18},rpcUrls:{default:{http:["https://astar.api.onfinality.io/public"]}},blockExplorers:{default:{name:"Astar Subscan",url:"https://astar.subscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:761794}},testnet:!1}),eJ=(0,C.a)({id:595,name:"Mandala TC9",network:"mandala",nativeCurrency:{name:"Mandala",symbol:"mACA",decimals:18},rpcUrls:{public:{http:["https://eth-rpc-tc9.aca-staging.network"],webSocket:["wss://eth-rpc-tc9.aca-staging.network"]},default:{http:["https://eth-rpc-tc9.aca-staging.network"],webSocket:["wss://eth-rpc-tc9.aca-staging.network"]}},blockExplorers:{default:{name:"Mandala Blockscout",url:"https://blockscout.mandala.aca-staging.network",apiUrl:"https://blockscout.mandala.aca-staging.network/api"}},testnet:!0}),eX=(0,C.a)({id:599,name:"Metis Goerli",nativeCurrency:{decimals:18,name:"Metis Goerli",symbol:"METIS"},rpcUrls:{default:{http:["https://goerli.gateway.metisdevops.link"]}},blockExplorers:{default:{name:"Metis Goerli Explorer",url:"https://goerli.explorer.metisdevops.link",apiUrl:"https://goerli.explorer.metisdevops.link/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:1006207}}}),eY=(0,C.a)({id:646,name:"FlowEVM Previewnet",nativeCurrency:{decimals:18,name:"Flow",symbol:"FLOW"},rpcUrls:{default:{http:["https://previewnet.evm.nodes.onflow.org"]}},blockExplorers:{default:{name:"Previewnet Explorer",url:"https://previewnet.flowdiver.io"}}}),e$=(0,C.a)({id:686,name:"Karura",network:"karura",nativeCurrency:{name:"Karura",symbol:"KAR",decimals:18},rpcUrls:{public:{http:["https://eth-rpc-karura.aca-api.network"],webSocket:["wss://eth-rpc-karura.aca-api.network"]},default:{http:["https://eth-rpc-karura.aca-api.network"],webSocket:["wss://eth-rpc-karura.aca-api.network"]}},blockExplorers:{default:{name:"Karura Blockscout",url:"https://blockscout.karura.network",apiUrl:"https://blockscout.karura.network/api"}},testnet:!1}),e0=(0,C.a)({id:747,name:"FlowEVM Mainnet",nativeCurrency:{decimals:18,name:"Flow",symbol:"FLOW"},rpcUrls:{default:{http:["https://mainnet.evm.nodes.onflow.org"]}},blockExplorers:{default:{name:"Mainnet Explorer",url:"https://flowdiver.io"}}}),e1=(0,C.a)({id:787,name:"Acala",network:"acala",nativeCurrency:{name:"Acala",symbol:"ACA",decimals:18},rpcUrls:{public:{http:["https://eth-rpc-acala.aca-api.network"],webSocket:["wss://eth-rpc-acala.aca-api.network"]},default:{http:["https://eth-rpc-acala.aca-api.network"],webSocket:["wss://eth-rpc-acala.aca-api.network"]}},blockExplorers:{default:{name:"Acala Blockscout",url:"https://blockscout.acala.network",apiUrl:"https://blockscout.acala.network/api"}},testnet:!1}),e6=(0,C.a)({id:841,name:"Taraxa Mainnet",nativeCurrency:{name:"Tara",symbol:"TARA",decimals:18},rpcUrls:{default:{http:["https://rpc.mainnet.taraxa.io"]}},blockExplorers:{default:{name:"Taraxa Explorer",url:"https://explorer.mainnet.taraxa.io"}}}),e3=(0,C.a)({id:842,name:"Taraxa Testnet",nativeCurrency:{name:"Tara",symbol:"TARA",decimals:18},rpcUrls:{default:{http:["https://rpc.testnet.taraxa.io"]}},blockExplorers:{default:{name:"Taraxa Explorer",url:"https://explorer.testnet.taraxa.io"}},testnet:!0}),e2=(0,C.a)({id:888,name:"Wanchain",nativeCurrency:{name:"WANCHAIN",symbol:"WAN",decimals:18},rpcUrls:{default:{http:["https://gwan-ssl.wandevs.org:56891","https://gwan2-ssl.wandevs.org"]}},blockExplorers:{default:{name:"WanScan",url:"https://wanscan.org"}},contracts:{multicall3:{address:"0xcDF6A1566e78EB4594c86Fe73Fcdc82429e97fbB",blockCreated:25312390}}}),e7=(0,C.a)({id:919,name:"Mode Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.mode.network"]}},blockExplorers:{default:{name:"Blockscout",url:"https://sepolia.explorer.mode.network",apiUrl:"https://sepolia.explorer.mode.network/api"}},contracts:{multicall3:{address:"0xBAba8373113Fb7a68f195deF18732e01aF8eDfCF",blockCreated:3019007}},testnet:!0}),e8=(0,C.a)({id:943,name:"PulseChain V4",testnet:!0,nativeCurrency:{name:"V4 Pulse",symbol:"v4PLS",decimals:18},rpcUrls:{default:{http:["https://rpc.v4.testnet.pulsechain.com"],webSocket:["wss://ws.v4.testnet.pulsechain.com"]}},blockExplorers:{default:{name:"PulseScan",url:"https://scan.v4.testnet.pulsechain.com",apiUrl:"https://scan.v4.testnet.pulsechain.com/api"}},contracts:{ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14353601}}}),e5=(0,C.a)({id:997,name:"5ireChain Thunder Testnet",nativeCurrency:{name:"5ire Token",symbol:"5IRE",decimals:18},rpcUrls:{default:{http:["https://rpc-testnet.5ire.network"]}},blockExplorers:{default:{name:"5ireChain Explorer",url:"https://explorer.5ire.network"}},testnet:!0}),e4=(0,C.a)({id:999,name:"Wanchain Testnet",nativeCurrency:{name:"WANCHAIN",symbol:"WANt",decimals:18},rpcUrls:{default:{http:["https://gwan-ssl.wandevs.org:46891"]}},blockExplorers:{default:{name:"WanScanTest",url:"https://wanscan.org"}},contracts:{multicall3:{address:"0x11c89bF4496c39FB80535Ffb4c92715839CC5324",blockCreated:24743448}},testnet:!0}),e9=(0,C.a)({...Q,id:999,name:"Zora Goerli Testnet",nativeCurrency:{decimals:18,name:"Zora Goerli",symbol:"ETH"},rpcUrls:{default:{http:["https://testnet.rpc.zora.energy"],webSocket:["wss://testnet.rpc.zora.energy"]}},blockExplorers:{default:{name:"Explorer",url:"https://testnet.explorer.zora.energy",apiUrl:"https://testnet.explorer.zora.energy/api"}},contracts:{...Q.contracts,multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:189123},portal:{5:{address:"0xDb9F51790365e7dc196e7D072728df39Be958ACe"}}},sourceId:5,testnet:!0}),te=(0,C.a)({id:1001,name:"Klaytn Baobab Testnet",network:"klaytn-baobab",nativeCurrency:{decimals:18,name:"Baobab Klaytn",symbol:"KLAY"},rpcUrls:{default:{http:["https://public-en-baobab.klaytn.net"]}},blockExplorers:{default:{name:"KlaytnScope",url:"https://baobab.klaytnscope.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:123390593}},testnet:!0}),tt=(0,C.a)({id:1004,name:"Ekta Testnet",nativeCurrency:{decimals:18,name:"EKTA",symbol:"EKTA"},rpcUrls:{default:{http:["https://test.ekta.io:8545"]}},blockExplorers:{default:{name:"Test Ektascan",url:"https://test.ektascan.io",apiUrl:"https://test.ektascan.io/api"}},testnet:!0}),tr=(0,C.a)({id:1017,name:"BNB Greenfield Chain",nativeCurrency:{decimals:18,name:"BNB",symbol:"BNB"},rpcUrls:{default:{http:["https://greenfield-chain.bnbchain.org"]}},blockExplorers:{default:{name:"BNB Greenfield Mainnet Scan",url:"https://greenfieldscan.com"}},testnet:!1}),tn=(0,C.a)({id:1028,name:"BitTorrent Chain Testnet",network:"bittorrent-chain-testnet",nativeCurrency:{name:"BitTorrent",symbol:"BTT",decimals:18},rpcUrls:{default:{http:["https://testrpc.bittorrentchain.io"]},public:{http:["https://testrpc.bittorrentchain.io"]}},blockExplorers:{default:{name:"Bttcscan",url:"https://testnet.bttcscan.com",apiUrl:"https://testnet.bttcscan.com/api"}},testnet:!0}),ta=(0,C.a)({id:1030,name:"Conflux eSpace",nativeCurrency:{name:"Conflux",symbol:"CFX",decimals:18},rpcUrls:{default:{http:["https://evm.confluxrpc.org"],webSocket:["wss://evm.confluxrpc.org/ws"]}},blockExplorers:{default:{name:"ConfluxScan",url:"https://evm.confluxscan.io"}},contracts:{multicall3:{address:"0xEFf0078910f638cd81996cc117bccD3eDf2B072F",blockCreated:68602935}}}),to=(0,C.a)({id:1038,name:"Bronos Testnet",nativeCurrency:{decimals:18,name:"Bronos Coin",symbol:"tBRO"},rpcUrls:{default:{http:["https://evm-testnet.bronos.org"]}},blockExplorers:{default:{name:"BronoScan",url:"https://tbroscan.bronos.org"}},testnet:!0}),ti=(0,C.a)({id:1039,name:"Bronos",nativeCurrency:{decimals:18,name:"BRO",symbol:"BRO"},rpcUrls:{default:{http:["https://evm.bronos.org"]}},blockExplorers:{default:{name:"BronoScan",url:"https://broscan.bronos.org"}}}),ts=(0,C.a)({id:1073,name:"Shimmer Testnet",network:"shimmer-testnet",nativeCurrency:{decimals:18,name:"Shimmer",symbol:"SMR"},rpcUrls:{default:{http:["https://json-rpc.evm.testnet.shimmer.network"]}},blockExplorers:{default:{name:"Shimmer Network Explorer",url:"https://explorer.evm.testnet.shimmer.network",apiUrl:"https://explorer.evm.testnet.shimmer.network/api"}},testnet:!0}),tl=(0,C.a)({id:1088,name:"Metis",nativeCurrency:{decimals:18,name:"Metis",symbol:"METIS"},rpcUrls:{default:{http:["https://andromeda.metis.io/?owner=1088"]}},blockExplorers:{default:{name:"Andromeda Explorer",url:"https://andromeda-explorer.metis.io",apiUrl:"https://andromeda-explorer.metis.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:2338552}}}),tc=(0,C.a)({id:1101,name:"Polygon zkEVM",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://zkevm-rpc.com"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://zkevm.polygonscan.com",apiUrl:"https://api-zkevm.polygonscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:57746}}}),tu=(0,C.a)({id:1111,name:"WEMIX",network:"wemix-mainnet",nativeCurrency:{name:"WEMIX",symbol:"WEMIX",decimals:18},rpcUrls:{default:{http:["https://api.wemix.com"]},public:{http:["https://api.wemix.com"]}},blockExplorers:{default:{name:"wemixExplorer",url:"https://explorer.wemix.com"}}}),td=(0,C.a)({id:1112,name:"WEMIX Testnet",network:"wemix-testnet",nativeCurrency:{name:"WEMIX",symbol:"tWEMIX",decimals:18},rpcUrls:{default:{http:["https://api.test.wemix.com"]},public:{http:["https://api.test.wemix.com"]}},blockExplorers:{default:{name:"wemixExplorer",url:"https://testnet.wemixscan.com",apiUrl:"https://testnet.wemixscan.com/api"}},testnet:!0}),tp=(0,C.a)({id:1116,name:"Core Dao",nativeCurrency:{decimals:18,name:"Core",symbol:"CORE"},rpcUrls:{default:{http:["https://rpc.coredao.org"]}},blockExplorers:{default:{name:"CoreDao",url:"https://scan.coredao.org"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:11907934}},testnet:!1}),th=(0,C.a)({id:1130,network:"defichain-evm",name:"DeFiChain EVM Mainnet",nativeCurrency:{name:"DeFiChain",symbol:"DFI",decimals:8},rpcUrls:{default:{http:["https://eth.mainnet.ocean.jellyfishsdk.com"]},public:{http:["https://eth.mainnet.ocean.jellyfishsdk.com"]}},blockExplorers:{default:{name:"DeFiScan",url:"https://meta.defiscan.live"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:137852}}}),tf=(0,C.a)({id:1131,network:"defichain-evm-testnet",name:"DeFiChain EVM Testnet",nativeCurrency:{name:"DeFiChain",symbol:"DFI",decimals:8},rpcUrls:{default:{http:["https://eth.testnet.ocean.jellyfishsdk.com"]},public:{http:["https://eth.testnet.ocean.jellyfishsdk.com"]}},blockExplorers:{default:{name:"DeFiScan",url:"https://meta.defiscan.live/?network=TestNet"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:156462}},testnet:!0}),tm=(0,C.a)({id:1281,name:"Moonbeam Development Node",nativeCurrency:{decimals:18,name:"DEV",symbol:"DEV"},rpcUrls:{default:{http:["http://127.0.0.1:9944"],webSocket:["wss://127.0.0.1:9944"]}}}),tb=(0,C.a)({id:1284,name:"Moonbeam",nativeCurrency:{decimals:18,name:"GLMR",symbol:"GLMR"},rpcUrls:{default:{http:["https://moonbeam.public.blastapi.io"],webSocket:["wss://moonbeam.public.blastapi.io"]}},blockExplorers:{default:{name:"Moonscan",url:"https://moonscan.io",apiUrl:"https://api-moonbeam.moonscan.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:609002}},testnet:!1}),tg=(0,C.a)({id:1285,name:"Moonriver",nativeCurrency:{decimals:18,name:"MOVR",symbol:"MOVR"},rpcUrls:{default:{http:["https://moonriver.public.blastapi.io"],webSocket:["wss://moonriver.public.blastapi.io"]}},blockExplorers:{default:{name:"Moonscan",url:"https://moonriver.moonscan.io",apiUrl:"https://api-moonriver.moonscan.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:1597904}},testnet:!1}),ty=(0,C.a)({id:1287,name:"Moonbase Alpha",nativeCurrency:{decimals:18,name:"DEV",symbol:"DEV"},rpcUrls:{default:{http:["https://rpc.api.moonbase.moonbeam.network"],webSocket:["wss://wss.api.moonbase.moonbeam.network"]}},blockExplorers:{default:{name:"Moonscan",url:"https://moonbase.moonscan.io",apiUrl:"https://moonbase.moonscan.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:1850686}},testnet:!0}),tv=(0,C.a)({id:1337,name:"Localhost",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["http://127.0.0.1:8545"]}}}),tw=(0,C.a)({id:1442,name:"Polygon zkEVM Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.public.zkevm-test.net"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://testnet-zkevm.polygonscan.com",apiUrl:"https://testnet-zkevm.polygonscan.com/api"}},testnet:!0,contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:525686}}}),tC=(0,C.a)({id:1453,name:"MetaChain Istanbul",nativeCurrency:{name:"Metatime Coin",symbol:"MTC",decimals:18},rpcUrls:{default:{http:["https://istanbul-rpc.metachain.dev"]}},blockExplorers:{default:{name:"MetaExplorer",url:"https://istanbul-explorer.metachain.dev"}},contracts:{multicall3:{address:"0x0000000000000000000000000000000000003001",blockCreated:0}},testnet:!0}),tE=(0,C.a)({id:1559,name:"Tenet",network:"tenet-mainnet",nativeCurrency:{name:"TENET",symbol:"TENET",decimals:18},rpcUrls:{default:{http:["https://rpc.tenet.org"]}},blockExplorers:{default:{name:"TenetScan Mainnet",url:"https://tenetscan.io",apiUrl:"https://tenetscan.io/api"}},testnet:!1}),tx=(0,C.a)({id:1663,name:"Horizen Gobi Testnet",nativeCurrency:{decimals:18,name:"Test ZEN",symbol:"tZEN"},rpcUrls:{default:{http:["https://gobi-testnet.horizenlabs.io/ethv1"]}},blockExplorers:{default:{name:"Gobi Explorer",url:"https://gobi-explorer.horizen.io"}},contracts:{},testnet:!0}),tA=(0,C.a)({id:1686,name:"Mint Sepolia Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://testnet-rpc.mintchain.io"]}},blockExplorers:{default:{name:"Mintchain Testnet explorer",url:"https://testnet-explorer.mintchain.io"}},testnet:!0}),tk=(0,C.a)({id:1890,name:"LightLink Phoenix Mainnet",network:"lightlink-phoenix",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://replicator.phoenix.lightlink.io/rpc/v1"]}},blockExplorers:{default:{name:"LightLink Phoenix Explorer",url:"https://phoenix.lightlink.io"}},testnet:!1}),tB=(0,C.a)({id:1891,name:"LightLink Pegasus Testnet",network:"lightlink-pegasus",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://replicator.pegasus.lightlink.io/rpc/v1"]}},blockExplorers:{default:{name:"LightLink Pegasus Explorer",url:"https://pegasus.lightlink.io"}},testnet:!0}),tS=(0,C.a)({id:1994,name:"Ekta",nativeCurrency:{decimals:18,name:"EKTA",symbol:"EKTA"},rpcUrls:{default:{http:["https://main.ekta.io"]}},blockExplorers:{default:{name:"Ektascan",url:"https://ektascan.io",apiUrl:"https://ektascan.io/api"}}}),tI=(0,C.a)({id:2e3,name:"Dogechain",nativeCurrency:{decimals:18,name:"Dogechain",symbol:"DC"},rpcUrls:{default:{http:["https://rpc.dogechain.dog"]}},blockExplorers:{default:{name:"DogeChainExplorer",url:"https://explorer.dogechain.dog",apiUrl:"https://explorer.dogechain.dog/api"}}}),tj=(0,C.a)({id:2020,name:"Ronin",nativeCurrency:{name:"RON",symbol:"RON",decimals:18},rpcUrls:{default:{http:["https://api.roninchain.com/rpc"]}},blockExplorers:{default:{name:"Ronin Explorer",url:"https://app.roninchain.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:26023535}}}),tT=(0,C.a)({id:2021,name:"Edgeware EdgeEVM Mainnet",nativeCurrency:{decimals:18,name:"Edgeware",symbol:"EDG"},rpcUrls:{default:{http:["https://edgeware-evm.jelliedowl.net"]}},blockExplorers:{default:{name:"Edgscan by Bharathcoorg",url:"https://edgscan.live",apiUrl:"https://edgscan.live/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:18117872}}}),tP=(0,C.a)({id:2021,name:"Saigon Testnet",nativeCurrency:{name:"RON",symbol:"RON",decimals:18},rpcUrls:{default:{http:["https://saigon-testnet.roninchain.com/rpc"]}},blockExplorers:{default:{name:"Saigon Explorer",url:"https://saigon-app.roninchain.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:18736871}},testnet:!0}),tM=(0,C.a)({id:2022,name:"Beresheet BereEVM Testnet",nativeCurrency:{decimals:18,name:"Testnet EDG",symbol:"tEDG"},rpcUrls:{default:{http:["https://beresheet-evm.jelliedowl.net"]}},blockExplorers:{default:{name:"Edgscan by Bharathcoorg",url:"https://testnet.edgscan.live",apiUrl:"https://testnet.edgscan.live/api"}}}),tO=(0,C.a)({id:2221,name:"Kava EVM Testnet",network:"kava-testnet",nativeCurrency:{name:"Kava",symbol:"KAVA",decimals:18},rpcUrls:{default:{http:["https://evm.testnet.kava.io"]}},blockExplorers:{default:{name:"Kava EVM Testnet Explorer",url:"https://testnet.kavascan.com/",apiUrl:"https://testnet.kavascan.com/api"}},contracts:{multicall3:{address:"0xDf1D724A7166261eEB015418fe8c7679BBEa7fd6",blockCreated:7242179}},testnet:!0}),tR=(0,C.a)({id:2222,name:"Kava EVM",network:"kava-mainnet",nativeCurrency:{name:"Kava",symbol:"KAVA",decimals:18},rpcUrls:{default:{http:["https://evm.kava.io"]}},blockExplorers:{default:{name:"Kava EVM Explorer",url:"https://kavascan.com",apiUrl:"https://kavascan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:3661165}},testnet:!1}),tU=(0,C.a)({...Q,id:2331,name:"RSS3 VSL Sepolia Testnet",nativeCurrency:{name:"RSS3",symbol:"RSS3",decimals:18},rpcUrls:{default:{http:["https://rpc.testnet.rss3.io"]}},blockExplorers:{default:{name:"RSS3 VSL Sepolia Testnet Scan",url:"https://scan.testnet.rss3.io",apiUrl:"https://scan.testnet.rss3.io/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0xDb5c46C3Eaa6Ed6aE8b2379785DF7dd029C0dC81"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:55697},portal:{11155111:{address:"0xcBD77E8E1E7F06B25baDe67142cdE82652Da7b57",blockCreated:5345035}},l1StandardBridge:{11155111:{address:"0xdDD29bb63B0839FB1cE0eE439Ff027738595D07B"}}},testnet:!0,sourceId:11155111}),tF=(0,C.a)({id:2358,name:"Kroma Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://api.sepolia.kroma.network"]}},blockExplorers:{default:{name:"Kroma Sepolia Explorer",url:"https://blockscout.sepolia.kroma.network",apiUrl:"https://blockscout.sepolia.kroma.network/api"}},testnet:!0}),tN=(0,C.a)({...Q,id:2522,name:"Fraxtal Testnet",nativeCurrency:{name:"Frax Ether",symbol:"frxETH",decimals:18},rpcUrls:{default:{http:["https://rpc.testnet.frax.com"]}},blockExplorers:{default:{name:"fraxscan testnet",url:"https://holesky.fraxscan.com",apiUrl:"https://api-holesky.fraxscan.com/api"}},contracts:{...Q.contracts,l2OutputOracle:{17e3:{address:"0x715EA64DA13F4d0831ece4Ad3E8c1aa013167F32"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11"},portal:{17e3:{address:"0xB9c64BfA498d5b9a8398Ed6f46eb76d90dE5505d",blockCreated:318416}},l1StandardBridge:{17e3:{address:"0x0BaafC217162f64930909aD9f2B27125121d6332",blockCreated:318416}}},sourceId:17e3}),tD=(0,C.a)({id:2710,name:"Morph Sepolia",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc-testnet.morphl2.io"]}},blockExplorers:{default:{name:"Morph Testnet Explorer",url:"https://explorer-testnet.morphl2.io",apiUrl:"https://explorer-api-testnet.morphl2.io/api"}},testnet:!0}),t_=(0,C.a)({id:3141,name:"Filecoin Hyperspace",nativeCurrency:{decimals:18,name:"testnet filecoin",symbol:"tFIL"},rpcUrls:{default:{http:["https://api.hyperspace.node.glif.io/rpc/v1"]}},blockExplorers:{default:{name:"Filfox",url:"https://hyperspace.filfox.info/en"}}}),tL=(0,C.a)({id:3737,name:"Crossbell",nativeCurrency:{decimals:18,name:"CSB",symbol:"CSB"},rpcUrls:{default:{http:["https://rpc.crossbell.io"]}},blockExplorers:{default:{name:"CrossScan",url:"https://scan.crossbell.io",apiUrl:"https://scan.crossbell.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:38246031}}}),tz=(0,C.a)({id:3776,name:"Astar zkEVM",network:"AstarZkEVM",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.startale.com/astar-zkevm"]}},blockExplorers:{default:{name:"Astar zkEVM Explorer",url:"https://astar-zkevm.explorer.startale.com"}},contracts:{multicall3:{address:"0x36eabf148272BA81A5225C6a3637972F0EE17771",blockCreated:93528}},testnet:!1}),tq=(0,C.a)({id:3993,name:"APEX Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc-testnet.apexlayer.xyz"]}},blockExplorers:{default:{name:"Blockscout",url:"https://exp-testnet.apexlayer.xyz",apiUrl:"https://exp-testnet.apexlayer.xyz/api"}},contracts:{multicall3:{address:"0xf7642be33a6b18D16a995657adb5a68CD0438aE2",blockCreated:283775}},testnet:!0}),tG=(0,C.a)({id:4002,name:"Fantom Testnet",nativeCurrency:{decimals:18,name:"Fantom",symbol:"FTM"},rpcUrls:{default:{http:["https://rpc.testnet.fantom.network"]}},blockExplorers:{default:{name:"FTMScan",url:"https://testnet.ftmscan.com",apiUrl:"https://testnet.ftmscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:8328688}}}),tW=(0,C.a)({id:4090,network:"oasis-testnet",name:"Oasis Testnet",nativeCurrency:{name:"Fasttoken",symbol:"FTN",decimals:18},rpcUrls:{default:{http:["https://rpc1.oasis.bahamutchain.com"]},public:{http:["https://rpc1.oasis.bahamutchain.com"]}},blockExplorers:{default:{name:"Ftnscan",url:"https://oasis.ftnscan.com",apiUrl:"https://oasis.ftnscan.com/api"}},testnet:!0}),tH=(0,C.a)({id:4200,name:"Merlin",nativeCurrency:{name:"BTC",symbol:"BTC",decimals:18},rpcUrls:{default:{http:["https://rpc.merlinchain.io"]}},blockExplorers:{default:{name:"blockscout",url:"https://scan.merlinchain.io",apiUrl:"https://scan.merlinchain.io/api"}}}),tQ=(0,C.a)({id:4201,name:"LUKSO Testnet",nativeCurrency:{decimals:18,name:"LUKSO Testnet",symbol:"LYXt"},rpcUrls:{default:{http:["https://rpc.testnet.lukso.network"],webSocket:["wss://ws-rpc.testnet.lukso.network"]}},blockExplorers:{default:{name:"LUKSO Testnet Explorer",url:"https://explorer.execution.testnet.lukso.network",apiUrl:"https://api.explorer.execution.testnet.lukso.network/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:605348}},testnet:!0}),tK=(0,C.a)({...Q,id:4202,network:"lisk-sepolia",name:"Lisk Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.sepolia-api.lisk.com"]}},blockExplorers:{default:{name:"Blockscout",url:"https://sepolia-blockscout.lisk.com",apiUrl:"https://sepolia-blockscout.lisk.com/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0xA0E35F56C318DE1bD5D9ca6A94Fe7e37C5663348"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11"},portal:{11155111:{address:"0xe3d90F21490686Ec7eF37BE788E02dfC12787264"}},l1StandardBridge:{11155111:{address:"0x1Fb30e446eA791cd1f011675E5F3f5311b70faF5"}}},testnet:!0,sourceId:11155111}),tV=(0,C.a)({id:4242,name:"Nexi",nativeCurrency:{name:"Nexi",symbol:"NEXI",decimals:18},rpcUrls:{default:{http:["https://rpc.chain.nexi.technology"]}},blockExplorers:{default:{name:"NexiScan",url:"https://www.nexiscan.com",apiUrl:"https://www.nexiscan.com/api"}},contracts:{multicall3:{address:"0x0277A46Cc69A57eE3A6C8c158bA874832F718B8E",blockCreated:25770160}}}),tZ=(0,C.a)({id:4337,name:"Beam",network:"beam",nativeCurrency:{decimals:18,name:"Beam",symbol:"BEAM"},rpcUrls:{public:{http:["https://build.onbeam.com/rpc"],webSocket:["wss://build.onbeam.com/ws"]},default:{http:["https://build.onbeam.com/rpc"],webSocket:["wss://build.onbeam.com/ws"]}},blockExplorers:{default:{name:"Beam Explorer",url:"https://subnets.avax.network/beam"}},contracts:{multicall3:{address:"0x4956f15efdc3dc16645e90cc356eafa65ffc65ec",blockCreated:1}}}),tJ=(0,C.a)({id:4689,name:"IoTeX",nativeCurrency:{decimals:18,name:"IoTeX",symbol:"IOTX"},rpcUrls:{default:{http:["https://babel-api.mainnet.iotex.io"],webSocket:["wss://babel-api.mainnet.iotex.io"]}},blockExplorers:{default:{name:"IoTeXScan",url:"https://iotexscan.io"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:22163670}}}),tX=(0,C.a)({id:4690,name:"IoTeX Testnet",nativeCurrency:{decimals:18,name:"IoTeX",symbol:"IOTX"},rpcUrls:{default:{http:["https://babel-api.testnet.iotex.io"],webSocket:["wss://babel-api.testnet.iotex.io"]}},blockExplorers:{default:{name:"IoTeXScan",url:"https://testnet.iotexscan.io"}},testnet:!0}),tY=(0,C.a)({id:4759,name:"MEVerse Chain Testnet",nativeCurrency:{decimals:18,name:"MEVerse",symbol:"MEV"},rpcUrls:{default:{http:["https://rpc.meversetestnet.io"]}},blockExplorers:{default:{name:"Explorer",url:"https://testnet.meversescan.io/"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:64371115}},testnet:!0}),t$=(0,C.a)({id:4777,name:"BlackFort Exchange Network Testnet",nativeCurrency:{name:"BlackFort Testnet Token",symbol:"TBXN",decimals:18},rpcUrls:{default:{http:["https://testnet.blackfort.network/rpc"]}},blockExplorers:{default:{name:"Blockscout",url:"https://testnet-explorer.blackfort.network",apiUrl:"https://testnet-explorer.blackfort.network/api"}}}),t0=(0,C.a)({id:4999,name:"BlackFort Exchange Network",nativeCurrency:{name:"BlackFort Token",symbol:"BXN",decimals:18},rpcUrls:{default:{http:["https://mainnet.blackfort.network/rpc"]}},blockExplorers:{default:{name:"Blockscout",url:"https://explorer.blackfort.network",apiUrl:"https://explorer.blackfort.network/api"}}}),t1=(0,C.a)({id:5e3,name:"Mantle",nativeCurrency:{decimals:18,name:"MNT",symbol:"MNT"},rpcUrls:{default:{http:["https://rpc.mantle.xyz"]}},blockExplorers:{default:{name:"Mantle Explorer",url:"https://explorer.mantle.xyz",apiUrl:"https://explorer.mantle.xyz/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:304717}}}),t6=(0,C.a)({id:5001,name:"Mantle Testnet",nativeCurrency:{decimals:18,name:"MNT",symbol:"MNT"},rpcUrls:{default:{http:["https://rpc.testnet.mantle.xyz"]}},blockExplorers:{default:{name:"Mantle Testnet Explorer",url:"https://explorer.testnet.mantle.xyz",apiUrl:"https://explorer.testnet.mantle.xyz/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:561333}},testnet:!0}),t3=(0,C.a)({id:5165,network:"bahamut",name:"Bahamut",nativeCurrency:{name:"Fasttoken",symbol:"FTN",decimals:18},rpcUrls:{default:{http:["https://rpc1.bahamut.io","https://bahamut.publicnode.com","https://rpc2.bahamut.io"],webSocket:["wss://ws1.sahara.bahamutchain.com","wss://bahamut.publicnode.com","wss://ws2.sahara.bahamutchain.com"]},public:{http:["https://rpc1.bahamut.io","https://bahamut.publicnode.com","https://rpc2.bahamut.io"],webSocket:["wss://ws1.sahara.bahamutchain.com","wss://bahamut.publicnode.com","wss://ws2.sahara.bahamutchain.com"]}},blockExplorers:{default:{name:"Ftnscan",url:"https://www.ftnscan.com",apiUrl:"https://www.ftnscan.com/api"}}}),t2=(0,C.a)({id:5611,name:"opBNB Testnet",nativeCurrency:{decimals:18,name:"tBNB",symbol:"tBNB"},rpcUrls:{default:{http:["https://opbnb-testnet-rpc.bnbchain.org"]}},blockExplorers:{default:{name:"opbnbscan",url:"https://testnet.opbnbscan.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3705108}},testnet:!0}),t7=(0,C.a)({id:5700,name:"Syscoin Tanenbaum Testnet",nativeCurrency:{decimals:18,name:"Syscoin",symbol:"SYS"},rpcUrls:{default:{http:["https://rpc.tanenbaum.io"],webSocket:["wss://rpc.tanenbaum.io/wss"]}},blockExplorers:{default:{name:"SyscoinTestnetExplorer",url:"https://tanenbaum.io"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:271288}}}),t8=(0,C.a)({id:7e3,name:"ZetaChain",nativeCurrency:{decimals:18,name:"Zeta",symbol:"ZETA"},rpcUrls:{default:{http:["https://zetachain-evm.blockpi.network/v1/rpc/public"]}},blockExplorers:{default:{name:"ZetaScan",url:"https://explorer.zetachain.com"}},testnet:!1}),t5=(0,C.a)({id:7001,name:"ZetaChain Athens Testnet",nativeCurrency:{decimals:18,name:"Zeta",symbol:"aZETA"},rpcUrls:{default:{http:["https://zetachain-athens-evm.blockpi.network/v1/rpc/public"]}},blockExplorers:{default:{name:"ZetaScan",url:"https://athens3.explorer.zetachain.com"}},testnet:!0}),t4=(0,C.a)({id:7518,name:"MEVerse Chain Mainnet",nativeCurrency:{decimals:18,name:"MEVerse",symbol:"MEV"},rpcUrls:{default:{http:["https://rpc.meversemainnet.io"]}},blockExplorers:{default:{name:"Explorer",url:"https://www.meversescan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:86881340}}}),t9=(0,C.a)({id:7700,name:"Canto",nativeCurrency:{decimals:18,name:"Canto",symbol:"CANTO"},rpcUrls:{default:{http:["https://canto.gravitychain.io"]}},blockExplorers:{default:{name:"Tuber.Build (Blockscout)",url:"https://tuber.build"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:2905789}}}),re=(0,C.a)({id:8082,name:"Shardeum Sphinx",nativeCurrency:{name:"SHARDEUM",symbol:"SHM",decimals:18},rpcUrls:{default:{http:["https://sphinx.shardeum.org"]}},blockExplorers:{default:{name:"Shardeum Explorer",url:"https://explorer-sphinx.shardeum.org"}},testnet:!0}),rt=(0,C.a)({id:8217,name:"Klaytn",nativeCurrency:{decimals:18,name:"Klaytn",symbol:"KLAY"},rpcUrls:{default:{http:["https://public-en-cypress.klaytn.net"]}},blockExplorers:{default:{name:"KlaytnScope",url:"https://scope.klaytn.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:96002415}}}),rr=(0,C.a)({...Q,id:8453,name:"Base",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.base.org"]}},blockExplorers:{default:{name:"Basescan",url:"https://basescan.org",apiUrl:"https://api.basescan.org/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0x56315b90c40730925ec5485cf004d835058518A0"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:5022},portal:{1:{address:"0x49048044D57e1C92A77f79988d21Fa8fAF74E97e",blockCreated:17482143}},l1StandardBridge:{1:{address:"0x3154Cf16ccdb4C6d922629664174b904d80F2C35",blockCreated:17482143}}},sourceId:1}),rn=(0,C.a)({id:8899,name:"JIBCHAIN L1",network:"jbc",nativeCurrency:{name:"JBC",symbol:"JBC",decimals:18},rpcUrls:{default:{http:["https://rpc-l1.jibchain.net"]},public:{http:["https://rpc-l1.jibchain.net"]}},blockExplorers:{default:{name:"Blockscout",url:"https://exp-l1.jibchain.net",apiUrl:"https://exp-l1.jibchain.net/api"}},contracts:{multicall3:{address:"0xc0C8C486D1466C57Efe13C2bf000d4c56F47CBdC",blockCreated:2299048}},testnet:!1}),ra=(0,C.a)({id:9e3,name:"Evmos Testnet",nativeCurrency:{decimals:18,name:"Evmos",symbol:"EVMOS"},rpcUrls:{default:{http:["https://eth.bd.evmos.dev:8545"]}},blockExplorers:{default:{name:"Evmos Testnet Block Explorer",url:"https://evm.evmos.dev/"}}}),ro=(0,C.a)({id:9001,name:"Evmos",nativeCurrency:{decimals:18,name:"Evmos",symbol:"EVMOS"},rpcUrls:{default:{http:["https://eth.bd.evmos.org:8545"]}},blockExplorers:{default:{name:"Evmos Block Explorer",url:"https://escan.live"}}}),ri=(0,C.a)({id:9700,name:"OORT MainnetDev",nativeCurrency:{decimals:18,name:"OORT",symbol:"OORT"},rpcUrls:{default:{http:["https://dev-rpc.oortech.com"]}},blockExplorers:{oort:{name:"OORT MainnetDev Explorer",url:"https://dev-scan.oortech.com"},default:{name:"OORT MainnetDev Explorer",url:"https://dev-scan.oortech.com"}}}),rs=(0,C.a)({id:10200,name:"Gnosis Chiado",nativeCurrency:{decimals:18,name:"Gnosis",symbol:"xDAI"},rpcUrls:{default:{http:["https://rpc.chiadochain.net"],webSocket:["wss://rpc.chiadochain.net/wss"]}},blockExplorers:{default:{name:"Blockscout",url:"https://blockscout.chiadochain.net",apiUrl:"https://blockscout.chiadochain.net/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:4967313}},testnet:!0}),rl=(0,C.a)({id:11235,name:"HAQQ Mainnet",nativeCurrency:{decimals:18,name:"Islamic Coin",symbol:"ISLM"},rpcUrls:{default:{http:["https://rpc.eth.haqq.network"]}},blockExplorers:{default:{name:"HAQQ Explorer",url:"https://explorer.haqq.network",apiUrl:"https://explorer.haqq.network/api"}}}),rc=(0,C.a)({id:12306,name:"Fibo Chain",nativeCurrency:{decimals:18,name:"fibo",symbol:"FIBO"},rpcUrls:{default:{http:["https://network.hzroc.art"]}},blockExplorers:{default:{name:"FiboScan",url:"https://scan.fibochain.org"}}}),ru=(0,C.a)({...Q,id:12553,name:"RSS3 VSL Mainnet",nativeCurrency:{name:"RSS3",symbol:"RSS3",decimals:18},rpcUrls:{default:{http:["https://rpc.rss3.io"]}},blockExplorers:{default:{name:"RSS3 VSL Mainnet Scan",url:"https://scan.rss3.io",apiUrl:"https://scan.rss3.io/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0xE6f24d2C32B3109B18ed33cF08eFb490b1e09C10"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14193},portal:{1:{address:"0x6A12432491bbbE8d3babf75F759766774C778Db4",blockCreated:19387057}},l1StandardBridge:{1:{address:"0x4cbab69108Aa72151EDa5A3c164eA86845f18438"}}},sourceId:1}),rd=(0,C.a)({id:13337,name:"Beam Testnet",network:"beam",nativeCurrency:{decimals:18,name:"Beam",symbol:"BEAM"},rpcUrls:{public:{http:["https://build.onbeam.com/rpc/testnet"],webSocket:["wss://build.onbeam.com/ws/testnet"]},default:{http:["https://build.onbeam.com/rpc/testnet"],webSocket:["wss://build.onbeam.com/ws/testnet"]}},blockExplorers:{default:{name:"Beam Explorer",url:"https://subnets-test.avax.network/beam"}},contracts:{multicall3:{address:"0x9bf49b704ee2a095b95c1f2d4eb9010510c41c9e",blockCreated:3}},testnet:!0}),rp=(0,C.a)({id:13381,name:"Phoenix Blockchain",nativeCurrency:{name:"Phoenix",symbol:"PHX",decimals:18},rpcUrls:{default:{http:["https://rpc.phoenixplorer.com"]}},blockExplorers:{default:{name:"Phoenixplorer",url:"https://phoenixplorer.com",apiUrl:"https://phoenixplorer.com/api"}},contracts:{multicall3:{address:"0x498cF757a575cFF2c2Ed9f532f56Efa797f86442",blockCreated:5620192}}}),rh=(0,C.a)({id:15557,name:"EOS EVM Testnet",nativeCurrency:{decimals:18,name:"EOS",symbol:"EOS"},rpcUrls:{default:{http:["https://api.testnet.evm.eosnetwork.com"]}},blockExplorers:{default:{name:"EOS EVM Testnet Explorer",url:"https://explorer.testnet.evm.eosnetwork.com",apiUrl:"https://explorer.testnet.evm.eosnetwork.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:9067940}},testnet:!0}),rf=(0,C.a)({id:17e3,name:"Holesky",nativeCurrency:{name:"Holesky Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://ethereum-holesky.publicnode.com"]}},blockExplorers:{default:{name:"Etherscan",url:"https://holesky.etherscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:77},ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",blockCreated:801613},ensUniversalResolver:{address:"0xa6AC935D4971E3CD133b950aE053bECD16fE7f3b",blockCreated:973484}},testnet:!0}),rm=(0,C.a)({id:17777,name:"EOS EVM",nativeCurrency:{decimals:18,name:"EOS",symbol:"EOS"},rpcUrls:{default:{http:["https://api.evm.eosnetwork.com"]}},blockExplorers:{default:{name:"EOS EVM Explorer",url:"https://explorer.evm.eosnetwork.com",apiUrl:"https://explorer.evm.eosnetwork.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:7943933}}}),rb=(0,C.a)({id:23294,name:"Oasis Sapphire",network:"sapphire",nativeCurrency:{name:"Sapphire Rose",symbol:"ROSE",decimals:18},rpcUrls:{default:{http:["https://sapphire.oasis.io"],webSocket:["wss://sapphire.oasis.io/ws"]}},blockExplorers:{default:{name:"Oasis Sapphire Explorer",url:"https://explorer.sapphire.oasis.io",apiUrl:"https://explorer.sapphire.oasis.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:734531}}}),rg=(0,C.a)({id:23295,name:"Oasis Sapphire Testnet",network:"sapphire-testnet",nativeCurrency:{name:"Sapphire Test Rose",symbol:"TEST",decimals:18},rpcUrls:{default:{http:["https://testnet.sapphire.oasis.dev"],webSocket:["wss://testnet.sapphire.oasis.dev/ws"]}},blockExplorers:{default:{name:"Oasis Sapphire Testnet Explorer",url:"https://testnet.explorer.sapphire.oasis.dev",apiUrl:"https://testnet.explorer.sapphire.oasis.dev/api"}},testnet:!0}),ry=(0,C.a)({id:31337,name:"Anvil",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["http://127.0.0.1:8545"],webSocket:["ws://127.0.0.1:8545"]}}}),rv=(0,C.a)({id:31337,name:"Foundry",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["http://127.0.0.1:8545"],webSocket:["ws://127.0.0.1:8545"]}}}),rw=(0,C.a)({id:32769,name:"Zilliqa",network:"zilliqa",nativeCurrency:{name:"Zilliqa",symbol:"ZIL",decimals:18},rpcUrls:{default:{http:["https://api.zilliqa.com"]}},blockExplorers:{default:{name:"Ethernal",url:"https://evmx.zilliqa.com"}},testnet:!1}),rC=(0,C.a)({id:33101,name:"Zilliqa Testnet",network:"zilliqa-testnet",nativeCurrency:{name:"Zilliqa",symbol:"ZIL",decimals:18},rpcUrls:{default:{http:["https://dev-api.zilliqa.com"]}},blockExplorers:{default:{name:"Ethernal",url:"https://evmx.testnet.zilliqa.com"}},testnet:!0}),rE=(0,C.a)({id:34443,name:"Mode Mainnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.mode.network"]}},blockExplorers:{default:{name:"Mode Explorer",url:"https://explorer.mode.network"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:2465882}}}),rx=(0,C.a)({id:35441,name:"Q Mainnet",nativeCurrency:{decimals:18,name:"Q",symbol:"Q"},rpcUrls:{default:{http:["https://rpc.q.org"]}},blockExplorers:{default:{name:"Q Mainnet Explorer",url:"https://explorer.q.org",apiUrl:"https://explorer.q.org/api"}}}),rA=(0,C.a)({id:35443,name:"Q Testnet",nativeCurrency:{decimals:18,name:"Q",symbol:"Q"},rpcUrls:{default:{http:["https://rpc.qtestnet.org"]}},blockExplorers:{default:{name:"Q Testnet Explorer",url:"https://explorer.qtestnet.org",apiUrl:"https://explorer.qtestnet.org/api"}},testnet:!0}),rk=(0,C.a)({id:42161,name:"Arbitrum One",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://arb1.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://arbiscan.io",apiUrl:"https://api.arbiscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:7654707}}}),rB=(0,C.a)({id:42170,name:"Arbitrum Nova",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://nova.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://nova.arbiscan.io",apiUrl:"https://api-nova.arbiscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:1746963}}});function isEmpty(e){return 0===e||0n===e||null==e||"0"===e||""===e||"string"==typeof e&&("0x"===(0,z.f)(e).toLowerCase()||"0x00"===(0,z.f)(e).toLowerCase())}function isPresent(e){return!isEmpty(e)}function isEIP1559(e){return void 0!==e.maxFeePerGas&&void 0!==e.maxPriorityFeePerGas}function isCIP42(e){return"cip42"===e.type||isEIP1559(e)&&(isPresent(e.feeCurrency)||isPresent(e.gatewayFeeRecipient)||isPresent(e.gatewayFee))}function isCIP64(e){return"cip64"===e.type||isEIP1559(e)&&isPresent(e.feeCurrency)&&isEmpty(e.gatewayFee)&&isEmpty(e.gatewayFeeRecipient)}let rS={block:(0,B.G)({exclude:["difficulty","gasLimit","mixHash","nonce","uncles"],format(e){let t=e.transactions?.map(e=>"string"==typeof e?e:{...S.Tr(e),feeCurrency:e.feeCurrency,..."0x7b"!==e.type?{gatewayFee:e.gatewayFee?k.y_(e.gatewayFee):null,gatewayFeeRecipient:e.gatewayFeeRecipient||null}:{}});return{randomness:e.randomness,transactions:t}}}),transaction:(0,S.y_)({format(e){let t={feeCurrency:e.feeCurrency};return"0x7b"===e.type?t.type="cip64":("0x7c"===e.type&&(t.type="cip42"),t.gatewayFee=e.gatewayFee?(0,k.y_)(e.gatewayFee):null,t.gatewayFeeRecipient=e.gatewayFeeRecipient),t}}),transactionRequest:(0,eF.iy)({format(e){let t={feeCurrency:e.feeCurrency};return isCIP64(e)?t.type="0x7b":(isCIP42(e)&&(t.type="0x7c"),t.gatewayFee=void 0!==e.gatewayFee?(0,O.eC)(e.gatewayFee):void 0,t.gatewayFeeRecipient=e.gatewayFeeRecipient),t}})},rI=2n**256n-1n,rj={formatters:rS,serializers:{transaction:function(e,t){return isCIP64(e)?function(e,t){!function(e){let{chainId:t,maxPriorityFeePerGas:n,gasPrice:o,maxFeePerGas:i,to:s,feeCurrency:l}=e;if(t<=0)throw new q.hJ({chainId:t});if(s&&!(0,P.U)(s))throw new T.b({address:s});if(o)throw new R.G("`gasPrice` is not a valid CIP-64 Transaction attribute.");if(isPresent(i)&&i>rI)throw new G.Hh({maxFeePerGas:i});if(isPresent(n)&&isPresent(i)&&n>i)throw new G.cs({maxFeePerGas:i,maxPriorityFeePerGas:n});if(isPresent(l)&&!(0,P.U)(l))throw new R.G("`feeCurrency` MUST be a token address for CIP-64 transactions.");if(isEmpty(l))throw new R.G("`feeCurrency` must be provided for CIP-64 transactions.")}(e);let{chainId:n,gas:o,nonce:i,to:s,value:l,maxFeePerGas:c,maxPriorityFeePerGas:u,accessList:d,feeCurrency:p,data:f}=e,m=[(0,O.NC)(n),i?(0,O.NC)(i):"0x",u?(0,O.NC)(u):"0x",c?(0,O.NC)(c):"0x",o?(0,O.NC)(o):"0x",s??"0x",l?(0,O.NC)(l):"0x",f??"0x",serializeAccessList(d),p,...toYParitySignatureArray(e,t)];return(0,M.SM)(["0x7b",toRlp(m)])}(e,t):isCIP42(e)?function(e,t){!function(e){let{chainId:t,maxPriorityFeePerGas:n,gasPrice:o,maxFeePerGas:i,to:s,feeCurrency:l,gatewayFee:c,gatewayFeeRecipient:u}=e;if(t<=0)throw new q.hJ({chainId:t});if(s&&!(0,P.U)(s))throw new T.b({address:s});if(o)throw new R.G("`gasPrice` is not a valid CIP-42 Transaction attribute.");if(isPresent(i)&&i>rI)throw new G.Hh({maxFeePerGas:i});if(isPresent(n)&&isPresent(i)&&n>i)throw new G.cs({maxFeePerGas:i,maxPriorityFeePerGas:n});if(isPresent(c)&&isEmpty(u)||isPresent(u)&&isEmpty(c))throw new R.G("`gatewayFee` and `gatewayFeeRecipient` must be provided together.");if(isPresent(l)&&!(0,P.U)(l))throw new R.G("`feeCurrency` MUST be a token address for CIP-42 transactions.");if(isPresent(u)&&!(0,P.U)(u))throw new T.b(u);if(isEmpty(l)&&isEmpty(u))throw new R.G("Either `feeCurrency` or `gatewayFeeRecipient` must be provided for CIP-42 transactions.")}(e);let{chainId:n,gas:o,nonce:i,to:s,value:l,maxFeePerGas:c,maxPriorityFeePerGas:u,accessList:d,feeCurrency:p,gatewayFeeRecipient:f,gatewayFee:m,data:b}=e,g=[(0,O.NC)(n),i?(0,O.NC)(i):"0x",u?(0,O.NC)(u):"0x",c?(0,O.NC)(c):"0x",o?(0,O.NC)(o):"0x",p??"0x",f??"0x",m?(0,O.NC)(m):"0x",s??"0x",l?(0,O.NC)(l):"0x",b??"0x",serializeAccessList(d),...toYParitySignatureArray(e,t)];return(0,M.SM)(["0x7c",toRlp(g)])}(e,t):serializeTransaction(e,t)}}},rT=(0,C.a)({...rj,id:42220,name:"Celo",nativeCurrency:{decimals:18,name:"CELO",symbol:"CELO"},rpcUrls:{default:{http:["https://forno.celo.org"]}},blockExplorers:{default:{name:"Celo Explorer",url:"https://explorer.celo.org/mainnet",apiUrl:"https://explorer.celo.org/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:13112599}},testnet:!1}),rP=(0,C.a)({id:42766,name:"ZKFair Mainnet",network:"zkfair-mainnet",nativeCurrency:{decimals:18,name:"USD Coin",symbol:"USDC"},rpcUrls:{default:{http:["https://rpc.zkfair.io"]},public:{http:["https://rpc.zkfair.io"]}},blockExplorers:{default:{name:"zkFair Explorer",url:"https://scan.zkfair.io",apiUrl:"https://scan.zkfair.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:6090959}},testnet:!1}),rM=(0,C.a)({id:43113,name:"Avalanche Fuji",nativeCurrency:{decimals:18,name:"Avalanche Fuji",symbol:"AVAX"},rpcUrls:{default:{http:["https://api.avax-test.network/ext/bc/C/rpc"]}},blockExplorers:{default:{name:"SnowScan",url:"https://testnet.snowscan.xyz",apiUrl:"https://api-testnet.snowscan.xyz"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:7096959}},testnet:!0}),rO=(0,C.a)({id:43114,name:"Avalanche",nativeCurrency:{decimals:18,name:"Avalanche",symbol:"AVAX"},rpcUrls:{default:{http:["https://api.avax.network/ext/bc/C/rpc"]}},blockExplorers:{default:{name:"SnowScan",url:"https://snowscan.xyz",apiUrl:"https://api.snowscan.xyz/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:11907934}}}),rR=(0,C.a)({id:43851,name:"ZKFair Testnet",network:"zkfair-testnet",nativeCurrency:{decimals:18,name:"USD Coin",symbol:"USDC"},rpcUrls:{default:{http:["https://testnet-rpc.zkfair.io"]},public:{http:["https://testnet-rpc.zkfair.io"]}},blockExplorers:{default:{name:"zkFair Explorer",url:"https://testnet-scan.zkfair.io"}},testnet:!0}),rU=(0,C.a)({...rj,id:44787,name:"Alfajores",nativeCurrency:{decimals:18,name:"CELO",symbol:"A-CELO"},rpcUrls:{default:{http:["https://alfajores-forno.celo-testnet.org"]}},blockExplorers:{default:{name:"Celo Explorer",url:"https://explorer.celo.org/alfajores",apiUrl:"https://explorer.celo.org/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:14569001}},testnet:!0}),rF=(0,C.a)({id:53935,name:"DFK Chain",nativeCurrency:{decimals:18,name:"Jewel",symbol:"JEWEL"},rpcUrls:{default:{http:["https://subnets.avax.network/defi-kingdoms/dfk-chain/rpc"]}},blockExplorers:{default:{name:"DFKSubnetScan",url:"https://subnets.avax.network/defi-kingdoms"}}}),rN=(0,C.a)({id:54211,name:"HAQQ Testedge 2",nativeCurrency:{decimals:18,name:"Islamic Coin",symbol:"ISLMT"},rpcUrls:{default:{http:["https://rpc.eth.testedge2.haqq.network"]}},blockExplorers:{default:{name:"HAQQ Explorer",url:"https://explorer.testedge2.haqq.network",apiUrl:"https://explorer.testedge2.haqq.network/api"}}}),rD=(0,C.a)({id:57e3,name:"Rollux Testnet",nativeCurrency:{decimals:18,name:"Syscoin",symbol:"SYS"},rpcUrls:{default:{http:["https://rpc-tanenbaum.rollux.com/"],webSocket:["wss://rpc-tanenbaum.rollux.com/wss"]}},blockExplorers:{default:{name:"RolluxTestnetExplorer",url:"https://rollux.tanenbaum.io",apiUrl:"https://rollux.tanenbaum.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:1813675}}}),r_=(0,C.a)({id:58008,network:"pgn-testnet",name:"PGN ",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.publicgoods.network"]}},blockExplorers:{default:{name:"PGN Testnet Explorer",url:"https://explorer.sepolia.publicgoods.network",apiUrl:"https://explorer.sepolia.publicgoods.network/api"},blocksout:{name:"PGN Testnet Explorer",url:"https://explorer.sepolia.publicgoods.network",apiUrl:"https://explorer.sepolia.publicgoods.network/api"}},contracts:{l2OutputOracle:{11155111:{address:"0xD5bAc3152ffC25318F848B3DD5dA6C85171BaEEe"}},portal:{11155111:{address:"0xF04BdD5353Bb0EFF6CA60CfcC78594278eBfE179"}},l1StandardBridge:{11155111:{address:"0xFaE6abCAF30D23e233AC7faF747F2fC3a5a6Bfa3"}},multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3754925}},formatters:j,sourceId:11155111,testnet:!0}),rL=(0,C.a)({id:59140,name:"Linea Goerli Testnet",nativeCurrency:{name:"Linea Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.goerli.linea.build"],webSocket:["wss://rpc.goerli.linea.build"]}},blockExplorers:{default:{name:"Etherscan",url:"https://goerli.lineascan.build",apiUrl:"https://goerli.lineascan.build/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:498623}},testnet:!0}),rz=(0,C.a)({id:59144,name:"Linea Mainnet",nativeCurrency:{name:"Linea Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.linea.build"],webSocket:["wss://rpc.linea.build"]}},blockExplorers:{default:{name:"Etherscan",url:"https://lineascan.build",apiUrl:"https://api.lineascan.build/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:42}},testnet:!1}),rq=(0,C.a)({id:64240,name:"Fantom Sonic Open Testnet",network:"fantom-sonic-testnet",nativeCurrency:{decimals:18,name:"Fantom",symbol:"FTM"},rpcUrls:{default:{http:["https://rpcapi.sonic.fantom.network"]}},blockExplorers:{default:{name:"Fantom Sonic Open Testnet Explorer",url:"https://public-sonic.fantom.network"}},testnet:!0}),rG=(0,C.a)({id:80001,name:"Polygon Mumbai",nativeCurrency:{name:"MATIC",symbol:"MATIC",decimals:18},rpcUrls:{default:{http:["https://rpc.ankr.com/polygon_mumbai"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://mumbai.polygonscan.com",apiUrl:"https://mumbai.polygonscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:25770160}},testnet:!0}),rW=(0,C.a)({id:80002,name:"Polygon Amoy",nativeCurrency:{name:"MATIC",symbol:"MATIC",decimals:18},rpcUrls:{default:{http:["https://rpc-amoy.polygon.technology"]}},blockExplorers:{default:{name:"OK LINK",url:"https://www.oklink.com/amoy"}},testnet:!0}),rH=(0,C.a)({id:80085,name:"Berachain Artio",nativeCurrency:{decimals:18,name:"BERA Token",symbol:"BERA"},rpcUrls:{default:{http:["https://artio.rpc.berachain.com"]}},blockExplorers:{default:{name:"Berachain",url:"https://artio.beratrail.io"}},testnet:!0}),rQ=(0,C.a)({id:81457,name:"Blast",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://rpc.blast.io"]}},blockExplorers:{default:{name:"Blastscan",url:"https://blastscan.io"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:212929}},sourceId:1}),rK=(0,C.a)({...Q,id:84531,name:"Base Goerli",nativeCurrency:{name:"Goerli Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://goerli.base.org"]}},blockExplorers:{default:{name:"Basescan",url:"https://goerli.basescan.org",apiUrl:"https://goerli.basescan.org/api"}},contracts:{...Q.contracts,l2OutputOracle:{5:{address:"0x2A35891ff30313CcFa6CE88dcf3858bb075A2298"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:1376988},portal:{5:{address:"0xe93c8cD0D409341205A592f8c4Ac1A5fe5585cfA"}},l1StandardBridge:{5:{address:"0xfA6D8Ee5BE770F84FC001D098C4bD604Fe01284a"}}},testnet:!0,sourceId:5}),rV=(0,C.a)({...Q,id:84532,network:"base-sepolia",name:"Base Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.base.org"]}},blockExplorers:{default:{name:"Basescan",url:"https://sepolia.basescan.org",apiUrl:"https://api-sepolia.basescan.org/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254"}},portal:{11155111:{address:"0x49f53e41452c74589e85ca1677426ba426459e85",blockCreated:4446677}},l1StandardBridge:{11155111:{address:"0xfd0Bf71F60660E2f608ed56e1659C450eB113120",blockCreated:4446677}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:1059647}},testnet:!0,sourceId:11155111}),rZ=(0,C.a)({id:88882,name:"Chiliz Spicy Testnet",network:"chiliz-spicy-Testnet",nativeCurrency:{decimals:18,name:"CHZ",symbol:"CHZ"},rpcUrls:{default:{http:["https://spicy-rpc.chiliz.com","https://chiliz-spicy.publicnode.com"],webSocket:["wss://spicy-rpc-ws.chiliz.com","wss://chiliz-spicy.publicnode.com"]}},blockExplorers:{default:{name:"Chiliz Explorer",url:"http://spicy-explorer.chiliz.com",apiUrl:"http://spicy-explorer.chiliz.com/api"}},testnet:!0}),rJ=(0,C.a)({id:88888,name:"Chiliz Chain",network:"chiliz-chain",nativeCurrency:{decimals:18,name:"CHZ",symbol:"CHZ"},rpcUrls:{default:{http:["https://rpc.ankr.com/chiliz","https://chiliz.publicnode.com"]}},blockExplorers:{default:{name:"Chiliz Explorer",url:"https://scan.chiliz.com",apiUrl:"https://scan.chiliz.com/api"}}}),rX=(0,C.a)({id:100009,name:"Vechain",nativeCurrency:{name:"VeChain",symbol:"VET",decimals:18},rpcUrls:{default:{http:["https://mainnet.vechain.org"]}},blockExplorers:{default:{name:"Vechain Explorer",url:"https://explore.vechain.org"},vechainStats:{name:"Vechain Stats",url:"https://vechainstats.com"}}}),rY=(0,C.a)({id:105105,name:"Stratis Mainnet",network:"stratis",nativeCurrency:{name:"Stratis",symbol:"STRAX",decimals:18},rpcUrls:{default:{http:["https://rpc.stratisevm.com"]}},blockExplorers:{default:{name:"Stratis Explorer",url:"https://explorer.stratisevm.com"}}}),r$=(0,C.a)({id:128123,name:"Etherlink Testnet",nativeCurrency:{decimals:18,name:"Tez",symbol:"XTZ"},rpcUrls:{default:{http:["https://node.ghostnet.etherlink.com"]}},blockExplorers:{default:{name:"Etherlink Testnet",url:"https://testnet-explorer.etherlink.com"}},testnet:!0}),r0=(0,C.a)({id:167005,name:"Taiko (Alpha-3 Testnet)",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.test.taiko.xyz"]}},blockExplorers:{default:{name:"blockscout",url:"https://explorer.test.taiko.xyz"}}}),r1=(0,C.a)({id:167007,name:"Taiko Jolnir (Alpha-5 Testnet)",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.jolnir.taiko.xyz"]}},blockExplorers:{default:{name:"blockscout",url:"https://explorer.jolnir.taiko.xyz"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:732706}},testnet:!0}),r6=(0,C.a)({id:167008,name:"Taiko Katla (Alpha-6 Testnet)",network:"tko-katla",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.katla.taiko.xyz"]},public:{http:["https://rpc.katla.taiko.xyz"]}},blockExplorers:{default:{name:"blockscout",url:"https://explorer.katla.taiko.xyz"}}}),r3=(0,C.a)({id:205205,name:"Auroria Testnet",network:"auroria",nativeCurrency:{name:"Auroria Stratis",symbol:"tSTRAX",decimals:18},rpcUrls:{default:{http:["https://auroria.rpc.stratisevm.com"]}},blockExplorers:{default:{name:"Auroria Testnet Explorer",url:"https://auroria.explorer.stratisevm.com"}},testnet:!0}),r2=(0,C.a)({id:314159,name:"Filecoin Calibration",nativeCurrency:{decimals:18,name:"testnet filecoin",symbol:"tFIL"},rpcUrls:{default:{http:["https://api.calibration.node.glif.io/rpc/v1"]}},blockExplorers:{default:{name:"Filscan",url:"https://calibration.filscan.io"}}}),r7=(0,C.a)({id:421613,name:"Arbitrum Goerli",nativeCurrency:{name:"Arbitrum Goerli Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://goerli-rollup.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://goerli.arbiscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:88114}},testnet:!0}),r8=(0,C.a)({id:421614,name:"Arbitrum Sepolia",nativeCurrency:{name:"Arbitrum Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia-rollup.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://sepolia.arbiscan.io",apiUrl:"https://api-sepolia.arbiscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:81930}},testnet:!0}),r5=(0,C.a)({id:534351,name:"Scroll Sepolia",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia-rpc.scroll.io"]}},blockExplorers:{default:{name:"Blockscout",url:"https://sepolia-blockscout.scroll.io",apiUrl:"https://sepolia-blockscout.scroll.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:9473}},testnet:!0}),r4=(0,C.a)({id:534352,name:"Scroll",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.scroll.io"],webSocket:["wss://wss-rpc.scroll.io/ws"]}},blockExplorers:{default:{name:"Scrollscan",url:"https://scrollscan.com",apiUrl:"https://api.scrollscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14}},testnet:!1}),r9=(0,C.a)({id:534353,name:"Scroll Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://alpha-rpc.scroll.io/l2"],webSocket:["wss://alpha-rpc.scroll.io/l2/ws"]}},blockExplorers:{default:{name:"Blockscout",url:"https://blockscout.scroll.io",apiUrl:"https://blockscout.scroll.io/api"}},testnet:!0}),ne=(0,C.a)({id:641230,name:"Bear Network Chain Mainnet",nativeCurrency:{decimals:18,name:"BearNetworkChain",symbol:"BRNKC"},rpcUrls:{default:{http:["https://brnkc-mainnet.bearnetwork.net"]}},blockExplorers:{default:{name:"BrnkScan",url:"https://brnkscan.bearnetwork.net",apiUrl:"https://brnkscan.bearnetwork.net/api"}}}),nt=(0,C.a)({id:751230,name:"Bear Network Chain Testnet",nativeCurrency:{decimals:18,name:"tBRNKC",symbol:"tBRNKC"},rpcUrls:{default:{http:["https://brnkc-test.bearnetwork.net"]}},blockExplorers:{default:{name:"BrnkTestScan",url:"https://brnktest-scan.bearnetwork.net",apiUrl:"https://brnktest-scan.bearnetwork.net/api"}},testnet:!0}),nr=(0,C.a)({id:1337803,name:"Zhejiang",nativeCurrency:{name:"Zhejiang Ether",symbol:"ZhejETH",decimals:18},rpcUrls:{default:{http:["https://rpc.zhejiang.ethpandaops.io"]}},blockExplorers:{default:{name:"Beaconchain",url:"https://zhejiang.beaconcha.in"}},testnet:!0}),nn=(0,C.a)({id:3441005,name:"Manta Pacific Testnet",network:"manta-testnet",nativeCurrency:{decimals:18,name:"ETH",symbol:"ETH"},rpcUrls:{default:{http:["https://manta-testnet.calderachain.xyz/http"]}},blockExplorers:{default:{name:"Manta Testnet Explorer",url:"https://pacific-explorer.testnet.manta.network",apiUrl:"https://pacific-explorer.testnet.manta.network/api"}},contracts:{multicall3:{address:"0x211B1643b95Fe76f11eD8880EE810ABD9A4cf56C",blockCreated:419915}},testnet:!0}),na=(0,C.a)({id:6038361,name:"Astar zkEVM Testnet zKyoto",network:"zKyoto",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.startale.com/zkyoto"]}},blockExplorers:{default:{name:"zKyoto Explorer",url:"https://astar-zkyoto.blockscout.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:196153}},testnet:!0}),no=(0,C.a)({...Q,id:7777777,name:"Zora",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://rpc.zora.energy"],webSocket:["wss://rpc.zora.energy"]}},blockExplorers:{default:{name:"Explorer",url:"https://explorer.zora.energy",apiUrl:"https://explorer.zora.energy/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0x9E6204F750cD866b299594e2aC9eA824E2e5f95c"}},multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:5882},portal:{1:{address:"0x1a0ad011913A150f69f6A19DF447A0CfD9551054"}},l1StandardBridge:{1:{address:"0x3e2Ea9B92B7E48A52296fD261dc26fd995284631"}}},sourceId:1}),ni=(0,C.a)({id:11155111,name:"Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"SEP",decimals:18},rpcUrls:{default:{http:["https://rpc.sepolia.org"]}},blockExplorers:{default:{name:"Etherscan",url:"https://sepolia.etherscan.io",apiUrl:"https://api-sepolia.etherscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:751532},ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},ensUniversalResolver:{address:"0xc8Af999e38273D658BE1b921b88A9Ddf005769cC",blockCreated:5317080}},testnet:!0}),ns=(0,C.a)({...Q,id:11155420,name:"OP Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.optimism.io"]}},blockExplorers:{default:{name:"Blockscout",url:"https://optimism-sepolia.blockscout.com",apiUrl:"https://optimism-sepolia.blockscout.com/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:1620204},portal:{11155111:{address:"0x16Fc5058F25648194471939df75CF27A2fdC48BC"}},l1StandardBridge:{11155111:{address:"0xFBb0621E0B23b5478B630BD55a5f21f67730B0F1"}}},testnet:!0,sourceId:11155111}),nl=(0,C.a)({...Q,id:28122024,name:"Ancient8 Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpcv2-testnet.ancient8.gg"]}},blockExplorers:{default:{name:"Ancient8 Celestia Testnet explorer",url:"https://scanv2-testnet.ancient8.gg",apiUrl:"https://scanv2-testnet.ancient8.gg/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB"}},portal:{11155111:{address:"0xfa1d9E26A6aCD7b22115D27572c1221B9803c960",blockCreated:4972908}},l1StandardBridge:{11155111:{address:"0xF6Bc0146d3c74D48306e79Ae134A260E418C9335",blockCreated:4972908}}},sourceId:11155111}),nc=(0,C.a)({id:37084624,name:"SKALE Nebula Testnet",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://testnet.skalenodes.com/v1/lanky-ill-funny-testnet"],webSocket:["wss://testnet.skalenodes.com/v1/ws/lanky-ill-funny-testnet"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://lanky-ill-funny-testnet.explorer.testnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:105141}},testnet:!0}),nu=(0,C.a)({id:161221135,name:"Plume Testnet",nativeCurrency:{name:"Plume Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://plume-testnet.rpc.caldera.xyz/http"],webSocket:["wss://plume-testnet.rpc.caldera.xyz/ws"]}},blockExplorers:{default:{name:"Blockscout",url:"https://plume-testnet.explorer.caldera.xyz",apiUrl:"https://plume-testnet.explorer.caldera.xyz/api"}},testnet:!0,sourceId:11155111}),nd=(0,C.a)({id:168587773,name:"Blast Sepolia",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.blast.io"]}},blockExplorers:{default:{name:"Blastscan",url:"https://testnet.blastscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:756690}},testnet:!0,sourceId:11155111}),np=(0,C.a)({id:245022926,name:"Neon EVM DevNet",nativeCurrency:{name:"NEON",symbol:"NEON",decimals:18},rpcUrls:{default:{http:["https://devnet.neonevm.org"]}},blockExplorers:{default:{name:"Neonscan",url:"https://devnet.neonscan.org"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:205206112}},testnet:!0}),nh=(0,C.a)({id:245022934,network:"neonMainnet",name:"Neon EVM MainNet",nativeCurrency:{name:"NEON",symbol:"NEON",decimals:18},rpcUrls:{default:{http:["https://neon-proxy-mainnet.solana.p2p.org"]}},blockExplorers:{default:{name:"Neonscan",url:"https://neonscan.org"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:206545524}},testnet:!1}),nf=(0,C.a)({id:278611351,name:"SKALE | Razor Network",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/turbulent-unique-scheat"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/turbulent-unique-scheat"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://turbulent-unique-scheat.explorer.mainnet.skalenodes.com"}},contracts:{}}),nm=(0,C.a)({id:391845894,name:"SKALE | Block Brawlers",nativeCurrency:{name:"BRAWL",symbol:"BRAWL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/frayed-decent-antares"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/frayed-decent-antares"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://frayed-decent-antares.explorer.mainnet.skalenodes.com"}},contracts:{}}),nb=(0,C.a)({...Q,id:888888888,name:"Ancient8",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.ancient8.gg"]}},blockExplorers:{default:{name:"Ancient8 explorer",url:"https://scan.ancient8.gg",apiUrl:"https://scan.ancient8.gg/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0xB09DC08428C8b4EFB4ff9C0827386CDF34277996"}},portal:{1:{address:"0x639F2AECE398Aa76b07e59eF6abe2cFe32bacb68",blockCreated:19070571}},l1StandardBridge:{1:{address:"0xd5e3eDf5b68135D559D572E26bF863FBC1950033",blockCreated:19070571}}},sourceId:1}),ng=(0,C.a)({id:974399131,name:"SKALE Calypso Testnet",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://testnet.skalenodes.com/v1/giant-half-dual-testnet"],webSocket:["wss://testnet.skalenodes.com/v1/ws/giant-half-dual-testnet"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://giant-half-dual-testnet.explorer.testnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:103220}},testnet:!0}),ny=(0,C.a)({...Q,id:999999999,name:"Zora Sepolia",network:"zora-sepolia",nativeCurrency:{decimals:18,name:"Zora Sepolia",symbol:"ETH"},rpcUrls:{default:{http:["https://sepolia.rpc.zora.energy"],webSocket:["wss://sepolia.rpc.zora.energy"]}},blockExplorers:{default:{name:"Zora Sepolia Explorer",url:"https://sepolia.explorer.zora.energy/",apiUrl:"https://sepolia.explorer.zora.energy/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0x2615B481Bd3E5A1C0C7Ca3Da1bdc663E8615Ade9"}},multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:83160},portal:{11155111:{address:"0xeffE2C6cA9Ab797D418f0D91eA60807713f3536f"}},l1StandardBridge:{11155111:{address:"0x5376f1D543dcbB5BD416c56C189e4cB7399fCcCB"}}},sourceId:11155111,testnet:!0}),nv=(0,C.a)({id:1020352220,name:"SKALE Titan Hub",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://testnet.skalenodes.com/v1/aware-fake-trim-testnet"],webSocket:["wss://testnet.skalenodes.com/v1/ws/aware-fake-trim-testnet"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://aware-fake-trim-testnet.explorer.testnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:104072}},testnet:!0}),nw=(0,C.a)({id:1026062157,name:"SKALE | CryptoBlades",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/affectionate-immediate-pollux"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/affectionate-immediate-pollux"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://affectionate-immediate-pollux.explorer.mainnet.skalenodes.com"}},contracts:{}}),nC=(0,C.a)({id:2046399126,name:"SKALE | Crypto Colosseum",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/haunting-devoted-deneb"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/haunting-devoted-deneb"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://haunting-devoted-deneb.explorer.mainnet.skalenodes.com"}},contracts:{}}),nE=(0,C.a)({id:1273227453,name:"SKALE | Human Protocol",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/wan-red-ain"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/wan-red-ain"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://wan-red-ain.explorer.mainnet.skalenodes.com"}},contracts:{}}),nx=(0,C.a)({id:1313161554,name:"Aurora",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://mainnet.aurora.dev"]}},blockExplorers:{default:{name:"Aurorascan",url:"https://aurorascan.dev",apiUrl:"https://aurorascan.dev/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:62907816}}}),nA=(0,C.a)({id:1313161555,name:"Aurora Testnet",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://testnet.aurora.dev"]}},blockExplorers:{default:{name:"Aurorascan",url:"https://testnet.aurorascan.dev",apiUrl:"https://testnet.aurorascan.dev/api"}},testnet:!0}),nk=(0,C.a)({id:1350216234,name:"SKALE | Titan Community Hub",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/parallel-stormy-spica"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/parallel-stormy-spica"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://parallel-stormy-spica.explorer.mainnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:2076458}}}),nB=(0,C.a)({id:1444673419,name:"SKALE Europa Testnet",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://testnet.skalenodes.com/v1/juicy-low-small-testnet"],webSocket:["wss://testnet.skalenodes.com/v1/ws/juicy-low-small-testnet"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://juicy-low-small-testnet.explorer.testnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:110858}},testnet:!0}),nS=(0,C.a)({id:1482601649,name:"SKALE | Nebula Gaming Hub",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/green-giddy-denebola"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/green-giddy-denebola"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://green-giddy-denebola.explorer.mainnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:2372986}}}),nI=(0,C.a)({id:1564830818,name:"SKALE | Calypso NFT Hub",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/honorable-steel-rasalhague"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/honorable-steel-rasalhague"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://honorable-steel-rasalhague.explorer.mainnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3107626}}}),nj=(0,C.a)({id:16666e5,name:"Harmony One",nativeCurrency:{name:"Harmony",symbol:"ONE",decimals:18},rpcUrls:{default:{http:["https://rpc.ankr.com/harmony"]}},blockExplorers:{default:{name:"Harmony Explorer",url:"https://explorer.harmony.one"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:24185753}}}),nT=(0,C.a)({id:2046399126,name:"SKALE | Europa Liquidity Hub",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/elated-tan-skat"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/elated-tan-skat"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://elated-tan-skat.explorer.mainnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3113495}}}),nP=(0,C.a)({id:2139927552,name:"SKALE | Exorde",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/light-vast-diphda"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/light-vast-diphda"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://light-vast-diphda.explorer.mainnet.skalenodes.com"}},contracts:{}}),nM=(0,C.a)({id:11297108099,name:"Palm Testnet",nativeCurrency:{decimals:18,name:"PALM",symbol:"PALM"},rpcUrls:{default:{http:["https://palm-mainnet.public.blastapi.io"],webSocket:["wss://palm-mainnet.public.blastapi.io"]}},blockExplorers:{default:{name:"Chainlens",url:"https://palm.chainlens.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:15429248}},testnet:!0}),nO=(0,C.a)({id:11297108109,name:"Palm",nativeCurrency:{decimals:18,name:"PALM",symbol:"PALM"},rpcUrls:{default:{http:["https://palm-mainnet.public.blastapi.io"],webSocket:["wss://palm-mainnet.public.blastapi.io"]}},blockExplorers:{default:{name:"Chainlens",url:"https://palm.chainlens.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:15429248}}}),nR=(0,C.a)({id:107107114116,name:"Kakarot Sepolia",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia-rpc.kakarot.org"]}},blockExplorers:{default:{name:"Kakarot Scan",url:"https://sepolia.kakarotscan.org"}},testnet:!0}),nU={...E,id:8996,name:"Ganache",network:"ganache",rpcUrls:{default:{http:["http://127.0.0.1:8545"]}}},nF=[x.R,A,K,V,Z,J,X,Y,$,ee,et,er,en,ea,eo,ei,es,el,ec,eu,ed,ep,eh,ef,em,eb,eg,ey,ev,ew,eC,eE,ex,eA,ek,eB,eS,eI,ej,eT,eP,eM,eO,eR,e_,eL,ez,eq,eG,eW,eH,eQ,eK,eV,eZ,eJ,eX,eY,e$,e0,e1,e6,e3,e2,e7,e8,e5,e4,e9,te,tt,tr,tn,ta,to,ti,ts,tl,tc,tu,td,tp,th,tf,tm,tb,tg,ty,tv,tw,tC,tE,tx,tA,tk,tB,tS,tI,tj,tT,tP,tM,tO,tR,tU,tF,tN,tD,t_,tL,tz,tq,tG,tW,tH,tQ,tK,tV,tZ,tJ,tX,tY,t$,t0,t1,t6,t3,t2,t7,t8,t5,t4,t9,re,rt,rr,rn,ra,ro,ri,rs,rl,rc,ru,rd,rp,rh,rf,rm,rb,rg,ry,rv,E,rw,rC,rE,rx,rA,rk,rB,rT,rP,rM,rO,rR,rU,rF,rN,rD,r_,rL,rz,rq,rG,rW,rH,rQ,rK,rV,rZ,rJ,rX,rY,r$,r0,r1,r6,r3,r2,r7,r8,r5,r4,r9,ne,nt,nr,nn,na,no,ni,ns,nl,nc,nu,nd,np,nh,nf,nm,nb,ng,ny,nv,nw,nC,nE,nx,nA,nk,nB,nS,nI,nj,nT,nP,nM,nO,nR,nU];var nN=n(27061);function App(e){let{Component:t,pageProps:n}=e,c=(0,s.vX)({appName:"Ocean Node Dashboard",projectId:nN.env.NEXT_PUBLIC_WALLET_CONNECT_ID?nN.env.NEXT_PUBLIC_WALLET_CONNECT_ID:"da267f7e1897e2cf92a7710f92e8f660",chains:nF,ssr:!0}),u=new v;return(0,o.jsx)(l.F,{config:c,children:(0,o.jsx)(w.aH,{client:u,children:(0,o.jsx)(s.pj,{children:(0,o.jsx)(i.I,{children:(0,o.jsx)(t,{...n})})})})})}},56953:function(){},32352:function(){},92592:function(e,t,n){let o=n(47138),i=n(95115),s=n(6907),l=n(93776);function renderCanvas(e,t,n,s,l){let c=[].slice.call(arguments,1),u=c.length,d="function"==typeof c[u-1];if(!d&&!o())throw Error("Callback required as last argument");if(d){if(u<2)throw Error("Too few arguments provided");2===u?(l=n,n=t,t=s=void 0):3===u&&(t.getContext&&void 0===l?(l=s,s=void 0):(l=s,s=n,n=t,t=void 0))}else{if(u<1)throw Error("Too few arguments provided");return 1===u?(n=t,t=s=void 0):2!==u||t.getContext||(s=n,n=t,t=void 0),new Promise(function(o,l){try{let l=i.create(n,s);o(e(l,t,s))}catch(e){l(e)}})}try{let o=i.create(n,s);l(null,e(o,t,s))}catch(e){l(e)}}t.create=i.create,t.toCanvas=renderCanvas.bind(null,s.render),t.toDataURL=renderCanvas.bind(null,s.renderToDataURL),t.toString=renderCanvas.bind(null,function(e,t,n){return l.render(e,n)})},47138:function(e){e.exports=function(){return"function"==typeof Promise&&Promise.prototype&&Promise.prototype.then}},21845:function(e,t,n){let o=n(10242).getSymbolSize;t.getRowColCoords=function(e){if(1===e)return[];let t=Math.floor(e/7)+2,n=o(e),i=145===n?26:2*Math.ceil((n-13)/(2*t-2)),s=[n-7];for(let e=1;e>>7-e%8&1)==1},put:function(e,t){for(let n=0;n>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){let t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},e.exports=BitBuffer},73280:function(e){function BitMatrix(e){if(!e||e<1)throw Error("BitMatrix size must be defined and greater than 0");this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}BitMatrix.prototype.set=function(e,t,n,o){let i=e*this.size+t;this.data[i]=n,o&&(this.reservedBit[i]=!0)},BitMatrix.prototype.get=function(e,t){return this.data[e*this.size+t]},BitMatrix.prototype.xor=function(e,t,n){this.data[e*this.size+t]^=n},BitMatrix.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]},e.exports=BitMatrix},43424:function(e,t,n){let o=n(62378),i=n(76910);function ByteData(e){this.mode=i.BYTE,"string"==typeof e&&(e=o(e)),this.data=new Uint8Array(e)}ByteData.getBitsLength=function(e){return 8*e},ByteData.prototype.getLength=function(){return this.data.length},ByteData.prototype.getBitsLength=function(){return ByteData.getBitsLength(this.data.length)},ByteData.prototype.write=function(e){for(let t=0,n=this.data.length;t=0&&e.bit<4},t.from=function(e,n){if(t.isValid(e))return e;try{return function(e){if("string"!=typeof e)throw Error("Param is not a string");let n=e.toLowerCase();switch(n){case"l":case"low":return t.L;case"m":case"medium":return t.M;case"q":case"quartile":return t.Q;case"h":case"high":return t.H;default:throw Error("Unknown EC Level: "+e)}}(e)}catch(e){return n}}},76526:function(e,t,n){let o=n(10242).getSymbolSize;t.getPositions=function(e){let t=o(e);return[[0,0],[t-7,0],[0,t-7]]}},61642:function(e,t,n){let o=n(10242),i=o.getBCHDigit(1335);t.getEncodedBits=function(e,t){let n=e.bit<<3|t,s=n<<10;for(;o.getBCHDigit(s)-i>=0;)s^=1335<=33088&&n<=40956)n-=33088;else if(n>=57408&&n<=60351)n-=49472;else throw Error("Invalid SJIS character: "+this.data[t]+"\nMake sure your charset is UTF-8");n=(n>>>8&255)*192+(255&n),e.put(n,13)}},e.exports=KanjiData},27126:function(e,t){t.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};let n={N1:3,N2:3,N3:40,N4:10};t.isValid=function(e){return null!=e&&""!==e&&!isNaN(e)&&e>=0&&e<=7},t.from=function(e){return t.isValid(e)?parseInt(e,10):void 0},t.getPenaltyN1=function(e){let t=e.size,o=0,i=0,s=0,l=null,c=null;for(let u=0;u=5&&(o+=n.N1+(i-5)),l=t,i=1),(t=e.get(d,u))===c?s++:(s>=5&&(o+=n.N1+(s-5)),c=t,s=1)}i>=5&&(o+=n.N1+(i-5)),s>=5&&(o+=n.N1+(s-5))}return o},t.getPenaltyN2=function(e){let t=e.size,o=0;for(let n=0;n=10&&(1488===i||93===i)&&o++,s=s<<1&2047|e.get(l,n),l>=10&&(1488===s||93===s)&&o++}return o*n.N3},t.getPenaltyN4=function(e){let t=0,o=e.data.length;for(let n=0;n=1&&t<10?e.ccBits[0]:t<27?e.ccBits[1]:e.ccBits[2]},t.getBestModeForData=function(e){return i.testNumeric(e)?t.NUMERIC:i.testAlphanumeric(e)?t.ALPHANUMERIC:i.testKanji(e)?t.KANJI:t.BYTE},t.toString=function(e){if(e&&e.id)return e.id;throw Error("Invalid mode")},t.isValid=function(e){return e&&e.bit&&e.ccBits},t.from=function(e,n){if(t.isValid(e))return e;try{return function(e){if("string"!=typeof e)throw Error("Param is not a string");let n=e.toLowerCase();switch(n){case"numeric":return t.NUMERIC;case"alphanumeric":return t.ALPHANUMERIC;case"kanji":return t.KANJI;case"byte":return t.BYTE;default:throw Error("Unknown mode: "+e)}}(e)}catch(e){return n}}},41085:function(e,t,n){let o=n(76910);function NumericData(e){this.mode=o.NUMERIC,this.data=e.toString()}NumericData.getBitsLength=function(e){return 10*Math.floor(e/3)+(e%3?e%3*3+1:0)},NumericData.prototype.getLength=function(){return this.data.length},NumericData.prototype.getBitsLength=function(){return NumericData.getBitsLength(this.data.length)},NumericData.prototype.write=function(e){let t,n;for(t=0;t+3<=this.data.length;t+=3)n=parseInt(this.data.substr(t,3),10),e.put(n,10);let o=this.data.length-t;o>0&&(n=parseInt(this.data.substr(t),10),e.put(n,3*o+1))},e.exports=NumericData},26143:function(e,t,n){let o=n(69729);t.mul=function(e,t){let n=new Uint8Array(e.length+t.length-1);for(let i=0;i=0;){let e=n[0];for(let i=0;i>o&1)==1,o<6?e.set(o,8,i,!0):o<8?e.set(o+1,8,i,!0):e.set(s-15+o,8,i,!0),o<8?e.set(8,s-o-1,i,!0):o<9?e.set(8,15-o-1+1,i,!0):e.set(8,15-o-1,i,!0);e.set(s-8,8,1,!0)}t.create=function(e,t){let n,b;if(void 0===e||""===e)throw Error("No input text");let v=i.M;return void 0!==t&&(v=i.from(t.errorCorrectionLevel,i.M),n=m.from(t.version),b=d.from(t.maskPattern),t.toSJISFunc&&o.setToSJISFunction(t.toSJISFunc)),function(e,t,n,i){let b;if(Array.isArray(e))b=y.fromArray(e);else if("string"==typeof e){let o=t;if(!o){let t=y.rawSplit(e);o=m.getBestVersionForData(t,n)}b=y.fromString(e,o||40)}else throw Error("Invalid data");let v=m.getBestVersionForData(b,n);if(!v)throw Error("The amount of data is too big to be stored in a QR Code");if(t){if(t=0&&t<=6&&(0===o||6===o)||o>=0&&o<=6&&(0===t||6===t)||t>=2&&t<=4&&o>=2&&o<=4?e.set(i+t,s+o,!0,!0):e.set(i+t,s+o,!1,!0))}}(E,t),function(e){let t=e.size;for(let n=8;n=7&&function(e,t){let n,o,i;let s=e.size,l=m.getEncodedBits(t);for(let t=0;t<18;t++)n=Math.floor(t/3),o=t%3+s-8-3,i=(l>>t&1)==1,e.set(n,o,i,!0),e.set(o,n,i,!0)}(E,t),function(e,t){let n=e.size,o=-1,i=n-1,s=7,l=0;for(let c=n-1;c>0;c-=2)for(6===c&&c--;;){for(let n=0;n<2;n++)if(!e.isReserved(i,c-n)){let o=!1;l>>s&1)==1),e.set(i,c-n,o),-1==--s&&(l++,s=7)}if((i+=o)<0||n<=i){i-=o,o=-o;break}}}(E,w),isNaN(i)&&(i=d.getBestMask(E,setupFormatInfo.bind(null,E,n))),d.applyMask(i,E),setupFormatInfo(E,n,i),{modules:E,version:t,errorCorrectionLevel:n,maskPattern:i,segments:b}}(e,n,v,b)}},52882:function(e,t,n){let o=n(26143);function ReedSolomonEncoder(e){this.genPoly=void 0,this.degree=e,this.degree&&this.initialize(this.degree)}ReedSolomonEncoder.prototype.initialize=function(e){this.degree=e,this.genPoly=o.generateECPolynomial(this.degree)},ReedSolomonEncoder.prototype.encode=function(e){if(!this.genPoly)throw Error("Encoder not initialized");let t=new Uint8Array(e.length+this.degree);t.set(e);let n=o.mod(t,this.genPoly),i=this.degree-n.length;if(i>0){let e=new Uint8Array(this.degree);return e.set(n,i),e}return n},e.exports=ReedSolomonEncoder},7007:function(e,t){let n="[0-9]+",o="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";o=o.replace(/u/g,"\\u");let i="(?:(?![A-Z0-9 $%*+\\-./:]|"+o+")(?:.|[\r\n]))+";t.KANJI=RegExp(o,"g"),t.BYTE_KANJI=RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),t.BYTE=RegExp(i,"g"),t.NUMERIC=RegExp(n,"g"),t.ALPHANUMERIC=RegExp("[A-Z $%*+\\-./:]+","g");let s=RegExp("^"+o+"$"),l=RegExp("^"+n+"$"),c=RegExp("^[A-Z0-9 $%*+\\-./:]+$");t.testKanji=function(e){return s.test(e)},t.testNumeric=function(e){return l.test(e)},t.testAlphanumeric=function(e){return c.test(e)}},16130:function(e,t,n){let o=n(76910),i=n(41085),s=n(8260),l=n(43424),c=n(35442),u=n(7007),d=n(10242),p=n(65987);function getStringByteLength(e){return unescape(encodeURIComponent(e)).length}function getSegments(e,t,n){let o;let i=[];for(;null!==(o=e.exec(n));)i.push({data:o[0],index:o.index,mode:t,length:o[0].length});return i}function getSegmentsFromString(e){let t,n;let i=getSegments(u.NUMERIC,o.NUMERIC,e),s=getSegments(u.ALPHANUMERIC,o.ALPHANUMERIC,e);d.isKanjiModeEnabled()?(t=getSegments(u.BYTE,o.BYTE,e),n=getSegments(u.KANJI,o.KANJI,e)):(t=getSegments(u.BYTE_KANJI,o.BYTE,e),n=[]);let l=i.concat(s,t,n);return l.sort(function(e,t){return e.index-t.index}).map(function(e){return{data:e.data,mode:e.mode,length:e.length}})}function getSegmentBitsLength(e,t){switch(t){case o.NUMERIC:return i.getBitsLength(e);case o.ALPHANUMERIC:return s.getBitsLength(e);case o.KANJI:return c.getBitsLength(e);case o.BYTE:return l.getBitsLength(e)}}function buildSingleSegment(e,t){let n;let u=o.getBestModeForData(e);if((n=o.from(t,u))!==o.BYTE&&n.bit=0?e[e.length-1]:null;return n&&n.mode===t.mode?e[e.length-1].data+=t.data:e.push(t),e},[]))},t.rawSplit=function(e){return t.fromArray(getSegmentsFromString(e,d.isKanjiModeEnabled()))}},10242:function(e,t){let n;let o=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];t.getSymbolSize=function(e){if(!e)throw Error('"version" cannot be null or undefined');if(e<1||e>40)throw Error('"version" should be in range from 1 to 40');return 4*e+17},t.getSymbolTotalCodewords=function(e){return o[e]},t.getBCHDigit=function(e){let t=0;for(;0!==e;)t++,e>>>=1;return t},t.setToSJISFunction=function(e){if("function"!=typeof e)throw Error('"toSJISFunc" is not a valid function.');n=e},t.isKanjiModeEnabled=function(){return void 0!==n},t.toSJIS=function(e){return n(e)}},43114:function(e,t){t.isValid=function(e){return!isNaN(e)&&e>=1&&e<=40}},23103:function(e,t,n){let o=n(10242),i=n(35393),s=n(64908),l=n(76910),c=n(43114),u=o.getBCHDigit(7973);function getReservedBitsCount(e,t){return l.getCharCountIndicator(e,t)+4}t.from=function(e,t){return c.isValid(e)?parseInt(e,10):t},t.getCapacity=function(e,t,n){if(!c.isValid(e))throw Error("Invalid QR Code version");void 0===n&&(n=l.BYTE);let s=o.getSymbolTotalCodewords(e),u=i.getTotalCodewordsCount(e,t),d=(s-u)*8;if(n===l.MIXED)return d;let p=d-getReservedBitsCount(n,e);switch(n){case l.NUMERIC:return Math.floor(p/10*3);case l.ALPHANUMERIC:return Math.floor(p/11*2);case l.KANJI:return Math.floor(p/13);case l.BYTE:default:return Math.floor(p/8)}},t.getBestVersionForData=function(e,n){let o;let i=s.from(n,s.M);if(Array.isArray(e)){if(e.length>1)return function(e,n){for(let o=1;o<=40;o++){let i=function(e,t){let n=0;return e.forEach(function(e){let o=getReservedBitsCount(e.mode,t);n+=o+e.getBitsLength()}),n}(e,o);if(i<=t.getCapacity(o,n,l.MIXED))return o}}(e,i);if(0===e.length)return 1;o=e[0]}else o=e;return function(e,n,o){for(let i=1;i<=40;i++)if(n<=t.getCapacity(i,o,e))return i}(o.mode,o.getLength(),i)},t.getEncodedBits=function(e){if(!c.isValid(e)||e<7)throw Error("Invalid QR Code version");let t=e<<12;for(;o.getBCHDigit(t)-u>=0;)t^=7973<':"",d="0&&u>0&&e[c-1]||(o+=s?svgCmd("M",u+n,.5+d+n):svgCmd("m",i,0),i=0,s=!1),u+1',p=i.width?'width="'+i.width+'" height="'+i.width+'" ':"",f=''+u+d+"\n";return"function"==typeof n&&n(null,f),f}},89653:function(e,t){function hex2rgba(e){if("number"==typeof e&&(e=e.toString()),"string"!=typeof e)throw Error("Color should be defined as hex string");let t=e.slice().replace("#","").split("");if(t.length<3||5===t.length||t.length>8)throw Error("Invalid hex color: "+e);(3===t.length||4===t.length)&&(t=Array.prototype.concat.apply([],t.map(function(e){return[e,e]}))),6===t.length&&t.push("F","F");let n=parseInt(t.join(""),16);return{r:n>>24&255,g:n>>16&255,b:n>>8&255,a:255&n,hex:"#"+t.slice(0,6).join("")}}t.getOptions=function(e){e||(e={}),e.color||(e.color={});let t=void 0===e.margin||null===e.margin||e.margin<0?4:e.margin,n=e.width&&e.width>=21?e.width:void 0,o=e.scale||4;return{width:n,scale:n?4:o,margin:t,color:{dark:hex2rgba(e.color.dark||"#000000ff"),light:hex2rgba(e.color.light||"#ffffffff")},type:e.type,rendererOpts:e.rendererOpts||{}}},t.getScale=function(e,t){return t.width&&t.width>=e+2*t.margin?t.width/(e+2*t.margin):t.scale},t.getImageWidth=function(e,n){let o=t.getScale(e,n);return Math.floor((e+2*n.margin)*o)},t.qrToImageData=function(e,n,o){let i=n.modules.size,s=n.modules.data,l=t.getScale(i,o),c=Math.floor((i+2*o.margin)*l),u=o.margin*l,d=[o.color.light,o.color.dark];for(let t=0;t=u&&n>=u&&tt.indexOf(o)&&(n[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,o=Object.getOwnPropertySymbols(e);it.indexOf(o[i])&&Object.prototype.propertyIsEnumerable.call(e,o[i])&&(n[o[i]]=e[o[i]]);return n}function __decorate(e,t,n,o){var i,s=arguments.length,l=s<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,n,o);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(l=(s<3?i(l):s>3?i(t,n,l):i(t,n))||l);return s>3&&l&&Object.defineProperty(t,n,l),l}function __param(e,t){return function(n,o){t(n,o,e)}}function __metadata(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function __awaiter(e,t,n,o){return new(n||(n=Promise))(function(i,s){function fulfilled(e){try{step(o.next(e))}catch(e){s(e)}}function rejected(e){try{step(o.throw(e))}catch(e){s(e)}}function step(e){var t;e.done?i(e.value):((t=e.value)instanceof n?t:new n(function(e){e(t)})).then(fulfilled,rejected)}step((o=o.apply(e,t||[])).next())})}function __generator(e,t){var n,o,i,s,l={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return s={next:verb(0),throw:verb(1),return:verb(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function verb(s){return function(c){return function(s){if(n)throw TypeError("Generator is already executing.");for(;l;)try{if(n=1,o&&(i=2&s[0]?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[2&s[0],i.value]),s[0]){case 0:case 1:i=s;break;case 4:return l.label++,{value:s[1],done:!1};case 5:l.label++,o=s[1],s=[0];continue;case 7:s=l.ops.pop(),l.trys.pop();continue;default:if(!(i=(i=l.trys).length>0&&i[i.length-1])&&(6===s[0]||2===s[0])){l=0;continue}if(3===s[0]&&(!i||s[1]>i[0]&&s[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var o,i,s=n.call(e),l=[];try{for(;(void 0===t||t-- >0)&&!(o=s.next()).done;)l.push(o.value)}catch(e){i={error:e}}finally{try{o&&!o.done&&(n=s.return)&&n.call(s)}finally{if(i)throw i.error}}return l}function __spread(){for(var e=[],t=0;t1||resume(e,t)})})}function resume(e,t){try{var n;(n=i[e](t)).value instanceof __await?Promise.resolve(n.value.v).then(fulfill,reject):settle(s[0][2],n)}catch(e){settle(s[0][3],e)}}function fulfill(e){resume("next",e)}function reject(e){resume("throw",e)}function settle(e,t){e(t),s.shift(),s.length&&resume(s[0][0],s[0][1])}}function __asyncDelegator(e){var t,n;return t={},verb("next"),verb("throw",function(e){throw e}),verb("return"),t[Symbol.iterator]=function(){return this},t;function verb(o,i){t[o]=e[o]?function(t){return(n=!n)?{value:__await(e[o](t)),done:"return"===o}:i?i(t):t}:i}}function __asyncValues(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=__values(e),t={},verb("next"),verb("throw"),verb("return"),t[Symbol.asyncIterator]=function(){return this},t);function verb(n){t[n]=e[n]&&function(t){return new Promise(function(o,i){!function(e,t,n,o){Promise.resolve(o).then(function(t){e({value:t,done:n})},t)}(o,i,(t=e[n](t)).done,t.value)})}}}function __makeTemplateObject(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var i=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t};function __importStar(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&o(t,e,n);return i(t,e),t}function __importDefault(e){return e&&e.__esModule?e:{default:e}}function __classPrivateFieldGet(e,t,n,o){if("a"===n&&!o)throw TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!o:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?o:"a"===n?o.call(e):o?o.value:t.get(e)}function __classPrivateFieldSet(e,t,n,o,i){if("m"===o)throw TypeError("Private method is not writable");if("a"===o&&!i)throw TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!i:!t.has(e))throw TypeError("Cannot write private member to an object whose class did not declare it");return"a"===o?i.call(e,n):i?i.value=n:t.set(e,n),n}function __classPrivateFieldIn(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)}},42238:function(e,t,n){var o;!function(i,s){"use strict";var l="function",c="undefined",u="object",d="string",p="major",f="model",m="name",b="type",g="vendor",y="version",v="architecture",w="console",C="mobile",E="tablet",x="smarttv",A="wearable",k="embedded",B="Amazon",S="Apple",I="ASUS",j="BlackBerry",T="Browser",P="Chrome",M="Firefox",O="Google",R="Huawei",U="Microsoft",F="Motorola",N="Opera",D="Samsung",_="Sharp",L="Sony",z="Xiaomi",q="Zebra",G="Facebook",W="Chromium OS",H="Mac OS",extend=function(e,t){var n={};for(var o in e)t[o]&&t[o].length%2==0?n[o]=t[o].concat(e[o]):n[o]=e[o];return n},enumerize=function(e){for(var t={},n=0;n0?2===c.length?typeof c[1]==l?this[c[0]]=c[1].call(this,p):this[c[0]]=c[1]:3===c.length?typeof c[1]!==l||c[1].exec&&c[1].test?this[c[0]]=p?p.replace(c[1],c[2]):s:this[c[0]]=p?c[1].call(this,p,c[2]):s:4===c.length&&(this[c[0]]=p?c[3].call(this,p.replace(c[1],c[2])):s):this[c]=p||s;f+=2}},strMapper=function(e,t){for(var n in t)if(typeof t[n]===u&&t[n].length>0){for(var o=0;o2&&(e[f]="iPad",e[b]=E),e},this.getEngine=function(){var e={};return e[m]=s,e[y]=s,rgxMapper.call(e,o,x.engine),e},this.getOS=function(){var e={};return e[m]=s,e[y]=s,rgxMapper.call(e,o,x.os),A&&!e[m]&&w&&"Unknown"!=w.platform&&(e[m]=w.platform.replace(/chrome os/i,W).replace(/macos/i,H)),e},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return o},this.setUA=function(e){return o=typeof e===d&&e.length>500?trim(e,500):e,this},this.setUA(o),this};UAParser.VERSION="1.0.37",UAParser.BROWSER=enumerize([m,y,p]),UAParser.CPU=enumerize([v]),UAParser.DEVICE=enumerize([f,g,b,w,C,x,E,A,k]),UAParser.ENGINE=UAParser.OS=enumerize([m,y]),typeof t!==c?(e.exports&&(t=e.exports=UAParser),t.UAParser=UAParser):n.amdO?s!==(o=(function(){return UAParser}).call(t,n,t,e))&&(e.exports=o):typeof i!==c&&(i.UAParser=UAParser);var V=typeof i!==c&&(i.jQuery||i.Zepto);if(V&&!V.ua){var Z=new UAParser;V.ua=Z.getResult(),V.ua.get=function(){return Z.getUA()},V.ua.set=function(e){Z.setUA(e);var t=Z.getResult();for(var n in t)V.ua[n]=t[n]}}}("object"==typeof window?window:this)},53250:function(e,t,n){"use strict";/** +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2888],{65987:function(e){"use strict";var t={single_source_shortest_paths:function(e,n,o){var i,s,l,c,u,d,p,f={},m={};m[n]=0;var g=t.PriorityQueue.make();for(g.push(n,0);!g.empty();)for(l in s=(i=g.pop()).value,c=i.cost,u=e[s]||{})u.hasOwnProperty(l)&&(d=c+u[l],p=m[l],(void 0===m[l]||p>d)&&(m[l]=d,g.push(l,d),f[l]=s));if(void 0!==o&&void 0===m[o])throw Error(["Could not find a path from ",n," to ",o,"."].join(""));return f},extract_shortest_path_from_predecessor_list:function(e,t){for(var n=[],o=t;o;)n.push(o),e[o],o=e[o];return n.reverse(),n},find_path:function(e,n,o){var i=t.single_source_shortest_paths(e,n,o);return t.extract_shortest_path_from_predecessor_list(i,o)},PriorityQueue:{make:function(e){var n,o=t.PriorityQueue,i={};for(n in e=e||{},o)o.hasOwnProperty(n)&&(i[n]=o[n]);return i.queue=[],i.sorter=e.sorter||o.default_sorter,i},default_sorter:function(e,t){return e.cost-t.cost},push:function(e,t){this.queue.push({value:e,cost:t}),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return 0===this.queue.length}}};e.exports=t},62378:function(e){"use strict";e.exports=function(e){for(var t=[],n=e.length,o=0;o=55296&&i<=56319&&n>o+1){var s=e.charCodeAt(o+1);s>=56320&&s<=57343&&(i=(i-55296)*1024+s-56320+65536,o+=1)}if(i<128){t.push(i);continue}if(i<2048){t.push(i>>6|192),t.push(63&i|128);continue}if(i<55296||i>=57344&&i<65536){t.push(i>>12|224),t.push(i>>6&63|128),t.push(63&i|128);continue}if(i>=65536&&i<=1114111){t.push(i>>18|240),t.push(i>>12&63|128),t.push(i>>6&63|128),t.push(63&i|128);continue}t.push(239,191,189)}return new Uint8Array(t).buffer}},26729:function(e){"use strict";var t=Object.prototype.hasOwnProperty,n="~";function Events(){}function EE(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function addListener(e,t,o,i,s){if("function"!=typeof o)throw TypeError("The listener must be a function");var l=new EE(o,i||e,s),c=n?n+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],l]:e._events[c].push(l):(e._events[c]=l,e._eventsCount++),e}function clearEvent(e,t){0==--e._eventsCount?e._events=new Events:delete e._events[t]}function EventEmitter(){this._events=new Events,this._eventsCount=0}Object.create&&(Events.prototype=Object.create(null),new Events().__proto__||(n=!1)),EventEmitter.prototype.eventNames=function(){var e,o,i=[];if(0===this._eventsCount)return i;for(o in e=this._events)t.call(e,o)&&i.push(n?o.slice(1):o);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(e)):i},EventEmitter.prototype.listeners=function(e){var t=n?n+e:e,o=this._events[t];if(!o)return[];if(o.fn)return[o.fn];for(var i=0,s=o.length,l=Array(s);ie.trim());for(let n=0;n>4]+t[15&e[o]];return n}if("object"==typeof e&&"function"==typeof e.toJSON)return stringify(e.toJSON());switch(typeof e){case"boolean":case"symbol":case"number":return e.toString();case"bigint":return BigInt(e).toString();case"string":return JSON.stringify(e);case"object":{let t=Object.keys(e);return t.sort(),"{ "+t.map(t=>`${stringify(t)}: ${stringify(e[t])}`).join(", ")+" }"}}return"[ COULD NOT SERIALIZE ]"}function errors_assert(e,t,n,o){if(!e)throw function(e,t,n){let o,i=e;{let o=[];if(n){if("message"in n||"code"in n||"name"in n)throw Error(`value will overwrite populated values: ${stringify(n)}`);for(let e in n){if("shortMessage"===e)continue;let t=n[e];o.push(e+"="+stringify(t))}}o.push(`code=${t}`),o.push("version=6.11.1"),o.length&&(e+=" ("+o.join(", ")+")")}switch(t){case"INVALID_ARGUMENT":o=TypeError(e);break;case"NUMERIC_FAULT":case"BUFFER_OVERRUN":o=RangeError(e);break;default:o=Error(e)}return defineProperties(o,{code:t}),n&&Object.assign(o,n),null==o.shortMessage&&defineProperties(o,{shortMessage:i}),o}(t,n,o)}function assertArgument(e,t,n,o){errors_assert(e,t,"INVALID_ARGUMENT",{argument:n,value:o})}let u=["NFD","NFC","NFKD","NFKC"].reduce((e,t)=>{try{if("test"!=="test".normalize(t))throw Error("bad");if("NFD"===t){let e=String.fromCharCode(233).normalize("NFD"),t=String.fromCharCode(101,769);if(e!==t)throw Error("broken")}e.push(t)}catch(e){}return e},[]);function _getBytes(e,t,n){if(e instanceof Uint8Array)return n?new Uint8Array(e):e;if("string"==typeof e&&e.match(/^0x([0-9a-f][0-9a-f])*$/i)){let t=new Uint8Array((e.length-2)/2),n=2;for(let o=0;o>4]+d[15&o]}return n}function concat(e){return"0x"+e.map(e=>data_hexlify(e).substring(2)).join("")}function dataLength(e){return isHexString(e,!0)?(e.length-2)/2:data_getBytes(e).length}let p=!1,_keccak256=function(e){return(0,c.fr)(e)},f=_keccak256;function keccak256(e){let t=data_getBytes(e,"data");return data_hexlify(f(t))}keccak256._=_keccak256,keccak256.lock=function(){p=!0},keccak256.register=function(e){if(p)throw TypeError("keccak256 is locked");f=e},Object.freeze(keccak256);let m=BigInt(0),g=BigInt(36);function getChecksumAddress(e){e=e.toLowerCase();let t=e.substring(2).split(""),n=new Uint8Array(40);for(let e=0;e<40;e++)n[e]=t[e].charCodeAt(0);let o=data_getBytes(keccak256(n));for(let e=0;e<40;e+=2)o[e>>1]>>4>=8&&(t[e]=t[e].toUpperCase()),(15&o[e>>1])>=8&&(t[e+1]=t[e+1].toUpperCase());return"0x"+t.join("")}let b={};for(let e=0;e<10;e++)b[String(e)]=String(e);for(let e=0;e<26;e++)b[String.fromCharCode(65+e)]=String(10+e);let y=function(){let e={};for(let t=0;t<36;t++){let n="0123456789abcdefghijklmnopqrstuvwxyz"[t];e[n]=BigInt(t)}return e}();var v=n(11606),w=n(27499);/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */let C=BigInt(0),E=BigInt(1),x=BigInt(2),A=BigInt(3),k=BigInt(4),B=BigInt(5),S=BigInt(8);function modular_mod(e,t){let n=e%t;return n>=C?n:t+n}function pow2(e,t,n){let o=e;for(;t-- >C;)o*=o,o%=n;return o}function invert(e,t){if(e===C||t<=C)throw Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=modular_mod(e,t),o=t,i=C,s=E,l=E,c=C;for(;n!==C;){let e=o/n,t=o%n,u=i-l*e,d=s-c*e;o=n,n=t,i=l,s=c,l=u,c=d}let u=o;if(u!==E)throw Error("invert: does not exist");return modular_mod(i,t)}BigInt(9),BigInt(16);let I=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function nLength(e,t){let n=void 0!==t?t:e.toString(2).length;return{nBitLength:n,nByteLength:Math.ceil(n/8)}}function getFieldBytesLength(e){if("bigint"!=typeof e)throw Error("field order must be bigint");let t=e.toString(2).length;return Math.ceil(t/8)}function getMinHashLength(e){let t=getFieldBytesLength(e);return t+Math.ceil(t/2)}var j=n(93527),T=n(66409);let HMAC=class HMAC extends T.kb{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,(0,j.vp)(e);let n=(0,T.O0)(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;let o=this.blockLen,i=new Uint8Array(o);i.set(n.length>o?e.create().update(n).digest():n);for(let e=0;enew HMAC(e,t).update(n).digest();hmac.create=(e,t)=>new HMAC(e,t);/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */let P=BigInt(0),M=BigInt(1);function validateBasic(e){return!function(e){let t=I.reduce((e,t)=>(e[t]="function",e),{ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"});(0,w.FF)(e,t)}(e.Fp),(0,w.FF)(e,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...nLength(e.n,e.nBitLength),...e,p:e.Fp.ORDER})}let{bytesToNumberBE:O,hexToBytes:R}=w,U={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){let{Err:t}=U;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");let n=e[1],o=e.subarray(2,n+2);if(!n||o.length!==n)throw new t("Invalid signature integer: wrong length");if(128&o[0])throw new t("Invalid signature integer: negative");if(0===o[0]&&!(128&o[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:O(o),l:e.subarray(n+2)}},toSig(e){let{Err:t}=U,n="string"==typeof e?R(e):e;if(!(n instanceof Uint8Array))throw Error("ui8a expected");let o=n.length;if(o<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==o-2)throw new t("Invalid signature: incorrect length");let{d:i,l:s}=U._parseInt(n.subarray(2)),{d:l,l:c}=U._parseInt(s);if(c.length)throw new t("Invalid signature: left bytes after parsing");return{r:i,s:l}},hexFromSig(e){let slice=e=>8&Number.parseInt(e[0],16)?"00"+e:e,h=e=>{let t=e.toString(16);return 1&t.length?`0${t}`:t},t=slice(h(e.s)),n=slice(h(e.r)),o=t.length/2,i=n.length/2,s=h(o),l=h(i);return`30${h(i+o+4)}02${l}${n}02${s}${t}`}},F=BigInt(0),N=BigInt(1),D=(BigInt(2),BigInt(3));BigInt(4);/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */let _=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),L=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),z=BigInt(1),q=BigInt(2),divNearest=(e,t)=>(e+t/q)/t,G=function(e,t,n=!1,o={}){if(e<=C)throw Error(`Expected Field ORDER > 0, got ${e}`);let{nBitLength:i,nByteLength:s}=nLength(e,t);if(s>2048)throw Error("Field lengths over 2048 bytes are not supported");let l=function(e){if(e%k===A){let t=(e+E)/k;return function(e,n){let o=e.pow(n,t);if(!e.eql(e.sqr(o),n))throw Error("Cannot find square root");return o}}if(e%S===B){let t=(e-B)/S;return function(e,n){let o=e.mul(n,x),i=e.pow(o,t),s=e.mul(n,i),l=e.mul(e.mul(s,x),i),c=e.mul(s,e.sub(l,e.ONE));if(!e.eql(e.sqr(c),n))throw Error("Cannot find square root");return c}}return function(e){let t,n,o;let i=(e-E)/x;for(t=e-E,n=0;t%x===C;t/=x,n++);for(o=x;o 0");if(n===E)return C;let o=E;for(;t>C;)t&E&&(o=o*e%n),e=e*e%n,t>>=E;return o}(o,i,e)!==e-E;o++);if(1===n){let t=(e+E)/k;return function(e,n){let o=e.pow(n,t);if(!e.eql(e.sqr(o),n))throw Error("Cannot find square root");return o}}let s=(t+E)/x;return function(e,l){if(e.pow(l,i)===e.neg(e.ONE))throw Error("Cannot find square root");let c=n,u=e.pow(e.mul(e.ONE,o),t),d=e.pow(l,s),p=e.pow(l,t);for(;!e.eql(p,e.ONE);){if(e.eql(p,e.ZERO))return e.ZERO;let t=1;for(let n=e.sqr(p);tmodular_mod(t,e),isValid:t=>{if("bigint"!=typeof t)throw Error(`Invalid field element: expected bigint, got ${typeof t}`);return C<=t&&te===C,isOdd:e=>(e&E)===E,neg:t=>modular_mod(-t,e),eql:(e,t)=>e===t,sqr:t=>modular_mod(t*t,e),add:(t,n)=>modular_mod(t+n,e),sub:(t,n)=>modular_mod(t-n,e),mul:(t,n)=>modular_mod(t*n,e),pow:(e,t)=>(function(e,t,n){if(n 0");if(n===C)return e.ONE;if(n===E)return t;let o=e.ONE,i=t;for(;n>C;)n&E&&(o=e.mul(o,i)),i=e.sqr(i),n>>=E;return o})(c,e,t),div:(t,n)=>modular_mod(t*invert(n,e),e),sqrN:e=>e*e,addN:(e,t)=>e+t,subN:(e,t)=>e-t,mulN:(e,t)=>e*t,inv:t=>invert(t,e),sqrt:o.sqrt||(e=>l(c,e)),invertBatch:e=>(function(e,t){let n=Array(t.length),o=t.reduce((t,o,i)=>e.is0(o)?t:(n[i]=t,e.mul(t,o)),e.ONE),i=e.inv(o);return t.reduceRight((t,o,i)=>e.is0(o)?t:(n[i]=e.mul(t,n[i]),e.mul(t,o)),i),n})(c,e),cmov:(e,t,n)=>n?t:e,toBytes:e=>n?(0,w.S5)(e,s):(0,w.tL)(e,s),fromBytes:e=>{if(e.length!==s)throw Error(`Fp.fromBytes: expected ${s}, got ${e.length}`);return n?(0,w.ty)(e):(0,w.bytesToNumberBE)(e)}});return Object.freeze(c)}(_,void 0,void 0,{sqrt:function(e){let t=BigInt(3),n=BigInt(6),o=BigInt(11),i=BigInt(22),s=BigInt(23),l=BigInt(44),c=BigInt(88),u=e*e*e%_,d=u*u*e%_,p=pow2(d,t,_)*d%_,f=pow2(p,t,_)*d%_,m=pow2(f,q,_)*u%_,g=pow2(m,o,_)*m%_,b=pow2(g,i,_)*g%_,y=pow2(b,l,_)*b%_,v=pow2(y,c,_)*y%_,w=pow2(v,l,_)*b%_,C=pow2(w,t,_)*d%_,E=pow2(C,s,_)*g%_,x=pow2(E,n,_)*u%_,A=pow2(x,q,_);if(!G.eql(G.sqr(A),e))throw Error("Cannot find square root");return A}}),W=function(e,t){let create=t=>(function(e){let t=function(e){let t=validateBasic(e);return w.FF(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}(e),{Fp:n,n:o}=t,i=n.BYTES+1,s=2*n.BYTES+1;function modN(e){return modular_mod(e,o)}let{ProjectivePoint:l,normPrivateKeyToScalar:c,weierstrassEquation:u,isWithinCurveOrder:d}=function(e){let t=/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function(e){let t=validateBasic(e);w.FF(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});let{endo:n,Fp:o,a:i}=t;if(n){if(!o.eql(i,o.ZERO))throw Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}(e),{Fp:n}=t,o=t.toBytes||((e,t,o)=>{let i=t.toAffine();return w.eV(Uint8Array.from([4]),n.toBytes(i.x),n.toBytes(i.y))}),i=t.fromBytes||(e=>{let t=e.subarray(1),o=n.fromBytes(t.subarray(0,n.BYTES)),i=n.fromBytes(t.subarray(n.BYTES,2*n.BYTES));return{x:o,y:i}});function weierstrassEquation(e){let{a:o,b:i}=t,s=n.sqr(e),l=n.mul(s,e);return n.add(n.add(l,n.mul(e,o)),i)}if(!n.eql(n.sqr(t.Gy),weierstrassEquation(t.Gx)))throw Error("bad generator point: equation left != right");function isWithinCurveOrder(e){return"bigint"==typeof e&&Fn.eql(e,n.ZERO);return is0(t)&&is0(o)?Point.ZERO:new Point(t,o,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){let t=n.invertBatch(e.map(e=>e.pz));return e.map((e,n)=>e.toAffine(t[n])).map(Point.fromAffine)}static fromHex(e){let t=Point.fromAffine(i((0,w.ql)("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return Point.BASE.multiply(normPrivateKeyToScalar(e))}_setWindowSize(e){this._WINDOW_SIZE=e,s.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint&&!n.is0(this.py))return;throw Error("bad point: ZERO")}let{x:e,y:o}=this.toAffine();if(!n.isValid(e)||!n.isValid(o))throw Error("bad point: x or y not FE");let i=n.sqr(o),s=weierstrassEquation(e);if(!n.eql(i,s))throw Error("bad point: equation left != right");if(!this.isTorsionFree())throw Error("bad point: not in prime-order subgroup")}hasEvenY(){let{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw Error("Field doesn't support isOdd")}equals(e){assertPrjPoint(e);let{px:t,py:o,pz:i}=this,{px:s,py:l,pz:c}=e,u=n.eql(n.mul(t,c),n.mul(s,i)),d=n.eql(n.mul(o,c),n.mul(l,i));return u&&d}negate(){return new Point(this.px,n.neg(this.py),this.pz)}double(){let{a:e,b:o}=t,i=n.mul(o,D),{px:s,py:l,pz:c}=this,u=n.ZERO,d=n.ZERO,p=n.ZERO,f=n.mul(s,s),m=n.mul(l,l),g=n.mul(c,c),b=n.mul(s,l);return b=n.add(b,b),p=n.mul(s,c),p=n.add(p,p),u=n.mul(e,p),d=n.mul(i,g),d=n.add(u,d),u=n.sub(m,d),d=n.add(m,d),d=n.mul(u,d),u=n.mul(b,u),p=n.mul(i,p),g=n.mul(e,g),b=n.sub(f,g),b=n.mul(e,b),b=n.add(b,p),p=n.add(f,f),f=n.add(p,f),f=n.add(f,g),f=n.mul(f,b),d=n.add(d,f),g=n.mul(l,c),g=n.add(g,g),f=n.mul(g,b),u=n.sub(u,f),p=n.mul(g,m),p=n.add(p,p),p=n.add(p,p),new Point(u,d,p)}add(e){assertPrjPoint(e);let{px:o,py:i,pz:s}=this,{px:l,py:c,pz:u}=e,d=n.ZERO,p=n.ZERO,f=n.ZERO,m=t.a,g=n.mul(t.b,D),b=n.mul(o,l),y=n.mul(i,c),v=n.mul(s,u),w=n.add(o,i),C=n.add(l,c);w=n.mul(w,C),C=n.add(b,y),w=n.sub(w,C),C=n.add(o,s);let E=n.add(l,u);return C=n.mul(C,E),E=n.add(b,v),C=n.sub(C,E),E=n.add(i,s),d=n.add(c,u),E=n.mul(E,d),d=n.add(y,v),E=n.sub(E,d),f=n.mul(m,C),d=n.mul(g,v),f=n.add(d,f),d=n.sub(y,f),f=n.add(y,f),p=n.mul(d,f),y=n.add(b,b),y=n.add(y,b),v=n.mul(m,v),C=n.mul(g,C),y=n.add(y,v),v=n.sub(b,v),v=n.mul(m,v),C=n.add(C,v),b=n.mul(y,C),p=n.add(p,b),b=n.mul(E,C),d=n.mul(w,d),d=n.sub(d,b),b=n.mul(w,y),f=n.mul(E,f),f=n.add(f,b),new Point(d,p,f)}subtract(e){return this.add(e.negate())}is0(){return this.equals(Point.ZERO)}wNAF(e){return c.wNAFCached(this,s,e,e=>{let t=n.invertBatch(e.map(e=>e.pz));return e.map((e,n)=>e.toAffine(t[n])).map(Point.fromAffine)})}multiplyUnsafe(e){let o=Point.ZERO;if(e===F)return o;if(assertGE(e),e===N)return this;let{endo:i}=t;if(!i)return c.unsafeLadder(this,e);let{k1neg:s,k1:l,k2neg:u,k2:d}=i.splitScalar(e),p=o,f=o,m=this;for(;l>F||d>F;)l&N&&(p=p.add(m)),d&N&&(f=f.add(m)),m=m.double(),l>>=N,d>>=N;return s&&(p=p.negate()),u&&(f=f.negate()),f=new Point(n.mul(f.px,i.beta),f.py,f.pz),p.add(f)}multiply(e){let o,i;assertGE(e);let{endo:s}=t;if(s){let{k1neg:t,k1:l,k2neg:u,k2:d}=s.splitScalar(e),{p:p,f:f}=this.wNAF(l),{p:m,f:g}=this.wNAF(d);p=c.constTimeNegate(t,p),m=c.constTimeNegate(u,m),m=new Point(n.mul(m.px,s.beta),m.py,m.pz),o=p.add(m),i=f.add(g)}else{let{p:t,f:n}=this.wNAF(e);o=t,i=n}return Point.normalizeZ([o,i])[0]}multiplyAndAddUnsafe(e,t,n){let o=Point.BASE,mul=(e,t)=>t!==F&&t!==N&&e.equals(o)?e.multiply(t):e.multiplyUnsafe(t),i=mul(this,t).add(mul(e,n));return i.is0()?void 0:i}toAffine(e){let{px:t,py:o,pz:i}=this,s=this.is0();null==e&&(e=s?n.ONE:n.inv(i));let l=n.mul(t,e),c=n.mul(o,e),u=n.mul(i,e);if(s)return{x:n.ZERO,y:n.ZERO};if(!n.eql(u,n.ONE))throw Error("invZ was invalid");return{x:l,y:c}}isTorsionFree(){let{h:e,isTorsionFree:n}=t;if(e===N)return!0;if(n)return n(Point,this);throw Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){let{h:e,clearCofactor:n}=t;return e===N?this:n?n(Point,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),o(Point,this,e)}toHex(e=!0){return w.ci(this.toRawBytes(e))}};Point.BASE=new Point(t.Gx,t.Gy,n.ONE),Point.ZERO=new Point(n.ZERO,n.ONE,n.ZERO);let l=t.nBitLength,c=function(e,t){let constTimeNegate=(e,t)=>{let n=t.negate();return e?n:t},opts=e=>({windows:Math.ceil(t/e)+1,windowSize:2**(e-1)});return{constTimeNegate,unsafeLadder(t,n){let o=e.ZERO,i=t;for(;n>P;)n&M&&(o=o.add(i)),i=i.double(),n>>=M;return o},precomputeWindow(e,t){let{windows:n,windowSize:o}=opts(t),i=[],s=e,l=s;for(let e=0;e>=p,i>s&&(i-=d,o+=M);let f=t+Math.abs(i)-1,m=e%2!=0,g=i<0;0===i?c=c.add(constTimeNegate(m,n[t])):l=l.add(constTimeNegate(g,n[f]))}return{p:l,f:c}},wNAFCached(e,t,n,o){let i=e._WINDOW_SIZE||1,s=t.get(e);return s||(s=this.precomputeWindow(e,i),1!==i&&t.set(e,o(s))),this.wNAF(i,s,n)}}}(Point,t.endo?Math.ceil(l/2):l);return{CURVE:t,ProjectivePoint:Point,normPrivateKeyToScalar,weierstrassEquation,isWithinCurveOrder}}({...t,toBytes(e,t,o){let i=t.toAffine(),s=n.toBytes(i.x),l=w.eV;return o?l(Uint8Array.from([t.hasEvenY()?2:3]),s):l(Uint8Array.from([4]),s,n.toBytes(i.y))},fromBytes(e){let t=e.length,o=e[0],l=e.subarray(1);if(t===i&&(2===o||3===o)){let e=w.bytesToNumberBE(l);if(!(Fw.ci(w.tL(e,t.nByteLength));function isBiggerThanHalfOrder(e){let t=o>>N;return e>t}let slcNum=(e,t,n)=>w.bytesToNumberBE(e.slice(t,n));let Signature=class Signature{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){let n=t.nByteLength;return e=(0,w.ql)("compactSignature",e,2*n),new Signature(slcNum(e,0,n),slcNum(e,n,2*n))}static fromDER(e){let{r:t,s:n}=U.toSig((0,w.ql)("DER",e));return new Signature(t,n)}assertValidity(){if(!d(this.r))throw Error("r must be 0 < r < CURVE.n");if(!d(this.s))throw Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new Signature(this.r,this.s,e)}recoverPublicKey(e){let{r:i,s,recovery:c}=this,u=f((0,w.ql)("msgHash",e));if(null==c||![0,1,2,3].includes(c))throw Error("recovery id invalid");let d=2===c||3===c?i+t.n:i;if(d>=n.ORDER)throw Error("recovery id 2 or 3 invalid");let p=(1&c)==0?"02":"03",m=l.fromHex(p+numToNByteStr(d)),g=invert(d,o),b=modN(-u*g),y=modN(s*g),v=l.BASE.multiplyAndAddUnsafe(m,b,y);if(!v)throw Error("point at infinify");return v.assertValidity(),v}hasHighS(){return isBiggerThanHalfOrder(this.s)}normalizeS(){return this.hasHighS()?new Signature(this.r,modN(-this.s),this.recovery):this}toDERRawBytes(){return w.hexToBytes(this.toDERHex())}toDERHex(){return U.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return w.hexToBytes(this.toCompactHex())}toCompactHex(){return numToNByteStr(this.r)+numToNByteStr(this.s)}};function isProbPub(e){let t=e instanceof Uint8Array,n="string"==typeof e,o=(t||n)&&e.length;return t?o===i||o===s:n?o===2*i||o===2*s:e instanceof l}let p=t.bits2int||function(e){let n=w.bytesToNumberBE(e),o=8*e.length-t.nBitLength;return o>0?n>>BigInt(o):n},f=t.bits2int_modN||function(e){return modN(p(e))},m=w.dQ(t.nBitLength);function int2octets(e){if("bigint"!=typeof e)throw Error("bigint expected");if(!(F<=e&&ee in s))throw Error("sign() legacy options not supported");let{hash:u,randomBytes:m}=t,{lowS:b,prehash:y,extraEntropy:v}=s;null==b&&(b=!0),e=(0,w.ql)("msgHash",e),y&&(e=(0,w.ql)("prehashed msgHash",u(e)));let C=f(e),E=c(i),x=[int2octets(E),int2octets(C)];if(null!=v){let e=!0===v?m(n.BYTES):v;x.push((0,w.ql)("extraEntropy",e))}let A=w.eV(...x);return{seed:A,k2sig:function(e){let t=p(e);if(!d(t))return;let n=invert(t,o),i=l.BASE.multiply(t).toAffine(),s=modN(i.x);if(s===F)return;let c=modN(n*modN(C+s*E));if(c===F)return;let u=(i.x===s?0:2)|Number(i.y&N),f=c;return b&&isBiggerThanHalfOrder(c)&&(f=isBiggerThanHalfOrder(c)?modN(-c):c,u^=1),new Signature(s,f,u)}}}(e,i,s),b=w.n$(t.hash.outputLen,t.nByteLength,t.hmac);return b(u,m)},verify:function(e,n,i,s=b){let c,u;if(n=(0,w.ql)("msgHash",n),i=(0,w.ql)("publicKey",i),"strict"in s)throw Error("options.strict was renamed to lowS");let{lowS:d,prehash:p}=s;try{if("string"==typeof e||e instanceof Uint8Array)try{u=Signature.fromDER(e)}catch(t){if(!(t instanceof U.Err))throw t;u=Signature.fromCompact(e)}else if("object"==typeof e&&"bigint"==typeof e.r&&"bigint"==typeof e.s){let{r:t,s:n}=e;u=new Signature(t,n)}else throw Error("PARSE");c=l.fromHex(i)}catch(e){if("PARSE"===e.message)throw Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(d&&u.hasHighS())return!1;p&&(n=t.hash(n));let{r:m,s:g}=u,y=f(n),v=invert(g,o),C=modN(y*v),E=modN(m*v),x=l.BASE.multiplyAndAddUnsafe(c,C,E)?.toAffine();if(!x)return!1;let A=modN(x.x);return A===m},ProjectivePoint:l,Signature,utils:{isValidPrivateKey(e){try{return c(e),!0}catch(e){return!1}},normPrivateKeyToScalar:c,randomPrivateKey:()=>{let e=getMinHashLength(t.n);return function(e,t,n=!1){let o=e.length,i=getFieldBytesLength(t),s=getMinHashLength(t);if(o<16||o1024)throw Error(`expected ${s}-1024 bytes of input, got ${o}`);let l=n?(0,w.bytesToNumberBE)(e):(0,w.ty)(e),c=modular_mod(l,t-E)+E;return n?(0,w.S5)(c,i):(0,w.tL)(c,i)}(t.randomBytes(e),t.n)},precompute:(e=8,t=l.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)}}})({...e,hash:t,hmac:(e,...n)=>hmac(t,e,(0,T.eV)(...n)),randomBytes:T.O6});return Object.freeze({...create(t),create})}({a:BigInt(0),b:BigInt(7),Fp:G,n:L,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{let t=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),n=-z*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),o=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),i=BigInt("0x100000000000000000000000000000000"),s=divNearest(t*e,L),l=divNearest(-n*e,L),c=modular_mod(e-s*t-l*o,L),u=modular_mod(-s*n-l*t,L),d=c>i,p=u>i;if(d&&(c=L-c),p&&(u=L-u),c>i||u>i)throw Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:d,k1:c,k2neg:p,k2:u}}}},v.J),H=(BigInt(0),W.ProjectivePoint,BigInt(0));function getBigInt(e,t){switch(typeof e){case"bigint":return e;case"number":return assertArgument(Number.isInteger(e),"underflow",t||"value",e),assertArgument(e>=-9007199254740991&&e<=9007199254740991,"overflow",t||"value",e),BigInt(e);case"string":try{if(""===e)throw Error("empty string");if("-"===e[0]&&"-"!==e[1])return-BigInt(e.substring(1));return BigInt(e)}catch(n){assertArgument(!1,`invalid BigNumberish string: ${n.message}`,t||"value",e)}}assertArgument(!1,"invalid BigNumberish value",t||"value",e)}function getUint(e,t){let n=getBigInt(e,t);return errors_assert(n>=H,"unsigned value cannot be negative","NUMERIC_FAULT",{fault:"overflow",operation:"getUint",value:e}),n}function getNumber(e,t){switch(typeof e){case"bigint":return assertArgument(e>=-9007199254740991&&e<=9007199254740991,"overflow",t||"value",e),Number(e);case"number":return assertArgument(Number.isInteger(e),"underflow",t||"value",e),assertArgument(e>=-9007199254740991&&e<=9007199254740991,"overflow",t||"value",e),e;case"string":try{if(""===e)throw Error("empty string");return getNumber(BigInt(e),t)}catch(n){assertArgument(!1,`invalid numeric string: ${n.message}`,t||"value",e)}}assertArgument(!1,"invalid numeric value",t||"value",e)}function toBeHex(e,t){let n=getUint(e,"value"),o=n.toString(16);if(null==t)o.length%2&&(o="0"+o);else{let n=getNumber(t,"width");for(errors_assert(2*n>=o.length,`value exceeds width (${n} bytes)`,"NUMERIC_FAULT",{operation:"toBeHex",fault:"overflow",value:e});o.length<2*n;)o="0"+o}return"0x"+o}BigInt(1);let Q="0x0000000000000000000000000000000000000000000000000000000000000000",K=BigInt(0),V=BigInt(1),Z=BigInt(2),J=BigInt(27),X=BigInt(28),Y=BigInt(35),$={};function toUint256(e){return function(e,t,n){let o=data_getBytes(e);errors_assert(t>=o.length,"padding exceeds data length","BUFFER_OVERRUN",{buffer:new Uint8Array(o),length:t,offset:t+1});let i=new Uint8Array(t);return i.fill(0),n?i.set(o,t-o.length):i.set(o,0),data_hexlify(i)}(function(e){let t=getUint(e,"value");if(t===H)return new Uint8Array([]);let n=t.toString(16);n.length%2&&(n="0"+n);let o=new Uint8Array(n.length/2);for(let e=0;eparseInt(t.substring(0,3)),"non-canonical s","value",t),this.#t=t}get v(){return this.#r}set v(e){let t=getNumber(e,"value");assertArgument(27===t||28===t,"invalid v","v",e),this.#r=t}get networkV(){return this.#n}get legacyChainId(){let e=this.networkV;return null==e?null:Signature.getChainId(e)}get yParity(){return 27===this.v?0:1}get yParityAndS(){let e=data_getBytes(this.s);return this.yParity&&(e[0]|=128),data_hexlify(e)}get compactSerialized(){return concat([this.r,this.yParityAndS])}get serialized(){return concat([this.r,this.s,this.yParity?"0x1c":"0x1b"])}constructor(e,t,n,o){!function(e,t,n){if(null==n&&(n=""),e!==t){let e=n,t="new";n&&(e+=".",t+=" "+n),errors_assert(!1,`private constructor; use ${e}from* methods`,"UNSUPPORTED_OPERATION",{operation:t})}}(e,$,"Signature"),this.#e=t,this.#t=n,this.#r=o,this.#n=null}[Symbol.for("nodejs.util.inspect.custom")](){return`Signature { r: "${this.r}", s: "${this.s}", yParity: ${this.yParity}, networkV: ${this.networkV} }`}clone(){let e=new Signature($,this.r,this.s,this.v);return this.networkV&&(e.#n=this.networkV),e}toJSON(){let e=this.networkV;return{_type:"signature",networkV:null!=e?e.toString():null,r:this.r,s:this.s,v:this.v}}static getChainId(e){let t=getBigInt(e,"v");return t==J||t==X?K:(assertArgument(t>=Y,"invalid EIP-155 v","v",e),(t-Y)/Z)}static getChainIdV(e,t){return getBigInt(e)*Z+BigInt(35+t-27)}static getNormalizedV(e){let t=getBigInt(e);return t===K||t===J?27:t===V||t===X?28:(assertArgument(t>=Y,"invalid v","v",e),t&V?27:28)}static from(e){function assertError(t,n){assertArgument(t,n,"signature",e)}if(null==e)return new Signature($,Q,Q,27);if("string"==typeof e){let t=data_getBytes(e,"signature");if(64===t.length){let e=data_hexlify(t.slice(0,32)),n=t.slice(32,64),o=128&n[0]?28:27;return n[0]&=127,new Signature($,e,data_hexlify(n),o)}if(65===t.length){let e=data_hexlify(t.slice(0,32)),n=t.slice(32,64);assertError((128&n[0])==0,"non-canonical s");let o=Signature.getNormalizedV(t[64]);return new Signature($,e,data_hexlify(n),o)}assertError(!1,"invalid raw signature length")}if(e instanceof Signature)return e.clone();let t=e.r;assertError(null!=t,"missing r");let n=toUint256(t),o=function(e,t){if(null!=e)return toUint256(e);if(null!=t){assertError(isHexString(t,32),"invalid yParityAndS");let e=data_getBytes(t);return e[0]&=127,data_hexlify(e)}assertError(!1,"missing s")}(e.s,e.yParityAndS);assertError((128&data_getBytes(o)[0])==0,"non-canonical s");let{networkV:i,v:s}=function(e,t,n){if(null!=e){let t=getBigInt(e);return{networkV:t>=Y?t:void 0,v:Signature.getNormalizedV(t)}}if(null!=t)return assertError(isHexString(t,32),"invalid yParityAndS"),{v:128&data_getBytes(t)[0]?28:27};if(null!=n){switch(getNumber(n,"sig.yParity")){case 0:return{v:27};case 1:return{v:28}}assertError(!1,"invalid yParity")}assertError(!1,"missing v")}(e.v,e.yParityAndS,e.yParity),l=new Signature($,n,o,s);return i&&(l.#n=i),assertError(null==e.yParity||getNumber(e.yParity,"sig.yParity")===l.yParity,"yParity mismatch"),assertError(null==e.yParityAndS||e.yParityAndS===l.yParityAndS,"yParityAndS mismatch"),l}};let SigningKey=class SigningKey{#a;constructor(e){assertArgument(32===dataLength(e),"invalid private key","privateKey","[REDACTED]"),this.#a=data_hexlify(e)}get privateKey(){return this.#a}get publicKey(){return SigningKey.computePublicKey(this.#a)}get compressedPublicKey(){return SigningKey.computePublicKey(this.#a,!0)}sign(e){assertArgument(32===dataLength(e),"invalid digest length","digest",e);let t=W.sign(getBytesCopy(e),getBytesCopy(this.#a),{lowS:!0});return Signature.from({r:toBeHex(t.r,32),s:toBeHex(t.s,32),v:t.recovery?28:27})}computeSharedSecret(e){let t=SigningKey.computePublicKey(e);return data_hexlify(W.getSharedSecret(getBytesCopy(this.#a),data_getBytes(t),!1))}static computePublicKey(e,t){let n=data_getBytes(e,"key");if(32===n.length){let e=W.getPublicKey(n,!!t);return data_hexlify(e)}if(64===n.length){let e=new Uint8Array(65);e[0]=4,e.set(n,1),n=e}let o=W.ProjectivePoint.fromHex(n);return data_hexlify(o.toRawBytes(t))}static recoverPublicKey(e,t){assertArgument(32===dataLength(e),"invalid digest length","digest",e);let n=Signature.from(t),o=W.Signature.fromCompact(getBytesCopy(concat([n.r,n.s])));o=o.addRecoveryBit(n.yParity);let i=o.recoverPublicKey(getBytesCopy(e));return assertArgument(null!=i,"invalid signautre for digest","signature",t),"0x"+i.toHex(!1)}static addPoints(e,t,n){let o=W.ProjectivePoint.fromHex(SigningKey.computePublicKey(e).substring(2)),i=W.ProjectivePoint.fromHex(SigningKey.computePublicKey(t).substring(2));return"0x"+o.add(i).toHex(!!n)}};function ignoreFunc(e,t,n,o,i){if("BAD_PREFIX"===e||"UNEXPECTED_CONTINUE"===e){let e=0;for(let o=t+1;o>6==2;o++)e++;return e}return"OVERRUN"===e?n.length-t-1:0}function toUtf8Bytes(e,t){assertArgument("string"==typeof e,"invalid string value","str",e),null!=t&&(errors_assert(u.indexOf(t)>=0,"platform missing String.prototype.normalize","UNSUPPORTED_OPERATION",{operation:"String.prototype.normalize",info:{form:t}}),e=e.normalize(t));let n=[];for(let t=0;t>6|192),n.push(63&o|128);else if((64512&o)==55296){t++;let i=e.charCodeAt(t);assertArgument(t>18|240),n.push(s>>12&63|128),n.push(s>>6&63|128),n.push(63&s|128)}else n.push(o>>12|224),n.push(o>>6&63|128),n.push(63&o|128)}return new Uint8Array(n)}Object.freeze({error:function(e,t,n,o,i){assertArgument(!1,`invalid codepoint at offset ${t}; ${e}`,"bytes",n)},ignore:ignoreFunc,replace:function(e,t,n,o,i){return"OVERLONG"===e?(assertArgument("number"==typeof i,"invalid bad code point for replacement","badCodepoint",i),o.push(i),0):(o.push(65533),ignoreFunc(e,t,n,o,i))}});let ee=(0,i.createContext)(void 0),AdminProvider=e=>{let{children:t}=e,{address:n,isConnected:c}=(0,s.m)(),{signMessage:u,data:d}=(0,l.Q)(),[p,f]=(0,i.useState)(!1),[v,w]=(0,i.useState)([]),[C,E]=(0,i.useState)(),[x,A]=(0,i.useState)(),[k,B]=(0,i.useState)(!0),[S,I]=(0,i.useState)([]);return(0,i.useEffect)(()=>{c&&n||(A(void 0),E(void 0))},[n,c]),(0,i.useEffect)(()=>{let e=localStorage.getItem("expiryTimestamp"),t=e?parseInt(e,10):null;if(t&&t>Date.now()){E(t);let e=localStorage.getItem("signature");e&&A(e)}},[n,c]),(0,i.useEffect)(()=>{C&&C>Date.now()&&(localStorage.setItem("expiryTimestamp",C.toString()),x&&localStorage.setItem("signature",x))},[C,x,n,c]),(0,i.useEffect)(()=>{d&&A(d)},[d,n,c]),(0,i.useEffect)(()=>{let e=setInterval(()=>{if(C){let e=Date.now();B(eclearInterval(e)},[C,n,c]),(0,i.useEffect)(()=>{if(C&&x){var e;let t=null===(e=function(e,t){var n,o;let i=("string"==typeof(n=e)&&(n=toUtf8Bytes(n)),keccak256(concat([toUtf8Bytes("\x19Ethereum Signed Message:\n"),toUtf8Bytes(String(n.length)),n])));return function(e){if(assertArgument("string"==typeof e,"invalid address","address",e),e.match(/^(0x)?[0-9a-fA-F]{40}$/)){e.startsWith("0x")||(e="0x"+e);let t=getChecksumAddress(e);return assertArgument(!e.match(/([A-F].*[a-f])|([a-f].*[A-F])/)||t===e,"bad address checksum","address",e),t}if(e.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)){assertArgument(e.substring(2,4)===function(e){let t=(e=(e=e.toUpperCase()).substring(4)+e.substring(0,2)+"00").split("").map(e=>b[e]).join("");for(;t.length>=15;){let e=t.substring(0,15);t=parseInt(e,10)%97+t.substring(e.length)}let n=String(98-parseInt(t,10)%97);for(;n.length<2;)n="0"+n;return n}(e),"bad icap checksum","address",e);let t=(function(e){e=e.toLowerCase();let t=m;for(let n=0;n{let e=v.some(e=>n&&(null==e?void 0:e.toLowerCase())===(null==n?void 0:n.toLowerCase()));f(e)},[n,v,c]),(0,o.jsx)(ee.Provider,{value:{admin:p,setAdmin:f,allAdmins:v,setAllAdmins:w,expiryTimestamp:C,setExpiryTimestamp:E,generateSignature:()=>{let e=Date.now()+432e5;u({message:e.toString()}),E(e)},signature:x,setSignature:A,validTimestamp:k,setValidTimestamp:B,networks:S,setNetworks:I},children:t})},useAdminContext=()=>{let e=(0,i.useContext)(ee);if(void 0===e)throw Error("AdminContext must be used within an AdminProvider");return e}},38492:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return App}});var o=n(85893);n(32352);var i=n(59581);n(56953);var s=n(89192),l=n(99931),c=n(24139),u=n(56888),d=n(27037),p=n(7506),f=class extends p.l{constructor(e={}){super(),this.config=e,this.#o=new Map}#o;build(e,t,n){let o=t.queryKey,i=t.queryHash??(0,c.Rm)(o,t),s=this.get(i);return s||(s=new u.A({cache:this,queryKey:o,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(o)}),this.add(s)),s}add(e){this.#o.has(e.queryHash)||(this.#o.set(e.queryHash,e),this.notify({type:"added",query:e}))}remove(e){let t=this.#o.get(e.queryHash);t&&(e.destroy(),t===e&&this.#o.delete(e.queryHash),this.notify({type:"removed",query:e}))}clear(){d.V.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#o.get(e)}getAll(){return[...this.#o.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>(0,c._x)(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>(0,c._x)(e,t)):t}notify(e){d.V.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){d.V.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){d.V.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},m=n(59289),g=class extends p.l{constructor(e={}){super(),this.config=e,this.#i=[],this.#s=0}#i;#s;#l;build(e,t,n){let o=new m.m({mutationCache:this,mutationId:++this.#s,options:e.defaultMutationOptions(t),state:n});return this.add(o),o}add(e){this.#i.push(e),this.notify({type:"added",mutation:e})}remove(e){this.#i=this.#i.filter(t=>t!==e),this.notify({type:"removed",mutation:e})}clear(){d.V.batch(()=>{this.#i.forEach(e=>{this.remove(e)})})}getAll(){return this.#i}find(e){let t={exact:!0,...e};return this.#i.find(e=>(0,c.X7)(t,e))}findAll(e={}){return this.#i.filter(t=>(0,c.X7)(e,t))}notify(e){d.V.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){return this.#l=(this.#l??Promise.resolve()).then(()=>{let e=this.#i.filter(e=>e.state.isPaused);return d.V.batch(()=>e.reduce((e,t)=>e.then(()=>t.continue().catch(c.ZT)),Promise.resolve()))}).then(()=>{this.#l=void 0}),this.#l}},b=n(66474),y=n(14304);function getNextPageParam(e,{pages:t,pageParams:n}){let o=t.length-1;return e.getNextPageParam(t[o],t,n[o],n)}function getPreviousPageParam(e,{pages:t,pageParams:n}){return e.getPreviousPageParam?.(t[0],t,n[0],n)}var v=class{#c;#u;#d;#p;#h;#f;#m;#g;constructor(e={}){this.#c=e.queryCache||new f,this.#u=e.mutationCache||new g,this.#d=e.defaultOptions||{},this.#p=new Map,this.#h=new Map,this.#f=0}mount(){this.#f++,1===this.#f&&(this.#m=b.j.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#c.onFocus())}),this.#g=y.N.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#c.onOnline())}))}unmount(){this.#f--,0===this.#f&&(this.#m?.(),this.#m=void 0,this.#g?.(),this.#g=void 0)}isFetching(e){return this.#c.findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return this.#u.findAll({...e,status:"pending"}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#c.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.getQueryData(e.queryKey);if(void 0===t)return this.fetchQuery(e);{let n=this.defaultQueryOptions(e),o=this.#c.build(this,n);return e.revalidateIfStale&&o.isStaleByTime(n.staleTime)&&this.prefetchQuery(n),Promise.resolve(t)}}getQueriesData(e){return this.getQueryCache().findAll(e).map(({queryKey:e,state:t})=>{let n=t.data;return[e,n]})}setQueryData(e,t,n){let o=this.defaultQueryOptions({queryKey:e}),i=this.#c.get(o.queryHash),s=i?.state.data,l=(0,c.SE)(t,s);if(void 0!==l)return this.#c.build(this,o).setData(l,{...n,manual:!0})}setQueriesData(e,t,n){return d.V.batch(()=>this.getQueryCache().findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#c.get(t.queryHash)?.state}removeQueries(e){let t=this.#c;d.V.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#c,o={type:"active",...e};return d.V.batch(()=>(n.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries(o,t)))}cancelQueries(e={},t={}){let n={revert:!0,...t},o=d.V.batch(()=>this.#c.findAll(e).map(e=>e.cancel(n)));return Promise.all(o).then(c.ZT).catch(c.ZT)}invalidateQueries(e={},t={}){return d.V.batch(()=>{if(this.#c.findAll(e).forEach(e=>{e.invalidate()}),"none"===e.refetchType)return Promise.resolve();let n={...e,type:e.refetchType??e.type??"active"};return this.refetchQueries(n,t)})}refetchQueries(e={},t){let n={...t,cancelRefetch:t?.cancelRefetch??!0},o=d.V.batch(()=>this.#c.findAll(e).filter(e=>!e.isDisabled()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(c.ZT)),"paused"===e.state.fetchStatus?Promise.resolve():t}));return Promise.all(o).then(c.ZT)}fetchQuery(e){let t=this.defaultQueryOptions(e);void 0===t.retry&&(t.retry=!1);let n=this.#c.build(this,t);return n.isStaleByTime(t.staleTime)?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(c.ZT).catch(c.ZT)}fetchInfiniteQuery(e){var t;return e.behavior=(t=e.pages,{onFetch:(e,n)=>{let fetchFn=async()=>{let n;let o=e.options,i=e.fetchOptions?.meta?.fetchMore?.direction,s=e.state.data?.pages||[],l=e.state.data?.pageParams||[],u=!1,addSignalProperty=t=>{Object.defineProperty(t,"signal",{enumerable:!0,get:()=>(e.signal.aborted?u=!0:e.signal.addEventListener("abort",()=>{u=!0}),e.signal)})},d=e.options.queryFn&&e.options.queryFn!==c.CN?e.options.queryFn:()=>Promise.reject(Error(`Missing queryFn: '${e.options.queryHash}'`)),fetchPage=async(t,n,o)=>{if(u)return Promise.reject();if(null==n&&t.pages.length)return Promise.resolve(t);let i={queryKey:e.queryKey,pageParam:n,direction:o?"backward":"forward",meta:e.options.meta};addSignalProperty(i);let s=await d(i),{maxPages:l}=e.options,p=o?c.Ht:c.VX;return{pages:p(t.pages,s,l),pageParams:p(t.pageParams,n,l)}};if(i&&s.length){let e="backward"===i,t=e?getPreviousPageParam:getNextPageParam,c={pages:s,pageParams:l},u=t(o,c);n=await fetchPage(c,u,e)}else{n=await fetchPage({pages:[],pageParams:[]},l[0]??o.initialPageParam);let e=t??s.length;for(let t=1;te.options.persister?.(fetchFn,{queryKey:e.queryKey,meta:e.options.meta,signal:e.signal},n):e.fetchFn=fetchFn}}),this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(c.ZT).catch(c.ZT)}resumePausedMutations(){return y.N.isOnline()?this.#u.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#c}getMutationCache(){return this.#u}getDefaultOptions(){return this.#d}setDefaultOptions(e){this.#d=e}setQueryDefaults(e,t){this.#p.set((0,c.Ym)(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#p.values()],n={};return t.forEach(t=>{(0,c.to)(e,t.queryKey)&&(n={...n,...t.defaultOptions})}),n}setMutationDefaults(e,t){this.#h.set((0,c.Ym)(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#h.values()],n={};return t.forEach(t=>{(0,c.to)(e,t.mutationKey)&&(n={...n,...t.defaultOptions})}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#d.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=(0,c.Rm)(t.queryKey,t)),void 0===t.refetchOnReconnect&&(t.refetchOnReconnect="always"!==t.networkMode),void 0===t.throwOnError&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),!0!==t.enabled&&t.queryFn===c.CN&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#d.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#c.clear(),this.#u.clear()}},w=n(30202),C=n(86164);let E=(0,C.a)({id:31337,name:"Hardhat",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["http://127.0.0.1:8545"]}}});var x=n(66403);let A=(0,C.a)({id:5,name:"Goerli",nativeCurrency:{name:"Goerli Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.ankr.com/eth_goerli"]}},blockExplorers:{default:{name:"Etherscan",url:"https://goerli.etherscan.io",apiUrl:"https://api-goerli.etherscan.io/api"}},contracts:{ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},ensUniversalResolver:{address:"0xfc4AC75C46C914aF5892d6d3eFFcebD7917293F1",blockCreated:10339206},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:6507670}},testnet:!0});var k=n(95946),B=n(43310),S=n(6073),I=n(30866);let j={block:(0,B.G)({format(e){let t=e.transactions?.map(e=>{if("string"==typeof e)return e;let t=S.Tr(e);return"0x7e"===t.typeHex&&(t.isSystemTx=e.isSystemTx,t.mint=e.mint?k.y_(e.mint):void 0,t.sourceHash=e.sourceHash,t.type="deposit"),t});return{transactions:t,stateRoot:e.stateRoot}}}),transaction:(0,S.y_)({format(e){let t={};return"0x7e"===e.type&&(t.isSystemTx=e.isSystemTx,t.mint=e.mint?(0,k.y_)(e.mint):void 0,t.sourceHash=e.sourceHash,t.type="deposit"),t}}),transactionReceipt:(0,I.d)({format:e=>({l1GasPrice:e.l1GasPrice?(0,k.y_)(e.l1GasPrice):null,l1GasUsed:e.l1GasUsed?(0,k.y_)(e.l1GasUsed):null,l1Fee:e.l1Fee?(0,k.y_)(e.l1Fee):null,l1FeeScalar:e.l1FeeScalar?Number(e.l1FeeScalar):null})})};var T=n(26087),P=n(60480),M=n(57040),O=n(92106),R=n(62027),U=n(11221),F=n(11187);function toRlp(e,t="hex"){let n=function getEncodable(e){return Array.isArray(e)?function(e){let t=e.reduce((e,t)=>e+t.length,0),n=getSizeOfLength(t),o=t<=55?1+t:1+n+t;return{length:o,encode(o){for(let{encode:i}of(t<=55?o.pushByte(192+t):(o.pushByte(247+n),1===n?o.pushUint8(t):2===n?o.pushUint16(t):3===n?o.pushUint24(t):o.pushUint32(t)),e))i(o)}}}(e.map(e=>getEncodable(e))):function(e){let t="string"==typeof e?(0,F.nr)(e):e,n=getSizeOfLength(t.length),o=1===t.length&&t[0]<128?1:t.length<=55?1+t.length:1+n+t.length;return{length:o,encode(e){1===t.length&&t[0]<128||(t.length<=55?e.pushByte(128+t.length):(e.pushByte(183+n),1===n?e.pushUint8(t.length):2===n?e.pushUint16(t.length):3===n?e.pushUint24(t.length):e.pushUint32(t.length))),e.pushBytes(t)}}}(e)}(e),o=(0,U.q)(new Uint8Array(n.length));return(n.encode(o),"hex"===t)?(0,O.ci)(o.bytes):o.bytes}function getSizeOfLength(e){if(e<256)return 1;if(e<65536)return 2;if(e<16777216)return 3;if(e<4294967296)return 4;throw new R.G("Length is too large.")}var N=n(33639);function blobsToCommitments(e){let{kzg:t}=e,n=e.to??("string"==typeof e.blobs[0]?"hex":"bytes"),o="string"==typeof e.blobs[0]?e.blobs.map(e=>(0,F.nr)(e)):e.blobs,i=[];for(let e of o)i.push(Uint8Array.from(t.blobToKzgCommitment(e)));return"bytes"===n?i:i.map(e=>(0,O.ci)(e))}function blobsToProofs(e){let{kzg:t}=e,n=e.to??("string"==typeof e.blobs[0]?"hex":"bytes"),o="string"==typeof e.blobs[0]?e.blobs.map(e=>(0,F.nr)(e)):e.blobs,i="string"==typeof e.commitments[0]?e.commitments.map(e=>(0,F.nr)(e)):e.commitments,s=[];for(let e=0;e(0,O.ci)(e))}var D=n(11606),_=n(15102);let BlobSizeTooLargeError=class BlobSizeTooLargeError extends R.G{constructor({maxSize:e,size:t}){super("Blob size is too large.",{metaMessages:[`Max: ${e} bytes`,`Given: ${t} bytes`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"BlobSizeTooLargeError"})}};let EmptyBlobError=class EmptyBlobError extends R.G{constructor(){super("Blob data must not be empty."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EmptyBlobError"})}};let InvalidVersionedHashSizeError=class InvalidVersionedHashSizeError extends R.G{constructor({hash:e,size:t}){super(`Versioned hash "${e}" size is invalid.`,{metaMessages:["Expected: 32",`Received: ${t}`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidVersionedHashSizeError"})}};let InvalidVersionedHashVersionError=class InvalidVersionedHashVersionError extends R.G{constructor({hash:e,version:t}){super(`Versioned hash "${e}" version is invalid.`,{metaMessages:["Expected: 1",`Received: ${t}`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidVersionedHashVersionError"})}};var L=n(39135),z=n(61836),q=n(80377),G=n(26445),W=n(3972);function assertTransactionEIP1559(e){let{chainId:t,maxPriorityFeePerGas:n,maxFeePerGas:o,to:i}=e;if(t<=0)throw new q.hJ({chainId:t});if(i&&!(0,P.U)(i))throw new T.b({address:i});if(o&&o>2n**256n-1n)throw new G.Hh({maxFeePerGas:o});if(n&&o&&n>o)throw new G.cs({maxFeePerGas:o,maxPriorityFeePerGas:n})}var H=n(82994);function serializeAccessList(e){if(!e||0===e.length)return[];let t=[];for(let n=0;n2n**256n-1n)throw new G.Hh({maxFeePerGas:o})}(e);let p=serializeAccessList(u),f=[(0,O.NC)(n),s?(0,O.NC)(s):"0x",d?(0,O.NC)(d):"0x",o?(0,O.NC)(o):"0x",l??"0x",c?(0,O.NC)(c):"0x",i??"0x",p,...toYParitySignatureArray(e,t)];return(0,M.SM)(["0x01",toRlp(f)])}(e,t):"eip4844"===n?function(e,t){let{chainId:n,gas:o,nonce:i,to:s,value:l,maxFeePerBlobGas:c,maxFeePerGas:u,maxPriorityFeePerGas:d,accessList:p,data:f}=e;!function(e){let{blobVersionedHashes:t}=e;if(t){if(0===t.length)throw new EmptyBlobError;for(let e of t){let t=(0,L.d)(e),n=(0,k.ly)((0,W.tP)(e,0,1));if(32!==t)throw new InvalidVersionedHashSizeError({hash:e,size:t});if(1!==n)throw new InvalidVersionedHashVersionError({hash:e,version:n})}}assertTransactionEIP1559(e)}(e);let m=e.blobVersionedHashes,g=e.sidecars;if(e.blobs){let t="string"==typeof e.blobs[0]?e.blobs:e.blobs.map(e=>(0,O.ci)(e)),n=e.kzg,o=blobsToCommitments({blobs:t,kzg:n}),i=blobsToProofs({blobs:t,commitments:o,kzg:n});m=function(e){let{commitments:t,version:n}=e,o=e.to??("string"==typeof t[0]?"hex":"bytes"),i=[];for(let e of t)i.push(function(e){let{commitment:t,version:n=1}=e,o=e.to??("string"==typeof t?"hex":"bytes"),i=function(e,t){let n=(0,D.J)((0,_.v)(e,{strict:!1})?(0,F.O0)(e):e);return"bytes"===(t||"hex")?n:(0,O.NC)(n)}(t,"bytes");return i.set([n],0),"bytes"===o?i:(0,O.ci)(i)}({commitment:e,to:o,version:n}));return i}({commitments:o}),!1!==g&&(g=function(e){let{data:t,kzg:n,to:o}=e,i=e.blobs??function(e){let t=e.to??("string"==typeof e.data?"hex":"bytes"),n="string"==typeof e.data?(0,F.nr)(e.data):e.data,o=(0,L.d)(n);if(!o)throw new EmptyBlobError;if(o>253951)throw new BlobSizeTooLargeError({maxSize:253951,size:o});let i=[],s=!0,l=0;for(;s;){let e=(0,U.q)(new Uint8Array(131072)),t=0;for(;t<4096;){let o=n.slice(l,l+31);if(e.pushByte(0),e.pushBytes(o),o.length<31){e.pushByte(128),s=!1;break}t++,l+=31}i.push(e)}return"bytes"===t?i.map(e=>e.bytes):i.map(e=>(0,O.ci)(e.bytes))}({data:t,to:o}),s=e.commitments??blobsToCommitments({blobs:i,kzg:n,to:o}),l=e.proofs??blobsToProofs({blobs:i,commitments:s,kzg:n,to:o}),c=[];for(let e=0;e2n**256n-1n)throw new G.Hh({maxFeePerGas:o});if(l)throw new R.G("`accessList` is not a valid Legacy Transaction attribute.")}(e);let d=[s?(0,O.NC)(s):"0x",u?(0,O.NC)(u):"0x",o?(0,O.NC)(o):"0x",l??"0x",c?(0,O.NC)(c):"0x",i??"0x"];if(t){let e=(()=>{if(t.v>=35n){let e=(t.v-35n)/2n;return e>0?t.v:27n+(35n===t.v?0n:1n)}if(n>0)return BigInt(2*n)+BigInt(35n+t.v-27n);let e=27n+(27n===t.v?0n:1n);if(t.v!==e)throw new N.vl({v:t.v});return e})();d=[...d,(0,O.NC)(e),t.r,t.s]}else n>0&&(d=[...d,(0,O.NC)(n),"0x","0x"]);return toRlp(d)}(e,t)}function toYParitySignatureArray(e,t){let{r:n,s:o,v:i,yParity:s}=t??e;if(void 0===n||void 0===o||void 0===i&&void 0===s)return[];let l="number"==typeof s?s?(0,O.NC)(1):"0x":0n===i?"0x":1n===i?(0,O.NC)(1):27n===i?"0x":(0,O.NC)(1);return[l,(0,z.f)(n),(0,z.f)(o)]}let Q={contracts:{gasPriceOracle:{address:"0x420000000000000000000000000000000000000F"},l1Block:{address:"0x4200000000000000000000000000000000000015"},l2CrossDomainMessenger:{address:"0x4200000000000000000000000000000000000007"},l2Erc721Bridge:{address:"0x4200000000000000000000000000000000000014"},l2StandardBridge:{address:"0x4200000000000000000000000000000000000010"},l2ToL1MessagePasser:{address:"0x4200000000000000000000000000000000000016"}},formatters:j,serializers:{transaction:function(e,t){return"deposit"===e.type||void 0!==e.sourceHash?function(e){!function(e){let{from:t,to:n}=e;if(t&&!(0,P.U)(t))throw new T.b({address:t});if(n&&!(0,P.U)(n))throw new T.b({address:n})}(e);let{sourceHash:t,data:n,from:o,gas:i,isSystemTx:s,mint:l,to:c,value:u}=e,d=[t,o,c??"0x",l?(0,O.NC)(l):"0x",u?(0,O.NC)(u):"0x",i?(0,O.NC)(i):"0x",s?"0x1":"0x",n??"0x"];return(0,M.SM)(["0x7e",toRlp(d)])}(e):serializeTransaction(e,t)}}},K=(0,C.a)({...Q,id:10,name:"OP Mainnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.optimism.io"]}},blockExplorers:{default:{name:"Optimism Explorer",url:"https://optimistic.etherscan.io",apiUrl:"https://api-optimistic.etherscan.io/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0xdfe97868233d1aa22e815a266982f2cf17685a27"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:4286263},portal:{1:{address:"0xbEb5Fc579115071764c7423A4f12eDde41f106Ed"}},l1StandardBridge:{1:{address:"0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1"}}},sourceId:1}),V=(0,C.a)({id:14,name:"Flare Mainnet",nativeCurrency:{decimals:18,name:"flare",symbol:"FLR"},rpcUrls:{default:{http:["https://flare-api.flare.network/ext/C/rpc"]}},blockExplorers:{default:{name:"Flare Explorer",url:"https://flare-explorer.flare.network",apiUrl:"https://flare-explorer.flare.network/api"}}}),Z=(0,C.a)({id:16,name:"Coston",nativeCurrency:{decimals:18,name:"costonflare",symbol:"CFLR"},rpcUrls:{default:{http:["https://coston-api.flare.network/ext/C/rpc"]}},blockExplorers:{default:{name:"Coston Explorer",url:"https://coston-explorer.flare.network",apiUrl:"https://coston-explorer.flare.network/api"}},testnet:!0}),J=(0,C.a)({id:19,name:"Songbird Mainnet",nativeCurrency:{decimals:18,name:"songbird",symbol:"SGB"},rpcUrls:{default:{http:["https://songbird-api.flare.network/ext/C/rpc"]}},blockExplorers:{default:{name:"Songbird Explorer",url:"https://songbird-explorer.flare.network",apiUrl:"https://songbird-explorer.flare.network/api"}}}),X=(0,C.a)({id:25,name:"Cronos Mainnet",nativeCurrency:{decimals:18,name:"Cronos",symbol:"CRO"},rpcUrls:{default:{http:["https://evm.cronos.org"]}},blockExplorers:{default:{name:"Cronos Explorer",url:"https://explorer.cronos.org",apiUrl:"https://explorer-api.cronos.org/mainnet/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:1963112}}}),Y=(0,C.a)({id:30,name:"Rootstock Mainnet",network:"rootstock",nativeCurrency:{decimals:18,name:"Rootstock Bitcoin",symbol:"RBTC"},rpcUrls:{default:{http:["https://public-node.rsk.co"]}},blockExplorers:{default:{name:"RSK Explorer",url:"https://explorer.rsk.co"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:4249540}}}),$=(0,C.a)({id:40,name:"Telos",nativeCurrency:{decimals:18,name:"Telos",symbol:"TLOS"},rpcUrls:{default:{http:["https://mainnet.telos.net/evm"]}},blockExplorers:{default:{name:"Teloscan",url:"https://www.teloscan.io/"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:246530709}}}),ee=(0,C.a)({id:41,name:"Telos",nativeCurrency:{decimals:18,name:"Telos",symbol:"TLOS"},rpcUrls:{default:{http:["https://testnet.telos.net/evm"]}},blockExplorers:{default:{name:"Teloscan (testnet)",url:"https://testnet.teloscan.io/"}},testnet:!0}),et=(0,C.a)({id:42,network:"lukso",name:"LUKSO",nativeCurrency:{name:"LUKSO",symbol:"LYX",decimals:18},rpcUrls:{default:{http:["https://rpc.mainnet.lukso.network"],webSocket:["wss://ws-rpc.mainnet.lukso.network"]}},blockExplorers:{default:{name:"LUKSO Mainnet Explorer",url:"https://explorer.execution.mainnet.lukso.network",apiUrl:"https://api.explorer.execution.mainnet.lukso.network/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:468183}}}),er=(0,C.a)({id:50,name:"XinFin Network",nativeCurrency:{decimals:18,name:"XDC",symbol:"XDC"},rpcUrls:{default:{http:["https://rpc.xinfin.network"]}},blockExplorers:{xinfin:{name:"XinFin",url:"https://explorer.xinfin.network"},default:{name:"Blocksscan",url:"https://xdc.blocksscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:71542788}}}),en=(0,C.a)({id:51,name:"Apothem Network",nativeCurrency:{decimals:18,name:"TXDC",symbol:"TXDC"},rpcUrls:{default:{http:["https://erpc.apothem.network"]}},blockExplorers:{default:{name:"Blocksscan",url:"https://apothem.blocksscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:59765389}}}),ea=(0,C.a)({id:56,name:"BNB Smart Chain",nativeCurrency:{decimals:18,name:"BNB",symbol:"BNB"},rpcUrls:{default:{http:["https://rpc.ankr.com/bsc"]}},blockExplorers:{default:{name:"BscScan",url:"https://bscscan.com",apiUrl:"https://api.bscscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:15921452}}}),eo=(0,C.a)({id:57,name:"Syscoin Mainnet",nativeCurrency:{decimals:18,name:"Syscoin",symbol:"SYS"},rpcUrls:{default:{http:["https://rpc.syscoin.org"],webSocket:["wss://rpc.syscoin.org/wss"]}},blockExplorers:{default:{name:"SyscoinExplorer",url:"https://explorer.syscoin.org",apiUrl:"https://explorer.syscoin.org/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:287139}}}),ei=(0,C.a)({id:61,name:"Ethereum Classic",nativeCurrency:{decimals:18,name:"ETC",symbol:"ETC"},rpcUrls:{default:{http:["https://etc.rivet.link"]}},blockExplorers:{default:{name:"Blockscout",url:"https://blockscout.com/etc/mainnet"}}}),es=(0,C.a)({id:66,name:"OKC",nativeCurrency:{decimals:18,name:"OKT",symbol:"OKT"},rpcUrls:{default:{http:["https://exchainrpc.okex.org"]}},blockExplorers:{default:{name:"oklink",url:"https://www.oklink.com/okc"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:10364792}}}),el=(0,C.a)({id:71,name:"Conflux eSpace Testnet",network:"cfx-espace-testnet",testnet:!0,nativeCurrency:{name:"Conflux",symbol:"CFX",decimals:18},rpcUrls:{default:{http:["https://evmtestnet.confluxrpc.org"],webSocket:["wss://evmtestnet.confluxrpc.org/ws"]}},blockExplorers:{default:{name:"ConfluxScan",url:"https://evmtestnet.confluxscan.io"}},contracts:{multicall3:{address:"0xEFf0078910f638cd81996cc117bccD3eDf2B072F",blockCreated:117499050}}}),ec=(0,C.a)({id:82,name:"Meter",nativeCurrency:{decimals:18,name:"MTR",symbol:"MTR"},rpcUrls:{default:{http:["https://rpc.meter.io"]}},blockExplorers:{default:{name:"MeterScan",url:"https://scan.meter.io"}}}),eu=(0,C.a)({id:83,name:"Meter Testnet",nativeCurrency:{decimals:18,name:"MTR",symbol:"MTR"},rpcUrls:{default:{http:["https://rpctest.meter.io"]}},blockExplorers:{default:{name:"MeterTestnetScan",url:"https://scan-warringstakes.meter.io"}}}),ed=(0,C.a)({id:97,name:"Binance Smart Chain Testnet",nativeCurrency:{decimals:18,name:"BNB",symbol:"tBNB"},rpcUrls:{default:{http:["https://data-seed-prebsc-1-s1.bnbchain.org:8545"]}},blockExplorers:{default:{name:"BscScan",url:"https://testnet.bscscan.com",apiUrl:"https://testnet.bscscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:17422483}},testnet:!0}),ep=(0,C.a)({id:100,name:"Gnosis",nativeCurrency:{decimals:18,name:"Gnosis",symbol:"xDAI"},rpcUrls:{default:{http:["https://rpc.gnosischain.com"],webSocket:["wss://rpc.gnosischain.com/wss"]}},blockExplorers:{default:{name:"Gnosisscan",url:"https://gnosisscan.io",apiUrl:"https://api.gnosisscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:21022491}}}),eh=(0,C.a)({id:109,name:"Shibarium",network:"shibarium",nativeCurrency:{name:"Bone",symbol:"BONE",decimals:18},rpcUrls:{default:{http:["https://rpc.shibrpc.com"]}},blockExplorers:{default:{name:"Blockscout",url:"https://shibariumscan.io"}},contracts:{multicall3:{address:"0x864Bf681ADD6052395188A89101A1B37d3B4C961",blockCreated:265900}}}),ef=(0,C.a)({id:114,name:"Coston2",nativeCurrency:{decimals:18,name:"coston2flare",symbol:"C2FLR"},rpcUrls:{default:{http:["https://coston2-api.flare.network/ext/C/rpc"]}},blockExplorers:{default:{name:"Coston2 Explorer",url:"https://coston2-explorer.flare.network",apiUrl:"https://coston2-explorer.flare.network/api"}},testnet:!0}),em=(0,C.a)({id:122,name:"Fuse",nativeCurrency:{name:"Fuse",symbol:"FUSE",decimals:18},rpcUrls:{default:{http:["https://rpc.fuse.io"]}},blockExplorers:{default:{name:"Fuse Explorer",url:"https://explorer.fuse.io",apiUrl:"https://explorer.fuse.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:16146628}}}),eg=(0,C.a)({id:123,name:"Fuse Sparknet",nativeCurrency:{name:"Spark",symbol:"SPARK",decimals:18},rpcUrls:{default:{http:["https://rpc.fusespark.io"]}},blockExplorers:{default:{name:"Sparkent Explorer",url:"https://explorer.fusespark.io",apiUrl:"https://explorer.fusespark.io/api"}}}),eb=(0,C.a)({id:137,name:"Polygon",nativeCurrency:{name:"MATIC",symbol:"MATIC",decimals:18},rpcUrls:{default:{http:["https://polygon-rpc.com"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://polygonscan.com",apiUrl:"https://api.polygonscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:25770160}}}),ey=(0,C.a)({id:148,name:"Shimmer",network:"shimmer",nativeCurrency:{decimals:18,name:"Shimmer",symbol:"SMR"},rpcUrls:{default:{http:["https://json-rpc.evm.shimmer.network"]}},blockExplorers:{default:{name:"Shimmer Network Explorer",url:"https://explorer.evm.shimmer.network",apiUrl:"https://explorer.evm.shimmer.network/api"}}}),ev=(0,C.a)({id:169,name:"Manta Pacific Mainnet",network:"manta",nativeCurrency:{decimals:18,name:"ETH",symbol:"ETH"},rpcUrls:{default:{http:["https://pacific-rpc.manta.network/http"]}},blockExplorers:{default:{name:"Manta Explorer",url:"https://pacific-explorer.manta.network",apiUrl:"https://pacific-explorer.manta.network/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:332890}}}),ew=(0,C.a)({id:195,name:"X1 Testnet",nativeCurrency:{decimals:18,name:"OKB",symbol:"OKB"},rpcUrls:{default:{http:["https://x1testrpc.okx.com"]}},blockExplorers:{default:{name:"OKLink",url:"https://www.oklink.com/x1-test"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:624344}},testnet:!0}),eC=(0,C.a)({id:199,name:"BitTorrent",network:"bittorrent-chain-mainnet",nativeCurrency:{name:"BitTorrent",symbol:"BTT",decimals:18},rpcUrls:{default:{http:["https://rpc.bittorrentchain.io"]},public:{http:["https://rpc.bittorrentchain.io"]}},blockExplorers:{default:{name:"Bttcscan",url:"https://bttcscan.com",apiUrl:"https://api.bttcscan.com/api"}}}),eE=(0,C.a)({id:204,name:"opBNB",nativeCurrency:{name:"BNB",symbol:"BNB",decimals:18},rpcUrls:{default:{http:["https://opbnb-mainnet-rpc.bnbchain.org"]}},blockExplorers:{default:{name:"opbnbscan",url:"https://mainnet.opbnbscan.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:512881}}}),ex=(0,C.a)({id:240,name:"Nexilix Smart Chain",nativeCurrency:{decimals:18,name:"Nexilix",symbol:"NEXILIX"},rpcUrls:{default:{http:["https://rpcurl.pos.nexilix.com"]}},blockExplorers:{default:{name:"NexilixScan",url:"https://scan.nexilix.com"}},contracts:{multicall3:{address:"0x58381c8e2BF9d0C2C4259cA14BdA9Afe02831244",blockCreated:74448}}}),eA=(0,C.a)({id:242,name:"Plinga",nativeCurrency:{name:"Plinga",symbol:"PLINGA",decimals:18},rpcUrls:{default:{http:["https://rpcurl.mainnet.plgchain.com"]}},blockExplorers:{default:{name:"Plgscan",url:"https://www.plgscan.com"}},contracts:{multicall3:{address:"0x0989576160f2e7092908BB9479631b901060b6e4",blockCreated:204489}}}),ek=(0,C.a)({id:248,name:"Oasys",nativeCurrency:{name:"Oasys",symbol:"OAS",decimals:18},rpcUrls:{default:{http:["https://rpc.mainnet.oasys.games"]}},blockExplorers:{default:{name:"OasysScan",url:"https://scan.oasys.games",apiUrl:"https://scan.oasys.games/api"}}}),eB=(0,C.a)({id:250,name:"Fantom",nativeCurrency:{decimals:18,name:"Fantom",symbol:"FTM"},rpcUrls:{default:{http:["https://rpc.ankr.com/fantom"]}},blockExplorers:{default:{name:"FTMScan",url:"https://ftmscan.com",apiUrl:"https://api.ftmscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:33001987}}}),eS=(0,C.a)({...Q,id:252,name:"Fraxtal",nativeCurrency:{name:"Frax Ether",symbol:"frxETH",decimals:18},rpcUrls:{default:{http:["https://rpc.frax.com"]}},blockExplorers:{default:{name:"fraxscan",url:"https://fraxscan.com",apiUrl:"https://api.fraxscan.com/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0x66CC916Ed5C6C2FA97014f7D1cD141528Ae171e4"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11"},portal:{1:{address:"0x36cb65c1967A0Fb0EEE11569C51C2f2aA1Ca6f6D",blockCreated:19135323}},l1StandardBridge:{1:{address:"0x34C0bD5877A5Ee7099D0f5688D65F4bB9158BDE2",blockCreated:19135323}}},sourceId:1}),eI=(0,C.a)({id:255,name:"Kroma",nativeCurrency:{name:"ETH",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://api.kroma.network"]}},blockExplorers:{default:{name:"Kroma Explorer",url:"https://blockscout.kroma.network",apiUrl:"https://blockscout.kroma.network/api"}},testnet:!1}),ej=(0,C.a)({id:260,name:"zkSync InMemory Node",network:"zksync-in-memory-node",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["http://localhost:8011"]}},testnet:!0}),eT=(0,C.a)({id:270,name:"zkSync CLI Local Node",network:"zksync-cli-local-node",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["http://localhost:3050"]}},testnet:!0}),eP=(0,C.a)({id:288,name:"Boba Network",nativeCurrency:{decimals:18,name:"Boba",symbol:"BOBA"},rpcUrls:{default:{http:["https://mainnet.boba.network"]}},blockExplorers:{default:{name:"BOBAScan",url:"https://bobascan.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:446859}}}),eM=(0,C.a)({id:295,name:"Hedera Mainnet",network:"hedera-mainnet",nativeCurrency:{symbol:"HBAR",name:"HBAR",decimals:18},rpcUrls:{default:{http:["https://mainnet.hashio.io/api"]}},blockExplorers:{default:{name:"Hashscan",url:"https://hashscan.io/mainnet"}},testnet:!1}),eO=(0,C.a)({id:296,name:"Hedera Testnet",network:"hedera-testnet",nativeCurrency:{symbol:"HBAR",name:"HBAR",decimals:18},rpcUrls:{default:{http:["https://testnet.hashio.io/api"]}},blockExplorers:{default:{name:"Hashscan",url:"https://hashscan.io/testnet"}},testnet:!0}),eR=(0,C.a)({id:297,name:"Hedera Previewnet",network:"hedera-previewnet",nativeCurrency:{symbol:"HBAR",name:"HBAR",decimals:18},rpcUrls:{default:{http:["https://previewnet.hashio.io/api"]}},blockExplorers:{default:{name:"Hashscan",url:"https://hashscan.io/previewnet"}},testnet:!0});var eU=n(53992),eF=n(74688);let eN={block:(0,B.G)({format(e){let t=e.transactions?.map(e=>{if("string"==typeof e)return e;let t=eN.transaction?.format(e);return"0x71"===t.typeHex?t.type="eip712":"0xff"===t.typeHex&&(t.type="priority"),t});return{l1BatchNumber:e.l1BatchNumber?(0,k.y_)(e.l1BatchNumber):null,l1BatchTimestamp:e.l1BatchTimestamp?(0,k.y_)(e.l1BatchTimestamp):null,transactions:t}}}),transaction:(0,S.y_)({format(e){let t={};return"0x71"===e.type?t.type="eip712":"0xff"===e.type&&(t.type="priority"),{...t,l1BatchNumber:e.l1BatchNumber?(0,k.y_)(e.l1BatchNumber):null,l1BatchTxIndex:e.l1BatchTxIndex?(0,k.y_)(e.l1BatchTxIndex):null}}}),transactionReceipt:(0,I.d)({format:e=>({l1BatchNumber:e.l1BatchNumber?(0,k.y_)(e.l1BatchNumber):null,l1BatchTxIndex:e.l1BatchTxIndex?(0,k.y_)(e.l1BatchTxIndex):null,logs:e.logs.map(e=>({...(0,eU.U)(e),l1BatchNumber:e.l1BatchNumber?(0,k.y_)(e.l1BatchNumber):null,transactionLogIndex:(0,k.ly)(e.transactionLogIndex),logType:e.logType})),l2ToL1Logs:e.l2ToL1Logs.map(e=>({blockNumber:(0,k.y_)(e.blockHash),blockHash:e.blockHash,l1BatchNumber:(0,k.y_)(e.l1BatchNumber),transactionIndex:(0,k.y_)(e.transactionIndex),shardId:(0,k.y_)(e.shardId),isService:e.isService,sender:e.sender,key:e.key,value:e.value,transactionHash:e.transactionHash,logIndex:(0,k.y_)(e.logIndex)}))})}),transactionRequest:(0,eF.iy)({exclude:["customSignature","factoryDeps","gasPerPubdata","paymaster","paymasterInput"],format:e=>e.gasPerPubdata||e.paymaster&&e.paymasterInput||e.factoryDeps||e.customSignature?{eip712Meta:{...e.gasPerPubdata?{gasPerPubdata:(0,O.NC)(e.gasPerPubdata)}:{},...e.paymaster&&e.paymasterInput?{paymasterParams:{paymaster:e.paymaster,paymasterInput:Array.from((0,F.nr)(e.paymasterInput))}}:{},...e.factoryDeps?{factoryDeps:e.factoryDeps}:{},...e.customSignature?{customSignature:Array.from((0,F.nr)(e.customSignature))}:{}},type:"0x71"}:{}})};let InvalidEip712TransactionError=class InvalidEip712TransactionError extends R.G{constructor(){super('Transaction is not an EIP712 transaction.\n\nTransaction must:\n - include `type: "eip712"`\n - include one of the following: `customSignature`, `paymaster`, `paymasterInput`, `gasPerPubdata`, `factoryDeps`'),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidEip712TransactionError"})}};function isEIP712Transaction(e){return"eip712"===e.type||"customSignature"in e&&!!e.customSignature||"paymaster"in e&&!!e.paymaster||"paymasterInput"in e&&!!e.paymasterInput||"gasPerPubdata"in e&&"bigint"==typeof e.gasPerPubdata||"factoryDeps"in e&&!!e.factoryDeps}function assertEip712Transaction(e){let{chainId:t,to:n,from:o,paymaster:i,paymasterInput:s}=e;if(!isEIP712Transaction(e))throw new InvalidEip712TransactionError;if(!t||t<=0)throw new q.hJ({chainId:t});if(n&&!(0,P.U)(n))throw new T.b({address:n});if(o&&!(0,P.U)(o))throw new T.b({address:o});if(i&&!(0,P.U)(i))throw new T.b({address:i});if(i&&!s)throw new R.G("`paymasterInput` must be provided when `paymaster` is defined");if(!i&&s)throw new R.G("`paymaster` must be provided when `paymasterInput` is defined")}let eD={formatters:eN,serializers:{transaction:function(e,t){return isEIP712Transaction(e)?function(e){let{chainId:t,gas:n,nonce:o,to:i,from:s,value:l,maxFeePerGas:c,maxPriorityFeePerGas:u,customSignature:d,factoryDeps:p,paymaster:f,paymasterInput:m,gasPerPubdata:g,data:b}=e;assertEip712Transaction(e);let y=[o?(0,O.NC)(o):"0x",u?(0,O.NC)(u):"0x",c?(0,O.NC)(c):"0x",n?(0,O.NC)(n):"0x",i??"0x",l?(0,O.NC)(l):"0x",b??"0x0",(0,O.NC)(t),(0,O.NC)(""),(0,O.NC)(""),(0,O.NC)(t),s??"0x",g?(0,O.NC)(g):"0x",p??[],d??"0x",f&&m?[f,m]:[]];return(0,M.SM)(["0x71",toRlp(y)])}(e):serializeTransaction(e,t)}},custom:{getEip712Domain:e=>{assertEip712Transaction(e);let t=function(e){let{gas:t,nonce:n,to:o,from:i,value:s,maxFeePerGas:l,maxPriorityFeePerGas:c,factoryDeps:u,paymaster:d,paymasterInput:p,gasPerPubdata:f,data:m}=e;return{txType:113n,from:BigInt(i),to:o?BigInt(o):0n,gasLimit:t??0n,gasPerPubdataByteLimit:f??0n,maxFeePerGas:l??0n,maxPriorityFeePerGas:c??0n,paymaster:d?BigInt(d):0n,nonce:n?BigInt(n):0n,value:s??0n,data:m||"0x0",factoryDeps:u??[],paymasterInput:p||"0x0"}}(e);return{domain:{name:"zkSync",version:"2",chainId:e.chainId},types:{Transaction:[{name:"txType",type:"uint256"},{name:"from",type:"uint256"},{name:"to",type:"uint256"},{name:"gasLimit",type:"uint256"},{name:"gasPerPubdataByteLimit",type:"uint256"},{name:"maxFeePerGas",type:"uint256"},{name:"maxPriorityFeePerGas",type:"uint256"},{name:"paymaster",type:"uint256"},{name:"nonce",type:"uint256"},{name:"value",type:"uint256"},{name:"data",type:"bytes"},{name:"factoryDeps",type:"bytes32[]"},{name:"paymasterInput",type:"bytes"}]},primaryType:"Transaction",message:t}}}},e_=(0,C.a)({...eD,id:300,name:"zkSync Sepolia Testnet",network:"zksync-sepolia-testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.era.zksync.dev"],webSocket:["wss://sepolia.era.zksync.dev/ws"]}},blockExplorers:{default:{name:"zkExplorer",url:"https://sepolia.explorer.zksync.io/"}},contracts:{multicall3:{address:"0xF9cda624FBC7e059355ce98a31693d299FACd963"}},testnet:!0}),eL=(0,C.a)({id:314,name:"Filecoin Mainnet",nativeCurrency:{decimals:18,name:"filecoin",symbol:"FIL"},rpcUrls:{default:{http:["https://api.node.glif.io/rpc/v1"]}},blockExplorers:{default:{name:"Filfox",url:"https://filfox.info/en"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3328594}}}),ez=(0,C.a)({id:321,name:"KCC Mainnet",network:"KCC Mainnet",nativeCurrency:{decimals:18,name:"KCS",symbol:"KCS"},rpcUrls:{default:{http:["https://kcc-rpc.com"]},public:{http:["https://kcc-rpc.com"]}},blockExplorers:{default:{name:"KCC Explorer",url:"https://explorer.kcc.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:11760430}},testnet:!1}),eq=(0,C.a)({...eD,id:324,name:"zkSync Era",network:"zksync-era",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://mainnet.era.zksync.io"],webSocket:["wss://mainnet.era.zksync.io/ws"]}},blockExplorers:{default:{name:"Etherscan",url:"https://era.zksync.network/",apiUrl:"https://api-era.zksync.network/api"}},contracts:{multicall3:{address:"0xF9cda624FBC7e059355ce98a31693d299FACd963"}}}),eG=(0,C.a)({id:338,name:"Cronos Testnet",nativeCurrency:{decimals:18,name:"CRO",symbol:"tCRO"},rpcUrls:{default:{http:["https://evm-t3.cronos.org"]}},blockExplorers:{default:{name:"Cronos Explorer",url:"https://cronos.org/explorer/testnet3"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:10191251}},testnet:!0}),eW=(0,C.a)({id:369,name:"PulseChain",nativeCurrency:{name:"Pulse",symbol:"PLS",decimals:18},testnet:!1,rpcUrls:{default:{http:["https://rpc.pulsechain.com"],webSocket:["wss://ws.pulsechain.com"]}},blockExplorers:{default:{name:"PulseScan",url:"https://scan.pulsechain.com",apiUrl:"https://api.scan.pulsechain.com/api"}},contracts:{ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14353601}}}),eH=(0,C.a)({...Q,id:420,name:"Optimism Goerli",nativeCurrency:{name:"Goerli Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://goerli.optimism.io"]}},blockExplorers:{default:{name:"Etherscan",url:"https://goerli-optimism.etherscan.io",apiUrl:"https://goerli-optimism.etherscan.io/api"}},contracts:{...Q.contracts,l2OutputOracle:{5:{address:"0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:49461},portal:{5:{address:"0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383"}},l1StandardBridge:{5:{address:"0x636Af16bf2f682dD3109e60102b8E1A089FedAa8"}}},testnet:!0,sourceId:5}),eQ=(0,C.a)({id:424,network:"pgn",name:"PGN",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.publicgoods.network"]}},blockExplorers:{default:{name:"PGN Explorer",url:"https://explorer.publicgoods.network",apiUrl:"https://explorer.publicgoods.network/api"},blocksout:{name:"PGN Explorer",url:"https://explorer.publicgoods.network",apiUrl:"https://explorer.publicgoods.network/api"}},contracts:{l2OutputOracle:{1:{address:"0x9E6204F750cD866b299594e2aC9eA824E2e5f95c"}},multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3380209},portal:{1:{address:"0xb26Fd985c5959bBB382BAFdD0b879E149e48116c"}},l1StandardBridge:{1:{address:"0xD0204B9527C1bA7bD765Fa5CCD9355d38338272b"}}},formatters:j,sourceId:1}),eK=(0,C.a)({id:570,name:"Rollux Mainnet",nativeCurrency:{decimals:18,name:"Syscoin",symbol:"SYS"},rpcUrls:{default:{http:["https://rpc.rollux.com"],webSocket:["wss://rpc.rollux.com/wss"]}},blockExplorers:{default:{name:"RolluxExplorer",url:"https://explorer.rollux.com",apiUrl:"https://explorer.rollux.com/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:119222}}}),eV=(0,C.a)({id:571,name:"MetaChain Mainnet",nativeCurrency:{name:"Metatime Coin",symbol:"MTC",decimals:18},rpcUrls:{default:{http:["https://rpc.metatime.com"]}},blockExplorers:{default:{name:"MetaExplorer",url:"https://explorer.metatime.com"}},contracts:{multicall3:{address:"0x0000000000000000000000000000000000003001",blockCreated:0}}}),eZ=(0,C.a)({id:592,name:"Astar",network:"astar-mainnet",nativeCurrency:{name:"Astar",symbol:"ASTR",decimals:18},rpcUrls:{default:{http:["https://astar.api.onfinality.io/public"]}},blockExplorers:{default:{name:"Astar Subscan",url:"https://astar.subscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:761794}},testnet:!1}),eJ=(0,C.a)({id:595,name:"Mandala TC9",network:"mandala",nativeCurrency:{name:"Mandala",symbol:"mACA",decimals:18},rpcUrls:{public:{http:["https://eth-rpc-tc9.aca-staging.network"],webSocket:["wss://eth-rpc-tc9.aca-staging.network"]},default:{http:["https://eth-rpc-tc9.aca-staging.network"],webSocket:["wss://eth-rpc-tc9.aca-staging.network"]}},blockExplorers:{default:{name:"Mandala Blockscout",url:"https://blockscout.mandala.aca-staging.network",apiUrl:"https://blockscout.mandala.aca-staging.network/api"}},testnet:!0}),eX=(0,C.a)({id:599,name:"Metis Goerli",nativeCurrency:{decimals:18,name:"Metis Goerli",symbol:"METIS"},rpcUrls:{default:{http:["https://goerli.gateway.metisdevops.link"]}},blockExplorers:{default:{name:"Metis Goerli Explorer",url:"https://goerli.explorer.metisdevops.link",apiUrl:"https://goerli.explorer.metisdevops.link/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:1006207}}}),eY=(0,C.a)({id:646,name:"FlowEVM Previewnet",nativeCurrency:{decimals:18,name:"Flow",symbol:"FLOW"},rpcUrls:{default:{http:["https://previewnet.evm.nodes.onflow.org"]}},blockExplorers:{default:{name:"Previewnet Explorer",url:"https://previewnet.flowdiver.io"}}}),e$=(0,C.a)({id:686,name:"Karura",network:"karura",nativeCurrency:{name:"Karura",symbol:"KAR",decimals:18},rpcUrls:{public:{http:["https://eth-rpc-karura.aca-api.network"],webSocket:["wss://eth-rpc-karura.aca-api.network"]},default:{http:["https://eth-rpc-karura.aca-api.network"],webSocket:["wss://eth-rpc-karura.aca-api.network"]}},blockExplorers:{default:{name:"Karura Blockscout",url:"https://blockscout.karura.network",apiUrl:"https://blockscout.karura.network/api"}},testnet:!1}),e0=(0,C.a)({id:747,name:"FlowEVM Mainnet",nativeCurrency:{decimals:18,name:"Flow",symbol:"FLOW"},rpcUrls:{default:{http:["https://mainnet.evm.nodes.onflow.org"]}},blockExplorers:{default:{name:"Mainnet Explorer",url:"https://flowdiver.io"}}}),e1=(0,C.a)({id:787,name:"Acala",network:"acala",nativeCurrency:{name:"Acala",symbol:"ACA",decimals:18},rpcUrls:{public:{http:["https://eth-rpc-acala.aca-api.network"],webSocket:["wss://eth-rpc-acala.aca-api.network"]},default:{http:["https://eth-rpc-acala.aca-api.network"],webSocket:["wss://eth-rpc-acala.aca-api.network"]}},blockExplorers:{default:{name:"Acala Blockscout",url:"https://blockscout.acala.network",apiUrl:"https://blockscout.acala.network/api"}},testnet:!1}),e6=(0,C.a)({id:841,name:"Taraxa Mainnet",nativeCurrency:{name:"Tara",symbol:"TARA",decimals:18},rpcUrls:{default:{http:["https://rpc.mainnet.taraxa.io"]}},blockExplorers:{default:{name:"Taraxa Explorer",url:"https://explorer.mainnet.taraxa.io"}}}),e3=(0,C.a)({id:842,name:"Taraxa Testnet",nativeCurrency:{name:"Tara",symbol:"TARA",decimals:18},rpcUrls:{default:{http:["https://rpc.testnet.taraxa.io"]}},blockExplorers:{default:{name:"Taraxa Explorer",url:"https://explorer.testnet.taraxa.io"}},testnet:!0}),e2=(0,C.a)({id:888,name:"Wanchain",nativeCurrency:{name:"WANCHAIN",symbol:"WAN",decimals:18},rpcUrls:{default:{http:["https://gwan-ssl.wandevs.org:56891","https://gwan2-ssl.wandevs.org"]}},blockExplorers:{default:{name:"WanScan",url:"https://wanscan.org"}},contracts:{multicall3:{address:"0xcDF6A1566e78EB4594c86Fe73Fcdc82429e97fbB",blockCreated:25312390}}}),e7=(0,C.a)({id:919,name:"Mode Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.mode.network"]}},blockExplorers:{default:{name:"Blockscout",url:"https://sepolia.explorer.mode.network",apiUrl:"https://sepolia.explorer.mode.network/api"}},contracts:{multicall3:{address:"0xBAba8373113Fb7a68f195deF18732e01aF8eDfCF",blockCreated:3019007}},testnet:!0}),e8=(0,C.a)({id:943,name:"PulseChain V4",testnet:!0,nativeCurrency:{name:"V4 Pulse",symbol:"v4PLS",decimals:18},rpcUrls:{default:{http:["https://rpc.v4.testnet.pulsechain.com"],webSocket:["wss://ws.v4.testnet.pulsechain.com"]}},blockExplorers:{default:{name:"PulseScan",url:"https://scan.v4.testnet.pulsechain.com",apiUrl:"https://scan.v4.testnet.pulsechain.com/api"}},contracts:{ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14353601}}}),e5=(0,C.a)({id:997,name:"5ireChain Thunder Testnet",nativeCurrency:{name:"5ire Token",symbol:"5IRE",decimals:18},rpcUrls:{default:{http:["https://rpc-testnet.5ire.network"]}},blockExplorers:{default:{name:"5ireChain Explorer",url:"https://explorer.5ire.network"}},testnet:!0}),e4=(0,C.a)({id:999,name:"Wanchain Testnet",nativeCurrency:{name:"WANCHAIN",symbol:"WANt",decimals:18},rpcUrls:{default:{http:["https://gwan-ssl.wandevs.org:46891"]}},blockExplorers:{default:{name:"WanScanTest",url:"https://wanscan.org"}},contracts:{multicall3:{address:"0x11c89bF4496c39FB80535Ffb4c92715839CC5324",blockCreated:24743448}},testnet:!0}),e9=(0,C.a)({...Q,id:999,name:"Zora Goerli Testnet",nativeCurrency:{decimals:18,name:"Zora Goerli",symbol:"ETH"},rpcUrls:{default:{http:["https://testnet.rpc.zora.energy"],webSocket:["wss://testnet.rpc.zora.energy"]}},blockExplorers:{default:{name:"Explorer",url:"https://testnet.explorer.zora.energy",apiUrl:"https://testnet.explorer.zora.energy/api"}},contracts:{...Q.contracts,multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:189123},portal:{5:{address:"0xDb9F51790365e7dc196e7D072728df39Be958ACe"}}},sourceId:5,testnet:!0}),te=(0,C.a)({id:1001,name:"Klaytn Baobab Testnet",network:"klaytn-baobab",nativeCurrency:{decimals:18,name:"Baobab Klaytn",symbol:"KLAY"},rpcUrls:{default:{http:["https://public-en-baobab.klaytn.net"]}},blockExplorers:{default:{name:"KlaytnScope",url:"https://baobab.klaytnscope.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:123390593}},testnet:!0}),tt=(0,C.a)({id:1004,name:"Ekta Testnet",nativeCurrency:{decimals:18,name:"EKTA",symbol:"EKTA"},rpcUrls:{default:{http:["https://test.ekta.io:8545"]}},blockExplorers:{default:{name:"Test Ektascan",url:"https://test.ektascan.io",apiUrl:"https://test.ektascan.io/api"}},testnet:!0}),tr=(0,C.a)({id:1017,name:"BNB Greenfield Chain",nativeCurrency:{decimals:18,name:"BNB",symbol:"BNB"},rpcUrls:{default:{http:["https://greenfield-chain.bnbchain.org"]}},blockExplorers:{default:{name:"BNB Greenfield Mainnet Scan",url:"https://greenfieldscan.com"}},testnet:!1}),tn=(0,C.a)({id:1028,name:"BitTorrent Chain Testnet",network:"bittorrent-chain-testnet",nativeCurrency:{name:"BitTorrent",symbol:"BTT",decimals:18},rpcUrls:{default:{http:["https://testrpc.bittorrentchain.io"]},public:{http:["https://testrpc.bittorrentchain.io"]}},blockExplorers:{default:{name:"Bttcscan",url:"https://testnet.bttcscan.com",apiUrl:"https://testnet.bttcscan.com/api"}},testnet:!0}),ta=(0,C.a)({id:1030,name:"Conflux eSpace",nativeCurrency:{name:"Conflux",symbol:"CFX",decimals:18},rpcUrls:{default:{http:["https://evm.confluxrpc.org"],webSocket:["wss://evm.confluxrpc.org/ws"]}},blockExplorers:{default:{name:"ConfluxScan",url:"https://evm.confluxscan.io"}},contracts:{multicall3:{address:"0xEFf0078910f638cd81996cc117bccD3eDf2B072F",blockCreated:68602935}}}),to=(0,C.a)({id:1038,name:"Bronos Testnet",nativeCurrency:{decimals:18,name:"Bronos Coin",symbol:"tBRO"},rpcUrls:{default:{http:["https://evm-testnet.bronos.org"]}},blockExplorers:{default:{name:"BronoScan",url:"https://tbroscan.bronos.org"}},testnet:!0}),ti=(0,C.a)({id:1039,name:"Bronos",nativeCurrency:{decimals:18,name:"BRO",symbol:"BRO"},rpcUrls:{default:{http:["https://evm.bronos.org"]}},blockExplorers:{default:{name:"BronoScan",url:"https://broscan.bronos.org"}}}),ts=(0,C.a)({id:1073,name:"Shimmer Testnet",network:"shimmer-testnet",nativeCurrency:{decimals:18,name:"Shimmer",symbol:"SMR"},rpcUrls:{default:{http:["https://json-rpc.evm.testnet.shimmer.network"]}},blockExplorers:{default:{name:"Shimmer Network Explorer",url:"https://explorer.evm.testnet.shimmer.network",apiUrl:"https://explorer.evm.testnet.shimmer.network/api"}},testnet:!0}),tl=(0,C.a)({id:1088,name:"Metis",nativeCurrency:{decimals:18,name:"Metis",symbol:"METIS"},rpcUrls:{default:{http:["https://andromeda.metis.io/?owner=1088"]}},blockExplorers:{default:{name:"Andromeda Explorer",url:"https://andromeda-explorer.metis.io",apiUrl:"https://andromeda-explorer.metis.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:2338552}}}),tc=(0,C.a)({id:1101,name:"Polygon zkEVM",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://zkevm-rpc.com"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://zkevm.polygonscan.com",apiUrl:"https://api-zkevm.polygonscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:57746}}}),tu=(0,C.a)({id:1111,name:"WEMIX",network:"wemix-mainnet",nativeCurrency:{name:"WEMIX",symbol:"WEMIX",decimals:18},rpcUrls:{default:{http:["https://api.wemix.com"]},public:{http:["https://api.wemix.com"]}},blockExplorers:{default:{name:"wemixExplorer",url:"https://explorer.wemix.com"}}}),td=(0,C.a)({id:1112,name:"WEMIX Testnet",network:"wemix-testnet",nativeCurrency:{name:"WEMIX",symbol:"tWEMIX",decimals:18},rpcUrls:{default:{http:["https://api.test.wemix.com"]},public:{http:["https://api.test.wemix.com"]}},blockExplorers:{default:{name:"wemixExplorer",url:"https://testnet.wemixscan.com",apiUrl:"https://testnet.wemixscan.com/api"}},testnet:!0}),tp=(0,C.a)({id:1116,name:"Core Dao",nativeCurrency:{decimals:18,name:"Core",symbol:"CORE"},rpcUrls:{default:{http:["https://rpc.coredao.org"]}},blockExplorers:{default:{name:"CoreDao",url:"https://scan.coredao.org"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:11907934}},testnet:!1}),th=(0,C.a)({id:1130,network:"defichain-evm",name:"DeFiChain EVM Mainnet",nativeCurrency:{name:"DeFiChain",symbol:"DFI",decimals:8},rpcUrls:{default:{http:["https://eth.mainnet.ocean.jellyfishsdk.com"]},public:{http:["https://eth.mainnet.ocean.jellyfishsdk.com"]}},blockExplorers:{default:{name:"DeFiScan",url:"https://meta.defiscan.live"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:137852}}}),tf=(0,C.a)({id:1131,network:"defichain-evm-testnet",name:"DeFiChain EVM Testnet",nativeCurrency:{name:"DeFiChain",symbol:"DFI",decimals:8},rpcUrls:{default:{http:["https://eth.testnet.ocean.jellyfishsdk.com"]},public:{http:["https://eth.testnet.ocean.jellyfishsdk.com"]}},blockExplorers:{default:{name:"DeFiScan",url:"https://meta.defiscan.live/?network=TestNet"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:156462}},testnet:!0}),tm=(0,C.a)({id:1281,name:"Moonbeam Development Node",nativeCurrency:{decimals:18,name:"DEV",symbol:"DEV"},rpcUrls:{default:{http:["http://127.0.0.1:9944"],webSocket:["wss://127.0.0.1:9944"]}}}),tg=(0,C.a)({id:1284,name:"Moonbeam",nativeCurrency:{decimals:18,name:"GLMR",symbol:"GLMR"},rpcUrls:{default:{http:["https://moonbeam.public.blastapi.io"],webSocket:["wss://moonbeam.public.blastapi.io"]}},blockExplorers:{default:{name:"Moonscan",url:"https://moonscan.io",apiUrl:"https://api-moonbeam.moonscan.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:609002}},testnet:!1}),tb=(0,C.a)({id:1285,name:"Moonriver",nativeCurrency:{decimals:18,name:"MOVR",symbol:"MOVR"},rpcUrls:{default:{http:["https://moonriver.public.blastapi.io"],webSocket:["wss://moonriver.public.blastapi.io"]}},blockExplorers:{default:{name:"Moonscan",url:"https://moonriver.moonscan.io",apiUrl:"https://api-moonriver.moonscan.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:1597904}},testnet:!1}),ty=(0,C.a)({id:1287,name:"Moonbase Alpha",nativeCurrency:{decimals:18,name:"DEV",symbol:"DEV"},rpcUrls:{default:{http:["https://rpc.api.moonbase.moonbeam.network"],webSocket:["wss://wss.api.moonbase.moonbeam.network"]}},blockExplorers:{default:{name:"Moonscan",url:"https://moonbase.moonscan.io",apiUrl:"https://moonbase.moonscan.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:1850686}},testnet:!0}),tv=(0,C.a)({id:1337,name:"Localhost",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["http://127.0.0.1:8545"]}}}),tw=(0,C.a)({id:1442,name:"Polygon zkEVM Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.public.zkevm-test.net"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://testnet-zkevm.polygonscan.com",apiUrl:"https://testnet-zkevm.polygonscan.com/api"}},testnet:!0,contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:525686}}}),tC=(0,C.a)({id:1453,name:"MetaChain Istanbul",nativeCurrency:{name:"Metatime Coin",symbol:"MTC",decimals:18},rpcUrls:{default:{http:["https://istanbul-rpc.metachain.dev"]}},blockExplorers:{default:{name:"MetaExplorer",url:"https://istanbul-explorer.metachain.dev"}},contracts:{multicall3:{address:"0x0000000000000000000000000000000000003001",blockCreated:0}},testnet:!0}),tE=(0,C.a)({id:1559,name:"Tenet",network:"tenet-mainnet",nativeCurrency:{name:"TENET",symbol:"TENET",decimals:18},rpcUrls:{default:{http:["https://rpc.tenet.org"]}},blockExplorers:{default:{name:"TenetScan Mainnet",url:"https://tenetscan.io",apiUrl:"https://tenetscan.io/api"}},testnet:!1}),tx=(0,C.a)({id:1663,name:"Horizen Gobi Testnet",nativeCurrency:{decimals:18,name:"Test ZEN",symbol:"tZEN"},rpcUrls:{default:{http:["https://gobi-testnet.horizenlabs.io/ethv1"]}},blockExplorers:{default:{name:"Gobi Explorer",url:"https://gobi-explorer.horizen.io"}},contracts:{},testnet:!0}),tA=(0,C.a)({id:1686,name:"Mint Sepolia Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://testnet-rpc.mintchain.io"]}},blockExplorers:{default:{name:"Mintchain Testnet explorer",url:"https://testnet-explorer.mintchain.io"}},testnet:!0}),tk=(0,C.a)({id:1890,name:"LightLink Phoenix Mainnet",network:"lightlink-phoenix",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://replicator.phoenix.lightlink.io/rpc/v1"]}},blockExplorers:{default:{name:"LightLink Phoenix Explorer",url:"https://phoenix.lightlink.io"}},testnet:!1}),tB=(0,C.a)({id:1891,name:"LightLink Pegasus Testnet",network:"lightlink-pegasus",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://replicator.pegasus.lightlink.io/rpc/v1"]}},blockExplorers:{default:{name:"LightLink Pegasus Explorer",url:"https://pegasus.lightlink.io"}},testnet:!0}),tS=(0,C.a)({id:1994,name:"Ekta",nativeCurrency:{decimals:18,name:"EKTA",symbol:"EKTA"},rpcUrls:{default:{http:["https://main.ekta.io"]}},blockExplorers:{default:{name:"Ektascan",url:"https://ektascan.io",apiUrl:"https://ektascan.io/api"}}}),tI=(0,C.a)({id:2e3,name:"Dogechain",nativeCurrency:{decimals:18,name:"Dogechain",symbol:"DC"},rpcUrls:{default:{http:["https://rpc.dogechain.dog"]}},blockExplorers:{default:{name:"DogeChainExplorer",url:"https://explorer.dogechain.dog",apiUrl:"https://explorer.dogechain.dog/api"}}}),tj=(0,C.a)({id:2020,name:"Ronin",nativeCurrency:{name:"RON",symbol:"RON",decimals:18},rpcUrls:{default:{http:["https://api.roninchain.com/rpc"]}},blockExplorers:{default:{name:"Ronin Explorer",url:"https://app.roninchain.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:26023535}}}),tT=(0,C.a)({id:2021,name:"Edgeware EdgeEVM Mainnet",nativeCurrency:{decimals:18,name:"Edgeware",symbol:"EDG"},rpcUrls:{default:{http:["https://edgeware-evm.jelliedowl.net"]}},blockExplorers:{default:{name:"Edgscan by Bharathcoorg",url:"https://edgscan.live",apiUrl:"https://edgscan.live/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:18117872}}}),tP=(0,C.a)({id:2021,name:"Saigon Testnet",nativeCurrency:{name:"RON",symbol:"RON",decimals:18},rpcUrls:{default:{http:["https://saigon-testnet.roninchain.com/rpc"]}},blockExplorers:{default:{name:"Saigon Explorer",url:"https://saigon-app.roninchain.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:18736871}},testnet:!0}),tM=(0,C.a)({id:2022,name:"Beresheet BereEVM Testnet",nativeCurrency:{decimals:18,name:"Testnet EDG",symbol:"tEDG"},rpcUrls:{default:{http:["https://beresheet-evm.jelliedowl.net"]}},blockExplorers:{default:{name:"Edgscan by Bharathcoorg",url:"https://testnet.edgscan.live",apiUrl:"https://testnet.edgscan.live/api"}}}),tO=(0,C.a)({id:2221,name:"Kava EVM Testnet",network:"kava-testnet",nativeCurrency:{name:"Kava",symbol:"KAVA",decimals:18},rpcUrls:{default:{http:["https://evm.testnet.kava.io"]}},blockExplorers:{default:{name:"Kava EVM Testnet Explorer",url:"https://testnet.kavascan.com/",apiUrl:"https://testnet.kavascan.com/api"}},contracts:{multicall3:{address:"0xDf1D724A7166261eEB015418fe8c7679BBEa7fd6",blockCreated:7242179}},testnet:!0}),tR=(0,C.a)({id:2222,name:"Kava EVM",network:"kava-mainnet",nativeCurrency:{name:"Kava",symbol:"KAVA",decimals:18},rpcUrls:{default:{http:["https://evm.kava.io"]}},blockExplorers:{default:{name:"Kava EVM Explorer",url:"https://kavascan.com",apiUrl:"https://kavascan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:3661165}},testnet:!1}),tU=(0,C.a)({...Q,id:2331,name:"RSS3 VSL Sepolia Testnet",nativeCurrency:{name:"RSS3",symbol:"RSS3",decimals:18},rpcUrls:{default:{http:["https://rpc.testnet.rss3.io"]}},blockExplorers:{default:{name:"RSS3 VSL Sepolia Testnet Scan",url:"https://scan.testnet.rss3.io",apiUrl:"https://scan.testnet.rss3.io/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0xDb5c46C3Eaa6Ed6aE8b2379785DF7dd029C0dC81"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:55697},portal:{11155111:{address:"0xcBD77E8E1E7F06B25baDe67142cdE82652Da7b57",blockCreated:5345035}},l1StandardBridge:{11155111:{address:"0xdDD29bb63B0839FB1cE0eE439Ff027738595D07B"}}},testnet:!0,sourceId:11155111}),tF=(0,C.a)({id:2358,name:"Kroma Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://api.sepolia.kroma.network"]}},blockExplorers:{default:{name:"Kroma Sepolia Explorer",url:"https://blockscout.sepolia.kroma.network",apiUrl:"https://blockscout.sepolia.kroma.network/api"}},testnet:!0}),tN=(0,C.a)({...Q,id:2522,name:"Fraxtal Testnet",nativeCurrency:{name:"Frax Ether",symbol:"frxETH",decimals:18},rpcUrls:{default:{http:["https://rpc.testnet.frax.com"]}},blockExplorers:{default:{name:"fraxscan testnet",url:"https://holesky.fraxscan.com",apiUrl:"https://api-holesky.fraxscan.com/api"}},contracts:{...Q.contracts,l2OutputOracle:{17e3:{address:"0x715EA64DA13F4d0831ece4Ad3E8c1aa013167F32"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11"},portal:{17e3:{address:"0xB9c64BfA498d5b9a8398Ed6f46eb76d90dE5505d",blockCreated:318416}},l1StandardBridge:{17e3:{address:"0x0BaafC217162f64930909aD9f2B27125121d6332",blockCreated:318416}}},sourceId:17e3}),tD=(0,C.a)({id:2710,name:"Morph Sepolia",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc-testnet.morphl2.io"]}},blockExplorers:{default:{name:"Morph Testnet Explorer",url:"https://explorer-testnet.morphl2.io",apiUrl:"https://explorer-api-testnet.morphl2.io/api"}},testnet:!0}),t_=(0,C.a)({id:3141,name:"Filecoin Hyperspace",nativeCurrency:{decimals:18,name:"testnet filecoin",symbol:"tFIL"},rpcUrls:{default:{http:["https://api.hyperspace.node.glif.io/rpc/v1"]}},blockExplorers:{default:{name:"Filfox",url:"https://hyperspace.filfox.info/en"}}}),tL=(0,C.a)({id:3737,name:"Crossbell",nativeCurrency:{decimals:18,name:"CSB",symbol:"CSB"},rpcUrls:{default:{http:["https://rpc.crossbell.io"]}},blockExplorers:{default:{name:"CrossScan",url:"https://scan.crossbell.io",apiUrl:"https://scan.crossbell.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:38246031}}}),tz=(0,C.a)({id:3776,name:"Astar zkEVM",network:"AstarZkEVM",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.startale.com/astar-zkevm"]}},blockExplorers:{default:{name:"Astar zkEVM Explorer",url:"https://astar-zkevm.explorer.startale.com"}},contracts:{multicall3:{address:"0x36eabf148272BA81A5225C6a3637972F0EE17771",blockCreated:93528}},testnet:!1}),tq=(0,C.a)({id:3993,name:"APEX Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc-testnet.apexlayer.xyz"]}},blockExplorers:{default:{name:"Blockscout",url:"https://exp-testnet.apexlayer.xyz",apiUrl:"https://exp-testnet.apexlayer.xyz/api"}},contracts:{multicall3:{address:"0xf7642be33a6b18D16a995657adb5a68CD0438aE2",blockCreated:283775}},testnet:!0}),tG=(0,C.a)({id:4002,name:"Fantom Testnet",nativeCurrency:{decimals:18,name:"Fantom",symbol:"FTM"},rpcUrls:{default:{http:["https://rpc.testnet.fantom.network"]}},blockExplorers:{default:{name:"FTMScan",url:"https://testnet.ftmscan.com",apiUrl:"https://testnet.ftmscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:8328688}}}),tW=(0,C.a)({id:4090,network:"oasis-testnet",name:"Oasis Testnet",nativeCurrency:{name:"Fasttoken",symbol:"FTN",decimals:18},rpcUrls:{default:{http:["https://rpc1.oasis.bahamutchain.com"]},public:{http:["https://rpc1.oasis.bahamutchain.com"]}},blockExplorers:{default:{name:"Ftnscan",url:"https://oasis.ftnscan.com",apiUrl:"https://oasis.ftnscan.com/api"}},testnet:!0}),tH=(0,C.a)({id:4200,name:"Merlin",nativeCurrency:{name:"BTC",symbol:"BTC",decimals:18},rpcUrls:{default:{http:["https://rpc.merlinchain.io"]}},blockExplorers:{default:{name:"blockscout",url:"https://scan.merlinchain.io",apiUrl:"https://scan.merlinchain.io/api"}}}),tQ=(0,C.a)({id:4201,name:"LUKSO Testnet",nativeCurrency:{decimals:18,name:"LUKSO Testnet",symbol:"LYXt"},rpcUrls:{default:{http:["https://rpc.testnet.lukso.network"],webSocket:["wss://ws-rpc.testnet.lukso.network"]}},blockExplorers:{default:{name:"LUKSO Testnet Explorer",url:"https://explorer.execution.testnet.lukso.network",apiUrl:"https://api.explorer.execution.testnet.lukso.network/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:605348}},testnet:!0}),tK=(0,C.a)({...Q,id:4202,network:"lisk-sepolia",name:"Lisk Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.sepolia-api.lisk.com"]}},blockExplorers:{default:{name:"Blockscout",url:"https://sepolia-blockscout.lisk.com",apiUrl:"https://sepolia-blockscout.lisk.com/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0xA0E35F56C318DE1bD5D9ca6A94Fe7e37C5663348"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11"},portal:{11155111:{address:"0xe3d90F21490686Ec7eF37BE788E02dfC12787264"}},l1StandardBridge:{11155111:{address:"0x1Fb30e446eA791cd1f011675E5F3f5311b70faF5"}}},testnet:!0,sourceId:11155111}),tV=(0,C.a)({id:4242,name:"Nexi",nativeCurrency:{name:"Nexi",symbol:"NEXI",decimals:18},rpcUrls:{default:{http:["https://rpc.chain.nexi.technology"]}},blockExplorers:{default:{name:"NexiScan",url:"https://www.nexiscan.com",apiUrl:"https://www.nexiscan.com/api"}},contracts:{multicall3:{address:"0x0277A46Cc69A57eE3A6C8c158bA874832F718B8E",blockCreated:25770160}}}),tZ=(0,C.a)({id:4337,name:"Beam",network:"beam",nativeCurrency:{decimals:18,name:"Beam",symbol:"BEAM"},rpcUrls:{public:{http:["https://build.onbeam.com/rpc"],webSocket:["wss://build.onbeam.com/ws"]},default:{http:["https://build.onbeam.com/rpc"],webSocket:["wss://build.onbeam.com/ws"]}},blockExplorers:{default:{name:"Beam Explorer",url:"https://subnets.avax.network/beam"}},contracts:{multicall3:{address:"0x4956f15efdc3dc16645e90cc356eafa65ffc65ec",blockCreated:1}}}),tJ=(0,C.a)({id:4689,name:"IoTeX",nativeCurrency:{decimals:18,name:"IoTeX",symbol:"IOTX"},rpcUrls:{default:{http:["https://babel-api.mainnet.iotex.io"],webSocket:["wss://babel-api.mainnet.iotex.io"]}},blockExplorers:{default:{name:"IoTeXScan",url:"https://iotexscan.io"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:22163670}}}),tX=(0,C.a)({id:4690,name:"IoTeX Testnet",nativeCurrency:{decimals:18,name:"IoTeX",symbol:"IOTX"},rpcUrls:{default:{http:["https://babel-api.testnet.iotex.io"],webSocket:["wss://babel-api.testnet.iotex.io"]}},blockExplorers:{default:{name:"IoTeXScan",url:"https://testnet.iotexscan.io"}},testnet:!0}),tY=(0,C.a)({id:4759,name:"MEVerse Chain Testnet",nativeCurrency:{decimals:18,name:"MEVerse",symbol:"MEV"},rpcUrls:{default:{http:["https://rpc.meversetestnet.io"]}},blockExplorers:{default:{name:"Explorer",url:"https://testnet.meversescan.io/"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:64371115}},testnet:!0}),t$=(0,C.a)({id:4777,name:"BlackFort Exchange Network Testnet",nativeCurrency:{name:"BlackFort Testnet Token",symbol:"TBXN",decimals:18},rpcUrls:{default:{http:["https://testnet.blackfort.network/rpc"]}},blockExplorers:{default:{name:"Blockscout",url:"https://testnet-explorer.blackfort.network",apiUrl:"https://testnet-explorer.blackfort.network/api"}}}),t0=(0,C.a)({id:4999,name:"BlackFort Exchange Network",nativeCurrency:{name:"BlackFort Token",symbol:"BXN",decimals:18},rpcUrls:{default:{http:["https://mainnet.blackfort.network/rpc"]}},blockExplorers:{default:{name:"Blockscout",url:"https://explorer.blackfort.network",apiUrl:"https://explorer.blackfort.network/api"}}}),t1=(0,C.a)({id:5e3,name:"Mantle",nativeCurrency:{decimals:18,name:"MNT",symbol:"MNT"},rpcUrls:{default:{http:["https://rpc.mantle.xyz"]}},blockExplorers:{default:{name:"Mantle Explorer",url:"https://explorer.mantle.xyz",apiUrl:"https://explorer.mantle.xyz/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:304717}}}),t6=(0,C.a)({id:5001,name:"Mantle Testnet",nativeCurrency:{decimals:18,name:"MNT",symbol:"MNT"},rpcUrls:{default:{http:["https://rpc.testnet.mantle.xyz"]}},blockExplorers:{default:{name:"Mantle Testnet Explorer",url:"https://explorer.testnet.mantle.xyz",apiUrl:"https://explorer.testnet.mantle.xyz/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:561333}},testnet:!0}),t3=(0,C.a)({id:5165,network:"bahamut",name:"Bahamut",nativeCurrency:{name:"Fasttoken",symbol:"FTN",decimals:18},rpcUrls:{default:{http:["https://rpc1.bahamut.io","https://bahamut.publicnode.com","https://rpc2.bahamut.io"],webSocket:["wss://ws1.sahara.bahamutchain.com","wss://bahamut.publicnode.com","wss://ws2.sahara.bahamutchain.com"]},public:{http:["https://rpc1.bahamut.io","https://bahamut.publicnode.com","https://rpc2.bahamut.io"],webSocket:["wss://ws1.sahara.bahamutchain.com","wss://bahamut.publicnode.com","wss://ws2.sahara.bahamutchain.com"]}},blockExplorers:{default:{name:"Ftnscan",url:"https://www.ftnscan.com",apiUrl:"https://www.ftnscan.com/api"}}}),t2=(0,C.a)({id:5611,name:"opBNB Testnet",nativeCurrency:{decimals:18,name:"tBNB",symbol:"tBNB"},rpcUrls:{default:{http:["https://opbnb-testnet-rpc.bnbchain.org"]}},blockExplorers:{default:{name:"opbnbscan",url:"https://testnet.opbnbscan.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3705108}},testnet:!0}),t7=(0,C.a)({id:5700,name:"Syscoin Tanenbaum Testnet",nativeCurrency:{decimals:18,name:"Syscoin",symbol:"SYS"},rpcUrls:{default:{http:["https://rpc.tanenbaum.io"],webSocket:["wss://rpc.tanenbaum.io/wss"]}},blockExplorers:{default:{name:"SyscoinTestnetExplorer",url:"https://tanenbaum.io"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:271288}}}),t8=(0,C.a)({id:7e3,name:"ZetaChain",nativeCurrency:{decimals:18,name:"Zeta",symbol:"ZETA"},rpcUrls:{default:{http:["https://zetachain-evm.blockpi.network/v1/rpc/public"]}},blockExplorers:{default:{name:"ZetaScan",url:"https://explorer.zetachain.com"}},testnet:!1}),t5=(0,C.a)({id:7001,name:"ZetaChain Athens Testnet",nativeCurrency:{decimals:18,name:"Zeta",symbol:"aZETA"},rpcUrls:{default:{http:["https://zetachain-athens-evm.blockpi.network/v1/rpc/public"]}},blockExplorers:{default:{name:"ZetaScan",url:"https://athens3.explorer.zetachain.com"}},testnet:!0}),t4=(0,C.a)({id:7518,name:"MEVerse Chain Mainnet",nativeCurrency:{decimals:18,name:"MEVerse",symbol:"MEV"},rpcUrls:{default:{http:["https://rpc.meversemainnet.io"]}},blockExplorers:{default:{name:"Explorer",url:"https://www.meversescan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:86881340}}}),t9=(0,C.a)({id:7700,name:"Canto",nativeCurrency:{decimals:18,name:"Canto",symbol:"CANTO"},rpcUrls:{default:{http:["https://canto.gravitychain.io"]}},blockExplorers:{default:{name:"Tuber.Build (Blockscout)",url:"https://tuber.build"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:2905789}}}),re=(0,C.a)({id:8082,name:"Shardeum Sphinx",nativeCurrency:{name:"SHARDEUM",symbol:"SHM",decimals:18},rpcUrls:{default:{http:["https://sphinx.shardeum.org"]}},blockExplorers:{default:{name:"Shardeum Explorer",url:"https://explorer-sphinx.shardeum.org"}},testnet:!0}),rt=(0,C.a)({id:8217,name:"Klaytn",nativeCurrency:{decimals:18,name:"Klaytn",symbol:"KLAY"},rpcUrls:{default:{http:["https://public-en-cypress.klaytn.net"]}},blockExplorers:{default:{name:"KlaytnScope",url:"https://scope.klaytn.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:96002415}}}),rr=(0,C.a)({...Q,id:8453,name:"Base",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.base.org"]}},blockExplorers:{default:{name:"Basescan",url:"https://basescan.org",apiUrl:"https://api.basescan.org/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0x56315b90c40730925ec5485cf004d835058518A0"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:5022},portal:{1:{address:"0x49048044D57e1C92A77f79988d21Fa8fAF74E97e",blockCreated:17482143}},l1StandardBridge:{1:{address:"0x3154Cf16ccdb4C6d922629664174b904d80F2C35",blockCreated:17482143}}},sourceId:1}),rn=(0,C.a)({id:8899,name:"JIBCHAIN L1",network:"jbc",nativeCurrency:{name:"JBC",symbol:"JBC",decimals:18},rpcUrls:{default:{http:["https://rpc-l1.jibchain.net"]},public:{http:["https://rpc-l1.jibchain.net"]}},blockExplorers:{default:{name:"Blockscout",url:"https://exp-l1.jibchain.net",apiUrl:"https://exp-l1.jibchain.net/api"}},contracts:{multicall3:{address:"0xc0C8C486D1466C57Efe13C2bf000d4c56F47CBdC",blockCreated:2299048}},testnet:!1}),ra=(0,C.a)({id:9e3,name:"Evmos Testnet",nativeCurrency:{decimals:18,name:"Evmos",symbol:"EVMOS"},rpcUrls:{default:{http:["https://eth.bd.evmos.dev:8545"]}},blockExplorers:{default:{name:"Evmos Testnet Block Explorer",url:"https://evm.evmos.dev/"}}}),ro=(0,C.a)({id:9001,name:"Evmos",nativeCurrency:{decimals:18,name:"Evmos",symbol:"EVMOS"},rpcUrls:{default:{http:["https://eth.bd.evmos.org:8545"]}},blockExplorers:{default:{name:"Evmos Block Explorer",url:"https://escan.live"}}}),ri=(0,C.a)({id:9700,name:"OORT MainnetDev",nativeCurrency:{decimals:18,name:"OORT",symbol:"OORT"},rpcUrls:{default:{http:["https://dev-rpc.oortech.com"]}},blockExplorers:{oort:{name:"OORT MainnetDev Explorer",url:"https://dev-scan.oortech.com"},default:{name:"OORT MainnetDev Explorer",url:"https://dev-scan.oortech.com"}}}),rs=(0,C.a)({id:10200,name:"Gnosis Chiado",nativeCurrency:{decimals:18,name:"Gnosis",symbol:"xDAI"},rpcUrls:{default:{http:["https://rpc.chiadochain.net"],webSocket:["wss://rpc.chiadochain.net/wss"]}},blockExplorers:{default:{name:"Blockscout",url:"https://blockscout.chiadochain.net",apiUrl:"https://blockscout.chiadochain.net/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:4967313}},testnet:!0}),rl=(0,C.a)({id:11235,name:"HAQQ Mainnet",nativeCurrency:{decimals:18,name:"Islamic Coin",symbol:"ISLM"},rpcUrls:{default:{http:["https://rpc.eth.haqq.network"]}},blockExplorers:{default:{name:"HAQQ Explorer",url:"https://explorer.haqq.network",apiUrl:"https://explorer.haqq.network/api"}}}),rc=(0,C.a)({id:12306,name:"Fibo Chain",nativeCurrency:{decimals:18,name:"fibo",symbol:"FIBO"},rpcUrls:{default:{http:["https://network.hzroc.art"]}},blockExplorers:{default:{name:"FiboScan",url:"https://scan.fibochain.org"}}}),ru=(0,C.a)({...Q,id:12553,name:"RSS3 VSL Mainnet",nativeCurrency:{name:"RSS3",symbol:"RSS3",decimals:18},rpcUrls:{default:{http:["https://rpc.rss3.io"]}},blockExplorers:{default:{name:"RSS3 VSL Mainnet Scan",url:"https://scan.rss3.io",apiUrl:"https://scan.rss3.io/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0xE6f24d2C32B3109B18ed33cF08eFb490b1e09C10"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14193},portal:{1:{address:"0x6A12432491bbbE8d3babf75F759766774C778Db4",blockCreated:19387057}},l1StandardBridge:{1:{address:"0x4cbab69108Aa72151EDa5A3c164eA86845f18438"}}},sourceId:1}),rd=(0,C.a)({id:13337,name:"Beam Testnet",network:"beam",nativeCurrency:{decimals:18,name:"Beam",symbol:"BEAM"},rpcUrls:{public:{http:["https://build.onbeam.com/rpc/testnet"],webSocket:["wss://build.onbeam.com/ws/testnet"]},default:{http:["https://build.onbeam.com/rpc/testnet"],webSocket:["wss://build.onbeam.com/ws/testnet"]}},blockExplorers:{default:{name:"Beam Explorer",url:"https://subnets-test.avax.network/beam"}},contracts:{multicall3:{address:"0x9bf49b704ee2a095b95c1f2d4eb9010510c41c9e",blockCreated:3}},testnet:!0}),rp=(0,C.a)({id:13381,name:"Phoenix Blockchain",nativeCurrency:{name:"Phoenix",symbol:"PHX",decimals:18},rpcUrls:{default:{http:["https://rpc.phoenixplorer.com"]}},blockExplorers:{default:{name:"Phoenixplorer",url:"https://phoenixplorer.com",apiUrl:"https://phoenixplorer.com/api"}},contracts:{multicall3:{address:"0x498cF757a575cFF2c2Ed9f532f56Efa797f86442",blockCreated:5620192}}}),rh=(0,C.a)({id:15557,name:"EOS EVM Testnet",nativeCurrency:{decimals:18,name:"EOS",symbol:"EOS"},rpcUrls:{default:{http:["https://api.testnet.evm.eosnetwork.com"]}},blockExplorers:{default:{name:"EOS EVM Testnet Explorer",url:"https://explorer.testnet.evm.eosnetwork.com",apiUrl:"https://explorer.testnet.evm.eosnetwork.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:9067940}},testnet:!0}),rf=(0,C.a)({id:17e3,name:"Holesky",nativeCurrency:{name:"Holesky Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://ethereum-holesky.publicnode.com"]}},blockExplorers:{default:{name:"Etherscan",url:"https://holesky.etherscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:77},ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",blockCreated:801613},ensUniversalResolver:{address:"0xa6AC935D4971E3CD133b950aE053bECD16fE7f3b",blockCreated:973484}},testnet:!0}),rm=(0,C.a)({id:17777,name:"EOS EVM",nativeCurrency:{decimals:18,name:"EOS",symbol:"EOS"},rpcUrls:{default:{http:["https://api.evm.eosnetwork.com"]}},blockExplorers:{default:{name:"EOS EVM Explorer",url:"https://explorer.evm.eosnetwork.com",apiUrl:"https://explorer.evm.eosnetwork.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:7943933}}}),rg=(0,C.a)({id:23294,name:"Oasis Sapphire",network:"sapphire",nativeCurrency:{name:"Sapphire Rose",symbol:"ROSE",decimals:18},rpcUrls:{default:{http:["https://sapphire.oasis.io"],webSocket:["wss://sapphire.oasis.io/ws"]}},blockExplorers:{default:{name:"Oasis Sapphire Explorer",url:"https://explorer.sapphire.oasis.io",apiUrl:"https://explorer.sapphire.oasis.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:734531}}}),rb=(0,C.a)({id:23295,name:"Oasis Sapphire Testnet",network:"sapphire-testnet",nativeCurrency:{name:"Sapphire Test Rose",symbol:"TEST",decimals:18},rpcUrls:{default:{http:["https://testnet.sapphire.oasis.dev"],webSocket:["wss://testnet.sapphire.oasis.dev/ws"]}},blockExplorers:{default:{name:"Oasis Sapphire Testnet Explorer",url:"https://testnet.explorer.sapphire.oasis.dev",apiUrl:"https://testnet.explorer.sapphire.oasis.dev/api"}},testnet:!0}),ry=(0,C.a)({id:31337,name:"Anvil",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["http://127.0.0.1:8545"],webSocket:["ws://127.0.0.1:8545"]}}}),rv=(0,C.a)({id:31337,name:"Foundry",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["http://127.0.0.1:8545"],webSocket:["ws://127.0.0.1:8545"]}}}),rw=(0,C.a)({id:32769,name:"Zilliqa",network:"zilliqa",nativeCurrency:{name:"Zilliqa",symbol:"ZIL",decimals:18},rpcUrls:{default:{http:["https://api.zilliqa.com"]}},blockExplorers:{default:{name:"Ethernal",url:"https://evmx.zilliqa.com"}},testnet:!1}),rC=(0,C.a)({id:33101,name:"Zilliqa Testnet",network:"zilliqa-testnet",nativeCurrency:{name:"Zilliqa",symbol:"ZIL",decimals:18},rpcUrls:{default:{http:["https://dev-api.zilliqa.com"]}},blockExplorers:{default:{name:"Ethernal",url:"https://evmx.testnet.zilliqa.com"}},testnet:!0}),rE=(0,C.a)({id:34443,name:"Mode Mainnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.mode.network"]}},blockExplorers:{default:{name:"Mode Explorer",url:"https://explorer.mode.network"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:2465882}}}),rx=(0,C.a)({id:35441,name:"Q Mainnet",nativeCurrency:{decimals:18,name:"Q",symbol:"Q"},rpcUrls:{default:{http:["https://rpc.q.org"]}},blockExplorers:{default:{name:"Q Mainnet Explorer",url:"https://explorer.q.org",apiUrl:"https://explorer.q.org/api"}}}),rA=(0,C.a)({id:35443,name:"Q Testnet",nativeCurrency:{decimals:18,name:"Q",symbol:"Q"},rpcUrls:{default:{http:["https://rpc.qtestnet.org"]}},blockExplorers:{default:{name:"Q Testnet Explorer",url:"https://explorer.qtestnet.org",apiUrl:"https://explorer.qtestnet.org/api"}},testnet:!0}),rk=(0,C.a)({id:42161,name:"Arbitrum One",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://arb1.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://arbiscan.io",apiUrl:"https://api.arbiscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:7654707}}}),rB=(0,C.a)({id:42170,name:"Arbitrum Nova",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://nova.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://nova.arbiscan.io",apiUrl:"https://api-nova.arbiscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:1746963}}});function isEmpty(e){return 0===e||0n===e||null==e||"0"===e||""===e||"string"==typeof e&&("0x"===(0,z.f)(e).toLowerCase()||"0x00"===(0,z.f)(e).toLowerCase())}function isPresent(e){return!isEmpty(e)}function isEIP1559(e){return void 0!==e.maxFeePerGas&&void 0!==e.maxPriorityFeePerGas}function isCIP42(e){return"cip42"===e.type||isEIP1559(e)&&(isPresent(e.feeCurrency)||isPresent(e.gatewayFeeRecipient)||isPresent(e.gatewayFee))}function isCIP64(e){return"cip64"===e.type||isEIP1559(e)&&isPresent(e.feeCurrency)&&isEmpty(e.gatewayFee)&&isEmpty(e.gatewayFeeRecipient)}let rS={block:(0,B.G)({exclude:["difficulty","gasLimit","mixHash","nonce","uncles"],format(e){let t=e.transactions?.map(e=>"string"==typeof e?e:{...S.Tr(e),feeCurrency:e.feeCurrency,..."0x7b"!==e.type?{gatewayFee:e.gatewayFee?k.y_(e.gatewayFee):null,gatewayFeeRecipient:e.gatewayFeeRecipient||null}:{}});return{randomness:e.randomness,transactions:t}}}),transaction:(0,S.y_)({format(e){let t={feeCurrency:e.feeCurrency};return"0x7b"===e.type?t.type="cip64":("0x7c"===e.type&&(t.type="cip42"),t.gatewayFee=e.gatewayFee?(0,k.y_)(e.gatewayFee):null,t.gatewayFeeRecipient=e.gatewayFeeRecipient),t}}),transactionRequest:(0,eF.iy)({format(e){let t={feeCurrency:e.feeCurrency};return isCIP64(e)?t.type="0x7b":(isCIP42(e)&&(t.type="0x7c"),t.gatewayFee=void 0!==e.gatewayFee?(0,O.eC)(e.gatewayFee):void 0,t.gatewayFeeRecipient=e.gatewayFeeRecipient),t}})},rI=2n**256n-1n,rj={formatters:rS,serializers:{transaction:function(e,t){return isCIP64(e)?function(e,t){!function(e){let{chainId:t,maxPriorityFeePerGas:n,gasPrice:o,maxFeePerGas:i,to:s,feeCurrency:l}=e;if(t<=0)throw new q.hJ({chainId:t});if(s&&!(0,P.U)(s))throw new T.b({address:s});if(o)throw new R.G("`gasPrice` is not a valid CIP-64 Transaction attribute.");if(isPresent(i)&&i>rI)throw new G.Hh({maxFeePerGas:i});if(isPresent(n)&&isPresent(i)&&n>i)throw new G.cs({maxFeePerGas:i,maxPriorityFeePerGas:n});if(isPresent(l)&&!(0,P.U)(l))throw new R.G("`feeCurrency` MUST be a token address for CIP-64 transactions.");if(isEmpty(l))throw new R.G("`feeCurrency` must be provided for CIP-64 transactions.")}(e);let{chainId:n,gas:o,nonce:i,to:s,value:l,maxFeePerGas:c,maxPriorityFeePerGas:u,accessList:d,feeCurrency:p,data:f}=e,m=[(0,O.NC)(n),i?(0,O.NC)(i):"0x",u?(0,O.NC)(u):"0x",c?(0,O.NC)(c):"0x",o?(0,O.NC)(o):"0x",s??"0x",l?(0,O.NC)(l):"0x",f??"0x",serializeAccessList(d),p,...toYParitySignatureArray(e,t)];return(0,M.SM)(["0x7b",toRlp(m)])}(e,t):isCIP42(e)?function(e,t){!function(e){let{chainId:t,maxPriorityFeePerGas:n,gasPrice:o,maxFeePerGas:i,to:s,feeCurrency:l,gatewayFee:c,gatewayFeeRecipient:u}=e;if(t<=0)throw new q.hJ({chainId:t});if(s&&!(0,P.U)(s))throw new T.b({address:s});if(o)throw new R.G("`gasPrice` is not a valid CIP-42 Transaction attribute.");if(isPresent(i)&&i>rI)throw new G.Hh({maxFeePerGas:i});if(isPresent(n)&&isPresent(i)&&n>i)throw new G.cs({maxFeePerGas:i,maxPriorityFeePerGas:n});if(isPresent(c)&&isEmpty(u)||isPresent(u)&&isEmpty(c))throw new R.G("`gatewayFee` and `gatewayFeeRecipient` must be provided together.");if(isPresent(l)&&!(0,P.U)(l))throw new R.G("`feeCurrency` MUST be a token address for CIP-42 transactions.");if(isPresent(u)&&!(0,P.U)(u))throw new T.b(u);if(isEmpty(l)&&isEmpty(u))throw new R.G("Either `feeCurrency` or `gatewayFeeRecipient` must be provided for CIP-42 transactions.")}(e);let{chainId:n,gas:o,nonce:i,to:s,value:l,maxFeePerGas:c,maxPriorityFeePerGas:u,accessList:d,feeCurrency:p,gatewayFeeRecipient:f,gatewayFee:m,data:g}=e,b=[(0,O.NC)(n),i?(0,O.NC)(i):"0x",u?(0,O.NC)(u):"0x",c?(0,O.NC)(c):"0x",o?(0,O.NC)(o):"0x",p??"0x",f??"0x",m?(0,O.NC)(m):"0x",s??"0x",l?(0,O.NC)(l):"0x",g??"0x",serializeAccessList(d),...toYParitySignatureArray(e,t)];return(0,M.SM)(["0x7c",toRlp(b)])}(e,t):serializeTransaction(e,t)}}},rT=(0,C.a)({...rj,id:42220,name:"Celo",nativeCurrency:{decimals:18,name:"CELO",symbol:"CELO"},rpcUrls:{default:{http:["https://forno.celo.org"]}},blockExplorers:{default:{name:"Celo Explorer",url:"https://explorer.celo.org/mainnet",apiUrl:"https://explorer.celo.org/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:13112599}},testnet:!1}),rP=(0,C.a)({id:42766,name:"ZKFair Mainnet",network:"zkfair-mainnet",nativeCurrency:{decimals:18,name:"USD Coin",symbol:"USDC"},rpcUrls:{default:{http:["https://rpc.zkfair.io"]},public:{http:["https://rpc.zkfair.io"]}},blockExplorers:{default:{name:"zkFair Explorer",url:"https://scan.zkfair.io",apiUrl:"https://scan.zkfair.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:6090959}},testnet:!1}),rM=(0,C.a)({id:43113,name:"Avalanche Fuji",nativeCurrency:{decimals:18,name:"Avalanche Fuji",symbol:"AVAX"},rpcUrls:{default:{http:["https://api.avax-test.network/ext/bc/C/rpc"]}},blockExplorers:{default:{name:"SnowScan",url:"https://testnet.snowscan.xyz",apiUrl:"https://api-testnet.snowscan.xyz"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:7096959}},testnet:!0}),rO=(0,C.a)({id:43114,name:"Avalanche",nativeCurrency:{decimals:18,name:"Avalanche",symbol:"AVAX"},rpcUrls:{default:{http:["https://api.avax.network/ext/bc/C/rpc"]}},blockExplorers:{default:{name:"SnowScan",url:"https://snowscan.xyz",apiUrl:"https://api.snowscan.xyz/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:11907934}}}),rR=(0,C.a)({id:43851,name:"ZKFair Testnet",network:"zkfair-testnet",nativeCurrency:{decimals:18,name:"USD Coin",symbol:"USDC"},rpcUrls:{default:{http:["https://testnet-rpc.zkfair.io"]},public:{http:["https://testnet-rpc.zkfair.io"]}},blockExplorers:{default:{name:"zkFair Explorer",url:"https://testnet-scan.zkfair.io"}},testnet:!0}),rU=(0,C.a)({...rj,id:44787,name:"Alfajores",nativeCurrency:{decimals:18,name:"CELO",symbol:"A-CELO"},rpcUrls:{default:{http:["https://alfajores-forno.celo-testnet.org"]}},blockExplorers:{default:{name:"Celo Explorer",url:"https://explorer.celo.org/alfajores",apiUrl:"https://explorer.celo.org/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:14569001}},testnet:!0}),rF=(0,C.a)({id:53935,name:"DFK Chain",nativeCurrency:{decimals:18,name:"Jewel",symbol:"JEWEL"},rpcUrls:{default:{http:["https://subnets.avax.network/defi-kingdoms/dfk-chain/rpc"]}},blockExplorers:{default:{name:"DFKSubnetScan",url:"https://subnets.avax.network/defi-kingdoms"}}}),rN=(0,C.a)({id:54211,name:"HAQQ Testedge 2",nativeCurrency:{decimals:18,name:"Islamic Coin",symbol:"ISLMT"},rpcUrls:{default:{http:["https://rpc.eth.testedge2.haqq.network"]}},blockExplorers:{default:{name:"HAQQ Explorer",url:"https://explorer.testedge2.haqq.network",apiUrl:"https://explorer.testedge2.haqq.network/api"}}}),rD=(0,C.a)({id:57e3,name:"Rollux Testnet",nativeCurrency:{decimals:18,name:"Syscoin",symbol:"SYS"},rpcUrls:{default:{http:["https://rpc-tanenbaum.rollux.com/"],webSocket:["wss://rpc-tanenbaum.rollux.com/wss"]}},blockExplorers:{default:{name:"RolluxTestnetExplorer",url:"https://rollux.tanenbaum.io",apiUrl:"https://rollux.tanenbaum.io/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:1813675}}}),r_=(0,C.a)({id:58008,network:"pgn-testnet",name:"PGN ",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.publicgoods.network"]}},blockExplorers:{default:{name:"PGN Testnet Explorer",url:"https://explorer.sepolia.publicgoods.network",apiUrl:"https://explorer.sepolia.publicgoods.network/api"},blocksout:{name:"PGN Testnet Explorer",url:"https://explorer.sepolia.publicgoods.network",apiUrl:"https://explorer.sepolia.publicgoods.network/api"}},contracts:{l2OutputOracle:{11155111:{address:"0xD5bAc3152ffC25318F848B3DD5dA6C85171BaEEe"}},portal:{11155111:{address:"0xF04BdD5353Bb0EFF6CA60CfcC78594278eBfE179"}},l1StandardBridge:{11155111:{address:"0xFaE6abCAF30D23e233AC7faF747F2fC3a5a6Bfa3"}},multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3754925}},formatters:j,sourceId:11155111,testnet:!0}),rL=(0,C.a)({id:59140,name:"Linea Goerli Testnet",nativeCurrency:{name:"Linea Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.goerli.linea.build"],webSocket:["wss://rpc.goerli.linea.build"]}},blockExplorers:{default:{name:"Etherscan",url:"https://goerli.lineascan.build",apiUrl:"https://goerli.lineascan.build/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:498623}},testnet:!0}),rz=(0,C.a)({id:59144,name:"Linea Mainnet",nativeCurrency:{name:"Linea Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.linea.build"],webSocket:["wss://rpc.linea.build"]}},blockExplorers:{default:{name:"Etherscan",url:"https://lineascan.build",apiUrl:"https://api.lineascan.build/api"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:42}},testnet:!1}),rq=(0,C.a)({id:64240,name:"Fantom Sonic Open Testnet",network:"fantom-sonic-testnet",nativeCurrency:{decimals:18,name:"Fantom",symbol:"FTM"},rpcUrls:{default:{http:["https://rpcapi.sonic.fantom.network"]}},blockExplorers:{default:{name:"Fantom Sonic Open Testnet Explorer",url:"https://public-sonic.fantom.network"}},testnet:!0}),rG=(0,C.a)({id:80001,name:"Polygon Mumbai",nativeCurrency:{name:"MATIC",symbol:"MATIC",decimals:18},rpcUrls:{default:{http:["https://rpc.ankr.com/polygon_mumbai"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://mumbai.polygonscan.com",apiUrl:"https://mumbai.polygonscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:25770160}},testnet:!0}),rW=(0,C.a)({id:80002,name:"Polygon Amoy",nativeCurrency:{name:"MATIC",symbol:"MATIC",decimals:18},rpcUrls:{default:{http:["https://rpc-amoy.polygon.technology"]}},blockExplorers:{default:{name:"OK LINK",url:"https://www.oklink.com/amoy"}},testnet:!0}),rH=(0,C.a)({id:80085,name:"Berachain Artio",nativeCurrency:{decimals:18,name:"BERA Token",symbol:"BERA"},rpcUrls:{default:{http:["https://artio.rpc.berachain.com"]}},blockExplorers:{default:{name:"Berachain",url:"https://artio.beratrail.io"}},testnet:!0}),rQ=(0,C.a)({id:81457,name:"Blast",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://rpc.blast.io"]}},blockExplorers:{default:{name:"Blastscan",url:"https://blastscan.io"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:212929}},sourceId:1}),rK=(0,C.a)({...Q,id:84531,name:"Base Goerli",nativeCurrency:{name:"Goerli Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://goerli.base.org"]}},blockExplorers:{default:{name:"Basescan",url:"https://goerli.basescan.org",apiUrl:"https://goerli.basescan.org/api"}},contracts:{...Q.contracts,l2OutputOracle:{5:{address:"0x2A35891ff30313CcFa6CE88dcf3858bb075A2298"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:1376988},portal:{5:{address:"0xe93c8cD0D409341205A592f8c4Ac1A5fe5585cfA"}},l1StandardBridge:{5:{address:"0xfA6D8Ee5BE770F84FC001D098C4bD604Fe01284a"}}},testnet:!0,sourceId:5}),rV=(0,C.a)({...Q,id:84532,network:"base-sepolia",name:"Base Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.base.org"]}},blockExplorers:{default:{name:"Basescan",url:"https://sepolia.basescan.org",apiUrl:"https://api-sepolia.basescan.org/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254"}},portal:{11155111:{address:"0x49f53e41452c74589e85ca1677426ba426459e85",blockCreated:4446677}},l1StandardBridge:{11155111:{address:"0xfd0Bf71F60660E2f608ed56e1659C450eB113120",blockCreated:4446677}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:1059647}},testnet:!0,sourceId:11155111}),rZ=(0,C.a)({id:88882,name:"Chiliz Spicy Testnet",network:"chiliz-spicy-Testnet",nativeCurrency:{decimals:18,name:"CHZ",symbol:"CHZ"},rpcUrls:{default:{http:["https://spicy-rpc.chiliz.com","https://chiliz-spicy.publicnode.com"],webSocket:["wss://spicy-rpc-ws.chiliz.com","wss://chiliz-spicy.publicnode.com"]}},blockExplorers:{default:{name:"Chiliz Explorer",url:"http://spicy-explorer.chiliz.com",apiUrl:"http://spicy-explorer.chiliz.com/api"}},testnet:!0}),rJ=(0,C.a)({id:88888,name:"Chiliz Chain",network:"chiliz-chain",nativeCurrency:{decimals:18,name:"CHZ",symbol:"CHZ"},rpcUrls:{default:{http:["https://rpc.ankr.com/chiliz","https://chiliz.publicnode.com"]}},blockExplorers:{default:{name:"Chiliz Explorer",url:"https://scan.chiliz.com",apiUrl:"https://scan.chiliz.com/api"}}}),rX=(0,C.a)({id:100009,name:"Vechain",nativeCurrency:{name:"VeChain",symbol:"VET",decimals:18},rpcUrls:{default:{http:["https://mainnet.vechain.org"]}},blockExplorers:{default:{name:"Vechain Explorer",url:"https://explore.vechain.org"},vechainStats:{name:"Vechain Stats",url:"https://vechainstats.com"}}}),rY=(0,C.a)({id:105105,name:"Stratis Mainnet",network:"stratis",nativeCurrency:{name:"Stratis",symbol:"STRAX",decimals:18},rpcUrls:{default:{http:["https://rpc.stratisevm.com"]}},blockExplorers:{default:{name:"Stratis Explorer",url:"https://explorer.stratisevm.com"}}}),r$=(0,C.a)({id:128123,name:"Etherlink Testnet",nativeCurrency:{decimals:18,name:"Tez",symbol:"XTZ"},rpcUrls:{default:{http:["https://node.ghostnet.etherlink.com"]}},blockExplorers:{default:{name:"Etherlink Testnet",url:"https://testnet-explorer.etherlink.com"}},testnet:!0}),r0=(0,C.a)({id:167005,name:"Taiko (Alpha-3 Testnet)",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.test.taiko.xyz"]}},blockExplorers:{default:{name:"blockscout",url:"https://explorer.test.taiko.xyz"}}}),r1=(0,C.a)({id:167007,name:"Taiko Jolnir (Alpha-5 Testnet)",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.jolnir.taiko.xyz"]}},blockExplorers:{default:{name:"blockscout",url:"https://explorer.jolnir.taiko.xyz"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:732706}},testnet:!0}),r6=(0,C.a)({id:167008,name:"Taiko Katla (Alpha-6 Testnet)",network:"tko-katla",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.katla.taiko.xyz"]},public:{http:["https://rpc.katla.taiko.xyz"]}},blockExplorers:{default:{name:"blockscout",url:"https://explorer.katla.taiko.xyz"}}}),r3=(0,C.a)({id:205205,name:"Auroria Testnet",network:"auroria",nativeCurrency:{name:"Auroria Stratis",symbol:"tSTRAX",decimals:18},rpcUrls:{default:{http:["https://auroria.rpc.stratisevm.com"]}},blockExplorers:{default:{name:"Auroria Testnet Explorer",url:"https://auroria.explorer.stratisevm.com"}},testnet:!0}),r2=(0,C.a)({id:314159,name:"Filecoin Calibration",nativeCurrency:{decimals:18,name:"testnet filecoin",symbol:"tFIL"},rpcUrls:{default:{http:["https://api.calibration.node.glif.io/rpc/v1"]}},blockExplorers:{default:{name:"Filscan",url:"https://calibration.filscan.io"}}}),r7=(0,C.a)({id:421613,name:"Arbitrum Goerli",nativeCurrency:{name:"Arbitrum Goerli Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://goerli-rollup.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://goerli.arbiscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:88114}},testnet:!0}),r8=(0,C.a)({id:421614,name:"Arbitrum Sepolia",nativeCurrency:{name:"Arbitrum Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia-rollup.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://sepolia.arbiscan.io",apiUrl:"https://api-sepolia.arbiscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:81930}},testnet:!0}),r5=(0,C.a)({id:534351,name:"Scroll Sepolia",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia-rpc.scroll.io"]}},blockExplorers:{default:{name:"Blockscout",url:"https://sepolia-blockscout.scroll.io",apiUrl:"https://sepolia-blockscout.scroll.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:9473}},testnet:!0}),r4=(0,C.a)({id:534352,name:"Scroll",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.scroll.io"],webSocket:["wss://wss-rpc.scroll.io/ws"]}},blockExplorers:{default:{name:"Scrollscan",url:"https://scrollscan.com",apiUrl:"https://api.scrollscan.com/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14}},testnet:!1}),r9=(0,C.a)({id:534353,name:"Scroll Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://alpha-rpc.scroll.io/l2"],webSocket:["wss://alpha-rpc.scroll.io/l2/ws"]}},blockExplorers:{default:{name:"Blockscout",url:"https://blockscout.scroll.io",apiUrl:"https://blockscout.scroll.io/api"}},testnet:!0}),ne=(0,C.a)({id:641230,name:"Bear Network Chain Mainnet",nativeCurrency:{decimals:18,name:"BearNetworkChain",symbol:"BRNKC"},rpcUrls:{default:{http:["https://brnkc-mainnet.bearnetwork.net"]}},blockExplorers:{default:{name:"BrnkScan",url:"https://brnkscan.bearnetwork.net",apiUrl:"https://brnkscan.bearnetwork.net/api"}}}),nt=(0,C.a)({id:751230,name:"Bear Network Chain Testnet",nativeCurrency:{decimals:18,name:"tBRNKC",symbol:"tBRNKC"},rpcUrls:{default:{http:["https://brnkc-test.bearnetwork.net"]}},blockExplorers:{default:{name:"BrnkTestScan",url:"https://brnktest-scan.bearnetwork.net",apiUrl:"https://brnktest-scan.bearnetwork.net/api"}},testnet:!0}),nr=(0,C.a)({id:1337803,name:"Zhejiang",nativeCurrency:{name:"Zhejiang Ether",symbol:"ZhejETH",decimals:18},rpcUrls:{default:{http:["https://rpc.zhejiang.ethpandaops.io"]}},blockExplorers:{default:{name:"Beaconchain",url:"https://zhejiang.beaconcha.in"}},testnet:!0}),nn=(0,C.a)({id:3441005,name:"Manta Pacific Testnet",network:"manta-testnet",nativeCurrency:{decimals:18,name:"ETH",symbol:"ETH"},rpcUrls:{default:{http:["https://manta-testnet.calderachain.xyz/http"]}},blockExplorers:{default:{name:"Manta Testnet Explorer",url:"https://pacific-explorer.testnet.manta.network",apiUrl:"https://pacific-explorer.testnet.manta.network/api"}},contracts:{multicall3:{address:"0x211B1643b95Fe76f11eD8880EE810ABD9A4cf56C",blockCreated:419915}},testnet:!0}),na=(0,C.a)({id:6038361,name:"Astar zkEVM Testnet zKyoto",network:"zKyoto",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.startale.com/zkyoto"]}},blockExplorers:{default:{name:"zKyoto Explorer",url:"https://astar-zkyoto.blockscout.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:196153}},testnet:!0}),no=(0,C.a)({...Q,id:7777777,name:"Zora",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://rpc.zora.energy"],webSocket:["wss://rpc.zora.energy"]}},blockExplorers:{default:{name:"Explorer",url:"https://explorer.zora.energy",apiUrl:"https://explorer.zora.energy/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0x9E6204F750cD866b299594e2aC9eA824E2e5f95c"}},multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:5882},portal:{1:{address:"0x1a0ad011913A150f69f6A19DF447A0CfD9551054"}},l1StandardBridge:{1:{address:"0x3e2Ea9B92B7E48A52296fD261dc26fd995284631"}}},sourceId:1}),ni=(0,C.a)({id:11155111,name:"Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"SEP",decimals:18},rpcUrls:{default:{http:["https://rpc.sepolia.org"]}},blockExplorers:{default:{name:"Etherscan",url:"https://sepolia.etherscan.io",apiUrl:"https://api-sepolia.etherscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:751532},ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},ensUniversalResolver:{address:"0xc8Af999e38273D658BE1b921b88A9Ddf005769cC",blockCreated:5317080}},testnet:!0}),ns=(0,C.a)({...Q,id:11155420,name:"OP Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.optimism.io"]}},blockExplorers:{default:{name:"Blockscout",url:"https://optimism-sepolia.blockscout.com",apiUrl:"https://optimism-sepolia.blockscout.com/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:1620204},portal:{11155111:{address:"0x16Fc5058F25648194471939df75CF27A2fdC48BC"}},l1StandardBridge:{11155111:{address:"0xFBb0621E0B23b5478B630BD55a5f21f67730B0F1"}}},testnet:!0,sourceId:11155111}),nl=(0,C.a)({...Q,id:28122024,name:"Ancient8 Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpcv2-testnet.ancient8.gg"]}},blockExplorers:{default:{name:"Ancient8 Celestia Testnet explorer",url:"https://scanv2-testnet.ancient8.gg",apiUrl:"https://scanv2-testnet.ancient8.gg/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB"}},portal:{11155111:{address:"0xfa1d9E26A6aCD7b22115D27572c1221B9803c960",blockCreated:4972908}},l1StandardBridge:{11155111:{address:"0xF6Bc0146d3c74D48306e79Ae134A260E418C9335",blockCreated:4972908}}},sourceId:11155111}),nc=(0,C.a)({id:37084624,name:"SKALE Nebula Testnet",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://testnet.skalenodes.com/v1/lanky-ill-funny-testnet"],webSocket:["wss://testnet.skalenodes.com/v1/ws/lanky-ill-funny-testnet"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://lanky-ill-funny-testnet.explorer.testnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:105141}},testnet:!0}),nu=(0,C.a)({id:161221135,name:"Plume Testnet",nativeCurrency:{name:"Plume Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://plume-testnet.rpc.caldera.xyz/http"],webSocket:["wss://plume-testnet.rpc.caldera.xyz/ws"]}},blockExplorers:{default:{name:"Blockscout",url:"https://plume-testnet.explorer.caldera.xyz",apiUrl:"https://plume-testnet.explorer.caldera.xyz/api"}},testnet:!0,sourceId:11155111}),nd=(0,C.a)({id:168587773,name:"Blast Sepolia",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.blast.io"]}},blockExplorers:{default:{name:"Blastscan",url:"https://testnet.blastscan.io"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:756690}},testnet:!0,sourceId:11155111}),np=(0,C.a)({id:245022926,name:"Neon EVM DevNet",nativeCurrency:{name:"NEON",symbol:"NEON",decimals:18},rpcUrls:{default:{http:["https://devnet.neonevm.org"]}},blockExplorers:{default:{name:"Neonscan",url:"https://devnet.neonscan.org"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:205206112}},testnet:!0}),nh=(0,C.a)({id:245022934,network:"neonMainnet",name:"Neon EVM MainNet",nativeCurrency:{name:"NEON",symbol:"NEON",decimals:18},rpcUrls:{default:{http:["https://neon-proxy-mainnet.solana.p2p.org"]}},blockExplorers:{default:{name:"Neonscan",url:"https://neonscan.org"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:206545524}},testnet:!1}),nf=(0,C.a)({id:278611351,name:"SKALE | Razor Network",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/turbulent-unique-scheat"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/turbulent-unique-scheat"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://turbulent-unique-scheat.explorer.mainnet.skalenodes.com"}},contracts:{}}),nm=(0,C.a)({id:391845894,name:"SKALE | Block Brawlers",nativeCurrency:{name:"BRAWL",symbol:"BRAWL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/frayed-decent-antares"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/frayed-decent-antares"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://frayed-decent-antares.explorer.mainnet.skalenodes.com"}},contracts:{}}),ng=(0,C.a)({...Q,id:888888888,name:"Ancient8",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.ancient8.gg"]}},blockExplorers:{default:{name:"Ancient8 explorer",url:"https://scan.ancient8.gg",apiUrl:"https://scan.ancient8.gg/api"}},contracts:{...Q.contracts,l2OutputOracle:{1:{address:"0xB09DC08428C8b4EFB4ff9C0827386CDF34277996"}},portal:{1:{address:"0x639F2AECE398Aa76b07e59eF6abe2cFe32bacb68",blockCreated:19070571}},l1StandardBridge:{1:{address:"0xd5e3eDf5b68135D559D572E26bF863FBC1950033",blockCreated:19070571}}},sourceId:1}),nb=(0,C.a)({id:974399131,name:"SKALE Calypso Testnet",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://testnet.skalenodes.com/v1/giant-half-dual-testnet"],webSocket:["wss://testnet.skalenodes.com/v1/ws/giant-half-dual-testnet"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://giant-half-dual-testnet.explorer.testnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:103220}},testnet:!0}),ny=(0,C.a)({...Q,id:999999999,name:"Zora Sepolia",network:"zora-sepolia",nativeCurrency:{decimals:18,name:"Zora Sepolia",symbol:"ETH"},rpcUrls:{default:{http:["https://sepolia.rpc.zora.energy"],webSocket:["wss://sepolia.rpc.zora.energy"]}},blockExplorers:{default:{name:"Zora Sepolia Explorer",url:"https://sepolia.explorer.zora.energy/",apiUrl:"https://sepolia.explorer.zora.energy/api"}},contracts:{...Q.contracts,l2OutputOracle:{11155111:{address:"0x2615B481Bd3E5A1C0C7Ca3Da1bdc663E8615Ade9"}},multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:83160},portal:{11155111:{address:"0xeffE2C6cA9Ab797D418f0D91eA60807713f3536f"}},l1StandardBridge:{11155111:{address:"0x5376f1D543dcbB5BD416c56C189e4cB7399fCcCB"}}},sourceId:11155111,testnet:!0}),nv=(0,C.a)({id:1020352220,name:"SKALE Titan Hub",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://testnet.skalenodes.com/v1/aware-fake-trim-testnet"],webSocket:["wss://testnet.skalenodes.com/v1/ws/aware-fake-trim-testnet"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://aware-fake-trim-testnet.explorer.testnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:104072}},testnet:!0}),nw=(0,C.a)({id:1026062157,name:"SKALE | CryptoBlades",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/affectionate-immediate-pollux"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/affectionate-immediate-pollux"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://affectionate-immediate-pollux.explorer.mainnet.skalenodes.com"}},contracts:{}}),nC=(0,C.a)({id:2046399126,name:"SKALE | Crypto Colosseum",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/haunting-devoted-deneb"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/haunting-devoted-deneb"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://haunting-devoted-deneb.explorer.mainnet.skalenodes.com"}},contracts:{}}),nE=(0,C.a)({id:1273227453,name:"SKALE | Human Protocol",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/wan-red-ain"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/wan-red-ain"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://wan-red-ain.explorer.mainnet.skalenodes.com"}},contracts:{}}),nx=(0,C.a)({id:1313161554,name:"Aurora",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://mainnet.aurora.dev"]}},blockExplorers:{default:{name:"Aurorascan",url:"https://aurorascan.dev",apiUrl:"https://aurorascan.dev/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:62907816}}}),nA=(0,C.a)({id:1313161555,name:"Aurora Testnet",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["https://testnet.aurora.dev"]}},blockExplorers:{default:{name:"Aurorascan",url:"https://testnet.aurorascan.dev",apiUrl:"https://testnet.aurorascan.dev/api"}},testnet:!0}),nk=(0,C.a)({id:1350216234,name:"SKALE | Titan Community Hub",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/parallel-stormy-spica"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/parallel-stormy-spica"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://parallel-stormy-spica.explorer.mainnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:2076458}}}),nB=(0,C.a)({id:1444673419,name:"SKALE Europa Testnet",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://testnet.skalenodes.com/v1/juicy-low-small-testnet"],webSocket:["wss://testnet.skalenodes.com/v1/ws/juicy-low-small-testnet"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://juicy-low-small-testnet.explorer.testnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:110858}},testnet:!0}),nS=(0,C.a)({id:1482601649,name:"SKALE | Nebula Gaming Hub",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/green-giddy-denebola"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/green-giddy-denebola"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://green-giddy-denebola.explorer.mainnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:2372986}}}),nI=(0,C.a)({id:1564830818,name:"SKALE | Calypso NFT Hub",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/honorable-steel-rasalhague"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/honorable-steel-rasalhague"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://honorable-steel-rasalhague.explorer.mainnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3107626}}}),nj=(0,C.a)({id:16666e5,name:"Harmony One",nativeCurrency:{name:"Harmony",symbol:"ONE",decimals:18},rpcUrls:{default:{http:["https://rpc.ankr.com/harmony"]}},blockExplorers:{default:{name:"Harmony Explorer",url:"https://explorer.harmony.one"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:24185753}}}),nT=(0,C.a)({id:2046399126,name:"SKALE | Europa Liquidity Hub",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/elated-tan-skat"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/elated-tan-skat"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://elated-tan-skat.explorer.mainnet.skalenodes.com"}},contracts:{multicall3:{address:"0xcA11bde05977b3631167028862bE2a173976CA11",blockCreated:3113495}}}),nP=(0,C.a)({id:2139927552,name:"SKALE | Exorde",nativeCurrency:{name:"sFUEL",symbol:"sFUEL",decimals:18},rpcUrls:{default:{http:["https://mainnet.skalenodes.com/v1/light-vast-diphda"],webSocket:["wss://mainnet.skalenodes.com/v1/ws/light-vast-diphda"]}},blockExplorers:{default:{name:"SKALE Explorer",url:"https://light-vast-diphda.explorer.mainnet.skalenodes.com"}},contracts:{}}),nM=(0,C.a)({id:11297108099,name:"Palm Testnet",nativeCurrency:{decimals:18,name:"PALM",symbol:"PALM"},rpcUrls:{default:{http:["https://palm-mainnet.public.blastapi.io"],webSocket:["wss://palm-mainnet.public.blastapi.io"]}},blockExplorers:{default:{name:"Chainlens",url:"https://palm.chainlens.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:15429248}},testnet:!0}),nO=(0,C.a)({id:11297108109,name:"Palm",nativeCurrency:{decimals:18,name:"PALM",symbol:"PALM"},rpcUrls:{default:{http:["https://palm-mainnet.public.blastapi.io"],webSocket:["wss://palm-mainnet.public.blastapi.io"]}},blockExplorers:{default:{name:"Chainlens",url:"https://palm.chainlens.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:15429248}}}),nR=(0,C.a)({id:107107114116,name:"Kakarot Sepolia",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia-rpc.kakarot.org"]}},blockExplorers:{default:{name:"Kakarot Scan",url:"https://sepolia.kakarotscan.org"}},testnet:!0}),nU={...E,id:8996,name:"Ganache",network:"ganache",rpcUrls:{default:{http:["http://127.0.0.1:8545"]}}},nF=[x.R,A,K,V,Z,J,X,Y,$,ee,et,er,en,ea,eo,ei,es,el,ec,eu,ed,ep,eh,ef,em,eg,eb,ey,ev,ew,eC,eE,ex,eA,ek,eB,eS,eI,ej,eT,eP,eM,eO,eR,e_,eL,ez,eq,eG,eW,eH,eQ,eK,eV,eZ,eJ,eX,eY,e$,e0,e1,e6,e3,e2,e7,e8,e5,e4,e9,te,tt,tr,tn,ta,to,ti,ts,tl,tc,tu,td,tp,th,tf,tm,tg,tb,ty,tv,tw,tC,tE,tx,tA,tk,tB,tS,tI,tj,tT,tP,tM,tO,tR,tU,tF,tN,tD,t_,tL,tz,tq,tG,tW,tH,tQ,tK,tV,tZ,tJ,tX,tY,t$,t0,t1,t6,t3,t2,t7,t8,t5,t4,t9,re,rt,rr,rn,ra,ro,ri,rs,rl,rc,ru,rd,rp,rh,rf,rm,rg,rb,ry,rv,E,rw,rC,rE,rx,rA,rk,rB,rT,rP,rM,rO,rR,rU,rF,rN,rD,r_,rL,rz,rq,rG,rW,rH,rQ,rK,rV,rZ,rJ,rX,rY,r$,r0,r1,r6,r3,r2,r7,r8,r5,r4,r9,ne,nt,nr,nn,na,no,ni,ns,nl,nc,nu,nd,np,nh,nf,nm,ng,nb,ny,nv,nw,nC,nE,nx,nA,nk,nB,nS,nI,nj,nT,nP,nM,nO,nR,nU];var nN=n(27061);function App(e){let{Component:t,pageProps:n}=e,c=(0,s.vX)({appName:"Ocean Node Control Panel",projectId:nN.env.NEXT_PUBLIC_WALLET_CONNECT_ID?nN.env.NEXT_PUBLIC_WALLET_CONNECT_ID:"da267f7e1897e2cf92a7710f92e8f660",chains:nF,ssr:!0}),u=new v;return(0,o.jsx)(l.F,{config:c,children:(0,o.jsx)(w.aH,{client:u,children:(0,o.jsx)(s.pj,{children:(0,o.jsx)(i.I,{children:(0,o.jsx)(t,{...n})})})})})}},56953:function(){},32352:function(){},92592:function(e,t,n){let o=n(47138),i=n(95115),s=n(6907),l=n(93776);function renderCanvas(e,t,n,s,l){let c=[].slice.call(arguments,1),u=c.length,d="function"==typeof c[u-1];if(!d&&!o())throw Error("Callback required as last argument");if(d){if(u<2)throw Error("Too few arguments provided");2===u?(l=n,n=t,t=s=void 0):3===u&&(t.getContext&&void 0===l?(l=s,s=void 0):(l=s,s=n,n=t,t=void 0))}else{if(u<1)throw Error("Too few arguments provided");return 1===u?(n=t,t=s=void 0):2!==u||t.getContext||(s=n,n=t,t=void 0),new Promise(function(o,l){try{let l=i.create(n,s);o(e(l,t,s))}catch(e){l(e)}})}try{let o=i.create(n,s);l(null,e(o,t,s))}catch(e){l(e)}}t.create=i.create,t.toCanvas=renderCanvas.bind(null,s.render),t.toDataURL=renderCanvas.bind(null,s.renderToDataURL),t.toString=renderCanvas.bind(null,function(e,t,n){return l.render(e,n)})},47138:function(e){e.exports=function(){return"function"==typeof Promise&&Promise.prototype&&Promise.prototype.then}},21845:function(e,t,n){let o=n(10242).getSymbolSize;t.getRowColCoords=function(e){if(1===e)return[];let t=Math.floor(e/7)+2,n=o(e),i=145===n?26:2*Math.ceil((n-13)/(2*t-2)),s=[n-7];for(let e=1;e>>7-e%8&1)==1},put:function(e,t){for(let n=0;n>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){let t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},e.exports=BitBuffer},73280:function(e){function BitMatrix(e){if(!e||e<1)throw Error("BitMatrix size must be defined and greater than 0");this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}BitMatrix.prototype.set=function(e,t,n,o){let i=e*this.size+t;this.data[i]=n,o&&(this.reservedBit[i]=!0)},BitMatrix.prototype.get=function(e,t){return this.data[e*this.size+t]},BitMatrix.prototype.xor=function(e,t,n){this.data[e*this.size+t]^=n},BitMatrix.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]},e.exports=BitMatrix},43424:function(e,t,n){let o=n(62378),i=n(76910);function ByteData(e){this.mode=i.BYTE,"string"==typeof e&&(e=o(e)),this.data=new Uint8Array(e)}ByteData.getBitsLength=function(e){return 8*e},ByteData.prototype.getLength=function(){return this.data.length},ByteData.prototype.getBitsLength=function(){return ByteData.getBitsLength(this.data.length)},ByteData.prototype.write=function(e){for(let t=0,n=this.data.length;t=0&&e.bit<4},t.from=function(e,n){if(t.isValid(e))return e;try{return function(e){if("string"!=typeof e)throw Error("Param is not a string");let n=e.toLowerCase();switch(n){case"l":case"low":return t.L;case"m":case"medium":return t.M;case"q":case"quartile":return t.Q;case"h":case"high":return t.H;default:throw Error("Unknown EC Level: "+e)}}(e)}catch(e){return n}}},76526:function(e,t,n){let o=n(10242).getSymbolSize;t.getPositions=function(e){let t=o(e);return[[0,0],[t-7,0],[0,t-7]]}},61642:function(e,t,n){let o=n(10242),i=o.getBCHDigit(1335);t.getEncodedBits=function(e,t){let n=e.bit<<3|t,s=n<<10;for(;o.getBCHDigit(s)-i>=0;)s^=1335<=33088&&n<=40956)n-=33088;else if(n>=57408&&n<=60351)n-=49472;else throw Error("Invalid SJIS character: "+this.data[t]+"\nMake sure your charset is UTF-8");n=(n>>>8&255)*192+(255&n),e.put(n,13)}},e.exports=KanjiData},27126:function(e,t){t.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};let n={N1:3,N2:3,N3:40,N4:10};t.isValid=function(e){return null!=e&&""!==e&&!isNaN(e)&&e>=0&&e<=7},t.from=function(e){return t.isValid(e)?parseInt(e,10):void 0},t.getPenaltyN1=function(e){let t=e.size,o=0,i=0,s=0,l=null,c=null;for(let u=0;u=5&&(o+=n.N1+(i-5)),l=t,i=1),(t=e.get(d,u))===c?s++:(s>=5&&(o+=n.N1+(s-5)),c=t,s=1)}i>=5&&(o+=n.N1+(i-5)),s>=5&&(o+=n.N1+(s-5))}return o},t.getPenaltyN2=function(e){let t=e.size,o=0;for(let n=0;n=10&&(1488===i||93===i)&&o++,s=s<<1&2047|e.get(l,n),l>=10&&(1488===s||93===s)&&o++}return o*n.N3},t.getPenaltyN4=function(e){let t=0,o=e.data.length;for(let n=0;n=1&&t<10?e.ccBits[0]:t<27?e.ccBits[1]:e.ccBits[2]},t.getBestModeForData=function(e){return i.testNumeric(e)?t.NUMERIC:i.testAlphanumeric(e)?t.ALPHANUMERIC:i.testKanji(e)?t.KANJI:t.BYTE},t.toString=function(e){if(e&&e.id)return e.id;throw Error("Invalid mode")},t.isValid=function(e){return e&&e.bit&&e.ccBits},t.from=function(e,n){if(t.isValid(e))return e;try{return function(e){if("string"!=typeof e)throw Error("Param is not a string");let n=e.toLowerCase();switch(n){case"numeric":return t.NUMERIC;case"alphanumeric":return t.ALPHANUMERIC;case"kanji":return t.KANJI;case"byte":return t.BYTE;default:throw Error("Unknown mode: "+e)}}(e)}catch(e){return n}}},41085:function(e,t,n){let o=n(76910);function NumericData(e){this.mode=o.NUMERIC,this.data=e.toString()}NumericData.getBitsLength=function(e){return 10*Math.floor(e/3)+(e%3?e%3*3+1:0)},NumericData.prototype.getLength=function(){return this.data.length},NumericData.prototype.getBitsLength=function(){return NumericData.getBitsLength(this.data.length)},NumericData.prototype.write=function(e){let t,n;for(t=0;t+3<=this.data.length;t+=3)n=parseInt(this.data.substr(t,3),10),e.put(n,10);let o=this.data.length-t;o>0&&(n=parseInt(this.data.substr(t),10),e.put(n,3*o+1))},e.exports=NumericData},26143:function(e,t,n){let o=n(69729);t.mul=function(e,t){let n=new Uint8Array(e.length+t.length-1);for(let i=0;i=0;){let e=n[0];for(let i=0;i>o&1)==1,o<6?e.set(o,8,i,!0):o<8?e.set(o+1,8,i,!0):e.set(s-15+o,8,i,!0),o<8?e.set(8,s-o-1,i,!0):o<9?e.set(8,15-o-1+1,i,!0):e.set(8,15-o-1,i,!0);e.set(s-8,8,1,!0)}t.create=function(e,t){let n,g;if(void 0===e||""===e)throw Error("No input text");let v=i.M;return void 0!==t&&(v=i.from(t.errorCorrectionLevel,i.M),n=m.from(t.version),g=d.from(t.maskPattern),t.toSJISFunc&&o.setToSJISFunction(t.toSJISFunc)),function(e,t,n,i){let g;if(Array.isArray(e))g=y.fromArray(e);else if("string"==typeof e){let o=t;if(!o){let t=y.rawSplit(e);o=m.getBestVersionForData(t,n)}g=y.fromString(e,o||40)}else throw Error("Invalid data");let v=m.getBestVersionForData(g,n);if(!v)throw Error("The amount of data is too big to be stored in a QR Code");if(t){if(t=0&&t<=6&&(0===o||6===o)||o>=0&&o<=6&&(0===t||6===t)||t>=2&&t<=4&&o>=2&&o<=4?e.set(i+t,s+o,!0,!0):e.set(i+t,s+o,!1,!0))}}(E,t),function(e){let t=e.size;for(let n=8;n=7&&function(e,t){let n,o,i;let s=e.size,l=m.getEncodedBits(t);for(let t=0;t<18;t++)n=Math.floor(t/3),o=t%3+s-8-3,i=(l>>t&1)==1,e.set(n,o,i,!0),e.set(o,n,i,!0)}(E,t),function(e,t){let n=e.size,o=-1,i=n-1,s=7,l=0;for(let c=n-1;c>0;c-=2)for(6===c&&c--;;){for(let n=0;n<2;n++)if(!e.isReserved(i,c-n)){let o=!1;l>>s&1)==1),e.set(i,c-n,o),-1==--s&&(l++,s=7)}if((i+=o)<0||n<=i){i-=o,o=-o;break}}}(E,w),isNaN(i)&&(i=d.getBestMask(E,setupFormatInfo.bind(null,E,n))),d.applyMask(i,E),setupFormatInfo(E,n,i),{modules:E,version:t,errorCorrectionLevel:n,maskPattern:i,segments:g}}(e,n,v,g)}},52882:function(e,t,n){let o=n(26143);function ReedSolomonEncoder(e){this.genPoly=void 0,this.degree=e,this.degree&&this.initialize(this.degree)}ReedSolomonEncoder.prototype.initialize=function(e){this.degree=e,this.genPoly=o.generateECPolynomial(this.degree)},ReedSolomonEncoder.prototype.encode=function(e){if(!this.genPoly)throw Error("Encoder not initialized");let t=new Uint8Array(e.length+this.degree);t.set(e);let n=o.mod(t,this.genPoly),i=this.degree-n.length;if(i>0){let e=new Uint8Array(this.degree);return e.set(n,i),e}return n},e.exports=ReedSolomonEncoder},7007:function(e,t){let n="[0-9]+",o="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";o=o.replace(/u/g,"\\u");let i="(?:(?![A-Z0-9 $%*+\\-./:]|"+o+")(?:.|[\r\n]))+";t.KANJI=RegExp(o,"g"),t.BYTE_KANJI=RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),t.BYTE=RegExp(i,"g"),t.NUMERIC=RegExp(n,"g"),t.ALPHANUMERIC=RegExp("[A-Z $%*+\\-./:]+","g");let s=RegExp("^"+o+"$"),l=RegExp("^"+n+"$"),c=RegExp("^[A-Z0-9 $%*+\\-./:]+$");t.testKanji=function(e){return s.test(e)},t.testNumeric=function(e){return l.test(e)},t.testAlphanumeric=function(e){return c.test(e)}},16130:function(e,t,n){let o=n(76910),i=n(41085),s=n(8260),l=n(43424),c=n(35442),u=n(7007),d=n(10242),p=n(65987);function getStringByteLength(e){return unescape(encodeURIComponent(e)).length}function getSegments(e,t,n){let o;let i=[];for(;null!==(o=e.exec(n));)i.push({data:o[0],index:o.index,mode:t,length:o[0].length});return i}function getSegmentsFromString(e){let t,n;let i=getSegments(u.NUMERIC,o.NUMERIC,e),s=getSegments(u.ALPHANUMERIC,o.ALPHANUMERIC,e);d.isKanjiModeEnabled()?(t=getSegments(u.BYTE,o.BYTE,e),n=getSegments(u.KANJI,o.KANJI,e)):(t=getSegments(u.BYTE_KANJI,o.BYTE,e),n=[]);let l=i.concat(s,t,n);return l.sort(function(e,t){return e.index-t.index}).map(function(e){return{data:e.data,mode:e.mode,length:e.length}})}function getSegmentBitsLength(e,t){switch(t){case o.NUMERIC:return i.getBitsLength(e);case o.ALPHANUMERIC:return s.getBitsLength(e);case o.KANJI:return c.getBitsLength(e);case o.BYTE:return l.getBitsLength(e)}}function buildSingleSegment(e,t){let n;let u=o.getBestModeForData(e);if((n=o.from(t,u))!==o.BYTE&&n.bit=0?e[e.length-1]:null;return n&&n.mode===t.mode?e[e.length-1].data+=t.data:e.push(t),e},[]))},t.rawSplit=function(e){return t.fromArray(getSegmentsFromString(e,d.isKanjiModeEnabled()))}},10242:function(e,t){let n;let o=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];t.getSymbolSize=function(e){if(!e)throw Error('"version" cannot be null or undefined');if(e<1||e>40)throw Error('"version" should be in range from 1 to 40');return 4*e+17},t.getSymbolTotalCodewords=function(e){return o[e]},t.getBCHDigit=function(e){let t=0;for(;0!==e;)t++,e>>>=1;return t},t.setToSJISFunction=function(e){if("function"!=typeof e)throw Error('"toSJISFunc" is not a valid function.');n=e},t.isKanjiModeEnabled=function(){return void 0!==n},t.toSJIS=function(e){return n(e)}},43114:function(e,t){t.isValid=function(e){return!isNaN(e)&&e>=1&&e<=40}},23103:function(e,t,n){let o=n(10242),i=n(35393),s=n(64908),l=n(76910),c=n(43114),u=o.getBCHDigit(7973);function getReservedBitsCount(e,t){return l.getCharCountIndicator(e,t)+4}t.from=function(e,t){return c.isValid(e)?parseInt(e,10):t},t.getCapacity=function(e,t,n){if(!c.isValid(e))throw Error("Invalid QR Code version");void 0===n&&(n=l.BYTE);let s=o.getSymbolTotalCodewords(e),u=i.getTotalCodewordsCount(e,t),d=(s-u)*8;if(n===l.MIXED)return d;let p=d-getReservedBitsCount(n,e);switch(n){case l.NUMERIC:return Math.floor(p/10*3);case l.ALPHANUMERIC:return Math.floor(p/11*2);case l.KANJI:return Math.floor(p/13);case l.BYTE:default:return Math.floor(p/8)}},t.getBestVersionForData=function(e,n){let o;let i=s.from(n,s.M);if(Array.isArray(e)){if(e.length>1)return function(e,n){for(let o=1;o<=40;o++){let i=function(e,t){let n=0;return e.forEach(function(e){let o=getReservedBitsCount(e.mode,t);n+=o+e.getBitsLength()}),n}(e,o);if(i<=t.getCapacity(o,n,l.MIXED))return o}}(e,i);if(0===e.length)return 1;o=e[0]}else o=e;return function(e,n,o){for(let i=1;i<=40;i++)if(n<=t.getCapacity(i,o,e))return i}(o.mode,o.getLength(),i)},t.getEncodedBits=function(e){if(!c.isValid(e)||e<7)throw Error("Invalid QR Code version");let t=e<<12;for(;o.getBCHDigit(t)-u>=0;)t^=7973<':"",d="0&&u>0&&e[c-1]||(o+=s?svgCmd("M",u+n,.5+d+n):svgCmd("m",i,0),i=0,s=!1),u+1',p=i.width?'width="'+i.width+'" height="'+i.width+'" ':"",f=''+u+d+"\n";return"function"==typeof n&&n(null,f),f}},89653:function(e,t){function hex2rgba(e){if("number"==typeof e&&(e=e.toString()),"string"!=typeof e)throw Error("Color should be defined as hex string");let t=e.slice().replace("#","").split("");if(t.length<3||5===t.length||t.length>8)throw Error("Invalid hex color: "+e);(3===t.length||4===t.length)&&(t=Array.prototype.concat.apply([],t.map(function(e){return[e,e]}))),6===t.length&&t.push("F","F");let n=parseInt(t.join(""),16);return{r:n>>24&255,g:n>>16&255,b:n>>8&255,a:255&n,hex:"#"+t.slice(0,6).join("")}}t.getOptions=function(e){e||(e={}),e.color||(e.color={});let t=void 0===e.margin||null===e.margin||e.margin<0?4:e.margin,n=e.width&&e.width>=21?e.width:void 0,o=e.scale||4;return{width:n,scale:n?4:o,margin:t,color:{dark:hex2rgba(e.color.dark||"#000000ff"),light:hex2rgba(e.color.light||"#ffffffff")},type:e.type,rendererOpts:e.rendererOpts||{}}},t.getScale=function(e,t){return t.width&&t.width>=e+2*t.margin?t.width/(e+2*t.margin):t.scale},t.getImageWidth=function(e,n){let o=t.getScale(e,n);return Math.floor((e+2*n.margin)*o)},t.qrToImageData=function(e,n,o){let i=n.modules.size,s=n.modules.data,l=t.getScale(i,o),c=Math.floor((i+2*o.margin)*l),u=o.margin*l,d=[o.color.light,o.color.dark];for(let t=0;t=u&&n>=u&&tt.indexOf(o)&&(n[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,o=Object.getOwnPropertySymbols(e);it.indexOf(o[i])&&Object.prototype.propertyIsEnumerable.call(e,o[i])&&(n[o[i]]=e[o[i]]);return n}function __decorate(e,t,n,o){var i,s=arguments.length,l=s<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,n,o);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(l=(s<3?i(l):s>3?i(t,n,l):i(t,n))||l);return s>3&&l&&Object.defineProperty(t,n,l),l}function __param(e,t){return function(n,o){t(n,o,e)}}function __metadata(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function __awaiter(e,t,n,o){return new(n||(n=Promise))(function(i,s){function fulfilled(e){try{step(o.next(e))}catch(e){s(e)}}function rejected(e){try{step(o.throw(e))}catch(e){s(e)}}function step(e){var t;e.done?i(e.value):((t=e.value)instanceof n?t:new n(function(e){e(t)})).then(fulfilled,rejected)}step((o=o.apply(e,t||[])).next())})}function __generator(e,t){var n,o,i,s,l={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return s={next:verb(0),throw:verb(1),return:verb(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function verb(s){return function(c){return function(s){if(n)throw TypeError("Generator is already executing.");for(;l;)try{if(n=1,o&&(i=2&s[0]?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[2&s[0],i.value]),s[0]){case 0:case 1:i=s;break;case 4:return l.label++,{value:s[1],done:!1};case 5:l.label++,o=s[1],s=[0];continue;case 7:s=l.ops.pop(),l.trys.pop();continue;default:if(!(i=(i=l.trys).length>0&&i[i.length-1])&&(6===s[0]||2===s[0])){l=0;continue}if(3===s[0]&&(!i||s[1]>i[0]&&s[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var o,i,s=n.call(e),l=[];try{for(;(void 0===t||t-- >0)&&!(o=s.next()).done;)l.push(o.value)}catch(e){i={error:e}}finally{try{o&&!o.done&&(n=s.return)&&n.call(s)}finally{if(i)throw i.error}}return l}function __spread(){for(var e=[],t=0;t1||resume(e,t)})})}function resume(e,t){try{var n;(n=i[e](t)).value instanceof __await?Promise.resolve(n.value.v).then(fulfill,reject):settle(s[0][2],n)}catch(e){settle(s[0][3],e)}}function fulfill(e){resume("next",e)}function reject(e){resume("throw",e)}function settle(e,t){e(t),s.shift(),s.length&&resume(s[0][0],s[0][1])}}function __asyncDelegator(e){var t,n;return t={},verb("next"),verb("throw",function(e){throw e}),verb("return"),t[Symbol.iterator]=function(){return this},t;function verb(o,i){t[o]=e[o]?function(t){return(n=!n)?{value:__await(e[o](t)),done:"return"===o}:i?i(t):t}:i}}function __asyncValues(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=__values(e),t={},verb("next"),verb("throw"),verb("return"),t[Symbol.asyncIterator]=function(){return this},t);function verb(n){t[n]=e[n]&&function(t){return new Promise(function(o,i){!function(e,t,n,o){Promise.resolve(o).then(function(t){e({value:t,done:n})},t)}(o,i,(t=e[n](t)).done,t.value)})}}}function __makeTemplateObject(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var i=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t};function __importStar(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&o(t,e,n);return i(t,e),t}function __importDefault(e){return e&&e.__esModule?e:{default:e}}function __classPrivateFieldGet(e,t,n,o){if("a"===n&&!o)throw TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!o:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?o:"a"===n?o.call(e):o?o.value:t.get(e)}function __classPrivateFieldSet(e,t,n,o,i){if("m"===o)throw TypeError("Private method is not writable");if("a"===o&&!i)throw TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!i:!t.has(e))throw TypeError("Cannot write private member to an object whose class did not declare it");return"a"===o?i.call(e,n):i?i.value=n:t.set(e,n),n}function __classPrivateFieldIn(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)}},42238:function(e,t,n){var o;!function(i,s){"use strict";var l="function",c="undefined",u="object",d="string",p="major",f="model",m="name",g="type",b="vendor",y="version",v="architecture",w="console",C="mobile",E="tablet",x="smarttv",A="wearable",k="embedded",B="Amazon",S="Apple",I="ASUS",j="BlackBerry",T="Browser",P="Chrome",M="Firefox",O="Google",R="Huawei",U="Microsoft",F="Motorola",N="Opera",D="Samsung",_="Sharp",L="Sony",z="Xiaomi",q="Zebra",G="Facebook",W="Chromium OS",H="Mac OS",extend=function(e,t){var n={};for(var o in e)t[o]&&t[o].length%2==0?n[o]=t[o].concat(e[o]):n[o]=e[o];return n},enumerize=function(e){for(var t={},n=0;n0?2===c.length?typeof c[1]==l?this[c[0]]=c[1].call(this,p):this[c[0]]=c[1]:3===c.length?typeof c[1]!==l||c[1].exec&&c[1].test?this[c[0]]=p?p.replace(c[1],c[2]):s:this[c[0]]=p?c[1].call(this,p,c[2]):s:4===c.length&&(this[c[0]]=p?c[3].call(this,p.replace(c[1],c[2])):s):this[c]=p||s;f+=2}},strMapper=function(e,t){for(var n in t)if(typeof t[n]===u&&t[n].length>0){for(var o=0;o2&&(e[f]="iPad",e[g]=E),e},this.getEngine=function(){var e={};return e[m]=s,e[y]=s,rgxMapper.call(e,o,x.engine),e},this.getOS=function(){var e={};return e[m]=s,e[y]=s,rgxMapper.call(e,o,x.os),A&&!e[m]&&w&&"Unknown"!=w.platform&&(e[m]=w.platform.replace(/chrome os/i,W).replace(/macos/i,H)),e},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return o},this.setUA=function(e){return o=typeof e===d&&e.length>500?trim(e,500):e,this},this.setUA(o),this};UAParser.VERSION="1.0.37",UAParser.BROWSER=enumerize([m,y,p]),UAParser.CPU=enumerize([v]),UAParser.DEVICE=enumerize([f,b,g,w,C,x,E,A,k]),UAParser.ENGINE=UAParser.OS=enumerize([m,y]),typeof t!==c?(e.exports&&(t=e.exports=UAParser),t.UAParser=UAParser):n.amdO?s!==(o=(function(){return UAParser}).call(t,n,t,e))&&(e.exports=o):typeof i!==c&&(i.UAParser=UAParser);var V=typeof i!==c&&(i.jQuery||i.Zepto);if(V&&!V.ua){var Z=new UAParser;V.ua=Z.getResult(),V.ua.get=function(){return Z.getUA()},V.ua.set=function(e){Z.setUA(e);var t=Z.getResult();for(var n in t)V.ua[n]=t[n]}}}("object"==typeof window?window:this)},53250:function(e,t,n){"use strict";/** * @license React * use-sync-external-store-shim.production.min.js * @@ -14,7 +14,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var o=n(67294),i=n(61688),s="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},l=i.useSyncExternalStore,c=o.useRef,u=o.useEffect,d=o.useMemo,p=o.useDebugValue;t.useSyncExternalStoreWithSelector=function(e,t,n,o,i){var f=c(null);if(null===f.current){var m={hasValue:!1,value:null};f.current=m}else m=f.current;var b=l(e,(f=d(function(){function a(t){if(!c){if(c=!0,e=t,t=o(t),void 0!==i&&m.hasValue){var n=m.value;if(i(n,t))return l=n}return l=t}if(n=l,s(e,t))return n;var u=o(t);return void 0!==i&&i(n,u)?n:(e=t,l=u)}var e,l,c=!1,u=void 0===n?null:n;return[function(){return a(t())},null===u?void 0:function(){return a(u())}]},[t,n,o,i]))[0],f[1]);return u(function(){m.hasValue=!0,m.value=b},[b]),p(b),b}},61688:function(e,t,n){"use strict";e.exports=n(53250)},52798:function(e,t,n){"use strict";e.exports=n(50139)},27061:function(e){var t,n,o,i=e.exports={};function defaultSetTimout(){throw Error("setTimeout has not been defined")}function defaultClearTimeout(){throw Error("clearTimeout has not been defined")}function runTimeout(e){if(t===setTimeout)return setTimeout(e,0);if((t===defaultSetTimout||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(e){t=defaultSetTimout}try{n="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(e){n=defaultClearTimeout}}();var s=[],l=!1,c=-1;function cleanUpNextTick(){l&&o&&(l=!1,o.length?s=o.concat(s):c=-1,s.length&&drainQueue())}function drainQueue(){if(!l){var e=runTimeout(cleanUpNextTick);l=!0;for(var t=s.length;t;){for(o=s,s=[];++c1)for(var n=1;ne instanceof Uint8Array,s=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function bytesToHex(e){if(!u8a(e))throw Error("Uint8Array expected");let t="";for(let n=0;ne+t.length,0)),n=0;return e.forEach(e=>{if(!u8a(e))throw Error("Uint8Array expected");t.set(e,n),n+=e.length}),t}function equalBytes(e,t){if(e.length!==t.length)return!1;for(let n=0;n(i<new Uint8Array(e),u8fr=e=>Uint8Array.from(e);function createHmacDrbg(e,t,n){if("number"!=typeof e||e<2)throw Error("hashLen must be a number");if("number"!=typeof t||t<2)throw Error("qByteLen must be a number");if("function"!=typeof n)throw Error("hmacFn must be a function");let o=u8n(e),i=u8n(e),s=0,reset=()=>{o.fill(1),i.fill(0),s=0},h=(...e)=>n(i,o,...e),reseed=(e=u8n())=>{i=h(u8fr([0]),e),o=h(),0!==e.length&&(i=h(u8fr([1]),e),o=h())},gen=()=>{if(s++>=1e3)throw Error("drbg: tried 1000 values");let e=0,n=[];for(;e{let n;for(reset(),reseed(e);!(n=t(gen()));)reseed();return reset(),n}}let l={bigint:e=>"bigint"==typeof e,function:e=>"function"==typeof e,boolean:e=>"boolean"==typeof e,string:e=>"string"==typeof e,stringOrUint8Array:e=>"string"==typeof e||e instanceof Uint8Array,isSafeInteger:e=>Number.isSafeInteger(e),array:e=>Array.isArray(e),field:(e,t)=>t.Fp.isValid(e),hash:e=>"function"==typeof e&&Number.isSafeInteger(e.outputLen)};function validateObject(e,t,n={}){let checkField=(t,n,o)=>{let i=l[n];if("function"!=typeof i)throw Error(`Invalid validator "${n}", expected function`);let s=e[t];if((!o||void 0!==s)&&!i(s,e))throw Error(`Invalid param ${String(t)}=${s} (${typeof s}), expected ${n}`)};for(let[e,n]of Object.entries(t))checkField(e,n,!1);for(let[e,t]of Object.entries(n))checkField(e,t,!0);return e}},93527:function(e,t,n){"use strict";function number(e){if(!Number.isSafeInteger(e)||e<0)throw Error(`Wrong positive integer: ${e}`)}function bytes(e,...t){if(!(e instanceof Uint8Array))throw Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function hash(e){if("function"!=typeof e||"function"!=typeof e.create)throw Error("Hash should be wrapped by utils.wrapConstructor");number(e.outputLen),number(e.blockLen)}function exists(e,t=!0){if(e.destroyed)throw Error("Hash instance has been destroyed");if(t&&e.finished)throw Error("Hash#digest() has already been called")}function output(e,t){bytes(e);let n=t.outputLen;if(e.lengths-c&&(this.process(n,0),c=0);for(let e=c;e>i&s),c=Number(n&s),u=o?4:0,d=o?0:4;e.setUint32(t+u,l,o),e.setUint32(t+d,c,o)}(n,s-8,BigInt(8*this.length),l),this.process(n,0);let u=(0,i.GL)(e),d=this.outputLen;if(d%4)throw Error("_sha2: outputLen should be aligned to 32bit");let p=d/4,f=this.get();if(p>f.length)throw Error("_sha2: outputLen bigger than state");for(let e=0;ee&t^~e&n,Maj=(e,t,n)=>e&t^e&n^t&n,s=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),l=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),c=new Uint32Array(64);let SHA256=class SHA256 extends SHA2{constructor(){super(64,32,8,!1),this.A=0|l[0],this.B=0|l[1],this.C=0|l[2],this.D=0|l[3],this.E=0|l[4],this.F=0|l[5],this.G=0|l[6],this.H=0|l[7]}get(){let{A:e,B:t,C:n,D:o,E:i,F:s,G:l,H:c}=this;return[e,t,n,o,i,s,l,c]}set(e,t,n,o,i,s,l,c){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|o,this.E=0|i,this.F=0|s,this.G=0|l,this.H=0|c}process(e,t){for(let n=0;n<16;n++,t+=4)c[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){let t=c[e-15],n=c[e-2],o=(0,i.np)(t,7)^(0,i.np)(t,18)^t>>>3,s=(0,i.np)(n,17)^(0,i.np)(n,19)^n>>>10;c[e]=s+c[e-7]+o+c[e-16]|0}let{A:n,B:o,C:l,D:u,E:d,F:p,G:f,H:m}=this;for(let e=0;e<64;e++){let t=(0,i.np)(d,6)^(0,i.np)(d,11)^(0,i.np)(d,25),b=m+t+Chi(d,p,f)+s[e]+c[e]|0,g=(0,i.np)(n,2)^(0,i.np)(n,13)^(0,i.np)(n,22),y=g+Maj(n,o,l)|0;m=f,f=p,p=d,d=u+b|0,u=l,l=o,o=n,n=b+y|0}n=n+this.A|0,o=o+this.B|0,l=l+this.C|0,u=u+this.D|0,d=d+this.E|0,p=p+this.F|0,f=f+this.G|0,m=m+this.H|0,this.set(n,o,l,u,d,p,f,m)}roundClean(){c.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}};let u=(0,i.hE)(()=>new SHA256)},22250:function(e,t,n){"use strict";n.d(t,{fr:function(){return C}});var o=n(93527);let i=BigInt(4294967296-1),s=BigInt(32),rotlSH=(e,t,n)=>e<>>32-n,rotlSL=(e,t,n)=>t<>>32-n,rotlBH=(e,t,n)=>t<>>64-n,rotlBL=(e,t,n)=>e<>>64-n;var l=n(66409);let[c,u,d]=[[],[],[]],p=BigInt(0),f=BigInt(1),m=BigInt(2),b=BigInt(7),g=BigInt(256),y=BigInt(113);for(let e=0,t=f,n=1,o=0;e<24;e++){[n,o]=[o,(2*n+3*o)%5],c.push(2*(5*o+n)),u.push((e+1)*(e+2)/2%64);let i=p;for(let e=0;e<7;e++)(t=(t<>b)*y)%g)&m&&(i^=f<<(f<>s&i)}:{h:0|Number(e>>s&i),l:0|Number(e&i)}}(e[l],t);[n[l],o[l]]=[c,u]}return[n,o]}(d,!0),rotlH=(e,t,n)=>n>32?rotlBH(e,t,n):rotlSH(e,t,n),rotlL=(e,t,n)=>n>32?rotlBL(e,t,n):rotlSL(e,t,n);let Keccak=class Keccak extends l.kb{constructor(e,t,n,i=!1,s=24){if(super(),this.blockLen=e,this.suffix=t,this.outputLen=n,this.enableXOF=i,this.rounds=s,this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,(0,o.Rx)(n),0>=this.blockLen||this.blockLen>=200)throw Error("Sha3 supports only keccak-f1600 function");this.state=new Uint8Array(200),this.state32=(0,l.Jq)(this.state)}keccak(){!function(e,t=24){let n=new Uint32Array(10);for(let o=24-t;o<24;o++){for(let t=0;t<10;t++)n[t]=e[t]^e[t+10]^e[t+20]^e[t+30]^e[t+40];for(let t=0;t<10;t+=2){let o=(t+8)%10,i=(t+2)%10,s=n[i],l=n[i+1],c=rotlH(s,l,1)^n[o],u=rotlL(s,l,1)^n[o+1];for(let n=0;n<50;n+=10)e[t+n]^=c,e[t+n+1]^=u}let t=e[2],i=e[3];for(let n=0;n<24;n++){let o=u[n],s=rotlH(t,i,o),l=rotlL(t,i,o),d=c[n];t=e[d],i=e[d+1],e[d]=s,e[d+1]=l}for(let t=0;t<50;t+=10){for(let o=0;o<10;o++)n[o]=e[t+o];for(let o=0;o<10;o++)e[t+o]^=~n[(o+2)%10]&n[(o+4)%10]}e[0]^=v[o],e[1]^=w[o]}n.fill(0)}(this.state32,this.rounds),this.posOut=0,this.pos=0}update(e){(0,o.Gg)(this);let{blockLen:t,state:n}=this;e=(0,l.O0)(e);let i=e.length;for(let o=0;o=n&&this.keccak();let s=Math.min(n-this.posOut,i-o);e.set(t.subarray(this.posOut,this.posOut+s),o),this.posOut+=s,o+=s}return e}xofInto(e){if(!this.enableXOF)throw Error("XOF is not possible for this instance");return this.writeInto(e)}xof(e){return(0,o.Rx)(e),this.xofInto(new Uint8Array(e))}digestInto(e){if((0,o.J8)(e,this),this.finished)throw Error("digest() was already called");return this.writeInto(e),this.destroy(),e}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,this.state.fill(0)}_cloneInto(e){let{blockLen:t,suffix:n,outputLen:o,rounds:i,enableXOF:s}=this;return e||(e=new Keccak(t,n,o,s,i)),e.state32.set(this.state32),e.pos=this.pos,e.posOut=this.posOut,e.finished=this.finished,e.rounds=i,e.suffix=n,e.outputLen=o,e.enableXOF=s,e.destroyed=this.destroyed,e}};let C=(0,l.hE)(()=>new Keccak(136,1,32))},66409:function(e,t,n){"use strict";n.d(t,{kb:function(){return Hash},eV:function(){return concatBytes},GL:function(){return createView},O6:function(){return randomBytes},np:function(){return rotr},O0:function(){return toBytes},Jq:function(){return u32},hE:function(){return wrapConstructor}});let o="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,u8a=e=>e instanceof Uint8Array,u32=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4)),createView=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),rotr=(e,t)=>e<<32-t|e>>>t,i=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];if(!i)throw Error("Non little-endian hardware is not supported");function toBytes(e){if("string"==typeof e&&(e=function(e){if("string"!=typeof e)throw Error(`utf8ToBytes expected string, got ${typeof e}`);return new Uint8Array(new TextEncoder().encode(e))}(e)),!u8a(e))throw Error(`expected Uint8Array, got ${typeof e}`);return e}function concatBytes(...e){let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),n=0;return e.forEach(e=>{if(!u8a(e))throw Error("Uint8Array expected");t.set(e,n),n+=e.length}),t}let Hash=class Hash{clone(){return this._cloneInto()}};function wrapConstructor(e){let hashC=t=>e().update(toBytes(t)).digest(),t=e();return hashC.outputLen=t.outputLen,hashC.blockLen=t.blockLen,hashC.create=()=>e(),hashC}function randomBytes(e=32){if(o&&"function"==typeof o.getRandomValues)return o.getRandomValues(new Uint8Array(e));throw Error("crypto.getRandomValues must be defined")}},93763:function(e,t,n){"use strict";n.d(t,{I:function(){return o}});var o=`{ + */var o=n(67294),i=n(61688),s="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},l=i.useSyncExternalStore,c=o.useRef,u=o.useEffect,d=o.useMemo,p=o.useDebugValue;t.useSyncExternalStoreWithSelector=function(e,t,n,o,i){var f=c(null);if(null===f.current){var m={hasValue:!1,value:null};f.current=m}else m=f.current;var g=l(e,(f=d(function(){function a(t){if(!c){if(c=!0,e=t,t=o(t),void 0!==i&&m.hasValue){var n=m.value;if(i(n,t))return l=n}return l=t}if(n=l,s(e,t))return n;var u=o(t);return void 0!==i&&i(n,u)?n:(e=t,l=u)}var e,l,c=!1,u=void 0===n?null:n;return[function(){return a(t())},null===u?void 0:function(){return a(u())}]},[t,n,o,i]))[0],f[1]);return u(function(){m.hasValue=!0,m.value=g},[g]),p(g),g}},61688:function(e,t,n){"use strict";e.exports=n(53250)},52798:function(e,t,n){"use strict";e.exports=n(50139)},27061:function(e){var t,n,o,i=e.exports={};function defaultSetTimout(){throw Error("setTimeout has not been defined")}function defaultClearTimeout(){throw Error("clearTimeout has not been defined")}function runTimeout(e){if(t===setTimeout)return setTimeout(e,0);if((t===defaultSetTimout||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(e){t=defaultSetTimout}try{n="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(e){n=defaultClearTimeout}}();var s=[],l=!1,c=-1;function cleanUpNextTick(){l&&o&&(l=!1,o.length?s=o.concat(s):c=-1,s.length&&drainQueue())}function drainQueue(){if(!l){var e=runTimeout(cleanUpNextTick);l=!0;for(var t=s.length;t;){for(o=s,s=[];++c1)for(var n=1;ne instanceof Uint8Array,s=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function bytesToHex(e){if(!u8a(e))throw Error("Uint8Array expected");let t="";for(let n=0;ne+t.length,0)),n=0;return e.forEach(e=>{if(!u8a(e))throw Error("Uint8Array expected");t.set(e,n),n+=e.length}),t}function equalBytes(e,t){if(e.length!==t.length)return!1;for(let n=0;n(i<new Uint8Array(e),u8fr=e=>Uint8Array.from(e);function createHmacDrbg(e,t,n){if("number"!=typeof e||e<2)throw Error("hashLen must be a number");if("number"!=typeof t||t<2)throw Error("qByteLen must be a number");if("function"!=typeof n)throw Error("hmacFn must be a function");let o=u8n(e),i=u8n(e),s=0,reset=()=>{o.fill(1),i.fill(0),s=0},h=(...e)=>n(i,o,...e),reseed=(e=u8n())=>{i=h(u8fr([0]),e),o=h(),0!==e.length&&(i=h(u8fr([1]),e),o=h())},gen=()=>{if(s++>=1e3)throw Error("drbg: tried 1000 values");let e=0,n=[];for(;e{let n;for(reset(),reseed(e);!(n=t(gen()));)reseed();return reset(),n}}let l={bigint:e=>"bigint"==typeof e,function:e=>"function"==typeof e,boolean:e=>"boolean"==typeof e,string:e=>"string"==typeof e,stringOrUint8Array:e=>"string"==typeof e||e instanceof Uint8Array,isSafeInteger:e=>Number.isSafeInteger(e),array:e=>Array.isArray(e),field:(e,t)=>t.Fp.isValid(e),hash:e=>"function"==typeof e&&Number.isSafeInteger(e.outputLen)};function validateObject(e,t,n={}){let checkField=(t,n,o)=>{let i=l[n];if("function"!=typeof i)throw Error(`Invalid validator "${n}", expected function`);let s=e[t];if((!o||void 0!==s)&&!i(s,e))throw Error(`Invalid param ${String(t)}=${s} (${typeof s}), expected ${n}`)};for(let[e,n]of Object.entries(t))checkField(e,n,!1);for(let[e,t]of Object.entries(n))checkField(e,t,!0);return e}},93527:function(e,t,n){"use strict";function number(e){if(!Number.isSafeInteger(e)||e<0)throw Error(`Wrong positive integer: ${e}`)}function bytes(e,...t){if(!(e instanceof Uint8Array))throw Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function hash(e){if("function"!=typeof e||"function"!=typeof e.create)throw Error("Hash should be wrapped by utils.wrapConstructor");number(e.outputLen),number(e.blockLen)}function exists(e,t=!0){if(e.destroyed)throw Error("Hash instance has been destroyed");if(t&&e.finished)throw Error("Hash#digest() has already been called")}function output(e,t){bytes(e);let n=t.outputLen;if(e.lengths-c&&(this.process(n,0),c=0);for(let e=c;e>i&s),c=Number(n&s),u=o?4:0,d=o?0:4;e.setUint32(t+u,l,o),e.setUint32(t+d,c,o)}(n,s-8,BigInt(8*this.length),l),this.process(n,0);let u=(0,i.GL)(e),d=this.outputLen;if(d%4)throw Error("_sha2: outputLen should be aligned to 32bit");let p=d/4,f=this.get();if(p>f.length)throw Error("_sha2: outputLen bigger than state");for(let e=0;ee&t^~e&n,Maj=(e,t,n)=>e&t^e&n^t&n,s=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),l=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),c=new Uint32Array(64);let SHA256=class SHA256 extends SHA2{constructor(){super(64,32,8,!1),this.A=0|l[0],this.B=0|l[1],this.C=0|l[2],this.D=0|l[3],this.E=0|l[4],this.F=0|l[5],this.G=0|l[6],this.H=0|l[7]}get(){let{A:e,B:t,C:n,D:o,E:i,F:s,G:l,H:c}=this;return[e,t,n,o,i,s,l,c]}set(e,t,n,o,i,s,l,c){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|o,this.E=0|i,this.F=0|s,this.G=0|l,this.H=0|c}process(e,t){for(let n=0;n<16;n++,t+=4)c[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){let t=c[e-15],n=c[e-2],o=(0,i.np)(t,7)^(0,i.np)(t,18)^t>>>3,s=(0,i.np)(n,17)^(0,i.np)(n,19)^n>>>10;c[e]=s+c[e-7]+o+c[e-16]|0}let{A:n,B:o,C:l,D:u,E:d,F:p,G:f,H:m}=this;for(let e=0;e<64;e++){let t=(0,i.np)(d,6)^(0,i.np)(d,11)^(0,i.np)(d,25),g=m+t+Chi(d,p,f)+s[e]+c[e]|0,b=(0,i.np)(n,2)^(0,i.np)(n,13)^(0,i.np)(n,22),y=b+Maj(n,o,l)|0;m=f,f=p,p=d,d=u+g|0,u=l,l=o,o=n,n=g+y|0}n=n+this.A|0,o=o+this.B|0,l=l+this.C|0,u=u+this.D|0,d=d+this.E|0,p=p+this.F|0,f=f+this.G|0,m=m+this.H|0,this.set(n,o,l,u,d,p,f,m)}roundClean(){c.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}};let u=(0,i.hE)(()=>new SHA256)},22250:function(e,t,n){"use strict";n.d(t,{fr:function(){return C}});var o=n(93527);let i=BigInt(4294967296-1),s=BigInt(32),rotlSH=(e,t,n)=>e<>>32-n,rotlSL=(e,t,n)=>t<>>32-n,rotlBH=(e,t,n)=>t<>>64-n,rotlBL=(e,t,n)=>e<>>64-n;var l=n(66409);let[c,u,d]=[[],[],[]],p=BigInt(0),f=BigInt(1),m=BigInt(2),g=BigInt(7),b=BigInt(256),y=BigInt(113);for(let e=0,t=f,n=1,o=0;e<24;e++){[n,o]=[o,(2*n+3*o)%5],c.push(2*(5*o+n)),u.push((e+1)*(e+2)/2%64);let i=p;for(let e=0;e<7;e++)(t=(t<>g)*y)%b)&m&&(i^=f<<(f<>s&i)}:{h:0|Number(e>>s&i),l:0|Number(e&i)}}(e[l],t);[n[l],o[l]]=[c,u]}return[n,o]}(d,!0),rotlH=(e,t,n)=>n>32?rotlBH(e,t,n):rotlSH(e,t,n),rotlL=(e,t,n)=>n>32?rotlBL(e,t,n):rotlSL(e,t,n);let Keccak=class Keccak extends l.kb{constructor(e,t,n,i=!1,s=24){if(super(),this.blockLen=e,this.suffix=t,this.outputLen=n,this.enableXOF=i,this.rounds=s,this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,(0,o.Rx)(n),0>=this.blockLen||this.blockLen>=200)throw Error("Sha3 supports only keccak-f1600 function");this.state=new Uint8Array(200),this.state32=(0,l.Jq)(this.state)}keccak(){!function(e,t=24){let n=new Uint32Array(10);for(let o=24-t;o<24;o++){for(let t=0;t<10;t++)n[t]=e[t]^e[t+10]^e[t+20]^e[t+30]^e[t+40];for(let t=0;t<10;t+=2){let o=(t+8)%10,i=(t+2)%10,s=n[i],l=n[i+1],c=rotlH(s,l,1)^n[o],u=rotlL(s,l,1)^n[o+1];for(let n=0;n<50;n+=10)e[t+n]^=c,e[t+n+1]^=u}let t=e[2],i=e[3];for(let n=0;n<24;n++){let o=u[n],s=rotlH(t,i,o),l=rotlL(t,i,o),d=c[n];t=e[d],i=e[d+1],e[d]=s,e[d+1]=l}for(let t=0;t<50;t+=10){for(let o=0;o<10;o++)n[o]=e[t+o];for(let o=0;o<10;o++)e[t+o]^=~n[(o+2)%10]&n[(o+4)%10]}e[0]^=v[o],e[1]^=w[o]}n.fill(0)}(this.state32,this.rounds),this.posOut=0,this.pos=0}update(e){(0,o.Gg)(this);let{blockLen:t,state:n}=this;e=(0,l.O0)(e);let i=e.length;for(let o=0;o=n&&this.keccak();let s=Math.min(n-this.posOut,i-o);e.set(t.subarray(this.posOut,this.posOut+s),o),this.posOut+=s,o+=s}return e}xofInto(e){if(!this.enableXOF)throw Error("XOF is not possible for this instance");return this.writeInto(e)}xof(e){return(0,o.Rx)(e),this.xofInto(new Uint8Array(e))}digestInto(e){if((0,o.J8)(e,this),this.finished)throw Error("digest() was already called");return this.writeInto(e),this.destroy(),e}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,this.state.fill(0)}_cloneInto(e){let{blockLen:t,suffix:n,outputLen:o,rounds:i,enableXOF:s}=this;return e||(e=new Keccak(t,n,o,s,i)),e.state32.set(this.state32),e.pos=this.pos,e.posOut=this.posOut,e.finished=this.finished,e.rounds=i,e.suffix=n,e.outputLen=o,e.enableXOF=s,e.destroyed=this.destroyed,e}};let C=(0,l.hE)(()=>new Keccak(136,1,32))},66409:function(e,t,n){"use strict";n.d(t,{kb:function(){return Hash},eV:function(){return concatBytes},GL:function(){return createView},O6:function(){return randomBytes},np:function(){return rotr},O0:function(){return toBytes},Jq:function(){return u32},hE:function(){return wrapConstructor}});let o="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,u8a=e=>e instanceof Uint8Array,u32=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4)),createView=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),rotr=(e,t)=>e<<32-t|e>>>t,i=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];if(!i)throw Error("Non little-endian hardware is not supported");function toBytes(e){if("string"==typeof e&&(e=function(e){if("string"!=typeof e)throw Error(`utf8ToBytes expected string, got ${typeof e}`);return new Uint8Array(new TextEncoder().encode(e))}(e)),!u8a(e))throw Error(`expected Uint8Array, got ${typeof e}`);return e}function concatBytes(...e){let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),n=0;return e.forEach(e=>{if(!u8a(e))throw Error("Uint8Array expected");t.set(e,n),n+=e.length}),t}let Hash=class Hash{clone(){return this._cloneInto()}};function wrapConstructor(e){let hashC=t=>e().update(toBytes(t)).digest(),t=e();return hashC.outputLen=t.outputLen,hashC.blockLen=t.blockLen,hashC.create=()=>e(),hashC}function randomBytes(e=32){if(o&&"function"==typeof o.getRandomValues)return o.getRandomValues(new Uint8Array(e));throw Error("crypto.getRandomValues must be defined")}},93763:function(e,t,n){"use strict";n.d(t,{I:function(){return o}});var o=`{ "connect_wallet": { "label": "Connect Wallet", "wrong_network": { @@ -1124,8 +1124,8 @@ } } } -`},89192:function(e,t,n){"use strict";let o,i,s,l,c,u,d,p,f,m,b,g,y,v,w,C,E;n.d(t,{NL:function(){return ConnectButton},pj:function(){return RainbowKitProvider},vX:function(){return getDefaultConfig}});var x,A,k,B,S,I,j,T,P='-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',M={rounded:`SFRounded, ui-rounded, "SF Pro Rounded", ${P}`,system:P},O={large:{actionButton:"9999px",connectButton:"12px",modal:"24px",modalMobile:"28px"},medium:{actionButton:"10px",connectButton:"8px",modal:"16px",modalMobile:"18px"},none:{actionButton:"0px",connectButton:"0px",modal:"0px",modalMobile:"0px"},small:{actionButton:"4px",connectButton:"4px",modal:"8px",modalMobile:"8px"}},R={large:{modalOverlay:"blur(20px)"},none:{modalOverlay:"blur(0px)"},small:{modalOverlay:"blur(4px)"}},baseTheme=({borderRadius:e="large",fontStack:t="rounded",overlayBlur:n="none"})=>({blurs:{modalOverlay:R[n].modalOverlay},fonts:{body:M[t]},radii:{actionButton:O[e].actionButton,connectButton:O[e].connectButton,menuButton:O[e].connectButton,modal:O[e].modal,modalMobile:O[e].modalMobile}}),U={blue:{accentColor:"#0E76FD",accentColorForeground:"#FFF"},green:{accentColor:"#1DB847",accentColorForeground:"#FFF"},orange:{accentColor:"#FF801F",accentColorForeground:"#FFF"},pink:{accentColor:"#FF5CA0",accentColorForeground:"#FFF"},purple:{accentColor:"#5F5AFA",accentColorForeground:"#FFF"},red:{accentColor:"#FA423C",accentColorForeground:"#FFF"}},F=U.blue,lightTheme=({accentColor:e=F.accentColor,accentColorForeground:t=F.accentColorForeground,...n}={})=>({...baseTheme(n),colors:{accentColor:e,accentColorForeground:t,actionButtonBorder:"rgba(0, 0, 0, 0.04)",actionButtonBorderMobile:"rgba(0, 0, 0, 0.06)",actionButtonSecondaryBackground:"rgba(0, 0, 0, 0.06)",closeButton:"rgba(60, 66, 66, 0.8)",closeButtonBackground:"rgba(0, 0, 0, 0.06)",connectButtonBackground:"#FFF",connectButtonBackgroundError:"#FF494A",connectButtonInnerBackground:"linear-gradient(0deg, rgba(0, 0, 0, 0.03), rgba(0, 0, 0, 0.06))",connectButtonText:"#25292E",connectButtonTextError:"#FFF",connectionIndicator:"#30E000",downloadBottomCardBackground:"linear-gradient(126deg, rgba(255, 255, 255, 0) 9.49%, rgba(171, 171, 171, 0.04) 71.04%), #FFFFFF",downloadTopCardBackground:"linear-gradient(126deg, rgba(171, 171, 171, 0.2) 9.49%, rgba(255, 255, 255, 0) 71.04%), #FFFFFF",error:"#FF494A",generalBorder:"rgba(0, 0, 0, 0.06)",generalBorderDim:"rgba(0, 0, 0, 0.03)",menuItemBackground:"rgba(60, 66, 66, 0.1)",modalBackdrop:"rgba(0, 0, 0, 0.3)",modalBackground:"#FFF",modalBorder:"transparent",modalText:"#25292E",modalTextDim:"rgba(60, 66, 66, 0.3)",modalTextSecondary:"rgba(60, 66, 66, 0.6)",profileAction:"#FFF",profileActionHover:"rgba(255, 255, 255, 0.5)",profileForeground:"rgba(60, 66, 66, 0.06)",selectedOptionBorder:"rgba(60, 66, 66, 0.1)",standby:"#FFD641"},shadows:{connectButton:"0px 4px 12px rgba(0, 0, 0, 0.1)",dialog:"0px 8px 32px rgba(0, 0, 0, 0.32)",profileDetailsAction:"0px 2px 6px rgba(37, 41, 46, 0.04)",selectedOption:"0px 2px 6px rgba(0, 0, 0, 0.24)",selectedWallet:"0px 2px 6px rgba(0, 0, 0, 0.12)",walletLogo:"0px 2px 16px rgba(0, 0, 0, 0.16)"}});lightTheme.accentColors=U;var N=n(93763),D=n(67294),addRecipe=function(e,t){return Object.defineProperty(e,"__recipe__",{value:t,writable:!1}),e};function createNormalizeValueFn(e){var{conditions:t}=e;if(!t)throw Error("Styles have no conditions");return addRecipe(function(e){if("string"==typeof e||"number"==typeof e||"boolean"==typeof e){if(!t.defaultCondition)throw Error("No default condition");return{[t.defaultCondition]:e}}if(Array.isArray(e)){if(!("responsiveArray"in t))throw Error("Responsive arrays are not supported");var n={};for(var o in t.responsiveArray)null!=e[o]&&(n[t.responsiveArray[o]]=e[o]);return n}return e},{importPath:"@vanilla-extract/sprinkles/createUtils",importName:"createNormalizeValueFn",args:[{conditions:e.conditions}]})}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,o)}return n}function _objectSpread2(e){for(var t=1;tfunction(){for(var t=arguments.length,n=Array(t),o=0;oe.styles)),s=Object.keys(i),l=s.filter(e=>"mappings"in i[e]);return Object.assign(t=>{var n=[],o={},s=_objectSpread2({},t),c=!1;for(var u of l){var d=t[u];if(null!=d)for(var p of(c=!0,i[u].mappings))o[p]=d,null==s[p]&&delete s[p]}var f=c?_objectSpread2(_objectSpread2({},o),s):t;for(var m in f)if("continue"===function(){var e=f[m],t=i[m];try{if(t.mappings)return"continue";if("string"==typeof e||"number"==typeof e)n.push(t.values[e].defaultClass);else if(Array.isArray(e))for(var o=0;oe,_=n(92321),L=n(90512),z=n(37122),q=n(97405),G=n(95946),W=n(61836),H=n(15229),Q=n(92106);async function getBalance(e,{address:t,blockNumber:n,blockTag:o="latest"}){let i=n?(0,Q.eC)(n):void 0,s=await e.request({method:"eth_getBalance",params:[t,i||o]});return BigInt(s)}var K=n(81946),V=n(84192);function getUnit(e){return"number"==typeof e?e:"wei"===e?0:Math.abs(V.Bd[e])}var Z=n(16693),J=n(57412),X=n(62027),Y=n(7210),$=n(55629),ee=n(47864),et=n(39028);function getContractError(e,{abi:t,address:n,args:o,docsPath:i,functionName:s,sender:l}){let{code:c,data:u,message:d,shortMessage:p}=e instanceof q.VQ?e:e instanceof X.G?e.walk(e=>"data"in e)||e.walk():{},f=e instanceof J.wb?new q.Dk({functionName:s}):[3,et.XS.code].includes(c)&&(u||d||p)?new q.Lu({abi:t,data:"object"==typeof u?u.data:u,functionName:s,message:p??d}):e;return new q.uq(f,{abi:t,args:o,contractAddress:n,docsPath:i,functionName:s,sender:l})}function getAction_getAction(e,t,n){return o=>e[t.name||n]?.(o)??t(e,o)}var er=n(61376);async function readContract(e,t){let{abi:n,address:o,args:i,functionName:s,...l}=t,c=(0,$.R)({abi:n,args:i,functionName:s});try{let{data:t}=await getAction_getAction(e,er.RE,"call")({...l,data:c,to:o});return(0,Y.k)({abi:n,args:i,functionName:s,data:t||"0x"})}catch(e){throw getContractError(e,{abi:n,address:o,args:i,docsPath:"/docs/contract/readContract",functionName:s})}}async function multicall(e,t){let{allowFailure:n=!0,batchSize:o,blockNumber:i,blockTag:s,multicallAddress:l,stateOverride:c}=t,u=t.contracts,d=o??("object"==typeof e.batch?.multicall&&e.batch.multicall.batchSize||1024),p=l;if(!p){if(!e.chain)throw Error("client chain not configured. multicallAddress is required.");p=(0,ee.L)({blockNumber:i,chain:e.chain,contract:"multicall3"})}let f=[[]],m=0,b=0;for(let e=0;e0&&b>d&&f[m].length>0&&(m++,b=(e.length-2)/2,f[m]=[]),f[m]=[...f[m],{allowFailure:!0,callData:e,target:o}]}catch(l){let e=getContractError(l,{abi:t,address:o,args:i,docsPath:"/docs/contract/multicall",functionName:s});if(!n)throw e;f[m]=[...f[m],{allowFailure:!0,callData:"0x",target:o}]}}let g=await Promise.allSettled(f.map(t=>getAction_getAction(e,readContract,"readContract")({abi:Z.F8,address:p,args:[t],blockNumber:i,blockTag:s,functionName:"aggregate3",stateOverride:c}))),y=[];for(let e=0;e{let i=n.chainId??e.state.chainId;return{...t,[i]:[...t[i]||[],{contract:n,index:o}]}},{}),c=(await Promise.all(Object.entries(t).map(([t,l])=>multicall_multicall(e,{...s,allowFailure:n,blockNumber:o,blockTag:i,chainId:parseInt(t),contracts:l.map(({contract:e})=>e)})))).flat(),u=Object.values(t).flatMap(e=>e.map(({index:e})=>e));return c.reduce((e,t,n)=>(e&&(e[u[n]]=t),e),[])}catch(t){if(t instanceof q.uq)throw t;let promises=()=>l.map(t=>(function(e,t){let{chainId:n,...o}=t,i=e.getClient({chainId:n}),s=(0,K.s)(i,readContract,"readContract");return s(o)})(e,{...t,blockNumber:o,blockTag:i}));if(n)return(await Promise.allSettled(promises())).map(e=>"fulfilled"===e.status?{result:e.value,status:"success"}:{error:e.reason,result:void 0,status:"failure"});return await Promise.all(promises())}}async function getBalance_getBalance(e,t){let{address:n,blockNumber:o,blockTag:i,chainId:s,token:l,unit:c="ether"}=t;if(l)try{return getTokenBalance(e,{balanceAddress:n,chainId:s,symbolType:"string",tokenAddress:l})}catch(t){if(t instanceof q.uq){let t=await getTokenBalance(e,{balanceAddress:n,chainId:s,symbolType:"bytes32",tokenAddress:l}),o=(0,G.rR)((0,W.f)(t.symbol,{dir:"right"}));return{...t,symbol:o}}throw t}let u=e.getClient({chainId:s}),d=(0,K.s)(u,getBalance,"getBalance"),p=await d(o?{address:n,blockNumber:o}:{address:n,blockTag:i}),f=e.chains.find(e=>e.id===s)??u.chain;return{decimals:f.nativeCurrency.decimals,formatted:(0,H.b)(p,getUnit(c)),symbol:f.nativeCurrency.symbol,value:p}}async function getTokenBalance(e,t){let{balanceAddress:n,chainId:o,symbolType:i,tokenAddress:s,unit:l}=t,c={abi:[{type:"function",name:"balanceOf",stateMutability:"view",inputs:[{type:"address"}],outputs:[{type:"uint256"}]},{type:"function",name:"decimals",stateMutability:"view",inputs:[],outputs:[{type:"uint8"}]},{type:"function",name:"symbol",stateMutability:"view",inputs:[],outputs:[{type:i}]}],address:s},[u,d,p]=await readContracts(e,{allowFailure:!1,contracts:[{...c,functionName:"balanceOf",args:[n],chainId:o},{...c,functionName:"decimals",chainId:o},{...c,functionName:"symbol",chainId:o}]}),f=(0,H.b)(u??"0",getUnit(l??d));return{decimals:d,formatted:f,symbol:p,value:u}}function utils_hashFn(e){return JSON.stringify(e,(e,t)=>!function(e){if(!hasObjectPrototype(e))return!1;let t=e.constructor;if(void 0===t)return!0;let n=t.prototype;return!!(hasObjectPrototype(n)&&n.hasOwnProperty("isPrototypeOf"))}(t)?"bigint"==typeof t?t.toString():t:Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}))}function hasObjectPrototype(e){return"[object Object]"===Object.prototype.toString.call(e)}function filterQueryOptions(e){let{_defaulted:t,behavior:n,gcTime:o,initialData:i,initialDataUpdatedAt:s,maxPages:l,meta:c,networkMode:u,queryFn:d,queryHash:p,queryKey:f,queryKeyHashFn:m,retry:b,retryDelay:g,structuralSharing:y,getPreviousPageParam:v,getNextPageParam:w,initialPageParam:C,_optimisticResults:E,enabled:x,notifyOnChangeProps:A,placeholderData:k,refetchInterval:B,refetchIntervalInBackground:S,refetchOnMount:I,refetchOnReconnect:j,refetchOnWindowFocus:T,retryOnMount:P,select:M,staleTime:O,suspense:R,throwOnError:U,config:F,connector:N,query:D,..._}=e;return _}var en=n(24139),ea=n(27037),eo=n(66474),ei=n(7506),es=n(56888),el=class extends ei.l{constructor(e,t){super(),this.options=t,this.#g=e,this.#y=null,this.bindMethods(),this.setOptions(t)}#g;#v=void 0;#w=void 0;#C=void 0;#E;#x;#y;#A;#k;#B;#S;#I;#j;#T=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){1===this.listeners.size&&(this.#v.addObserver(this),shouldFetchOnMount(this.#v,this.options)?this.#P():this.updateResult(),this.#M())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return shouldFetchOn(this.#v,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return shouldFetchOn(this.#v,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#O(),this.#R(),this.#v.removeObserver(this)}setOptions(e,t){let n=this.options,o=this.#v;if(this.options=this.#g.defaultQueryOptions(e),void 0!==this.options.enabled&&"boolean"!=typeof this.options.enabled)throw Error("Expected enabled to be a boolean");this.#U(),this.#v.setOptions(this.options),n._defaulted&&!(0,en.VS)(this.options,n)&&this.#g.getQueryCache().notify({type:"observerOptionsUpdated",query:this.#v,observer:this});let i=this.hasListeners();i&&shouldFetchOptionally(this.#v,o,this.options,n)&&this.#P(),this.updateResult(t),i&&(this.#v!==o||this.options.enabled!==n.enabled||this.options.staleTime!==n.staleTime)&&this.#F();let s=this.#N();i&&(this.#v!==o||this.options.enabled!==n.enabled||s!==this.#j)&&this.#D(s)}getOptimisticResult(e){let t=this.#g.getQueryCache().build(this.#g,e),n=this.createResult(t,e);return(0,en.VS)(this.getCurrentResult(),n)||(this.#C=n,this.#x=this.options,this.#E=this.#v.state),n}getCurrentResult(){return this.#C}trackResult(e,t){let n={};return Object.keys(e).forEach(o=>{Object.defineProperty(n,o,{configurable:!1,enumerable:!0,get:()=>(this.trackProp(o),t?.(o),e[o])})}),n}trackProp(e){this.#T.add(e)}getCurrentQuery(){return this.#v}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#g.defaultQueryOptions(e),n=this.#g.getQueryCache().build(this.#g,t);return n.isFetchingOptimistic=!0,n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#P({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#C))}#P(e){this.#U();let t=this.#v.fetch(this.options,e);return e?.throwOnError||(t=t.catch(en.ZT)),t}#F(){if(this.#O(),en.sk||this.#C.isStale||!(0,en.PN)(this.options.staleTime))return;let e=(0,en.Kp)(this.#C.dataUpdatedAt,this.options.staleTime);this.#S=setTimeout(()=>{this.#C.isStale||this.updateResult()},e+1)}#N(){return("function"==typeof this.options.refetchInterval?this.options.refetchInterval(this.#v):this.options.refetchInterval)??!1}#D(e){this.#R(),this.#j=e,!en.sk&&!1!==this.options.enabled&&(0,en.PN)(this.#j)&&0!==this.#j&&(this.#I=setInterval(()=>{(this.options.refetchIntervalInBackground||eo.j.isFocused())&&this.#P()},this.#j))}#M(){this.#F(),this.#D(this.#N())}#O(){this.#S&&(clearTimeout(this.#S),this.#S=void 0)}#R(){this.#I&&(clearInterval(this.#I),this.#I=void 0)}createResult(e,t){let n;let o=this.#v,i=this.options,s=this.#C,l=this.#E,c=this.#x,u=e!==o,d=u?e.state:this.#w,{state:p}=e,f={...p},m=!1;if(t._optimisticResults){let n=this.hasListeners(),s=!n&&shouldFetchOnMount(e,t),l=n&&shouldFetchOptionally(e,o,t,i);(s||l)&&(f={...f,...(0,es.z)(p.data,e.options)}),"isRestoring"===t._optimisticResults&&(f.fetchStatus="idle")}let{error:b,errorUpdatedAt:g,status:y}=f;if(t.select&&void 0!==f.data){if(s&&f.data===l?.data&&t.select===this.#A)n=this.#k;else try{this.#A=t.select,n=t.select(f.data),n=(0,en.oE)(s?.data,n,t),this.#k=n,this.#y=null}catch(e){this.#y=e}}else n=f.data;if(void 0!==t.placeholderData&&void 0===n&&"pending"===y){let e;if(s?.isPlaceholderData&&t.placeholderData===c?.placeholderData)e=s.data;else if(e="function"==typeof t.placeholderData?t.placeholderData(this.#B?.state.data,this.#B):t.placeholderData,t.select&&void 0!==e)try{e=t.select(e),this.#y=null}catch(e){this.#y=e}void 0!==e&&(y="success",n=(0,en.oE)(s?.data,e,t),m=!0)}this.#y&&(b=this.#y,n=this.#k,g=Date.now(),y="error");let v="fetching"===f.fetchStatus,w="pending"===y,C="error"===y,E=w&&v,x=void 0!==n,A={status:y,fetchStatus:f.fetchStatus,isPending:w,isSuccess:"success"===y,isError:C,isInitialLoading:E,isLoading:E,data:n,dataUpdatedAt:f.dataUpdatedAt,error:b,errorUpdatedAt:g,failureCount:f.fetchFailureCount,failureReason:f.fetchFailureReason,errorUpdateCount:f.errorUpdateCount,isFetched:f.dataUpdateCount>0||f.errorUpdateCount>0,isFetchedAfterMount:f.dataUpdateCount>d.dataUpdateCount||f.errorUpdateCount>d.errorUpdateCount,isFetching:v,isRefetching:v&&!w,isLoadingError:C&&!x,isPaused:"paused"===f.fetchStatus,isPlaceholderData:m,isRefetchError:C&&x,isStale:isStale(e,t),refetch:this.refetch};return A}updateResult(e){let t=this.#C,n=this.createResult(this.#v,this.options);if(this.#E=this.#v.state,this.#x=this.options,void 0!==this.#E.data&&(this.#B=this.#v),(0,en.VS)(n,t))return;this.#C=n;let o={};e?.listeners!==!1&&(()=>{if(!t)return!0;let{notifyOnChangeProps:e}=this.options,n="function"==typeof e?e():e;if("all"===n||!n&&!this.#T.size)return!0;let o=new Set(n??this.#T);return this.options.throwOnError&&o.add("error"),Object.keys(this.#C).some(e=>{let n=this.#C[e]!==t[e];return n&&o.has(e)})})()&&(o.listeners=!0),this.#_({...o,...e})}#U(){let e=this.#g.getQueryCache().build(this.#g,this.options);if(e===this.#v)return;let t=this.#v;this.#v=e,this.#w=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#M()}#_(e){ea.V.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#C)}),this.#g.getQueryCache().notify({query:this.#v,type:"observerResultsUpdated"})})}};function shouldFetchOnMount(e,t){return!1!==t.enabled&&void 0===e.state.data&&!("error"===e.state.status&&!1===t.retryOnMount)||void 0!==e.state.data&&shouldFetchOn(e,t,t.refetchOnMount)}function shouldFetchOn(e,t,n){if(!1!==t.enabled){let o="function"==typeof n?n(e):n;return"always"===o||!1!==o&&isStale(e,t)}return!1}function shouldFetchOptionally(e,t,n,o){return(e!==t||!1===o.enabled)&&(!n.suspense||"error"!==e.state.status)&&isStale(e,n)}function isStale(e,t){return!1!==t.enabled&&e.isStaleByTime(t.staleTime)}n(85893);var ec=D.createContext((E=!1,{clearReset:()=>{E=!1},reset:()=>{E=!0},isReset:()=>E})),useQueryErrorResetBoundary=()=>D.useContext(ec),eu=n(30202),ed=D.createContext(!1),useIsRestoring=()=>D.useContext(ed);ed.Provider;var ep=n(86290),ensurePreventErrorBoundaryRetry=(e,t)=>{(e.suspense||e.throwOnError)&&!t.isReset()&&(e.retryOnMount=!1)},useClearResetErrorBoundary=e=>{D.useEffect(()=>{e.clearReset()},[e])},getHasError=({result:e,errorResetBoundary:t,throwOnError:n,query:o})=>e.isError&&!t.isReset()&&!e.isFetching&&o&&(0,ep.L)(n,[e.error,o]),ensureStaleTime=e=>{e.suspense&&"number"!=typeof e.staleTime&&(e.staleTime=1e3)},shouldSuspend=(e,t)=>e?.suspense&&t.isPending,fetchOptimistic=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function query_useQuery(e){let t=function(e,t,n){let o=(0,eu.NL)(n),i=useIsRestoring(),s=useQueryErrorResetBoundary(),l=o.defaultQueryOptions(e);l._optimisticResults=i?"isRestoring":"optimistic",ensureStaleTime(l),ensurePreventErrorBoundaryRetry(l,s),useClearResetErrorBoundary(s);let[c]=D.useState(()=>new t(o,l)),u=c.getOptimisticResult(l);if(D.useSyncExternalStore(D.useCallback(e=>{let t=i?()=>void 0:c.subscribe(ea.V.batchCalls(e));return c.updateResult(),t},[c,i]),()=>c.getCurrentResult(),()=>c.getCurrentResult()),D.useEffect(()=>{c.setOptions(l,{listeners:!1})},[l,c]),shouldSuspend(l,u))throw fetchOptimistic(l,c,s);if(getHasError({result:u,errorResetBoundary:s,throwOnError:l.throwOnError,query:o.getQueryCache().get(l.queryHash)}))throw u.error;return l.notifyOnChangeProps?u:c.trackResult(u)}({...e,queryKeyHashFn:utils_hashFn},el,void 0);return t.queryKey=e.queryKey,t}function getChainId(e){return e.state.chainId}function useChainId(e={}){let t=(0,z.Z)(e);return(0,D.useSyncExternalStore)(e=>(function(e,t){let{onChange:n}=t;return e.subscribe(e=>e.chainId,n)})(t,{onChange:e}),()=>getChainId(t),()=>getChainId(t))}function useBalance(e={}){let{address:t,query:n={}}=e,o=(0,z.Z)(e),i=useChainId(),s=function(e,t={}){return{async queryFn({queryKey:t}){let{address:n,scopeKey:o,...i}=t[1];if(!n)throw Error("address is required");let s=await getBalance_getBalance(e,{...i,address:n});return s??null},queryKey:function(e={}){return["balance",filterQueryOptions(e)]}(t)}}(o,{...e,chainId:e.chainId??i}),l=!!(t&&(n.enabled??!0));return query_useQuery({...n,...s,enabled:l})}let eh=new Map([[8217,"apostrophe"],[8260,"fraction slash"],[12539,"middle dot"]]);function read_compressed_payload(e){var t;let n;return t=function(e){let t=0;function u16(){return e[t++]<<8|e[t++]}let n=u16(),o=1,i=[0,1];for(let e=1;e>--c&1}let d=2147483648-1,p=0;for(let e=0;e<31;e++)p=p<<1|read_bit();let f=[],m=0,b=2147483648;for(;;){let e=Math.floor(((p-m+1)*o-1)/b),t=0,s=n;for(;s-t>1;){let n=t+s>>>1;e>>1|read_bit(),l=l<<1^1073741824,c=(1073741824^c)<<1|1073741825;m=l,b=1+c-l}let g=n-4;return f.map(t=>{switch(t-g){case 3:return g+65792+(e[l++]<<16|e[l++]<<8|e[l++]);case 2:return g+256+(e[l++]<<8|e[l++]);case 1:return g+e[l++];default:return t-1}})}(function(e){let t=[];[..."ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"].forEach((e,n)=>t[e.charCodeAt(0)]=n);let n=e.length,o=new Uint8Array(6*n>>3);for(let i=0,s=0,l=0,c=0;i=8&&(o[s++]=c>>(l-=8));return o}(e)),n=0,()=>t[n++]}function read_sorted(e,t=0){let n=[];for(;;){let o=e(),i=e();if(!i)break;t+=o;for(let e=0;e{let t=read_sorted(e);if(t.length)return t})}function read_mapped(e){let t=[];for(;;){let n=e();if(0==n)break;t.push(function(e,t){let n=1+t(),o=t(),i=read_array_while(t);return read_transposed(i.length,1+e,t).flatMap((e,t)=>{let[s,...l]=e;return Array(i[t]).fill().map((e,t)=>{let i=t*o;return[s+t*n,l.map(e=>e+i)]})})}(n,e))}for(;;){let n=e()-1;if(n<0)break;t.push(read_transposed(1+e(),1+n,e).map(e=>[e[0],e.slice(1)]))}return t.flat()}function read_array_while(e){let t=[];for(;;){let n=e(t.length);if(!n)break;t.push(n)}return t}function read_transposed(e,t,n){let o=Array(e).fill().map(()=>[]);for(let i=0;i>1:o>>1}return n})(e,n).forEach((e,t)=>o[t].push(e));return o}function quote_cp(e){return`{${e.toString(16).toUpperCase().padStart(2,"0")}}`}function str_from_cps(e){let t=e.length;if(t<4096)return String.fromCodePoint(...e);let n=[];for(let o=0;o>24&255}function unpack_cp(e){return 16777215&e}function is_hangul(e){return e>=44032&&e<55204}function decomposed(e){o||function(){let e=read_compressed_payload("AEUDTAHBCFQATQDRADAAcgAgADQAFAAsABQAHwAOACQADQARAAoAFwAHABIACAAPAAUACwAFAAwABAAQAAMABwAEAAoABQAIAAIACgABAAQAFAALAAIACwABAAIAAQAHAAMAAwAEAAsADAAMAAwACgANAA0AAwAKAAkABAAdAAYAZwDSAdsDJgC0CkMB8xhZAqfoC190UGcThgBurwf7PT09Pb09AjgJum8OjDllxHYUKXAPxzq6tABAxgK8ysUvWAgMPT09PT09PSs6LT2HcgWXWwFLoSMEEEl5RFVMKvO0XQ8ExDdJMnIgsj26PTQyy8FfEQ8AY8IPAGcEbwRwBHEEcgRzBHQEdQR2BHcEeAR6BHsEfAR+BIAEgfndBQoBYgULAWIFDAFiBNcE2ATZBRAFEQUvBdALFAsVDPcNBw13DYcOMA4xDjMB4BllHI0B2grbAMDpHLkQ7QHVAPRNQQFnGRUEg0yEB2uaJF8AJpIBpob5AERSMAKNoAXqaQLUBMCzEiACnwRZEkkVsS7tANAsBG0RuAQLEPABv9HICTUBXigPZwRBApMDOwAamhtaABqEAY8KvKx3LQ4ArAB8UhwEBAVSagD8AEFZADkBIadVj2UMUgx5Il4ANQC9AxIB1BlbEPMAs30CGxlXAhwZKQIECBc6EbsCoxngzv7UzRQA8M0BawL6ZwkN7wABAD33OQRcsgLJCjMCjqUChtw/km+NAsXPAoP2BT84PwURAK0RAvptb6cApQS/OMMey5HJS84UdxpxTPkCogVFITaTOwERAK5pAvkNBOVyA7q3BKlOJSALAgUIBRcEdASpBXqzABXFSWZOawLCOqw//AolCZdvv3dSBkEQGyelEPcMMwG1ATsN7UvYBPEGOwTJH30ZGQ/NlZwIpS3dDO0m4y6hgFoj9SqDBe1L9DzdC01RaA9ZC2UJ4zpjgU4DIQENIosK3Q05CG0Q8wrJaw3lEUUHOQPVSZoApQcBCxEdNRW1JhBirAsJOXcG+xr2C48mrxMpevwF0xohBk0BKRr/AM8u54WwWjFcHE9fBgMLJSPHFKhQIA0lQLd4SBobBxUlqQKRQ3BKh1E2HpMh9jw9DWYuE1F8B/U8BRlPC4E8nkarRQ4R0j6NPUgiSUwsBDV/LC8niwnPD4UMuXxyAVkJIQmxDHETMREXN8UIOQcZLZckJxUIIUaVYJoE958D8xPRAwsFPwlBBxMDtRwtEy4VKQUNgSTXAvM21S6zAo9WgAEXBcsPJR/fEFBH4A7pCJsCZQODJesALRUhABcimwhDYwBfj9hTBS7LCMdqbCN0A2cU52ERcweRDlcHpxwzFb8c4XDIXguGCCijrwlbAXUJmQFfBOMICTVbjKAgQWdTi1gYmyBhQT9d/AIxDGUVn0S9h3gCiw9rEhsBNQFzBzkNAQJ3Ee0RaxCVCOuGBDW1M/g6JQRPIYMgEQonA09szgsnJvkM+GkBoxJiAww0PXfuZ6tgtiQX/QcZMsVBYCHxC5JPzQycGsEYQlQuGeQHvwPzGvMn6kFXBf8DowMTOk0z7gS9C2kIiwk/AEkOoxcH1xhqCnGM0AExiwG3mQNXkYMCb48GNwcLAGcLhwV55QAdAqcIowAFAM8DVwA5Aq0HnQAZAIVBAT0DJy8BIeUCjwOTCDHLAZUvAfMpBBvDDBUA9zduSgLDsQKAamaiBd1YAo4CSTUBTSUEBU5HUQOvceEA2wBLBhPfRwEVq0rLGuNDAd9vKwDHAPsABTUHBUEBzQHzbQC3AV8LMQmis7UBTekpAIMAFWsB1wKJAN0ANQB/8QFTAE0FWfkF0wJPSQERMRgrV2EBuwMfATMBDQB5BsuNpckHHwRtB9MCEBsV4QLvLge1AQMi3xPNQsUCvd5VoWACZIECYkJbTa9bNyACofcCaJgCZgkCn4Q4GwsCZjsCZiYEbgR/A38TA36SOQY5dxc5gjojIwJsHQIyNjgKAm3HAm2u74ozZ0UrAWcA3gDhAEoFB5gMjQD+C8IADbUCdy8CdqI/AnlLQwJ4uh1c20WuRtcCfD8CesgCfQkCfPAFWQUgSABIfWMkAoFtAoAAAoAFAn+uSVhKWxUXSswC0QEC0MxLJwOITwOH5kTFkTIC8qFdAwMDrkvOTC0lA89NTE2vAos/AorYwRsHHUNnBbcCjjcCjlxAl4ECjtkCjlx4UbRTNQpS1FSFApP7ApMMAOkAHFUeVa9V0AYsGymVhjLheGZFOzkCl58C77JYIagAWSUClo8ClnycAKlZrFoJgU0AOwKWtQKWTlxEXNECmcsCmWRcyl0HGQKcmznCOp0CnBYCn5sCnriKAB0PMSoPAp3xAp6SALU9YTRh7wKe0wKgbgGpAp6fHwKeTqVjyGQnJSsCJ68CJn4CoPsCoEwCot0CocQCpi8Cpc4Cp/8AfQKn8mh8aLEAA0lqHGrRAqzjAqyuAq1nAq0CAlcdAlXcArHh1wMfTmyXArK9DQKy6Bds4G1jbUhfAyXNArZcOz9ukAMpRQK4XgK5RxUCuSp3cDZw4QK9GQK72nCWAzIRAr6IcgIDM3ECvhpzInNPAsPLAsMEc4J0SzVFdOADPKcDPJoDPb8CxXwCxkcCxhCJAshpUQLIRALJTwLJLgJknQLd0nh5YXiueSVL0AMYo2cCAmH0GfOVJHsLXpJeuxECz2sCz2wvS1PS8xOfAMatAs9zASnqA04SfksFAtwnAtuKAtJPA1JcA1NfAQEDVYyAiT8AyxbtYEWCHILTgs6DjQLaxwLZ3oQQhEmnPAOGpQAvA2QOhnFZ+QBVAt9lAt64c3cC4i/tFAHzMCcB9JsB8tKHAuvzAulweQLq+QLq5AD5RwG5Au6JAuuclqqXAwLuPwOF4Jh5cOBxoQLzAwBpA44WmZMC9xMDkW4DkocC95gC+dkC+GaaHJqruzebHgOdgwL++gEbADmfHJ+zAwWNA6ZqA6bZANHFAwZqoYiiBQkDDEkCwAA/AwDhQRdTARHzA2sHl2cFAJMtK7evvdsBiZkUfxEEOQH7KQUhDp0JnwCS/SlXxQL3AZ0AtwW5AG8LbUEuFCaNLgFDAYD8AbUmAHUDDgRtACwCFgyhAAAKAj0CagPdA34EkQEgRQUhfAoABQBEABMANhICdwEABdUDa+8KxQIA9wqfJ7+xt+UBkSFBQgHpFH8RNMCJAAQAGwBaAkUChIsABjpTOpSNbQC4Oo860ACNOME63AClAOgAywE6gTo7Ofw5+Tt2iTpbO56JOm85GAFWATMBbAUvNV01njWtNWY1dTW2NcU1gjWRNdI14TWeNa017jX9NbI1wTYCNhE1xjXVNhY2JzXeNe02LjY9Ni41LSE2OjY9Njw2yTcIBJA8VzY4Nt03IDcPNsogN4k3MAoEsDxnNiQ3GTdsOo03IULUQwdC4EMLHA8PCZsobShRVQYA6X8A6bABFCnXAukBowC9BbcAbwNzBL8MDAMMAQgDAAkKCwsLCQoGBAVVBI/DvwDz9b29kaUCb0QtsRTNLt4eGBcSHAMZFhYZEhYEARAEBUEcQRxBHEEcQRxBHEEaQRxBHEFCSTxBPElISUhBNkM2QTYbNklISVmBVIgBFLWZAu0BhQCjBcEAbykBvwGJAaQcEZ0ePCklMAAhMvAIMAL54gC7Bm8EescjzQMpARQpKgDUABavAj626xQAJP0A3etzuf4NNRA7efy2Z9NQrCnC0OSyANz5BBIbJ5IFDR6miIavYS6tprjjmuKebxm5C74Q225X1pkaYYPb6f1DK4k3xMEBb9S2WMjEibTNWhsRJIA+vwNVEiXTE5iXs/wezV66oFLfp9NZGYW+Gk19J2+bCT6Ye2w6LDYdgzKMUabk595eLBCXANz9HUpWbATq9vqXVx9XDg+Pc9Xp4+bsS005SVM/BJBM4687WUuf+Uj9dEi8aDNaPxtpbDxcG1THTImUMZq4UCaaNYpsVqraNyKLJXDYsFZ/5jl7bLRtO88t7P3xZaAxhb5OdPMXqsSkp1WCieG8jXm1U99+blvLlXzPCS+M93VnJCiK+09LfaSaBAVBomyDgJua8dfUzR7ga34IvR2Nvj+A9heJ6lsl1KG4NkI1032Cnff1m1wof2B9oHJK4bi6JkEdSqeNeiuo6QoZZincoc73/TH9SXF8sCE7XyuYyW8WSgbGFCjPV0ihLKhdPs08Tx82fYAkLLc4I2wdl4apY7GU5lHRFzRWJep7Ww3wbeA3qmd59/86P4xuNaqDpygXt6M85glSBHOCGgJDnt+pN9bK7HApMguX6+06RZNjzVmcZJ+wcUrJ9//bpRNxNuKpNl9uFds+S9tdx7LaM5ZkIrPj6nIU9mnbFtVbs9s/uLgl8MVczAwet+iOEzzBlYW7RCMgE6gyNLeq6+1tIx4dpgZnd0DksJS5f+JNDpwwcPNXaaVspq1fbQajOrJgK0ofKtJ1Ne90L6VO4MOl5S886p7u6xo7OLjG8TGL+HU1JXGJgppg4nNbNJ5nlzSpuPYy21JUEcUA94PoFiZfjZue+QnyQ80ekOuZVkxx4g+cvhJfHgNl4hy1/a6+RKcKlar/J29y//EztlbVPHVUeQ1zX86eQVAjR/M3dA9w4W8LfaXp4EgM85wOWasli837PzVMOnsLzR+k3o75/lRPAJSE1xAKQzEi5v10ke+VBvRt1cwQRMd+U5mLCTGVd6XiZtgBG5cDi0w22GKcVNvHiu5LQbZEDVtz0onn7k5+heuKXVsZtSzilkLRAUmjMXEMB3J9YC50XBxPiz53SC+EhnPl9WsKCv92SM/OFFIMJZYfl0WW8tIO3UxYcwdMAj7FSmgrsZ2aAZO03BOhP1bNNZItyXYQFTpC3SG1VuPDqH9GkiCDmE+JwxyIVSO5siDErAOpEXFgjy6PQtOVDj+s6e1r8heWVvmZnTciuf4EiNZzCAd7SOMhXERIOlsHIMG399i9aLTy3m2hRLZjJVDNLS53iGIK11dPqQt0zBDyg6qc7YqkDm2M5Ve6dCWCaCbTXX2rToaIgz6+zh4lYUi/+6nqcFMAkQJKHYLK0wYk5N9szV6xihDbDDFr45lN1K4aCXBq/FitPSud9gLt5ZVn+ZqGX7cwm2z5EGMgfFpIFyhGGuDPmso6TItTMwny+7uPnLCf4W6goFQFV0oQSsc9VfMmVLcLr6ZetDZbaSFTLqnSO/bIPjA3/zAUoqgGFAEQS4IhuMzEp2I3jJzbzkk/IEmyax+rhZTwd6f+CGtwPixu8IvzACquPWPREu9ZvGkUzpRwvRRuaNN6cr0W1wWits9ICdYJ7ltbgMiSL3sTPeufgNcVqMVWFkCPDH4jG2jA0XcVgQj62Cb29v9f/z/+2KbYvIv/zzjpQAPkliaVDzNrW57TZ/ZOyZD0nlfMmAIBIAGAI0D3k/mdN4xr9v85ZbZbbqfH2jGd5hUqNZWwl5SPfoGmfElmazUIeNL1j/mkF7VNAzTq4jNt8JoQ11NQOcmhprXoxSxfRGJ9LDEOAQ+dmxAQH90iti9e2u/MoeuaGcDTHoC+xsmEeWmxEKefQuIzHbpw5Tc5cEocboAD09oipWQhtTO1wivf/O+DRe2rpl/E9wlrzBorjJsOeG1B/XPW4EaJEFdNlECEZga5ZoGRHXgYouGRuVkm8tDESiEyFNo+3s5M5puSdTyUL2llnINVHEt91XUNW4ewdMgJ4boJfEyt/iY5WXqbA+A2Fkt5Z0lutiWhe9nZIyIUjyXDC3UsaG1t+eNx6z4W/OYoTB7A6x+dNSTOi9AInctbESqm5gvOLww7OWXPrmHwVZasrl4eD113pm+JtT7JVOvnCXqdzzdTRHgJ0PiGTFYW5Gvt9R9LD6Lzfs0v/TZZHSmyVNq7viIHE6DBK7Qp07Iz55EM8SYtQvZf/obBniTWi5C2/ovHfw4VndkE5XYdjOhCMRjDeOEfXeN/CwfGduiUIfsoFeUxXeQXba7c7972XNv8w+dTjjUM0QeNAReW+J014dKAD/McQYXT7c0GQPIkn3Ll6R7gGjuiQoZD0TEeEqQpKoZ15g/0OPQI17QiSv9AUROa/V/TQN3dvLArec3RrsYlvBm1b8LWzltdugsC50lNKYLEp2a+ZZYqPejULRlOJh5zj/LVMyTDvwKhMxxwuDkxJ1QpoNI0OTWLom4Z71SNzI9TV1iXJrIu9Wcnd+MCaAw8o1jSXd94YU/1gnkrC9BUEOtQvEIQ7g0i6h+KL2JKk8Ydl7HruvgWMSAmNe+LshGhV4qnWHhO9/RIPQzY1tHRj2VqOyNsDpK0cww+56AdDC4gsWwY0XxoucIWIqs/GcwnWqlaT0KPr8mbK5U94/301i1WLt4YINTVvCFBrFZbIbY8eycOdeJ2teD5IfPLCRg7jjcFTwlMFNl9zdh/o3E/hHPwj7BWg0MU09pPrBLbrCgm54A6H+I6v27+jL5gkjWg/iYdks9jbfVP5y/n0dlgWEMlKasl7JvFZd56LfybW1eeaVO0gxTfXZwD8G4SI116yx7UKVRgui6Ya1YpixqXeNLc8IxtAwCU5IhwQgn+NqHnRaDv61CxKhOq4pOX7M6pkA+Pmpd4j1vn6ACUALoLLc4vpXci8VidLxzm7qFBe7s+quuJs6ETYmnpgS3LwSZxPIltgBDXz8M1k/W2ySNv2f9/NPhxLGK2D21dkHeSGmenRT3Yqcdl0m/h3OYr8V+lXNYGf8aCCpd4bWjE4QIPj7vUKN4Nrfs7ML6Y2OyS830JCnofg/k7lpFpt4SqZc5HGg1HCOrHvOdC8bP6FGDbE/VV0mX4IakzbdS/op+Kt3G24/8QbBV7y86sGSQ/vZzU8FXs7u6jIvwchsEP2BpIhW3G8uWNwa3HmjfH/ZjhhCWvluAcF+nMf14ClKg5hGgtPLJ98ueNAkc5Hs2WZlk2QHvfreCK1CCGO6nMZVSb99VM/ajr8WHTte9JSmkXq/i/U943HEbdzW6Re/S88dKgg8pGOLlAeNiqrcLkUR3/aClFpMXcOUP3rmETcWSfMXZE3TUOi8i+fqRnTYLflVx/Vb/6GJ7eIRZUA6k3RYR3iFSK9c4iDdNwJuZL2FKz/IK5VimcNWEqdXjSoxSgmF0UPlDoUlNrPcM7ftmA8Y9gKiqKEHuWN+AZRIwtVSxye2Kf8rM3lhJ5XcBXU9n4v0Oy1RU2M+4qM8AQPVwse8ErNSob5oFPWxuqZnVzo1qB/IBxkM3EVUKFUUlO3e51259GgNcJbCmlvrdjtoTW7rChm1wyCKzpCTwozUUEOIcWLneRLgMXh+SjGSFkAllzbGS5HK7LlfCMRNRDSvbQPjcXaenNYxCvu2Qyznz6StuxVj66SgI0T8B6/sfHAJYZaZ78thjOSIFumNWLQbeZixDCCC+v0YBtkxiBB3jefHqZ/dFHU+crbj6OvS1x/JDD7vlm7zOVPwpUC01nhxZuY/63E7g");for(let[t,n]of(o=new Map(read_sorted_arrays(e).flatMap((e,t)=>e.map(e=>[e,t+1<<24]))),i=new Set(read_sorted(e)),s=new Map,l=new Map,read_mapped(e))){if(!i.has(t)&&2==n.length){let[e,o]=n,i=l.get(e);i||(i=new Map,l.set(e,i)),i.set(o,t)}s.set(t,n.reverse())}}();let t=[],n=[],c=!1;function add(e){let n=o.get(e);n&&(c=!0,e|=n),t.push(e)}for(let o of e)for(;;){if(o<128)t.push(o);else if(is_hangul(o)){let e=o-44032,t=e/588|0,n=e%588/28|0,i=e%28;add(4352+t),add(4449+n),i>0&&add(4519+i)}else{let e=s.get(o);e?n.push(...e):add(o)}if(!n.length)break;o=n.pop()}if(c&&t.length>1){let e=unpack_cc(t[0]);for(let n=1;n0&&i>=e)0==e?(t.push(o,...n),n.length=0,o=c):n.push(c),i=e;else{let s=function(e,t){if(e>=4352&&e<4371&&t>=4449&&t<4470)return 44032+(e-4352)*588+(t-4449)*28;if(is_hangul(e)&&t>4519&&t<4547&&(e-44032)%28==0)return e+(t-4519);{let n=l.get(e);return n&&(n=n.get(t))?n:-1}}(o,c);s>=0?o=s:0==i&&0==e?(t.push(o),o=c):(n.push(c),i=e)}}return o>=0&&t.push(o,...n),t}(decomposed(e))}let Array_from=e=>Array.from(e);function group_has_cp(e,t){return e.P.has(t)||e.Q.has(t)}let Emoji=class Emoji extends Array{get is_emoji(){return!0}};function init(){let e,t;if(c)return;let n=read_compressed_payload("AEEUdwmgDS8BxQKKAP4BOgDjATAAngDUAIMAoABoAOAAagCOAEQAhABMAHIAOwA9ACsANgAmAGIAHgAuACgAJwAXAC0AGgAjAB8ALwAUACkAEgAeAAkAGwARABkAFgA5ACgALQArADcAFQApABAAHgAiABAAGgAeABMAGAUhBe8BFxREN8sF2wC5AK5HAW8ArQkDzQCuhzc3NzcBP68NEfMABQdHBuw5BV8FYAA9MzkI9r4ZBg7QyQAWA9CeOwLNCjcCjqkChuA/lm+RAsXTAoP6ASfnEQDytQFJAjWVCkeXAOsA6godAB/cwdAUE0WlBCN/AQUCQRjFD/MRBjHxDQSJbw0jBzUAswBxme+tnIcAYwabAysG8QAjAEMMmxcDqgPKQyDXCMMxA7kUQwD3NXOrAKmFIAAfBC0D3x4BJQDBGdUFAhEgVD8JnwmQJiNWYUzrg0oAGwAUAB0AFnNcACkAFgBP9h3gPfsDOWDKneY2ChglX1UDYD30ABsAFAAdABZzIGRAnwDD8wAjAEEMzRbDqgMB2sAFYwXqAtCnAsS4AwpUJKRtFHsadUz9AMMVbwLpABM1NJEX0ZkCgYMBEyMAxRVvAukAEzUBUFAtmUwSAy4DBTER33EftQHfSwB5MxJ/AjkWKQLzL8E/cwBB6QH9LQDPDtO9ASNriQC5DQANAwCK21EFI91zHwCoL9kBqQcHBwcHKzUDowBvAQohPvU3fAQgHwCyAc8CKQMA5zMSezr7ULgFmDp/LzVQBgEGAi8FYQVgt8AFcTtlQhpCWEmfe5tmZ6IAExsDzQ8t+X8rBKtTAltbAn0jsy8Bl6utPWMDTR8Ei2kRANkDBrNHNysDBzECQWUAcwFpJ3kAiyUhAJ0BUb8AL3EfAbfNAz81KUsFWwF3YQZtAm0A+VEfAzEJDQBRSQCzAQBlAHsAM70GD/v3IZWHBwARKQAxALsjTwHZAeMPEzmXgIHwABIAGQA8AEUAQDt3gdvIEGcQZAkGTRFMdEIVEwK0D64L7REdDNkq09PgADSxB/MDWwfzA1sDWwfzB/MDWwfzA1sDWwNbA1scEvAi28gQZw9QBHUFlgWTBN4IiyZREYkHMAjaVBV0JhxPA00BBCMtSSQ7mzMTJUpMFE0LCAQ2SmyvfUADTzGzVP2QqgPTMlc5dAkGHnkSqAAyD3skNb1OhnpPcagKU0+2tYdJak5vAsY6sEAACikJm2/Dd1YGRRAfJ6kQ+ww3AbkBPw3xS9wE9QY/BM0fgRkdD9GVoAipLeEM8SbnLqWAXiP5KocF8Uv4POELUVFsD10LaQnnOmeBUgMlAREijwrhDT0IcRD3Cs1vDekRSQc9A9lJngCpBwULFR05FbkmFGKwCw05ewb/GvoLkyazEy17AAXXGiUGUQEtGwMA0y7rhbRaNVwgT2MGBwspI8sUrFAkDSlAu3hMGh8HGSWtApVDdEqLUToelyH6PEENai4XUYAH+TwJGVMLhTyiRq9FEhHWPpE9TCJNTDAEOYMsMyePCdMPiQy9fHYBXQklCbUMdRM1ERs3yQg9Bx0xlygnGQglRplgngT7owP3E9UDDwVDCUUHFwO5HDETMhUtBRGBKNsC9zbZLrcCk1aEARsFzw8pH+MQVEfkDu0InwJpA4cl7wAxFSUAGyKfCEdnAGOP3FMJLs8Iy2pwI3gDaxTrZRF3B5UOWwerHDcVwxzlcMxeD4YMKKezCV8BeQmdAWME5wgNNV+MpCBFZ1eLXBifIGVBQ14AAjUMaRWjRMGHfAKPD28SHwE5AXcHPQ0FAnsR8RFvEJkI74YINbkz/DopBFMhhyAVCisDU2zSCysm/Qz8bQGnEmYDEDRBd/Jnr2C6KBgBBx0yyUFkIfULlk/RDKAaxRhGVDIZ6AfDA/ca9yfuQVsGAwOnBxc6UTPyBMELbQiPCUMATQ6nGwfbGG4KdYzUATWPAbudA1uVhwJzkwY7Bw8Aaw+LBX3pACECqwinAAkA0wNbAD0CsQehAB0AiUUBQQMrMwEl6QKTA5cINc8BmTMB9y0EH8cMGQD7O25OAsO1AoBuZqYF4VwCkgJNOQFRKQQJUktVA7N15QDfAE8GF+NLARmvTs8e50cB43MvAMsA/wAJOQcJRQHRAfdxALsBYws1Caa3uQFR7S0AhwAZbwHbAo0A4QA5AIP1AVcAUQVd/QXXAlNNARU1HC9bZQG/AyMBNwERAH0Gz5GpzQsjBHEH1wIQHxXlAu8yB7kFAyLjE9FCyQK94lkAMhoKPAqrCqpgX2Q3CjV2PVQAEh+sPss/UgVVO1c7XDtXO1w7VztcO1c7XDtXO1wDm8Pmw+YKcF9JYe8Mqg3YRMw6TRPfYFVgNhPMLbsUxRXSJVoZQRrAJwkl6FUNDwgt12Y0CDA0eRfAAEMpbINFY4oeNApPHOtTlVT8LR8AtUumM7MNsBsZREQFS3XxYi4WEgomAmSFAmJGX1GzAV83JAKh+wJonAJmDQKfiDgfDwJmPwJmKgRyBIMDfxcDfpY5Cjl7GzmGOicnAmwhAjI6OA4CbcsCbbLzjgM3a0kvAWsA4gDlAE4JB5wMkQECD8YAEbkCdzMCdqZDAnlPRwJ4viFg30WyRvcCfEMCeswCfQ0CfPRIBEiBZygALxlJXEpfGRtK0ALRBQLQ0EsrA4hTA4fqRMmRNgLypV0HAwOyS9JMMSkH001QTbMCi0MCitzFHwshR2sJuwKOOwKOYESbhQKO3QKOYHxRuFM5AQ5S2FSJApP/ApMQAO0AIFUiVbNV1AosHymZijLleGpFPz0Cl6MC77ZYJawAXSkClpMCloCgAK1ZsFoNhVEAPwKWuQKWUlxIXNUCmc8CmWhczl0LHQKcnznGOqECnBoCn58CnryOACETNS4TAp31Ap6WALlBYThh8wKe1wKgcgGtAp6jIwKeUqljzGQrKS8CJ7MCJoICoP8CoFDbAqYzAqXSAqgDAIECp/ZogGi1AAdNaiBq1QKs5wKssgKtawKtBgJXIQJV4AKx5dsDH1JsmwKywRECsuwbbORtZ21MYwMl0QK2YD9DbpQDKUkCuGICuUsZArkue3A6cOUCvR0DLbYDMhUCvoxyBgMzdQK+HnMmc1MCw88CwwhzhnRPOUl05AM8qwEDPJ4DPcMCxYACxksCxhSNAshtVQLISALJUwLJMgJkoQLd1nh9ZXiyeSlL1AMYp2cGAmH4GfeVKHsPXpZevxUCz28Cz3AzT1fW9xejAMqxAs93AS3uA04Wfk8JAtwrAtuOAtJTA1JgA1NjAQUDVZCAjUMEzxrxZEl5A4LSg5EC2ssC2eKEFIRNp0ADhqkAMwNkEoZ1Xf0AWQLfaQLevHd7AuIz7RgB8zQrAfSfAfLWiwLr9wLpdH0DAur9AuroAP1LAb0C7o0C66CWrpcHAu5DA4XkmH1w5HGlAvMHAG0DjhqZlwL3FwORcgOSiwL3nAL53QL4apogmq+/O5siA52HAv7+AR8APZ8gAZ+3AwWRA6ZuA6bdANXJAwZuoYyiCQ0DDE0BEwEjB3EGZb1rCQC/BG/DFY8etxEAG3k9ACcDNxJRA42DAWcrJQCM8wAlAOanC6OVCLsGI6fJBgCvBRnDBvElRUYFFoAFcD9GSDNCKUK8X3kZX8QAls0FOgCQVCGbwTsuYDoZutcONxjOGJHJ/gVfBWAFXwVgBWsFYAVfBWAFXwVgBV8FYAVfBWBOHQjfjW8KCgoKbF7xMwTRA7kGN8PDAMMEr8MA70gxFroFTj5xPnhCR0K+X30/X/AAWBkzswCNBsxzzASm70aCRS4rDDMeLz49fnXfcsH5GcoscQFz13Y4HwVnBXLJycnACNdRYwgICAqEXoWTxgA7P4kACxbZBu21Kw0AjMsTAwkVAOVtJUUsJ1JCuULESUArXy9gPi9AKwnJRQYKTD9LPoA+iT54PnkCkULEUUpDX9NWV3JVEjQAc1w3A3IBE3YnX+g7QiMJb6MKaiszRCUuQrNCxDPMCcwEX9EWJzYREBEEBwIHKn6l33JCNVIfybPJtAltydPUCmhBZw/tEKsZAJOVJU1CLRuxbUHOQAo7P0s+eEJHHA8SJVRPdGM0NVrpvBoKhfUlM0JHHGUQUhEWO1xLSj8MO0ucNAqJIzVCRxv9EFsqKyA4OQgNj2nwZgp5ZNFgE2A1K3YHS2AhQQojJmC7DgpzGG1WYFUZCQYHZO9gHWCdYIVgu2BTYJlwFh8GvRbcXbG8YgtDHrMBwzPVyQonHQgkCyYBgQJ0Ajc4nVqIAwGSCsBPIgDsK3SWEtIVBa5N8gGjAo+kVwVIZwD/AEUSCDweX4ITrRQsJ8K3TwBXFDwEAB0TvzVcAtoTS20RIwDgVgZ9BBImYgA5AL4Coi8LFnezOkCnIQFjAY4KBAPh9RcGsgZSBsEAJctdsWIRu2kTkQstRw7DAcMBKgpPBGIGMDAwKCYnKTQaLg4AKRSVAFwCdl+YUZ0JdicFD3lPAdt1F9ZZKCGxuE3yBxkFVGcA/wBFEgiCBwAOLHQSjxOtQDg1z7deFRMAZ8QTAGtKb1ApIiPHADkAvgKiLy1DFtYCmBiDAlDDWNB0eo7fpaMO/aEVRRv0ATEQZBIODyMEAc8JQhCbDRgzFD4TAEMAu9YBCgCsAOkAm5I3ABwAYxvONnR+MhXJAxgKQyxL2+kkJhMbhQKDBMkSsvF0AD9BNQ6uQC7WqSQHwxEAEEIu1hkhAH2z4iQPwyJPHNWpdyYBRSpnJALzoBAEVPPsH20MxA0CCEQKRgAFyAtFAlMNwwjEDUQJRArELtapMg7DDZgJIw+TGukEIwvDFkMAqAtDEMMMBhioe+QAO3MMRAACrgnEBSPY9Q0FDnbSBoMAB8MSYxkSxAEJAPIJAAB8FWMOFtMc/HcXwxhDAC7DAvOowwAewwJdKDKHAAHDAALrFUQVwwAbwyvzpWMWv8wA/ABpAy++bcYDUKPD0KhDCwKmJ1MAAmMA5+UZwxAagwipBRL/eADfw6fDGOMCGsOjk3l6BwOpo4sAEsMOGxMAA5sAbcMOAAvDp0MJGkMDwgipnNIPAwfIqUMGAOGDAAPzABXDAAcDAAnDAGmTABrDAA7DChjDjnEWAwABYwAOcwAuUyYABsMAF8MIKQANUgC6wy4AA8MADqMq8wCyYgAcIwAB8wqpAAXOCx0V4wAHowBCwwEKAGnDAAuDAB3DAAjDCakABdIAbqcZ3QCZCCkABdIAAAFDAAfjAB2jCCkABqIACYMAGzMAbSMA5sOIAAhjAAhDABTDBAkpAAbSAOOTAAlDC6kOzPtnAAdDAG6kQFAATwAKwwwAA0MACbUDPwAHIwAZgwACE6cDAAojAApDAAoDp/MGwwAJIwADEwAQQwgAFEMAEXMAD5MADfMADcMAGRMOFiMAFUMAbqMWuwHDAMIAE0MLAGkzEgDhUwACQwAEWgAXgwUjAAbYABjDBSYBgzBaAEFNALcQBxUMegAwMngBrA0IZgJ0KxQHBREPd1N0ZzKRJwaIHAZqNT4DqQq8BwngAB4DAwt2AX56T1ocKQNXAh1GATQGC3tOxYNagkgAMQA5CQADAQEAWxLjAIOYNAEzAH7tFRk6TglSAF8NAAlYAQ+S1ACAQwQorQBiAN4dAJ1wPyeTANVzuQDX3AIeEMp9eyMgXiUAEdkBkJizKltbVVAaRMqRAAEAhyQ/SDEz6BmfVwB6ATEsOClKIRcDOF0E/832AFNt5AByAnkCRxGCOs94NjXdAwINGBonDBwPALW2AwICAgAAAAAAAAYDBQMDARrUAwAtAAAAAgEGBgYGBgYFBQUFBQUEBQYHCAkEBQUFBQQAAAICAAAAIgCNAJAAlT0A6gC7ANwApEQAwgCyAK0AqADuAKYA2gCjAOcBCAEDAMcAgQBiANIA1AEDAN4A8gCQAKkBMQDqAN8A3AsBCQ8yO9ra2tq8xuLT1tRJOB0BUgFcNU0BWgFpAWgBWwFMUUlLbhMBUxsNEAs6PhMOACcUKy0vMj5AQENDQ0RFFEYGJFdXV1dZWVhZL1pbXVxcI2NnZ2ZoZypsbnZ1eHh4eHh4enp6enp6enp6enp8fH18e2IARPIASQCaAHgAMgBm+ACOAFcAVwA3AnbvAIsABfj4AGQAk/IAnwBPAGIAZP//sACFAIUAaQBWALEAJAC2AIMCQAJDAPwA5wD+AP4A6AD/AOkA6QDoAOYALwJ7AVEBQAE+AVQBPgE+AT4BOQE4ATgBOAEcAVgXADEQCAEAUx8SHgsdHhYAjgCWAKYAUQBqIAIxAHYAbwCXAxUDJzIDIUlGTzEAkQJPAMcCVwKkAMAClgKWApYClgKWApYCiwKWApYClgKWApYClgKVApUCmAKgApcClgKWApQClAKUApQCkgKVAnUB1AKXAp8ClgKWApUeAIETBQD+DQOfAmECOh8BVBg9AuIZEjMbAU4/G1WZAXusRAFpYQEFA0FPAQYAmTEeIJdyADFoAHEANgCRA5zMk/C2jGINwjMWygIZCaXdfDILBCs5dAE7YnQBugDlhoiHhoiGiYqKhouOjIaNkI6Ij4qQipGGkoaThpSSlYaWhpeKmIaZhpqGm4aci52QnoqfhuIC4XTpAt90AIp0LHSoAIsAdHQEQwRABEIERQRDBEkERgRBBEcESQRIBEQERgRJAJ5udACrA490ALxuAQ10ANFZdHQA13QCFHQA/mJ0AP4BIQD+APwA/AD9APwDhGZ03ASMK23HAP4A/AD8AP0A/CR0dACRYnQA/gCRASEA/gCRAvQA/gCRA4RmdNwEjCttxyR0AP9idAEhAP4A/gD8APwA/QD8AP8A/AD8AP0A/AOEZnTcBIwrbcckdHQAkWJ0ASEA/gCRAP4AkQL0AP4AkQOEZnTcBIwrbcckdAJLAT50AlIBQXQCU8l0dAJfdHQDpgL0A6YDpgOnA6cDpwOnA4RmdNwEjCttxyR0dACRYnQBIQOmAJEDpgCRAvQDpgCRA4RmdNwEjCttxyR0BDh0AJEEOQCRDpU5dSgCADR03gV2CwArdAEFAM5iCnR0AF1iAAYcOgp0dACRCnQAXAEIwWZ0CnRmdHQAkWZ0CnRmdEXgAFF03gp0dEY0tlT2u3SOAQTwscwhjZZKrhYcBSfFp9XNbKiVDOD2b+cpe4/Z17mQnbtzzhaeQtE2GGj0IDNTjRUSyTxxw/RPHW/+vS7d1NfRt9z9QPZg4X7QFfhCnkvgNPIItOsC2eV6hPannZNHlZ9xrwZXIMOlu3jSoQSq78WEjwLjw1ELSlF1aBvfzwk5ZX7AUvQzjPQKbDuQ+sm4wNOp4A6AdVuRS0t1y/DZpg4R6m7FNjM9HgvW7Bi88zaMjOo6lM8wtBBdj8LP4ylv3zCXPhebMKJc066o9sF71oFW/8JXu86HJbwDID5lzw5GWLR/LhT0Qqnp2JQxNZNfcbLIzPy+YypqRm/lBmGmex+82+PisxUumSeJkALIT6rJezxMH+CTJmQtt5uwTVbL3ptmjDUQzlSIvWi8Tl7ng1NpuRn1Ng4n14Qc+3Iil7OwkvNWogLSPkn3pihIFytyIGmMhOe3n1tWsuMy9BdKyqF4Z3v2SgggTL9KVvMXPnCbRe+oOuFFP3HejBG/w9gvmfNYvg6JuWia2lcSSN1uIjBktzoIazOHPJZ7kKHPz8mRWVdW3lA8WGF9dQF6Bm673boov3BUWDU2JNcahR23GtfHKLOz/viZ+rYnZFaIznXO67CYEJ1fXuTRpZhYZkKe54xeoagkNGLs+NTZHE0rX45/XvQ2RGADX6vcAvdxIUBV27wxGm2zjZo4X3ILgAlrOFheuZ6wtsvaIj4yLY7qqawlliaIcrz2G+c3vscAnCkCuMzMmZvMfu9lLwTvfX+3cVSyPdN9ZwgDZhfjRgNJcLiJ67b9xx8JHswprbiE3v9UphotAPIgnXVIN5KmMc0piXhc6cChPnN+MRhG9adtdttQTTwSIpl8I4/j//d3sz1326qTBTpPRM/Hgh3kzqEXs8ZAk4ErQhNO8hzrQ0DLkWMA/N+91tn2MdOJnWC2FCZehkQrwzwbKOjhvZsbM95QoeL9skYyMf4srVPVJSgg7pOLUtr/n9eT99oe9nLtFRpjA9okV2Kj8h9k5HaC0oivRD8VyXkJ81tcd4fHNXPCfloIQasxsuO18/46dR2jgul/UIet2G0kRvnyONMKhHs6J26FEoqSqd+rfYjeEGwHWVDpX1fh1jBBcKGMqRepju9Y00mDVHC+Xdij/j44rKfvfjGinNs1jO/0F3jB83XCDINN/HB84axlP+3E/klktRo+vl3U/aiyMJbIodE1XSsDn6UAzIoMtUObY2+k/4gY/l+AkZJ5Sj2vQrkyLm3FoxjhDX+31UXBFf9XrAH31fFqoBmDEZvhvvpnZ87N+oZEu7U9O/nnk+QWj3x8uyoRbEnf+O5UMr9i0nHP38IF5AvzrBW8YWBUR0mIAzIvndQq9N3v/Jto3aPjPXUPl8ASdPPyAp7jENf8bk7VMM9ol9XGmlBmeDMuGqt+WzuL6CXAxXjIhCPM5vACchgMJ/8XBGLO/D1isVvGhwwHHr1DLaI5mn2Jr/b1pUD90uciDaS8cXNDzCWvNmT/PhQe5e8nTnnnkt8Ds/SIjibcum/fqDhKopxAY8AkSrPn+IGDEKOO+U3XOP6djFs2H5N9+orhOahiQk5KnEUWa+CzkVzhp8bMHRbg81qhjjXuIKbHjSLSIBKWqockGtKinY+z4/RdBUF6pcc3JmnlxVcNgrI4SEzKUZSwcD2QCyxzKve+gAmg6ZuSRkpPFa6mfThu7LJNu3H5K42uCpNvPAsoedolKV/LHe/eJ+BbaG5MG0NaSGVPRUmNFMFFSSpXEcXwbVh7UETOZZtoVNRGOIbbkig3McEtR68cG0RZAoJevWYo7Dg/lZ1CQzblWeUvVHmr8fY4Nqd9JJiH/zEX24mJviH60fAyFr0A3c4bC1j3yZU60VgJxXn8JgJXLUIsiBnmKmMYz+7yBQFBvqb2eYnuW59joZBf56/wXvWIR4R8wTmV80i1mZy+S4+BUES+hzjk0uXpC///z/IlqHZ1monzlXp8aCfhGKMti73FI1KbL1q6IKO4fuBuZ59gagjn5xU79muMpHXg6S+e+gDM/U9BKLHbl9l6o8czQKl4RUkJJiqftQG2i3BMg/TQlUYFkJDYBOOvAugYuzYSDnZbDDd/aSd9x0Oe6F+bJcHfl9+gp6L5/TgA+BdFFovbfCrQ40s5vMPw8866pNX8zyFGeFWdxIpPVp9Rg1UPOVFbFZrvaFq/YAzHQgqMWpahMYfqHpmwXfHL1/kpYmGuHFwT55mQu0dylfNuq2Oq0hTMCPwqfxnuBIPLXfci4Y1ANy+1CUipQxld/izVh16WyG2Q0CQQ9NqtAnx1HCHwDj7sYxOSB0wopZSnOzxQOcExmxrVTF2BkOthVpGfuhaGECfCJpJKpjnihY+xOT2QJxN61+9K6QSqtv2Shr82I3jgJrqBg0wELFZPjvHpvzTtaJnLK6Vb97Yn933koO/saN7fsjwNKzp4l2lJVx2orjCGzC/4ZL4zCver6aQYtC5sdoychuFE6ufOiog+VWi5UDkbmvmtah/3aArEBIi39s5ILUnlFLgilcGuz9CQshEY7fw2ouoILAYPVT/gyAIq3TFAIwVsl+ktkRz/qGfnCDGrm5gsl/l9QdvCWGsjPz3dU7XuqKfdUrr/6XIgjp4rey6AJBmCmUJMjITHVdFb5m1p+dLMCL8t55zD42cmftmLEJC0Da04YiRCVUBLLa8D071/N5UBNBXDh0LFsmhV/5B5ExOB4j3WVG/S3lfK5o+V6ELHvy6RR9n4ac+VsK4VE4yphPvV+kG9FegTBH4ZRXL2HytUHCduJazB/KykjfetYxOXTLws267aGOd+I+JhKP//+VnXmS90OD/jvLcVu0asyqcuYN1mSb6XTlCkqv1vigZPIYwNF/zpWcT1GR/6aEIRjkh0yhg4LXJfaGobYJTY4JI58KiAKgmmgAKWdl5nYCeLqavRJGQNuYuZtZFGx+IkI4w4NS2xwbetNMunOjBu/hmKCI/w7tfiiyUd//4rbTeWt4izBY8YvGIN6vyKYmP/8X8wHKCeN+WRcKM70+tXKNGyevU9H2Dg5BsljnTf8YbsJ1TmMs74Ce2XlHisleguhyeg44rQOHZuw/6HTkhnnurK2d62q6yS7210SsAIaR+jXMQA+svkrLpsUY+F30Uw89uOdGAR6vo4FIME0EfVVeHTu6eKicfhSqOeXJhbftcd08sWEnNUL1C9fnprTgd83IMut8onVUF0hvqzZfHduPjbjwEXIcoYmy+P6tcJZHmeOv6VrvEdkHDJecjHuHeWANe79VG662qTjA/HCvumVv3qL+LrOcpqGps2ZGwQdFJ7PU4iuyRlBrwfO+xnPyr47s2cXVbWzAyznDiBGjCM3ksxjjqM62GE9C8f5U38kB3VjtabKp/nRdvMESPGDG90bWRLAt1Qk5DyLuazRR1YzdC1c+hZXvAWV8xA72S4A8B67vjVhbba3MMop293FeEXpe7zItMWrJG/LOH9ByOXmYnNJfjmfuX9KbrpgLOba4nZ+fl8Gbdv/ihv+6wFGKHCYrVwmhFC0J3V2bn2tIB1wCc1CST3d3X2OyxhguXcs4sm679UngzofuSeBewMFJboIQHbUh/m2JhW2hG9DIvG2t7yZIzKBTz9wBtnNC+2pCRYhSIuQ1j8xsz5VvqnyUIthvuoyyu7fNIrg/KQUVmGQaqkqZk/Vx5b33/gsEs8yX7SC1J+NV4icz6bvIE7C5G6McBaI8rVg56q5QBJWxn/87Q1sPK4+sQa8fLU5gXo4paaq4cOcQ4wR0VBHPGjKh+UlPCbA1nLXyEUX45qZ8J7/Ln4FPJE2TdzD0Z8MLSNQiykMMmSyOCiFfy84Rq60emYB2vD09KjYwsoIpeDcBDTElBbXxND72yhd9pC/1CMid/5HUMvAL27OtcIJDzNKpRPNqPOpyt2aPGz9QWIs9hQ9LiX5s8m9hjTUu/f7MyIatjjd+tSfQ3ufZxPpmJhTaBtZtKLUcfOCUqADuO+QoH8B9v6U+P0HV1GLQmtoNFTb3s74ivZgjES0qfK+8RdGgBbcCMSy8eBvh98+et1KIFqSe1KQPyXULBMTsIYnysIwiZBJYdI20vseV+wuJkcqGemehKjaAb9L57xZm3g2zX0bZ2xk/fU+bCo7TlnbW7JuF1YdURo/2Gw7VclDG1W7LOtas2LX4upifZ/23rzpsnY/ALfRgrcWP5hYmV9VxVOQA1fZvp9F2UNU+7d7xRyVm5wiLp3/0dlV7vdw1PMiZrbDAYzIVqEjRY2YU03sJhPnlwIPcZUG5ltL6S8XCxU1eYS5cjr34veBmXAvy7yN4ZjArIG0dfD/5UpBNlX1ZPoxJOwyqRi3wQWtOzd4oNKh0LkoTm8cwqgIfKhqqGOhwo71I+zXnMemTv2B2AUzABWyFztGgGULjDDzWYwJUVBTjKCn5K2QGMK1CQT7SzziOjo+BhAmqBjzuc3xYym2eedGeOIRJVyTwDw37iCMe4g5Vbnsb5ZBdxOAnMT7HU4DHpxWGuQ7GeiY30Cpbvzss55+5Km1YsbD5ea3NI9QNYIXol5apgSu9dZ8f8xS5dtHpido5BclDuLWY4lhik0tbJa07yJhH0BOyEut/GRbYTS6RfiTYWGMCkNpfSHi7HvdiTglEVHKZXaVhezH4kkXiIvKopYAlPusftpE4a5IZwvw1x/eLvoDIh/zpo9FiQInsTb2SAkKHV42XYBjpJDg4374XiVb3ws4qM0s9eSQ5HzsMU4OZJKuopFjBM+dAZEl8RUMx5uU2N486Kr141tVsGQfGjORYMCJAMsxELeNT4RmWjRcpdTGBwcx6XN9drWqPmJzcrGrH4+DRc7+n1w3kPZwu0BkNr6hQrqgo7JTB9A5kdJ/H7P4cWBMwsmuixAzJB3yrQpnGIq90lxAXLzDCdn1LPibsRt7rHNjgQBklRgPZ8vTbjXdgXrTWQsK5MdrXXQVPp0Rinq3frzZKJ0qD6Qhc40VzAraUXlob1gvkhK3vpmHgI6FRlQZNx6eRqkp0zy4AQlX813fAPtL3jMRaitGFFjo0zmErloC+h+YYdVQ6k4F/epxAoF0BmqEoKNTt6j4vQZNQ2BoqF9Vj53TOIoNmDiu9Xp15RkIgQIGcoLpfoIbenzpGUAtqFJp5W+LLnx38jHeECTJ/navKY1NWfN0sY1T8/pB8kIH3DU3DX+u6W3YwpypBMYOhbSxGjq84RZ84fWJow8pyHqn4S/9J15EcCMsXqrfwyd9mhiu3+rEo9pPpoJkdZqHjra4NvzFwuThNKy6hao/SlLw3ZADUcUp3w3SRVfW2rhl80zOgTYnKE0Hs2qp1J6H3xqPqIkvUDRMFDYyRbsFI3M9MEyovPk8rlw7/0a81cDVLmBsR2ze2pBuKb23fbeZC0uXoIvDppfTwIDxk1Oq2dGesGc+oJXWJLGkOha3CX+DUnzgAp9HGH9RsPZN63Hn4RMA5eSVhPHO+9RcRb/IOgtW31V1Q5IPGtoxPjC+MEJbVlIMYADd9aHYWUIQKopuPOHmoqSkubnAKnzgKHqgIOfW5RdAgotN6BN+O2ZYHkuemLnvQ8U9THVrS1RtLmKbcC7PeeDsYznvqzeg6VCNwmr0Yyx1wnLjyT84BZz3EJyCptD3yeueAyDWIs0L2qs/VQ3HUyqfrja0V1LdDzqAikeWuV4sc7RLIB69jEIBjCkyZedoUHqCrOvShVzyd73OdrJW0hPOuQv2qOoHDc9xVb6Yu6uq3Xqp2ZaH46A7lzevbxQEmfrzvAYSJuZ4WDk1Hz3QX1LVdiUK0EvlAGAYlG3Md30r7dcPN63yqBCIj25prpvZP0nI4+EgWoFG95V596CurXpKRBGRjQlHCvy5Ib/iW8nZJWwrET3mgd6mEhfP4KCuaLjopWs7h+MdXFdIv8dHQJgg1xi1eYqB0uDYjxwVmri0Sv5XKut/onqapC+FQiC2C1lvYJ9MVco6yDYsS3AANUfMtvtbYI2hfwZatiSsnoUeMZd34GVjkMMKA+XnjJpXgRW2SHTZplVowPmJsvXy6w3cfO1AK2dvtZEKTkC/TY9LFiKHCG0DnrMQdGm2lzlBHM9iEYynH2UcVMhUEjsc0oDBTgo2ZSQ1gzkAHeWeBXYFjYLuuf8yzTCy7/RFR81WDjXMbq2BOH5dURnxo6oivmxL3cKzKInlZkD31nvpHB9Kk7GfcfE1t+1V64b9LtgeJGlpRFxQCAqWJ5DoY77ski8gsOEOr2uywZaoO/NGa0X0y1pNQHBi3b2SUGNpcZxDT7rLbBf1FSnQ8guxGW3W+36BW0gBje4DOz6Ba6SVk0xiKgt+q2JOFyr4SYfnu+Ic1QZYIuwHBrgzr6UvOcSCzPTOo7D6IC4ISeS7zkl4h+2VoeHpnG/uWR3+ysNgPcOIXQbv0n4mr3BwQcdKJxgPSeyuP/z1Jjg4e9nUvoXegqQVIE30EHx5GHv+FAVUNTowYDJgyFhf5IvlYmEqRif6+WN1MkEJmDcQITx9FX23a4mxy1AQRsOHO/+eImX9l8EMJI3oPWzVXxSOeHU1dUWYr2uAA7AMb+vAEZSbU3qob9ibCyXeypEMpZ6863o6QPqlqGHZkuWABSTVNd4cOh9hv3qEpSx2Zy/DJMP6cItEmiBJ5PFqQnDEIt3NrA3COlOSgz43D7gpNFNJ5MBh4oFzhDPiglC2ypsNU4ISywY2erkyb1NC3Qh/IfWj0eDgZI4/ln8WPfBsT3meTjq1Uqt1E7Zl/qftqkx6aM9KueMCekSnMrcHj1CqTWWzEzPsZGcDe3Ue4Ws+XFYVxNbOFF8ezkvQGR6ZOtOLU2lQEnMBStx47vE6Pb7AYMBRj2OOfZXfisjJnpTfSNjo6sZ6qSvNxZNmDeS7Gk3yYyCk1HtKN2UnhMIjOXUzAqDv90lx9O/q/AT1ZMnit5XQe9wmQxnE/WSH0CqZ9/2Hy+Sfmpeg8RwsHI5Z8kC8H293m/LHVVM/BA7HaTJYg5Enk7M/xWpq0192ACfBai2LA/qrCjCr6Dh1BIMzMXINBmX96MJ5Hn2nxln/RXPFhwHxUmSV0EV2V0jm86/dxxuYSU1W7sVkEbN9EzkG0QFwPhyHKyb3t+Fj5WoUUTErcazE/N6EW6Lvp0d//SDPj7EV9UdJN+Amnf3Wwk3A0SlJ9Z00yvXZ7n3z70G47Hfsow8Wq1JXcfwnA+Yxa5mFsgV464KKP4T31wqIgzFPd3eCe3j5ory5fBF2hgCFyVFrLzI9eetNXvM7oQqyFgDo4CTp/hDV9NMX9JDHQ/nyHTLvZLNLF6ftn2OxjGm8+PqOwhxnPHWipkE/8wbtyri80Sr7pMNkQGMfo4ZYK9OcCC4ESVFFbLMIvlxSoRqWie0wxqnLfcLSXMSpMMQEJYDVObYsXIQNv4TGNwjq1kvT1UOkicTrG3IaBZ3XdScS3u8sgeZPVpOLkbiF940FjbCeNRINNvDbd01EPBrTCPpm12m43ze1bBB59Ia6Ovhnur/Nvx3IxwSWol+3H2qfCJR8df6aQf4v6WiONxkK+IqT4pKQrZK/LplgDI/PJZbOep8dtbV7oCr6CgfpWa8NczOkPx81iSHbsNhVSJBOtrLIMrL31LK9TqHqAbAHe0RLmmV806kRLDLNEhUEJfm9u0sxpkL93Zgd6rw+tqBfTMi59xqXHLXSHwSbSBl0EK0+loECOPtrl+/nsaFe197di4yUgoe4jKoAJDXc6DGDjrQOoFDWZJ9HXwt8xDrQP+7aRwWKWI1GF8s8O4KzxWBBcwnl3vnl1Oez3oh6Ea1vjR7/z7DDTrFtqU2W/KAEzAuXDNZ7MY73MF216dzdSbWmUp4lcm7keJfWaMHgut9x5C9mj66Z0lJ+yhsjVvyiWrfk1lzPOTdhG15Y7gQlXtacvI7qv/XNSscDwqkgwHT/gUsD5yB7LdRRvJxQGYINn9hTpodKFVSTPrtGvyQw+HlRFXIkodErAGu9Iy1YpfSPc3jkFh5CX3lPxv7aqjE/JAfTIpEjGb/H7MO0e2vsViSW1qa/Lmi4/n4DEI3g7lYrcanspDfEpKkdV1OjSLOy0BCUqVoECaB55vs06rXl4jqmLsPsFM/7vYJ0vrBhDCm/00A/H81l1uekJ/6Lml3Hb9+NKiLqATJmDpyzfYZFHumEjC662L0Bwkxi7E9U4cQA0XMVDuMYAIeLMPgQaMVOd8fmt5SflFIfuBoszeAw7ow5gXPE2Y/yBc/7jExARUf/BxIHQBF5Sn3i61w4z5xJdCyO1F1X3+3ax+JSvMeZ7S6QSKp1Fp/sjYz6Z+VgCZzibGeEoujryfMulH7Rai5kAft9ebcW50DyJr2uo2z97mTWIu45YsSnNSMrrNUuG1XsYBtD9TDYzQffKB87vWbkM4EbPAFgoBV4GQS+vtFDUqOFAoi1nTtmIOvg38N4hT2Sn8r8clmBCXspBlMBYTnrqFJGBT3wZOzAyJDre9dHH7+x7qaaKDOB4UQALD5ecS0DE4obubQEiuJZ0EpBVpLuYcce8Aa4PYd/V4DLDAJBYKQPCWTcrEaZ5HYbJi11Gd6hjGom1ii18VHYnG28NKpkz2UKVPxlhYSp8uZr367iOmoy7zsxehW9wzcy2zG0a80PBMCRQMb32hnaHeOR8fnNDzZhaNYhkOdDsBUZ3loDMa1YP0uS0cjUP3b/6DBlqmZOeNABDsLl5BI5QJups8uxAuWJdkUB/pO6Zax6tsg7fN5mjjDgMGngO+DPcKqiHIDbFIGudxtPTIyDi9SFMKBDcfdGQRv41q1AqmxgkVfJMnP8w/Bc7N9/TR6C7mGObFqFkIEom8sKi2xYqJLTCHK7cxzaZvqODo22c3wisBCP4HeAgcRbNPAsBkNRhSmD48dHupdBRw4mIvtS5oeF6zeT1KMCyhMnmhpkFAGWnGscoNkwvQ8ZM5lE/vgTHFYL99OuNxdFBxTEDd5v2qLR8y9WkXsWgG6kZNndFG+pO/UAkOCipqIhL3hq7cRSdrCq7YhUsTocEcnaFa6nVkhnSeRYUA1YO0z5itF9Sly3VlxYDw239TJJH6f3EUfYO5lb7bcFcz8Bp7Oo8QmnsUHOz/fagVUBtKEw1iT88j+aKkv8cscKNkMxjYr8344D1kFoZ7/td1W6LCNYN594301tUGRmFjAzeRg5vyoM1F6+bJZ/Q54jN/k8SFd3DxPTYaAUsivsBfgTn7Mx8H2SpPt4GOdYRnEJOH6jHM2p6SgB0gzIRq6fHxGMmSmqaPCmlfwxiuloaVIitLGN8wie2CDWhkzLoCJcODh7KIOAqbHEvXdUxaS4TTTs07Clzj/6GmVs9kiZDerMxEnhUB6QQPlcfqkG9882RqHoLiHGBoHfQuXIsAG8GTAtao2KVwRnvvam8jo1e312GQAKWEa4sUVEAMG4G6ckcONDwRcg1e2D3+ohXgY4UAWF8wHKQMrSnzCgfFpsxh+aHXMGtPQroQasRY4U6UdG0rz1Vjbka0MekOGRZQEvqQFlxseFor8zWFgHek3v29+WqN6gaK5gZOTOMZzpQIC1201LkMCXild3vWXSc5UX9xcFYfbRPzGFa1FDcPfPB/jUEq/FeGt419CI3YmBlVoHsa4KdcwQP5ZSwHHhFJ7/Ph/Rap/4vmG91eDwPP0lDfCDRCLszTqfzM71xpmiKi2HwS4WlqvGNwtvwF5Dqpn6KTq8ax00UMPkxDcZrEEEsIvHiUXXEphdb4GB4FymlPwBz4Gperqq5pW7TQ6/yNRhW8VT5NhuP0udlxo4gILq5ZxAZk8ZGh3g4CqxJlPKY7AQxupfUcVpWT5VItp1+30UqoyP4wWsRo3olRRgkWZZ2ZN6VC3OZFeXB8NbnUrSdikNptD1QiGuKkr8EmSR/AK9Rw+FF3s5uwuPbvHGiPeFOViltMK7AUaOsq9+x9cndk3iJEE5LKZRlWJbKOZweROzmPNVPkjE3K/TyA57Rs68TkZ3MR8akKpm7cFjnjPd/DdkWjgYoKHSr5Wu5ssoBYU4acRs5g2DHxUmdq8VXOXRbunD8QN0LhgkssgahcdoYsNvuXGUK/KXD/7oFb+VGdhqIn02veuM5bLudJOc2Ky0GMaG4W/xWBxIJcL7yliJOXOpx0AkBqUgzlDczmLT4iILXDxxtRR1oZa2JWFgiAb43obrJnG/TZC2KSK2wqOzRZTXavZZFMb1f3bXvVaNaK828w9TO610gk8JNf3gMfETzXXsbcvRGCG9JWQZ6+cDPqc4466Yo2RcKH+PILeKOqtnlbInR3MmBeGG3FH10yzkybuqEC2HSQwpA0An7d9+73BkDUTm30bZmoP/RGbgFN+GrCOfADgqr0WbI1a1okpFms8iHYw9hm0zUvlEMivBRxModrbJJ+9/p3jUdQQ9BCtQdxnOGrT5dzRUmw0593/mbRSdBg0nRvRZM5/E16m7ZHmDEtWhwvfdZCZ8J8M12W0yRMszXamWfQTwIZ4ayYktrnscQuWr8idp3PjT2eF/jmtdhIfcpMnb+IfZY2FebW6UY/AK3jP4u3Tu4zE4qlnQgLFbM19EBIsNf7KhjdbqQ/D6yiDb+NlEi2SKD+ivXVUK8ib0oBo366gXkR8ZxGjpJIDcEgZPa9TcYe0TIbiPl/rPUQDu3XBJ9X/GNq3FAUsKsll57DzaGMrjcT+gctp+9MLYXCq+sqP81eVQ0r9lt+gcQfZbACRbEjvlMskztZG8gbC8Qn9tt26Q7y7nDrbZq/LEz7kR6Jc6pg3N9rVX8Y5MJrGlML9p9lU4jbTkKqCveeZUJjHB03m2KRKR2TytoFkTXOLg7keU1s1lrPMQJpoOKLuAAC+y1HlJucU6ysB5hsXhvSPPLq5J7JtnqHKZ4vYjC4Vy8153QY+6780xDuGARsGbOs1WqzH0QS765rnSKEbbKlkO8oI/VDwUd0is13tKpqILu1mDJFNy/iJAWcvDgjxvusIT+PGz3ST/J9r9Mtfd0jpaGeiLYIqXc7DiHSS8TcjFVksi66PEkxW1z6ujbLLUGNNYnzOWpH8BZGK4bCK7iR+MbIv8ncDAz1u4StN3vTTzewr9IQjk9wxFxn+6N1ddKs0vffJiS08N3a4G1SVrlZ97Q/M+8G9fe5AP6d9/Qq4WRnORVhofPIKEdCr3llspUfE0oKIIYoByBRPh+bX1HLS3JWGJRhIvE1aW4NTd8ePi4Z+kXb+Z8snYfSNcqijhAgVsx4RCM54cXUiYkjeBmmC4ajOHrChoELscJJC7+9jjMjw5BagZKlgRMiSNYz7h7vvZIoQqbtQmspc0cUk1G/73iXtSpROl5wtLgQi0mW2Ex8i3WULhcggx6E1LMVHUsdc9GHI1PH3U2Ko0PyGdn9KdVOLm7FPBui0i9a0HpA60MsewVE4z8CAt5d401Gv6zXlIT5Ybit1VIA0FCs7wtvYreru1fUyW3oLAZ/+aTnZrOcYRNVA8spoRtlRoWflsRClFcgzkqiHOrf0/SVw+EpVaFlJ0g4Kxq1MMOmiQdpMNpte8lMMQqm6cIFXlnGbfJllysKDi+0JJMotkqgIxOSQgU9dn/lWkeVf8nUm3iwX2Nl3WDw9i6AUK3vBAbZZrcJpDQ/N64AVwjT07Jef30GSSmtNu2WlW7YoyW2FlWfZFQUwk867EdLYKk9VG6JgEnBiBxkY7LMo4YLQJJlAo9l/oTvJkSARDF/XtyAzM8O2t3eT/iXa6wDN3WewNmQHdPfsxChU/KtLG2Mn8i4ZqKdSlIaBZadxJmRzVS/o4yA65RTSViq60oa395Lqw0pzY4SipwE0SXXsKV+GZraGSkr/RW08wPRvqvSUkYBMA9lPx4m24az+IHmCbXA+0faxTRE9wuGeO06DIXa6QlKJ3puIyiuAVfPr736vzo2pBirS+Vxel3TMm3JKhz9o2ZoRvaFVpIkykb0Hcm4oHFBMcNSNj7/4GJt43ogonY2Vg4nsDQIWxAcorpXACzgBqQPjYsE/VUpXpwNManEru4NwMCFPkXvMoqvoeLN3qyu/N1eWEHttMD65v19l/0kH2mR35iv/FI+yjoHJ9gPMz67af3Mq/BoWXqu3rphiWMXVkmnPSEkpGpUI2h1MThideGFEOK6YZHPwYzMBvpNC7+ZHxPb7epfefGyIB4JzO9DTNEYnDLVVHdQyvOEVefrk6Uv5kTQYVYWWdqrdcIl7yljwwIWdfQ/y+2QB3eR/qxYObuYyB4gTbo2in4PzarU1sO9nETkmj9/AoxDA+JM3GMqQtJR4jtduHtnoCLxd1gQUscHRB/MoRYIEsP2pDZ9KvHgtlk1iTbWWbHhohwFEYX7y51fUV2nuUmnoUcqnWIQAAgl9LTVX+Bc0QGNEhChxHR4YjfE51PUdGfsSFE6ck7BL3/hTf9jLq4G1IafINxOLKeAtO7quulYvH5YOBc+zX7CrMgWnW47/jfRsWnJjYYoE7xMfWV2HN2iyIqLI"),read_sorted_array=()=>read_sorted(n),read_sorted_set=()=>new Set(read_sorted_array());c=new Map(read_mapped(n)),u=read_sorted_set(),d=read_sorted_array(),p=new Set(read_sorted_array().map(e=>d[e])),d=new Set(d),f=read_sorted_set(),read_sorted_set();let o=read_sorted_arrays(n),i=n(),read_chunked=()=>new Set(read_sorted_array().flatMap(e=>o[e]).concat(read_sorted_array()));m=read_array_while(e=>{let t=read_array_while(n).map(e=>e+96);if(t.length){let o=e>=i;return t[0]-=32,t=str_from_cps(t),o&&(t=`Restricted[${t}]`),{N:t,P:read_chunked(),Q:read_chunked(),M:!n(),R:o}}}),b=read_sorted_set(),g=new Map;let s=read_sorted_array().concat(Array_from(b)).sort((e,t)=>e-t);for(let{V:e,M:t}of(s.forEach((e,t)=>{let o=n(),i=s[t]=o?s[t-o]:{V:[],M:new Map};i.V.push(e),b.has(e)||g.set(e,i)}),new Set(g.values()))){let n=[];for(let t of e){let e=m.filter(e=>group_has_cp(e,t)),o=n.find(({G:t})=>e.some(e=>t.has(e)));o||(o={G:new Set,V:[]},n.push(o)),o.V.push(t),e.forEach(e=>o.G.add(e))}let o=n.flatMap(e=>Array_from(e.G));for(let{G:e,V:i}of n){let n=new Set(o.filter(t=>!e.has(t)));for(let e of i)t.set(e,n)}}let l=new Set,C=new Set,add_to_union=e=>l.has(e)?C.add(e):l.add(e);for(let e of m){for(let t of e.P)add_to_union(t);for(let t of e.Q)add_to_union(t)}for(let e of l)g.has(e)||C.has(e)||g.set(e,1);for(let o of(y=new Set(Array_from(l).concat(Array_from(decomposed(l).map(unpack_cp)))),v=(e=[],t=read_sorted(n),function expand({S:t,B:n},o,i){if(!(4&t)||i!==o[o.length-1])for(let s of(2&t&&(i=o[o.length-1]),1&t&&e.push(o),n))for(let e of s.Q)expand(s,[...o,e],i)}(function decode(e){return{S:n(),B:read_array_while(()=>{let e=read_sorted(n).map(e=>t[e]);if(e.length)return decode(e)}),Q:e}}([]),[]),e).map(e=>Emoji.from(e)).sort(compare_arrays),w=new Map,v)){let e=[w];for(let t of o){let n=e.map(e=>{let n=e.get(t);return n||(n=new Map,e.set(t,n)),n});65039===t?e.push(...n):e=n}for(let t of e)t.V=o}}function quoted_cp(e){return(should_escape(e)?"":`${bidi_qq(safe_str_from_cps([e]))} `)+quote_cp(e)}function bidi_qq(e){return`"${e}"\u200E`}function safe_str_from_cps(e,t=quote_cp){var n;let o=[];n=e[0],init(),d.has(n)&&o.push("◌");let i=0,s=e.length;for(let n=0;ne.P.has(t));return o&&(n=`${o.N} ${n}`),Error(`illegal mixture: ${e.N} + ${n}`)}function error_placement(e){return Error(`illegal placement: ${e}`)}function filter_fe0f(e){return e.filter(e=>65039!=e)}let EnsAvatarInvalidMetadataError=class EnsAvatarInvalidMetadataError extends X.G{constructor({data:e}){super("Unable to extract image from metadata. The metadata may be malformed or invalid.",{metaMessages:["- Metadata must be a JSON object with at least an `image`, `image_url` or `image_data` property.","",`Provided data: ${JSON.stringify(e)}`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EnsAvatarInvalidMetadataError"})}};let EnsAvatarInvalidNftUriError=class EnsAvatarInvalidNftUriError extends X.G{constructor({reason:e}){super(`ENS NFT avatar URI is invalid. ${e}`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EnsAvatarInvalidNftUriError"})}};let EnsAvatarUriResolutionError=class EnsAvatarUriResolutionError extends X.G{constructor({uri:e}){super(`Unable to resolve ENS avatar URI "${e}". The URI may be malformed, invalid, or does not respond with a valid image.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EnsAvatarUriResolutionError"})}};let EnsAvatarUnsupportedNamespaceError=class EnsAvatarUnsupportedNamespaceError extends X.G{constructor({namespace:e}){super(`ENS NFT avatar namespace "${e}" is not supported. Must be "erc721" or "erc1155".`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EnsAvatarUnsupportedNamespaceError"})}};let ef=/(?https?:\/\/[^\/]*|ipfs:\/|ipns:\/|ar:\/)?(?\/)?(?ipfs\/|ipns\/)?(?[\w\-.]+)(?\/.*)?/,em=/^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[A-Za-z2-7]{58,}|B[A-Z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|F[0-9A-F]{50,})(\/(?[\w\-.]+))?(?\/.*)?$/,eb=/^data:([a-zA-Z\-/+]*);base64,([^"].*)/,eg=/^data:([a-zA-Z\-/+]*)?(;[a-zA-Z0-9].*?)?(,)/;async function isImageUri(e){try{let t=await fetch(e,{method:"HEAD"});if(200===t.status){let e=t.headers.get("content-type");return e?.startsWith("image/")}return!1}catch(t){if("object"==typeof t&&void 0!==t.response||!globalThis.hasOwnProperty("Image"))return!1;return new Promise(t=>{let n=new Image;n.onload=()=>{t(!0)},n.onerror=()=>{t(!1)},n.src=e})}}function getGateway(e,t){return e?e.endsWith("/")?e.slice(0,-1):e:t}function resolveAvatarUri({uri:e,gatewayUrls:t}){let n=eb.test(e);if(n)return{uri:e,isOnChain:!0,isEncoded:n};let o=getGateway(t?.ipfs,"https://ipfs.io"),i=getGateway(t?.arweave,"https://arweave.net"),s=e.match(ef),{protocol:l,subpath:c,target:u,subtarget:d=""}=s?.groups||{},p="ipns:/"===l||"ipns/"===c,f="ipfs:/"===l||"ipfs/"===c||em.test(e);if(e.startsWith("http")&&!p&&!f){let n=e;return t?.arweave&&(n=e.replace(/https:\/\/arweave.net/g,t?.arweave)),{uri:n,isOnChain:!1,isEncoded:!1}}if((p||f)&&u)return{uri:`${o}/${p?"ipns":"ipfs"}/${u}${d}`,isOnChain:!1,isEncoded:!1};if("ar:/"===l&&u)return{uri:`${i}/${u}${d||""}`,isOnChain:!1,isEncoded:!1};let m=e.replace(eg,"");if(m.startsWith("e.json()),o=await parseAvatarUri({gatewayUrls:e,uri:getJsonImage(n)});return o}catch{throw new EnsAvatarUriResolutionError({uri:t})}}async function parseAvatarUri({gatewayUrls:e,uri:t}){let{uri:n,isOnChain:o}=resolveAvatarUri({uri:t,gatewayUrls:e});if(o)return n;let i=await isImageUri(n);if(i)return n;throw new EnsAvatarUriResolutionError({uri:t})}async function getNftTokenUri(e,{nft:t}){if("erc721"===t.namespace)return readContract(e,{address:t.contractAddress,abi:[{name:"tokenURI",type:"function",stateMutability:"view",inputs:[{name:"tokenId",type:"uint256"}],outputs:[{name:"",type:"string"}]}],functionName:"tokenURI",args:[BigInt(t.tokenID)]});if("erc1155"===t.namespace)return readContract(e,{address:t.contractAddress,abi:[{name:"uri",type:"function",stateMutability:"view",inputs:[{name:"_id",type:"uint256"}],outputs:[{name:"",type:"string"}]}],functionName:"uri",args:[BigInt(t.tokenID)]});throw new EnsAvatarUnsupportedNamespaceError({namespace:t.namespace})}async function parseAvatarRecord(e,{gatewayUrls:t,record:n}){return/eip155:/i.test(n)?parseNftAvatarUri(e,{gatewayUrls:t,record:n}):parseAvatarUri({uri:n,gatewayUrls:t})}async function parseNftAvatarUri(e,{gatewayUrls:t,record:n}){let o=function(e){let t=e;t.startsWith("did:nft:")&&(t=t.replace("did:nft:","").replace(/_/g,"/"));let[n,o,i]=t.split("/"),[s,l]=n.split(":"),[c,u]=o.split(":");if(!s||"eip155"!==s.toLowerCase())throw new EnsAvatarInvalidNftUriError({reason:"Only EIP-155 supported"});if(!l)throw new EnsAvatarInvalidNftUriError({reason:"Chain ID not found"});if(!u)throw new EnsAvatarInvalidNftUriError({reason:"Contract address not found"});if(!i)throw new EnsAvatarInvalidNftUriError({reason:"Token ID not found"});if(!c)throw new EnsAvatarInvalidNftUriError({reason:"ERC namespace not found"});return{chainID:parseInt(l),namespace:c.toLowerCase(),contractAddress:u,tokenID:i}}(n),i=await getNftTokenUri(e,{nft:o}),{uri:s,isOnChain:l,isEncoded:c}=resolveAvatarUri({uri:i,gatewayUrls:t});if(l&&(s.includes("data:application/json;base64,")||s.startsWith("{"))){let e=c?atob(s.replace("data:application/json;base64,","")):s,n=JSON.parse(e);return parseAvatarUri({uri:getJsonImage(n),gatewayUrls:t})}let u=o.tokenID;return"erc1155"===o.namespace&&(u=u.replace("0x","").padStart(64,"0")),getMetadataAvatarUri({gatewayUrls:t,uri:s.replace(/(?:0x)?{id}/,u)})}var ey=n(21746);function isNullUniversalResolverError(e,t){if(!(e instanceof X.G))return!1;let n=e.walk(e=>e instanceof q.Lu);return n instanceof q.Lu&&(!!(n.data?.errorName==="ResolverNotFound"||n.data?.errorName==="ResolverWildcardNotSupported"||n.data?.errorName==="ResolverNotContract"||n.data?.errorName==="ResolverError"||n.data?.errorName==="HttpError"||n.reason?.includes("Wildcard on non-extended resolvers is not supported"))||"reverse"===t&&n.reason===ey.$[50])}var ev=n(57040),ew=n(11187),eC=n(49550),eE=n(15102);function encodedLabelToLabelhash(e){if(66!==e.length||0!==e.indexOf("[")||65!==e.indexOf("]"))return null;let t=`0x${e.slice(1,65)}`;return(0,eE.v)(t)?t:null}function namehash(e){let t=new Uint8Array(32).fill(0);if(!e)return(0,Q.ci)(t);let n=e.split(".");for(let e=n.length-1;e>=0;e-=1){let o=encodedLabelToLabelhash(n[e]),i=o?(0,ew.O0)(o):(0,eC.w)((0,ew.qX)(n[e]),"bytes");t=(0,eC.w)((0,ev.zo)([t,i]),"bytes")}return(0,Q.ci)(t)}function packetToBytes(e){let t=e.replace(/^\.|\.$/gm,"");if(0===t.length)return new Uint8Array(1);let n=new Uint8Array((0,ew.qX)(t).byteLength+2),o=0,i=t.split(".");for(let e=0;e255){var s;t=(0,ew.qX)((s=function(e){let t=new Uint8Array(32).fill(0);return e?encodedLabelToLabelhash(e)||(0,eC.w)((0,ew.qX)(e)):(0,Q.ci)(t)}(i[e]),`[${s.slice(2)}]`))}n[o]=t.length,n.set(t,o+1),o+=t.length+1}return n.byteLength!==o+1?n.slice(0,o+1):n}async function getEnsText(e,{blockNumber:t,blockTag:n,name:o,key:i,gatewayUrls:s,strict:l,universalResolverAddress:c}){let u=c;if(!u){if(!e.chain)throw Error("client chain not configured. universalResolverAddress is required.");u=(0,ee.L)({blockNumber:t,chain:e.chain,contract:"ensUniversalResolver"})}try{let l={address:u,abi:Z.k3,functionName:"resolve",args:[(0,Q.NC)(packetToBytes(o)),(0,$.R)({abi:Z.nZ,functionName:"text",args:[namehash(o),i]})],blockNumber:t,blockTag:n},c=getAction_getAction(e,readContract,"readContract"),d=s?await c({...l,args:[...l.args,s]}):await c(l);if("0x"===d[0])return null;let p=(0,Y.k)({abi:Z.nZ,functionName:"text",data:d[0]});return""===p?null:p}catch(e){if(l)throw e;if(isNullUniversalResolverError(e,"resolve"))return null;throw e}}async function getEnsAvatar(e,{blockNumber:t,blockTag:n,assetGatewayUrls:o,name:i,gatewayUrls:s,strict:l,universalResolverAddress:c}){let u=await getAction_getAction(e,getEnsText,"getEnsText")({blockNumber:t,blockTag:n,key:"avatar",name:i,universalResolverAddress:c,gatewayUrls:s,strict:l});if(!u)return null;try{return await parseAvatarRecord(e,{record:u,gatewayUrls:o})}catch{return null}}var ex=n(66403);async function getEnsName(e,{address:t,blockNumber:n,blockTag:o,gatewayUrls:i,strict:s,universalResolverAddress:l}){let c=l;if(!c){if(!e.chain)throw Error("client chain not configured. universalResolverAddress is required.");c=(0,ee.L)({blockNumber:n,chain:e.chain,contract:"ensUniversalResolver"})}let u=`${t.toLowerCase().substring(2)}.addr.reverse`;try{let s={address:c,abi:Z.du,functionName:"reverse",args:[(0,Q.NC)(packetToBytes(u))],blockNumber:n,blockTag:o},l=getAction_getAction(e,readContract,"readContract"),[d,p]=i?await l({...s,args:[...s.args,i]}):await l(s);if(t.toLowerCase()!==p.toLowerCase())return null;return d}catch(e){if(s)throw e;if(isNullUniversalResolverError(e,"reverse"))return null;throw e}}async function getEnsAddress(e,{blockNumber:t,blockTag:n,coinType:o,name:i,gatewayUrls:s,strict:l,universalResolverAddress:c}){let u=c;if(!u){if(!e.chain)throw Error("client chain not configured. universalResolverAddress is required.");u=(0,ee.L)({blockNumber:t,chain:e.chain,contract:"ensUniversalResolver"})}try{let l=(0,$.R)({abi:Z.X$,functionName:"addr",...null!=o?{args:[namehash(i),BigInt(o)]}:{args:[namehash(i)]}}),c={address:u,abi:Z.k3,functionName:"resolve",args:[(0,Q.NC)(packetToBytes(i)),l],blockNumber:t,blockTag:n},d=getAction_getAction(e,readContract,"readContract"),p=s?await d({...c,args:[...c.args,s]}):await d(c);if("0x"===p[0])return null;let f=(0,Y.k)({abi:Z.X$,args:null!=o?[namehash(i),BigInt(o)]:void 0,functionName:"addr",data:p[0]});if("0x"===f||"0x00"===(0,W.f)(f))return null;return f}catch(e){if(l)throw e;if(isNullUniversalResolverError(e,"resolve"))return null;throw e}}async function getEnsResolver(e,{blockNumber:t,blockTag:n,name:o,universalResolverAddress:i}){let s=i;if(!s){if(!e.chain)throw Error("client chain not configured. universalResolverAddress is required.");s=(0,ee.L)({blockNumber:t,chain:e.chain,contract:"ensUniversalResolver"})}let[l]=await getAction_getAction(e,readContract,"readContract")({address:s,abi:[{inputs:[{type:"bytes"}],name:"findResolver",outputs:[{type:"address"},{type:"bytes32"}],stateMutability:"view",type:"function"}],functionName:"findResolver",args:[(0,Q.NC)(packetToBytes(o))],blockNumber:t,blockTag:n});return l}function createFilterRequestScope(e,{method:t}){let n={};return"fallback"===e.transport.type&&e.transport.onResponse?.(({method:e,response:o,status:i,transport:s})=>{"success"===i&&t===e&&(n[o]=s.request)}),t=>n[t]||e.request}async function createBlockFilter(e){let t=createFilterRequestScope(e,{method:"eth_newBlockFilter"}),n=await e.request({method:"eth_newBlockFilter"});return{id:n,request:t(n),type:"block"}}let FilterTypeNotSupportedError=class FilterTypeNotSupportedError extends X.G{constructor(e){super(`Filter type "${e}" is not supported.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"FilterTypeNotSupportedError"})}};var eA=n(96005),ek=n(45444),eB=n(80522),eS=n(40840);let eI="/docs/contract/encodeEventTopics";function encodeEventTopics(e){let{abi:t,eventName:n,args:o}=e,i=t[0];if(n){let e=(0,eS.mE)({abi:t,name:n});if(!e)throw new J.mv(n,{docsPath:eI});i=e}if("event"!==i.type)throw new J.mv(void 0,{docsPath:eI});let s=(0,eB.t)(i),l=(0,eA.n)(s),c=[];if(o&&"inputs"in i){let e=i.inputs?.filter(e=>"indexed"in e&&e.indexed),t=Array.isArray(o)?o:Object.values(o).length>0?e?.map(e=>o[e.name])??[]:[];t.length>0&&(c=e?.map((e,n)=>Array.isArray(t[n])?t[n].map((o,i)=>encodeArg({param:e,value:t[n][i]})):t[n]?encodeArg({param:e,value:t[n]}):null)??[])}return[l,...c]}function encodeArg({param:e,value:t}){if("string"===e.type||"bytes"===e.type)return(0,eC.w)((0,ew.O0)(t));if("tuple"===e.type||e.type.match(/^(.*)\[(\d+)?\]$/))throw new FilterTypeNotSupportedError(e.type);return(0,ek.E)([e],[t])}async function createContractEventFilter(e,t){let{address:n,abi:o,args:i,eventName:s,fromBlock:l,strict:c,toBlock:u}=t,d=createFilterRequestScope(e,{method:"eth_newFilter"}),p=s?encodeEventTopics({abi:o,args:i,eventName:s}):void 0,f=await e.request({method:"eth_newFilter",params:[{address:n,fromBlock:"bigint"==typeof l?(0,Q.eC)(l):l,toBlock:"bigint"==typeof u?(0,Q.eC)(u):u,topics:p}]});return{abi:o,args:i,eventName:s,id:f,request:d(f),strict:!!c,type:"event"}}async function createEventFilter(e,{address:t,args:n,event:o,events:i,fromBlock:s,strict:l,toBlock:c}={}){let u=i??(o?[o]:void 0),d=createFilterRequestScope(e,{method:"eth_newFilter"}),p=[];u&&(p=[u.flatMap(e=>encodeEventTopics({abi:[e],eventName:e.name,args:n}))],o&&(p=p[0]));let f=await e.request({method:"eth_newFilter",params:[{address:t,fromBlock:"bigint"==typeof s?(0,Q.eC)(s):s,toBlock:"bigint"==typeof c?(0,Q.eC)(c):c,...p.length?{topics:p}:{}}]});return{abi:u,args:n,eventName:o?o.name:void 0,fromBlock:s,id:f,request:d(f),strict:!!l,toBlock:c,type:"event"}}async function createPendingTransactionFilter(e){let t=createFilterRequestScope(e,{method:"eth_newPendingTransactionFilter"}),n=await e.request({method:"eth_newPendingTransactionFilter"});return{id:n,request:t(n),type:"transaction"}}var ej=n(14503),eT=n(39625),eP=n(67795),eM=n(33639);let EstimateGasExecutionError=class EstimateGasExecutionError extends X.G{constructor(e,{account:t,docsPath:n,chain:o,data:i,gas:s,gasPrice:l,maxFeePerGas:c,maxPriorityFeePerGas:u,nonce:d,to:p,value:f}){let m=(0,eM.xr)({from:t?.address,to:p,value:void 0!==f&&`${(0,eT.d)(f)} ${o?.nativeCurrency?.symbol||"ETH"}`,data:i,gas:s,gasPrice:void 0!==l&&`${(0,eP.o)(l)} gwei`,maxFeePerGas:void 0!==c&&`${(0,eP.o)(c)} gwei`,maxPriorityFeePerGas:void 0!==u&&`${(0,eP.o)(u)} gwei`,nonce:d});super(e.shortMessage,{cause:e,docsPath:n,metaMessages:[...e.metaMessages?[...e.metaMessages," "]:[],"Estimate Gas Arguments:",m].filter(Boolean)}),Object.defineProperty(this,"cause",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EstimateGasExecutionError"}),this.cause=e}};var eO=n(26445),eR=n(87469),eU=n(61163),eF=n(74688),eN=n(47531);let BaseFeeScalarError=class BaseFeeScalarError extends X.G{constructor(){super("`baseFeeMultiplier` must be greater than 1."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"BaseFeeScalarError"})}};let Eip1559FeesNotSupportedError=class Eip1559FeesNotSupportedError extends X.G{constructor(){super("Chain does not support EIP-1559 fees."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Eip1559FeesNotSupportedError"})}};let MaxFeePerGasTooLowError=class MaxFeePerGasTooLowError extends X.G{constructor({maxPriorityFeePerGas:e}){super(`\`maxFeePerGas\` cannot be less than the \`maxPriorityFeePerGas\` (${(0,eP.o)(e)} gwei).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"MaxFeePerGasTooLowError"})}};let BlockNotFoundError=class BlockNotFoundError extends X.G{constructor({blockHash:e,blockNumber:t}){let n="Block";e&&(n=`Block at hash "${e}"`),t&&(n=`Block at number "${t}"`),super(`${n} could not be found.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"BlockNotFoundError"})}};var eD=n(43310);async function getBlock(e,{blockHash:t,blockNumber:n,blockTag:o,includeTransactions:i}={}){let s=i??!1,l=void 0!==n?(0,Q.eC)(n):void 0,c=null;if(!(c=t?await e.request({method:"eth_getBlockByHash",params:[t,s]}):await e.request({method:"eth_getBlockByNumber",params:[l||(o??"latest"),s]})))throw new BlockNotFoundError({blockHash:t,blockNumber:n});let u=e.chain?.formatters?.block?.format||eD.Z;return u(c)}async function getGasPrice(e){let t=await e.request({method:"eth_gasPrice"});return BigInt(t)}async function estimateMaxPriorityFeePerGas(e,t){return internal_estimateMaxPriorityFeePerGas(e,t)}async function internal_estimateMaxPriorityFeePerGas(e,t){let{block:n,chain:o=e.chain,request:i}=t||{};if("function"==typeof o?.fees?.defaultPriorityFee){let t=n||await getAction_getAction(e,getBlock,"getBlock")({});return o.fees.defaultPriorityFee({block:t,client:e,request:i})}if(void 0!==o?.fees?.defaultPriorityFee)return o?.fees?.defaultPriorityFee;try{let t=await e.request({method:"eth_maxPriorityFeePerGas"});return(0,G.y_)(t)}catch{let[t,o]=await Promise.all([n?Promise.resolve(n):getAction_getAction(e,getBlock,"getBlock")({}),getAction_getAction(e,getGasPrice,"getGasPrice")({})]);if("bigint"!=typeof t.baseFeePerGas)throw new Eip1559FeesNotSupportedError;let i=o-t.baseFeePerGas;if(i<0n)return 0n;return i}}async function estimateFeesPerGas(e,t){return internal_estimateFeesPerGas(e,t)}async function internal_estimateFeesPerGas(e,t){let{block:n,chain:o=e.chain,request:i,type:s="eip1559"}=t||{},l=await (async()=>"function"==typeof o?.fees?.baseFeeMultiplier?o.fees.baseFeeMultiplier({block:n,client:e,request:i}):o?.fees?.baseFeeMultiplier??1.2)();if(l<1)throw new BaseFeeScalarError;let c=l.toString().split(".")[1]?.length??0,u=10**c,multiply=e=>e*BigInt(Math.ceil(l*u))/BigInt(u),d=n||await getAction_getAction(e,getBlock,"getBlock")({});if("function"==typeof o?.fees?.estimateFeesPerGas)return o.fees.estimateFeesPerGas({block:n,client:e,multiply,request:i,type:s});if("eip1559"===s){if("bigint"!=typeof d.baseFeePerGas)throw new Eip1559FeesNotSupportedError;let t="bigint"==typeof i?.maxPriorityFeePerGas?i.maxPriorityFeePerGas:await internal_estimateMaxPriorityFeePerGas(e,{block:d,chain:o,request:i}),n=multiply(d.baseFeePerGas),s=i?.maxFeePerGas??n+t;return{maxFeePerGas:s,maxPriorityFeePerGas:t}}let p=i?.gasPrice??multiply(await getAction_getAction(e,getGasPrice,"getGasPrice")({}));return{gasPrice:p}}async function getTransactionCount(e,{address:t,blockTag:n="latest",blockNumber:o}){let i=await e.request({method:"eth_getTransactionCount",params:[t,o?(0,Q.eC)(o):n]});return(0,G.ly)(i)}var e_=n(82994);async function getChainId_getChainId(e){let t=await e.request({method:"eth_chainId"});return(0,G.ly)(t)}async function prepareTransactionRequest(e,t){let{account:n=e.account,chain:o,chainId:i,gas:s,nonce:l,parameters:c=["chainId","fees","gas","nonce","type"],type:u}=t,d=n?(0,ej.T)(n):void 0,p=await getAction_getAction(e,getBlock,"getBlock")({blockTag:"latest"}),f={...t,...d?{from:d?.address}:{}};if(c.includes("chainId")&&(o?f.chainId=o.id:void 0!==i?f.chainId=i:f.chainId=await getAction_getAction(e,getChainId_getChainId,"getChainId")({})),c.includes("nonce")&&void 0===l&&d&&(f.nonce=await getAction_getAction(e,getTransactionCount,"getTransactionCount")({address:d.address,blockTag:"pending"})),(c.includes("fees")||c.includes("type"))&&void 0===u)try{f.type=(0,e_.l)(f)}catch{f.type="bigint"==typeof p.baseFeePerGas?"eip1559":"legacy"}if(c.includes("fees")){if("eip1559"===f.type||"eip4844"===f.type){let{maxFeePerGas:n,maxPriorityFeePerGas:i}=await internal_estimateFeesPerGas(e,{block:p,chain:o,request:f});if(void 0===t.maxPriorityFeePerGas&&t.maxFeePerGas&&t.maxFeePerGas{let t=(0,eR.k)(e,n);return t instanceof eO.cj?e:t})();return new EstimateGasExecutionError(o,{docsPath:t,...n})}(n,{...t,account:o,chain:e.chain})}}async function estimateContractGas(e,t){let{abi:n,address:o,args:i,functionName:s,...l}=t,c=(0,$.R)({abi:n,args:i,functionName:s});try{let t=await getAction_getAction(e,estimateGas,"estimateGas")({data:c,to:o,...l});return t}catch(t){let e=l.account?(0,ej.T)(l.account):void 0;throw getContractError(t,{abi:n,address:o,args:i,docsPath:"/docs/contract/estimateContractGas",functionName:s,sender:e?.address})}}async function getBlobBaseFee(e){let t=await e.request({method:"eth_blobBaseFee"});return BigInt(t)}let eL=new Map,ez=new Map;async function withCache(e,{cacheKey:t,cacheTime:n=1/0}){let o=function(e){let buildCache=(e,t)=>({clear:()=>t.delete(e),get:()=>t.get(e),set:n=>t.set(e,n)}),t=buildCache(e,eL),n=buildCache(e,ez);return{clear:()=>{t.clear(),n.clear()},promise:t,response:n}}(t),i=o.response.get();if(i&&n>0){let e=new Date().getTime()-i.created.getTime();if(e`blockNumber.${e}`;async function getBlockNumber(e,{cacheTime:t=e.cacheTime}={}){let n=await withCache(()=>e.request({method:"eth_blockNumber"}),{cacheKey:cacheKey(e.uid),cacheTime:t});return BigInt(n)}async function getBlockTransactionCount(e,{blockHash:t,blockNumber:n,blockTag:o="latest"}={}){let i;let s=void 0!==n?(0,Q.eC)(n):void 0;return i=t?await e.request({method:"eth_getBlockTransactionCountByHash",params:[t]}):await e.request({method:"eth_getBlockTransactionCountByNumber",params:[s||o]}),(0,G.ly)(i)}async function getBytecode(e,{address:t,blockNumber:n,blockTag:o="latest"}){let i=void 0!==n?(0,Q.eC)(n):void 0,s=await e.request({method:"eth_getCode",params:[t,i||o]});if("0x"!==s)return s}var eq=n(39135),eG=n(66238),eW=n(78398);let eH="/docs/contract/decodeEventLog";function decodeEventLog(e){let{abi:t,data:n,strict:o,topics:i}=e,s=o??!0,[l,...c]=i;if(!l)throw new J.FM({docsPath:eH});let u=t.find(e=>"event"===e.type&&l===(0,eA.n)((0,eB.t)(e)));if(!(u&&"name"in u)||"event"!==u.type)throw new J.lC(l,{docsPath:eH});let{name:d,inputs:p}=u,f=p?.some(e=>!("name"in e&&e.name)),m=f?[]:{},b=p.filter(e=>"indexed"in e&&e.indexed);for(let e=0;e!("indexed"in e&&e.indexed));if(g.length>0){if(n&&"0x"!==n)try{let e=(0,eW.r)(g,n);if(e){if(f)m=[...m,...e];else for(let t=0;t0?m:void 0}}function parseEventLogs({abi:e,eventName:t,logs:n,strict:o=!0}){return n.map(n=>{try{let i=decodeEventLog({...n,abi:e,strict:o});if(t&&!t.includes(i.eventName))return null;return{...i,...n}}catch(i){let e,t;if(i instanceof J.lC)return null;if(i instanceof J.SM||i instanceof J.Gy){if(o)return null;e=i.abiItem.name,t=i.abiItem.inputs?.some(e=>!("name"in e&&e.name))}return{...n,args:t?[]:{},eventName:e}}}).filter(Boolean)}var eQ=n(53992);async function getLogs(e,{address:t,blockHash:n,fromBlock:o,toBlock:i,event:s,events:l,args:c,strict:u}={}){let d;let p=u??!1,f=l??(s?[s]:void 0),m=[];f&&(m=[f.flatMap(e=>encodeEventTopics({abi:[e],eventName:e.name,args:c}))],s&&(m=m[0])),d=n?await e.request({method:"eth_getLogs",params:[{address:t,topics:m,blockHash:n}]}):await e.request({method:"eth_getLogs",params:[{address:t,topics:m,fromBlock:"bigint"==typeof o?(0,Q.eC)(o):o,toBlock:"bigint"==typeof i?(0,Q.eC)(i):i}]});let b=d.map(e=>(0,eQ.U)(e));return f?parseEventLogs({abi:f,logs:b,strict:p}):b}async function getContractEvents(e,t){let{abi:n,address:o,args:i,blockHash:s,eventName:l,fromBlock:c,toBlock:u,strict:d}=t,p=l?(0,eS.mE)({abi:n,name:l}):void 0,f=p?void 0:n.filter(e=>"event"===e.type);return getAction_getAction(e,getLogs,"getLogs")({address:o,args:i,blockHash:s,event:p,events:f,fromBlock:c,toBlock:u,strict:d})}async function getFeeHistory(e,{blockCount:t,blockNumber:n,blockTag:o="latest",rewardPercentiles:i}){let s=n?(0,Q.eC)(n):void 0,l=await e.request({method:"eth_feeHistory",params:[(0,Q.eC)(t),s||o,i]});return{baseFeePerGas:l.baseFeePerGas.map(e=>BigInt(e)),gasUsedRatio:l.gasUsedRatio,oldestBlock:BigInt(l.oldestBlock),reward:l.reward?.map(e=>e.map(e=>BigInt(e)))}}async function getFilterChanges(e,{filter:t}){let n="strict"in t&&t.strict,o=await t.request({method:"eth_getFilterChanges",params:[t.id]});if("string"==typeof o[0])return o;let i=o.map(e=>(0,eQ.U)(e));return"abi"in t&&t.abi?parseEventLogs({abi:t.abi,logs:i,strict:n}):i}async function getFilterLogs(e,{filter:t}){let n=t.strict??!1,o=await t.request({method:"eth_getFilterLogs",params:[t.id]}),i=o.map(e=>(0,eQ.U)(e));return t.abi?parseEventLogs({abi:t.abi,logs:i,strict:n}):i}async function getProof(e,{address:t,blockNumber:n,blockTag:o,storageKeys:i}){let s=void 0!==n?(0,Q.eC)(n):void 0,l=await e.request({method:"eth_getProof",params:[t,i,s||(o??"latest")]});return{...l,balance:l.balance?BigInt(l.balance):void 0,nonce:l.nonce?(0,G.ly)(l.nonce):void 0,storageProof:l.storageProof?l.storageProof.map(e=>({...e,value:BigInt(e.value)})):void 0}}async function getStorageAt(e,{address:t,blockNumber:n,blockTag:o="latest",slot:i}){let s=void 0!==n?(0,Q.eC)(n):void 0,l=await e.request({method:"eth_getStorageAt",params:[t,i,s||o]});return l}var eK=n(6073);async function getTransaction(e,{blockHash:t,blockNumber:n,blockTag:o,hash:i,index:s}){let l=o||"latest",c=void 0!==n?(0,Q.eC)(n):void 0,u=null;if(i?u=await e.request({method:"eth_getTransactionByHash",params:[i]}):t?u=await e.request({method:"eth_getTransactionByBlockHashAndIndex",params:[t,(0,Q.eC)(s)]}):(c||l)&&(u=await e.request({method:"eth_getTransactionByBlockNumberAndIndex",params:[c||l,(0,Q.eC)(s)]})),!u)throw new eM.Bh({blockHash:t,blockNumber:n,blockTag:l,hash:i,index:s});let d=e.chain?.formatters?.transaction?.format||eK.Tr;return d(u)}async function getTransactionConfirmations(e,{hash:t,transactionReceipt:n}){let[o,i]=await Promise.all([getAction_getAction(e,getBlockNumber,"getBlockNumber")({}),t?getAction_getAction(e,getTransaction,"getBlockNumber")({hash:t}):void 0]),s=n?.blockNumber||i?.blockNumber;return s?o-s+1n:0n}var eV=n(30866);async function getTransactionReceipt(e,{hash:t}){let n=await e.request({method:"eth_getTransactionReceipt",params:[t]});if(!n)throw new eM.Yb({hash:t});let o=e.chain?.formatters?.transactionReceipt?.format||eV.f;return o(n)}async function simulateContract(e,t){let{abi:n,address:o,args:i,dataSuffix:s,functionName:l,...c}=t,u=c.account?(0,ej.T)(c.account):e.account,d=(0,$.R)({abi:n,args:i,functionName:l});try{let{data:p}=await getAction_getAction(e,er.RE,"call")({batch:!1,data:`${d}${s?s.replace("0x",""):""}`,to:o,...c,account:u}),f=(0,Y.k)({abi:n,args:i,functionName:l,data:p||"0x"}),m=n.filter(e=>"name"in e&&e.name===t.functionName);return{result:f,request:{abi:m,address:o,args:i,dataSuffix:s,functionName:l,...c,account:u}}}catch(e){throw getContractError(e,{abi:n,address:o,args:i,docsPath:"/docs/contract/simulateContract",functionName:l,sender:u?.address})}}async function uninstallFilter(e,{filter:t}){return t.request({method:"eth_uninstallFilter",params:[t.id]})}var eZ=n(27499);let eJ="/docs/contract/encodeDeployData";async function verifyHash(e,{address:t,hash:n,signature:o,...i}){let s=(0,eE.v)(o)?o:(0,Q.NC)(o);try{let{data:o}=await getAction_getAction(e,er.RE,"call")({data:function(e){let{abi:t,args:n,bytecode:o}=e;if(!n||0===n.length)return o;let i=t.find(e=>"type"in e&&"constructor"===e.type);if(!i)throw new J.fM({docsPath:eJ});if(!("inputs"in i)||!i.inputs||0===i.inputs.length)throw new J.cO({docsPath:eJ});let s=(0,ek.E)(i.inputs,n);return(0,ev.SM)([o,s])}({abi:Z.$o,args:[t,n,s],bytecode:"0x60806040523480156200001157600080fd5b50604051620007003803806200070083398101604081905262000034916200056f565b6000620000438484846200004f565b9050806000526001601ff35b600080846001600160a01b0316803b806020016040519081016040528181526000908060200190933c90507f6492649264926492649264926492649264926492649264926492649264926492620000a68462000451565b036200021f57600060608085806020019051810190620000c79190620005ce565b8651929550909350915060000362000192576000836001600160a01b031683604051620000f5919062000643565b6000604051808303816000865af19150503d806000811462000134576040519150601f19603f3d011682016040523d82523d6000602084013e62000139565b606091505b5050905080620001905760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b505b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90620001c4908b90869060040162000661565b602060405180830381865afa158015620001e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020891906200069d565b6001600160e01b031916149450505050506200044a565b805115620002b157604051630b135d3f60e11b808252906001600160a01b03871690631626ba7e9062000259908890889060040162000661565b602060405180830381865afa15801562000277573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029d91906200069d565b6001600160e01b031916149150506200044a565b8251604114620003195760405162461bcd60e51b815260206004820152603a6024820152600080516020620006e083398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e677468000000000000606482015260840162000187565b620003236200046b565b506020830151604080850151855186939260009185919081106200034b576200034b620006c9565b016020015160f81c9050601b81148015906200036b57508060ff16601c14155b15620003cf5760405162461bcd60e51b815260206004820152603b6024820152600080516020620006e083398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c75650000000000606482015260840162000187565b6040805160008152602081018083528a905260ff83169181019190915260608101849052608081018390526001600160a01b038a169060019060a0016020604051602081039080840390855afa1580156200042e573d6000803e3d6000fd5b505050602060405103516001600160a01b031614955050505050505b9392505050565b60006020825110156200046357600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b03811681146200049f57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004d5578181015183820152602001620004bb565b50506000910152565b600082601f830112620004f057600080fd5b81516001600160401b03808211156200050d576200050d620004a2565b604051601f8301601f19908116603f01168101908282118183101715620005385762000538620004a2565b816040528381528660208588010111156200055257600080fd5b62000565846020830160208901620004b8565b9695505050505050565b6000806000606084860312156200058557600080fd5b8351620005928162000489565b6020850151604086015191945092506001600160401b03811115620005b657600080fd5b620005c486828701620004de565b9150509250925092565b600080600060608486031215620005e457600080fd5b8351620005f18162000489565b60208501519093506001600160401b03808211156200060f57600080fd5b6200061d87838801620004de565b935060408601519150808211156200063457600080fd5b50620005c486828701620004de565b6000825162000657818460208701620004b8565b9190910192915050565b828152604060208201526000825180604084015262000688816060850160208701620004b8565b601f01601f1916919091016060019392505050565b600060208284031215620006b057600080fd5b81516001600160e01b0319811681146200044a57600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572"}),...i});return function(e,t){let n=(0,eE.v)(e)?(0,ew.O0)(e):e,o=(0,eE.v)(t)?(0,ew.O0)(t):t;return(0,eZ.Wd)(n,o)}(o??"0x0","0x1")}catch(e){if(e instanceof q.cg)return!1;throw e}}async function verifyMessage(e,{address:t,message:n,signature:o,...i}){let s=function(e,t){let n="string"==typeof e?(0,ew.qX)(e):e.raw instanceof Uint8Array?e.raw:(0,ew.O0)(e.raw),o=(0,ew.qX)(`Ethereum Signed Message: -${n.length}`);return(0,eC.w)((0,ev.zo)([o,n]),void 0)}(n);return verifyHash(e,{address:t,hash:s,signature:o,...i})}var eX=n(26087),eY=n(60480);let e$=/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/,e0=/^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/;function hashStruct({data:e,primaryType:t,types:n}){let o=function encodeData({data:e,primaryType:t,types:n}){let o=[{type:"bytes32"}],i=[function({primaryType:e,types:t}){let n=(0,Q.NC)(function({primaryType:e,types:t}){let n="",o=function findTypeDependencies({primaryType:e,types:t},n=new Set){let o=e.match(/^\w*/u),i=o?.[0];if(n.has(i)||void 0===t[i])return n;for(let e of(n.add(i),t[i]))findTypeDependencies({primaryType:e.type,types:t},n);return n}({primaryType:e,types:t});o.delete(e);let i=[e,...Array.from(o).sort()];for(let e of i)n+=`${e}(${t[e].map(({name:e,type:t})=>`${t} ${e}`).join(",")})`;return n}({primaryType:e,types:t}));return(0,eC.w)(n)}({primaryType:t,types:n})];for(let s of n[t]){let[t,l]=function encodeField({types:e,name:t,type:n,value:o}){if(void 0!==e[n])return[{type:"bytes32"},(0,eC.w)(encodeData({data:o,primaryType:n,types:e}))];if("bytes"===n){let e=o.length%2?"0":"";return o=`0x${e+o.slice(2)}`,[{type:"bytes32"},(0,eC.w)(o)]}if("string"===n)return[{type:"bytes32"},(0,eC.w)((0,Q.NC)(o))];if(n.lastIndexOf("]")===n.length-1){let i=n.slice(0,n.lastIndexOf("[")),s=o.map(n=>encodeField({name:t,type:i,types:e,value:n}));return[{type:"bytes32"},(0,eC.w)((0,ek.E)(s.map(([e])=>e),s.map(([,e])=>e)))]}return[{type:n},o]}({types:n,name:s.name,type:s.type,value:e[s.name]});o.push(t),i.push(l)}return(0,ek.E)(o,i)}({data:e,primaryType:t,types:n});return(0,eC.w)(o)}async function verifyTypedData(e,t){let{address:n,signature:o,message:i,primaryType:s,types:l,domain:c,...u}=t,d=function(e){let{domain:t={},message:n,primaryType:o}=e,i={EIP712Domain:function({domain:e}){return["string"==typeof e?.name&&{name:"name",type:"string"},e?.version&&{name:"version",type:"string"},"number"==typeof e?.chainId&&{name:"chainId",type:"uint256"},e?.verifyingContract&&{name:"verifyingContract",type:"address"},e?.salt&&{name:"salt",type:"bytes32"}].filter(Boolean)}({domain:t}),...e.types};!function(e){let{domain:t,message:n,primaryType:o,types:i}=e,validateData=(e,t)=>{for(let n of e){let{name:e,type:o}=n,s=t[e],l=o.match(e0);if(l&&("number"==typeof s||"bigint"==typeof s)){let[e,t,n]=l;(0,Q.eC)(s,{signed:"int"===t,size:parseInt(n)/8})}if("address"===o&&"string"==typeof s&&!(0,eY.U)(s))throw new eX.b({address:s});let c=o.match(e$);if(c){let[e,t]=c;if(t&&(0,eq.d)(s)!==parseInt(t))throw new J.KY({expectedSize:parseInt(t),givenSize:(0,eq.d)(s)})}let u=i[o];u&&validateData(u,s)}};if(i.EIP712Domain&&t&&validateData(i.EIP712Domain,t),"EIP712Domain"!==o){let e=i[o];validateData(e,n)}}({domain:t,message:n,primaryType:o,types:i});let s=["0x1901"];return t&&s.push(function({domain:e,types:t}){return hashStruct({data:e,primaryType:"EIP712Domain",types:t})}({domain:t,types:i})),"EIP712Domain"!==o&&s.push(hashStruct({data:n,primaryType:o,types:i})),(0,eC.w)((0,ev.zo)(s))}({message:i,primaryType:s,types:l,domain:c});return verifyHash(e,{address:n,hash:d,signature:o,...u})}let e1=new Map,e6=new Map,e3=0;function observe(e,t,n){let o=++e3,getListeners=()=>e1.get(e)||[],unsubscribe=()=>{let t=getListeners();e1.set(e,t.filter(e=>e.id!==o))},unwatch=()=>{let t=e6.get(e);1===getListeners().length&&t&&t(),unsubscribe()},i=getListeners();if(e1.set(e,[...i,{id:o,fns:t}]),i&&i.length>0)return unwatch;let s={};for(let e in t)s[e]=(...t)=>{let n=getListeners();if(0!==n.length)for(let o of n)o.fns[e]?.(...t)};let l=n(s);return"function"==typeof l&&e6.set(e,l),unwatch}var e2=n(7760),e7=n(96070),e8=n(62914);function poll(e,{emitOnBegin:t,initialWaitTime:n,interval:o}){let i=!0,unwatch=()=>i=!1,watch=async()=>{let s;t&&(s=await e({unpoll:unwatch}));let l=await n?.(s)??o;await (0,e8.D)(l);let poll=async()=>{i&&(await e({unpoll:unwatch}),await (0,e8.D)(o),poll())};poll()};return watch(),unwatch}function watchBlockNumber(e,{emitOnBegin:t=!1,emitMissed:n=!1,onBlockNumber:o,onError:i,poll:s,pollingInterval:l=e.pollingInterval}){let c;let u=void 0!==s?s:"webSocket"!==e.transport.type;return u?(()=>{let s=(0,e7.P)(["watchBlockNumber",e.uid,t,n,l]);return observe(s,{onBlockNumber:o,onError:i},o=>poll(async()=>{try{let t=await getAction_getAction(e,getBlockNumber,"getBlockNumber")({cacheTime:0});if(c){if(t===c)return;if(t-c>1&&n)for(let e=c+1n;ec)&&(o.onBlockNumber(t,c),c=t)}catch(e){o.onError?.(e)}},{emitOnBegin:t,interval:l}))})():(()=>{let s=(0,e7.P)(["watchBlockNumber",e.uid,t,n]);return observe(s,{onBlockNumber:o,onError:i},t=>{let n=!0,unsubscribe=()=>n=!1;return(async()=>{try{let{unsubscribe:o}=await e.transport.subscribe({params:["newHeads"],onData(e){if(!n)return;let o=(0,G.y_)(e.result?.number);t.onBlockNumber(o,c),c=o},onError(e){t.onError?.(e)}});unsubscribe=o,n||unsubscribe()}catch(e){i?.(e)}})(),()=>unsubscribe()})})()}async function waitForTransactionReceipt(e,{confirmations:t=1,hash:n,onReplaced:o,pollingInterval:i=e.pollingInterval,retryCount:s=6,retryDelay:l=({count:e})=>200*~~(1<{c&&setTimeout(()=>g(new eM.mc({hash:n})),c);let y=observe(f,{onReplaced:o,resolve:b,reject:g},o=>{let c=getAction_getAction(e,watchBlockNumber,"watchBlockNumber")({emitMissed:!0,emitOnBegin:!0,poll:!0,pollingInterval:i,async onBlockNumber(i){if(m)return;let f=i,done=e=>{c(),e(),y()};try{if(p){if(t>1&&(!p.blockNumber||f-p.blockNumber+1no.resolve(p));return}if(u||(m=!0,await (0,e2.J)(async()=>{(u=await getAction_getAction(e,getTransaction,"getTransaction")({hash:n})).blockNumber&&(f=u.blockNumber)},{delay:l,retryCount:s}),m=!1),p=await getAction_getAction(e,getTransactionReceipt,"getTransactionReceipt")({hash:n}),t>1&&(!p.blockNumber||f-p.blockNumber+1no.resolve(p))}catch(n){if(n instanceof eM.Bh||n instanceof eM.Yb){if(!u){m=!1;return}try{d=u,m=!0;let n=await (0,e2.J)(()=>getAction_getAction(e,getBlock,"getBlock")({blockNumber:f,includeTransactions:!0}),{delay:l,retryCount:s,shouldRetry:({error:e})=>e instanceof BlockNotFoundError});m=!1;let i=n.transactions.find(({from:e,nonce:t})=>e===d.from&&t===d.nonce);if(!i||(p=await getAction_getAction(e,getTransactionReceipt,"getTransactionReceipt")({hash:i.hash}),t>1&&(!p.blockNumber||f-p.blockNumber+1n{o.onReplaced?.({reason:c,replacedTransaction:d,transaction:i,transactionReceipt:p}),o.resolve(p)})}catch(e){done(()=>o.reject(e))}}else done(()=>o.reject(n))}}})})})}async function sendRawTransaction(e,{serializedTransaction:t}){return e.request({method:"eth_sendRawTransaction",params:[t]},{retryCount:0})}function publicActions(e){return{call:t=>(0,er.RE)(e,t),createBlockFilter:()=>createBlockFilter(e),createContractEventFilter:t=>createContractEventFilter(e,t),createEventFilter:t=>createEventFilter(e,t),createPendingTransactionFilter:()=>createPendingTransactionFilter(e),estimateContractGas:t=>estimateContractGas(e,t),estimateGas:t=>estimateGas(e,t),getBalance:t=>getBalance(e,t),getBlobBaseFee:()=>getBlobBaseFee(e),getBlock:t=>getBlock(e,t),getBlockNumber:t=>getBlockNumber(e,t),getBlockTransactionCount:t=>getBlockTransactionCount(e,t),getBytecode:t=>getBytecode(e,t),getChainId:()=>getChainId_getChainId(e),getContractEvents:t=>getContractEvents(e,t),getEnsAddress:t=>getEnsAddress(e,t),getEnsAvatar:t=>getEnsAvatar(e,t),getEnsName:t=>getEnsName(e,t),getEnsResolver:t=>getEnsResolver(e,t),getEnsText:t=>getEnsText(e,t),getFeeHistory:t=>getFeeHistory(e,t),estimateFeesPerGas:t=>estimateFeesPerGas(e,t),getFilterChanges:t=>getFilterChanges(e,t),getFilterLogs:t=>getFilterLogs(e,t),getGasPrice:()=>getGasPrice(e),getLogs:t=>getLogs(e,t),getProof:t=>getProof(e,t),estimateMaxPriorityFeePerGas:t=>estimateMaxPriorityFeePerGas(e,t),getStorageAt:t=>getStorageAt(e,t),getTransaction:t=>getTransaction(e,t),getTransactionConfirmations:t=>getTransactionConfirmations(e,t),getTransactionCount:t=>getTransactionCount(e,t),getTransactionReceipt:t=>getTransactionReceipt(e,t),multicall:t=>multicall(e,t),prepareTransactionRequest:t=>prepareTransactionRequest(e,t),readContract:t=>readContract(e,t),sendRawTransaction:t=>sendRawTransaction(e,t),simulateContract:t=>simulateContract(e,t),verifyMessage:t=>verifyMessage(e,t),verifyTypedData:t=>verifyTypedData(e,t),uninstallFilter:t=>uninstallFilter(e,t),waitForTransactionReceipt:t=>waitForTransactionReceipt(e,t),watchBlocks:t=>(function(e,{blockTag:t="latest",emitMissed:n=!1,emitOnBegin:o=!1,onBlock:i,onError:s,includeTransactions:l,poll:c,pollingInterval:u=e.pollingInterval}){let d,p,f;let m=void 0!==c?c:"webSocket"!==e.transport.type,b=l??!1;return m?(()=>{let l=(0,e7.P)(["watchBlocks",e.uid,n,o,b,u]);return observe(l,{onBlock:i,onError:s},i=>poll(async()=>{try{let o=await getAction_getAction(e,getBlock,"getBlock")({blockTag:t,includeTransactions:b});if(o.number&&d?.number){if(o.number===d.number)return;if(o.number-d.number>1&&n)for(let t=d?.number+1n;td.number)&&(i.onBlock(o,d),d=o)}catch(e){i.onError?.(e)}},{emitOnBegin:o,interval:u}))})():(p=!0,f=()=>p=!1,(async()=>{try{let{unsubscribe:t}=await e.transport.subscribe({params:["newHeads"],onData(t){if(!p)return;let n=e.chain?.formatters?.block?.format||eD.Z,o=n(t.result);i(o,d),d=o},onError(e){s?.(e)}});f=t,p||f()}catch(e){s?.(e)}})(),()=>f())})(e,t),watchBlockNumber:t=>watchBlockNumber(e,t),watchContractEvent:t=>(function(e,t){let{abi:n,address:o,args:i,batch:s=!0,eventName:l,onError:c,onLogs:u,poll:d,pollingInterval:p=e.pollingInterval,strict:f}=t,m=void 0!==d?d:"webSocket"!==e.transport.type;return m?(()=>{let t=f??!1,d=(0,e7.P)(["watchContractEvent",o,i,s,e.uid,l,p,t]);return observe(d,{onLogs:u,onError:c},c=>{let u,d;let f=!1,m=poll(async()=>{if(!f){try{d=await getAction_getAction(e,createContractEventFilter,"createContractEventFilter")({abi:n,address:o,args:i,eventName:l,strict:t})}catch{}f=!0;return}try{let p;if(d)p=await getAction_getAction(e,getFilterChanges,"getFilterChanges")({filter:d});else{let s=await getAction_getAction(e,getBlockNumber,"getBlockNumber")({});p=u&&u!==s?await getAction_getAction(e,getContractEvents,"getContractEvents")({abi:n,address:o,args:i,eventName:l,fromBlock:u+1n,toBlock:s,strict:t}):[],u=s}if(0===p.length)return;if(s)c.onLogs(p);else for(let e of p)c.onLogs([e])}catch(e){d&&e instanceof et.yR&&(f=!1),c.onError?.(e)}},{emitOnBegin:!0,interval:p});return async()=>{d&&await getAction_getAction(e,uninstallFilter,"uninstallFilter")({filter:d}),m()}})})():(()=>{let t=(0,e7.P)(["watchContractEvent",o,i,s,e.uid,l,p,f??!1]),d=!0,unsubscribe=()=>d=!1;return observe(t,{onLogs:u,onError:c},t=>((async()=>{try{let s=l?encodeEventTopics({abi:n,eventName:l,args:i}):[],{unsubscribe:c}=await e.transport.subscribe({params:["logs",{address:o,topics:s}],onData(e){if(!d)return;let o=e.result;try{let{eventName:e,args:i}=decodeEventLog({abi:n,data:o.data,topics:o.topics,strict:f}),s=(0,eQ.U)(o,{args:i,eventName:e});t.onLogs([s])}catch(s){let e,n;if(s instanceof J.SM||s instanceof J.Gy){if(f)return;e=s.abiItem.name,n=s.abiItem.inputs?.some(e=>!("name"in e&&e.name))}let i=(0,eQ.U)(o,{args:n?[]:{},eventName:e});t.onLogs([i])}},onError(e){t.onError?.(e)}});unsubscribe=c,d||unsubscribe()}catch(e){c?.(e)}})(),()=>unsubscribe()))})()})(e,t),watchEvent:t=>(function(e,{address:t,args:n,batch:o=!0,event:i,events:s,onError:l,onLogs:c,poll:u,pollingInterval:d=e.pollingInterval,strict:p}){let f,m;let b=void 0!==u?u:"webSocket"!==e.transport.type,g=p??!1;return b?(()=>{let u=(0,e7.P)(["watchEvent",t,n,o,e.uid,i,d]);return observe(u,{onLogs:c,onError:l},l=>{let c,u;let p=!1,f=poll(async()=>{if(!p){try{u=await getAction_getAction(e,createEventFilter,"createEventFilter")({address:t,args:n,event:i,events:s,strict:g})}catch{}p=!0;return}try{let d;if(u)d=await getAction_getAction(e,getFilterChanges,"getFilterChanges")({filter:u});else{let o=await getAction_getAction(e,getBlockNumber,"getBlockNumber")({});d=c&&c!==o?await getAction_getAction(e,getLogs,"getLogs")({address:t,args:n,event:i,events:s,fromBlock:c+1n,toBlock:o}):[],c=o}if(0===d.length)return;if(o)l.onLogs(d);else for(let e of d)l.onLogs([e])}catch(e){u&&e instanceof et.yR&&(p=!1),l.onError?.(e)}},{emitOnBegin:!0,interval:d});return async()=>{u&&await getAction_getAction(e,uninstallFilter,"uninstallFilter")({filter:u}),f()}})})():(f=!0,m=()=>f=!1,(async()=>{try{let o=s??(i?[i]:void 0),u=[];o&&(u=[o.flatMap(e=>encodeEventTopics({abi:[e],eventName:e.name,args:n}))],i&&(u=u[0]));let{unsubscribe:d}=await e.transport.subscribe({params:["logs",{address:t,topics:u}],onData(e){if(!f)return;let t=e.result;try{let{eventName:e,args:n}=decodeEventLog({abi:o??[],data:t.data,topics:t.topics,strict:g}),i=(0,eQ.U)(t,{args:n,eventName:e});c([i])}catch(i){let e,n;if(i instanceof J.SM||i instanceof J.Gy){if(p)return;e=i.abiItem.name,n=i.abiItem.inputs?.some(e=>!("name"in e&&e.name))}let o=(0,eQ.U)(t,{args:n?[]:{},eventName:e});c([o])}},onError(e){l?.(e)}});m=d,f||m()}catch(e){l?.(e)}})(),()=>m())})(e,t),watchPendingTransactions:t=>(function(e,{batch:t=!0,onError:n,onTransactions:o,poll:i,pollingInterval:s=e.pollingInterval}){let l,c;let u=void 0!==i?i:"webSocket"!==e.transport.type;return u?(()=>{let i=(0,e7.P)(["watchPendingTransactions",e.uid,t,s]);return observe(i,{onTransactions:o,onError:n},n=>{let o;let i=poll(async()=>{try{if(!o)try{o=await getAction_getAction(e,createPendingTransactionFilter,"createPendingTransactionFilter")({});return}catch(e){throw i(),e}let s=await getAction_getAction(e,getFilterChanges,"getFilterChanges")({filter:o});if(0===s.length)return;if(t)n.onTransactions(s);else for(let e of s)n.onTransactions([e])}catch(e){n.onError?.(e)}},{emitOnBegin:!0,interval:s});return async()=>{o&&await getAction_getAction(e,uninstallFilter,"uninstallFilter")({filter:o}),i()}})})():(l=!0,c=()=>l=!1,(async()=>{try{let{unsubscribe:t}=await e.transport.subscribe({params:["newPendingTransactions"],onData(e){if(!l)return;let t=e.result;o([t])},onError(e){n?.(e)}});c=t,l||c()}catch(e){n?.(e)}})(),()=>c())})(e,t)}}function getPublicClient(e,t={}){let n=function(e,t={}){let n;try{n=e.getClient(t)}catch{}return n}(e,t);return n?.extend(publicActions)}var e5=n(52798),e4=n(33397);function useAccountEffect_useAccountEffect(e={}){let{onConnect:t,onDisconnect:n}=e,o=(0,z.Z)(e);(0,D.useEffect)(()=>(0,e4.u)(o,{onChange(e,o){if(("reconnecting"===o.status||"connecting"===o.status&&void 0===o.address)&&"connected"===e.status){let{address:n,addresses:i,chain:s,chainId:l,connector:c}=e,u="reconnecting"===o.status||void 0===o.status;t?.({address:n,addresses:i,chain:s,chainId:l,connector:c,isReconnected:u})}else"connected"===o.status&&"disconnected"===e.status&&n?.()}}),[o,t,n])}var e9=n(98029);async function disconnect(e,t={}){let n;if(t.connector)n=t.connector;else{let{connections:t,current:o}=e.state,i=t.get(o);n=i?.connector}let o=e.state.connections;n&&(await n.disconnect(),n.emitter.off("change",e._internal.events.change),n.emitter.off("disconnect",e._internal.events.disconnect),n.emitter.on("connect",e._internal.events.connect),o.delete(n.uid)),e.setState(e=>{if(0===o.size)return{...e,connections:new Map,current:void 0,status:"disconnected"};let t=o.values().next().value;return{...e,connections:new Map(o),current:t.connector.uid}});{let t=e.state.current;if(!t)return;let n=e.state.connections.get(t)?.connector;if(!n)return;await e.storage?.setItem("recentConnectorId",n.id)}}var te=n(74751);let tt=[];function getConnections(e){let t=[...e.state.connections.values()];return"reconnecting"===e.state.status||(0,te.v)(tt,t)?tt:(tt=t,t)}function useDisconnect(e={}){let{mutation:t}=e,n=(0,z.Z)(e),{mutate:o,mutateAsync:i,...s}=(0,e9.D)({...t,mutationFn:e=>disconnect(n,e),mutationKey:["disconnect"]});return{...s,connectors:(function(e={}){let t=(0,z.Z)(e);return(0,D.useSyncExternalStore)(e=>(function(e,t){let{onChange:n}=t;return e.subscribe(()=>getConnections(e),n,{equalityFn:te.v})})(t,{onChange:e}),()=>getConnections(t),()=>getConnections(t))})({config:n}).map(e=>e.connector),disconnect:o,disconnectAsync:i}}var tr=n(73935),tn=n(70655),ta="right-scroll-bar-position",to="width-before-scroll-bar";function assignRef(e,t){return"function"==typeof e?e(t):e&&(e.current=t),e}var ti="undefined"!=typeof window?D.useLayoutEffect:D.useEffect,ts=new WeakMap,tl=(void 0===x&&(x={}),(void 0===A&&(A=function(e){return e}),k=[],B=!1,S={read:function(){if(B)throw Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return k.length?k[k.length-1]:null},useMedium:function(e){var t=A(e,B);return k.push(t),function(){k=k.filter(function(e){return e!==t})}},assignSyncMedium:function(e){for(B=!0;k.length;){var t=k;k=[],t.forEach(e)}k={push:function(t){return e(t)},filter:function(){return k}}},assignMedium:function(e){B=!0;var t=[];if(k.length){var n=k;k=[],n.forEach(e),t=k}var executeQueue=function(){var n=t;t=[],n.forEach(e)},cycle=function(){return Promise.resolve().then(executeQueue)};cycle(),k={push:function(e){t.push(e),cycle()},filter:function(e){return t=t.filter(e),k}}}}).options=(0,tn.__assign)({async:!0,ssr:!1},x),S),nothing=function(){},tc=D.forwardRef(function(e,t){var n,o,i,s,l=D.useRef(null),c=D.useState({onScrollCapture:nothing,onWheelCapture:nothing,onTouchMoveCapture:nothing}),u=c[0],d=c[1],p=e.forwardProps,f=e.children,m=e.className,b=e.removeScrollBar,g=e.enabled,y=e.shards,v=e.sideCar,w=e.noIsolation,C=e.inert,E=e.allowPinchZoom,x=e.as,A=void 0===x?"div":x,k=e.gapMode,B=(0,tn.__rest)(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noIsolation","inert","allowPinchZoom","as","gapMode"]),S=(n=[l,t],o=function(e){return n.forEach(function(t){return assignRef(t,e)})},(i=(0,D.useState)(function(){return{value:null,callback:o,facade:{get current(){return i.value},set current(value){var e=i.value;e!==value&&(i.value=value,i.callback(value,e))}}}})[0]).callback=o,s=i.facade,ti(function(){var e=ts.get(s);if(e){var t=new Set(e),o=new Set(n),i=s.current;t.forEach(function(e){o.has(e)||assignRef(e,null)}),o.forEach(function(e){t.has(e)||assignRef(e,i)})}ts.set(s,n)},[n]),s),I=(0,tn.__assign)((0,tn.__assign)({},B),u);return D.createElement(D.Fragment,null,g&&D.createElement(v,{sideCar:tl,removeScrollBar:b,shards:y,noIsolation:w,inert:C,setCallbacks:d,allowPinchZoom:!!E,lockRef:l,gapMode:k}),p?D.cloneElement(D.Children.only(f),(0,tn.__assign)((0,tn.__assign)({},I),{ref:S})):D.createElement(A,(0,tn.__assign)({},I,{className:m,ref:S}),f))});tc.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1},tc.classNames={fullWidth:to,zeroRight:ta};var SideCar=function(e){var t=e.sideCar,n=(0,tn.__rest)(e,["sideCar"]);if(!t)throw Error("Sidecar: please provide `sideCar` property to import the right car");var o=t.read();if(!o)throw Error("Sidecar medium not found");return D.createElement(o,(0,tn.__assign)({},n))};SideCar.isSideCarExport=!0;var stylesheetSingleton=function(){var e=0,t=null;return{add:function(o){if(0==e&&(t=function(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=I||n.nc;return t&&e.setAttribute("nonce",t),e}())){var i,s;(i=t).styleSheet?i.styleSheet.cssText=o:i.appendChild(document.createTextNode(o)),s=t,(document.head||document.getElementsByTagName("head")[0]).appendChild(s)}e++},remove:function(){--e||!t||(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},styleHookSingleton=function(){var e=stylesheetSingleton();return function(t,n){D.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&n])}},styleSingleton=function(){var e=styleHookSingleton();return function(t){return e(t.styles,t.dynamic),null}},tu={left:0,top:0,right:0,gap:0},parse=function(e){return parseInt(e||"",10)||0},getOffset=function(e){var t=window.getComputedStyle(document.body),n=t["padding"===e?"paddingLeft":"marginLeft"],o=t["padding"===e?"paddingTop":"marginTop"],i=t["padding"===e?"paddingRight":"marginRight"];return[parse(n),parse(o),parse(i)]},getGapWidth=function(e){if(void 0===e&&(e="margin"),"undefined"==typeof window)return tu;var t=getOffset(e),n=document.documentElement.clientWidth,o=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,o-n+t[2]-t[0])}},td=styleSingleton(),tp="data-scroll-locked",getStyles=function(e,t,n,o){var i=e.left,s=e.top,l=e.right,c=e.gap;return void 0===n&&(n="margin"),"\n .".concat("with-scroll-bars-hidden"," {\n overflow: hidden ").concat(o,";\n padding-right: ").concat(c,"px ").concat(o,";\n }\n body[").concat(tp,"] {\n overflow: hidden ").concat(o,";\n overscroll-behavior: contain;\n ").concat([t&&"position: relative ".concat(o,";"),"margin"===n&&"\n padding-left: ".concat(i,"px;\n padding-top: ").concat(s,"px;\n padding-right: ").concat(l,"px;\n margin-left:0;\n margin-top:0;\n margin-right: ").concat(c,"px ").concat(o,";\n "),"padding"===n&&"padding-right: ".concat(c,"px ").concat(o,";")].filter(Boolean).join(""),"\n }\n \n .").concat(ta," {\n right: ").concat(c,"px ").concat(o,";\n }\n \n .").concat(to," {\n margin-right: ").concat(c,"px ").concat(o,";\n }\n \n .").concat(ta," .").concat(ta," {\n right: 0 ").concat(o,";\n }\n \n .").concat(to," .").concat(to," {\n margin-right: 0 ").concat(o,";\n }\n \n body[").concat(tp,"] {\n ").concat("--removed-body-scroll-bar-size",": ").concat(c,"px;\n }\n")},getCurrentUseCounter=function(){var e=parseInt(document.body.getAttribute(tp)||"0",10);return isFinite(e)?e:0},useLockAttribute=function(){D.useEffect(function(){return document.body.setAttribute(tp,(getCurrentUseCounter()+1).toString()),function(){var e=getCurrentUseCounter()-1;e<=0?document.body.removeAttribute(tp):document.body.setAttribute(tp,e.toString())}},[])},RemoveScrollBar=function(e){var t=e.noRelative,n=e.noImportant,o=e.gapMode,i=void 0===o?"margin":o;useLockAttribute();var s=D.useMemo(function(){return getGapWidth(i)},[i]);return D.createElement(td,{styles:getStyles(s,!t,i,n?"":"!important")})},th=!1;if("undefined"!=typeof window)try{var tf=Object.defineProperty({},"passive",{get:function(){return th=!0,!0}});window.addEventListener("test",tf,tf),window.removeEventListener("test",tf,tf)}catch(e){th=!1}var tm=!!th&&{passive:!1},elementCanBeScrolled=function(e,t){var n=window.getComputedStyle(e);return"hidden"!==n[t]&&!(n.overflowY===n.overflowX&&"TEXTAREA"!==e.tagName&&"visible"===n[t])},locationCouldBeScrolled=function(e,t){var n=t.ownerDocument,o=t;do{if("undefined"!=typeof ShadowRoot&&o instanceof ShadowRoot&&(o=o.host),elementCouldBeScrolled(e,o)){var i=getScrollVariables(e,o);if(i[1]>i[2])return!0}o=o.parentNode}while(o&&o!==n.body);return!1},elementCouldBeScrolled=function(e,t){return"v"===e?elementCanBeScrolled(t,"overflowY"):elementCanBeScrolled(t,"overflowX")},getScrollVariables=function(e,t){return"v"===e?[t.scrollTop,t.scrollHeight,t.clientHeight]:[t.scrollLeft,t.scrollWidth,t.clientWidth]},handleScroll=function(e,t,n,o,i){var s,l=(s=window.getComputedStyle(t).direction,"h"===e&&"rtl"===s?-1:1),c=l*o,u=n.target,d=t.contains(u),p=!1,f=c>0,m=0,b=0;do{var g=getScrollVariables(e,u),y=g[0],v=g[1]-g[2]-l*y;(y||v)&&elementCouldBeScrolled(e,u)&&(m+=v,b+=y),u=u instanceof ShadowRoot?u.host:u.parentNode}while(!d&&u!==document.body||d&&(t.contains(u)||t===u));return f&&(i&&1>Math.abs(m)||!i&&c>m)?p=!0:!f&&(i&&1>Math.abs(b)||!i&&-c>b)&&(p=!0),p},getTouchXY=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},getDeltaXY=function(e){return[e.deltaX,e.deltaY]},extractRef=function(e){return e&&"current"in e?e.current:e},tb=0,tg=[],ty=(tl.useMedium(function(e){var t=D.useRef([]),n=D.useRef([0,0]),o=D.useRef(),i=D.useState(tb++)[0],s=D.useState(styleSingleton)[0],l=D.useRef(e);D.useEffect(function(){l.current=e},[e]),D.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(i));var t=(0,tn.__spreadArray)([e.lockRef.current],(e.shards||[]).map(extractRef),!0).filter(Boolean);return t.forEach(function(e){return e.classList.add("allow-interactivity-".concat(i))}),function(){document.body.classList.remove("block-interactivity-".concat(i)),t.forEach(function(e){return e.classList.remove("allow-interactivity-".concat(i))})}}},[e.inert,e.lockRef.current,e.shards]);var c=D.useCallback(function(e,t){if("touches"in e&&2===e.touches.length)return!l.current.allowPinchZoom;var i,s=getTouchXY(e),c=n.current,u="deltaX"in e?e.deltaX:c[0]-s[0],d="deltaY"in e?e.deltaY:c[1]-s[1],p=e.target,f=Math.abs(u)>Math.abs(d)?"h":"v";if("touches"in e&&"h"===f&&"range"===p.type)return!1;var m=locationCouldBeScrolled(f,p);if(!m)return!0;if(m?i=f:(i="v"===f?"h":"v",m=locationCouldBeScrolled(f,p)),!m)return!1;if(!o.current&&"changedTouches"in e&&(u||d)&&(o.current=i),!i)return!0;var b=o.current||i;return handleScroll(b,t,e,"h"===b?u:d,!0)},[]),u=D.useCallback(function(e){if(tg.length&&tg[tg.length-1]===s){var n="deltaY"in e?getDeltaXY(e):getTouchXY(e),o=t.current.filter(function(t){var o;return t.name===e.type&&(t.target===e.target||e.target===t.shadowParent)&&(o=t.delta)[0]===n[0]&&o[1]===n[1]})[0];if(o&&o.should){e.cancelable&&e.preventDefault();return}if(!o){var i=(l.current.shards||[]).map(extractRef).filter(Boolean).filter(function(t){return t.contains(e.target)});(i.length>0?c(e,i[0]):!l.current.noIsolation)&&e.cancelable&&e.preventDefault()}}},[]),d=D.useCallback(function(e,n,o,i){var s={name:e,delta:n,target:o,should:i,shadowParent:function(e){for(var t=null;null!==e;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}(o)};t.current.push(s),setTimeout(function(){t.current=t.current.filter(function(e){return e!==s})},1)},[]),p=D.useCallback(function(e){n.current=getTouchXY(e),o.current=void 0},[]),f=D.useCallback(function(t){d(t.type,getDeltaXY(t),t.target,c(t,e.lockRef.current))},[]),m=D.useCallback(function(t){d(t.type,getTouchXY(t),t.target,c(t,e.lockRef.current))},[]);D.useEffect(function(){return tg.push(s),e.setCallbacks({onScrollCapture:f,onWheelCapture:f,onTouchMoveCapture:m}),document.addEventListener("wheel",u,tm),document.addEventListener("touchmove",u,tm),document.addEventListener("touchstart",p,tm),function(){tg=tg.filter(function(e){return e!==s}),document.removeEventListener("wheel",u,tm),document.removeEventListener("touchmove",u,tm),document.removeEventListener("touchstart",p,tm)}},[]);var b=e.removeScrollBar,g=e.inert;return D.createElement(D.Fragment,null,g?D.createElement(s,{styles:"\n .block-interactivity-".concat(i," {pointer-events: none;}\n .allow-interactivity-").concat(i," {pointer-events: all;}\n")}):null,b?D.createElement(RemoveScrollBar,{gapMode:e.gapMode}):null)}),SideCar),tv=D.forwardRef(function(e,t){return D.createElement(tc,(0,tn.__assign)({},e,{ref:t,sideCar:ty}))});function vanilla_extract_private_esm_getVarName(e){var t=e.match(/^var\((.*)\)$/);return t?t[1]:e}function assignInlineVars(e,t){var n={};if("object"==typeof t)!function vanilla_extract_private_esm_walkObject(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=e.constructor();for(var i in e){var s=e[i],l=[...n,i];"string"==typeof s||"number"==typeof s||null==s?o[i]=t(s,l):"object"!=typeof s||Array.isArray(s)?console.warn('Skipping invalid key "'.concat(l.join("."),'". Should be a string, number, null or object. Received: "').concat(Array.isArray(s)?"Array":typeof s,'"')):o[i]=vanilla_extract_private_esm_walkObject(s,t,l)}return o}(t,(t,o)=>{null!=t&&(n[vanilla_extract_private_esm_getVarName(function(e,t){var n=e;for(var o of t){if(!(o in n))throw Error("Path ".concat(t.join(" -> ")," does not exist in object"));n=n[o]}return n}(e,o))]=String(t))});else for(var o in e){var i=e[o];null!=i&&(n[vanilla_extract_private_esm_getVarName(o)]=i)}return Object.defineProperty(n,"toString",{value:function(){return Object.keys(this).map(e=>"".concat(e,":").concat(this[e])).join(";")},writable:!1}),n}tv.classNames=tc.classNames;var tw=n(87675);async function connect(e,t){let n;if((n="function"==typeof t.connector?e._internal.connectors.setup(t.connector):t.connector).uid===e.state.current)throw new tw.wi;try{e.setState(e=>({...e,status:"connecting"})),n.emitter.emit("message",{type:"connecting"});let o=await n.connect({chainId:t.chainId}),i=o.accounts;return n.emitter.off("connect",e._internal.events.connect),n.emitter.on("change",e._internal.events.change),n.emitter.on("disconnect",e._internal.events.disconnect),await e.storage?.setItem("recentConnectorId",n.id),e.setState(e=>({...e,connections:new Map(e.connections).set(n.uid,{accounts:i,chainId:o.chainId,connector:n}),current:n.uid,status:"connected"})),{accounts:i,chainId:o.chainId}}catch(t){throw e.setState(e=>({...e,status:e.current?"connected":"disconnected"})),t}}let tC=[];function getConnectors(e){let t=e.connectors;return(0,te.v)(tC,t)?tC:(tC=t,t)}var tE=n(42238),tx=n(55585),tA=n(7066);let ProviderNotFoundError=class ProviderNotFoundError extends tA.G{constructor(){super("Provider not found."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ProviderNotFoundError"})}};let SwitchChainNotSupportedError=class SwitchChainNotSupportedError extends tA.G{constructor({connector:e}){super(`"${e.name}" does not support programmatic chain switching.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"SwitchChainNotSupportedError"})}};async function switchChain(e,t){let{chainId:n}=t,o=e.state.connections.get(t.connector?.uid??e.state.current);if(o){let e=o.connector;if(!e.switchChain)throw new SwitchChainNotSupportedError({connector:e});let t=await e.switchChain({chainId:n});return t}let i=e.chains.find(e=>e.id===n);if(!i)throw new tw.X4;return e.setState(e=>({...e,chainId:n})),i}let tk=[];function getChains(e){let t=e.chains;return(0,te.v)(tk,t)?tk:(tk=t,t)}var tB=n(92592),tS=n(78863);let UrlRequiredError=class UrlRequiredError extends X.G{constructor(){super("No URL was provided to the Transport. Please provide a valid RPC URL to the Transport.",{docsPath:"/docs/clients/intro"})}};var tI=n(32357);function withTimeout(e,{errorInstance:t=Error("timed out"),timeout:n,signal:o}){return new Promise((i,s)=>{(async()=>{let l;try{let c=new AbortController;n>0&&(l=setTimeout(()=>{o?c.abort():s(t)},n)),i(await e({signal:c?.signal||null}))}catch(e){"AbortError"===e.name&&s(t),s(e)}finally{clearTimeout(l)}})()})}let tj={current:0,take(){return this.current++},reset(){this.current=0}};var tT=n(91628),tP=n(16189);let subscribeWithSelector=e=>(t,n,o)=>{let i=o.subscribe;o.subscribe=(e,t,n)=>{let s=e;if(t){let i=(null==n?void 0:n.equalityFn)||Object.is,l=e(o.getState());s=n=>{let o=e(n);if(!i(l,o)){let e=l;t(l=o,e)}},(null==n?void 0:n.fireImmediately)&&t(l,l)}return i(s)};let s=e(t,n,o);return s},toThenable=e=>t=>{try{let n=e(t);if(n instanceof Promise)return n;return{then:e=>toThenable(e)(n),catch(e){return this}}}catch(e){return{then(e){return this},catch:t=>toThenable(t)(e)}}},oldImpl=(e,t)=>(n,o,i)=>{let s,l,c={getStorage:()=>localStorage,serialize:JSON.stringify,deserialize:JSON.parse,partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},u=!1,d=new Set,p=new Set;try{s=c.getStorage()}catch(e){}if(!s)return e((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${c.name}', the given storage is currently unavailable.`),n(...e)},o,i);let f=toThenable(c.serialize),setItem=()=>{let e;let t=c.partialize({...o()}),n=f({state:t,version:c.version}).then(e=>s.setItem(c.name,e)).catch(t=>{e=t});if(e)throw e;return n},m=i.setState;i.setState=(e,t)=>{m(e,t),setItem()};let b=e((...e)=>{n(...e),setItem()},o,i),hydrate=()=>{var e;if(!s)return;u=!1,d.forEach(e=>e(o()));let t=(null==(e=c.onRehydrateStorage)?void 0:e.call(c,o()))||void 0;return toThenable(s.getItem.bind(s))(c.name).then(e=>{if(e)return c.deserialize(e)}).then(e=>{if(e){if("number"!=typeof e.version||e.version===c.version)return e.state;if(c.migrate)return c.migrate(e.state,e.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}}).then(e=>{var t;return n(l=c.merge(e,null!=(t=o())?t:b),!0),setItem()}).then(()=>{null==t||t(l,void 0),u=!0,p.forEach(e=>e(l))}).catch(e=>{null==t||t(void 0,e)})};return i.persist={setOptions:e=>{c={...c,...e},e.getStorage&&(s=e.getStorage())},clearStorage:()=>{null==s||s.removeItem(c.name)},getOptions:()=>c,rehydrate:()=>hydrate(),hasHydrated:()=>u,onHydrate:e=>(d.add(e),()=>{d.delete(e)}),onFinishHydration:e=>(p.add(e),()=>{p.delete(e)})},hydrate(),l||b},newImpl=(e,t)=>(n,o,i)=>{let s,l={storage:function(e,t){let n;try{n=e()}catch(e){return}return{getItem:e=>{var o;let parse=e=>null===e?null:JSON.parse(e,null==t?void 0:t.reviver),i=null!=(o=n.getItem(e))?o:null;return i instanceof Promise?i.then(parse):parse(i)},setItem:(e,o)=>n.setItem(e,JSON.stringify(o,null==t?void 0:t.replacer)),removeItem:e=>n.removeItem(e)}}(()=>localStorage),partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},c=!1,u=new Set,d=new Set,p=l.storage;if(!p)return e((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${l.name}', the given storage is currently unavailable.`),n(...e)},o,i);let setItem=()=>{let e=l.partialize({...o()});return p.setItem(l.name,{state:e,version:l.version})},f=i.setState;i.setState=(e,t)=>{f(e,t),setItem()};let m=e((...e)=>{n(...e),setItem()},o,i),hydrate=()=>{var e,t;if(!p)return;c=!1,u.forEach(e=>{var t;return e(null!=(t=o())?t:m)});let i=(null==(t=l.onRehydrateStorage)?void 0:t.call(l,null!=(e=o())?e:m))||void 0;return toThenable(p.getItem.bind(p))(l.name).then(e=>{if(e){if("number"!=typeof e.version||e.version===l.version)return e.state;if(l.migrate)return l.migrate(e.state,e.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}}).then(e=>{var t;return n(s=l.merge(e,null!=(t=o())?t:m),!0),setItem()}).then(()=>{null==i||i(s,void 0),s=o(),c=!0,d.forEach(e=>e(s))}).catch(e=>{null==i||i(void 0,e)})};return i.persist={setOptions:e=>{l={...l,...e},e.storage&&(p=e.storage)},clearStorage:()=>{null==p||p.removeItem(l.name)},getOptions:()=>l,rehydrate:()=>hydrate(),hasHydrated:()=>c,onHydrate:e=>(u.add(e),()=>{u.delete(e)}),onFinishHydration:e=>(d.add(e),()=>{d.delete(e)})},l.skipHydration||hydrate(),s||m},persist=(e,t)=>"getStorage"in t||"serialize"in t||"deserialize"in t?(console.warn("[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead."),oldImpl(e,t)):newImpl(e,t),createStoreImpl=e=>{let t;let n=new Set,setState=(e,o)=>{let i="function"==typeof e?e(t):e;if(!Object.is(i,t)){let e=t;t=(null!=o?o:"object"!=typeof i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},getState=()=>t,o={setState,getState,subscribe:e=>(n.add(e),()=>n.delete(e)),destroy:()=>{console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),n.clear()}};return t=e(setState,getState,o),o},vanilla_createStore=e=>e?createStoreImpl(e):createStoreImpl;var tM=n(45775);function normalizeChainId(e){if("string"==typeof e)return Number.parseInt(e,"0x"===e.trim().substring(0,2)?16:10);if("bigint"==typeof e)return Number(e);if("number"==typeof e)return e;throw Error(`Cannot normalize chainId "${e}" of type "${typeof e}"`)}let tO={coinbaseWallet:{id:"coinbaseWallet",name:"Coinbase Wallet",provider:e=>e?.coinbaseWalletExtension?e.coinbaseWalletExtension:findProvider(e,"isCoinbaseWallet")},metaMask:{id:"metaMask",name:"MetaMask",provider:e=>findProvider(e,e=>{if(!e.isMetaMask||e.isBraveWallet&&!e._events&&!e._state)return!1;for(let t of["isApexWallet","isAvalanche","isBitKeep","isBlockWallet","isKuCoinWallet","isMathWallet","isOkxWallet","isOKExWallet","isOneInchIOSWallet","isOneInchAndroidWallet","isOpera","isPortal","isRabby","isTokenPocket","isTokenary","isZerion"])if(e[t])return!1;return!0})},phantom:{id:"phantom",name:"Phantom",provider:e=>e?.phantom?.ethereum?e.phantom?.ethereum:findProvider(e,"isPhantom")}};function injected(e={}){let{shimDisconnect:t=!0,unstable_shimAsyncInject:n}=e;function getTarget(){let t=e.target;if("function"==typeof t){let e=t();if(e)return e}return"object"==typeof t?t:"string"==typeof t?{...tO[t]??{id:t,name:`${t[0].toUpperCase()}${t.slice(1)}`,provider:`is${t[0].toUpperCase()}${t.slice(1)}`}}:{id:"injected",name:"Injected",provider:e=>e?.ethereum}}return o=>({get icon(){return getTarget().icon},get id(){return getTarget().id},get name(){return getTarget().name},type:injected.type,async setup(){let t=await this.getProvider();t&&e.target&&t.on("connect",this.onConnect.bind(this))},async connect({chainId:n,isReconnecting:i}={}){let s=await this.getProvider();if(!s)throw new ProviderNotFoundError;let l=null;if(!i){l=await this.getAccounts().catch(()=>null);let e=!!l?.length;if(e)try{let e=await s.request({method:"wallet_requestPermissions",params:[{eth_accounts:{}}]});l=e[0]?.caveats?.[0]?.value?.map(e=>tM.K(e))}catch(e){if(e.code===et.ab.code)throw new et.ab(e);if(e.code===et.pT.code)throw e}}try{if(!l?.length){let e=await s.request({method:"eth_requestAccounts"});l=e.map(e=>(0,tM.K)(e))}s.removeListener("connect",this.onConnect.bind(this)),s.on("accountsChanged",this.onAccountsChanged.bind(this)),s.on("chainChanged",this.onChainChanged),s.on("disconnect",this.onDisconnect.bind(this));let i=await this.getChainId();if(n&&i!==n){let e=await this.switchChain({chainId:n}).catch(e=>{if(e.code===et.ab.code)throw e;return{id:i}});i=e?.id??i}return t&&(await o.storage?.removeItem(`${this.id}.disconnected`),e.target||await o.storage?.setItem("injected.connected",!0)),{accounts:l,chainId:i}}catch(e){if(e.code===et.ab.code)throw new et.ab(e);if(e.code===et.pT.code)throw new et.pT(e);throw e}},async disconnect(){let n=await this.getProvider();if(!n)throw new ProviderNotFoundError;n.removeListener("accountsChanged",this.onAccountsChanged.bind(this)),n.removeListener("chainChanged",this.onChainChanged),n.removeListener("disconnect",this.onDisconnect.bind(this)),n.on("connect",this.onConnect.bind(this)),t&&(await o.storage?.setItem(`${this.id}.disconnected`,!0),e.target||await o.storage?.removeItem("injected.connected"))},async getAccounts(){let e=await this.getProvider();if(!e)throw new ProviderNotFoundError;let t=await e.request({method:"eth_accounts"});return t.map(e=>(0,tM.K)(e))},async getChainId(){let e=await this.getProvider();if(!e)throw new ProviderNotFoundError;let t=await e.request({method:"eth_chainId"});return normalizeChainId(t)},async getProvider(){let e;if("undefined"==typeof window)return;let t=getTarget();return(e="function"==typeof t.provider?t.provider(window):"string"==typeof t.provider?findProvider(window,t.provider):t.provider)&&!e.removeListener&&("off"in e&&"function"==typeof e.off?e.removeListener=e.off:e.removeListener=()=>{}),e},async isAuthorized(){try{let i=t&&await o.storage?.getItem(`${this.id}.disconnected`);if(i)return!1;if(!e.target){let e=await o.storage?.getItem("injected.connected");if(!e)return!1}let s=await this.getProvider();if(!s){if(void 0!==n&&!1!==n){let handleEthereum=async()=>{"undefined"!=typeof window&&window.removeEventListener("ethereum#initialized",handleEthereum);let e=await this.getProvider();return!!e},e="number"==typeof n?n:1e3,t=await Promise.race([..."undefined"!=typeof window?[new Promise(e=>window.addEventListener("ethereum#initialized",()=>e(handleEthereum()),{once:!0}))]:[],new Promise(t=>setTimeout(()=>t(handleEthereum()),e))]);if(t)return!0}throw new ProviderNotFoundError}let l=await (0,e2.J)(()=>withTimeout(()=>this.getAccounts(),{timeout:100}));return!!l.length}catch{return!1}},async switchChain({chainId:e}){let t=await this.getProvider();if(!t)throw new ProviderNotFoundError;let n=o.chains.find(t=>t.id===e);if(!n)throw new et.x3(new tw.X4);try{return await Promise.all([t.request({method:"wallet_switchEthereumChain",params:[{chainId:(0,Q.eC)(e)}]}),new Promise(t=>o.emitter.once("change",({chainId:n})=>{n===e&&t()}))]),n}catch(o){if(4902===o.code||o?.data?.originalError?.code===4902)try{let o;let{default:i,...s}=n.blockExplorers??{};i&&(o=[i.url,...Object.values(s).map(e=>e.url)]),await t.request({method:"wallet_addEthereumChain",params:[{chainId:(0,Q.eC)(e),chainName:n.name,nativeCurrency:n.nativeCurrency,rpcUrls:[n.rpcUrls.default?.http[0]??""],blockExplorerUrls:o}]});let l=await this.getChainId();if(l!==e)throw new et.ab(Error("User rejected switch after adding network."));return n}catch(e){throw new et.ab(e)}if(o.code===et.ab.code)throw new et.ab(o);throw new et.x3(o)}},async onAccountsChanged(e){if(0===e.length)this.onDisconnect();else if(o.emitter.listenerCount("connect")){let e=(await this.getChainId()).toString();this.onConnect({chainId:e}),t&&await o.storage?.removeItem(`${this.id}.disconnected`)}else o.emitter.emit("change",{accounts:e.map(e=>(0,tM.K)(e))})},onChainChanged(e){let t=normalizeChainId(e);o.emitter.emit("change",{chainId:t})},async onConnect(e){let t=await this.getAccounts();if(0===t.length)return;let n=normalizeChainId(e.chainId);o.emitter.emit("connect",{accounts:t,chainId:n});let i=await this.getProvider();i&&(i.removeListener("connect",this.onConnect.bind(this)),i.on("accountsChanged",this.onAccountsChanged.bind(this)),i.on("chainChanged",this.onChainChanged),i.on("disconnect",this.onDisconnect.bind(this)))},async onDisconnect(e){let t=await this.getProvider();e&&1013===e.code&&t&&(await this.getAccounts()).length||(o.emitter.emit("disconnect"),t&&(t.removeListener("accountsChanged",this.onAccountsChanged.bind(this)),t.removeListener("chainChanged",this.onChainChanged),t.removeListener("disconnect",this.onDisconnect.bind(this)),t.on("connect",this.onConnect.bind(this))))}})}function findProvider(e,t){function isProvider(e){return"function"==typeof t?t(e):"string"!=typeof t||e[t]}let n=e.ethereum;return n?.providers?n.providers.find(e=>isProvider(e)):n&&isProvider(n)?n:void 0}injected.type="injected";var tR=n(26729),__classPrivateFieldGet=function(e,t,n,o){if("a"===n&&!o)throw TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!o:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?o:"a"===n?o.call(e):o?o.value:t.get(e)};let Emitter=class Emitter{constructor(e){Object.defineProperty(this,"uid",{enumerable:!0,configurable:!0,writable:!0,value:e}),j.set(this,new tR)}on(e,t){__classPrivateFieldGet(this,j,"f").on(e,t)}once(e,t){__classPrivateFieldGet(this,j,"f").once(e,t)}off(e,t){__classPrivateFieldGet(this,j,"f").off(e,t)}emit(e,...t){let n=t[0];__classPrivateFieldGet(this,j,"f").emit(e,{uid:this.uid,...n})}listenerCount(e){return __classPrivateFieldGet(this,j,"f").listenerCount(e)}};function deserialize_deserialize(e,t){return JSON.parse(e,(e,n)=>{let o=n;return o?.__type==="bigint"&&(o=BigInt(o.value)),o?.__type==="Map"&&(o=new Map(o.value)),t?.(e,o)??o})}function getReferenceKey(e,t){return e.slice(0,t).join(".")||"."}function getCutoff(e,t){let{length:n}=e;for(let o=0;o{let o=n;return"bigint"==typeof o&&(o={__type:"bigint",value:n.toString()}),o instanceof Map&&(o={__type:"Map",value:Array.from(n.entries())}),t?.(e,o)??o},o),n??void 0)}j=new WeakMap;let tU={getItem:()=>null,setItem:()=>{},removeItem:()=>{}},tF=256;var tN=n(79983);function walletConnect(e){let t,o;let i=e.isNewChainsStale??!0,s="eip155";return l=>({id:"walletConnect",name:"WalletConnect",type:walletConnect.type,async setup(){let e=await this.getProvider().catch(()=>null);e&&(e.on("connect",this.onConnect.bind(this)),e.on("session_delete",this.onSessionDelete.bind(this)))},async connect({chainId:e,...t}={}){try{let n=await this.getProvider();if(!n)throw new ProviderNotFoundError;n.on("display_uri",this.onDisplayUri);let o=e;if(!o){let e=await l.storage?.getItem("state")??{},t=l.chains.some(t=>t.id===e.chainId);o=t?e.chainId:l.chains[0]?.id}if(!o)throw Error("No chains found on connector.");let i=await this.isChainsStale();if(n.session&&i&&await n.disconnect(),!n.session||i){let e=l.chains.filter(e=>e.id!==o).map(e=>e.id);await n.connect({optionalChains:[o,...e],..."pairingTopic"in t?{pairingTopic:t.pairingTopic}:{}}),this.setRequestedChainsIds(l.chains.map(e=>e.id))}let s=(await n.enable()).map(e=>(0,tM.K)(e)),c=await this.getChainId();return n.removeListener("display_uri",this.onDisplayUri),n.removeListener("connect",this.onConnect.bind(this)),n.on("accountsChanged",this.onAccountsChanged.bind(this)),n.on("chainChanged",this.onChainChanged),n.on("disconnect",this.onDisconnect.bind(this)),n.on("session_delete",this.onSessionDelete.bind(this)),{accounts:s,chainId:c}}catch(e){if(/(user rejected|connection request reset)/i.test(e?.message))throw new et.ab(e);throw e}},async disconnect(){let e=await this.getProvider();try{await e?.disconnect()}catch(e){if(!/No matching key/i.test(e.message))throw e}finally{e?.removeListener("accountsChanged",this.onAccountsChanged.bind(this)),e?.removeListener("chainChanged",this.onChainChanged),e?.removeListener("disconnect",this.onDisconnect.bind(this)),e?.removeListener("session_delete",this.onSessionDelete.bind(this)),e?.on("connect",this.onConnect.bind(this)),this.setRequestedChainsIds([])}},async getAccounts(){let e=await this.getProvider();return e.accounts.map(e=>(0,tM.K)(e))},async getProvider({chainId:i}={}){async function initProvider(){let t=l.chains.map(e=>e.id);if(!t.length)return;let{EthereumProvider:o}=await Promise.all([n.e(1194),n.e(3138),n.e(5883)]).then(n.bind(n,33138));return await o.init({...e,disableProviderPing:!0,optionalChains:t,projectId:e.projectId,rpcMap:Object.fromEntries(l.chains.map(e=>[e.id,e.rpcUrls.default.http[0]])),showQrModal:e.showQrModal??!0})}return t||(o||(o=initProvider()),t=await o,t?.events.setMaxListeners(1/0)),i&&await this.switchChain?.({chainId:i}),t},async getChainId(){let e=await this.getProvider();return e.chainId},async isAuthorized(){try{let[e,t]=await Promise.all([this.getAccounts(),this.getProvider()]);if(!e.length)return!1;let n=await this.isChainsStale();if(n&&t.session)return await t.disconnect().catch(()=>{}),!1;return!0}catch{return!1}},async switchChain({chainId:e}){let t=l.chains.find(t=>t.id===e);if(!t)throw new et.x3(new tw.X4);try{let n=await this.getProvider(),o=this.getNamespaceChainsIds(),i=this.getNamespaceMethods(),s=o.includes(e);if(!s&&i.includes("wallet_addEthereumChain")){await n.request({method:"wallet_addEthereumChain",params:[{chainId:(0,Q.eC)(t.id),blockExplorerUrls:[t.blockExplorers?.default.url],chainName:t.name,nativeCurrency:t.nativeCurrency,rpcUrls:[...t.rpcUrls.default.http]}]});let o=await this.getRequestedChainsIds();this.setRequestedChainsIds([...o,e])}return await n.request({method:"wallet_switchEthereumChain",params:[{chainId:(0,Q.eC)(e)}]}),t}catch(t){let e="string"==typeof t?t:t?.message;if(/user rejected request/i.test(e))throw new et.ab(t);throw new et.x3(t)}},onAccountsChanged(e){0===e.length?this.onDisconnect():l.emitter.emit("change",{accounts:e.map(e=>(0,tM.K)(e))})},onChainChanged(e){let t=normalizeChainId(e);l.emitter.emit("change",{chainId:t})},async onConnect(e){let t=normalizeChainId(e.chainId),n=await this.getAccounts();l.emitter.emit("connect",{accounts:n,chainId:t})},async onDisconnect(e){this.setRequestedChainsIds([]),l.emitter.emit("disconnect");let t=await this.getProvider();t.removeListener("accountsChanged",this.onAccountsChanged.bind(this)),t.removeListener("chainChanged",this.onChainChanged),t.removeListener("disconnect",this.onDisconnect.bind(this)),t.removeListener("session_delete",this.onSessionDelete.bind(this)),t.on("connect",this.onConnect.bind(this))},onDisplayUri(e){l.emitter.emit("message",{type:"display_uri",data:e})},onSessionDelete(){this.onDisconnect()},getNamespaceChainsIds(){if(!t)return[];let e=t.session?.namespaces[s]?.chains?.map(e=>parseInt(e.split(":")[1]||""));return e??[]},getNamespaceMethods(){if(!t)return[];let e=t.session?.namespaces[s]?.methods;return e??[]},async getRequestedChainsIds(){return await l.storage?.getItem(this.requestedChainsStorageKey)??[]},async isChainsStale(){let e=this.getNamespaceMethods();if(e.includes("wallet_addEthereumChain")||!i)return!1;let t=l.chains.map(e=>e.id),n=this.getNamespaceChainsIds();if(n.length&&!n.some(e=>t.includes(e)))return!1;let o=await this.getRequestedChainsIds();return!t.every(e=>o.includes(e))},async setRequestedChainsIds(e){await l.storage?.setItem(this.requestedChainsStorageKey,e)},get requestedChainsStorageKey(){return`${this.id}.requestedChains`}})}function coinbaseWallet(e){let t,o;return i=>({id:"coinbaseWalletSDK",name:"Coinbase Wallet",type:coinbaseWallet.type,async connect({chainId:e}={}){try{let t=await this.getProvider(),n=(await t.request({method:"eth_requestAccounts"})).map(e=>(0,tM.K)(e));t.on("accountsChanged",this.onAccountsChanged),t.on("chainChanged",this.onChainChanged),t.on("disconnect",this.onDisconnect.bind(this));let o=await this.getChainId();if(e&&o!==e){let t=await this.switchChain({chainId:e}).catch(e=>{if(e.code===et.ab.code)throw e;return{id:o}});o=t?.id??o}return{accounts:n,chainId:o}}catch(e){if(/(user closed modal|accounts received is empty|user denied account)/i.test(e.message))throw new et.ab(e);throw e}},async disconnect(){let e=await this.getProvider();e.removeListener("accountsChanged",this.onAccountsChanged),e.removeListener("chainChanged",this.onChainChanged),e.removeListener("disconnect",this.onDisconnect.bind(this)),e.disconnect(),e.close()},async getAccounts(){let e=await this.getProvider();return(await e.request({method:"eth_accounts"})).map(e=>(0,tM.K)(e))},async getChainId(){let e=await this.getProvider(),t=await e.request({method:"eth_chainId"});return normalizeChainId(t)},async getProvider(){if(!o){let{default:s}=await Promise.all([n.e(1194),n.e(5811),n.e(6878)]).then(n.t.bind(n,45811,19));t=new("function"!=typeof s&&"function"==typeof s.default?s.default:s)({reloadOnDisconnect:!1,...e});let l=t.walletExtension?.getChainId(),c=i.chains.find(t=>e.chainId?t.id===e.chainId:t.id===l)||i.chains[0],u=e.chainId||c?.id,d=e.jsonRpcUrl||c?.rpcUrls.default.http[0];o=t.makeWeb3Provider(d,u)}return o},async isAuthorized(){try{let e=await this.getAccounts();return!!e.length}catch{return!1}},async switchChain({chainId:e}){let t=i.chains.find(t=>t.id===e);if(!t)throw new et.x3(new tw.X4);let n=await this.getProvider(),o=(0,Q.eC)(t.id);try{return await n.request({method:"wallet_switchEthereumChain",params:[{chainId:o}]}),t}catch(e){if(4902===e.code)try{return await n.request({method:"wallet_addEthereumChain",params:[{chainId:o,chainName:t.name,nativeCurrency:t.nativeCurrency,rpcUrls:[t.rpcUrls.default?.http[0]??""],blockExplorerUrls:[t.blockExplorers?.default.url]}]}),t}catch(e){throw new et.ab(e)}throw new et.x3(e)}},onAccountsChanged(e){0===e.length?i.emitter.emit("disconnect"):i.emitter.emit("change",{accounts:e.map(e=>(0,tM.K)(e))})},onChainChanged(e){let t=normalizeChainId(e);i.emitter.emit("change",{chainId:t})},async onDisconnect(e){i.emitter.emit("disconnect");let t=await this.getProvider();t.removeListener("accountsChanged",this.onAccountsChanged),t.removeListener("chainChanged",this.onChainChanged),t.removeListener("disconnect",this.onDisconnect.bind(this))}})}walletConnect.type="walletConnect",coinbaseWallet.type="coinbaseWallet";var tD=function(e){var{conditions:t}=e;if(!t)throw Error("Styles have no conditions");var n=createNormalizeValueFn(e);return addRecipe(function(e,o){if("string"==typeof e||"number"==typeof e||"boolean"==typeof e){if(!t.defaultCondition)throw Error("No default condition");return o(e,t.defaultCondition)}var i=Array.isArray(e)?n(e):e,s={};for(var l in i)null!=i[l]&&(s[l]=o(i[l],l));return s},{importPath:"@vanilla-extract/sprinkles/createUtils",importName:"createMapValueFn",args:[{conditions:e.conditions}]})}({conditions:{defaultCondition:"smallScreen",conditionNames:["smallScreen","largeScreen"],responsiveArray:void 0}}),t_=createNormalizeValueFn({conditions:{defaultCondition:"smallScreen",conditionNames:["smallScreen","largeScreen"],responsiveArray:void 0}}),tL=function(){return createSprinkles_c8550e00_esm_createSprinkles(composeStyles)(...arguments)}({conditions:{defaultCondition:"base",conditionNames:["base","hover","active"],responsiveArray:void 0},styles:{background:{values:{accentColor:{conditions:{base:"ju367v9i",hover:"ju367v9j",active:"ju367v9k"},defaultClass:"ju367v9i"},accentColorForeground:{conditions:{base:"ju367v9l",hover:"ju367v9m",active:"ju367v9n"},defaultClass:"ju367v9l"},actionButtonBorder:{conditions:{base:"ju367v9o",hover:"ju367v9p",active:"ju367v9q"},defaultClass:"ju367v9o"},actionButtonBorderMobile:{conditions:{base:"ju367v9r",hover:"ju367v9s",active:"ju367v9t"},defaultClass:"ju367v9r"},actionButtonSecondaryBackground:{conditions:{base:"ju367v9u",hover:"ju367v9v",active:"ju367v9w"},defaultClass:"ju367v9u"},closeButton:{conditions:{base:"ju367v9x",hover:"ju367v9y",active:"ju367v9z"},defaultClass:"ju367v9x"},closeButtonBackground:{conditions:{base:"ju367va0",hover:"ju367va1",active:"ju367va2"},defaultClass:"ju367va0"},connectButtonBackground:{conditions:{base:"ju367va3",hover:"ju367va4",active:"ju367va5"},defaultClass:"ju367va3"},connectButtonBackgroundError:{conditions:{base:"ju367va6",hover:"ju367va7",active:"ju367va8"},defaultClass:"ju367va6"},connectButtonInnerBackground:{conditions:{base:"ju367va9",hover:"ju367vaa",active:"ju367vab"},defaultClass:"ju367va9"},connectButtonText:{conditions:{base:"ju367vac",hover:"ju367vad",active:"ju367vae"},defaultClass:"ju367vac"},connectButtonTextError:{conditions:{base:"ju367vaf",hover:"ju367vag",active:"ju367vah"},defaultClass:"ju367vaf"},connectionIndicator:{conditions:{base:"ju367vai",hover:"ju367vaj",active:"ju367vak"},defaultClass:"ju367vai"},downloadBottomCardBackground:{conditions:{base:"ju367val",hover:"ju367vam",active:"ju367van"},defaultClass:"ju367val"},downloadTopCardBackground:{conditions:{base:"ju367vao",hover:"ju367vap",active:"ju367vaq"},defaultClass:"ju367vao"},error:{conditions:{base:"ju367var",hover:"ju367vas",active:"ju367vat"},defaultClass:"ju367var"},generalBorder:{conditions:{base:"ju367vau",hover:"ju367vav",active:"ju367vaw"},defaultClass:"ju367vau"},generalBorderDim:{conditions:{base:"ju367vax",hover:"ju367vay",active:"ju367vaz"},defaultClass:"ju367vax"},menuItemBackground:{conditions:{base:"ju367vb0",hover:"ju367vb1",active:"ju367vb2"},defaultClass:"ju367vb0"},modalBackdrop:{conditions:{base:"ju367vb3",hover:"ju367vb4",active:"ju367vb5"},defaultClass:"ju367vb3"},modalBackground:{conditions:{base:"ju367vb6",hover:"ju367vb7",active:"ju367vb8"},defaultClass:"ju367vb6"},modalBorder:{conditions:{base:"ju367vb9",hover:"ju367vba",active:"ju367vbb"},defaultClass:"ju367vb9"},modalText:{conditions:{base:"ju367vbc",hover:"ju367vbd",active:"ju367vbe"},defaultClass:"ju367vbc"},modalTextDim:{conditions:{base:"ju367vbf",hover:"ju367vbg",active:"ju367vbh"},defaultClass:"ju367vbf"},modalTextSecondary:{conditions:{base:"ju367vbi",hover:"ju367vbj",active:"ju367vbk"},defaultClass:"ju367vbi"},profileAction:{conditions:{base:"ju367vbl",hover:"ju367vbm",active:"ju367vbn"},defaultClass:"ju367vbl"},profileActionHover:{conditions:{base:"ju367vbo",hover:"ju367vbp",active:"ju367vbq"},defaultClass:"ju367vbo"},profileForeground:{conditions:{base:"ju367vbr",hover:"ju367vbs",active:"ju367vbt"},defaultClass:"ju367vbr"},selectedOptionBorder:{conditions:{base:"ju367vbu",hover:"ju367vbv",active:"ju367vbw"},defaultClass:"ju367vbu"},standby:{conditions:{base:"ju367vbx",hover:"ju367vby",active:"ju367vbz"},defaultClass:"ju367vbx"}}},borderColor:{values:{accentColor:{conditions:{base:"ju367vc0",hover:"ju367vc1",active:"ju367vc2"},defaultClass:"ju367vc0"},accentColorForeground:{conditions:{base:"ju367vc3",hover:"ju367vc4",active:"ju367vc5"},defaultClass:"ju367vc3"},actionButtonBorder:{conditions:{base:"ju367vc6",hover:"ju367vc7",active:"ju367vc8"},defaultClass:"ju367vc6"},actionButtonBorderMobile:{conditions:{base:"ju367vc9",hover:"ju367vca",active:"ju367vcb"},defaultClass:"ju367vc9"},actionButtonSecondaryBackground:{conditions:{base:"ju367vcc",hover:"ju367vcd",active:"ju367vce"},defaultClass:"ju367vcc"},closeButton:{conditions:{base:"ju367vcf",hover:"ju367vcg",active:"ju367vch"},defaultClass:"ju367vcf"},closeButtonBackground:{conditions:{base:"ju367vci",hover:"ju367vcj",active:"ju367vck"},defaultClass:"ju367vci"},connectButtonBackground:{conditions:{base:"ju367vcl",hover:"ju367vcm",active:"ju367vcn"},defaultClass:"ju367vcl"},connectButtonBackgroundError:{conditions:{base:"ju367vco",hover:"ju367vcp",active:"ju367vcq"},defaultClass:"ju367vco"},connectButtonInnerBackground:{conditions:{base:"ju367vcr",hover:"ju367vcs",active:"ju367vct"},defaultClass:"ju367vcr"},connectButtonText:{conditions:{base:"ju367vcu",hover:"ju367vcv",active:"ju367vcw"},defaultClass:"ju367vcu"},connectButtonTextError:{conditions:{base:"ju367vcx",hover:"ju367vcy",active:"ju367vcz"},defaultClass:"ju367vcx"},connectionIndicator:{conditions:{base:"ju367vd0",hover:"ju367vd1",active:"ju367vd2"},defaultClass:"ju367vd0"},downloadBottomCardBackground:{conditions:{base:"ju367vd3",hover:"ju367vd4",active:"ju367vd5"},defaultClass:"ju367vd3"},downloadTopCardBackground:{conditions:{base:"ju367vd6",hover:"ju367vd7",active:"ju367vd8"},defaultClass:"ju367vd6"},error:{conditions:{base:"ju367vd9",hover:"ju367vda",active:"ju367vdb"},defaultClass:"ju367vd9"},generalBorder:{conditions:{base:"ju367vdc",hover:"ju367vdd",active:"ju367vde"},defaultClass:"ju367vdc"},generalBorderDim:{conditions:{base:"ju367vdf",hover:"ju367vdg",active:"ju367vdh"},defaultClass:"ju367vdf"},menuItemBackground:{conditions:{base:"ju367vdi",hover:"ju367vdj",active:"ju367vdk"},defaultClass:"ju367vdi"},modalBackdrop:{conditions:{base:"ju367vdl",hover:"ju367vdm",active:"ju367vdn"},defaultClass:"ju367vdl"},modalBackground:{conditions:{base:"ju367vdo",hover:"ju367vdp",active:"ju367vdq"},defaultClass:"ju367vdo"},modalBorder:{conditions:{base:"ju367vdr",hover:"ju367vds",active:"ju367vdt"},defaultClass:"ju367vdr"},modalText:{conditions:{base:"ju367vdu",hover:"ju367vdv",active:"ju367vdw"},defaultClass:"ju367vdu"},modalTextDim:{conditions:{base:"ju367vdx",hover:"ju367vdy",active:"ju367vdz"},defaultClass:"ju367vdx"},modalTextSecondary:{conditions:{base:"ju367ve0",hover:"ju367ve1",active:"ju367ve2"},defaultClass:"ju367ve0"},profileAction:{conditions:{base:"ju367ve3",hover:"ju367ve4",active:"ju367ve5"},defaultClass:"ju367ve3"},profileActionHover:{conditions:{base:"ju367ve6",hover:"ju367ve7",active:"ju367ve8"},defaultClass:"ju367ve6"},profileForeground:{conditions:{base:"ju367ve9",hover:"ju367vea",active:"ju367veb"},defaultClass:"ju367ve9"},selectedOptionBorder:{conditions:{base:"ju367vec",hover:"ju367ved",active:"ju367vee"},defaultClass:"ju367vec"},standby:{conditions:{base:"ju367vef",hover:"ju367veg",active:"ju367veh"},defaultClass:"ju367vef"}}},boxShadow:{values:{connectButton:{conditions:{base:"ju367vei",hover:"ju367vej",active:"ju367vek"},defaultClass:"ju367vei"},dialog:{conditions:{base:"ju367vel",hover:"ju367vem",active:"ju367ven"},defaultClass:"ju367vel"},profileDetailsAction:{conditions:{base:"ju367veo",hover:"ju367vep",active:"ju367veq"},defaultClass:"ju367veo"},selectedOption:{conditions:{base:"ju367ver",hover:"ju367ves",active:"ju367vet"},defaultClass:"ju367ver"},selectedWallet:{conditions:{base:"ju367veu",hover:"ju367vev",active:"ju367vew"},defaultClass:"ju367veu"},walletLogo:{conditions:{base:"ju367vex",hover:"ju367vey",active:"ju367vez"},defaultClass:"ju367vex"}}},color:{values:{accentColor:{conditions:{base:"ju367vf0",hover:"ju367vf1",active:"ju367vf2"},defaultClass:"ju367vf0"},accentColorForeground:{conditions:{base:"ju367vf3",hover:"ju367vf4",active:"ju367vf5"},defaultClass:"ju367vf3"},actionButtonBorder:{conditions:{base:"ju367vf6",hover:"ju367vf7",active:"ju367vf8"},defaultClass:"ju367vf6"},actionButtonBorderMobile:{conditions:{base:"ju367vf9",hover:"ju367vfa",active:"ju367vfb"},defaultClass:"ju367vf9"},actionButtonSecondaryBackground:{conditions:{base:"ju367vfc",hover:"ju367vfd",active:"ju367vfe"},defaultClass:"ju367vfc"},closeButton:{conditions:{base:"ju367vff",hover:"ju367vfg",active:"ju367vfh"},defaultClass:"ju367vff"},closeButtonBackground:{conditions:{base:"ju367vfi",hover:"ju367vfj",active:"ju367vfk"},defaultClass:"ju367vfi"},connectButtonBackground:{conditions:{base:"ju367vfl",hover:"ju367vfm",active:"ju367vfn"},defaultClass:"ju367vfl"},connectButtonBackgroundError:{conditions:{base:"ju367vfo",hover:"ju367vfp",active:"ju367vfq"},defaultClass:"ju367vfo"},connectButtonInnerBackground:{conditions:{base:"ju367vfr",hover:"ju367vfs",active:"ju367vft"},defaultClass:"ju367vfr"},connectButtonText:{conditions:{base:"ju367vfu",hover:"ju367vfv",active:"ju367vfw"},defaultClass:"ju367vfu"},connectButtonTextError:{conditions:{base:"ju367vfx",hover:"ju367vfy",active:"ju367vfz"},defaultClass:"ju367vfx"},connectionIndicator:{conditions:{base:"ju367vg0",hover:"ju367vg1",active:"ju367vg2"},defaultClass:"ju367vg0"},downloadBottomCardBackground:{conditions:{base:"ju367vg3",hover:"ju367vg4",active:"ju367vg5"},defaultClass:"ju367vg3"},downloadTopCardBackground:{conditions:{base:"ju367vg6",hover:"ju367vg7",active:"ju367vg8"},defaultClass:"ju367vg6"},error:{conditions:{base:"ju367vg9",hover:"ju367vga",active:"ju367vgb"},defaultClass:"ju367vg9"},generalBorder:{conditions:{base:"ju367vgc",hover:"ju367vgd",active:"ju367vge"},defaultClass:"ju367vgc"},generalBorderDim:{conditions:{base:"ju367vgf",hover:"ju367vgg",active:"ju367vgh"},defaultClass:"ju367vgf"},menuItemBackground:{conditions:{base:"ju367vgi",hover:"ju367vgj",active:"ju367vgk"},defaultClass:"ju367vgi"},modalBackdrop:{conditions:{base:"ju367vgl",hover:"ju367vgm",active:"ju367vgn"},defaultClass:"ju367vgl"},modalBackground:{conditions:{base:"ju367vgo",hover:"ju367vgp",active:"ju367vgq"},defaultClass:"ju367vgo"},modalBorder:{conditions:{base:"ju367vgr",hover:"ju367vgs",active:"ju367vgt"},defaultClass:"ju367vgr"},modalText:{conditions:{base:"ju367vgu",hover:"ju367vgv",active:"ju367vgw"},defaultClass:"ju367vgu"},modalTextDim:{conditions:{base:"ju367vgx",hover:"ju367vgy",active:"ju367vgz"},defaultClass:"ju367vgx"},modalTextSecondary:{conditions:{base:"ju367vh0",hover:"ju367vh1",active:"ju367vh2"},defaultClass:"ju367vh0"},profileAction:{conditions:{base:"ju367vh3",hover:"ju367vh4",active:"ju367vh5"},defaultClass:"ju367vh3"},profileActionHover:{conditions:{base:"ju367vh6",hover:"ju367vh7",active:"ju367vh8"},defaultClass:"ju367vh6"},profileForeground:{conditions:{base:"ju367vh9",hover:"ju367vha",active:"ju367vhb"},defaultClass:"ju367vh9"},selectedOptionBorder:{conditions:{base:"ju367vhc",hover:"ju367vhd",active:"ju367vhe"},defaultClass:"ju367vhc"},standby:{conditions:{base:"ju367vhf",hover:"ju367vhg",active:"ju367vhh"},defaultClass:"ju367vhf"}}}}},{conditions:{defaultCondition:"smallScreen",conditionNames:["smallScreen","largeScreen"],responsiveArray:void 0},styles:{alignItems:{values:{"flex-start":{conditions:{smallScreen:"ju367v0",largeScreen:"ju367v1"},defaultClass:"ju367v0"},"flex-end":{conditions:{smallScreen:"ju367v2",largeScreen:"ju367v3"},defaultClass:"ju367v2"},center:{conditions:{smallScreen:"ju367v4",largeScreen:"ju367v5"},defaultClass:"ju367v4"}}},display:{values:{none:{conditions:{smallScreen:"ju367v6",largeScreen:"ju367v7"},defaultClass:"ju367v6"},block:{conditions:{smallScreen:"ju367v8",largeScreen:"ju367v9"},defaultClass:"ju367v8"},flex:{conditions:{smallScreen:"ju367va",largeScreen:"ju367vb"},defaultClass:"ju367va"},inline:{conditions:{smallScreen:"ju367vc",largeScreen:"ju367vd"},defaultClass:"ju367vc"}}}}},{conditions:void 0,styles:{margin:{mappings:["marginTop","marginBottom","marginLeft","marginRight"]},marginX:{mappings:["marginLeft","marginRight"]},marginY:{mappings:["marginTop","marginBottom"]},padding:{mappings:["paddingTop","paddingBottom","paddingLeft","paddingRight"]},paddingX:{mappings:["paddingLeft","paddingRight"]},paddingY:{mappings:["paddingTop","paddingBottom"]},alignSelf:{values:{"flex-start":{defaultClass:"ju367ve"},"flex-end":{defaultClass:"ju367vf"},center:{defaultClass:"ju367vg"}}},backgroundSize:{values:{cover:{defaultClass:"ju367vh"}}},borderRadius:{values:{1:{defaultClass:"ju367vi"},6:{defaultClass:"ju367vj"},10:{defaultClass:"ju367vk"},13:{defaultClass:"ju367vl"},actionButton:{defaultClass:"ju367vm"},connectButton:{defaultClass:"ju367vn"},menuButton:{defaultClass:"ju367vo"},modal:{defaultClass:"ju367vp"},modalMobile:{defaultClass:"ju367vq"},"25%":{defaultClass:"ju367vr"},full:{defaultClass:"ju367vs"}}},borderStyle:{values:{solid:{defaultClass:"ju367vt"}}},borderWidth:{values:{0:{defaultClass:"ju367vu"},1:{defaultClass:"ju367vv"},2:{defaultClass:"ju367vw"},4:{defaultClass:"ju367vx"}}},cursor:{values:{pointer:{defaultClass:"ju367vy"},none:{defaultClass:"ju367vz"}}},pointerEvents:{values:{none:{defaultClass:"ju367v10"},all:{defaultClass:"ju367v11"}}},minHeight:{values:{8:{defaultClass:"ju367v12"},44:{defaultClass:"ju367v13"}}},flexDirection:{values:{row:{defaultClass:"ju367v14"},column:{defaultClass:"ju367v15"}}},fontFamily:{values:{body:{defaultClass:"ju367v16"}}},fontSize:{values:{12:{defaultClass:"ju367v17"},13:{defaultClass:"ju367v18"},14:{defaultClass:"ju367v19"},16:{defaultClass:"ju367v1a"},18:{defaultClass:"ju367v1b"},20:{defaultClass:"ju367v1c"},23:{defaultClass:"ju367v1d"}}},fontWeight:{values:{regular:{defaultClass:"ju367v1e"},medium:{defaultClass:"ju367v1f"},semibold:{defaultClass:"ju367v1g"},bold:{defaultClass:"ju367v1h"},heavy:{defaultClass:"ju367v1i"}}},gap:{values:{0:{defaultClass:"ju367v1j"},1:{defaultClass:"ju367v1k"},2:{defaultClass:"ju367v1l"},3:{defaultClass:"ju367v1m"},4:{defaultClass:"ju367v1n"},5:{defaultClass:"ju367v1o"},6:{defaultClass:"ju367v1p"},8:{defaultClass:"ju367v1q"},10:{defaultClass:"ju367v1r"},12:{defaultClass:"ju367v1s"},14:{defaultClass:"ju367v1t"},16:{defaultClass:"ju367v1u"},18:{defaultClass:"ju367v1v"},20:{defaultClass:"ju367v1w"},24:{defaultClass:"ju367v1x"},28:{defaultClass:"ju367v1y"},32:{defaultClass:"ju367v1z"},36:{defaultClass:"ju367v20"},44:{defaultClass:"ju367v21"},64:{defaultClass:"ju367v22"},"-1":{defaultClass:"ju367v23"}}},height:{values:{1:{defaultClass:"ju367v24"},2:{defaultClass:"ju367v25"},4:{defaultClass:"ju367v26"},8:{defaultClass:"ju367v27"},12:{defaultClass:"ju367v28"},20:{defaultClass:"ju367v29"},24:{defaultClass:"ju367v2a"},28:{defaultClass:"ju367v2b"},30:{defaultClass:"ju367v2c"},32:{defaultClass:"ju367v2d"},34:{defaultClass:"ju367v2e"},36:{defaultClass:"ju367v2f"},40:{defaultClass:"ju367v2g"},44:{defaultClass:"ju367v2h"},48:{defaultClass:"ju367v2i"},54:{defaultClass:"ju367v2j"},60:{defaultClass:"ju367v2k"},200:{defaultClass:"ju367v2l"},full:{defaultClass:"ju367v2m"},max:{defaultClass:"ju367v2n"}}},justifyContent:{values:{"flex-start":{defaultClass:"ju367v2o"},"flex-end":{defaultClass:"ju367v2p"},center:{defaultClass:"ju367v2q"},"space-between":{defaultClass:"ju367v2r"},"space-around":{defaultClass:"ju367v2s"}}},textAlign:{values:{left:{defaultClass:"ju367v2t"},center:{defaultClass:"ju367v2u"},inherit:{defaultClass:"ju367v2v"}}},marginBottom:{values:{0:{defaultClass:"ju367v2w"},1:{defaultClass:"ju367v2x"},2:{defaultClass:"ju367v2y"},3:{defaultClass:"ju367v2z"},4:{defaultClass:"ju367v30"},5:{defaultClass:"ju367v31"},6:{defaultClass:"ju367v32"},8:{defaultClass:"ju367v33"},10:{defaultClass:"ju367v34"},12:{defaultClass:"ju367v35"},14:{defaultClass:"ju367v36"},16:{defaultClass:"ju367v37"},18:{defaultClass:"ju367v38"},20:{defaultClass:"ju367v39"},24:{defaultClass:"ju367v3a"},28:{defaultClass:"ju367v3b"},32:{defaultClass:"ju367v3c"},36:{defaultClass:"ju367v3d"},44:{defaultClass:"ju367v3e"},64:{defaultClass:"ju367v3f"},"-1":{defaultClass:"ju367v3g"}}},marginLeft:{values:{0:{defaultClass:"ju367v3h"},1:{defaultClass:"ju367v3i"},2:{defaultClass:"ju367v3j"},3:{defaultClass:"ju367v3k"},4:{defaultClass:"ju367v3l"},5:{defaultClass:"ju367v3m"},6:{defaultClass:"ju367v3n"},8:{defaultClass:"ju367v3o"},10:{defaultClass:"ju367v3p"},12:{defaultClass:"ju367v3q"},14:{defaultClass:"ju367v3r"},16:{defaultClass:"ju367v3s"},18:{defaultClass:"ju367v3t"},20:{defaultClass:"ju367v3u"},24:{defaultClass:"ju367v3v"},28:{defaultClass:"ju367v3w"},32:{defaultClass:"ju367v3x"},36:{defaultClass:"ju367v3y"},44:{defaultClass:"ju367v3z"},64:{defaultClass:"ju367v40"},"-1":{defaultClass:"ju367v41"}}},marginRight:{values:{0:{defaultClass:"ju367v42"},1:{defaultClass:"ju367v43"},2:{defaultClass:"ju367v44"},3:{defaultClass:"ju367v45"},4:{defaultClass:"ju367v46"},5:{defaultClass:"ju367v47"},6:{defaultClass:"ju367v48"},8:{defaultClass:"ju367v49"},10:{defaultClass:"ju367v4a"},12:{defaultClass:"ju367v4b"},14:{defaultClass:"ju367v4c"},16:{defaultClass:"ju367v4d"},18:{defaultClass:"ju367v4e"},20:{defaultClass:"ju367v4f"},24:{defaultClass:"ju367v4g"},28:{defaultClass:"ju367v4h"},32:{defaultClass:"ju367v4i"},36:{defaultClass:"ju367v4j"},44:{defaultClass:"ju367v4k"},64:{defaultClass:"ju367v4l"},"-1":{defaultClass:"ju367v4m"}}},marginTop:{values:{0:{defaultClass:"ju367v4n"},1:{defaultClass:"ju367v4o"},2:{defaultClass:"ju367v4p"},3:{defaultClass:"ju367v4q"},4:{defaultClass:"ju367v4r"},5:{defaultClass:"ju367v4s"},6:{defaultClass:"ju367v4t"},8:{defaultClass:"ju367v4u"},10:{defaultClass:"ju367v4v"},12:{defaultClass:"ju367v4w"},14:{defaultClass:"ju367v4x"},16:{defaultClass:"ju367v4y"},18:{defaultClass:"ju367v4z"},20:{defaultClass:"ju367v50"},24:{defaultClass:"ju367v51"},28:{defaultClass:"ju367v52"},32:{defaultClass:"ju367v53"},36:{defaultClass:"ju367v54"},44:{defaultClass:"ju367v55"},64:{defaultClass:"ju367v56"},"-1":{defaultClass:"ju367v57"}}},maxWidth:{values:{1:{defaultClass:"ju367v58"},2:{defaultClass:"ju367v59"},4:{defaultClass:"ju367v5a"},8:{defaultClass:"ju367v5b"},12:{defaultClass:"ju367v5c"},20:{defaultClass:"ju367v5d"},24:{defaultClass:"ju367v5e"},28:{defaultClass:"ju367v5f"},30:{defaultClass:"ju367v5g"},32:{defaultClass:"ju367v5h"},34:{defaultClass:"ju367v5i"},36:{defaultClass:"ju367v5j"},40:{defaultClass:"ju367v5k"},44:{defaultClass:"ju367v5l"},48:{defaultClass:"ju367v5m"},54:{defaultClass:"ju367v5n"},60:{defaultClass:"ju367v5o"},200:{defaultClass:"ju367v5p"},full:{defaultClass:"ju367v5q"},max:{defaultClass:"ju367v5r"}}},minWidth:{values:{1:{defaultClass:"ju367v5s"},2:{defaultClass:"ju367v5t"},4:{defaultClass:"ju367v5u"},8:{defaultClass:"ju367v5v"},12:{defaultClass:"ju367v5w"},20:{defaultClass:"ju367v5x"},24:{defaultClass:"ju367v5y"},28:{defaultClass:"ju367v5z"},30:{defaultClass:"ju367v60"},32:{defaultClass:"ju367v61"},34:{defaultClass:"ju367v62"},36:{defaultClass:"ju367v63"},40:{defaultClass:"ju367v64"},44:{defaultClass:"ju367v65"},48:{defaultClass:"ju367v66"},54:{defaultClass:"ju367v67"},60:{defaultClass:"ju367v68"},200:{defaultClass:"ju367v69"},full:{defaultClass:"ju367v6a"},max:{defaultClass:"ju367v6b"}}},overflow:{values:{hidden:{defaultClass:"ju367v6c"}}},paddingBottom:{values:{0:{defaultClass:"ju367v6d"},1:{defaultClass:"ju367v6e"},2:{defaultClass:"ju367v6f"},3:{defaultClass:"ju367v6g"},4:{defaultClass:"ju367v6h"},5:{defaultClass:"ju367v6i"},6:{defaultClass:"ju367v6j"},8:{defaultClass:"ju367v6k"},10:{defaultClass:"ju367v6l"},12:{defaultClass:"ju367v6m"},14:{defaultClass:"ju367v6n"},16:{defaultClass:"ju367v6o"},18:{defaultClass:"ju367v6p"},20:{defaultClass:"ju367v6q"},24:{defaultClass:"ju367v6r"},28:{defaultClass:"ju367v6s"},32:{defaultClass:"ju367v6t"},36:{defaultClass:"ju367v6u"},44:{defaultClass:"ju367v6v"},64:{defaultClass:"ju367v6w"},"-1":{defaultClass:"ju367v6x"}}},paddingLeft:{values:{0:{defaultClass:"ju367v6y"},1:{defaultClass:"ju367v6z"},2:{defaultClass:"ju367v70"},3:{defaultClass:"ju367v71"},4:{defaultClass:"ju367v72"},5:{defaultClass:"ju367v73"},6:{defaultClass:"ju367v74"},8:{defaultClass:"ju367v75"},10:{defaultClass:"ju367v76"},12:{defaultClass:"ju367v77"},14:{defaultClass:"ju367v78"},16:{defaultClass:"ju367v79"},18:{defaultClass:"ju367v7a"},20:{defaultClass:"ju367v7b"},24:{defaultClass:"ju367v7c"},28:{defaultClass:"ju367v7d"},32:{defaultClass:"ju367v7e"},36:{defaultClass:"ju367v7f"},44:{defaultClass:"ju367v7g"},64:{defaultClass:"ju367v7h"},"-1":{defaultClass:"ju367v7i"}}},paddingRight:{values:{0:{defaultClass:"ju367v7j"},1:{defaultClass:"ju367v7k"},2:{defaultClass:"ju367v7l"},3:{defaultClass:"ju367v7m"},4:{defaultClass:"ju367v7n"},5:{defaultClass:"ju367v7o"},6:{defaultClass:"ju367v7p"},8:{defaultClass:"ju367v7q"},10:{defaultClass:"ju367v7r"},12:{defaultClass:"ju367v7s"},14:{defaultClass:"ju367v7t"},16:{defaultClass:"ju367v7u"},18:{defaultClass:"ju367v7v"},20:{defaultClass:"ju367v7w"},24:{defaultClass:"ju367v7x"},28:{defaultClass:"ju367v7y"},32:{defaultClass:"ju367v7z"},36:{defaultClass:"ju367v80"},44:{defaultClass:"ju367v81"},64:{defaultClass:"ju367v82"},"-1":{defaultClass:"ju367v83"}}},paddingTop:{values:{0:{defaultClass:"ju367v84"},1:{defaultClass:"ju367v85"},2:{defaultClass:"ju367v86"},3:{defaultClass:"ju367v87"},4:{defaultClass:"ju367v88"},5:{defaultClass:"ju367v89"},6:{defaultClass:"ju367v8a"},8:{defaultClass:"ju367v8b"},10:{defaultClass:"ju367v8c"},12:{defaultClass:"ju367v8d"},14:{defaultClass:"ju367v8e"},16:{defaultClass:"ju367v8f"},18:{defaultClass:"ju367v8g"},20:{defaultClass:"ju367v8h"},24:{defaultClass:"ju367v8i"},28:{defaultClass:"ju367v8j"},32:{defaultClass:"ju367v8k"},36:{defaultClass:"ju367v8l"},44:{defaultClass:"ju367v8m"},64:{defaultClass:"ju367v8n"},"-1":{defaultClass:"ju367v8o"}}},position:{values:{absolute:{defaultClass:"ju367v8p"},fixed:{defaultClass:"ju367v8q"},relative:{defaultClass:"ju367v8r"}}},WebkitUserSelect:{values:{none:{defaultClass:"ju367v8s"}}},right:{values:{0:{defaultClass:"ju367v8t"}}},transition:{values:{default:{defaultClass:"ju367v8u"},transform:{defaultClass:"ju367v8v"}}},userSelect:{values:{none:{defaultClass:"ju367v8w"}}},width:{values:{1:{defaultClass:"ju367v8x"},2:{defaultClass:"ju367v8y"},4:{defaultClass:"ju367v8z"},8:{defaultClass:"ju367v90"},12:{defaultClass:"ju367v91"},20:{defaultClass:"ju367v92"},24:{defaultClass:"ju367v93"},28:{defaultClass:"ju367v94"},30:{defaultClass:"ju367v95"},32:{defaultClass:"ju367v96"},34:{defaultClass:"ju367v97"},36:{defaultClass:"ju367v98"},40:{defaultClass:"ju367v99"},44:{defaultClass:"ju367v9a"},48:{defaultClass:"ju367v9b"},54:{defaultClass:"ju367v9c"},60:{defaultClass:"ju367v9d"},200:{defaultClass:"ju367v9e"},full:{defaultClass:"ju367v9f"},max:{defaultClass:"ju367v9g"}}},backdropFilter:{values:{modalOverlay:{defaultClass:"ju367v9h"}}}}}),tz={colors:{accentColor:"var(--rk-colors-accentColor)",accentColorForeground:"var(--rk-colors-accentColorForeground)",actionButtonBorder:"var(--rk-colors-actionButtonBorder)",actionButtonBorderMobile:"var(--rk-colors-actionButtonBorderMobile)",actionButtonSecondaryBackground:"var(--rk-colors-actionButtonSecondaryBackground)",closeButton:"var(--rk-colors-closeButton)",closeButtonBackground:"var(--rk-colors-closeButtonBackground)",connectButtonBackground:"var(--rk-colors-connectButtonBackground)",connectButtonBackgroundError:"var(--rk-colors-connectButtonBackgroundError)",connectButtonInnerBackground:"var(--rk-colors-connectButtonInnerBackground)",connectButtonText:"var(--rk-colors-connectButtonText)",connectButtonTextError:"var(--rk-colors-connectButtonTextError)",connectionIndicator:"var(--rk-colors-connectionIndicator)",downloadBottomCardBackground:"var(--rk-colors-downloadBottomCardBackground)",downloadTopCardBackground:"var(--rk-colors-downloadTopCardBackground)",error:"var(--rk-colors-error)",generalBorder:"var(--rk-colors-generalBorder)",generalBorderDim:"var(--rk-colors-generalBorderDim)",menuItemBackground:"var(--rk-colors-menuItemBackground)",modalBackdrop:"var(--rk-colors-modalBackdrop)",modalBackground:"var(--rk-colors-modalBackground)",modalBorder:"var(--rk-colors-modalBorder)",modalText:"var(--rk-colors-modalText)",modalTextDim:"var(--rk-colors-modalTextDim)",modalTextSecondary:"var(--rk-colors-modalTextSecondary)",profileAction:"var(--rk-colors-profileAction)",profileActionHover:"var(--rk-colors-profileActionHover)",profileForeground:"var(--rk-colors-profileForeground)",selectedOptionBorder:"var(--rk-colors-selectedOptionBorder)",standby:"var(--rk-colors-standby)"},fonts:{body:"var(--rk-fonts-body)"},radii:{actionButton:"var(--rk-radii-actionButton)",connectButton:"var(--rk-radii-connectButton)",menuButton:"var(--rk-radii-menuButton)",modal:"var(--rk-radii-modal)",modalMobile:"var(--rk-radii-modalMobile)"},shadows:{connectButton:"var(--rk-shadows-connectButton)",dialog:"var(--rk-shadows-dialog)",profileDetailsAction:"var(--rk-shadows-profileDetailsAction)",selectedOption:"var(--rk-shadows-selectedOption)",selectedWallet:"var(--rk-shadows-selectedWallet)",walletLogo:"var(--rk-shadows-walletLogo)"},blurs:{modalOverlay:"var(--rk-blurs-modalOverlay)"}},tq={shrink:"_12cbo8i6",shrinkSm:"_12cbo8i7"},tG={grow:"_12cbo8i4",growLg:"_12cbo8i5"};function touchableStyles({active:e,hover:t}){return["_12cbo8i3 ju367v8r",t&&tG[t],tq[e]]}var tW=(0,D.createContext)(null);function useAuthenticationStatus(){var e;let t=(0,D.useContext)(tW);return null!=(e=null==t?void 0:t.status)?e:null}function useConnectionStatus(){let e=useAuthenticationStatus(),{isConnected:t}=(0,_.m)();return t?e&&("loading"===e||"unauthenticated"===e)?e:"connected":"disconnected"}function isAndroid(){return"undefined"!=typeof navigator&&/android/i.test(navigator.userAgent)}function isIOS(){return"undefined"!=typeof navigator&&/iPhone|iPod/.test(navigator.userAgent)||"undefined"!=typeof navigator&&(/iPad/.test(navigator.userAgent)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)}function isMobile(){return isAndroid()||isIOS()}var tH={a:"iekbcca",blockquote:"iekbcc2",button:"iekbcc9",input:"iekbcc8 iekbcc5 iekbcc4",mark:"iekbcc6",ol:"iekbcc1",q:"iekbcc2",select:"iekbcc7 iekbcc5 iekbcc4",table:"iekbcc3",textarea:"iekbcc5 iekbcc4",ul:"iekbcc1"},atoms=({reset:e,...t})=>{if(!e)return tL(t);let n=tH[e],o=tL(t);return(0,L.Z)("iekbcc0",n,o)},tQ=D.forwardRef(({as:e="div",className:t,testId:n,...o},i)=>{let s={},l={};for(let e in o)tL.properties.has(e)?s[e]=o[e]:l[e]=o[e];let c=atoms({reset:"string"==typeof e?e:"div",...s});return D.createElement(e,{className:(0,L.Z)(c,t),...l,"data-testid":n?`rk-${n.replace(/^rk-/,"")}`:void 0,ref:i})});tQ.displayName="Box";var tK=new Map,tV=new Map;async function loadAsyncImage(e){let t=tV.get(e);if(t)return t;let load=async()=>e().then(async t=>(tK.set(e,t),t)),n=load().catch(t=>load().catch(t=>{tV.delete(e)}));return tV.set(e,n),n}async function loadImages(...e){return await Promise.all(e.map(e=>"function"==typeof e?loadAsyncImage(e):e))}function useAsyncImage(e){let t="function"==typeof e?tK.get(e):void 0,n=function(){let[,e]=(0,D.useReducer)(e=>e+1,0);return e}();return(0,D.useEffect)(()=>{"function"!=typeof e||t||loadAsyncImage(e).then(n)},[e,t,n]),"function"==typeof e?t:e}function AsyncImage({alt:e,background:t,borderColor:n,borderRadius:o,useAsImage:i,boxShadow:s,height:l,src:c,width:u,testId:d}){let p=isIOS(),f=useAsyncImage(c),m=f&&/^http/.test(f),[b,g]=(0,D.useReducer)(()=>!0,!1);return D.createElement(tQ,{"aria-label":e,borderRadius:o,boxShadow:s,height:"string"==typeof l?l:void 0,overflow:"hidden",position:"relative",role:"img",style:{background:t,height:"number"==typeof l?l:void 0,width:"number"==typeof u?u:void 0},width:"string"==typeof u?u:void 0,testId:d},D.createElement(tQ,{...i?{"aria-hidden":!0,as:"img",src:f}:m?{"aria-hidden":!0,as:"img",onLoad:g,src:f}:{backgroundSize:"cover"},height:"full",position:"absolute",...p?{WebkitUserSelect:"none"}:{},style:{WebkitTouchCallout:"none",transition:"opacity .15s linear",userSelect:"none",...i?{}:m?{opacity:b?1:0}:{backgroundImage:f?`url(${f})`:void 0,backgroundRepeat:"no-repeat",opacity:f?1:0}},width:"full"}),n?D.createElement(tQ,{..."object"==typeof n&&"custom"in n?{style:{borderColor:n.custom}}:{borderColor:n},borderRadius:o,borderStyle:"solid",borderWidth:"1",height:"full",position:"relative",width:"full"}):null)}var useRandomId=e=>(0,D.useMemo)(()=>`${e}_${Math.round(1e9*Math.random())}`,[e]),SpinnerIcon=({height:e=21,width:t=21})=>{let n=useRandomId("spinner");return D.createElement("svg",{className:"_1luule42",fill:"none",height:e,viewBox:"0 0 21 21",width:t,xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Loading"),D.createElement("clipPath",{id:n},D.createElement("path",{d:"M10.5 3C6.35786 3 3 6.35786 3 10.5C3 14.6421 6.35786 18 10.5 18C11.3284 18 12 18.6716 12 19.5C12 20.3284 11.3284 21 10.5 21C4.70101 21 0 16.299 0 10.5C0 4.70101 4.70101 0 10.5 0C16.299 0 21 4.70101 21 10.5C21 11.3284 20.3284 12 19.5 12C18.6716 12 18 11.3284 18 10.5C18 6.35786 14.6421 3 10.5 3Z"})),D.createElement("foreignObject",{clipPath:`url(#${n})`,height:"21",width:"21",x:"0",y:"0"},D.createElement("div",{className:"_1luule43"})))},tZ=[{color:"#FC5C54",emoji:"\uD83C\uDF36"},{color:"#FFD95A",emoji:"\uD83E\uDD11"},{color:"#E95D72",emoji:"\uD83D\uDC19"},{color:"#6A87C8",emoji:"\uD83E\uDED0"},{color:"#5FD0F3",emoji:"\uD83D\uDC33"},{color:"#FC5C54",emoji:"\uD83E\uDD36"},{color:"#75C06B",emoji:"\uD83C\uDF32"},{color:"#FFDD86",emoji:"\uD83C\uDF1E"},{color:"#5FC6D4",emoji:"\uD83D\uDC12"},{color:"#FF949A",emoji:"\uD83D\uDC35"},{color:"#FF8024",emoji:"\uD83E\uDD8A"},{color:"#9BA1A4",emoji:"\uD83D\uDC3C"},{color:"#EC66FF",emoji:"\uD83E\uDD84"},{color:"#FF8CBC",emoji:"\uD83D\uDC37"},{color:"#FF9A23",emoji:"\uD83D\uDC27"},{color:"#FF949A",emoji:"\uD83E\uDDA9"},{color:"#C5DADB",emoji:"\uD83D\uDC7D"},{color:"#FC5C54",emoji:"\uD83C\uDF88"},{color:"#FF949A",emoji:"\uD83C\uDF49"},{color:"#FFD95A",emoji:"\uD83C\uDF89"},{color:"#A8CE63",emoji:"\uD83D\uDC32"},{color:"#71ABFF",emoji:"\uD83C\uDF0E"},{color:"#FFE279",emoji:"\uD83C\uDF4A"},{color:"#B6B1B6",emoji:"\uD83D\uDC2D"},{color:"#FF6780",emoji:"\uD83C\uDF63"},{color:"#FFD95A",emoji:"\uD83D\uDC25"},{color:"#A575FF",emoji:"\uD83D\uDC7E"},{color:"#A8CE63",emoji:"\uD83E\uDD66"},{color:"#FC5C54",emoji:"\uD83D\uDC79"},{color:"#FFE279",emoji:"\uD83D\uDE40"},{color:"#5FD0F3",emoji:"⛱"},{color:"#4D82FF",emoji:"⛵️"},{color:"#FFE279",emoji:"\uD83E\uDD73"},{color:"#FF949A",emoji:"\uD83E\uDD2F"},{color:"#FFB35A",emoji:"\uD83E\uDD20"}],defaultAvatar=({address:e,ensImage:t,size:n})=>{let[o,i]=(0,D.useState)(!1);(0,D.useEffect)(()=>{if(t){let e=new Image;e.src=t,e.onload=()=>i(!0)}},[t]);let{color:s,emoji:l}=(0,D.useMemo)(()=>(function(e){let t=Math.abs(function(e){let t=0;if(0===e.length)return t;for(let n=0;nD.createElement("svg",{fill:"none",height:"7",width:"14",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Dropdown"),D.createElement("path",{d:"M12.75 1.54001L8.51647 5.0038C7.77974 5.60658 6.72026 5.60658 5.98352 5.0038L1.75 1.54001",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2.5",xmlns:"http://www.w3.org/2000/svg"})),tX=new class{constructor(e){for(let[t,n]of(this.listeners=new Set,this.defaultLocale="en",this.enableFallback=!1,this.locale="en",this.cachedLocales=[],this.translations={},Object.entries(e)))this.cachedLocales=[...this.cachedLocales,t],this.translations={...this.translations,...this.flattenTranslation(n,t)}}missingMessage(e){return`[missing: "${this.locale}.${e}" translation]`}flattenTranslation(e,t){let n={},flatten=(e,t)=>{for(let o of Object.keys(e)){let i=`${t}.${o}`,s=e[o];"object"==typeof s&&null!==s?flatten(s,i):n[i]=s}};return flatten(e,t),n}translateWithReplacements(e,t={}){let n=e;for(let e in t){let o=t[e];n=n.replace(`%{${e}}`,o)}return n}t(e,t,n){let o=`${this.locale}.${e}`,i=this.translations[o];if(!i){if(this.enableFallback){let n=`${this.defaultLocale}.${e}`,o=this.translations[n];if(o)return this.translateWithReplacements(o,t)}return(null==n?void 0:n.rawKeyIfTranslationMissing)?e:this.missingMessage(e)}return this.translateWithReplacements(i,t)}isLocaleCached(e){return this.cachedLocales.includes(e)}updateLocale(e){this.locale=e,this.notifyListeners()}setTranslations(e,t){let n=this.isLocaleCached(e);n||(this.cachedLocales=[...this.cachedLocales,e],this.translations={...this.translations,...this.flattenTranslation(t,e)}),this.locale=e,this.notifyListeners()}notifyListeners(){for(let e of this.listeners)e()}onChange(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}}({en:JSON.parse(N.I),"en-US":JSON.parse(N.I)});tX.defaultLocale="en-US",tX.locale="en-US",tX.enableFallback=!0;var fetchTranslations=async e=>{switch(e){case"ar":case"ar-AR":return(await n.e(4507).then(n.bind(n,24507))).default;case"en":case"en-US":default:return(await n.e(3688).then(n.bind(n,93688))).default;case"es":case"es-419":return(await n.e(2499).then(n.bind(n,32499))).default;case"fr":case"fr-FR":return(await n.e(8989).then(n.bind(n,78989))).default;case"hi":case"hi-IN":return(await n.e(9212).then(n.bind(n,19212))).default;case"id":case"id-ID":return(await n.e(2840).then(n.bind(n,52840))).default;case"ja":case"ja-JP":return(await n.e(6210).then(n.bind(n,96210))).default;case"ko":case"ko-KR":return(await n.e(1961).then(n.bind(n,61961))).default;case"pt":case"pt-BR":return(await n.e(5850).then(n.bind(n,75850))).default;case"ru":case"ru-RU":return(await n.e(6626).then(n.bind(n,46626))).default;case"th":case"th-TH":return(await n.e(5515).then(n.bind(n,25515))).default;case"tr":case"tr-TR":return(await n.e(499).then(n.bind(n,60499))).default;case"ua":case"uk-UA":return(await n.e(3760).then(n.bind(n,3760))).default;case"zh":case"zh-CN":return(await n.e(2896).then(n.bind(n,72896))).default}};async function setLocale(e){let t=tX.isLocaleCached(e);if(t){tX.updateLocale(e);return}let n=await fetchTranslations(e);tX.setTranslations(e,JSON.parse(n))}var detectedBrowserLocale=()=>{var e;if("undefined"!=typeof window&&"undefined"!=typeof navigator){if(null==(e=navigator.languages)?void 0:e.length)return navigator.languages[0];if(navigator.language)return navigator.language}},tY=(0,D.createContext)({i18n:tX}),I18nProvider=({children:e,locale:t})=>{let[n,o]=(0,D.useState)(0),i=(0,D.useMemo)(()=>detectedBrowserLocale(),[]);(0,D.useEffect)(()=>{let e=tX.onChange(()=>{o(e=>e+1)});return e},[]),(0,D.useEffect)(()=>{t&&t!==tX.locale?setLocale(t):!t&&i&&i!==tX.locale&&setLocale(i)},[t,i]);let s=(0,D.useMemo)(()=>({t:(e,t)=>tX.t(e,t),i18n:tX}),[n]);return D.createElement(tY.Provider,{value:s},e)};function isNotNullish(e){return null!=e}var t$={iconBackground:"#96bedc",iconUrl:async()=>(await n.e(1727).then(n.bind(n,1727))).default},t0={iconBackground:"#e84141",iconUrl:async()=>(await n.e(6237).then(n.bind(n,36237))).default},t1={iconBackground:"#0052ff",iconUrl:async()=>(await n.e(1711).then(n.bind(n,41711))).default},t6={iconBackground:"#ebac0e",iconUrl:async()=>(await n.e(4253).then(n.bind(n,84253))).default},t3={iconBackground:"#002D74",iconUrl:async()=>(await n.e(5939).then(n.bind(n,95939))).default},t2={iconBackground:"#484c50",iconUrl:async()=>(await n.e(5488).then(n.bind(n,85488))).default},t7={iconBackground:"#ff5a57",iconUrl:async()=>(await n.e(704).then(n.bind(n,60704))).default},t8={iconBackground:"#9f71ec",iconUrl:async()=>(await n.e(8881).then(n.bind(n,48881))).default},t5={iconBackground:"#f9f7ec",iconUrl:async()=>(await n.e(135).then(n.bind(n,70135))).default},t4={iconBackground:"#f9f7ec",iconUrl:async()=>(await n.e(4583).then(n.bind(n,94583))).default},t9={iconBackground:"#000000",iconUrl:async()=>(await n.e(5119).then(n.bind(n,65119))).default},re=Object.fromEntries(Object.values({arbitrum:{chainId:42161,name:"Arbitrum",...t$},arbitrumGoerli:{chainId:421613,...t$},arbitrumSepolia:{chainId:421614,...t$},avalanche:{chainId:43114,...t0},avalancheFuji:{chainId:43113,...t0},base:{chainId:8453,name:"Base",...t1},baseGoerli:{chainId:84531,...t1},baseSepolia:{chainId:84532,...t1},bsc:{chainId:56,name:"BSC",...t6},bscTestnet:{chainId:97,...t6},cronos:{chainId:25,...t3},cronosTestnet:{chainId:338,...t3},goerli:{chainId:5,...t2},hardhat:{chainId:31337,iconBackground:"#f9f7ec",iconUrl:async()=>(await n.e(6253).then(n.bind(n,26253))).default},holesky:{chainId:17e3,...t2},kovan:{chainId:42,...t2},localhost:{chainId:1337,...t2},mainnet:{chainId:1,name:"Ethereum",...t2},optimism:{chainId:10,name:"Optimism",...t7},optimismGoerli:{chainId:420,...t7},optimismKovan:{chainId:69,...t7},optimismSepolia:{chainId:11155420,...t7},polygon:{chainId:137,name:"Polygon",...t8},polygonMumbai:{chainId:80001,...t8},rinkeby:{chainId:4,...t2},ropsten:{chainId:3,...t2},ronin:{chainId:2020,iconBackground:"#1273EA",iconUrl:async()=>(await n.e(1424).then(n.bind(n,81424))).default},sepolia:{chainId:11155111,...t2},xdc:{chainId:50,name:"XinFin",...t5},xdcTestnet:{chainId:51,...t5},zkSync:{chainId:324,name:"zkSync",...t4},zkSyncTestnet:{chainId:280,...t4},zora:{chainId:7777777,name:"Zora",...t9},zoraSepolia:{chainId:999999999,...t9},zoraTestnet:{chainId:999,...t9}}).filter(isNotNullish).map(({chainId:e,...t})=>[e,t])),provideRainbowKitChains=e=>e.map(e=>{var t,n,o,i;let s=null!=(t=re[e.id])?t:{};return{...e,name:null!=(n=s.name)?n:e.name,iconUrl:null!=(o=e.iconUrl)?o:s.iconUrl,iconBackground:null!=(i=e.iconBackground)?i:s.iconBackground}}),rt=(0,D.createContext)({chains:[]});function RainbowKitChainProvider({children:e,initialChain:t}){let{chains:n}=(0,z.Z)();return D.createElement(rt.Provider,{value:(0,D.useMemo)(()=>({chains:provideRainbowKitChains(n),initialChainId:"number"==typeof t?t:null==t?void 0:t.id}),[n,t])},e)}var useRainbowKitChains=()=>(0,D.useContext)(rt).chains,useInitialChainId=()=>(0,D.useContext)(rt).initialChainId,useRainbowKitChainsById=()=>{let e=useRainbowKitChains();return(0,D.useMemo)(()=>{let t={};for(let n of e)t[n.id]=n;return t},[e])},rr=(0,D.createContext)({showBalance:void 0,setShowBalance:()=>{}});function ShowBalanceProvider({children:e}){let[t,n]=(0,D.useState)();return D.createElement(rr.Provider,{value:{showBalance:t,setShowBalance:n}},e)}var useShowBalance=()=>(0,D.useContext)(rr);function useIsMainnetConfigured(){let e=useRainbowKitChains(),t=ex.R.id,n=e.some(e=>e.id===t);return n}function useMainnetEnsAvatar(e){var t;let n=useIsMainnetConfigured(),{data:o}=function(e={}){let{name:t,query:n={}}=e,o=(0,z.Z)(e),i=useChainId(),s=function(e,t={}){return{async queryFn({queryKey:t}){let{name:n,scopeKey:o,...i}=t[1];if(!n)throw Error("name is required");return function(e,t){let{chainId:n,...o}=t,i=e.getClient({chainId:n}),s=(0,K.s)(i,getEnsAvatar,"getEnsAvatar");return s(o)}(e,{...i,name:n})},queryKey:function(e={}){return["ensAvatar",filterQueryOptions(e)]}(t)}}(o,{...e,chainId:e.chainId??i}),l=!!(t&&(n.enabled??!0));return query_useQuery({...n,...s,enabled:l})}({chainId:ex.R.id,name:e?(t=function(e,t,n){if(!e)return[];init();let o=0;return e.split(".").map(e=>{let i=function(e){let t=[];for(let n=0,o=e.length;n0;)if(95!==e[--t])throw Error("underscore allowed only at start")}(f),!(s.emoji=l>1||o[0].is_emoji)&&f.every(e=>e<128))!function(e){if(e.length>=4&&45==e[2]&&45==e[3])throw Error(`invalid label extension: "${str_from_cps(e.slice(0,4))}"`)}(f),e="ASCII";else{let t=o.flatMap(e=>e.is_emoji?[]:e);if(t.length){if(d.has(f[0]))throw error_placement("leading combining mark");for(let e=1;egroup_has_cp(e,n));if(!e.length){if(m.some(e=>group_has_cp(e,n)))throw error_group_member(t[0],n);throw error_disallowed(n)}if(t=e,1==e.length)break}return t}(n);(function(e,t){for(let n of t)if(!group_has_cp(e,n))throw error_group_member(e,n);if(e.M){let e=decomposed(t).map(unpack_cp);for(let t=1,n=e.length;t4)throw Error(`excessive non-spacing marks: ${bidi_qq(safe_str_from_cps(e.slice(t-1,o)))} (${o-t}/4)`);t=o}}})(i,t),function(e,t){let n;let o=[];for(let e of t){let t=g.get(e);if(1===t)return;if(t){let o=t.M.get(e);if(!(n=n?n.filter(e=>o.has(e)):Array_from(o)).length)return}else o.push(e)}if(n){for(let t of n)if(o.every(e=>group_has_cp(t,e)))throw Error(`whole-script confusable: ${e.N}/${t.N}`)}}(i,n),e=i.N}else e="Emoji"}s.type=e}catch(e){s.error=e}return s})}(e,nfc,filter_fe0f)).map(({input:e,error:n,output:o})=>{if(n){let o=n.message;throw Error(1==t.length?o:`Invalid label ${bidi_qq(safe_str_from_cps(e))}: ${o}`)}return str_from_cps(o)}).join("."):void 0,query:{enabled:n}});return o}function useMainnetEnsName(e){let t=useIsMainnetConfigured(),{data:n}=function(e={}){let{address:t,query:n={}}=e,o=(0,z.Z)(e),i=useChainId(),s=function(e,t={}){return{async queryFn({queryKey:t}){let{address:n,scopeKey:o,...i}=t[1];if(!n)throw Error("address is required");return function(e,t){let{chainId:n,...o}=t,i=e.getClient({chainId:n}),s=(0,K.s)(i,getEnsName,"getEnsName");return s(o)}(e,{...i,address:n})},queryKey:function(e={}){return["ensName",filterQueryOptions(e)]}(t)}}(o,{...e,chainId:e.chainId??i}),l=!!(t&&(n.enabled??!0));return query_useQuery({...n,...s,enabled:l})}({chainId:ex.R.id,address:e,query:{enabled:t}});return n}function dist_useChainId(){var e;let{chain:t}=(0,_.m)();return null!=(e=null==t?void 0:t.id)?e:null}var rn="rk-transactions";function loadData(){return function(e){try{let t=e?JSON.parse(e):{};return"object"==typeof t?t:{}}catch{return{}}}("undefined"!=typeof localStorage?localStorage.getItem(rn):null)}var ra=/^0x([A-Fa-f0-9]{64})$/,ro=(0,D.createContext)(null);function TransactionStoreProvider({children:e}){let t=function(e={}){let t=(0,z.Z)(e);return(0,e5.useSyncExternalStoreWithSelector)(e=>(function(e,t){let{onChange:n}=t;return e.subscribe(()=>getPublicClient(e),n,{equalityFn:(e,t)=>e?.uid===t?.uid})})(t,{onChange:e}),()=>getPublicClient(t,e),()=>getPublicClient(t,e),e=>e,(e,t)=>e?.uid===t?.uid)}(),{address:n}=(0,_.m)(),o=dist_useChainId(),[i]=(0,D.useState)(()=>null!=T?T:T=function({provider:e}){let t=loadData(),n=e,o=new Set,i=new Map;function getTransactions(e,n){var o,i;return null!=(i=null==(o=t[e])?void 0:o[n])?i:[]}function setTransactionStatus(e,t,n,o){updateTransactions(e,t,e=>e.map(e=>e.hash===n?{...e,status:o}:e))}async function waitForPendingTransactions(e,t){await Promise.all(getTransactions(e,t).filter(e=>"pending"===e.status).map(async o=>{let{confirmations:s,hash:l}=o,c=i.get(l);if(c)return await c;let u=n.waitForTransactionReceipt({confirmations:s,hash:l,timeout:3e5}).then(({status:n})=>{i.delete(l),void 0!==n&&setTransactionStatus(e,t,l,0===n||"reverted"===n?"failed":"confirmed")}).catch(()=>{setTransactionStatus(e,t,l,"failed")});return i.set(l,u),await u}))}function updateTransactions(e,n,i){var s,l;(t=loadData())[e]=null!=(s=t[e])?s:{};let c=0,u=i(null!=(l=t[e][n])?l:[]).filter(({status:e})=>"pending"===e||c++<=10);t[e][n]=u.length>0?u:void 0,localStorage.setItem(rn,JSON.stringify(t)),function(){for(let e of o)e()}(),waitForPendingTransactions(e,n)}return{addTransaction:function(e,t,n){let o=function(e){let t=[];return ra.test(e.hash)||t.push("Invalid transaction hash"),"string"!=typeof e.description&&t.push("Transaction must have a description"),void 0!==e.confirmations&&(!Number.isInteger(e.confirmations)||e.confirmations<1)&&t.push("Transaction confirmations must be a positiver integer"),t}(n);if(o.length>0)throw Error(["Unable to add transaction",...o].join("\n"));updateTransactions(e,t,e=>[{...n,status:"pending"},...e.filter(({hash:e})=>e!==n.hash)])},clearTransactions:function(e,t){updateTransactions(e,t,()=>[])},getTransactions,onChange:function(e){return o.add(e),()=>{o.delete(e)}},setProvider:function(e){n=e},waitForPendingTransactions}}({provider:t}));return(0,D.useEffect)(()=>{i.setProvider(t)},[i,t]),(0,D.useEffect)(()=>{n&&o&&i.waitForPendingTransactions(n,o)},[i,n,o]),D.createElement(ro.Provider,{value:i},e)}function useTransactionStore(){let e=(0,D.useContext)(ro);if(!e)throw Error("Transaction hooks must be used within RainbowKitProvider");return e}function useRecentTransactions(){let e=useTransactionStore(),{address:t}=(0,_.m)(),n=dist_useChainId(),[o,i]=(0,D.useState)(()=>e&&t&&n?e.getTransactions(t,n):[]);return(0,D.useEffect)(()=>{if(e&&t&&n)return i(e.getTransactions(t,n)),e.onChange(()=>{i(e.getTransactions(t,n))})},[e,t,n]),o}var resolveThemeVars=e=>"function"==typeof e?e():e;function cssStringFromTheme(e,t={}){return Object.entries(function(e,{extends:t}={}){let n={...assignInlineVars(tz,resolveThemeVars(e))};if(!t)return n;let o=assignInlineVars(tz,resolveThemeVars(t)),i=Object.fromEntries(Object.entries(n).filter(([e,t])=>t!==o[e]));return i}(e,t)).map(([e,t])=>`${e}:${t.replace(/[:;{}]/g,"")};`).join("")}var ri={appName:void 0,disclaimer:void 0,learnMoreUrl:"https://learn.rainbow.me/understanding-web3?utm_source=rainbowkit&utm_campaign=learnmore"},rs=(0,D.createContext)(ri),rl=(0,D.createContext)(!1),useWindowSize=()=>{let[e,t]=(0,D.useState)({height:void 0,width:void 0});return(0,D.useEffect)(()=>{var e;let n;let o=(e=()=>{t({height:window.innerHeight,width:window.innerWidth})},()=>{n&&clearTimeout(n),n=setTimeout(()=>{n=null,e()},500)});return window.addEventListener("resize",o),o(),()=>window.removeEventListener("resize",o)},[]),e},rc=(0,D.createContext)({connector:null,setConnector:()=>{}});function WalletButtonProvider({children:e}){let[t,n]=(0,D.useState)(null);return D.createElement(rc.Provider,{value:(0,D.useMemo)(()=>({connector:t,setConnector:n}),[t])},e)}var ru={COMPACT:"compact",WIDE:"wide"},rd=(0,D.createContext)(ru.WIDE);function ModalSizeProvider({children:e,modalSize:t}){let{width:n}=useWindowSize(),{connector:o}=(0,D.useContext)(rc);return D.createElement(rd.Provider,{value:n&&n<768||o?ru.COMPACT:t},e)}var rp=(0,D.createContext)(!1);function isSafari(){return"undefined"!=typeof navigator&&/Version\/([0-9._]+).*Safari/.test(navigator.userAgent)}function getBrowser(){var e;if("undefined"==typeof navigator)return"Browser";let t=navigator.userAgent.toLowerCase();return(null==(e=navigator.brave)?void 0:e.isBrave)?"Brave":t.indexOf("edg/")>-1?"Edge":t.indexOf("op")>-1?"Opera":"undefined"!=typeof document&&""!==getComputedStyle(document.body).getPropertyValue("--arc-palette-focus")?"Arc":t.indexOf("chrome")>-1?"Chrome":t.indexOf("firefox")>-1?"Firefox":isSafari()?"Safari":"Browser"}var{os:rh}=(0,tE.UAParser)();function getPlatform(){return"Windows"===rh.name?"Windows":"Mac OS"===rh.name?"macOS":["Ubuntu","Mint","Fedora","Debian","Arch","Linux"].includes(rh.name)?"Linux":"Desktop"}var getExtensionDownloadUrl=e=>{var t,n,o,i,s,l,c,u,d,p,f,m;let b=getBrowser();return null!=(m=({Arc:null==(t=null==e?void 0:e.downloadUrls)?void 0:t.chrome,Brave:null==(n=null==e?void 0:e.downloadUrls)?void 0:n.chrome,Chrome:null==(o=null==e?void 0:e.downloadUrls)?void 0:o.chrome,Edge:(null==(i=null==e?void 0:e.downloadUrls)?void 0:i.edge)||(null==(s=null==e?void 0:e.downloadUrls)?void 0:s.chrome),Firefox:null==(l=null==e?void 0:e.downloadUrls)?void 0:l.firefox,Opera:(null==(c=null==e?void 0:e.downloadUrls)?void 0:c.opera)||(null==(u=null==e?void 0:e.downloadUrls)?void 0:u.chrome),Safari:null==(d=null==e?void 0:e.downloadUrls)?void 0:d.safari,Browser:null==(p=null==e?void 0:e.downloadUrls)?void 0:p.browserExtension})[b])?m:null==(f=null==e?void 0:e.downloadUrls)?void 0:f.browserExtension},getMobileDownloadUrl=e=>{var t,n,o,i;let s=isIOS();return null!=(i=s?null==(t=null==e?void 0:e.downloadUrls)?void 0:t.ios:null==(n=null==e?void 0:e.downloadUrls)?void 0:n.android)?i:null==(o=null==e?void 0:e.downloadUrls)?void 0:o.mobile},getDesktopDownloadUrl=e=>{var t,n,o,i,s,l;let c=getPlatform();return null!=(l=({Windows:null==(t=null==e?void 0:e.downloadUrls)?void 0:t.windows,macOS:null==(n=null==e?void 0:e.downloadUrls)?void 0:n.macos,Linux:null==(o=null==e?void 0:e.downloadUrls)?void 0:o.linux,Desktop:null==(i=null==e?void 0:e.downloadUrls)?void 0:i.desktop})[c])?l:null==(s=null==e?void 0:e.downloadUrls)?void 0:s.desktop},isRecentWallet=(e,t)=>e.some(e=>e.id===t),isRainbowKitConnector=e=>!!e.isRainbowKitConnector,isEIP6963Connector=e=>{var t;return!!(!e.isRainbowKitConnector&&(null==(t=e.icon)?void 0:t.startsWith("data:image"))&&e.uid&&e.name)},rainbowKitConnectorWithWalletConnect=(e,t)=>{let n="walletConnect"===e.id&&t;return n?{...e,walletConnectModalConnector:t}:e},connectorsWithRecentWallets=({wallets:e,recentWallets:t})=>[...t,...e.filter(e=>!isRecentWallet(t,e.id))],rf="rk-recent";function getRecentWalletIds(){return"undefined"!=typeof localStorage?function(e){try{let t=e?JSON.parse(e):[];return Array.isArray(t)?t:[]}catch{return[]}}(localStorage.getItem(rf)):[]}function useWalletConnectors(e=!1){var t,n,o,i;let s=useRainbowKitChains(),l=useInitialChainId(),{connectAsync:c,connectors:u}=function(e={}){let{mutation:t}=e,n=(0,z.Z)(e),o=function(e={}){let t=(0,z.Z)(e);return(0,D.useSyncExternalStore)(e=>(function(e,t){let{onChange:n}=t;return e._internal.connectors.subscribe((e,t)=>{n(Object.values(e),t)})})(t,{onChange:e}),()=>getConnectors(t),()=>getConnectors(t))}({config:n}),{mutate:i,mutateAsync:s,...l}=(0,e9.D)({...t,mutationFn:e=>connect(n,e),mutationKey:["connect"]});return(0,D.useEffect)(()=>n.subscribe(({status:e})=>e,(e,t)=>{"connected"===t&&"disconnected"===e&&l.reset()}),[n,l]),{...l,connect:i,connectAsync:s,connectors:o}}(),{setIsWalletConnectModalOpen:d}=useWalletConnectOpenState(),p=u.map(e=>({...e,...e.rkDetails||{}}));async function connectWallet(e){var t,n,o;let i=await e.getChainId(),u=await c({chainId:null!=(o=null!=l?l:null==(t=s.find(({id:e})=>e===i))?void 0:t.id)?o:null==(n=s[0])?void 0:n.id,connector:e});return u&&function(e){var t;let n=(t=[e,...getRecentWalletIds()],[...new Set(t)]);localStorage.setItem(rf,JSON.stringify(n))}(e.id),u}async function connectToWalletConnectModal(e){try{d(!0),await connectWallet(e),d(!1)}catch(t){let e="UserRejectedRequestError"===t.name||"Connection request reset. Please try again."===t.message;if(d(!1),!e)throw t}}let getWalletConnectUri=async(e,t)=>{let n=await e.getProvider();return"coinbase"===e.id?n.qrUrl:new Promise(e=>n.once("display_uri",n=>{e(t(n))}))},f=p.find(e=>"walletConnect"===e.id&&e.isWalletConnectModalConnector),m=p.filter(isEIP6963Connector).map(e=>({...e,groupIndex:0})),b=p.filter(isRainbowKitConnector).filter(e=>!e.isWalletConnectModalConnector).filter(t=>{if(!e)return!0;let n=m.some(e=>e.id===t.rdns);return!n}).map(e=>rainbowKitConnectorWithWalletConnect(e,f)),g=[...m,...b],y=function(e,t){let n={};for(let o of e){let e=t(o);e&&(n[e]=o)}return n}(g,e=>e.id),v=getRecentWalletIds().map(e=>y[e]).filter(Boolean).slice(0,3),w=[],C=connectorsWithRecentWallets({wallets:g,recentWallets:v});for(let e of C){if(!e)continue;let s=isEIP6963Connector(e),l=isRecentWallet(v,e.id);if(s){w.push({...e,iconUrl:e.icon,ready:!0,connect:()=>connectWallet(e),groupName:"Installed",recent:l});continue}w.push({...e,ready:null==(t=e.installed)||t,connect:()=>connectWallet(e),desktopDownloadUrl:getDesktopDownloadUrl(e),extensionDownloadUrl:getExtensionDownloadUrl(e),groupName:e.groupName,mobileDownloadUrl:getMobileDownloadUrl(e),getQrCodeUri:(null==(n=e.qrCode)?void 0:n.getUri)?()=>getWalletConnectUri(e,e.qrCode.getUri):void 0,getDesktopUri:(null==(o=e.desktop)?void 0:o.getUri)?()=>getWalletConnectUri(e,e.desktop.getUri):void 0,getMobileUri:(null==(i=e.mobile)?void 0:i.getUri)?()=>{var t;return getWalletConnectUri(e,null==(t=e.mobile)?void 0:t.getUri)}:void 0,recent:l,showWalletConnectModal:e.walletConnectModalConnector?()=>connectToWalletConnectModal(e.walletConnectModalConnector):void 0})}return w}var src=async()=>(await n.e(794).then(n.bind(n,20794))).default,preloadAssetsIcon=()=>loadImages(src),AssetsIcon=()=>D.createElement(AsyncImage,{background:"#d0d5de",borderRadius:"10",height:"48",src,width:"48"}),src2=async()=>(await n.e(3200).then(n.bind(n,3200))).default,preloadLoginIcon=()=>loadImages(src2),LoginIcon=()=>D.createElement(AsyncImage,{background:"#d0d5de",borderRadius:"10",height:"48",src:src2,width:"48"}),rm=D.forwardRef(({as:e="div",children:t,className:n,color:o,display:i,font:s="body",id:l,size:c="16",style:u,tabIndex:d,textAlign:p="inherit",weight:f="regular",testId:m},b)=>D.createElement(tQ,{as:e,className:n,color:o,display:i,fontFamily:s,fontSize:c,fontWeight:f,id:l,ref:b,style:u,tabIndex:d,textAlign:p,testId:m},t));rm.displayName="Text";var rb={large:{fontSize:"16",paddingX:"24",paddingY:"10"},medium:{fontSize:"14",height:"28",paddingX:"12",paddingY:"4"},small:{fontSize:"14",paddingX:"10",paddingY:"5"}};function ActionButton({disabled:e=!1,href:t,label:n,onClick:o,rel:i="noreferrer noopener",size:s="medium",target:l="_blank",testId:c,type:u="primary"}){let d="primary"===u,p="large"!==s,f=isMobile(),m=e?"actionButtonSecondaryBackground":d?"accentColor":p?"actionButtonSecondaryBackground":null,{fontSize:b,height:g,paddingX:y,paddingY:v}=rb[s];return D.createElement(tQ,{...t?e?{}:{as:"a",href:t,rel:i,target:l}:{as:"button",type:"button"},onClick:e?void 0:o,...f&&p?{}:{borderColor:!f||p||d?"actionButtonBorder":"actionButtonBorderMobile",borderStyle:"solid",borderWidth:"1"},borderRadius:"actionButton",className:!e&&touchableStyles({active:"shrinkSm",hover:"grow"}),display:"block",paddingX:y,paddingY:v,style:{willChange:"transform"},testId:c,textAlign:"center",transition:"transform",...m?{background:m}:{},...g?{height:g}:{}},D.createElement(rm,{color:e?"modalTextSecondary":d?"accentColorForeground":"accentColor",size:b,weight:"bold"},n))}var CloseIcon=()=>isMobile()?D.createElement("svg",{"aria-hidden":!0,fill:"none",height:"11.5",viewBox:"0 0 11.5 11.5",width:"11.5",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Close"),D.createElement("path",{d:"M2.13388 0.366117C1.64573 -0.122039 0.854272 -0.122039 0.366117 0.366117C-0.122039 0.854272 -0.122039 1.64573 0.366117 2.13388L3.98223 5.75L0.366117 9.36612C-0.122039 9.85427 -0.122039 10.6457 0.366117 11.1339C0.854272 11.622 1.64573 11.622 2.13388 11.1339L5.75 7.51777L9.36612 11.1339C9.85427 11.622 10.6457 11.622 11.1339 11.1339C11.622 10.6457 11.622 9.85427 11.1339 9.36612L7.51777 5.75L11.1339 2.13388C11.622 1.64573 11.622 0.854272 11.1339 0.366117C10.6457 -0.122039 9.85427 -0.122039 9.36612 0.366117L5.75 3.98223L2.13388 0.366117Z",fill:"currentColor"})):D.createElement("svg",{"aria-hidden":!0,fill:"none",height:"10",viewBox:"0 0 10 10",width:"10",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Close"),D.createElement("path",{d:"M1.70711 0.292893C1.31658 -0.0976311 0.683417 -0.0976311 0.292893 0.292893C-0.0976311 0.683417 -0.0976311 1.31658 0.292893 1.70711L3.58579 5L0.292893 8.29289C-0.0976311 8.68342 -0.0976311 9.31658 0.292893 9.70711C0.683417 10.0976 1.31658 10.0976 1.70711 9.70711L5 6.41421L8.29289 9.70711C8.68342 10.0976 9.31658 10.0976 9.70711 9.70711C10.0976 9.31658 10.0976 8.68342 9.70711 8.29289L6.41421 5L9.70711 1.70711C10.0976 1.31658 10.0976 0.683417 9.70711 0.292893C9.31658 -0.0976311 8.68342 -0.0976311 8.29289 0.292893L5 3.58579L1.70711 0.292893Z",fill:"currentColor"})),CloseButton=({"aria-label":e="Close",onClose:t})=>{let n=isMobile();return D.createElement(tQ,{alignItems:"center","aria-label":e,as:"button",background:"closeButtonBackground",borderColor:"actionButtonBorder",borderRadius:"full",borderStyle:"solid",borderWidth:n?"0":"1",className:touchableStyles({active:"shrinkSm",hover:"growLg"}),color:"closeButton",display:"flex",height:n?"30":"28",justifyContent:"center",onClick:t,style:{willChange:"transform"},transition:"default",type:"button",width:n?"30":"28"},D.createElement(CloseIcon,null))},signInIcon=async()=>(await n.e(2898).then(n.bind(n,92898))).default;function SignIn({onClose:e,onCloseModal:t}){let{i18n:n}=(0,D.useContext)(tY),[{status:o,...i},s]=D.useState({status:"idle"}),l=function(){var e;let{adapter:t}=null!=(e=(0,D.useContext)(tW))?e:{};if(!t)throw Error("No authentication adapter found");return t}(),c=(0,D.useCallback)(async()=>{try{let e=await l.getNonce();s(t=>({...t,nonce:e}))}catch{s(e=>({...e,errorMessage:n.t("sign_in.message.preparing_error"),status:"idle"}))}},[l,n.t]),u=(0,D.useRef)(!1);D.useEffect(()=>{u.current||(u.current=!0,c())},[c]);let d=isMobile(),{address:p,chain:f}=(0,_.m)(),{signMessageAsync:m}=(0,tx.Q)(),signIn=async()=>{try{let e;let o=null==f?void 0:f.id,{nonce:c}=i;if(!p||!o||!c)return;s(e=>({...e,errorMessage:void 0,status:"signing"}));let u=l.createMessage({address:p,chainId:o,nonce:c});try{e=await m({message:l.getMessageBody({message:u})})}catch(e){if(e instanceof et.ab)return s(e=>({...e,status:"idle"}));return s(e=>({...e,errorMessage:n.t("sign_in.signature.signing_error"),status:"idle"}))}s(e=>({...e,status:"verifying"}));try{let n=await l.verify({message:u,signature:e});if(n){t();return}throw Error()}catch{return s(e=>({...e,errorMessage:n.t("sign_in.signature.verifying_error"),status:"idle"}))}}catch{s({errorMessage:n.t("sign_in.signature.oops_error"),status:"idle"})}};return D.createElement(tQ,{position:"relative"},D.createElement(tQ,{display:"flex",paddingRight:"16",paddingTop:"16",position:"absolute",right:"0"},D.createElement(CloseButton,{onClose:e})),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:d?"32":"24",padding:"24",paddingX:"18",style:{paddingTop:d?"60px":"36px"}},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:d?"6":"4",style:{maxWidth:d?320:280}},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:d?"32":"16"},D.createElement(AsyncImage,{height:40,src:signInIcon,width:40}),D.createElement(rm,{color:"modalText",size:d?"20":"18",textAlign:"center",weight:"heavy"},n.t("sign_in.label"))),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:d?"16":"12"},D.createElement(rm,{color:"modalTextSecondary",size:d?"16":"14",textAlign:"center"},n.t("sign_in.description")),"idle"===o&&i.errorMessage?D.createElement(rm,{color:"error",size:d?"16":"14",textAlign:"center",weight:"bold"},i.errorMessage):null)),D.createElement(tQ,{alignItems:d?void 0:"center",display:"flex",flexDirection:"column",gap:"8",width:"full"},D.createElement(ActionButton,{disabled:!i.nonce||"signing"===o||"verifying"===o,label:i.nonce?"signing"===o?n.t("sign_in.signature.waiting"):"verifying"===o?n.t("sign_in.signature.verifying"):n.t("sign_in.message.send"):n.t("sign_in.message.preparing"),onClick:signIn,size:d?"large":"medium",testId:"auth-message-button"}),d?D.createElement(ActionButton,{label:"Cancel",onClick:e,size:"large",type:"secondary"}):D.createElement(tQ,{as:"button",borderRadius:"full",className:touchableStyles({active:"shrink",hover:"grow"}),display:"block",onClick:e,paddingX:"10",paddingY:"5",rel:"noreferrer",style:{willChange:"transform"},target:"_blank",transition:"default"},D.createElement(rm,{color:"closeButton",size:d?"16":"14",weight:"bold"},n.t("sign_in.message.cancel"))))))}var rg="WALLETCONNECT_DEEPLINK_CHOICE";function clearWalletConnectDeepLink(){localStorage.removeItem(rg)}var ry=(0,D.createContext)(void 0),rv="data-rk",createThemeRootProps=e=>({[rv]:e||""}),createThemeRootSelector=e=>{if(e&&!/^[a-zA-Z0-9_]+$/.test(e))throw Error(`Invalid ID: ${e}`);return e?`[${rv}="${e}"]`:`[${rv}]`},useThemeRootProps=()=>{let e=(0,D.useContext)(ry);return createThemeRootProps(e)},rw=lightTheme();function RainbowKitProvider({appInfo:e,avatar:t,children:n,coolMode:o=!1,id:i,initialChain:s,locale:l,modalSize:c=ru.WIDE,showRecentTransactions:u=!1,theme:d=rw}){if(!function(){let e=useRainbowKitChains(),t=useWalletConnectors(),n="unauthenticated"===useAuthenticationStatus(),o=(0,D.useCallback)(()=>{loadImages(...t.map(e=>e.iconUrl),...e.map(e=>e.iconUrl).filter(isNotNullish)),isMobile()||(preloadAssetsIcon(),preloadLoginIcon()),n&&loadImages(signInIcon)},[t,e,n]);(0,D.useEffect)(()=>{o()},[o])}(),!function(){let e=(0,D.useCallback)(()=>{!function({version:e}){localStorage.setItem("rk-version",e)}({version:"2.0.2"})},[]);(0,D.useEffect)(()=>{e()},[e])}(),useAccountEffect_useAccountEffect({onDisconnect:clearWalletConnectDeepLink}),"function"==typeof d)throw Error('A theme function was provided to the "theme" prop instead of a theme object. You must execute this function to get the resulting theme object.');let p=createThemeRootSelector(i),f={...ri,...e},m=null!=t?t:defaultAvatar;return D.createElement(RainbowKitChainProvider,{initialChain:s},D.createElement(WalletButtonProvider,null,D.createElement(I18nProvider,{locale:l},D.createElement(rl.Provider,{value:o},D.createElement(ModalSizeProvider,{modalSize:c},D.createElement(rp.Provider,{value:u},D.createElement(TransactionStoreProvider,null,D.createElement(tJ.Provider,{value:m},D.createElement(rs.Provider,{value:f},D.createElement(ry.Provider,{value:i},D.createElement(ShowBalanceProvider,null,D.createElement(ModalProvider,null,d?D.createElement("div",{...createThemeRootProps(i)},D.createElement("style",{dangerouslySetInnerHTML:{__html:[`${p}{${cssStringFromTheme("lightMode"in d?d.lightMode:d)}}`,"darkMode"in d?`@media(prefers-color-scheme:dark){${p}{${cssStringFromTheme(d.darkMode,{extends:d.lightMode})}}}`:null].join("")}}),n):n))))))))))))}var moveFocusWithin=(e,t)=>{let n=e.querySelectorAll("button:not(:disabled), a[href]");0!==n.length&&n["end"===t?n.length-1:0].focus()};function FocusTrap(e){let t=(0,D.useRef)(null);return(0,D.useEffect)(()=>{let e=document.activeElement;return()=>{var t;null==(t=e.focus)||t.call(e)}},[]),(0,D.useEffect)(()=>{if(t.current){let e=t.current.querySelector("[data-auto-focus]");e?e.focus():t.current.focus()}},[]),D.createElement(D.Fragment,null,D.createElement("div",{onFocus:(0,D.useCallback)(()=>t.current&&moveFocusWithin(t.current,"end"),[]),tabIndex:0}),D.createElement("div",{ref:t,style:{outline:"none"},tabIndex:-1,...e}),D.createElement("div",{onFocus:(0,D.useCallback)(()=>t.current&&moveFocusWithin(t.current,"start"),[]),tabIndex:0}))}var stopPropagation=e=>e.stopPropagation();function Dialog({children:e,onClose:t,open:n,titleId:o}){(0,D.useEffect)(()=>{let handleEscape=e=>n&&"Escape"===e.key&&t();return document.addEventListener("keydown",handleEscape),()=>document.removeEventListener("keydown",handleEscape)},[n,t]);let[i,s]=(0,D.useState)(!0);(0,D.useEffect)(()=>{s("hidden"!==getComputedStyle(window.document.body).overflow)},[]);let l=(0,D.useCallback)(()=>t(),[t]),c=useThemeRootProps(),u=isMobile();return D.createElement(D.Fragment,null,n?(0,tr.createPortal)(D.createElement(tv,{enabled:i},D.createElement(tQ,{...c},D.createElement(tQ,{...c,alignItems:u?"flex-end":"center","aria-labelledby":o,"aria-modal":!0,className:"_9pm4ki3 ju367v9h ju367vb3 ju367va ju367v2q ju367v8q",onClick:l,position:"fixed",role:"dialog"},D.createElement(FocusTrap,{className:"_9pm4ki5 ju367va ju367v15 ju367v8r",onClick:stopPropagation,role:"document"},e)))),document.body):null)}function DialogContent({bottomSheetOnMobile:e=!1,children:t,marginTop:n,padding:o="16",paddingBottom:i,wide:s=!1}){let l=isMobile(),c=(0,D.useContext)(rd),u=c===ru.COMPACT;return D.createElement(tQ,{marginTop:n},D.createElement(tQ,{className:[s?l?"_1ckjpok2 _1ckjpok1 ju367vb6 ju367vdr ju367vp ju367vt ju367vv ju367vel ju367va ju367v15 ju367v6c ju367v8r":u?"_1ckjpok4 _1ckjpok1 ju367vb6 ju367vdr ju367vp ju367vt ju367vv ju367vel ju367va ju367v15 ju367v6c ju367v8r":"_1ckjpok3 _1ckjpok1 ju367vb6 ju367vdr ju367vp ju367vt ju367vv ju367vel ju367va ju367v15 ju367v6c ju367v8r":"_1ckjpok1 ju367vb6 ju367vdr ju367vp ju367vt ju367vv ju367vel ju367va ju367v15 ju367v6c ju367v8r",l?"_1ckjpok6 ju367vq":null,l&&e?"_1ckjpok7":null].join(" ")},D.createElement(tQ,{padding:o,paddingBottom:null!=i?i:o},t)))}var rC=["k","m","b","t"];function toPrecision(e,t=1){return e.toString().replace(RegExp(`(.+\\.\\d{${t}})\\d+`),"$1").replace(/(\.[1-9]*)0+$/,"$1").replace(/\.$/,"")}function abbreviateETHBalance(e){if(e<1)return toPrecision(e,3);if(e<100)return toPrecision(e,2);if(e<1e4)return new Intl.NumberFormat().format(parseFloat(toPrecision(e,1)));let t=String(e);for(let n=rC.length-1;n>=0;n--){let o=10**((n+1)*3);if(o<=e){t=toPrecision(e=10*e/o/10,1)+rC[n];break}}return t}function formatAddress(e){return e.length<8?e:`${e.substring(0,4)}\u2026${e.substring(e.length-4)}`}function formatENS(e){if(!e)return"";let t=e.split("."),n=t.pop();return t.join(".").length>24?`${t.join(".").substring(0,24)}...`:`${t.join(".")}.${n}`}var CopiedIcon=()=>D.createElement("svg",{fill:"none",height:"13",viewBox:"0 0 13 13",width:"13",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Copied"),D.createElement("path",{d:"M4.94568 12.2646C5.41052 12.2646 5.77283 12.0869 6.01892 11.7109L12.39 1.96973C12.5677 1.69629 12.6429 1.44336 12.6429 1.2041C12.6429 0.561523 12.1644 0.0966797 11.5082 0.0966797C11.057 0.0966797 10.7767 0.260742 10.5033 0.691406L4.9115 9.50977L2.07458 5.98926C1.82166 5.68848 1.54822 5.55176 1.16541 5.55176C0.502319 5.55176 0.0238037 6.02344 0.0238037 6.66602C0.0238037 6.95312 0.112671 7.20605 0.358765 7.48633L3.88611 11.7588C4.18005 12.1074 4.50818 12.2646 4.94568 12.2646Z",fill:"currentColor"})),CopyIcon=()=>D.createElement("svg",{fill:"none",height:"16",viewBox:"0 0 17 16",width:"17",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Copy"),D.createElement("path",{d:"M3.04236 12.3027H4.18396V13.3008C4.18396 14.8525 5.03845 15.7002 6.59705 15.7002H13.6244C15.183 15.7002 16.0375 14.8525 16.0375 13.3008V6.24609C16.0375 4.69434 15.183 3.84668 13.6244 3.84668H12.4828V2.8418C12.4828 1.29688 11.6283 0.442383 10.0697 0.442383H3.04236C1.48376 0.442383 0.629272 1.29004 0.629272 2.8418V9.90332C0.629272 11.4551 1.48376 12.3027 3.04236 12.3027ZM3.23376 10.5391C2.68689 10.5391 2.39294 10.2656 2.39294 9.68457V3.06055C2.39294 2.47949 2.68689 2.21289 3.23376 2.21289H9.8783C10.4252 2.21289 10.7191 2.47949 10.7191 3.06055V3.84668H6.59705C5.03845 3.84668 4.18396 4.69434 4.18396 6.24609V10.5391H3.23376ZM6.78845 13.9365C6.24158 13.9365 5.94763 13.6699 5.94763 13.0889V6.45801C5.94763 5.87695 6.24158 5.61035 6.78845 5.61035H13.433C13.9799 5.61035 14.2738 5.87695 14.2738 6.45801V13.0889C14.2738 13.6699 13.9799 13.9365 13.433 13.9365H6.78845Z",fill:"currentColor"})),DisconnectIcon=()=>D.createElement("svg",{fill:"none",height:"16",viewBox:"0 0 18 16",width:"18",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Disconnect"),D.createElement("path",{d:"M2.67834 15.5908H9.99963C11.5514 15.5908 12.399 14.7432 12.399 13.1777V10.2656H10.6354V12.9863C10.6354 13.5332 10.3688 13.8271 9.78772 13.8271H2.89026C2.3092 13.8271 2.0426 13.5332 2.0426 12.9863V3.15625C2.0426 2.60254 2.3092 2.30859 2.89026 2.30859H9.78772C10.3688 2.30859 10.6354 2.60254 10.6354 3.15625V5.89746H12.399V2.95801C12.399 1.39941 11.5514 0.544922 9.99963 0.544922H2.67834C1.12659 0.544922 0.278931 1.39941 0.278931 2.95801V13.1777C0.278931 14.7432 1.12659 15.5908 2.67834 15.5908ZM7.43616 8.85059H14.0875L15.0924 8.78906L14.566 9.14453L13.6842 9.96484C13.5406 10.1016 13.4586 10.2861 13.4586 10.4844C13.4586 10.8398 13.7321 11.168 14.1217 11.168C14.3199 11.168 14.4635 11.0928 14.6002 10.9561L16.7809 8.68652C16.986 8.48145 17.0543 8.27637 17.0543 8.06445C17.0543 7.85254 16.986 7.64746 16.7809 7.43555L14.6002 5.17285C14.4635 5.03613 14.3199 4.9541 14.1217 4.9541C13.7321 4.9541 13.4586 5.27539 13.4586 5.6377C13.4586 5.83594 13.5406 6.02734 13.6842 6.15723L14.566 6.98438L15.0924 7.33984L14.0875 7.27148H7.43616C7.01917 7.27148 6.65686 7.62012 6.65686 8.06445C6.65686 8.50195 7.01917 8.85059 7.43616 8.85059Z",fill:"currentColor"})),chainToExplorerUrl=e=>{var t,n;return null==(n=null==(t=null==e?void 0:e.blockExplorers)?void 0:t.default)?void 0:n.url},ExternalLinkIcon=()=>D.createElement("svg",{fill:"none",height:"19",viewBox:"0 0 20 19",width:"20",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Link"),D.createElement("path",{d:"M10 18.9443C15.0977 18.9443 19.2812 14.752 19.2812 9.6543C19.2812 4.56543 15.0889 0.373047 10 0.373047C4.90234 0.373047 0.71875 4.56543 0.71875 9.6543C0.71875 14.752 4.91113 18.9443 10 18.9443ZM10 16.6328C6.1416 16.6328 3.03906 13.5215 3.03906 9.6543C3.03906 5.7959 6.13281 2.68457 10 2.68457C13.8584 2.68457 16.9697 5.7959 16.9697 9.6543C16.9785 13.5215 13.8672 16.6328 10 16.6328ZM12.7158 12.1416C13.2432 12.1416 13.5684 11.7549 13.5684 11.1836V7.19336C13.5684 6.44629 13.1377 6.05957 12.417 6.05957H8.40918C7.8291 6.05957 7.45117 6.38477 7.45117 6.91211C7.45117 7.43945 7.8291 7.77344 8.40918 7.77344H9.69238L10.7207 7.63281L9.53418 8.67871L6.73047 11.4912C6.53711 11.6758 6.41406 11.9395 6.41406 12.2031C6.41406 12.7832 6.85352 13.1699 7.39844 13.1699C7.68848 13.1699 7.92578 13.0732 8.1543 12.8623L10.9316 10.0762L11.9775 8.89844L11.8545 9.98828V11.1836C11.8545 11.7725 12.1885 12.1416 12.7158 12.1416Z",fill:"currentColor"})),CancelIcon=()=>D.createElement("svg",{fill:"none",height:"19",viewBox:"0 0 20 19",width:"20",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Cancel"),D.createElement("path",{d:"M10 18.9443C15.0977 18.9443 19.2812 14.752 19.2812 9.6543C19.2812 4.56543 15.0889 0.373047 10 0.373047C4.90234 0.373047 0.71875 4.56543 0.71875 9.6543C0.71875 14.752 4.91113 18.9443 10 18.9443ZM10 16.6328C6.1416 16.6328 3.03906 13.5215 3.03906 9.6543C3.03906 5.7959 6.13281 2.68457 10 2.68457C13.8584 2.68457 16.9697 5.7959 16.9697 9.6543C16.9785 13.5215 13.8672 16.6328 10 16.6328ZM7.29297 13.3018C7.58301 13.3018 7.81152 13.2139 7.99609 13.0205L10 11.0166L12.0127 13.0205C12.1973 13.2051 12.4258 13.3018 12.707 13.3018C13.2432 13.3018 13.6562 12.8887 13.6562 12.3525C13.6562 12.0977 13.5508 11.8691 13.3662 11.6934L11.3535 9.67188L13.375 7.6416C13.5596 7.44824 13.6562 7.22852 13.6562 6.98242C13.6562 6.44629 13.2432 6.0332 12.7158 6.0332C12.4346 6.0332 12.2148 6.12109 12.0215 6.31445L10 8.32715L7.9873 6.32324C7.80273 6.12988 7.58301 6.04199 7.29297 6.04199C6.76562 6.04199 6.35254 6.45508 6.35254 6.99121C6.35254 7.2373 6.44922 7.46582 6.63379 7.6416L8.65527 9.67188L6.63379 11.6934C6.44922 11.8691 6.35254 12.1064 6.35254 12.3525C6.35254 12.8887 6.76562 13.3018 7.29297 13.3018Z",fill:"currentColor"})),SuccessIcon=()=>D.createElement("svg",{fill:"none",height:"20",viewBox:"0 0 20 20",width:"20",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Success"),D.createElement("path",{d:"M10 19.4443C15.0977 19.4443 19.2812 15.252 19.2812 10.1543C19.2812 5.06543 15.0889 0.873047 10 0.873047C4.90234 0.873047 0.71875 5.06543 0.71875 10.1543C0.71875 15.252 4.91113 19.4443 10 19.4443ZM10 17.1328C6.1416 17.1328 3.03906 14.0215 3.03906 10.1543C3.03906 6.2959 6.13281 3.18457 10 3.18457C13.8584 3.18457 16.9697 6.2959 16.9697 10.1543C16.9785 14.0215 13.8672 17.1328 10 17.1328ZM9.07715 14.3379C9.4375 14.3379 9.7627 14.1533 9.97363 13.8369L13.7441 8.00977C13.8848 7.79883 13.9814 7.5791 13.9814 7.36816C13.9814 6.84961 13.5244 6.48926 13.0322 6.48926C12.707 6.48926 12.4258 6.66504 12.2148 7.0166L9.05957 12.0967L7.5918 10.2949C7.37207 10.0225 7.13477 9.9082 6.84473 9.9082C6.33496 9.9082 5.92188 10.3125 5.92188 10.8223C5.92188 11.0684 6.00098 11.2793 6.18555 11.5078L8.1543 13.8545C8.40918 14.1709 8.70801 14.3379 9.07715 14.3379Z",fill:"currentColor"})),getTxStatusIcon=e=>{switch(e){case"pending":default:return SpinnerIcon;case"confirmed":return SuccessIcon;case"failed":return CancelIcon}};function TxItem({tx:e}){let t=isMobile(),n=getTxStatusIcon(e.status),o="failed"===e.status?"error":"accentColor",{chain:i}=(0,_.m)(),s="confirmed"===e.status?"Confirmed":"failed"===e.status?"Failed":"Pending",l=chainToExplorerUrl(i);return D.createElement(D.Fragment,null,D.createElement(tQ,{...l?{as:"a",background:{hover:"profileForeground"},borderRadius:"menuButton",className:touchableStyles({active:"shrink"}),href:`${l}/tx/${e.hash}`,rel:"noreferrer noopener",target:"_blank",transition:"default"}:{},color:"modalText",display:"flex",flexDirection:"row",justifyContent:"space-between",padding:"8",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:t?"16":"14"},D.createElement(tQ,{color:o},D.createElement(n,null)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:t?"3":"1"},D.createElement(tQ,null,D.createElement(rm,{color:"modalText",font:"body",size:t?"16":"14",weight:"bold"},null==e?void 0:e.description)),D.createElement(tQ,null,D.createElement(rm,{color:"pending"===e.status?"modalTextSecondary":o,font:"body",size:"14",weight:t?"medium":"regular"},s)))),l&&D.createElement(tQ,{alignItems:"center",color:"modalTextDim",display:"flex"},D.createElement(ExternalLinkIcon,null))))}function TxList({address:e}){let t=useRecentTransactions(),n=function(){let e=useTransactionStore(),{address:t}=(0,_.m)(),n=dist_useChainId();return(0,D.useCallback)(()=>{if(!t||!n)throw Error("No address or chain ID found");e.clearTransactions(t,n)},[e,t,n])}(),{chain:o}=(0,_.m)(),i=chainToExplorerUrl(o),s=t.slice(0,3),l=s.length>0,c=isMobile(),{appName:u}=(0,D.useContext)(rs),{i18n:d}=(0,D.useContext)(tY);return D.createElement(D.Fragment,null,D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"10",paddingBottom:"2",paddingTop:"16",paddingX:c?"8":"18"},l&&D.createElement(tQ,{paddingBottom:c?"4":"0",paddingTop:"8",paddingX:c?"12":"6"},D.createElement(tQ,{display:"flex",justifyContent:"space-between"},D.createElement(rm,{color:"modalTextSecondary",size:c?"16":"14",weight:"semibold"},d.t("profile.transactions.recent.title")),D.createElement(tQ,{style:{marginBottom:-6,marginLeft:-10,marginRight:-10,marginTop:-6}},D.createElement(tQ,{as:"button",background:{hover:"profileForeground"},borderRadius:"actionButton",className:touchableStyles({active:"shrink"}),onClick:n,paddingX:c?"8":"12",paddingY:c?"4":"5",transition:"default",type:"button"},D.createElement(rm,{color:"modalTextSecondary",size:c?"16":"14",weight:"semibold"},d.t("profile.transactions.clear.label")))))),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},l?s.map(e=>D.createElement(TxItem,{key:e.hash,tx:e})):D.createElement(D.Fragment,null,D.createElement(tQ,{padding:c?"12":"8"},D.createElement(rm,{color:"modalTextDim",size:c?"16":"14",weight:c?"medium":"bold"},u?d.t("profile.transactions.description",{appName:u}):d.t("profile.transactions.description_fallback"))),c&&D.createElement(tQ,{background:"generalBorderDim",height:"1",marginX:"12",marginY:"8"})))),i&&D.createElement(tQ,{paddingBottom:"18",paddingX:c?"8":"18"},D.createElement(tQ,{alignItems:"center",as:"a",background:{hover:"profileForeground"},borderRadius:"menuButton",className:touchableStyles({active:"shrink"}),color:"modalTextDim",display:"flex",flexDirection:"row",href:`${i}/address/${e}`,justifyContent:"space-between",paddingX:"8",paddingY:"12",rel:"noreferrer noopener",style:{willChange:"transform"},target:"_blank",transition:"default",width:"full",...c?{paddingLeft:"12"}:{}},D.createElement(rm,{color:"modalText",font:"body",size:c?"16":"14",weight:c?"semibold":"bold"},d.t("profile.explorer.label")),D.createElement(ExternalLinkIcon,null))))}function ProfileDetailsAction({action:e,icon:t,label:n,testId:o,url:i}){let s=isMobile();return D.createElement(tQ,{...i?{as:"a",href:i,rel:"noreferrer noopener",target:"_blank"}:{as:"button",type:"button"},background:{base:"profileAction",...s?{}:{hover:"profileActionHover"}},borderRadius:"menuButton",boxShadow:"profileDetailsAction",className:touchableStyles({active:"shrinkSm",hover:s?void 0:"grow"}),display:"flex",onClick:e,padding:s?"6":"8",style:{willChange:"transform"},testId:o,transition:"default",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"1",justifyContent:"center",paddingTop:"2",width:"full"},D.createElement(tQ,{color:"modalText",height:"max"},t),D.createElement(tQ,null,D.createElement(rm,{color:"modalText",size:s?"12":"13",weight:"semibold"},n))))}function ProfileDetails({address:e,ensAvatar:t,ensName:n,onClose:o,onDisconnect:i}){let s=(0,D.useContext)(rp),{data:l}=useBalance({address:e}),[c,u]=(0,D.useState)(!1),d=(0,D.useCallback)(()=>{e&&(navigator.clipboard.writeText(e),u(!0))},[e]);if((0,D.useEffect)(()=>{if(c){let e=setTimeout(()=>{u(!1)},1500);return()=>clearTimeout(e)}},[c]),!e)return null;let p=n?formatENS(n):formatAddress(e),f=null==l?void 0:l.formatted,m=f?abbreviateETHBalance(parseFloat(f)):void 0,b="rk_profile_title",g=isMobile(),{i18n:y}=(0,D.useContext)(tY);return D.createElement(D.Fragment,null,D.createElement(tQ,{display:"flex",flexDirection:"column"},D.createElement(tQ,{background:"profileForeground",padding:"16"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:g?"16":"12",justifyContent:"center",margin:"8",style:{textAlign:"center"}},D.createElement(tQ,{style:{position:"absolute",right:16,top:16,willChange:"transform"}},D.createElement(CloseButton,{onClose:o}))," ",D.createElement(tQ,{marginTop:g?"24":"0"},D.createElement(Avatar,{address:e,imageUrl:t,size:g?82:74})),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:g?"4":"0",textAlign:"center"},D.createElement(tQ,{textAlign:"center"},D.createElement(rm,{as:"h1",color:"modalText",id:b,size:g?"20":"18",weight:"heavy"},p)),!!l&&D.createElement(tQ,{textAlign:"center"},D.createElement(rm,{as:"h1",color:"modalTextSecondary",id:b,size:g?"16":"14",weight:"semibold"},m," ",l.symbol)))),D.createElement(tQ,{display:"flex",flexDirection:"row",gap:"8",margin:"2",marginTop:"16"},D.createElement(ProfileDetailsAction,{action:d,icon:c?D.createElement(CopiedIcon,null):D.createElement(CopyIcon,null),label:c?y.t("profile.copy_address.copied"):y.t("profile.copy_address.label")}),D.createElement(ProfileDetailsAction,{action:i,icon:D.createElement(DisconnectIcon,null),label:y.t("profile.disconnect.label"),testId:"disconnect-button"}))),s&&D.createElement(D.Fragment,null,D.createElement(tQ,{background:"generalBorder",height:"1",marginTop:"-1"}),D.createElement(tQ,null,D.createElement(TxList,{address:e})))))}function AccountModal({onClose:e,open:t}){let{address:n}=(0,_.m)(),o=useMainnetEnsName(n),i=useMainnetEnsAvatar(o),{disconnect:s}=useDisconnect();return n?D.createElement(D.Fragment,null,n&&D.createElement(Dialog,{onClose:e,open:t,titleId:"rk_account_modal_title"},D.createElement(DialogContent,{bottomSheetOnMobile:!0,padding:"0"},D.createElement(ProfileDetails,{address:n,ensAvatar:i,ensName:o,onClose:e,onDisconnect:s})))):null}var DisconnectSqIcon=({size:e})=>D.createElement("svg",{fill:"none",height:e,viewBox:"0 0 28 28",width:e,xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Disconnect"),D.createElement("path",{d:"M6.742 22.195h8.367c1.774 0 2.743-.968 2.743-2.758V16.11h-2.016v3.11c0 .625-.305.96-.969.96H6.984c-.664 0-.968-.335-.968-.96V7.984c0-.632.304-.968.968-.968h7.883c.664 0 .969.336.969.968v3.133h2.016v-3.36c0-1.78-.97-2.757-2.743-2.757H6.742C4.97 5 4 5.977 4 7.758v11.68c0 1.789.969 2.757 2.742 2.757Zm5.438-7.703h7.601l1.149-.07-.602.406-1.008.938a.816.816 0 0 0-.258.593c0 .407.313.782.758.782.227 0 .39-.086.547-.243l2.492-2.593c.235-.235.313-.47.313-.711 0-.242-.078-.477-.313-.719l-2.492-2.586c-.156-.156-.32-.25-.547-.25-.445 0-.758.367-.758.781 0 .227.094.446.258.594l1.008.945.602.407-1.149-.079H12.18a.904.904 0 0 0 0 1.805Z",fill:"currentColor"})),rE=D.forwardRef(({children:e,currentlySelected:t=!1,onClick:n,testId:o,...i},s)=>{let l=isMobile();return D.createElement(tQ,{as:"button",borderRadius:"menuButton",disabled:t,display:"flex",onClick:n,ref:s,testId:o,type:"button"},D.createElement(tQ,{borderRadius:"menuButton",className:[l?"v9horb0":void 0,!t&&touchableStyles({active:"shrink"})],padding:l?"8":"6",transition:"default",width:"full",...t?{background:"accentColor",borderColor:"selectedOptionBorder",borderStyle:"solid",borderWidth:"1",boxShadow:"selectedOption",color:"accentColorForeground"}:{background:{hover:"menuItemBackground"},color:"modalText",transition:"default"},...i},e))});rE.displayName="MenuButton";var Chain_default=({chainId:e,currentChainId:t,switchChain:n,chainIconSize:o,isLoading:i,src:s,name:l,iconBackground:c,idx:u})=>{let d=isMobile(),{i18n:p}=(0,D.useContext)(tY),f=useRainbowKitChains(),m=t===e;return D.createElement(D.Fragment,null,D.createElement(rE,{currentlySelected:m,onClick:m?void 0:()=>n({chainId:e}),testId:`chain-option-${e}`},D.createElement(tQ,{fontFamily:"body",fontSize:"16",fontWeight:"bold"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",justifyContent:"space-between"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"4",height:o},s&&D.createElement(tQ,{height:"full",marginRight:"8"},D.createElement(AsyncImage,{alt:l,background:c,borderRadius:"full",height:o,src:s,width:o,testId:`chain-option-${e}-icon`})),D.createElement("div",null,l)),m&&D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",marginRight:"6"},D.createElement(rm,{color:"accentColorForeground",size:"14",weight:"medium"},p.t("chains.connected")),D.createElement(tQ,{background:"connectionIndicator",borderColor:"selectedOptionBorder",borderRadius:"full",borderStyle:"solid",borderWidth:"1",height:"8",marginLeft:"8",width:"8"})),i&&D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",marginRight:"6"},D.createElement(rm,{color:"modalText",size:"14",weight:"medium"},p.t("chains.confirm")),D.createElement(tQ,{background:"standby",borderRadius:"full",height:"8",marginLeft:"8",width:"8"}))))),d&&uswitchChain(n,e),mutationKey:["switchChain"]});return{...s,chains:function(e={}){let t=(0,z.Z)(e);return(0,D.useSyncExternalStore)(e=>(function(e,t){let{onChange:n}=t;return e._internal.chains.subscribe((e,t)=>{n(e,t)})})(t,{onChange:e}),()=>getChains(t),()=>getChains(t))}({config:n}),switchChain:o,switchChainAsync:i}}({mutation:{onMutate:({chainId:e})=>{s(e)},onSuccess:()=>{i&&s(null)},onError:()=>{i&&s(null)},onSettled:()=>{e()}}}),{i18n:c}=(0,D.useContext)(tY),{disconnect:u}=useDisconnect(),d="rk_chain_modal_title",p=isMobile(),f=o.some(e=>e.id===n),m=p?"36":"28",b=useRainbowKitChains();return n?D.createElement(Dialog,{onClose:e,open:t,titleId:d},D.createElement(DialogContent,{bottomSheetOnMobile:!0,paddingBottom:"0"},D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"14"},D.createElement(tQ,{display:"flex",flexDirection:"row",justifyContent:"space-between"},p&&D.createElement(tQ,{width:"30"}),D.createElement(tQ,{paddingBottom:"0",paddingLeft:"8",paddingTop:"4"},D.createElement(rm,{as:"h1",color:"modalText",id:d,size:p?"20":"18",weight:"heavy"},c.t("chains.title"))),D.createElement(CloseButton,{onClose:e})),!f&&D.createElement(tQ,{marginX:"8",textAlign:p?"center":"left"},D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},c.t("chains.wrong_network"))),D.createElement(tQ,{className:p?"_18dqw9x1":"_18dqw9x0",display:"flex",flexDirection:"column",gap:"4",padding:"2",paddingBottom:"16"},b.map(({iconBackground:e,iconUrl:t,id:o,name:s},c)=>D.createElement(Chain_default,{key:o,chainId:o,currentChainId:n,switchChain:l,chainIconSize:m,isLoading:i===o,src:t,name:s,iconBackground:e,idx:c})),!f&&D.createElement(D.Fragment,null,D.createElement(tQ,{background:"generalBorderDim",height:"1",marginX:"8"}),D.createElement(rE,{onClick:()=>u(),testId:"chain-option-disconnect"},D.createElement(tQ,{color:"error",fontFamily:"body",fontSize:"16",fontWeight:"bold"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",justifyContent:"space-between"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"4",height:m},D.createElement(tQ,{alignItems:"center",color:"error",height:m,justifyContent:"center",marginRight:"8"},D.createElement(DisconnectSqIcon,{size:Number(m)})),D.createElement("div",null,c.t("chains.disconnect"))))))))))):null}var DisclaimerLink=({children:e,href:t})=>D.createElement(tQ,{as:"a",color:"accentColor",href:t,rel:"noreferrer",target:"_blank"},e),DisclaimerText=({children:e})=>D.createElement(rm,{color:"modalTextSecondary",size:"12",weight:"medium"},e);function ConnectModalIntro({compactModeEnabled:e=!1,getWallet:t}){let{disclaimer:n,learnMoreUrl:o}=(0,D.useContext)(rs),{i18n:i}=(0,D.useContext)(tY);return D.createElement(D.Fragment,null,D.createElement(tQ,{alignItems:"center",color:"accentColor",display:"flex",flexDirection:"column",height:"full",justifyContent:"space-around"},D.createElement(tQ,{marginBottom:"10"},!e&&D.createElement(rm,{color:"modalText",size:"18",weight:"heavy"},i.t("intro.title"))),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"32",justifyContent:"center",marginY:"20",style:{maxWidth:312}},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16"},D.createElement(tQ,{borderRadius:"6",height:"48",minWidth:"48",width:"48"},D.createElement(AssetsIcon,null)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},i.t("intro.digital_asset.title")),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},i.t("intro.digital_asset.description")))),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16"},D.createElement(tQ,{borderRadius:"6",height:"48",minWidth:"48",width:"48"},D.createElement(LoginIcon,null)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},i.t("intro.login.title")),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},i.t("intro.login.description"))))),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"12",justifyContent:"center",margin:"10"},D.createElement(ActionButton,{label:i.t("intro.get.label"),onClick:t}),D.createElement(tQ,{as:"a",className:touchableStyles({active:"shrink",hover:"grow"}),display:"block",href:o,paddingX:"12",paddingY:"4",rel:"noreferrer",style:{willChange:"transform"},target:"_blank",transition:"default"},D.createElement(rm,{color:"accentColor",size:"14",weight:"bold"},i.t("intro.learn_more.label")))),n&&!e&&D.createElement(tQ,{marginBottom:"8",marginTop:"12",textAlign:"center"},D.createElement(n,{Link:DisclaimerLink,Text:DisclaimerText}))))}var BackIcon=()=>D.createElement("svg",{fill:"none",height:"17",viewBox:"0 0 11 17",width:"11",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Back"),D.createElement("path",{d:"M0.99707 8.6543C0.99707 9.08496 1.15527 9.44531 1.51562 9.79688L8.16016 16.3096C8.43262 16.5732 8.74902 16.7051 9.13574 16.7051C9.90918 16.7051 10.5508 16.0811 10.5508 15.3076C10.5508 14.9121 10.3838 14.5605 10.0938 14.2705L4.30176 8.64551L10.0938 3.0293C10.3838 2.74805 10.5508 2.3877 10.5508 2.00098C10.5508 1.23633 9.90918 0.603516 9.13574 0.603516C8.74902 0.603516 8.43262 0.735352 8.16016 0.999023L1.51562 7.51172C1.15527 7.85449 1.00586 8.21484 0.99707 8.6543Z",fill:"currentColor"})),InfoIcon=()=>D.createElement("svg",{fill:"none",height:"12",viewBox:"0 0 8 12",width:"8",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Info"),D.createElement("path",{d:"M3.64258 7.99609C4.19336 7.99609 4.5625 7.73828 4.68555 7.24609C4.69141 7.21094 4.70312 7.16406 4.70898 7.13477C4.80859 6.60742 5.05469 6.35547 6.04492 5.76367C7.14648 5.10156 7.67969 4.3457 7.67969 3.24414C7.67969 1.39844 6.17383 0.255859 3.95898 0.255859C2.32422 0.255859 1.05859 0.894531 0.548828 1.86719C0.396484 2.14844 0.320312 2.44727 0.320312 2.74023C0.314453 3.37305 0.742188 3.79492 1.42188 3.79492C1.91406 3.79492 2.33594 3.54883 2.53516 3.11523C2.78711 2.47656 3.23242 2.21289 3.83594 2.21289C4.55664 2.21289 5.10742 2.65234 5.10742 3.29102C5.10742 3.9707 4.7793 4.29883 3.81836 4.87891C3.02148 5.36523 2.50586 5.92773 2.50586 6.76562V6.90039C2.50586 7.55664 2.96289 7.99609 3.64258 7.99609ZM3.67188 11.4473C4.42773 11.4473 5.04297 10.8672 5.04297 10.1406C5.04297 9.41406 4.42773 8.83984 3.67188 8.83984C2.91602 8.83984 2.30664 9.41406 2.30664 10.1406C2.30664 10.8672 2.91602 11.4473 3.67188 11.4473Z",fill:"currentColor"})),InfoButton=({"aria-label":e="Info",onClick:t})=>{let n=isMobile();return D.createElement(tQ,{alignItems:"center","aria-label":e,as:"button",background:"closeButtonBackground",borderColor:"actionButtonBorder",borderRadius:"full",borderStyle:"solid",borderWidth:n?"0":"1",className:touchableStyles({active:"shrinkSm",hover:"growLg"}),color:"closeButton",display:"flex",height:n?"30":"28",justifyContent:"center",onClick:t,style:{willChange:"transform"},transition:"default",type:"button",width:n?"30":"28"},D.createElement(InfoIcon,null))},useCoolMode=e=>{let t=(0,D.useRef)(null),n=(0,D.useContext)(rl),o=useAsyncImage(e);return(0,D.useEffect)(()=>{if(n&&t.current&&o)return function(e,t){let n;rx++;let o=[15,20,25,35,45],i=[],s=!1,l=0,c=0,u=getContainer();!function loop(){s&&i.length<35&&function(){let e=o[Math.floor(Math.random()*o.length)],n=360*Math.random(),s=c-e/2,d=l-e/2,p=document.createElement("div");p.innerHTML=``,p.setAttribute("style",`position:absolute;will-change:transform;top:${s}px;left:${d}px;transform:rotate(${n}deg)`),u.appendChild(p),i.push({direction:.5>=Math.random()?-1:1,element:p,left:d,size:e,speedHorz:10*Math.random(),speedUp:25*Math.random(),spinSpeed:35*Math.random()*(.5>=Math.random()?-1:1),spinVal:n,top:s})}(),function(){for(let e of i)e.left=e.left-e.speedHorz*e.direction,e.top=e.top-e.speedUp,e.speedUp=Math.min(e.size,e.speedUp-1),e.spinVal=e.spinVal+e.spinSpeed,e.top>=Math.max(window.innerHeight,document.body.clientHeight)+e.size&&(i=i.filter(t=>t!==e),e.element.remove()),e.element.setAttribute("style",`position:absolute;will-change:transform;top:${e.top}px;left:${e.left}px;transform:rotate(${e.spinVal}deg)`)}(),n=requestAnimationFrame(loop)}();let d="ontouchstart"in window||navigator.msMaxTouchPoints,p=d?"touchstart":"mousedown",f=d?"touchend":"mouseup",m=d?"touchmove":"mousemove",updateMousePosition=e=>{var t,n;"touches"in e?(l=null==(t=e.touches)?void 0:t[0].clientX,c=null==(n=e.touches)?void 0:n[0].clientY):(l=e.clientX,c=e.clientY)},tapHandler=e=>{updateMousePosition(e),s=!0},disableAutoAddParticle=()=>{s=!1};return e.addEventListener(m,updateMousePosition,{passive:!1}),e.addEventListener(p,tapHandler),e.addEventListener(f,disableAutoAddParticle),e.addEventListener("mouseleave",disableAutoAddParticle),()=>{e.removeEventListener(m,updateMousePosition),e.removeEventListener(p,tapHandler),e.removeEventListener(f,disableAutoAddParticle),e.removeEventListener("mouseleave",disableAutoAddParticle);let t=setInterval(()=>{n&&0===i.length&&(cancelAnimationFrame(n),clearInterval(t),0==--rx&&u.remove())},500)}}(t.current,o)},[n,o]),t},getContainer=()=>{let e="_rk_coolMode",t=document.getElementById(e);if(t)return t;let n=document.createElement("div");return n.setAttribute("id",e),n.setAttribute("style","overflow:hidden;position:fixed;height:100%;top:0;left:0;right:0;bottom:0;pointer-events:none;z-index:2147483647"),document.body.appendChild(n),n},rx=0,ModalSelection=({as:e="button",currentlySelected:t=!1,iconBackground:n,iconUrl:o,name:i,onClick:s,ready:l,recent:c,testId:u,isRainbowKitConnector:d,...p})=>{let f=useCoolMode(o),[m,b]=(0,D.useState)(!1),{i18n:g}=(0,D.useContext)(tY);return D.createElement(tQ,{display:"flex",flexDirection:"column",onMouseEnter:()=>b(!0),onMouseLeave:()=>b(!1),ref:f},D.createElement(tQ,{as:e,borderRadius:"menuButton",borderStyle:"solid",borderWidth:"1",className:t?void 0:["g5kl0l0",touchableStyles({active:"shrink"})],disabled:t,onClick:s,padding:"5",style:{willChange:"transform"},testId:u,transition:"default",width:"full",...t?{background:"accentColor",borderColor:"selectedOptionBorder",boxShadow:"selectedWallet"}:{background:{hover:"menuItemBackground"}},...p},D.createElement(tQ,{color:t?"accentColorForeground":"modalText",disabled:!l,fontFamily:"body",fontSize:"16",fontWeight:"bold",transition:"default"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"12"},D.createElement(AsyncImage,{background:n,...!m&&d?{borderColor:"actionButtonBorder"}:{},useAsImage:!d,borderRadius:"6",height:"28",src:o,width:"28"}),D.createElement(tQ,null,D.createElement(tQ,{style:{marginTop:c?-2:void 0},maxWidth:"200"},i),c&&D.createElement(rm,{color:t?"accentColorForeground":"accentColor",size:"12",style:{lineHeight:1,marginTop:-1},weight:"medium"},g.t("connect.recent")))))))};ModalSelection.displayName="ModalSelection";var rA="rk-latest-id",convertHexToRGBA=(e,t=1)=>{let n=e.replace("#","");3===n.length&&(n=`${n[0]}${n[0]}${n[1]}${n[1]}${n[2]}${n[2]}`);let o=parseInt(n.substring(0,2),16),i=parseInt(n.substring(2,4),16),s=parseInt(n.substring(4,6),16);return t>1&&t<=100&&(t/=100),`rgba(${o},${i},${s},${t})`},getGradientRGBAs=e=>e?[convertHexToRGBA(e,.2),convertHexToRGBA(e,.14),convertHexToRGBA(e,.1)]:null,isHexString=e=>/^#([0-9a-f]{3}){1,2}$/i.test(e),src3=async()=>(await n.e(9600).then(n.bind(n,99600))).default,preloadConnectIcon=()=>loadImages(src3),ConnectIcon=()=>D.createElement(AsyncImage,{background:"#515a70",borderColor:"generalBorder",borderRadius:"10",height:"48",src:src3,width:"48"}),src4=async()=>(await n.e(8137).then(n.bind(n,68137))).default,preloadCreateIcon=()=>loadImages(src4),CreateIcon=()=>D.createElement(AsyncImage,{background:"#e3a5e8",borderColor:"generalBorder",borderRadius:"10",height:"48",src:src4,width:"48"}),src5=async()=>(await n.e(1748).then(n.bind(n,31748))).default,preloadRefreshIcon=()=>loadImages(src5),RefreshIcon=()=>D.createElement(AsyncImage,{background:"#515a70",borderColor:"generalBorder",borderRadius:"10",height:"48",src:src5,width:"48"}),src6=async()=>(await n.e(5806).then(n.bind(n,75806))).default,preloadScanIcon=()=>loadImages(src6),ScanIcon=()=>D.createElement(AsyncImage,{background:"#515a70",borderColor:"generalBorder",borderRadius:"10",height:"48",src:src6,width:"48"}),generateMatrix=(e,t)=>{let n=Array.prototype.slice.call(tB.create(e,{errorCorrectionLevel:t}).modules.data,0),o=Math.sqrt(n.length);return n.reduce((e,t,n)=>(n%o==0?e.push([t]):e[e.length-1].push(t))&&e,[])};function QRCode({ecl:e="M",logoBackground:t,logoMargin:n=10,logoSize:o=50,logoUrl:i,size:s=200,uri:l}){let c=s-2*parseInt("20",10),u=(0,D.useMemo)(()=>{let t=[],n=generateMatrix(l,e),i=c/n.length;[{x:0,y:0},{x:1,y:0},{x:0,y:1}].forEach(({x:e,y:o})=>{let s=(n.length-7)*i*e,l=(n.length-7)*i*o;for(let n=0;n<3;n++)t.push(D.createElement("rect",{fill:n%2!=0?"white":"black",height:i*(7-2*n),key:`${n}-${e}-${o}`,rx:-((n-2)*5)+(0===n?2:0),ry:-((n-2)*5)+(0===n?2:0),width:i*(7-2*n),x:s+i*n,y:l+i*n}))});let s=Math.floor((o+25)/i),u=n.length/2-s/2,d=n.length/2+s/2-1;return n.forEach((e,o)=>{e.forEach((e,s)=>{!n[o][s]||o<7&&s<7||o>n.length-8&&s<7||o<7&&s>n.length-8||o>u&&ou&&s{let e=getBrowser();switch(e){case"Arc":return(await n.e(6328).then(n.bind(n,76328))).default;case"Brave":return(await n.e(6551).then(n.bind(n,86551))).default;case"Chrome":return(await n.e(7682).then(n.bind(n,57682))).default;case"Edge":return(await n.e(934).then(n.bind(n,60934))).default;case"Firefox":return(await n.e(9223).then(n.bind(n,99223))).default;case"Opera":return(await n.e(9941).then(n.bind(n,89941))).default;case"Safari":return(await n.e(2604).then(n.bind(n,62604))).default;default:return(await n.e(2746).then(n.bind(n,92746))).default}},preloadBrowserIcon=()=>loadImages(getBrowserSrc),getPlatformSrc=async()=>{let e=getPlatform();switch(e){case"Windows":return(await n.e(5710).then(n.bind(n,35710))).default;case"macOS":return(await n.e(8906).then(n.bind(n,8906))).default;default:return(await n.e(8366).then(n.bind(n,78366))).default}},preloadPlatformIcon=()=>loadImages(getPlatformSrc);function GetDetail({getWalletDownload:e,compactModeEnabled:t}){let n=useWalletConnectors().filter(e=>e.isRainbowKitConnector),o=n.splice(0,5),{i18n:i}=(0,D.useContext)(tY);return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",height:"full",marginTop:"18",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"28",height:"full",width:"full"},null==o?void 0:o.filter(e=>{var t;return e.extensionDownloadUrl||e.desktopDownloadUrl||e.qrCode&&(null==(t=e.downloadUrls)?void 0:t.qrCode)}).map(t=>{let{downloadUrls:n,iconBackground:o,iconUrl:s,id:l,name:c,qrCode:u}=t,d=(null==n?void 0:n.qrCode)&&u,p=!!t.extensionDownloadUrl,f=(null==n?void 0:n.qrCode)&&p,m=(null==n?void 0:n.qrCode)&&!!t.desktopDownloadUrl;return D.createElement(tQ,{alignItems:"center",display:"flex",gap:"16",justifyContent:"space-between",key:t.id,width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16"},D.createElement(AsyncImage,{background:o,borderColor:"actionButtonBorder",borderRadius:"10",height:"48",src:s,width:"48"}),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"2"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},c),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},f?i.t("get.mobile_and_extension.description"):m?i.t("get.mobile_and_desktop.description"):d?i.t("get.mobile.description"):p?i.t("get.extension.description"):null))),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(ActionButton,{label:i.t("get.action.label"),onClick:()=>e(l),type:"secondary"})))})),D.createElement(tQ,{alignItems:"center",borderRadius:"10",display:"flex",flexDirection:"column",gap:"8",justifyContent:"space-between",marginBottom:"4",paddingY:"8",style:{maxWidth:275,textAlign:"center"}},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},i.t("get.looking_for.title")),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},t?i.t("get.looking_for.desktop.compact_description"):i.t("get.looking_for.desktop.wide_description"))))}function ConnectDetail({changeWalletStep:e,compactModeEnabled:t,connectionError:n,onClose:o,qrCodeUri:i,reconnect:s,wallet:l}){let{downloadUrls:c,iconBackground:u,iconUrl:d,name:p,qrCode:f,ready:m,showWalletConnectModal:b,getDesktopUri:g}=l,y=!!g,v=isSafari(),{i18n:w}=(0,D.useContext)(tY),C=!!l.extensionDownloadUrl,E=(null==c?void 0:c.qrCode)&&C,x=(null==c?void 0:c.qrCode)&&!!l.desktopDownloadUrl,A=f&&i,onDesktopUri=async()=>{let e=await (null==g?void 0:g());window.open(e,v?"_blank":"_self")},k=b?{description:t?w.t("connect.walletconnect.description.compact"):w.t("connect.walletconnect.description.full"),label:w.t("connect.walletconnect.open.label"),onClick:()=>{o(),b()}}:A?{description:w.t("connect.secondary_action.get.description",{wallet:p}),label:w.t("connect.secondary_action.get.label"),onClick:()=>e(E||x?"DOWNLOAD_OPTIONS":"DOWNLOAD")}:null,{width:B}=useWindowSize();return(0,D.useEffect)(()=>{preloadBrowserIcon(),preloadPlatformIcon()},[]),D.createElement(tQ,{display:"flex",flexDirection:"column",height:"full",width:"full"},A?D.createElement(tQ,{alignItems:"center",display:"flex",height:"full",justifyContent:"center"},D.createElement(QRCode,{logoBackground:u,logoSize:t?60:72,logoUrl:d,size:t?318:B&&B<768?Math.max(280,Math.min(B-308,382)):382,uri:i})):D.createElement(tQ,{alignItems:"center",display:"flex",justifyContent:"center",style:{flexGrow:1}},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"8"},D.createElement(tQ,{borderRadius:"10",height:"44",overflow:"hidden"},D.createElement(AsyncImage,{useAsImage:!l.isRainbowKitConnector,height:"44",src:d,width:"44"})),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"4",paddingX:"32",style:{textAlign:"center"}},D.createElement(rm,{color:"modalText",size:"18",weight:"bold"},m?w.t("connect.status.opening",{wallet:p}):C?w.t("connect.status.not_installed",{wallet:p}):w.t("connect.status.not_available",{wallet:p})),!m&&C?D.createElement(tQ,{paddingTop:"20"},D.createElement(ActionButton,{href:l.extensionDownloadUrl,label:w.t("connect.secondary_action.install.label"),type:"secondary"})):null,m&&!A&&D.createElement(D.Fragment,null,D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",justifyContent:"center"},D.createElement(rm,{color:"modalTextSecondary",size:"14",textAlign:"center",weight:"medium"},w.t("connect.status.confirm"))),D.createElement(tQ,{alignItems:"center",color:"modalText",display:"flex",flexDirection:"row",height:"32",marginTop:"8"},n?D.createElement(ActionButton,{label:w.t("connect.secondary_action.retry.label"),onClick:async()=>{y&&onDesktopUri(),s(l)}}):D.createElement(tQ,{color:"modalTextSecondary"},D.createElement(SpinnerIcon,null))))))),D.createElement(tQ,{alignItems:"center",borderRadius:"10",display:"flex",flexDirection:"row",gap:"8",height:"28",justifyContent:"space-between",marginTop:"12"},m&&k&&D.createElement(D.Fragment,null,D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},k.description),D.createElement(ActionButton,{label:k.label,onClick:k.onClick,type:"secondary"}))))}var DownloadOptionsBox=({actionLabel:e,description:t,iconAccent:n,iconBackground:o,iconUrl:i,isCompact:s,onAction:l,title:c,url:u,variant:d})=>{let p="browser"===d,f=!p&&n&&getGradientRGBAs(n);return D.createElement(tQ,{alignItems:"center",borderRadius:"13",display:"flex",justifyContent:"center",overflow:"hidden",paddingX:s?"18":"44",position:"relative",style:{flex:1,isolation:"isolate"},width:"full"},D.createElement(tQ,{borderColor:"actionButtonBorder",borderRadius:"13",borderStyle:"solid",borderWidth:"1",style:{bottom:"0",left:"0",position:"absolute",right:"0",top:"0",zIndex:1}}),p&&D.createElement(tQ,{background:"downloadTopCardBackground",height:"full",position:"absolute",style:{zIndex:0},width:"full"},D.createElement(tQ,{display:"flex",flexDirection:"row",justifyContent:"space-between",style:{bottom:"0",filter:"blur(20px)",left:"0",position:"absolute",right:"0",top:"0",transform:"translate3d(0, 0, 0)"}},D.createElement(tQ,{style:{filter:"blur(100px)",marginLeft:-27,marginTop:-20,opacity:.6,transform:"translate3d(0, 0, 0)"}},D.createElement(AsyncImage,{borderRadius:"full",height:"200",src:i,width:"200"})),D.createElement(tQ,{style:{filter:"blur(100px)",marginRight:0,marginTop:105,opacity:.6,overflow:"auto",transform:"translate3d(0, 0, 0)"}},D.createElement(AsyncImage,{borderRadius:"full",height:"200",src:i,width:"200"})))),!p&&f&&D.createElement(tQ,{background:"downloadBottomCardBackground",style:{bottom:"0",left:"0",position:"absolute",right:"0",top:"0"}},D.createElement(tQ,{position:"absolute",style:{background:`radial-gradient(50% 50% at 50% 50%, ${f[0]} 0%, ${f[1]} 25%, rgba(0,0,0,0) 100%)`,height:564,left:-215,top:-197,transform:"translate3d(0, 0, 0)",width:564}}),D.createElement(tQ,{position:"absolute",style:{background:`radial-gradient(50% 50% at 50% 50%, ${f[2]} 0%, rgba(0, 0, 0, 0) 100%)`,height:564,left:-1,top:-76,transform:"translate3d(0, 0, 0)",width:564}})),D.createElement(tQ,{alignItems:"flex-start",display:"flex",flexDirection:"row",gap:"24",height:"max",justifyContent:"center",style:{zIndex:1}},D.createElement(tQ,null,D.createElement(AsyncImage,{height:"60",src:i,width:"60",...o?{background:o,borderColor:"generalBorder",borderRadius:"10"}:null})),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4",style:{flex:1},width:"full"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},c),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},t),D.createElement(tQ,{marginTop:"14",width:"max"},D.createElement(ActionButton,{href:u,label:e,onClick:l,size:"medium"})))))};function DownloadOptionsDetail({changeWalletStep:e,wallet:t}){let n=getBrowser(),o=getPlatform(),i=(0,D.useContext)(rd),s="compact"===i,{desktop:l,desktopDownloadUrl:c,extension:u,extensionDownloadUrl:d,mobileDownloadUrl:p}=t,{i18n:f}=(0,D.useContext)(tY);return(0,D.useEffect)(()=>{preloadCreateIcon(),preloadScanIcon(),preloadRefreshIcon(),preloadConnectIcon()},[]),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"24",height:"full",marginBottom:"8",marginTop:"4",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"8",height:"full",justifyContent:"center",width:"full"},d&&D.createElement(DownloadOptionsBox,{actionLabel:f.t("get_options.extension.download.label",{browser:n}),description:f.t("get_options.extension.description"),iconUrl:getBrowserSrc,isCompact:s,onAction:()=>e((null==u?void 0:u.instructions)?"INSTRUCTIONS_EXTENSION":"CONNECT"),title:f.t("get_options.extension.title",{wallet:t.name,browser:n}),url:d,variant:"browser"}),c&&D.createElement(DownloadOptionsBox,{actionLabel:f.t("get_options.desktop.download.label",{platform:o}),description:f.t("get_options.desktop.description"),iconUrl:getPlatformSrc,isCompact:s,onAction:()=>e((null==l?void 0:l.instructions)?"INSTRUCTIONS_DESKTOP":"CONNECT"),title:f.t("get_options.desktop.title",{wallet:t.name,platform:o}),url:c,variant:"desktop"}),p&&D.createElement(DownloadOptionsBox,{actionLabel:f.t("get_options.mobile.download.label",{wallet:t.name}),description:f.t("get_options.mobile.description"),iconAccent:t.iconAccent,iconBackground:t.iconBackground,iconUrl:t.iconUrl,isCompact:s,onAction:()=>{e("DOWNLOAD")},title:f.t("get_options.mobile.title",{wallet:t.name}),variant:"app"})))}function DownloadDetail({changeWalletStep:e,wallet:t}){let{downloadUrls:n,qrCode:o}=t,{i18n:i}=(0,D.useContext)(tY);return(0,D.useEffect)(()=>{preloadCreateIcon(),preloadScanIcon()},[]),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"24",height:"full",width:"full"},D.createElement(tQ,{style:{maxWidth:220,textAlign:"center"}},D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"semibold"},i.t("get_mobile.description"))),D.createElement(tQ,{height:"full"},(null==n?void 0:n.qrCode)?D.createElement(QRCode,{logoSize:0,size:268,uri:n.qrCode}):null),D.createElement(tQ,{alignItems:"center",borderRadius:"10",display:"flex",flexDirection:"row",gap:"8",height:"34",justifyContent:"space-between",marginBottom:"12",paddingY:"8"},D.createElement(ActionButton,{label:i.t("get_mobile.continue.label"),onClick:()=>e((null==o?void 0:o.instructions)?"INSTRUCTIONS_MOBILE":"CONNECT")})))}var rk={connect:()=>D.createElement(ConnectIcon,null),create:()=>D.createElement(CreateIcon,null),install:e=>D.createElement(AsyncImage,{background:e.iconBackground,borderColor:"generalBorder",borderRadius:"10",height:"48",src:e.iconUrl,width:"48"}),refresh:()=>D.createElement(RefreshIcon,null),scan:()=>D.createElement(ScanIcon,null)};function InstructionMobileDetail({connectWallet:e,wallet:t}){var n,o,i,s;let{i18n:l}=(0,D.useContext)(tY);return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",height:"full",width:"full"},D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"28",height:"full",justifyContent:"center",paddingY:"32",style:{maxWidth:320}},null==(o=null==(n=null==t?void 0:t.qrCode)?void 0:n.instructions)?void 0:o.steps.map((e,n)=>{var o;return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16",key:n},D.createElement(tQ,{borderRadius:"10",height:"48",minWidth:"48",overflow:"hidden",position:"relative",width:"48"},null==(o=rk[e.step])?void 0:o.call(rk,t)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},l.t(e.title,void 0,{rawKeyIfTranslationMissing:!0})),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},l.t(e.description,void 0,{rawKeyIfTranslationMissing:!0}))))})),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"12",justifyContent:"center",marginBottom:"16"},D.createElement(ActionButton,{label:l.t("get_instructions.mobile.connect.label"),onClick:()=>e(t)}),D.createElement(tQ,{as:"a",className:touchableStyles({active:"shrink",hover:"grow"}),display:"block",href:null==(s=null==(i=null==t?void 0:t.qrCode)?void 0:i.instructions)?void 0:s.learnMoreUrl,paddingX:"12",paddingY:"4",rel:"noreferrer",style:{willChange:"transform"},target:"_blank",transition:"default"},D.createElement(rm,{color:"accentColor",size:"14",weight:"bold"},l.t("get_instructions.mobile.learn_more.label")))))}function InstructionExtensionDetail({wallet:e}){var t,n,o,i;let{i18n:s}=(0,D.useContext)(tY);return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",height:"full",width:"full"},D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"28",height:"full",justifyContent:"center",paddingY:"32",style:{maxWidth:320}},null==(n=null==(t=null==e?void 0:e.extension)?void 0:t.instructions)?void 0:n.steps.map((t,n)=>{var o;return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16",key:n},D.createElement(tQ,{borderRadius:"10",height:"48",minWidth:"48",overflow:"hidden",position:"relative",width:"48"},null==(o=rk[t.step])?void 0:o.call(rk,e)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},s.t(t.title,void 0,{rawKeyIfTranslationMissing:!0})),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},s.t(t.description,void 0,{rawKeyIfTranslationMissing:!0}))))})),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"12",justifyContent:"center",marginBottom:"16"},D.createElement(ActionButton,{label:s.t("get_instructions.extension.refresh.label"),onClick:window.location.reload.bind(window.location)}),D.createElement(tQ,{as:"a",className:touchableStyles({active:"shrink",hover:"grow"}),display:"block",href:null==(i=null==(o=null==e?void 0:e.extension)?void 0:o.instructions)?void 0:i.learnMoreUrl,paddingX:"12",paddingY:"4",rel:"noreferrer",style:{willChange:"transform"},target:"_blank",transition:"default"},D.createElement(rm,{color:"accentColor",size:"14",weight:"bold"},s.t("get_instructions.extension.learn_more.label")))))}function InstructionDesktopDetail({connectWallet:e,wallet:t}){var n,o,i,s;let{i18n:l}=(0,D.useContext)(tY);return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",height:"full",width:"full"},D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"28",height:"full",justifyContent:"center",paddingY:"32",style:{maxWidth:320}},null==(o=null==(n=null==t?void 0:t.desktop)?void 0:n.instructions)?void 0:o.steps.map((e,n)=>{var o;return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16",key:n},D.createElement(tQ,{borderRadius:"10",height:"48",minWidth:"48",overflow:"hidden",position:"relative",width:"48"},null==(o=rk[e.step])?void 0:o.call(rk,t)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},l.t(e.title,void 0,{rawKeyIfTranslationMissing:!0})),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},l.t(e.description,void 0,{rawKeyIfTranslationMissing:!0}))))})),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"12",justifyContent:"center",marginBottom:"16"},D.createElement(ActionButton,{label:l.t("get_instructions.desktop.connect.label"),onClick:()=>e(t)}),D.createElement(tQ,{as:"a",className:touchableStyles({active:"shrink",hover:"grow"}),display:"block",href:null==(s=null==(i=null==t?void 0:t.desktop)?void 0:i.instructions)?void 0:s.learnMoreUrl,paddingX:"12",paddingY:"4",rel:"noreferrer",style:{willChange:"transform"},target:"_blank",transition:"default"},D.createElement(rm,{color:"accentColor",size:"14",weight:"bold"},l.t("get_instructions.desktop.learn_more.label")))))}function DesktopOptions({onClose:e}){let t;let[n,o]=(0,D.useState)(),[i,s]=(0,D.useState)(),[l,c]=(0,D.useState)(),u=!!(null==i?void 0:i.qrCode)&&l,[d,p]=(0,D.useState)(!1),f=(0,D.useContext)(rd),m=f===ru.COMPACT,{disclaimer:b}=(0,D.useContext)(rs),{i18n:g}=(0,D.useContext)(tY),y=isSafari(),v=(0,D.useRef)(!1),{connector:w}=(0,D.useContext)(rc),C=!w,E=useWalletConnectors(C).filter(e=>e.ready||!!e.extensionDownloadUrl).sort((e,t)=>e.groupIndex-t.groupIndex),x=function(e,t){let n={};for(let o of e){let e=t(o);e&&(n[e]||(n[e]=[]),n[e].push(o))}return n}(E,e=>e.groupName),A=["Recommended","Other","Popular","More","Others","Installed"];(0,D.useEffect)(()=>{w&&!v.current&&(changeWalletStep("CONNECT"),selectWallet(w),v.current=!0)},[w]);let connectToWallet=e=>{var t,n;p(!1),e.ready&&(null==(n=null==(t=null==e?void 0:e.connect)?void 0:t.call(e))||n.catch(()=>{p(!0)}))},onDesktopUri=async e=>{let t=E.find(t=>e.id===t.id);(null==t?void 0:t.getDesktopUri)&&setTimeout(async()=>{var e;let n=await (null==(e=null==t?void 0:t.getDesktopUri)?void 0:e.call(t));n&&window.open(n,y?"_blank":"_self")},0)},onQrCode=async e=>{var t;let n=E.find(t=>e.id===t.id),o=await (null==(t=null==n?void 0:n.getQrCodeUri)?void 0:t.call(n));c(o),setTimeout(()=>{s(n),changeWalletStep("CONNECT")},o?0:50)},selectWallet=async e=>{var t;t=e.id,localStorage.setItem(rA,t),e.ready&&(onQrCode(e),onDesktopUri(e)),connectToWallet(e),o(e.id),e.ready||(s(e),changeWalletStep((null==e?void 0:e.extensionDownloadUrl)?"DOWNLOAD_OPTIONS":"CONNECT"))},clearSelectedWallet=()=>{o(void 0),s(void 0),c(void 0)},changeWalletStep=(e,t=!1)=>{t&&"GET"===e&&"GET"===k?clearSelectedWallet():t||"GET"!==e?t||"CONNECT"!==e||B("CONNECT"):B("GET"),I(e)},[k,B]=(0,D.useState)("NONE"),[S,I]=(0,D.useState)("NONE"),j=null,T=null,P=null;(0,D.useEffect)(()=>{p(!1)},[S,i]);let M=!!(null==i?void 0:i.extensionDownloadUrl),O=!!(M&&(null==i?void 0:i.mobileDownloadUrl));switch(S){case"NONE":j=D.createElement(ConnectModalIntro,{getWallet:()=>changeWalletStep("GET")});break;case"LEARN_COMPACT":j=D.createElement(ConnectModalIntro,{compactModeEnabled:m,getWallet:()=>changeWalletStep("GET")}),T=g.t("intro.title"),P="NONE";break;case"GET":j=D.createElement(GetDetail,{getWalletDownload:e=>{var t;o(e);let n=E.find(t=>e===t.id),i=null==(t=null==n?void 0:n.downloadUrls)?void 0:t.qrCode,l=!!(null==n?void 0:n.desktopDownloadUrl),c=!!(null==n?void 0:n.extensionDownloadUrl);s(n),i&&(c||l)?changeWalletStep("DOWNLOAD_OPTIONS"):i?changeWalletStep("DOWNLOAD"):l?changeWalletStep("INSTRUCTIONS_DESKTOP"):changeWalletStep("INSTRUCTIONS_EXTENSION")},compactModeEnabled:m}),T=g.t("get.title"),P=m?"LEARN_COMPACT":"NONE";break;case"CONNECT":j=i&&D.createElement(ConnectDetail,{changeWalletStep,compactModeEnabled:m,connectionError:d,onClose:e,qrCodeUri:l,reconnect:connectToWallet,wallet:i}),T=u&&("WalletConnect"===i.name?g.t("connect_scan.fallback_title"):g.t("connect_scan.title",{wallet:i.name})),P=m?w?null:"NONE":null,t=m?w?()=>{}:clearSelectedWallet:()=>{};break;case"DOWNLOAD_OPTIONS":j=i&&D.createElement(DownloadOptionsDetail,{changeWalletStep,wallet:i}),T=i&&g.t("get_options.short_title",{wallet:i.name}),P=w?"CONNECT":m?"NONE":null;break;case"DOWNLOAD":j=i&&D.createElement(DownloadDetail,{changeWalletStep,wallet:i}),T=i&&g.t("get_mobile.title",{wallet:i.name}),P=O?"DOWNLOAD_OPTIONS":k;break;case"INSTRUCTIONS_MOBILE":j=i&&D.createElement(InstructionMobileDetail,{connectWallet:selectWallet,wallet:i}),T=i&&g.t("get_options.title",{wallet:m&&i.shortName||i.name}),P="DOWNLOAD";break;case"INSTRUCTIONS_EXTENSION":j=i&&D.createElement(InstructionExtensionDetail,{wallet:i}),T=i&&g.t("get_options.title",{wallet:m&&i.shortName||i.name}),P="DOWNLOAD_OPTIONS";break;case"INSTRUCTIONS_DESKTOP":j=i&&D.createElement(InstructionDesktopDetail,{connectWallet:selectWallet,wallet:i}),T=i&&g.t("get_options.title",{wallet:m&&i.shortName||i.name}),P="DOWNLOAD_OPTIONS"}return D.createElement(tQ,{display:"flex",flexDirection:"row",style:{maxHeight:m?468:504}},(!m||"NONE"===S)&&D.createElement(tQ,{className:m?"_1vwt0cg4":"_1vwt0cg3",display:"flex",flexDirection:"column",marginTop:"16"},D.createElement(tQ,{display:"flex",justifyContent:"space-between"},m&&b&&D.createElement(tQ,{marginLeft:"16",width:"28"},D.createElement(InfoButton,{onClick:()=>changeWalletStep("LEARN_COMPACT")})),m&&!b&&D.createElement(tQ,{marginLeft:"16",width:"28"}),D.createElement(tQ,{marginLeft:m?"0":"6",paddingBottom:"8",paddingTop:"2",paddingX:"18"},D.createElement(rm,{as:"h1",color:"modalText",id:"rk_connect_title",size:"18",weight:"heavy",testId:"connect-header-label"},g.t("connect.title"))),m&&D.createElement(tQ,{marginRight:"16"},D.createElement(CloseButton,{onClose:e}))),D.createElement(tQ,{className:"_1vwt0cg2 ju367v7a ju367v7v",paddingBottom:"18"},Object.entries(x).map(([e,t],o)=>t.length>0&&D.createElement(D.Fragment,{key:o},e?D.createElement(tQ,{marginBottom:"8",marginTop:"16",marginX:"6"},D.createElement(rm,{color:"Installed"===e?"accentColor":"modalTextSecondary",size:"14",weight:"bold"},A.includes(e)?g.t(`connector_group.${e.toLowerCase()}`):e)):null,D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},t.map(e=>D.createElement(ModalSelection,{currentlySelected:e.id===n,iconBackground:e.iconBackground,iconUrl:e.iconUrl,key:e.id,name:e.name,onClick:()=>selectWallet(e),ready:e.ready,recent:e.recent,testId:`wallet-option-${e.id}`,isRainbowKitConnector:e.isRainbowKitConnector})))))),m&&D.createElement(D.Fragment,null,D.createElement(tQ,{background:"generalBorder",height:"1",marginTop:"-1"}),b?D.createElement(tQ,{paddingX:"24",paddingY:"16",textAlign:"center"},D.createElement(b,{Link:DisclaimerLink,Text:DisclaimerText})):D.createElement(tQ,{alignItems:"center",display:"flex",justifyContent:"space-between",paddingX:"24",paddingY:"16"},D.createElement(tQ,{paddingY:"4"},D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},g.t("connect.new_to_ethereum.description"))),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"4",justifyContent:"center"},D.createElement(tQ,{className:touchableStyles({active:"shrink",hover:"grow"}),cursor:"pointer",onClick:()=>changeWalletStep("LEARN_COMPACT"),paddingY:"4",style:{willChange:"transform"},transition:"default"},D.createElement(rm,{color:"accentColor",size:"14",weight:"bold"},g.t("connect.new_to_ethereum.learn_more.label"))))))),(!m||"NONE"!==S)&&D.createElement(D.Fragment,null,!m&&D.createElement(tQ,{background:"generalBorder",minWidth:"1",width:"1"}),D.createElement(tQ,{display:"flex",flexDirection:"column",margin:"16",style:{flexGrow:1}},D.createElement(tQ,{alignItems:"center",display:"flex",justifyContent:"space-between",marginBottom:"12"},D.createElement(tQ,{width:"28"},P&&D.createElement(tQ,{as:"button",className:touchableStyles({active:"shrinkSm",hover:"growLg"}),color:"accentColor",onClick:()=>{P&&changeWalletStep(P,!0),null==t||t()},paddingX:"8",paddingY:"4",style:{boxSizing:"content-box",height:17,willChange:"transform"},transition:"default",type:"button"},D.createElement(BackIcon,null))),D.createElement(tQ,{display:"flex",justifyContent:"center",style:{flexGrow:1}},T&&D.createElement(rm,{color:"modalText",size:"18",textAlign:"center",weight:"heavy"},T)),D.createElement(CloseButton,{onClose:e})),D.createElement(tQ,{display:"flex",flexDirection:"column",style:{minHeight:m?396:432}},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"6",height:"full",justifyContent:"center",marginX:"8"},j)))))}var LoadingSpinner=({wallet:e})=>D.createElement("svg",{className:"_1am14413",viewBox:"0 0 86 86",width:"86",height:"86"},D.createElement("title",null,"Loading"),D.createElement("rect",{x:"3",y:"3",width:80,height:80,rx:20,ry:20,strokeDasharray:"53.333333333333336 "+320/3,strokeDashoffset:160,className:"_1am14412",style:{stroke:(null==e?void 0:e.iconAccent)||"#0D3887"}}));function WalletButton({onClose:e,wallet:t,connecting:n}){let{connect:o,iconBackground:i,iconUrl:s,id:l,name:c,getMobileUri:u,ready:d,shortName:p,showWalletConnectModal:f}=t,m=useCoolMode(s),b=(0,D.useRef)(!1),{i18n:g}=(0,D.useContext)(tY),y=(0,D.useCallback)(async()=>{let onMobileUri=async()=>{let e=await (null==u?void 0:u());if(e){if(e&&function({mobileUri:e,name:t}){localStorage.setItem(rg,JSON.stringify({href:e.split("?")[0],name:t}))}({mobileUri:e,name:c}),e.startsWith("http")){let t=document.createElement("a");t.href=e,t.target="_blank",t.rel="noreferrer noopener",t.click()}else window.location.href=e}};if("walletConnect"!==l&&onMobileUri(),f){f(),null==e||e();return}null==o||o()},[o,u,f,e,c,l]);return(0,D.useEffect)(()=>{n&&!b.current&&(y(),b.current=!0)},[n,y]),D.createElement(tQ,{as:"button",color:d?"modalText":"modalTextSecondary",disabled:!d,fontFamily:"body",key:l,onClick:y,ref:m,style:{overflow:"visible",textAlign:"center"},testId:`wallet-option-${l}`,type:"button",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",justifyContent:"center"},D.createElement(tQ,{display:"flex",alignItems:"center",justifyContent:"center",paddingBottom:"8",paddingTop:"10",position:"relative"},n?D.createElement(LoadingSpinner,{wallet:t}):null,D.createElement(AsyncImage,{background:i,borderRadius:"13",boxShadow:"walletLogo",height:"60",src:s,width:"60"})),n?null:D.createElement(tQ,{display:"flex",flexDirection:"column",textAlign:"center"},D.createElement(rm,{as:"h2",color:t.ready?"modalText":"modalTextSecondary",size:"13",weight:"medium"},D.createElement(tQ,{as:"span",position:"relative"},null!=p?p:c,!t.ready&&" (unsupported)")),t.recent&&D.createElement(rm,{color:"accentColor",size:"12",weight:"medium"},g.t("connect.recent")))))}function MobileOptions({onClose:e}){var t;let n=useWalletConnectors().filter(e=>e.isRainbowKitConnector),{disclaimer:o,learnMoreUrl:i}=(0,D.useContext)(rs),s=null,l=null,c=!1,u=null,[d,p]=(0,D.useState)("CONNECT"),{i18n:f}=(0,D.useContext)(tY),m=isIOS();switch(d){case"CONNECT":s=f.t("connect.title"),c=!0,l=D.createElement(tQ,null,D.createElement(tQ,{background:"profileForeground",className:"_1am14410",display:"flex",paddingBottom:"20",paddingTop:"6"},D.createElement(tQ,{display:"flex",style:{margin:"0 auto"}},n.filter(e=>e.ready).map(t=>D.createElement(tQ,{key:t.id,paddingX:"20"},D.createElement(tQ,{width:"60"},D.createElement(WalletButton,{onClose:e,wallet:t})))))),D.createElement(tQ,{background:"generalBorder",height:"1",marginBottom:"32",marginTop:"-1"}),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"32",paddingX:"32",style:{textAlign:"center"}},D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"8",textAlign:"center"},D.createElement(rm,{color:"modalText",size:"16",weight:"bold"},f.t("intro.title")),D.createElement(rm,{color:"modalTextSecondary",size:"16"},f.t("intro.description")))),D.createElement(tQ,{paddingTop:"32",paddingX:"20"},D.createElement(tQ,{display:"flex",gap:"14",justifyContent:"center"},D.createElement(ActionButton,{label:f.t("intro.get.label"),onClick:()=>p("GET"),size:"large",type:"secondary"}),D.createElement(ActionButton,{href:i,label:f.t("intro.learn_more.label"),size:"large",type:"secondary"}))),o&&D.createElement(tQ,{marginTop:"28",marginX:"32",textAlign:"center"},D.createElement(o,{Link:DisclaimerLink,Text:DisclaimerText})));break;case"GET":{s=f.t("get.title"),u="CONNECT";let e=null==(t=null==n?void 0:n.filter(e=>{var t,n,o;return(null==(t=e.downloadUrls)?void 0:t.ios)||(null==(n=e.downloadUrls)?void 0:n.android)||(null==(o=e.downloadUrls)?void 0:o.mobile)}))?void 0:t.splice(0,3);l=D.createElement(tQ,null,D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",height:"full",marginBottom:"36",marginTop:"5",paddingTop:"12",width:"full"},e.map((t,n)=>{let{downloadUrls:o,iconBackground:i,iconUrl:s,name:l}=t;return(null==o?void 0:o.ios)||(null==o?void 0:o.android)||(null==o?void 0:o.mobile)?D.createElement(tQ,{display:"flex",gap:"16",key:t.id,paddingX:"20",width:"full"},D.createElement(tQ,{style:{minHeight:48,minWidth:48}},D.createElement(AsyncImage,{background:i,borderColor:"generalBorder",borderRadius:"10",height:"48",src:s,width:"48"})),D.createElement(tQ,{display:"flex",flexDirection:"column",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",height:"48"},D.createElement(tQ,{width:"full"},D.createElement(rm,{color:"modalText",size:"18",weight:"bold"},l)),D.createElement(ActionButton,{href:(m?null==o?void 0:o.ios:null==o?void 0:o.android)||(null==o?void 0:o.mobile),label:f.t("get.action.label"),size:"small",type:"secondary"})),np(u),padding:"16",style:{height:17,willChange:"transform"},transition:"default",type:"button"},D.createElement(BackIcon,null))),D.createElement(tQ,{marginTop:"4",textAlign:"center",width:"full"},D.createElement(rm,{as:"h1",color:"modalText",id:"rk_connect_title",size:"20",weight:"bold"},s)),D.createElement(tQ,{alignItems:"center",display:"flex",height:"32",paddingRight:"14",position:"absolute",right:"0"},D.createElement(tQ,{style:{marginBottom:-20,marginTop:-20}},D.createElement(CloseButton,{onClose:e}))))),D.createElement(tQ,{display:"flex",flexDirection:"column"},l))}var MobileStatus=({onClose:e})=>{let{connector:t}=(0,D.useContext)(rc),{i18n:n}=(0,D.useContext)(tY),o=(null==t?void 0:t.name)||"";return D.createElement(tQ,null,D.createElement(tQ,{display:"flex",paddingBottom:"32",justifyContent:"center",alignItems:"center",background:"profileForeground",flexDirection:"column"},D.createElement(tQ,{width:"full",display:"flex",justifyContent:"flex-end",marginTop:"18",marginRight:"24"},D.createElement(CloseButton,{onClose:e})),D.createElement(tQ,{width:"60"},D.createElement(WalletButton,{onClose:e,wallet:t,connecting:!0})),D.createElement(tQ,{marginTop:"20"},D.createElement(rm,{textAlign:"center",color:"modalText",size:"18",weight:"semibold"},n.t("connect.status.connect_mobile",{wallet:o}))),D.createElement(tQ,{maxWidth:"full",marginTop:"8"},D.createElement(rm,{textAlign:"center",color:"modalText",size:"16",weight:"medium"},n.t("connect.status.confirm_mobile",{wallet:o})))))};function ConnectOptions({onClose:e}){let{connector:t}=(0,D.useContext)(rc);return isMobile()?t?D.createElement(MobileStatus,{onClose:e}):D.createElement(MobileOptions,{onClose:e}):D.createElement(DesktopOptions,{onClose:e})}function ConnectModal({onClose:e,open:t}){let n="rk_connect_title",o=useConnectionStatus(),{disconnect:i}=useDisconnect(),{isConnecting:s}=(0,_.m)(),l=D.useCallback(()=>{e(),i()},[e,i]),c=D.useCallback(()=>{s&&i(),e()},[e,i,s]);return"disconnected"===o?D.createElement(Dialog,{onClose:c,open:t,titleId:n},D.createElement(DialogContent,{bottomSheetOnMobile:!0,padding:"0",wide:!0},D.createElement(ConnectOptions,{onClose:c}))):"unauthenticated"===o?D.createElement(Dialog,{onClose:l,open:t,titleId:n},D.createElement(DialogContent,{bottomSheetOnMobile:!0,padding:"0"},D.createElement(SignIn,{onClose:l,onCloseModal:e}))):null}function useModalStateValue(){let[e,t]=(0,D.useState)(!1);return{closeModal:(0,D.useCallback)(()=>t(!1),[]),isModalOpen:e,openModal:(0,D.useCallback)(()=>t(!0),[])}}var rB=(0,D.createContext)({accountModalOpen:!1,chainModalOpen:!1,connectModalOpen:!1,isWalletConnectModalOpen:!1,setIsWalletConnectModalOpen:()=>{}});function ModalProvider({children:e}){let{closeModal:t,isModalOpen:n,openModal:o}=useModalStateValue(),{closeModal:i,isModalOpen:s,openModal:l}=useModalStateValue(),{closeModal:c,isModalOpen:u,openModal:d}=useModalStateValue(),[p,f]=(0,D.useState)(!1),m=useConnectionStatus(),{chainId:b}=(0,_.m)(),{chains:g}=(0,z.Z)(),y=g.some(e=>e.id===b);function closeModals({keepConnectModalOpen:e=!1}={}){e||t(),i(),c()}let v="unauthenticated"===useAuthenticationStatus();return useAccountEffect_useAccountEffect({onConnect:()=>closeModals({keepConnectModalOpen:v}),onDisconnect:()=>closeModals()}),(0,D.useEffect)(()=>{v&&closeModals()},[v]),D.createElement(rB.Provider,{value:(0,D.useMemo)(()=>({accountModalOpen:s,chainModalOpen:u,connectModalOpen:n,isWalletConnectModalOpen:p,openAccountModal:y&&"connected"===m?l:void 0,openChainModal:"connected"===m?d:void 0,openConnectModal:"disconnected"===m||"unauthenticated"===m?o:void 0,setIsWalletConnectModalOpen:f}),[m,s,u,n,l,d,o,y,p])},e,D.createElement(ConnectModal,{onClose:t,open:n}),D.createElement(AccountModal,{onClose:i,open:s}),D.createElement(ChainModal,{onClose:c,open:u}))}function useWalletConnectOpenState(){let{isWalletConnectModalOpen:e,setIsWalletConnectModalOpen:t}=(0,D.useContext)(rB);return{isWalletConnectModalOpen:e,setIsWalletConnectModalOpen:t}}var noop=()=>{};function ConnectButtonRenderer({children:e}){var t,n,o,i;let s=function(){let[e,t]=(0,D.useState)(!1);return(0,D.useEffect)(()=>(t(!0),()=>{t(!1)}),[]),(0,D.useCallback)(()=>e,[e])}(),{address:l}=(0,_.m)(),c=useMainnetEnsName(l),u=useMainnetEnsAvatar(c),{chainId:d}=(0,_.m)(),{chains:p}=(0,z.Z)(),f=p.some(e=>e.id===d),m=useRainbowKitChainsById(),b=null!=(t=useAuthenticationStatus())?t:void 0,g=d?m[d]:void 0,y=null!=(n=null==g?void 0:g.name)?n:void 0,v=null!=(o=null==g?void 0:g.iconUrl)?o:void 0,w=null!=(i=null==g?void 0:g.iconBackground)?i:void 0,C=useAsyncImage(v),E=(0,D.useContext)(rp),x=useRecentTransactions().some(({status:e})=>"pending"===e)&&E,{showBalance:A}=useShowBalance(),k="boolean"==typeof A?A:!A||t_(A)[isMobile()?"smallScreen":"largeScreen"],{data:B}=useBalance({address:k?l:void 0}),S=B?`${abbreviateETHBalance(parseFloat(B.formatted))} ${B.symbol}`:void 0,{openConnectModal:I}=function(){let{connectModalOpen:e,openConnectModal:t}=(0,D.useContext)(rB),{isWalletConnectModalOpen:n}=useWalletConnectOpenState();return{connectModalOpen:e||n,openConnectModal:t}}(),{openChainModal:j}=function(){let{chainModalOpen:e,openChainModal:t}=(0,D.useContext)(rB);return{chainModalOpen:e,openChainModal:t}}(),{openAccountModal:T}=function(){let{accountModalOpen:e,openAccountModal:t}=(0,D.useContext)(rB);return{accountModalOpen:e,openAccountModal:t}}(),{accountModalOpen:P,chainModalOpen:M,connectModalOpen:O}=function(){let{accountModalOpen:e,chainModalOpen:t,connectModalOpen:n}=(0,D.useContext)(rB);return{accountModalOpen:e,chainModalOpen:t,connectModalOpen:n}}();return D.createElement(D.Fragment,null,e({account:l?{address:l,balanceDecimals:null==B?void 0:B.decimals,balanceFormatted:null==B?void 0:B.formatted,balanceSymbol:null==B?void 0:B.symbol,displayBalance:S,displayName:c?formatENS(c):formatAddress(l),ensAvatar:null!=u?u:void 0,ensName:null!=c?c:void 0,hasPendingTransactions:x}:void 0,accountModalOpen:P,authenticationStatus:b,chain:d?{hasIcon:!!v,iconBackground:w,iconUrl:C,id:d,name:y,unsupported:!f}:void 0,chainModalOpen:M,connectModalOpen:O,mounted:s(),openAccountModal:null!=T?T:noop,openChainModal:null!=j?j:noop,openConnectModal:null!=I?I:noop}))}ConnectButtonRenderer.displayName="ConnectButton.Custom";var rS={accountStatus:"full",chainStatus:{largeScreen:"full",smallScreen:"icon"},label:"Connect Wallet",showBalance:{largeScreen:!0,smallScreen:!1}};function ConnectButton({accountStatus:e=rS.accountStatus,chainStatus:t=rS.chainStatus,label:n=rS.label,showBalance:o=rS.showBalance}){let i=useRainbowKitChains(),s=useConnectionStatus(),{setShowBalance:l}=useShowBalance(),[c,u]=(0,D.useState)(!1),{i18n:d}=(0,D.useContext)(tY);return(0,D.useEffect)(()=>{l(o),c||u(!0)},[o,l]),c?D.createElement(ConnectButtonRenderer,null,({account:l,chain:c,mounted:u,openAccountModal:p,openChainModal:f,openConnectModal:m})=>{var b,g,y;let v=u&&"loading"!==s,w=null!=(b=null==c?void 0:c.unsupported)&&b;return D.createElement(tQ,{display:"flex",gap:"12",...!v&&{"aria-hidden":!0,style:{opacity:0,pointerEvents:"none",userSelect:"none"}}},v&&l&&"connected"===s?D.createElement(D.Fragment,null,c&&(i.length>1||w)&&D.createElement(tQ,{alignItems:"center","aria-label":"Chain Selector",as:"button",background:w?"connectButtonBackgroundError":"connectButtonBackground",borderRadius:"connectButton",boxShadow:"connectButton",className:touchableStyles({active:"shrink",hover:"grow"}),color:w?"connectButtonTextError":"connectButtonText",display:tD(t,e=>"none"===e?"none":"flex"),fontFamily:"body",fontWeight:"bold",gap:"6",key:w?"unsupported":"supported",onClick:f,paddingX:"10",paddingY:"8",testId:w?"wrong-network-button":"chain-button",transition:"default",type:"button"},w?D.createElement(tQ,{alignItems:"center",display:"flex",height:"24",paddingX:"4"},d.t("connect_wallet.wrong_network.label")):D.createElement(tQ,{alignItems:"center",display:"flex",gap:"6"},c.hasIcon?D.createElement(tQ,{display:tD(t,e=>"full"===e||"icon"===e?"block":"none"),height:"24",width:"24"},D.createElement(AsyncImage,{alt:null!=(g=c.name)?g:"Chain icon",background:c.iconBackground,borderRadius:"full",height:"24",src:c.iconUrl,width:"24"})):null,D.createElement(tQ,{display:tD(t,e=>"icon"!==e||c.iconUrl?"full"===e||"name"===e?"block":"none":"block")},null!=(y=c.name)?y:c.id)),D.createElement(DropdownIcon,null)),!w&&D.createElement(tQ,{alignItems:"center",as:"button",background:"connectButtonBackground",borderRadius:"connectButton",boxShadow:"connectButton",className:touchableStyles({active:"shrink",hover:"grow"}),color:"connectButtonText",display:"flex",fontFamily:"body",fontWeight:"bold",onClick:p,testId:"account-button",transition:"default",type:"button"},l.displayBalance&&D.createElement(tQ,{display:tD(o,e=>e?"block":"none"),padding:"8",paddingLeft:"12"},l.displayBalance),D.createElement(tQ,{background:t_(o)[isMobile()?"smallScreen":"largeScreen"]?"connectButtonInnerBackground":"connectButtonBackground",borderColor:"connectButtonBackground",borderRadius:"connectButton",borderStyle:"solid",borderWidth:"2",color:"connectButtonText",fontFamily:"body",fontWeight:"bold",paddingX:"8",paddingY:"6",transition:"default"},D.createElement(tQ,{alignItems:"center",display:"flex",gap:"6",height:"24"},D.createElement(tQ,{display:tD(e,e=>"full"===e||"avatar"===e?"block":"none")},D.createElement(Avatar,{address:l.address,imageUrl:l.ensAvatar,loading:l.hasPendingTransactions,size:24})),D.createElement(tQ,{alignItems:"center",display:"flex",gap:"6"},D.createElement(tQ,{display:tD(e,e=>"full"===e||"address"===e?"block":"none")},l.displayName),D.createElement(DropdownIcon,null)))))):D.createElement(tQ,{as:"button",background:"accentColor",borderRadius:"connectButton",boxShadow:"connectButton",className:touchableStyles({active:"shrink",hover:"grow"}),color:"accentColorForeground",fontFamily:"body",fontWeight:"bold",height:"40",key:"connect",onClick:m,paddingX:"14",testId:"connect-button",transition:"default",type:"button"},u&&"Connect Wallet"===n?d.t("connect_wallet.label"):n))}):D.createElement(D.Fragment,null)}ConnectButton.__defaultProps=rS,ConnectButton.Custom=ConnectButtonRenderer;var computeWalletConnectMetaData=({appName:e,appDescription:t,appUrl:n,appIcon:o})=>({name:e,description:null!=t?t:e,url:null!=n?n:"undefined"!=typeof window?window.location.href:"",icons:[...o?[o]:[]]}),connectorsForWallets=(e,{projectId:t,walletConnectParameters:n,appName:o,appDescription:i,appUrl:s,appIcon:l})=>{let c=-1,u=[],d=[],p=[],f=computeWalletConnectMetaData({appName:o,appDescription:i,appUrl:s,appIcon:l});e.forEach(({groupName:e,wallets:i},s)=>{i.forEach(i=>{c++;let u=i({projectId:t,appName:o,appIcon:l,options:{metadata:f,...n},walletConnectParameters:{metadata:f,...n}});if((null==u?void 0:u.iconAccent)&&!isHexString(null==u?void 0:u.iconAccent))throw Error(`Property \`iconAccent\` is not a hex value for wallet: ${u.name}`);let m={...u,groupIndex:s+1,groupName:e,index:c};"function"==typeof u.hidden?p.push(m):d.push(m)})});let m=[...d,...p];for(let{createConnector:e,groupIndex:t,groupName:n,hidden:o,...i}of m){if("function"==typeof o){let e=o();if(e)continue}let walletMetaData=e=>({rkDetails:Object.fromEntries(Object.entries({...i,groupIndex:t,groupName:n,isRainbowKitConnector:!0,...e||{}}).filter(([e,t])=>void 0!==t))}),s="walletConnect"===i.id;s&&u.push(e(walletMetaData({isWalletConnectModalConnector:!0,showQrModal:!0})));let l=e(walletMetaData());u.push(l)}return u},rI=new Map,getOrCreateWalletConnectInstance=({projectId:e,walletConnectParameters:t,rkDetailsShowQrModal:n})=>{let o={...t||{},projectId:e,showQrModal:!1};n&&(o={...o,showQrModal:!0});let i=JSON.stringify(o),s=rI.get(i);if(s)return s;let l=walletConnect(o);return rI.set(i,l),l};function getWalletConnectConnector({projectId:e,walletConnectParameters:t}){if(!e||""===e)throw Error("No projectId found. Every dApp must now provide a WalletConnect Cloud projectId to enable WalletConnect v2 https://www.rainbowkit.com/docs/installation#configure");return"YOUR_PROJECT_ID"===e&&(e="21fef48091f12692cad574a6f7753643"),n=>(function({projectId:e,walletDetails:t,walletConnectParameters:n}){return o=>({...getOrCreateWalletConnectInstance({projectId:e,walletConnectParameters:n,rkDetailsShowQrModal:t.rkDetails.showQrModal})(o),...t})})({projectId:e,walletDetails:n,walletConnectParameters:t})}function getExplicitInjectedProvider(e){if("undefined"==typeof window||void 0===window.ethereum)return;let t=window.ethereum.providers;return t?t.find(t=>t[e]):window.ethereum[e]?window.ethereum:void 0}function getWindowProviderNamespace(e){let providerSearch=(e,t)=>{let[n,...o]=t.split("."),i=e[n];if(i)return 0===o.length?i:providerSearch(i,o.join("."))};if("undefined"!=typeof window)return providerSearch(window,e)}function hasInjectedProvider({flag:e,namespace:t}){return!!t&&void 0!==getWindowProviderNamespace(t)||!!e&&void 0!==getExplicitInjectedProvider(e)}function getInjectedConnector({flag:e,namespace:t,target:n}){let o=n||function({flag:e,namespace:t}){var n;if("undefined"==typeof window)return;if(t){let e=getWindowProviderNamespace(t);if(e)return e}let o=null==(n=window.ethereum)?void 0:n.providers;if(e){let t=getExplicitInjectedProvider(e);if(t)return t}return void 0!==o&&o.length>0?o[0]:window.ethereum}({flag:e,namespace:t});return e=>{let t=o?{target:()=>({id:e.rkDetails.id,name:e.rkDetails.name,provider:o})}:{};return n=>({...injected(t)(n),...e})}}var dist_coinbaseWallet=({appName:e,appIcon:t})=>{let o=hasInjectedProvider({flag:"isCoinbaseWallet"}),i=isIOS();return{id:"coinbase",name:"Coinbase Wallet",shortName:"Coinbase",rdns:"com.coinbase.wallet",iconUrl:async()=>(await n.e(1950).then(n.bind(n,41950))).default,iconAccent:"#2c5ff6",iconBackground:"#2c5ff6",installed:o||void 0,downloadUrls:{android:"https://play.google.com/store/apps/details?id=org.toshi",ios:"https://apps.apple.com/us/app/coinbase-wallet-store-crypto/id1278383455",mobile:"https://coinbase.com/wallet/downloads",qrCode:"https://coinbase-wallet.onelink.me/q5Sx/fdb9b250",chrome:"https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad",browserExtension:"https://coinbase.com/wallet"},...i?{}:{qrCode:{getUri:e=>e,instructions:{learnMoreUrl:"https://coinbase.com/wallet/articles/getting-started-mobile",steps:[{description:"wallet_connectors.coinbase.qr_code.step1.description",step:"install",title:"wallet_connectors.coinbase.qr_code.step1.title"},{description:"wallet_connectors.coinbase.qr_code.step2.description",step:"create",title:"wallet_connectors.coinbase.qr_code.step2.title"},{description:"wallet_connectors.coinbase.qr_code.step3.description",step:"scan",title:"wallet_connectors.coinbase.qr_code.step3.title"}]}},extension:{instructions:{learnMoreUrl:"https://coinbase.com/wallet/articles/getting-started-extension",steps:[{description:"wallet_connectors.coinbase.extension.step1.description",step:"install",title:"wallet_connectors.coinbase.extension.step1.title"},{description:"wallet_connectors.coinbase.extension.step2.description",step:"create",title:"wallet_connectors.coinbase.extension.step2.title"},{description:"wallet_connectors.coinbase.extension.step3.description",step:"refresh",title:"wallet_connectors.coinbase.extension.step3.title"}]}}},createConnector:n=>o=>({...coinbaseWallet({appName:e,appLogoUrl:t,headlessMode:!0})(o),...n})}};function isMetaMask(e){return!!(null==e?void 0:e.isMetaMask)&&(!e.isBraveWallet||!!e._events||!!e._state)&&!e.isApexWallet&&!e.isAvalanche&&!e.isBackpack&&!e.isBifrost&&!e.isBitKeep&&!e.isBitski&&!e.isBlockWallet&&!e.isCoinbaseWallet&&!e.isDawn&&!e.isEnkrypt&&!e.isExodus&&!e.isFrame&&!e.isFrontier&&!e.isGamestop&&!e.isHyperPay&&!e.isImToken&&!e.isKuCoinWallet&&!e.isMathWallet&&!e.isOkxWallet&&!e.isOKExWallet&&!e.isOneInchIOSWallet&&!e.isOneInchAndroidWallet&&!e.isOpera&&!e.isPhantom&&!e.isPortal&&!e.isRabby&&!e.isRainbow&&!e.isStatus&&!e.isTalisman&&!e.isTally&&!e.isTokenPocket&&!e.isTokenary&&!e.isTrust&&!e.isTrustWallet&&!e.isXDEFI&&!e.isZeal&&!e.isZerion}var metaMaskWallet=({projectId:e,walletConnectParameters:t})=>{var o,i,s;let l=hasInjectedProvider({flag:"isMetaMask"}),c=!l,getUri=e=>isAndroid()?e:isIOS()?`metamask://wc?uri=${encodeURIComponent(e)}`:`https://metamask.app.link/wc?uri=${encodeURIComponent(e)}`;return{id:"metaMask",name:"MetaMask",rdns:"io.metamask",iconUrl:async()=>(await n.e(4419).then(n.bind(n,84419))).default,iconAccent:"#f6851a",iconBackground:"#fff",installed:c?void 0:l,downloadUrls:{android:"https://play.google.com/store/apps/details?id=io.metamask",ios:"https://apps.apple.com/us/app/metamask/id1438144202",mobile:"https://metamask.io/download",qrCode:"https://metamask.io/download",chrome:"https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn",edge:"https://microsoftedge.microsoft.com/addons/detail/metamask/ejbalbakoplchlghecdalmeeeajnimhm",firefox:"https://addons.mozilla.org/firefox/addon/ether-metamask",opera:"https://addons.opera.com/extensions/details/metamask-10",browserExtension:"https://metamask.io/download"},mobile:{getUri:c?getUri:void 0},qrCode:c?{getUri,instructions:{learnMoreUrl:"https://metamask.io/faqs/",steps:[{description:"wallet_connectors.metamask.qr_code.step1.description",step:"install",title:"wallet_connectors.metamask.qr_code.step1.title"},{description:"wallet_connectors.metamask.qr_code.step2.description",step:"create",title:"wallet_connectors.metamask.qr_code.step2.title"},{description:"wallet_connectors.metamask.qr_code.step3.description",step:"refresh",title:"wallet_connectors.metamask.qr_code.step3.title"}]}}:void 0,extension:{instructions:{learnMoreUrl:"https://metamask.io/faqs/",steps:[{description:"wallet_connectors.metamask.extension.step1.description",step:"install",title:"wallet_connectors.metamask.extension.step1.title"},{description:"wallet_connectors.metamask.extension.step2.description",step:"create",title:"wallet_connectors.metamask.extension.step2.title"},{description:"wallet_connectors.metamask.extension.step3.description",step:"refresh",title:"wallet_connectors.metamask.extension.step3.title"}]}},createConnector:c?getWalletConnectConnector({projectId:e,walletConnectParameters:t}):getInjectedConnector({target:"undefined"!=typeof window?null!=(s=null==(i=null==(o=window.ethereum)?void 0:o.providers)?void 0:i.find(isMetaMask))?s:window.ethereum:void 0})}},rainbowWallet=({projectId:e,walletConnectParameters:t})=>{let o=hasInjectedProvider({flag:"isRainbow"}),i=!o,getUri=e=>isAndroid()?e:isIOS()?`rainbow://wc?uri=${encodeURIComponent(e)}&connector=rainbowkit`:`https://rnbwapp.com/wc?uri=${encodeURIComponent(e)}&connector=rainbowkit`;return{id:"rainbow",name:"Rainbow",rdns:"me.rainbow",iconUrl:async()=>(await n.e(1608).then(n.bind(n,31608))).default,iconBackground:"#0c2f78",installed:i?void 0:o,downloadUrls:{android:"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Drainbowkit&utm_source=rainbowkit",ios:"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=rainbowkit&mt=8",mobile:"https://rainbow.download?utm_source=rainbowkit",qrCode:"https://rainbow.download?utm_source=rainbowkit&utm_medium=qrcode",browserExtension:"https://rainbow.me/extension?utm_source=rainbowkit"},mobile:{getUri:i?getUri:void 0},qrCode:i?{getUri,instructions:{learnMoreUrl:"https://learn.rainbow.me/connect-to-a-website-or-app?utm_source=rainbowkit&utm_medium=connector&utm_campaign=learnmore",steps:[{description:"wallet_connectors.rainbow.qr_code.step1.description",step:"install",title:"wallet_connectors.rainbow.qr_code.step1.title"},{description:"wallet_connectors.rainbow.qr_code.step2.description",step:"create",title:"wallet_connectors.rainbow.qr_code.step2.title"},{description:"wallet_connectors.rainbow.qr_code.step3.description",step:"scan",title:"wallet_connectors.rainbow.qr_code.step3.title"}]}}:void 0,createConnector:i?getWalletConnectConnector({projectId:e,walletConnectParameters:t}):getInjectedConnector({flag:"isRainbow"})}},walletConnectWallet=({projectId:e,options:t})=>({id:"walletConnect",name:"WalletConnect",installed:void 0,iconUrl:async()=>(await n.e(3525).then(n.bind(n,33525))).default,iconBackground:"#3b99fc",qrCode:{getUri:e=>e},createConnector:getWalletConnectConnector({projectId:e,walletConnectParameters:t})}),createDefaultTransports=e=>{let t=e.reduce((e,t)=>{let n=t.id;return e[n]=function(e,t={}){let{batch:n,fetchOptions:o,key:i="http",name:s="HTTP JSON-RPC",onFetchResponse:l,retryDelay:c}=t;return({chain:u,retryCount:d,timeout:p})=>{let{batchSize:f=1e3,wait:m=0}="object"==typeof n?n:{},b=t.retryCount??d,g=p??t.timeout??1e4,y=e||u?.rpcUrls.default.http[0];if(!y)throw new UrlRequiredError;let v=function(e,t={}){return{async request(n){let{body:o,fetchOptions:i={},onResponse:s=t.onResponse,timeout:l=t.timeout??1e4}=n,{headers:c,method:u,signal:d}={...t.fetchOptions,...i};try{let t;let n=await withTimeout(async({signal:t})=>{let n=await fetch(e,{...i,body:Array.isArray(o)?(0,e7.P)(o.map(e=>({jsonrpc:"2.0",id:e.id??tj.take(),...e}))):(0,e7.P)({jsonrpc:"2.0",id:o.id??tj.take(),...o}),headers:{...c,"Content-Type":"application/json"},method:u||"POST",signal:d||(l>0?t:null)});return n},{errorInstance:new tS.W5({body:o,url:e}),timeout:l,signal:!0});if(s&&await s(n),t=n.headers.get("Content-Type")?.startsWith("application/json")?await n.json():await n.text(),!n.ok)throw new tS.Gg({body:o,details:(0,e7.P)(t.error)||n.statusText,headers:n.headers,status:n.status,url:e});return t}catch(t){if(t instanceof tS.Gg||t instanceof tS.W5)throw t;throw new tS.Gg({body:o,details:t.message,url:e})}}}}(y,{fetchOptions:o,onResponse:l,timeout:g});return(0,tT.q)({key:i,name:s,async request({method:t,params:o}){let i={method:t,params:o},{schedule:s}=(0,tI.S)({id:`${e}`,wait:m,shouldSplitBatch:e=>e.length>f,fn:e=>v.request({body:e}),sort:(e,t)=>e.id-t.id}),fn=async e=>n?s(e):[await v.request({body:e})],[{error:l,result:c}]=await fn(i);if(l)throw new tS.bs({body:i,error:l,url:y});return c},retryCount:b,retryDelay:c,timeout:g,type:"http"},{fetchOptions:o,url:y})}}(),e},{});return t},getDefaultConfig=({appName:e,appDescription:t,appUrl:n,appIcon:o,wallets:i,projectId:s,...l})=>{let{transports:c,chains:u,...d}=l,p=computeWalletConnectMetaData({appName:e,appDescription:t,appUrl:n,appIcon:o}),f=connectorsForWallets(i||[{groupName:"Popular",wallets:[rainbowWallet,dist_coinbaseWallet,metaMaskWallet,walletConnectWallet]}],{projectId:s,appName:e,appDescription:t,appUrl:n,appIcon:o,walletConnectParameters:{metadata:p}});return c||(c=createDefaultTransports(u)),function(e){let t;let{multiInjectedProviderDiscovery:n=!0,storage:o=function(e){let{deserialize:t=deserialize_deserialize,key:n="wagmi",serialize:o=serialize_serialize,storage:i=tU}=e;function unwrap(e){return e instanceof Promise?e.then(e=>e).catch(()=>null):e}return{...i,key:n,async getItem(e,o){let s=i.getItem(`${n}.${e}`),l=await unwrap(s);return l?t(l)??null:o??null},async setItem(e,t){let s=`${n}.${e}`;null===t?await unwrap(i.removeItem(s)):await unwrap(i.setItem(s,o(t)))},async removeItem(e){await unwrap(i.removeItem(`${n}.${e}`))}}}({storage:"undefined"!=typeof window&&window.localStorage?window.localStorage:tU}),syncConnectedChain:i=!0,ssr:s,...l}=e,c="undefined"!=typeof window&&n?function(){let e=new Set,t=[],request=()=>(function(e){let handler=t=>e(t.detail);return window.addEventListener("eip6963:announceProvider",handler),window.dispatchEvent(new CustomEvent("eip6963:requestProvider")),()=>window.removeEventListener("eip6963:announceProvider",handler)})(n=>{t.some(({info:e})=>e.uuid===n.info.uuid)||(t=[...t,n],e.forEach(e=>e(t,{added:[n]})))}),n=request();return{_listeners:()=>e,clear(){e.forEach(e=>e([],{removed:[...t]})),t=[]},destroy(){this.clear(),e.clear(),n()},findProvider:({rdns:e})=>t.find(t=>t.info.rdns===e),getProviders:()=>t,reset(){this.clear(),n(),n=request()},subscribe:(n,{emitImmediately:o}={})=>(e.add(n),o&&n(t,{added:t}),()=>e.delete(n))}}():void 0,u=vanilla_createStore(()=>l.chains),d=vanilla_createStore(()=>[...l.connectors??[],...s?[]:c?.getProviders().map(providerDetailToConnector)??[]].map(setup));function setup(e){var t;let n=(t=function(e=11){if(!C||tF+e>512){C="",tF=0;for(let e=0;e<256;e++)C+=(256+256*Math.random()|0).toString(16).substring(1)}return C.substring(tF,tF+++e)}(),new Emitter(t)),i={...e({emitter:n,chains:u.getState(),storage:o}),emitter:n,uid:n.uid};return n.on("connect",connect),i.setup?.(),i}function providerDetailToConnector(e){let{info:t}=e,n=e.provider;return injected({target:{...t,id:t.rdns,provider:n}})}let p=new Map;function getInitialState(){return{chainId:u.getState()[0].id,connections:new Map,current:void 0,status:"disconnected"}}let f="0.0.0-canary-";t=tN.i.startsWith(f)?parseInt(tN.i.replace(f,"")):parseInt(tN.i.split(".")[0]??"0");let m=vanilla_createStore(subscribeWithSelector(o?persist(getInitialState,{migrate(e,n){if(n===t)return e;let o=getInitialState(),i=e&&"object"==typeof e&&"chainId"in e&&"number"==typeof e.chainId?e.chainId:o.chainId;return{...o,chainId:i}},name:"store",partialize:e=>({connections:{__type:"Map",value:Array.from(e.connections.entries()).map(([e,t])=>{let{id:n,name:o,type:i,uid:s}=t.connector;return[e,{...t,connector:{id:n,name:o,type:i,uid:s}}]})},chainId:e.chainId,current:e.current}),skipHydration:s,storage:o,version:t}):getInitialState));function change(e){m.setState(t=>{let n=t.connections.get(e.uid);return n?{...t,connections:new Map(t.connections).set(e.uid,{accounts:e.accounts??n.accounts,chainId:e.chainId??n.chainId,connector:n.connector})}:t})}function connect(e){"connecting"!==m.getState().status&&"reconnecting"!==m.getState().status&&m.setState(t=>{let n=d.getState().find(t=>t.uid===e.uid);return n?{...t,connections:new Map(t.connections).set(e.uid,{accounts:e.accounts,chainId:e.chainId,connector:n}),current:e.uid,status:"connected"}:t})}return i&&m.subscribe(({connections:e,current:t})=>t?e.get(t)?.chainId:void 0,e=>{let t=u.getState().some(t=>t.id===e);if(t)return m.setState(t=>({...t,chainId:e??t.chainId}))}),c?.subscribe(e=>{let t=new Map;for(let e of d.getState())t.set(e.id,!0);let n=[];for(let o of e){let e=setup(providerDetailToConnector(o));t.has(e.id)||n.push(e)}d.setState(e=>[...e,...n],!0)}),{get chains(){return u.getState()},get connectors(){return d.getState()},storage:o,getClient:function(e={}){let t;let n=e.chainId??m.getState().chainId,o=u.getState().find(e=>e.id===n);if(e.chainId&&!o)throw new tw.X4;{let e=p.get(m.getState().chainId);if(e&&!o)return e;if(!o)throw new tw.X4}{let e=p.get(n);if(e)return e}if(l.client)t=l.client({chain:o});else{let e=o.id,n=u.getState().map(e=>e.id),i={},s=Object.entries(l);for(let[t,o]of s)if("chains"!==t&&"client"!==t&&"connectors"!==t&&"transports"!==t){if("object"==typeof o){if(e in o)i[t]=o[e];else{let e=n.some(e=>e in o);if(e)continue;i[t]=o}}else i[t]=o}t=(0,tP.e)({...i,chain:o,batch:i.batch??{multicall:!0},transport:t=>l.transports[e]({...t,connectors:d})})}return p.set(n,t),t},get state(){return m.getState()},setState(e){let t;t="function"==typeof e?e(m.getState()):e;let n=getInitialState();"object"!=typeof t&&(t=n);let o=Object.keys(n).some(e=>!(e in t));o&&(t=n),m.setState(t,!0)},subscribe:(e,t,n)=>m.subscribe(e,t,n?{...n,fireImmediately:n.emitImmediately}:void 0),_internal:{mipd:c,store:m,ssr:!!s,syncConnectedChain:i,transports:l.transports,chains:{setState(e){let t="function"==typeof e?e(u.getState()):e;if(0!==t.length)return u.setState(t,!0)},subscribe:e=>u.subscribe(e)},connectors:{providerDetailToConnector,setup,setState:e=>d.setState("function"==typeof e?e(d.getState()):e,!0),subscribe:e=>d.subscribe(e)},events:{change,connect,disconnect:function disconnect(e){m.setState(t=>{let n=t.connections.get(e.uid);if(n&&(n.connector.emitter.off("change",change),n.connector.emitter.off("disconnect",disconnect),n.connector.emitter.on("connect",connect)),t.connections.delete(e.uid),0===t.connections.size)return{...t,connections:new Map,current:void 0,status:"disconnected"};let o=t.connections.values().next().value;return{...t,connections:new Map(t.connections),current:o.connector.uid}})}}}}}({connectors:f,chains:u,transports:c,...d})}},66474:function(e,t,n){"use strict";n.d(t,{j:function(){return s}});var o=n(7506),i=n(24139),s=new class extends o.l{#L;#z;#q;constructor(){super(),this.#q=e=>{if(!i.sk&&window.addEventListener){let listener=()=>e();return window.addEventListener("visibilitychange",listener,!1),()=>{window.removeEventListener("visibilitychange",listener)}}}}onSubscribe(){this.#z||this.setEventListener(this.#q)}onUnsubscribe(){this.hasListeners()||(this.#z?.(),this.#z=void 0)}setEventListener(e){this.#q=e,this.#z?.(),this.#z=e(e=>{"boolean"==typeof e?this.setFocused(e):this.onFocus()})}setFocused(e){let t=this.#L!==e;t&&(this.#L=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return"boolean"==typeof this.#L?this.#L:globalThis.document?.visibilityState!=="hidden"}}},59289:function(e,t,n){"use strict";n.d(t,{R:function(){return getDefaultState},m:function(){return l}});var o=n(27037),i=n(48907),s=n(72008),l=class extends i.F{#G;#d;#u;#W;constructor(e){super(),this.mutationId=e.mutationId,this.#d=e.defaultOptions,this.#u=e.mutationCache,this.#G=[],this.state=e.state||getDefaultState(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options={...this.#d,...e},this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#G.includes(e)||(this.#G.push(e),this.clearGcTimeout(),this.#u.notify({type:"observerAdded",mutation:this,observer:e}))}removeObserver(e){this.#G=this.#G.filter(t=>t!==e),this.scheduleGc(),this.#u.notify({type:"observerRemoved",mutation:this,observer:e})}optionalRemove(){this.#G.length||("pending"===this.state.status?this.scheduleGc():this.#u.remove(this))}continue(){return this.#W?.continue()??this.execute(this.state.variables)}async execute(e){let t="pending"===this.state.status;try{if(!t){this.#H({type:"pending",variables:e}),await this.#u.config.onMutate?.(e,this);let t=await this.options.onMutate?.(e);t!==this.state.context&&this.#H({type:"pending",context:t,variables:e})}let n=await (this.#W=(0,s.Mz)({fn:()=>this.options.mutationFn?this.options.mutationFn(e):Promise.reject(Error("No mutationFn found")),onFail:(e,t)=>{this.#H({type:"failed",failureCount:e,error:t})},onPause:()=>{this.#H({type:"pause"})},onContinue:()=>{this.#H({type:"continue"})},retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode}),this.#W.promise);return await this.#u.config.onSuccess?.(n,e,this.state.context,this),await this.options.onSuccess?.(n,e,this.state.context),await this.#u.config.onSettled?.(n,null,this.state.variables,this.state.context,this),await this.options.onSettled?.(n,null,e,this.state.context),this.#H({type:"success",data:n}),n}catch(t){try{throw await this.#u.config.onError?.(t,e,this.state.context,this),await this.options.onError?.(t,e,this.state.context),await this.#u.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this),await this.options.onSettled?.(void 0,t,e,this.state.context),t}finally{this.#H({type:"error",error:t})}}}#H(e){this.state=(t=>{switch(e.type){case"failed":return{...t,failureCount:e.failureCount,failureReason:e.error};case"pause":return{...t,isPaused:!0};case"continue":return{...t,isPaused:!1};case"pending":return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:!(0,s.Kw)(this.options.networkMode),status:"pending",variables:e.variables,submittedAt:Date.now()};case"success":return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:"error"}}})(this.state),o.V.batch(()=>{this.#G.forEach(t=>{t.onMutationUpdate(e)}),this.#u.notify({mutation:this,type:"updated",action:e})})}};function getDefaultState(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}},27037:function(e,t,n){"use strict";n.d(t,{V:function(){return o}});var o=function(){let e=[],t=0,notifyFn=e=>{e()},batchNotifyFn=e=>{e()},scheduleFn=e=>setTimeout(e,0),schedule=n=>{t?e.push(n):scheduleFn(()=>{notifyFn(n)})},flush=()=>{let t=e;e=[],t.length&&scheduleFn(()=>{batchNotifyFn(()=>{t.forEach(e=>{notifyFn(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{--t||flush()}return n},batchCalls:e=>(...t)=>{schedule(()=>{e(...t)})},schedule,setNotifyFunction:e=>{notifyFn=e},setBatchNotifyFunction:e=>{batchNotifyFn=e},setScheduler:e=>{scheduleFn=e}}}()},14304:function(e,t,n){"use strict";n.d(t,{N:function(){return s}});var o=n(7506),i=n(24139),s=new class extends o.l{#Q=!0;#z;#q;constructor(){super(),this.#q=e=>{if(!i.sk&&window.addEventListener){let onlineListener=()=>e(!0),offlineListener=()=>e(!1);return window.addEventListener("online",onlineListener,!1),window.addEventListener("offline",offlineListener,!1),()=>{window.removeEventListener("online",onlineListener),window.removeEventListener("offline",offlineListener)}}}}onSubscribe(){this.#z||this.setEventListener(this.#q)}onUnsubscribe(){this.hasListeners()||(this.#z?.(),this.#z=void 0)}setEventListener(e){this.#q=e,this.#z?.(),this.#z=e(this.setOnline.bind(this))}setOnline(e){let t=this.#Q!==e;t&&(this.#Q=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#Q}}},56888:function(e,t,n){"use strict";n.d(t,{A:function(){return c},z:function(){return fetchState}});var o=n(24139),i=n(27037),s=n(72008),l=n(48907),c=class extends l.F{#K;#V;#Z;#W;#G;#d;#J;constructor(e){super(),this.#J=!1,this.#d=e.defaultOptions,this.setOptions(e.options),this.#G=[],this.#Z=e.cache,this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#K=e.state||function(e){let t="function"==typeof e.initialData?e.initialData():e.initialData,n=void 0!==t,o=n?"function"==typeof e.initialDataUpdatedAt?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?o??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}(this.options),this.state=this.#K,this.scheduleGc()}get meta(){return this.options.meta}setOptions(e){this.options={...this.#d,...e},this.updateGcTime(this.options.gcTime)}optionalRemove(){this.#G.length||"idle"!==this.state.fetchStatus||this.#Z.remove(this)}setData(e,t){let n=(0,o.oE)(this.state.data,e,this.options);return this.#H({data:n,type:"success",dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e,t){this.#H({type:"setState",state:e,setStateOptions:t})}cancel(e){let t=this.#W?.promise;return this.#W?.cancel(e),t?t.then(o.ZT).catch(o.ZT):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState(this.#K)}isActive(){return this.#G.some(e=>!1!==e.options.enabled)}isDisabled(){return this.getObserversCount()>0&&!this.isActive()}isStale(){return!!this.state.isInvalidated||(this.getObserversCount()>0?this.#G.some(e=>e.getCurrentResult().isStale):void 0===this.state.data)}isStaleByTime(e=0){return this.state.isInvalidated||void 0===this.state.data||!(0,o.Kp)(this.state.dataUpdatedAt,e)}onFocus(){let e=this.#G.find(e=>e.shouldFetchOnWindowFocus());e?.refetch({cancelRefetch:!1}),this.#W?.continue()}onOnline(){let e=this.#G.find(e=>e.shouldFetchOnReconnect());e?.refetch({cancelRefetch:!1}),this.#W?.continue()}addObserver(e){this.#G.includes(e)||(this.#G.push(e),this.clearGcTimeout(),this.#Z.notify({type:"observerAdded",query:this,observer:e}))}removeObserver(e){this.#G.includes(e)&&(this.#G=this.#G.filter(t=>t!==e),this.#G.length||(this.#W&&(this.#J?this.#W.cancel({revert:!0}):this.#W.cancelRetry()),this.scheduleGc()),this.#Z.notify({type:"observerRemoved",query:this,observer:e}))}getObserversCount(){return this.#G.length}invalidate(){this.state.isInvalidated||this.#H({type:"invalidate"})}fetch(e,t){if("idle"!==this.state.fetchStatus){if(void 0!==this.state.data&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#W)return this.#W.continueRetry(),this.#W.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.#G.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,i={queryKey:this.queryKey,meta:this.meta},addSignalProperty=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#J=!0,n.signal)})};addSignalProperty(i);let l={fetchOptions:t,options:this.options,queryKey:this.queryKey,state:this.state,fetchFn:()=>this.options.queryFn&&this.options.queryFn!==o.CN?(this.#J=!1,this.options.persister)?this.options.persister(this.options.queryFn,i,this):this.options.queryFn(i):Promise.reject(Error(`Missing queryFn: '${this.options.queryHash}'`))};addSignalProperty(l),this.options.behavior?.onFetch(l,this),this.#V=this.state,("idle"===this.state.fetchStatus||this.state.fetchMeta!==l.fetchOptions?.meta)&&this.#H({type:"fetch",meta:l.fetchOptions?.meta});let onError=e=>{(0,s.DV)(e)&&e.silent||this.#H({type:"error",error:e}),(0,s.DV)(e)||(this.#Z.config.onError?.(e,this),this.#Z.config.onSettled?.(this.state.data,e,this)),this.isFetchingOptimistic||this.scheduleGc(),this.isFetchingOptimistic=!1};return this.#W=(0,s.Mz)({fn:l.fetchFn,abort:n.abort.bind(n),onSuccess:e=>{if(void 0===e){onError(Error(`${this.queryHash} data is undefined`));return}this.setData(e),this.#Z.config.onSuccess?.(e,this),this.#Z.config.onSettled?.(e,this.state.error,this),this.isFetchingOptimistic||this.scheduleGc(),this.isFetchingOptimistic=!1},onError,onFail:(e,t)=>{this.#H({type:"failed",failureCount:e,error:t})},onPause:()=>{this.#H({type:"pause"})},onContinue:()=>{this.#H({type:"continue"})},retry:l.options.retry,retryDelay:l.options.retryDelay,networkMode:l.options.networkMode}),this.#W.promise}#H(e){this.state=(t=>{switch(e.type){case"failed":return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case"pause":return{...t,fetchStatus:"paused"};case"continue":return{...t,fetchStatus:"fetching"};case"fetch":return{...t,...fetchState(t.data,this.options),fetchMeta:e.meta??null};case"success":return{...t,data:e.data,dataUpdateCount:t.dataUpdateCount+1,dataUpdatedAt:e.dataUpdatedAt??Date.now(),error:null,isInvalidated:!1,status:"success",...!e.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};case"error":let n=e.error;if((0,s.DV)(n)&&n.revert&&this.#V)return{...this.#V,fetchStatus:"idle"};return{...t,error:n,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:n,fetchStatus:"idle",status:"error"};case"invalidate":return{...t,isInvalidated:!0};case"setState":return{...t,...e.state}}})(this.state),i.V.batch(()=>{this.#G.forEach(e=>{e.onQueryUpdate()}),this.#Z.notify({query:this,type:"updated",action:e})})}};function fetchState(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:(0,s.Kw)(t.networkMode)?"fetching":"paused",...void 0===e&&{error:null,status:"pending"}}}},48907:function(e,t,n){"use strict";n.d(t,{F:function(){return i}});var o=n(24139),i=class{#X;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),(0,o.PN)(this.gcTime)&&(this.#X=setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(o.sk?1/0:3e5))}clearGcTimeout(){this.#X&&(clearTimeout(this.#X),this.#X=void 0)}}},72008:function(e,t,n){"use strict";n.d(t,{DV:function(){return isCancelledError},Kw:function(){return canFetch},Mz:function(){return createRetryer}});var o=n(66474),i=n(14304),s=n(24139);function defaultRetryDelay(e){return Math.min(1e3*2**e,3e4)}function canFetch(e){return(e??"online")!=="online"||i.N.isOnline()}var l=class{constructor(e){this.revert=e?.revert,this.silent=e?.silent}};function isCancelledError(e){return e instanceof l}function createRetryer(e){let t,n,c,u=!1,d=0,p=!1,f=new Promise((e,t)=>{n=e,c=t}),shouldPause=()=>!o.j.isFocused()||"always"!==e.networkMode&&!i.N.isOnline(),resolve=o=>{p||(p=!0,e.onSuccess?.(o),t?.(),n(o))},reject=n=>{p||(p=!0,e.onError?.(n),t?.(),c(n))},pause=()=>new Promise(n=>{t=e=>{let t=p||!shouldPause();return t&&n(e),t},e.onPause?.()}).then(()=>{t=void 0,p||e.onContinue?.()}),run=()=>{let t;if(!p){try{t=e.fn()}catch(e){t=Promise.reject(e)}Promise.resolve(t).then(resolve).catch(t=>{if(p)return;let n=e.retry??(s.sk?0:3),o=e.retryDelay??defaultRetryDelay,i="function"==typeof o?o(d,t):o,l=!0===n||"number"==typeof n&&d{if(shouldPause())return pause()}).then(()=>{u?reject(t):run()})})}};return canFetch(e.networkMode)?run():pause().then(run),{promise:f,cancel:t=>{p||(reject(new l(t)),e.abort?.())},continue:()=>{let e=t?.();return e?f:Promise.resolve()},cancelRetry:()=>{u=!0},continueRetry:()=>{u=!1}}}},7506:function(e,t,n){"use strict";n.d(t,{l:function(){return o}});var o=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}}},24139:function(e,t,n){"use strict";n.d(t,{CN:function(){return i},Ht:function(){return addToStart},Kp:function(){return timeUntilStale},PN:function(){return isValidTimeout},Rm:function(){return hashQueryKeyByOptions},SE:function(){return functionalUpdate},VS:function(){return shallowEqualObjects},VX:function(){return addToEnd},X7:function(){return matchMutation},Ym:function(){return hashKey},ZT:function(){return noop},_v:function(){return sleep},_x:function(){return matchQuery},oE:function(){return replaceData},sk:function(){return o},to:function(){return partialMatchKey}});var o="undefined"==typeof window||"Deno"in globalThis;function noop(){}function functionalUpdate(e,t){return"function"==typeof e?e(t):e}function isValidTimeout(e){return"number"==typeof e&&e>=0&&e!==1/0}function timeUntilStale(e,t){return Math.max(e+(t||0)-Date.now(),0)}function matchQuery(e,t){let{type:n="all",exact:o,fetchStatus:i,predicate:s,queryKey:l,stale:c}=e;if(l){if(o){if(t.queryHash!==hashQueryKeyByOptions(l,t.options))return!1}else if(!partialMatchKey(t.queryKey,l))return!1}if("all"!==n){let e=t.isActive();if("active"===n&&!e||"inactive"===n&&e)return!1}return("boolean"!=typeof c||t.isStale()===c)&&(!i||i===t.state.fetchStatus)&&(!s||!!s(t))}function matchMutation(e,t){let{exact:n,status:o,predicate:i,mutationKey:s}=e;if(s){if(!t.options.mutationKey)return!1;if(n){if(hashKey(t.options.mutationKey)!==hashKey(s))return!1}else if(!partialMatchKey(t.options.mutationKey,s))return!1}return(!o||t.state.status===o)&&(!i||!!i(t))}function hashQueryKeyByOptions(e,t){let n=t?.queryKeyHashFn||hashKey;return n(e)}function hashKey(e){return JSON.stringify(e,(e,t)=>isPlainObject(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function partialMatchKey(e,t){return e===t||typeof e==typeof t&&!!e&&!!t&&"object"==typeof e&&"object"==typeof t&&!Object.keys(t).some(n=>!partialMatchKey(e[n],t[n]))}function shallowEqualObjects(e,t){if(!t||Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(e[n]!==t[n])return!1;return!0}function isPlainArray(e){return Array.isArray(e)&&e.length===Object.keys(e).length}function isPlainObject(e){if(!hasObjectPrototype(e))return!1;let t=e.constructor;if(void 0===t)return!0;let n=t.prototype;return!!(hasObjectPrototype(n)&&n.hasOwnProperty("isPrototypeOf"))}function hasObjectPrototype(e){return"[object Object]"===Object.prototype.toString.call(e)}function sleep(e){return new Promise(t=>{setTimeout(t,e)})}function replaceData(e,t,n){return"function"==typeof n.structuralSharing?n.structuralSharing(e,t):!1!==n.structuralSharing?function replaceEqualDeep(e,t){if(e===t)return e;let n=isPlainArray(e)&&isPlainArray(t);if(n||isPlainObject(e)&&isPlainObject(t)){let o=n?e:Object.keys(e),i=o.length,s=n?t:Object.keys(t),l=s.length,c=n?[]:{},u=0;for(let i=0;in?o.slice(1):o}function addToStart(e,t,n=0){let o=[t,...e];return n&&o.length>n?o.slice(0,-1):o}var i=Symbol()},30202:function(e,t,n){"use strict";n.d(t,{NL:function(){return useQueryClient},aH:function(){return QueryClientProvider}});var o=n(67294),i=n(85893),s=o.createContext(void 0),useQueryClient=e=>{let t=o.useContext(s);if(e)return e;if(!t)throw Error("No QueryClient set, use QueryClientProvider to set one");return t},QueryClientProvider=({client:e,children:t})=>(o.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,i.jsx)(s.Provider,{value:e,children:t}))},98029:function(e,t,n){"use strict";n.d(t,{D:function(){return useMutation}});var o=n(67294),i=n(59289),s=n(27037),l=n(7506),c=n(24139),u=class extends l.l{#g;#C=void 0;#Y;#$;constructor(e,t){super(),this.#g=e,this.setOptions(t),this.bindMethods(),this.#ee()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#g.defaultMutationOptions(e),(0,c.VS)(this.options,t)||this.#g.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#Y,observer:this}),t?.mutationKey&&this.options.mutationKey&&(0,c.Ym)(t.mutationKey)!==(0,c.Ym)(this.options.mutationKey)?this.reset():this.#Y?.state.status==="pending"&&this.#Y.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#Y?.removeObserver(this)}onMutationUpdate(e){this.#ee(),this.#_(e)}getCurrentResult(){return this.#C}reset(){this.#Y?.removeObserver(this),this.#Y=void 0,this.#ee(),this.#_()}mutate(e,t){return this.#$=t,this.#Y?.removeObserver(this),this.#Y=this.#g.getMutationCache().build(this.#g,this.options),this.#Y.addObserver(this),this.#Y.execute(e)}#ee(){let e=this.#Y?.state??(0,i.R)();this.#C={...e,isPending:"pending"===e.status,isSuccess:"success"===e.status,isError:"error"===e.status,isIdle:"idle"===e.status,mutate:this.mutate,reset:this.reset}}#_(e){s.V.batch(()=>{if(this.#$&&this.hasListeners()){let t=this.#C.variables,n=this.#C.context;e?.type==="success"?(this.#$.onSuccess?.(e.data,t,n),this.#$.onSettled?.(e.data,null,t,n)):e?.type==="error"&&(this.#$.onError?.(e.error,t,n),this.#$.onSettled?.(void 0,e.error,t,n))}this.listeners.forEach(e=>{e(this.#C)})})}},d=n(30202),p=n(86290);function useMutation(e,t){let n=(0,d.NL)(t),[i]=o.useState(()=>new u(n,e));o.useEffect(()=>{i.setOptions(e)},[i,e]);let l=o.useSyncExternalStore(o.useCallback(e=>i.subscribe(s.V.batchCalls(e)),[i]),()=>i.getCurrentResult(),()=>i.getCurrentResult()),c=o.useCallback((e,t)=>{i.mutate(e,t).catch(p.Z)},[i]);if(l.error&&(0,p.L)(i.options.throwOnError,[l.error]))throw l.error;return{...l,mutate:c,mutateAsync:l.mutate}}},86290:function(e,t,n){"use strict";function shouldThrowError(e,t){return"function"==typeof e?e(...t):!!e}function noop(){}n.d(t,{L:function(){return shouldThrowError},Z:function(){return noop}})},52425:function(e,t,n){"use strict";function getAccount(e){let t=e.state.current,n=e.state.connections.get(t),o=n?.accounts,i=o?.[0],s=e.chains.find(e=>e.id===n?.chainId),l=e.state.status;switch(l){case"connected":return{address:i,addresses:o,chain:s,chainId:n?.chainId,connector:n?.connector,isConnected:!0,isConnecting:!1,isDisconnected:!1,isReconnecting:!1,status:l};case"reconnecting":return{address:i,addresses:o,chain:s,chainId:n?.chainId,connector:n?.connector,isConnected:!!i,isConnecting:!1,isDisconnected:!1,isReconnecting:!0,status:l};case"connecting":return{address:i,addresses:o,chain:s,chainId:n?.chainId,connector:n?.connector,isConnected:!1,isConnecting:!0,isDisconnected:!1,isReconnecting:!1,status:l};case"disconnected":return{address:void 0,addresses:void 0,chain:void 0,chainId:void 0,connector:void 0,isConnected:!1,isConnecting:!1,isDisconnected:!0,isReconnecting:!1,status:l}}}n.d(t,{D:function(){return getAccount}})},33397:function(e,t,n){"use strict";n.d(t,{u:function(){return watchAccount}});var o=n(74751),i=n(52425);function watchAccount(e,t){let{onChange:n}=t;return e.subscribe(()=>(0,i.D)(e),n,{equalityFn(e,t){let{connector:n,...i}=e,{connector:s,...l}=t;return(0,o.v)(i,l)&&n?.id===s?.id&&n?.uid===s?.uid}})}},7066:function(e,t,n){"use strict";n.d(t,{G:function(){return BaseError}});var o,i,s=n(79983);let getVersion=()=>`@wagmi/core@${s.i}`;var __classPrivateFieldGet=function(e,t,n,o){if("a"===n&&!o)throw TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!o:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?o:"a"===n?o.call(e):o?o.value:t.get(e)};let BaseError=class BaseError extends Error{get docsBaseUrl(){return"https://wagmi.sh/core"}get version(){return getVersion()}constructor(e,t={}){super(),o.add(this),Object.defineProperty(this,"details",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"docsPath",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"metaMessages",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"shortMessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"WagmiCoreError"});let n=t.cause instanceof BaseError?t.cause.details:t.cause?.message?t.cause.message:t.details,i=t.cause instanceof BaseError&&t.cause.docsPath||t.docsPath;this.message=[e||"An error occurred.","",...t.metaMessages?[...t.metaMessages,""]:[],...i?[`Docs: ${this.docsBaseUrl}${i}.html${t.docsSlug?`#${t.docsSlug}`:""}`]:[],...n?[`Details: ${n}`]:[],`Version: ${this.version}`].join("\n"),t.cause&&(this.cause=t.cause),this.details=n,this.docsPath=i,this.metaMessages=t.metaMessages,this.shortMessage=e}walk(e){return __classPrivateFieldGet(this,o,"m",i).call(this,this,e)}};o=new WeakSet,i=function _BaseError_walk(e,t){return t?.(e)?e:e.cause?__classPrivateFieldGet(this,o,"m",_BaseError_walk).call(this,e.cause,t):e}},87675:function(e,t,n){"use strict";n.d(t,{JK:function(){return ConnectorAccountNotFoundError},X4:function(){return ChainNotConfiguredError},aH:function(){return ConnectorNotConnectedError},wi:function(){return ConnectorAlreadyConnectedError}});var o=n(7066);let ChainNotConfiguredError=class ChainNotConfiguredError extends o.G{constructor(){super("Chain not configured."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ChainNotConfiguredError"})}};let ConnectorAlreadyConnectedError=class ConnectorAlreadyConnectedError extends o.G{constructor(){super("Connector already connected."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ConnectorAlreadyConnectedError"})}};let ConnectorNotConnectedError=class ConnectorNotConnectedError extends o.G{constructor(){super("Connector not connected."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ConnectorNotConnectedError"})}};let ConnectorAccountNotFoundError=class ConnectorAccountNotFoundError extends o.G{constructor({address:e,connector:t}){super(`Account "${e}" not found for connector "${t.name}".`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ConnectorAccountNotFoundError"})}}},74751:function(e,t,n){"use strict";n.d(t,{v:function(){return function deepEqual(e,t){if(e===t)return!0;if(e&&t&&"object"==typeof e&&"object"==typeof t){let n,o;if(e.constructor!==t.constructor)return!1;if(Array.isArray(e)&&Array.isArray(t)){if((n=e.length)!==t.length)return!1;for(o=n;0!=o--;)if(!deepEqual(e[o],t[o]))return!1;return!0}if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();let i=Object.keys(e);if((n=i.length)!==Object.keys(t).length)return!1;for(o=n;0!=o--;)if(!Object.prototype.hasOwnProperty.call(t,i[o]))return!1;for(o=n;0!=o--;){let n=i[o];if(n&&!deepEqual(e[n],t[n]))return!1}return!0}return e!=e&&t!=t}}})},81946:function(e,t,n){"use strict";function getAction(e,t,n){let o=e[t.name];if("function"==typeof o)return o;let i=e[n];return"function"==typeof i?i:n=>t(e,n)}n.d(t,{s:function(){return getAction}})},79983:function(e,t,n){"use strict";n.d(t,{i:function(){return o}});let o="2.6.9"},90512:function(e,t,n){"use strict";t.Z=function(){for(var e,t,n=0,o="",i=arguments.length;nvoid 0!==e).length>0)}({request:v})&&!i)try{return await scheduleMulticall(e,{...v,blockNumber:f,blockTag:m})}catch(e){if(!(e instanceof c.pZ)&&!(e instanceof c.mm))throw e}let w=await e.request({method:"eth_call",params:i?[v,o,i]:[v,o]});if("0x"===w)return{data:void 0};return{data:w}}catch(c){let o=function(e){if(!(e instanceof l.G))return;let t=e.walk();return"object"==typeof t?.data?t.data?.data:t.data}(c),{offchainLookup:i,offchainLookupSignature:s}=await n.e(422).then(n.bind(n,10422));if(o?.slice(0,10)===s&&M)return{data:await i(e,{data:o,to:M})};throw function(e,{docsPath:t,...n}){let o=(()=>{let t=(0,w.k)(e,n);return t instanceof v.cj?e:t})();return new u.cg(o,{docsPath:t,...n})}(c,{...t,account:F,chain:e.chain})}}async function scheduleMulticall(e,t){let{batchSize:n=1024,wait:o=0}="object"==typeof e.batch?.multicall?e.batch.multicall:{},{blockNumber:s,blockTag:l="latest",data:d,multicallAddress:p,to:b}=t,v=p;if(!v){if(!e.chain)throw new c.pZ;v=(0,g.L)({blockNumber:s,chain:e.chain,contract:"multicall3"})}let w=s?(0,y.eC)(s):void 0,C=w||l,{schedule:E}=(0,x.S)({id:`${e.uid}.${C}`,wait:o,shouldSplitBatch(e){let t=e.reduce((e,{data:t})=>e+(t.length-2),0);return t>2*n},fn:async t=>{let n=t.map(e=>({allowFailure:!0,callData:e.data,target:e.to})),o=(0,m.R)({abi:i.F8,args:[n],functionName:"aggregate3"}),s=await e.request({method:"eth_call",params:[{data:o,to:v},C]});return(0,f.k)({abi:i.F8,args:[n],functionName:"aggregate3",data:s||"0x"})}}),[{returnData:A,success:k}]=await E({data:d,to:b});if(!k)throw new u.VQ({data:A});return"0x"===A?{data:void 0}:{data:A}}function parseStateMapping(e){if(e&&0!==e.length)return e.reduce((e,{slot:t,value:n})=>{if(66!==t.length)throw new d.W_({size:t.length,targetSize:66,type:"hex"});if(66!==n.length)throw new d.W_({size:n.length,targetSize:66,type:"hex"});return e[t]=n,e},{})}},66403:function(e,t,n){"use strict";n.d(t,{R:function(){return i}});var o=n(86164);let i=(0,o.a)({id:1,name:"Ethereum",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://cloudflare-eth.com"]}},blockExplorers:{default:{name:"Etherscan",url:"https://etherscan.io",apiUrl:"https://api.etherscan.io/api"}},contracts:{ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},ensUniversalResolver:{address:"0xce01f8eee7E479C928F8919abD53E553a36CeF67",blockCreated:19258213},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14353601}}})},16189:function(e,t,n){"use strict";let o;n.d(t,{e:function(){return createClient}});var i=n(14503);let s=256;function createClient(e){let{batch:t,cacheTime:n=e.pollingInterval??4e3,key:l="base",name:c="Base Client",pollingInterval:u=4e3,type:d="base"}=e,p=e.chain,f=e.account?(0,i.T)(e.account):void 0,{config:m,request:b,value:g}=e.transport({chain:p,pollingInterval:u}),y={...m,...g},v={account:f,batch:t,cacheTime:n,chain:p,key:l,name:c,pollingInterval:u,request:b,transport:y,type:d,uid:function(e=11){if(!o||s+e>512){o="",s=0;for(let e=0;e<256;e++)o+=(256+256*Math.random()|0).toString(16).substring(1)}return o.substring(s,s+++e)}()};return Object.assign(v,{extend:function extend(e){return t=>{let n=t(e);for(let e in v)delete n[e];let o={...e,...n};return Object.assign(o,{extend:extend(o)})}}(v)})}},91628:function(e,t,n){"use strict";n.d(t,{q:function(){return createTransport}});var o=n(62027),i=n(78863),s=n(39028),l=n(7760);function createTransport({key:e,name:t,request:n,retryCount:c=3,retryDelay:u=150,timeout:d,type:p},f){return{config:{key:e,name:t,request:n,retryCount:c,retryDelay:u,timeout:d,type:p},request:function(e,t={}){return async(n,c={})=>{let{retryDelay:u=150,retryCount:d=3}={...t,...c};return(0,l.J)(async()=>{try{return await e(n)}catch(e){switch(e.code){case s.s7.code:throw new s.s7(e);case s.B.code:throw new s.B(e);case s.LX.code:throw new s.LX(e);case s.nY.code:throw new s.nY(e);case s.XS.code:throw new s.XS(e);case s.yR.code:throw new s.yR(e);case s.Og.code:throw new s.Og(e);case s.pT.code:throw new s.pT(e);case s.KB.code:throw new s.KB(e);case s.gS.code:throw new s.gS(e);case s.Pv.code:throw new s.Pv(e);case s.GD.code:throw new s.GD(e);case s.ab.code:throw new s.ab(e);case s.PE.code:throw new s.PE(e);case s.Ts.code:throw new s.Ts(e);case s.u5.code:throw new s.u5(e);case s.I0.code:throw new s.I0(e);case s.x3.code:throw new s.x3(e);case 5e3:throw new s.ab(e);default:if(e instanceof o.G)throw e;throw new s.ir(e)}}},{delay:({count:e,error:t})=>{if(t&&t instanceof i.Gg){let e=t?.headers?.get("Retry-After");if(e?.match(/\d/))return 1e3*parseInt(e)}return~~(1<"code"in e&&"number"==typeof e.code?-1===e.code||e.code===s.Pv.code||e.code===s.XS.code:!(e instanceof i.Gg)||!e.status||403===e.status||408===e.status||413===e.status||429===e.status||500===e.status||502===e.status||503===e.status||504===e.status})}}(n,{retryCount:c,retryDelay:u}),value:f}}},16693:function(e,t,n){"use strict";n.d(t,{$o:function(){return d},F8:function(){return o},X$:function(){return u},du:function(){return l},k3:function(){return s},nZ:function(){return c}});let o=[{inputs:[{components:[{name:"target",type:"address"},{name:"allowFailure",type:"bool"},{name:"callData",type:"bytes"}],name:"calls",type:"tuple[]"}],name:"aggregate3",outputs:[{components:[{name:"success",type:"bool"},{name:"returnData",type:"bytes"}],name:"returnData",type:"tuple[]"}],stateMutability:"view",type:"function"}],i=[{inputs:[],name:"ResolverNotFound",type:"error"},{inputs:[],name:"ResolverWildcardNotSupported",type:"error"},{inputs:[],name:"ResolverNotContract",type:"error"},{inputs:[{name:"returnData",type:"bytes"}],name:"ResolverError",type:"error"},{inputs:[{components:[{name:"status",type:"uint16"},{name:"message",type:"string"}],name:"errors",type:"tuple[]"}],name:"HttpError",type:"error"}],s=[...i,{name:"resolve",type:"function",stateMutability:"view",inputs:[{name:"name",type:"bytes"},{name:"data",type:"bytes"}],outputs:[{name:"",type:"bytes"},{name:"address",type:"address"}]},{name:"resolve",type:"function",stateMutability:"view",inputs:[{name:"name",type:"bytes"},{name:"data",type:"bytes"},{name:"gateways",type:"string[]"}],outputs:[{name:"",type:"bytes"},{name:"address",type:"address"}]}],l=[...i,{name:"reverse",type:"function",stateMutability:"view",inputs:[{type:"bytes",name:"reverseName"}],outputs:[{type:"string",name:"resolvedName"},{type:"address",name:"resolvedAddress"},{type:"address",name:"reverseResolver"},{type:"address",name:"resolver"}]},{name:"reverse",type:"function",stateMutability:"view",inputs:[{type:"bytes",name:"reverseName"},{type:"string[]",name:"gateways"}],outputs:[{type:"string",name:"resolvedName"},{type:"address",name:"resolvedAddress"},{type:"address",name:"reverseResolver"},{type:"address",name:"resolver"}]}],c=[{name:"text",type:"function",stateMutability:"view",inputs:[{name:"name",type:"bytes32"},{name:"key",type:"string"}],outputs:[{name:"",type:"string"}]}],u=[{name:"addr",type:"function",stateMutability:"view",inputs:[{name:"name",type:"bytes32"}],outputs:[{name:"",type:"address"}]},{name:"addr",type:"function",stateMutability:"view",inputs:[{name:"name",type:"bytes32"},{name:"coinType",type:"uint256"}],outputs:[{name:"",type:"bytes"}]}],d=[{inputs:[{internalType:"address",name:"_signer",type:"address"},{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes",name:"_signature",type:"bytes"}],stateMutability:"nonpayable",type:"constructor"}]},21746:function(e,t,n){"use strict";n.d(t,{$:function(){return o},Up:function(){return i},hZ:function(){return s}});let o={1:"An `assert` condition failed.",17:"Arithmetic operation resulted in underflow or overflow.",18:"Division or modulo by zero (e.g. `5 / 0` or `23 % 0`).",33:"Attempted to convert to an invalid type.",34:"Attempted to access a storage byte array that is incorrectly encoded.",49:"Performed `.pop()` on an empty array",50:"Array index is out of bounds.",65:"Allocated too much memory or created an array which is too large.",81:"Attempted to call a zero-initialized variable of internal function type."},i={inputs:[{name:"message",type:"string"}],name:"Error",type:"error"},s={inputs:[{name:"reason",type:"uint256"}],name:"Panic",type:"error"}},84192:function(e,t,n){"use strict";n.d(t,{Bd:function(){return s},Zn:function(){return i},ez:function(){return o}});let o={gwei:9,wei:18},i={ether:-9,wei:9},s={ether:-18,gwei:-9}},57412:function(e,t,n){"use strict";n.d(t,{CI:function(){return InvalidAbiDecodingTypeError},FM:function(){return AbiEventSignatureEmptyTopicsError},Gy:function(){return DecodeLogTopicsMismatch},KY:function(){return BytesSizeMismatchError},M4:function(){return AbiEncodingBytesSizeMismatchError},MX:function(){return AbiFunctionOutputsNotFoundError},S4:function(){return AbiItemAmbiguityError},SM:function(){return DecodeLogDataMismatch},cO:function(){return AbiConstructorParamsNotFoundError},dh:function(){return InvalidAbiEncodingTypeError},fM:function(){return AbiConstructorNotFoundError},fs:function(){return AbiEncodingLengthMismatchError},gr:function(){return AbiEncodingArrayLengthMismatchError},hn:function(){return InvalidArrayError},lC:function(){return AbiEventSignatureNotFoundError},mv:function(){return AbiEventNotFoundError},wM:function(){return InvalidDefinitionTypeError},wb:function(){return AbiDecodingZeroDataError},xB:function(){return AbiDecodingDataSizeTooSmallError},xL:function(){return AbiFunctionNotFoundError},yP:function(){return AbiErrorSignatureNotFoundError}});var o=n(80522),i=n(39135),s=n(62027);let AbiConstructorNotFoundError=class AbiConstructorNotFoundError extends s.G{constructor({docsPath:e}){super("A constructor was not found on the ABI.\nMake sure you are using the correct ABI and that the constructor exists on it.",{docsPath:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiConstructorNotFoundError"})}};let AbiConstructorParamsNotFoundError=class AbiConstructorParamsNotFoundError extends s.G{constructor({docsPath:e}){super("Constructor arguments were provided (`args`), but a constructor parameters (`inputs`) were not found on the ABI.\nMake sure you are using the correct ABI, and that the `inputs` attribute on the constructor exists.",{docsPath:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiConstructorParamsNotFoundError"})}};let AbiDecodingDataSizeTooSmallError=class AbiDecodingDataSizeTooSmallError extends s.G{constructor({data:e,params:t,size:n}){super(`Data size of ${n} bytes is too small for given parameters.`,{metaMessages:[`Params: (${(0,o.h)(t,{includeName:!0})})`,`Data: ${e} (${n} bytes)`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiDecodingDataSizeTooSmallError"}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"params",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"size",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.data=e,this.params=t,this.size=n}};let AbiDecodingZeroDataError=class AbiDecodingZeroDataError extends s.G{constructor(){super('Cannot decode zero data ("0x") with ABI parameters.'),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiDecodingZeroDataError"})}};let AbiEncodingArrayLengthMismatchError=class AbiEncodingArrayLengthMismatchError extends s.G{constructor({expectedLength:e,givenLength:t,type:n}){super(`ABI encoding array length mismatch for type ${n}. +`},89192:function(e,t,n){"use strict";let o,i,s,l,c,u,d,p,f,m,g,b,y,v,w,C,E;n.d(t,{NL:function(){return ConnectButton},pj:function(){return RainbowKitProvider},vX:function(){return getDefaultConfig}});var x,A,k,B,S,I,j,T,P='-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',M={rounded:`SFRounded, ui-rounded, "SF Pro Rounded", ${P}`,system:P},O={large:{actionButton:"9999px",connectButton:"12px",modal:"24px",modalMobile:"28px"},medium:{actionButton:"10px",connectButton:"8px",modal:"16px",modalMobile:"18px"},none:{actionButton:"0px",connectButton:"0px",modal:"0px",modalMobile:"0px"},small:{actionButton:"4px",connectButton:"4px",modal:"8px",modalMobile:"8px"}},R={large:{modalOverlay:"blur(20px)"},none:{modalOverlay:"blur(0px)"},small:{modalOverlay:"blur(4px)"}},baseTheme=({borderRadius:e="large",fontStack:t="rounded",overlayBlur:n="none"})=>({blurs:{modalOverlay:R[n].modalOverlay},fonts:{body:M[t]},radii:{actionButton:O[e].actionButton,connectButton:O[e].connectButton,menuButton:O[e].connectButton,modal:O[e].modal,modalMobile:O[e].modalMobile}}),U={blue:{accentColor:"#0E76FD",accentColorForeground:"#FFF"},green:{accentColor:"#1DB847",accentColorForeground:"#FFF"},orange:{accentColor:"#FF801F",accentColorForeground:"#FFF"},pink:{accentColor:"#FF5CA0",accentColorForeground:"#FFF"},purple:{accentColor:"#5F5AFA",accentColorForeground:"#FFF"},red:{accentColor:"#FA423C",accentColorForeground:"#FFF"}},F=U.blue,lightTheme=({accentColor:e=F.accentColor,accentColorForeground:t=F.accentColorForeground,...n}={})=>({...baseTheme(n),colors:{accentColor:e,accentColorForeground:t,actionButtonBorder:"rgba(0, 0, 0, 0.04)",actionButtonBorderMobile:"rgba(0, 0, 0, 0.06)",actionButtonSecondaryBackground:"rgba(0, 0, 0, 0.06)",closeButton:"rgba(60, 66, 66, 0.8)",closeButtonBackground:"rgba(0, 0, 0, 0.06)",connectButtonBackground:"#FFF",connectButtonBackgroundError:"#FF494A",connectButtonInnerBackground:"linear-gradient(0deg, rgba(0, 0, 0, 0.03), rgba(0, 0, 0, 0.06))",connectButtonText:"#25292E",connectButtonTextError:"#FFF",connectionIndicator:"#30E000",downloadBottomCardBackground:"linear-gradient(126deg, rgba(255, 255, 255, 0) 9.49%, rgba(171, 171, 171, 0.04) 71.04%), #FFFFFF",downloadTopCardBackground:"linear-gradient(126deg, rgba(171, 171, 171, 0.2) 9.49%, rgba(255, 255, 255, 0) 71.04%), #FFFFFF",error:"#FF494A",generalBorder:"rgba(0, 0, 0, 0.06)",generalBorderDim:"rgba(0, 0, 0, 0.03)",menuItemBackground:"rgba(60, 66, 66, 0.1)",modalBackdrop:"rgba(0, 0, 0, 0.3)",modalBackground:"#FFF",modalBorder:"transparent",modalText:"#25292E",modalTextDim:"rgba(60, 66, 66, 0.3)",modalTextSecondary:"rgba(60, 66, 66, 0.6)",profileAction:"#FFF",profileActionHover:"rgba(255, 255, 255, 0.5)",profileForeground:"rgba(60, 66, 66, 0.06)",selectedOptionBorder:"rgba(60, 66, 66, 0.1)",standby:"#FFD641"},shadows:{connectButton:"0px 4px 12px rgba(0, 0, 0, 0.1)",dialog:"0px 8px 32px rgba(0, 0, 0, 0.32)",profileDetailsAction:"0px 2px 6px rgba(37, 41, 46, 0.04)",selectedOption:"0px 2px 6px rgba(0, 0, 0, 0.24)",selectedWallet:"0px 2px 6px rgba(0, 0, 0, 0.12)",walletLogo:"0px 2px 16px rgba(0, 0, 0, 0.16)"}});lightTheme.accentColors=U;var N=n(93763),D=n(67294),addRecipe=function(e,t){return Object.defineProperty(e,"__recipe__",{value:t,writable:!1}),e};function createNormalizeValueFn(e){var{conditions:t}=e;if(!t)throw Error("Styles have no conditions");return addRecipe(function(e){if("string"==typeof e||"number"==typeof e||"boolean"==typeof e){if(!t.defaultCondition)throw Error("No default condition");return{[t.defaultCondition]:e}}if(Array.isArray(e)){if(!("responsiveArray"in t))throw Error("Responsive arrays are not supported");var n={};for(var o in t.responsiveArray)null!=e[o]&&(n[t.responsiveArray[o]]=e[o]);return n}return e},{importPath:"@vanilla-extract/sprinkles/createUtils",importName:"createNormalizeValueFn",args:[{conditions:e.conditions}]})}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,o)}return n}function _objectSpread2(e){for(var t=1;tfunction(){for(var t=arguments.length,n=Array(t),o=0;oe.styles)),s=Object.keys(i),l=s.filter(e=>"mappings"in i[e]);return Object.assign(t=>{var n=[],o={},s=_objectSpread2({},t),c=!1;for(var u of l){var d=t[u];if(null!=d)for(var p of(c=!0,i[u].mappings))o[p]=d,null==s[p]&&delete s[p]}var f=c?_objectSpread2(_objectSpread2({},o),s):t;for(var m in f)if("continue"===function(){var e=f[m],t=i[m];try{if(t.mappings)return"continue";if("string"==typeof e||"number"==typeof e)n.push(t.values[e].defaultClass);else if(Array.isArray(e))for(var o=0;oe,_=n(92321),L=n(90512),z=n(37122),q=n(97405),G=n(95946),W=n(61836),H=n(15229),Q=n(92106);async function getBalance(e,{address:t,blockNumber:n,blockTag:o="latest"}){let i=n?(0,Q.eC)(n):void 0,s=await e.request({method:"eth_getBalance",params:[t,i||o]});return BigInt(s)}var K=n(81946),V=n(84192);function getUnit(e){return"number"==typeof e?e:"wei"===e?0:Math.abs(V.Bd[e])}var Z=n(16693),J=n(57412),X=n(62027),Y=n(7210),$=n(55629),ee=n(47864),et=n(39028);function getContractError(e,{abi:t,address:n,args:o,docsPath:i,functionName:s,sender:l}){let{code:c,data:u,message:d,shortMessage:p}=e instanceof q.VQ?e:e instanceof X.G?e.walk(e=>"data"in e)||e.walk():{},f=e instanceof J.wb?new q.Dk({functionName:s}):[3,et.XS.code].includes(c)&&(u||d||p)?new q.Lu({abi:t,data:"object"==typeof u?u.data:u,functionName:s,message:p??d}):e;return new q.uq(f,{abi:t,args:o,contractAddress:n,docsPath:i,functionName:s,sender:l})}function getAction_getAction(e,t,n){return o=>e[t.name||n]?.(o)??t(e,o)}var er=n(61376);async function readContract(e,t){let{abi:n,address:o,args:i,functionName:s,...l}=t,c=(0,$.R)({abi:n,args:i,functionName:s});try{let{data:t}=await getAction_getAction(e,er.RE,"call")({...l,data:c,to:o});return(0,Y.k)({abi:n,args:i,functionName:s,data:t||"0x"})}catch(e){throw getContractError(e,{abi:n,address:o,args:i,docsPath:"/docs/contract/readContract",functionName:s})}}async function multicall(e,t){let{allowFailure:n=!0,batchSize:o,blockNumber:i,blockTag:s,multicallAddress:l,stateOverride:c}=t,u=t.contracts,d=o??("object"==typeof e.batch?.multicall&&e.batch.multicall.batchSize||1024),p=l;if(!p){if(!e.chain)throw Error("client chain not configured. multicallAddress is required.");p=(0,ee.L)({blockNumber:i,chain:e.chain,contract:"multicall3"})}let f=[[]],m=0,g=0;for(let e=0;e0&&g>d&&f[m].length>0&&(m++,g=(e.length-2)/2,f[m]=[]),f[m]=[...f[m],{allowFailure:!0,callData:e,target:o}]}catch(l){let e=getContractError(l,{abi:t,address:o,args:i,docsPath:"/docs/contract/multicall",functionName:s});if(!n)throw e;f[m]=[...f[m],{allowFailure:!0,callData:"0x",target:o}]}}let b=await Promise.allSettled(f.map(t=>getAction_getAction(e,readContract,"readContract")({abi:Z.F8,address:p,args:[t],blockNumber:i,blockTag:s,functionName:"aggregate3",stateOverride:c}))),y=[];for(let e=0;e{let i=n.chainId??e.state.chainId;return{...t,[i]:[...t[i]||[],{contract:n,index:o}]}},{}),c=(await Promise.all(Object.entries(t).map(([t,l])=>multicall_multicall(e,{...s,allowFailure:n,blockNumber:o,blockTag:i,chainId:parseInt(t),contracts:l.map(({contract:e})=>e)})))).flat(),u=Object.values(t).flatMap(e=>e.map(({index:e})=>e));return c.reduce((e,t,n)=>(e&&(e[u[n]]=t),e),[])}catch(t){if(t instanceof q.uq)throw t;let promises=()=>l.map(t=>(function(e,t){let{chainId:n,...o}=t,i=e.getClient({chainId:n}),s=(0,K.s)(i,readContract,"readContract");return s(o)})(e,{...t,blockNumber:o,blockTag:i}));if(n)return(await Promise.allSettled(promises())).map(e=>"fulfilled"===e.status?{result:e.value,status:"success"}:{error:e.reason,result:void 0,status:"failure"});return await Promise.all(promises())}}async function getBalance_getBalance(e,t){let{address:n,blockNumber:o,blockTag:i,chainId:s,token:l,unit:c="ether"}=t;if(l)try{return getTokenBalance(e,{balanceAddress:n,chainId:s,symbolType:"string",tokenAddress:l})}catch(t){if(t instanceof q.uq){let t=await getTokenBalance(e,{balanceAddress:n,chainId:s,symbolType:"bytes32",tokenAddress:l}),o=(0,G.rR)((0,W.f)(t.symbol,{dir:"right"}));return{...t,symbol:o}}throw t}let u=e.getClient({chainId:s}),d=(0,K.s)(u,getBalance,"getBalance"),p=await d(o?{address:n,blockNumber:o}:{address:n,blockTag:i}),f=e.chains.find(e=>e.id===s)??u.chain;return{decimals:f.nativeCurrency.decimals,formatted:(0,H.b)(p,getUnit(c)),symbol:f.nativeCurrency.symbol,value:p}}async function getTokenBalance(e,t){let{balanceAddress:n,chainId:o,symbolType:i,tokenAddress:s,unit:l}=t,c={abi:[{type:"function",name:"balanceOf",stateMutability:"view",inputs:[{type:"address"}],outputs:[{type:"uint256"}]},{type:"function",name:"decimals",stateMutability:"view",inputs:[],outputs:[{type:"uint8"}]},{type:"function",name:"symbol",stateMutability:"view",inputs:[],outputs:[{type:i}]}],address:s},[u,d,p]=await readContracts(e,{allowFailure:!1,contracts:[{...c,functionName:"balanceOf",args:[n],chainId:o},{...c,functionName:"decimals",chainId:o},{...c,functionName:"symbol",chainId:o}]}),f=(0,H.b)(u??"0",getUnit(l??d));return{decimals:d,formatted:f,symbol:p,value:u}}function utils_hashFn(e){return JSON.stringify(e,(e,t)=>!function(e){if(!hasObjectPrototype(e))return!1;let t=e.constructor;if(void 0===t)return!0;let n=t.prototype;return!!(hasObjectPrototype(n)&&n.hasOwnProperty("isPrototypeOf"))}(t)?"bigint"==typeof t?t.toString():t:Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}))}function hasObjectPrototype(e){return"[object Object]"===Object.prototype.toString.call(e)}function filterQueryOptions(e){let{_defaulted:t,behavior:n,gcTime:o,initialData:i,initialDataUpdatedAt:s,maxPages:l,meta:c,networkMode:u,queryFn:d,queryHash:p,queryKey:f,queryKeyHashFn:m,retry:g,retryDelay:b,structuralSharing:y,getPreviousPageParam:v,getNextPageParam:w,initialPageParam:C,_optimisticResults:E,enabled:x,notifyOnChangeProps:A,placeholderData:k,refetchInterval:B,refetchIntervalInBackground:S,refetchOnMount:I,refetchOnReconnect:j,refetchOnWindowFocus:T,retryOnMount:P,select:M,staleTime:O,suspense:R,throwOnError:U,config:F,connector:N,query:D,..._}=e;return _}var en=n(24139),ea=n(27037),eo=n(66474),ei=n(7506),es=n(56888),el=class extends ei.l{constructor(e,t){super(),this.options=t,this.#b=e,this.#y=null,this.bindMethods(),this.setOptions(t)}#b;#v=void 0;#w=void 0;#C=void 0;#E;#x;#y;#A;#k;#B;#S;#I;#j;#T=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){1===this.listeners.size&&(this.#v.addObserver(this),shouldFetchOnMount(this.#v,this.options)?this.#P():this.updateResult(),this.#M())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return shouldFetchOn(this.#v,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return shouldFetchOn(this.#v,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#O(),this.#R(),this.#v.removeObserver(this)}setOptions(e,t){let n=this.options,o=this.#v;if(this.options=this.#b.defaultQueryOptions(e),void 0!==this.options.enabled&&"boolean"!=typeof this.options.enabled)throw Error("Expected enabled to be a boolean");this.#U(),this.#v.setOptions(this.options),n._defaulted&&!(0,en.VS)(this.options,n)&&this.#b.getQueryCache().notify({type:"observerOptionsUpdated",query:this.#v,observer:this});let i=this.hasListeners();i&&shouldFetchOptionally(this.#v,o,this.options,n)&&this.#P(),this.updateResult(t),i&&(this.#v!==o||this.options.enabled!==n.enabled||this.options.staleTime!==n.staleTime)&&this.#F();let s=this.#N();i&&(this.#v!==o||this.options.enabled!==n.enabled||s!==this.#j)&&this.#D(s)}getOptimisticResult(e){let t=this.#b.getQueryCache().build(this.#b,e),n=this.createResult(t,e);return(0,en.VS)(this.getCurrentResult(),n)||(this.#C=n,this.#x=this.options,this.#E=this.#v.state),n}getCurrentResult(){return this.#C}trackResult(e,t){let n={};return Object.keys(e).forEach(o=>{Object.defineProperty(n,o,{configurable:!1,enumerable:!0,get:()=>(this.trackProp(o),t?.(o),e[o])})}),n}trackProp(e){this.#T.add(e)}getCurrentQuery(){return this.#v}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#b.defaultQueryOptions(e),n=this.#b.getQueryCache().build(this.#b,t);return n.isFetchingOptimistic=!0,n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#P({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#C))}#P(e){this.#U();let t=this.#v.fetch(this.options,e);return e?.throwOnError||(t=t.catch(en.ZT)),t}#F(){if(this.#O(),en.sk||this.#C.isStale||!(0,en.PN)(this.options.staleTime))return;let e=(0,en.Kp)(this.#C.dataUpdatedAt,this.options.staleTime);this.#S=setTimeout(()=>{this.#C.isStale||this.updateResult()},e+1)}#N(){return("function"==typeof this.options.refetchInterval?this.options.refetchInterval(this.#v):this.options.refetchInterval)??!1}#D(e){this.#R(),this.#j=e,!en.sk&&!1!==this.options.enabled&&(0,en.PN)(this.#j)&&0!==this.#j&&(this.#I=setInterval(()=>{(this.options.refetchIntervalInBackground||eo.j.isFocused())&&this.#P()},this.#j))}#M(){this.#F(),this.#D(this.#N())}#O(){this.#S&&(clearTimeout(this.#S),this.#S=void 0)}#R(){this.#I&&(clearInterval(this.#I),this.#I=void 0)}createResult(e,t){let n;let o=this.#v,i=this.options,s=this.#C,l=this.#E,c=this.#x,u=e!==o,d=u?e.state:this.#w,{state:p}=e,f={...p},m=!1;if(t._optimisticResults){let n=this.hasListeners(),s=!n&&shouldFetchOnMount(e,t),l=n&&shouldFetchOptionally(e,o,t,i);(s||l)&&(f={...f,...(0,es.z)(p.data,e.options)}),"isRestoring"===t._optimisticResults&&(f.fetchStatus="idle")}let{error:g,errorUpdatedAt:b,status:y}=f;if(t.select&&void 0!==f.data){if(s&&f.data===l?.data&&t.select===this.#A)n=this.#k;else try{this.#A=t.select,n=t.select(f.data),n=(0,en.oE)(s?.data,n,t),this.#k=n,this.#y=null}catch(e){this.#y=e}}else n=f.data;if(void 0!==t.placeholderData&&void 0===n&&"pending"===y){let e;if(s?.isPlaceholderData&&t.placeholderData===c?.placeholderData)e=s.data;else if(e="function"==typeof t.placeholderData?t.placeholderData(this.#B?.state.data,this.#B):t.placeholderData,t.select&&void 0!==e)try{e=t.select(e),this.#y=null}catch(e){this.#y=e}void 0!==e&&(y="success",n=(0,en.oE)(s?.data,e,t),m=!0)}this.#y&&(g=this.#y,n=this.#k,b=Date.now(),y="error");let v="fetching"===f.fetchStatus,w="pending"===y,C="error"===y,E=w&&v,x=void 0!==n,A={status:y,fetchStatus:f.fetchStatus,isPending:w,isSuccess:"success"===y,isError:C,isInitialLoading:E,isLoading:E,data:n,dataUpdatedAt:f.dataUpdatedAt,error:g,errorUpdatedAt:b,failureCount:f.fetchFailureCount,failureReason:f.fetchFailureReason,errorUpdateCount:f.errorUpdateCount,isFetched:f.dataUpdateCount>0||f.errorUpdateCount>0,isFetchedAfterMount:f.dataUpdateCount>d.dataUpdateCount||f.errorUpdateCount>d.errorUpdateCount,isFetching:v,isRefetching:v&&!w,isLoadingError:C&&!x,isPaused:"paused"===f.fetchStatus,isPlaceholderData:m,isRefetchError:C&&x,isStale:isStale(e,t),refetch:this.refetch};return A}updateResult(e){let t=this.#C,n=this.createResult(this.#v,this.options);if(this.#E=this.#v.state,this.#x=this.options,void 0!==this.#E.data&&(this.#B=this.#v),(0,en.VS)(n,t))return;this.#C=n;let o={};e?.listeners!==!1&&(()=>{if(!t)return!0;let{notifyOnChangeProps:e}=this.options,n="function"==typeof e?e():e;if("all"===n||!n&&!this.#T.size)return!0;let o=new Set(n??this.#T);return this.options.throwOnError&&o.add("error"),Object.keys(this.#C).some(e=>{let n=this.#C[e]!==t[e];return n&&o.has(e)})})()&&(o.listeners=!0),this.#_({...o,...e})}#U(){let e=this.#b.getQueryCache().build(this.#b,this.options);if(e===this.#v)return;let t=this.#v;this.#v=e,this.#w=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#M()}#_(e){ea.V.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#C)}),this.#b.getQueryCache().notify({query:this.#v,type:"observerResultsUpdated"})})}};function shouldFetchOnMount(e,t){return!1!==t.enabled&&void 0===e.state.data&&!("error"===e.state.status&&!1===t.retryOnMount)||void 0!==e.state.data&&shouldFetchOn(e,t,t.refetchOnMount)}function shouldFetchOn(e,t,n){if(!1!==t.enabled){let o="function"==typeof n?n(e):n;return"always"===o||!1!==o&&isStale(e,t)}return!1}function shouldFetchOptionally(e,t,n,o){return(e!==t||!1===o.enabled)&&(!n.suspense||"error"!==e.state.status)&&isStale(e,n)}function isStale(e,t){return!1!==t.enabled&&e.isStaleByTime(t.staleTime)}n(85893);var ec=D.createContext((E=!1,{clearReset:()=>{E=!1},reset:()=>{E=!0},isReset:()=>E})),useQueryErrorResetBoundary=()=>D.useContext(ec),eu=n(30202),ed=D.createContext(!1),useIsRestoring=()=>D.useContext(ed);ed.Provider;var ep=n(86290),ensurePreventErrorBoundaryRetry=(e,t)=>{(e.suspense||e.throwOnError)&&!t.isReset()&&(e.retryOnMount=!1)},useClearResetErrorBoundary=e=>{D.useEffect(()=>{e.clearReset()},[e])},getHasError=({result:e,errorResetBoundary:t,throwOnError:n,query:o})=>e.isError&&!t.isReset()&&!e.isFetching&&o&&(0,ep.L)(n,[e.error,o]),ensureStaleTime=e=>{e.suspense&&"number"!=typeof e.staleTime&&(e.staleTime=1e3)},shouldSuspend=(e,t)=>e?.suspense&&t.isPending,fetchOptimistic=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function query_useQuery(e){let t=function(e,t,n){let o=(0,eu.NL)(n),i=useIsRestoring(),s=useQueryErrorResetBoundary(),l=o.defaultQueryOptions(e);l._optimisticResults=i?"isRestoring":"optimistic",ensureStaleTime(l),ensurePreventErrorBoundaryRetry(l,s),useClearResetErrorBoundary(s);let[c]=D.useState(()=>new t(o,l)),u=c.getOptimisticResult(l);if(D.useSyncExternalStore(D.useCallback(e=>{let t=i?()=>void 0:c.subscribe(ea.V.batchCalls(e));return c.updateResult(),t},[c,i]),()=>c.getCurrentResult(),()=>c.getCurrentResult()),D.useEffect(()=>{c.setOptions(l,{listeners:!1})},[l,c]),shouldSuspend(l,u))throw fetchOptimistic(l,c,s);if(getHasError({result:u,errorResetBoundary:s,throwOnError:l.throwOnError,query:o.getQueryCache().get(l.queryHash)}))throw u.error;return l.notifyOnChangeProps?u:c.trackResult(u)}({...e,queryKeyHashFn:utils_hashFn},el,void 0);return t.queryKey=e.queryKey,t}function getChainId(e){return e.state.chainId}function useChainId(e={}){let t=(0,z.Z)(e);return(0,D.useSyncExternalStore)(e=>(function(e,t){let{onChange:n}=t;return e.subscribe(e=>e.chainId,n)})(t,{onChange:e}),()=>getChainId(t),()=>getChainId(t))}function useBalance(e={}){let{address:t,query:n={}}=e,o=(0,z.Z)(e),i=useChainId(),s=function(e,t={}){return{async queryFn({queryKey:t}){let{address:n,scopeKey:o,...i}=t[1];if(!n)throw Error("address is required");let s=await getBalance_getBalance(e,{...i,address:n});return s??null},queryKey:function(e={}){return["balance",filterQueryOptions(e)]}(t)}}(o,{...e,chainId:e.chainId??i}),l=!!(t&&(n.enabled??!0));return query_useQuery({...n,...s,enabled:l})}let eh=new Map([[8217,"apostrophe"],[8260,"fraction slash"],[12539,"middle dot"]]);function read_compressed_payload(e){var t;let n;return t=function(e){let t=0;function u16(){return e[t++]<<8|e[t++]}let n=u16(),o=1,i=[0,1];for(let e=1;e>--c&1}let d=2147483648-1,p=0;for(let e=0;e<31;e++)p=p<<1|read_bit();let f=[],m=0,g=2147483648;for(;;){let e=Math.floor(((p-m+1)*o-1)/g),t=0,s=n;for(;s-t>1;){let n=t+s>>>1;e>>1|read_bit(),l=l<<1^1073741824,c=(1073741824^c)<<1|1073741825;m=l,g=1+c-l}let b=n-4;return f.map(t=>{switch(t-b){case 3:return b+65792+(e[l++]<<16|e[l++]<<8|e[l++]);case 2:return b+256+(e[l++]<<8|e[l++]);case 1:return b+e[l++];default:return t-1}})}(function(e){let t=[];[..."ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"].forEach((e,n)=>t[e.charCodeAt(0)]=n);let n=e.length,o=new Uint8Array(6*n>>3);for(let i=0,s=0,l=0,c=0;i=8&&(o[s++]=c>>(l-=8));return o}(e)),n=0,()=>t[n++]}function read_sorted(e,t=0){let n=[];for(;;){let o=e(),i=e();if(!i)break;t+=o;for(let e=0;e{let t=read_sorted(e);if(t.length)return t})}function read_mapped(e){let t=[];for(;;){let n=e();if(0==n)break;t.push(function(e,t){let n=1+t(),o=t(),i=read_array_while(t);return read_transposed(i.length,1+e,t).flatMap((e,t)=>{let[s,...l]=e;return Array(i[t]).fill().map((e,t)=>{let i=t*o;return[s+t*n,l.map(e=>e+i)]})})}(n,e))}for(;;){let n=e()-1;if(n<0)break;t.push(read_transposed(1+e(),1+n,e).map(e=>[e[0],e.slice(1)]))}return t.flat()}function read_array_while(e){let t=[];for(;;){let n=e(t.length);if(!n)break;t.push(n)}return t}function read_transposed(e,t,n){let o=Array(e).fill().map(()=>[]);for(let i=0;i>1:o>>1}return n})(e,n).forEach((e,t)=>o[t].push(e));return o}function quote_cp(e){return`{${e.toString(16).toUpperCase().padStart(2,"0")}}`}function str_from_cps(e){let t=e.length;if(t<4096)return String.fromCodePoint(...e);let n=[];for(let o=0;o>24&255}function unpack_cp(e){return 16777215&e}function is_hangul(e){return e>=44032&&e<55204}function decomposed(e){o||function(){let e=read_compressed_payload("AEUDTAHBCFQATQDRADAAcgAgADQAFAAsABQAHwAOACQADQARAAoAFwAHABIACAAPAAUACwAFAAwABAAQAAMABwAEAAoABQAIAAIACgABAAQAFAALAAIACwABAAIAAQAHAAMAAwAEAAsADAAMAAwACgANAA0AAwAKAAkABAAdAAYAZwDSAdsDJgC0CkMB8xhZAqfoC190UGcThgBurwf7PT09Pb09AjgJum8OjDllxHYUKXAPxzq6tABAxgK8ysUvWAgMPT09PT09PSs6LT2HcgWXWwFLoSMEEEl5RFVMKvO0XQ8ExDdJMnIgsj26PTQyy8FfEQ8AY8IPAGcEbwRwBHEEcgRzBHQEdQR2BHcEeAR6BHsEfAR+BIAEgfndBQoBYgULAWIFDAFiBNcE2ATZBRAFEQUvBdALFAsVDPcNBw13DYcOMA4xDjMB4BllHI0B2grbAMDpHLkQ7QHVAPRNQQFnGRUEg0yEB2uaJF8AJpIBpob5AERSMAKNoAXqaQLUBMCzEiACnwRZEkkVsS7tANAsBG0RuAQLEPABv9HICTUBXigPZwRBApMDOwAamhtaABqEAY8KvKx3LQ4ArAB8UhwEBAVSagD8AEFZADkBIadVj2UMUgx5Il4ANQC9AxIB1BlbEPMAs30CGxlXAhwZKQIECBc6EbsCoxngzv7UzRQA8M0BawL6ZwkN7wABAD33OQRcsgLJCjMCjqUChtw/km+NAsXPAoP2BT84PwURAK0RAvptb6cApQS/OMMey5HJS84UdxpxTPkCogVFITaTOwERAK5pAvkNBOVyA7q3BKlOJSALAgUIBRcEdASpBXqzABXFSWZOawLCOqw//AolCZdvv3dSBkEQGyelEPcMMwG1ATsN7UvYBPEGOwTJH30ZGQ/NlZwIpS3dDO0m4y6hgFoj9SqDBe1L9DzdC01RaA9ZC2UJ4zpjgU4DIQENIosK3Q05CG0Q8wrJaw3lEUUHOQPVSZoApQcBCxEdNRW1JhBirAsJOXcG+xr2C48mrxMpevwF0xohBk0BKRr/AM8u54WwWjFcHE9fBgMLJSPHFKhQIA0lQLd4SBobBxUlqQKRQ3BKh1E2HpMh9jw9DWYuE1F8B/U8BRlPC4E8nkarRQ4R0j6NPUgiSUwsBDV/LC8niwnPD4UMuXxyAVkJIQmxDHETMREXN8UIOQcZLZckJxUIIUaVYJoE958D8xPRAwsFPwlBBxMDtRwtEy4VKQUNgSTXAvM21S6zAo9WgAEXBcsPJR/fEFBH4A7pCJsCZQODJesALRUhABcimwhDYwBfj9hTBS7LCMdqbCN0A2cU52ERcweRDlcHpxwzFb8c4XDIXguGCCijrwlbAXUJmQFfBOMICTVbjKAgQWdTi1gYmyBhQT9d/AIxDGUVn0S9h3gCiw9rEhsBNQFzBzkNAQJ3Ee0RaxCVCOuGBDW1M/g6JQRPIYMgEQonA09szgsnJvkM+GkBoxJiAww0PXfuZ6tgtiQX/QcZMsVBYCHxC5JPzQycGsEYQlQuGeQHvwPzGvMn6kFXBf8DowMTOk0z7gS9C2kIiwk/AEkOoxcH1xhqCnGM0AExiwG3mQNXkYMCb48GNwcLAGcLhwV55QAdAqcIowAFAM8DVwA5Aq0HnQAZAIVBAT0DJy8BIeUCjwOTCDHLAZUvAfMpBBvDDBUA9zduSgLDsQKAamaiBd1YAo4CSTUBTSUEBU5HUQOvceEA2wBLBhPfRwEVq0rLGuNDAd9vKwDHAPsABTUHBUEBzQHzbQC3AV8LMQmis7UBTekpAIMAFWsB1wKJAN0ANQB/8QFTAE0FWfkF0wJPSQERMRgrV2EBuwMfATMBDQB5BsuNpckHHwRtB9MCEBsV4QLvLge1AQMi3xPNQsUCvd5VoWACZIECYkJbTa9bNyACofcCaJgCZgkCn4Q4GwsCZjsCZiYEbgR/A38TA36SOQY5dxc5gjojIwJsHQIyNjgKAm3HAm2u74ozZ0UrAWcA3gDhAEoFB5gMjQD+C8IADbUCdy8CdqI/AnlLQwJ4uh1c20WuRtcCfD8CesgCfQkCfPAFWQUgSABIfWMkAoFtAoAAAoAFAn+uSVhKWxUXSswC0QEC0MxLJwOITwOH5kTFkTIC8qFdAwMDrkvOTC0lA89NTE2vAos/AorYwRsHHUNnBbcCjjcCjlxAl4ECjtkCjlx4UbRTNQpS1FSFApP7ApMMAOkAHFUeVa9V0AYsGymVhjLheGZFOzkCl58C77JYIagAWSUClo8ClnycAKlZrFoJgU0AOwKWtQKWTlxEXNECmcsCmWRcyl0HGQKcmznCOp0CnBYCn5sCnriKAB0PMSoPAp3xAp6SALU9YTRh7wKe0wKgbgGpAp6fHwKeTqVjyGQnJSsCJ68CJn4CoPsCoEwCot0CocQCpi8Cpc4Cp/8AfQKn8mh8aLEAA0lqHGrRAqzjAqyuAq1nAq0CAlcdAlXcArHh1wMfTmyXArK9DQKy6Bds4G1jbUhfAyXNArZcOz9ukAMpRQK4XgK5RxUCuSp3cDZw4QK9GQK72nCWAzIRAr6IcgIDM3ECvhpzInNPAsPLAsMEc4J0SzVFdOADPKcDPJoDPb8CxXwCxkcCxhCJAshpUQLIRALJTwLJLgJknQLd0nh5YXiueSVL0AMYo2cCAmH0GfOVJHsLXpJeuxECz2sCz2wvS1PS8xOfAMatAs9zASnqA04SfksFAtwnAtuKAtJPA1JcA1NfAQEDVYyAiT8AyxbtYEWCHILTgs6DjQLaxwLZ3oQQhEmnPAOGpQAvA2QOhnFZ+QBVAt9lAt64c3cC4i/tFAHzMCcB9JsB8tKHAuvzAulweQLq+QLq5AD5RwG5Au6JAuuclqqXAwLuPwOF4Jh5cOBxoQLzAwBpA44WmZMC9xMDkW4DkocC95gC+dkC+GaaHJqruzebHgOdgwL++gEbADmfHJ+zAwWNA6ZqA6bZANHFAwZqoYiiBQkDDEkCwAA/AwDhQRdTARHzA2sHl2cFAJMtK7evvdsBiZkUfxEEOQH7KQUhDp0JnwCS/SlXxQL3AZ0AtwW5AG8LbUEuFCaNLgFDAYD8AbUmAHUDDgRtACwCFgyhAAAKAj0CagPdA34EkQEgRQUhfAoABQBEABMANhICdwEABdUDa+8KxQIA9wqfJ7+xt+UBkSFBQgHpFH8RNMCJAAQAGwBaAkUChIsABjpTOpSNbQC4Oo860ACNOME63AClAOgAywE6gTo7Ofw5+Tt2iTpbO56JOm85GAFWATMBbAUvNV01njWtNWY1dTW2NcU1gjWRNdI14TWeNa017jX9NbI1wTYCNhE1xjXVNhY2JzXeNe02LjY9Ni41LSE2OjY9Njw2yTcIBJA8VzY4Nt03IDcPNsogN4k3MAoEsDxnNiQ3GTdsOo03IULUQwdC4EMLHA8PCZsobShRVQYA6X8A6bABFCnXAukBowC9BbcAbwNzBL8MDAMMAQgDAAkKCwsLCQoGBAVVBI/DvwDz9b29kaUCb0QtsRTNLt4eGBcSHAMZFhYZEhYEARAEBUEcQRxBHEEcQRxBHEEaQRxBHEFCSTxBPElISUhBNkM2QTYbNklISVmBVIgBFLWZAu0BhQCjBcEAbykBvwGJAaQcEZ0ePCklMAAhMvAIMAL54gC7Bm8EescjzQMpARQpKgDUABavAj626xQAJP0A3etzuf4NNRA7efy2Z9NQrCnC0OSyANz5BBIbJ5IFDR6miIavYS6tprjjmuKebxm5C74Q225X1pkaYYPb6f1DK4k3xMEBb9S2WMjEibTNWhsRJIA+vwNVEiXTE5iXs/wezV66oFLfp9NZGYW+Gk19J2+bCT6Ye2w6LDYdgzKMUabk595eLBCXANz9HUpWbATq9vqXVx9XDg+Pc9Xp4+bsS005SVM/BJBM4687WUuf+Uj9dEi8aDNaPxtpbDxcG1THTImUMZq4UCaaNYpsVqraNyKLJXDYsFZ/5jl7bLRtO88t7P3xZaAxhb5OdPMXqsSkp1WCieG8jXm1U99+blvLlXzPCS+M93VnJCiK+09LfaSaBAVBomyDgJua8dfUzR7ga34IvR2Nvj+A9heJ6lsl1KG4NkI1032Cnff1m1wof2B9oHJK4bi6JkEdSqeNeiuo6QoZZincoc73/TH9SXF8sCE7XyuYyW8WSgbGFCjPV0ihLKhdPs08Tx82fYAkLLc4I2wdl4apY7GU5lHRFzRWJep7Ww3wbeA3qmd59/86P4xuNaqDpygXt6M85glSBHOCGgJDnt+pN9bK7HApMguX6+06RZNjzVmcZJ+wcUrJ9//bpRNxNuKpNl9uFds+S9tdx7LaM5ZkIrPj6nIU9mnbFtVbs9s/uLgl8MVczAwet+iOEzzBlYW7RCMgE6gyNLeq6+1tIx4dpgZnd0DksJS5f+JNDpwwcPNXaaVspq1fbQajOrJgK0ofKtJ1Ne90L6VO4MOl5S886p7u6xo7OLjG8TGL+HU1JXGJgppg4nNbNJ5nlzSpuPYy21JUEcUA94PoFiZfjZue+QnyQ80ekOuZVkxx4g+cvhJfHgNl4hy1/a6+RKcKlar/J29y//EztlbVPHVUeQ1zX86eQVAjR/M3dA9w4W8LfaXp4EgM85wOWasli837PzVMOnsLzR+k3o75/lRPAJSE1xAKQzEi5v10ke+VBvRt1cwQRMd+U5mLCTGVd6XiZtgBG5cDi0w22GKcVNvHiu5LQbZEDVtz0onn7k5+heuKXVsZtSzilkLRAUmjMXEMB3J9YC50XBxPiz53SC+EhnPl9WsKCv92SM/OFFIMJZYfl0WW8tIO3UxYcwdMAj7FSmgrsZ2aAZO03BOhP1bNNZItyXYQFTpC3SG1VuPDqH9GkiCDmE+JwxyIVSO5siDErAOpEXFgjy6PQtOVDj+s6e1r8heWVvmZnTciuf4EiNZzCAd7SOMhXERIOlsHIMG399i9aLTy3m2hRLZjJVDNLS53iGIK11dPqQt0zBDyg6qc7YqkDm2M5Ve6dCWCaCbTXX2rToaIgz6+zh4lYUi/+6nqcFMAkQJKHYLK0wYk5N9szV6xihDbDDFr45lN1K4aCXBq/FitPSud9gLt5ZVn+ZqGX7cwm2z5EGMgfFpIFyhGGuDPmso6TItTMwny+7uPnLCf4W6goFQFV0oQSsc9VfMmVLcLr6ZetDZbaSFTLqnSO/bIPjA3/zAUoqgGFAEQS4IhuMzEp2I3jJzbzkk/IEmyax+rhZTwd6f+CGtwPixu8IvzACquPWPREu9ZvGkUzpRwvRRuaNN6cr0W1wWits9ICdYJ7ltbgMiSL3sTPeufgNcVqMVWFkCPDH4jG2jA0XcVgQj62Cb29v9f/z/+2KbYvIv/zzjpQAPkliaVDzNrW57TZ/ZOyZD0nlfMmAIBIAGAI0D3k/mdN4xr9v85ZbZbbqfH2jGd5hUqNZWwl5SPfoGmfElmazUIeNL1j/mkF7VNAzTq4jNt8JoQ11NQOcmhprXoxSxfRGJ9LDEOAQ+dmxAQH90iti9e2u/MoeuaGcDTHoC+xsmEeWmxEKefQuIzHbpw5Tc5cEocboAD09oipWQhtTO1wivf/O+DRe2rpl/E9wlrzBorjJsOeG1B/XPW4EaJEFdNlECEZga5ZoGRHXgYouGRuVkm8tDESiEyFNo+3s5M5puSdTyUL2llnINVHEt91XUNW4ewdMgJ4boJfEyt/iY5WXqbA+A2Fkt5Z0lutiWhe9nZIyIUjyXDC3UsaG1t+eNx6z4W/OYoTB7A6x+dNSTOi9AInctbESqm5gvOLww7OWXPrmHwVZasrl4eD113pm+JtT7JVOvnCXqdzzdTRHgJ0PiGTFYW5Gvt9R9LD6Lzfs0v/TZZHSmyVNq7viIHE6DBK7Qp07Iz55EM8SYtQvZf/obBniTWi5C2/ovHfw4VndkE5XYdjOhCMRjDeOEfXeN/CwfGduiUIfsoFeUxXeQXba7c7972XNv8w+dTjjUM0QeNAReW+J014dKAD/McQYXT7c0GQPIkn3Ll6R7gGjuiQoZD0TEeEqQpKoZ15g/0OPQI17QiSv9AUROa/V/TQN3dvLArec3RrsYlvBm1b8LWzltdugsC50lNKYLEp2a+ZZYqPejULRlOJh5zj/LVMyTDvwKhMxxwuDkxJ1QpoNI0OTWLom4Z71SNzI9TV1iXJrIu9Wcnd+MCaAw8o1jSXd94YU/1gnkrC9BUEOtQvEIQ7g0i6h+KL2JKk8Ydl7HruvgWMSAmNe+LshGhV4qnWHhO9/RIPQzY1tHRj2VqOyNsDpK0cww+56AdDC4gsWwY0XxoucIWIqs/GcwnWqlaT0KPr8mbK5U94/301i1WLt4YINTVvCFBrFZbIbY8eycOdeJ2teD5IfPLCRg7jjcFTwlMFNl9zdh/o3E/hHPwj7BWg0MU09pPrBLbrCgm54A6H+I6v27+jL5gkjWg/iYdks9jbfVP5y/n0dlgWEMlKasl7JvFZd56LfybW1eeaVO0gxTfXZwD8G4SI116yx7UKVRgui6Ya1YpixqXeNLc8IxtAwCU5IhwQgn+NqHnRaDv61CxKhOq4pOX7M6pkA+Pmpd4j1vn6ACUALoLLc4vpXci8VidLxzm7qFBe7s+quuJs6ETYmnpgS3LwSZxPIltgBDXz8M1k/W2ySNv2f9/NPhxLGK2D21dkHeSGmenRT3Yqcdl0m/h3OYr8V+lXNYGf8aCCpd4bWjE4QIPj7vUKN4Nrfs7ML6Y2OyS830JCnofg/k7lpFpt4SqZc5HGg1HCOrHvOdC8bP6FGDbE/VV0mX4IakzbdS/op+Kt3G24/8QbBV7y86sGSQ/vZzU8FXs7u6jIvwchsEP2BpIhW3G8uWNwa3HmjfH/ZjhhCWvluAcF+nMf14ClKg5hGgtPLJ98ueNAkc5Hs2WZlk2QHvfreCK1CCGO6nMZVSb99VM/ajr8WHTte9JSmkXq/i/U943HEbdzW6Re/S88dKgg8pGOLlAeNiqrcLkUR3/aClFpMXcOUP3rmETcWSfMXZE3TUOi8i+fqRnTYLflVx/Vb/6GJ7eIRZUA6k3RYR3iFSK9c4iDdNwJuZL2FKz/IK5VimcNWEqdXjSoxSgmF0UPlDoUlNrPcM7ftmA8Y9gKiqKEHuWN+AZRIwtVSxye2Kf8rM3lhJ5XcBXU9n4v0Oy1RU2M+4qM8AQPVwse8ErNSob5oFPWxuqZnVzo1qB/IBxkM3EVUKFUUlO3e51259GgNcJbCmlvrdjtoTW7rChm1wyCKzpCTwozUUEOIcWLneRLgMXh+SjGSFkAllzbGS5HK7LlfCMRNRDSvbQPjcXaenNYxCvu2Qyznz6StuxVj66SgI0T8B6/sfHAJYZaZ78thjOSIFumNWLQbeZixDCCC+v0YBtkxiBB3jefHqZ/dFHU+crbj6OvS1x/JDD7vlm7zOVPwpUC01nhxZuY/63E7g");for(let[t,n]of(o=new Map(read_sorted_arrays(e).flatMap((e,t)=>e.map(e=>[e,t+1<<24]))),i=new Set(read_sorted(e)),s=new Map,l=new Map,read_mapped(e))){if(!i.has(t)&&2==n.length){let[e,o]=n,i=l.get(e);i||(i=new Map,l.set(e,i)),i.set(o,t)}s.set(t,n.reverse())}}();let t=[],n=[],c=!1;function add(e){let n=o.get(e);n&&(c=!0,e|=n),t.push(e)}for(let o of e)for(;;){if(o<128)t.push(o);else if(is_hangul(o)){let e=o-44032,t=e/588|0,n=e%588/28|0,i=e%28;add(4352+t),add(4449+n),i>0&&add(4519+i)}else{let e=s.get(o);e?n.push(...e):add(o)}if(!n.length)break;o=n.pop()}if(c&&t.length>1){let e=unpack_cc(t[0]);for(let n=1;n0&&i>=e)0==e?(t.push(o,...n),n.length=0,o=c):n.push(c),i=e;else{let s=function(e,t){if(e>=4352&&e<4371&&t>=4449&&t<4470)return 44032+(e-4352)*588+(t-4449)*28;if(is_hangul(e)&&t>4519&&t<4547&&(e-44032)%28==0)return e+(t-4519);{let n=l.get(e);return n&&(n=n.get(t))?n:-1}}(o,c);s>=0?o=s:0==i&&0==e?(t.push(o),o=c):(n.push(c),i=e)}}return o>=0&&t.push(o,...n),t}(decomposed(e))}let Array_from=e=>Array.from(e);function group_has_cp(e,t){return e.P.has(t)||e.Q.has(t)}let Emoji=class Emoji extends Array{get is_emoji(){return!0}};function init(){let e,t;if(c)return;let n=read_compressed_payload("AEEUdwmgDS8BxQKKAP4BOgDjATAAngDUAIMAoABoAOAAagCOAEQAhABMAHIAOwA9ACsANgAmAGIAHgAuACgAJwAXAC0AGgAjAB8ALwAUACkAEgAeAAkAGwARABkAFgA5ACgALQArADcAFQApABAAHgAiABAAGgAeABMAGAUhBe8BFxREN8sF2wC5AK5HAW8ArQkDzQCuhzc3NzcBP68NEfMABQdHBuw5BV8FYAA9MzkI9r4ZBg7QyQAWA9CeOwLNCjcCjqkChuA/lm+RAsXTAoP6ASfnEQDytQFJAjWVCkeXAOsA6godAB/cwdAUE0WlBCN/AQUCQRjFD/MRBjHxDQSJbw0jBzUAswBxme+tnIcAYwabAysG8QAjAEMMmxcDqgPKQyDXCMMxA7kUQwD3NXOrAKmFIAAfBC0D3x4BJQDBGdUFAhEgVD8JnwmQJiNWYUzrg0oAGwAUAB0AFnNcACkAFgBP9h3gPfsDOWDKneY2ChglX1UDYD30ABsAFAAdABZzIGRAnwDD8wAjAEEMzRbDqgMB2sAFYwXqAtCnAsS4AwpUJKRtFHsadUz9AMMVbwLpABM1NJEX0ZkCgYMBEyMAxRVvAukAEzUBUFAtmUwSAy4DBTER33EftQHfSwB5MxJ/AjkWKQLzL8E/cwBB6QH9LQDPDtO9ASNriQC5DQANAwCK21EFI91zHwCoL9kBqQcHBwcHKzUDowBvAQohPvU3fAQgHwCyAc8CKQMA5zMSezr7ULgFmDp/LzVQBgEGAi8FYQVgt8AFcTtlQhpCWEmfe5tmZ6IAExsDzQ8t+X8rBKtTAltbAn0jsy8Bl6utPWMDTR8Ei2kRANkDBrNHNysDBzECQWUAcwFpJ3kAiyUhAJ0BUb8AL3EfAbfNAz81KUsFWwF3YQZtAm0A+VEfAzEJDQBRSQCzAQBlAHsAM70GD/v3IZWHBwARKQAxALsjTwHZAeMPEzmXgIHwABIAGQA8AEUAQDt3gdvIEGcQZAkGTRFMdEIVEwK0D64L7REdDNkq09PgADSxB/MDWwfzA1sDWwfzB/MDWwfzA1sDWwNbA1scEvAi28gQZw9QBHUFlgWTBN4IiyZREYkHMAjaVBV0JhxPA00BBCMtSSQ7mzMTJUpMFE0LCAQ2SmyvfUADTzGzVP2QqgPTMlc5dAkGHnkSqAAyD3skNb1OhnpPcagKU0+2tYdJak5vAsY6sEAACikJm2/Dd1YGRRAfJ6kQ+ww3AbkBPw3xS9wE9QY/BM0fgRkdD9GVoAipLeEM8SbnLqWAXiP5KocF8Uv4POELUVFsD10LaQnnOmeBUgMlAREijwrhDT0IcRD3Cs1vDekRSQc9A9lJngCpBwULFR05FbkmFGKwCw05ewb/GvoLkyazEy17AAXXGiUGUQEtGwMA0y7rhbRaNVwgT2MGBwspI8sUrFAkDSlAu3hMGh8HGSWtApVDdEqLUToelyH6PEENai4XUYAH+TwJGVMLhTyiRq9FEhHWPpE9TCJNTDAEOYMsMyePCdMPiQy9fHYBXQklCbUMdRM1ERs3yQg9Bx0xlygnGQglRplgngT7owP3E9UDDwVDCUUHFwO5HDETMhUtBRGBKNsC9zbZLrcCk1aEARsFzw8pH+MQVEfkDu0InwJpA4cl7wAxFSUAGyKfCEdnAGOP3FMJLs8Iy2pwI3gDaxTrZRF3B5UOWwerHDcVwxzlcMxeD4YMKKezCV8BeQmdAWME5wgNNV+MpCBFZ1eLXBifIGVBQ14AAjUMaRWjRMGHfAKPD28SHwE5AXcHPQ0FAnsR8RFvEJkI74YINbkz/DopBFMhhyAVCisDU2zSCysm/Qz8bQGnEmYDEDRBd/Jnr2C6KBgBBx0yyUFkIfULlk/RDKAaxRhGVDIZ6AfDA/ca9yfuQVsGAwOnBxc6UTPyBMELbQiPCUMATQ6nGwfbGG4KdYzUATWPAbudA1uVhwJzkwY7Bw8Aaw+LBX3pACECqwinAAkA0wNbAD0CsQehAB0AiUUBQQMrMwEl6QKTA5cINc8BmTMB9y0EH8cMGQD7O25OAsO1AoBuZqYF4VwCkgJNOQFRKQQJUktVA7N15QDfAE8GF+NLARmvTs8e50cB43MvAMsA/wAJOQcJRQHRAfdxALsBYws1Caa3uQFR7S0AhwAZbwHbAo0A4QA5AIP1AVcAUQVd/QXXAlNNARU1HC9bZQG/AyMBNwERAH0Gz5GpzQsjBHEH1wIQHxXlAu8yB7kFAyLjE9FCyQK94lkAMhoKPAqrCqpgX2Q3CjV2PVQAEh+sPss/UgVVO1c7XDtXO1w7VztcO1c7XDtXO1wDm8Pmw+YKcF9JYe8Mqg3YRMw6TRPfYFVgNhPMLbsUxRXSJVoZQRrAJwkl6FUNDwgt12Y0CDA0eRfAAEMpbINFY4oeNApPHOtTlVT8LR8AtUumM7MNsBsZREQFS3XxYi4WEgomAmSFAmJGX1GzAV83JAKh+wJonAJmDQKfiDgfDwJmPwJmKgRyBIMDfxcDfpY5Cjl7GzmGOicnAmwhAjI6OA4CbcsCbbLzjgM3a0kvAWsA4gDlAE4JB5wMkQECD8YAEbkCdzMCdqZDAnlPRwJ4viFg30WyRvcCfEMCeswCfQ0CfPRIBEiBZygALxlJXEpfGRtK0ALRBQLQ0EsrA4hTA4fqRMmRNgLypV0HAwOyS9JMMSkH001QTbMCi0MCitzFHwshR2sJuwKOOwKOYESbhQKO3QKOYHxRuFM5AQ5S2FSJApP/ApMQAO0AIFUiVbNV1AosHymZijLleGpFPz0Cl6MC77ZYJawAXSkClpMCloCgAK1ZsFoNhVEAPwKWuQKWUlxIXNUCmc8CmWhczl0LHQKcnznGOqECnBoCn58CnryOACETNS4TAp31Ap6WALlBYThh8wKe1wKgcgGtAp6jIwKeUqljzGQrKS8CJ7MCJoICoP8CoFDbAqYzAqXSAqgDAIECp/ZogGi1AAdNaiBq1QKs5wKssgKtawKtBgJXIQJV4AKx5dsDH1JsmwKywRECsuwbbORtZ21MYwMl0QK2YD9DbpQDKUkCuGICuUsZArkue3A6cOUCvR0DLbYDMhUCvoxyBgMzdQK+HnMmc1MCw88CwwhzhnRPOUl05AM8qwEDPJ4DPcMCxYACxksCxhSNAshtVQLISALJUwLJMgJkoQLd1nh9ZXiyeSlL1AMYp2cGAmH4GfeVKHsPXpZevxUCz28Cz3AzT1fW9xejAMqxAs93AS3uA04Wfk8JAtwrAtuOAtJTA1JgA1NjAQUDVZCAjUMEzxrxZEl5A4LSg5EC2ssC2eKEFIRNp0ADhqkAMwNkEoZ1Xf0AWQLfaQLevHd7AuIz7RgB8zQrAfSfAfLWiwLr9wLpdH0DAur9AuroAP1LAb0C7o0C66CWrpcHAu5DA4XkmH1w5HGlAvMHAG0DjhqZlwL3FwORcgOSiwL3nAL53QL4apogmq+/O5siA52HAv7+AR8APZ8gAZ+3AwWRA6ZuA6bdANXJAwZuoYyiCQ0DDE0BEwEjB3EGZb1rCQC/BG/DFY8etxEAG3k9ACcDNxJRA42DAWcrJQCM8wAlAOanC6OVCLsGI6fJBgCvBRnDBvElRUYFFoAFcD9GSDNCKUK8X3kZX8QAls0FOgCQVCGbwTsuYDoZutcONxjOGJHJ/gVfBWAFXwVgBWsFYAVfBWAFXwVgBV8FYAVfBWBOHQjfjW8KCgoKbF7xMwTRA7kGN8PDAMMEr8MA70gxFroFTj5xPnhCR0K+X30/X/AAWBkzswCNBsxzzASm70aCRS4rDDMeLz49fnXfcsH5GcoscQFz13Y4HwVnBXLJycnACNdRYwgICAqEXoWTxgA7P4kACxbZBu21Kw0AjMsTAwkVAOVtJUUsJ1JCuULESUArXy9gPi9AKwnJRQYKTD9LPoA+iT54PnkCkULEUUpDX9NWV3JVEjQAc1w3A3IBE3YnX+g7QiMJb6MKaiszRCUuQrNCxDPMCcwEX9EWJzYREBEEBwIHKn6l33JCNVIfybPJtAltydPUCmhBZw/tEKsZAJOVJU1CLRuxbUHOQAo7P0s+eEJHHA8SJVRPdGM0NVrpvBoKhfUlM0JHHGUQUhEWO1xLSj8MO0ucNAqJIzVCRxv9EFsqKyA4OQgNj2nwZgp5ZNFgE2A1K3YHS2AhQQojJmC7DgpzGG1WYFUZCQYHZO9gHWCdYIVgu2BTYJlwFh8GvRbcXbG8YgtDHrMBwzPVyQonHQgkCyYBgQJ0Ajc4nVqIAwGSCsBPIgDsK3SWEtIVBa5N8gGjAo+kVwVIZwD/AEUSCDweX4ITrRQsJ8K3TwBXFDwEAB0TvzVcAtoTS20RIwDgVgZ9BBImYgA5AL4Coi8LFnezOkCnIQFjAY4KBAPh9RcGsgZSBsEAJctdsWIRu2kTkQstRw7DAcMBKgpPBGIGMDAwKCYnKTQaLg4AKRSVAFwCdl+YUZ0JdicFD3lPAdt1F9ZZKCGxuE3yBxkFVGcA/wBFEgiCBwAOLHQSjxOtQDg1z7deFRMAZ8QTAGtKb1ApIiPHADkAvgKiLy1DFtYCmBiDAlDDWNB0eo7fpaMO/aEVRRv0ATEQZBIODyMEAc8JQhCbDRgzFD4TAEMAu9YBCgCsAOkAm5I3ABwAYxvONnR+MhXJAxgKQyxL2+kkJhMbhQKDBMkSsvF0AD9BNQ6uQC7WqSQHwxEAEEIu1hkhAH2z4iQPwyJPHNWpdyYBRSpnJALzoBAEVPPsH20MxA0CCEQKRgAFyAtFAlMNwwjEDUQJRArELtapMg7DDZgJIw+TGukEIwvDFkMAqAtDEMMMBhioe+QAO3MMRAACrgnEBSPY9Q0FDnbSBoMAB8MSYxkSxAEJAPIJAAB8FWMOFtMc/HcXwxhDAC7DAvOowwAewwJdKDKHAAHDAALrFUQVwwAbwyvzpWMWv8wA/ABpAy++bcYDUKPD0KhDCwKmJ1MAAmMA5+UZwxAagwipBRL/eADfw6fDGOMCGsOjk3l6BwOpo4sAEsMOGxMAA5sAbcMOAAvDp0MJGkMDwgipnNIPAwfIqUMGAOGDAAPzABXDAAcDAAnDAGmTABrDAA7DChjDjnEWAwABYwAOcwAuUyYABsMAF8MIKQANUgC6wy4AA8MADqMq8wCyYgAcIwAB8wqpAAXOCx0V4wAHowBCwwEKAGnDAAuDAB3DAAjDCakABdIAbqcZ3QCZCCkABdIAAAFDAAfjAB2jCCkABqIACYMAGzMAbSMA5sOIAAhjAAhDABTDBAkpAAbSAOOTAAlDC6kOzPtnAAdDAG6kQFAATwAKwwwAA0MACbUDPwAHIwAZgwACE6cDAAojAApDAAoDp/MGwwAJIwADEwAQQwgAFEMAEXMAD5MADfMADcMAGRMOFiMAFUMAbqMWuwHDAMIAE0MLAGkzEgDhUwACQwAEWgAXgwUjAAbYABjDBSYBgzBaAEFNALcQBxUMegAwMngBrA0IZgJ0KxQHBREPd1N0ZzKRJwaIHAZqNT4DqQq8BwngAB4DAwt2AX56T1ocKQNXAh1GATQGC3tOxYNagkgAMQA5CQADAQEAWxLjAIOYNAEzAH7tFRk6TglSAF8NAAlYAQ+S1ACAQwQorQBiAN4dAJ1wPyeTANVzuQDX3AIeEMp9eyMgXiUAEdkBkJizKltbVVAaRMqRAAEAhyQ/SDEz6BmfVwB6ATEsOClKIRcDOF0E/832AFNt5AByAnkCRxGCOs94NjXdAwINGBonDBwPALW2AwICAgAAAAAAAAYDBQMDARrUAwAtAAAAAgEGBgYGBgYFBQUFBQUEBQYHCAkEBQUFBQQAAAICAAAAIgCNAJAAlT0A6gC7ANwApEQAwgCyAK0AqADuAKYA2gCjAOcBCAEDAMcAgQBiANIA1AEDAN4A8gCQAKkBMQDqAN8A3AsBCQ8yO9ra2tq8xuLT1tRJOB0BUgFcNU0BWgFpAWgBWwFMUUlLbhMBUxsNEAs6PhMOACcUKy0vMj5AQENDQ0RFFEYGJFdXV1dZWVhZL1pbXVxcI2NnZ2ZoZypsbnZ1eHh4eHh4enp6enp6enp6enp8fH18e2IARPIASQCaAHgAMgBm+ACOAFcAVwA3AnbvAIsABfj4AGQAk/IAnwBPAGIAZP//sACFAIUAaQBWALEAJAC2AIMCQAJDAPwA5wD+AP4A6AD/AOkA6QDoAOYALwJ7AVEBQAE+AVQBPgE+AT4BOQE4ATgBOAEcAVgXADEQCAEAUx8SHgsdHhYAjgCWAKYAUQBqIAIxAHYAbwCXAxUDJzIDIUlGTzEAkQJPAMcCVwKkAMAClgKWApYClgKWApYCiwKWApYClgKWApYClgKVApUCmAKgApcClgKWApQClAKUApQCkgKVAnUB1AKXAp8ClgKWApUeAIETBQD+DQOfAmECOh8BVBg9AuIZEjMbAU4/G1WZAXusRAFpYQEFA0FPAQYAmTEeIJdyADFoAHEANgCRA5zMk/C2jGINwjMWygIZCaXdfDILBCs5dAE7YnQBugDlhoiHhoiGiYqKhouOjIaNkI6Ij4qQipGGkoaThpSSlYaWhpeKmIaZhpqGm4aci52QnoqfhuIC4XTpAt90AIp0LHSoAIsAdHQEQwRABEIERQRDBEkERgRBBEcESQRIBEQERgRJAJ5udACrA490ALxuAQ10ANFZdHQA13QCFHQA/mJ0AP4BIQD+APwA/AD9APwDhGZ03ASMK23HAP4A/AD8AP0A/CR0dACRYnQA/gCRASEA/gCRAvQA/gCRA4RmdNwEjCttxyR0AP9idAEhAP4A/gD8APwA/QD8AP8A/AD8AP0A/AOEZnTcBIwrbcckdHQAkWJ0ASEA/gCRAP4AkQL0AP4AkQOEZnTcBIwrbcckdAJLAT50AlIBQXQCU8l0dAJfdHQDpgL0A6YDpgOnA6cDpwOnA4RmdNwEjCttxyR0dACRYnQBIQOmAJEDpgCRAvQDpgCRA4RmdNwEjCttxyR0BDh0AJEEOQCRDpU5dSgCADR03gV2CwArdAEFAM5iCnR0AF1iAAYcOgp0dACRCnQAXAEIwWZ0CnRmdHQAkWZ0CnRmdEXgAFF03gp0dEY0tlT2u3SOAQTwscwhjZZKrhYcBSfFp9XNbKiVDOD2b+cpe4/Z17mQnbtzzhaeQtE2GGj0IDNTjRUSyTxxw/RPHW/+vS7d1NfRt9z9QPZg4X7QFfhCnkvgNPIItOsC2eV6hPannZNHlZ9xrwZXIMOlu3jSoQSq78WEjwLjw1ELSlF1aBvfzwk5ZX7AUvQzjPQKbDuQ+sm4wNOp4A6AdVuRS0t1y/DZpg4R6m7FNjM9HgvW7Bi88zaMjOo6lM8wtBBdj8LP4ylv3zCXPhebMKJc066o9sF71oFW/8JXu86HJbwDID5lzw5GWLR/LhT0Qqnp2JQxNZNfcbLIzPy+YypqRm/lBmGmex+82+PisxUumSeJkALIT6rJezxMH+CTJmQtt5uwTVbL3ptmjDUQzlSIvWi8Tl7ng1NpuRn1Ng4n14Qc+3Iil7OwkvNWogLSPkn3pihIFytyIGmMhOe3n1tWsuMy9BdKyqF4Z3v2SgggTL9KVvMXPnCbRe+oOuFFP3HejBG/w9gvmfNYvg6JuWia2lcSSN1uIjBktzoIazOHPJZ7kKHPz8mRWVdW3lA8WGF9dQF6Bm673boov3BUWDU2JNcahR23GtfHKLOz/viZ+rYnZFaIznXO67CYEJ1fXuTRpZhYZkKe54xeoagkNGLs+NTZHE0rX45/XvQ2RGADX6vcAvdxIUBV27wxGm2zjZo4X3ILgAlrOFheuZ6wtsvaIj4yLY7qqawlliaIcrz2G+c3vscAnCkCuMzMmZvMfu9lLwTvfX+3cVSyPdN9ZwgDZhfjRgNJcLiJ67b9xx8JHswprbiE3v9UphotAPIgnXVIN5KmMc0piXhc6cChPnN+MRhG9adtdttQTTwSIpl8I4/j//d3sz1326qTBTpPRM/Hgh3kzqEXs8ZAk4ErQhNO8hzrQ0DLkWMA/N+91tn2MdOJnWC2FCZehkQrwzwbKOjhvZsbM95QoeL9skYyMf4srVPVJSgg7pOLUtr/n9eT99oe9nLtFRpjA9okV2Kj8h9k5HaC0oivRD8VyXkJ81tcd4fHNXPCfloIQasxsuO18/46dR2jgul/UIet2G0kRvnyONMKhHs6J26FEoqSqd+rfYjeEGwHWVDpX1fh1jBBcKGMqRepju9Y00mDVHC+Xdij/j44rKfvfjGinNs1jO/0F3jB83XCDINN/HB84axlP+3E/klktRo+vl3U/aiyMJbIodE1XSsDn6UAzIoMtUObY2+k/4gY/l+AkZJ5Sj2vQrkyLm3FoxjhDX+31UXBFf9XrAH31fFqoBmDEZvhvvpnZ87N+oZEu7U9O/nnk+QWj3x8uyoRbEnf+O5UMr9i0nHP38IF5AvzrBW8YWBUR0mIAzIvndQq9N3v/Jto3aPjPXUPl8ASdPPyAp7jENf8bk7VMM9ol9XGmlBmeDMuGqt+WzuL6CXAxXjIhCPM5vACchgMJ/8XBGLO/D1isVvGhwwHHr1DLaI5mn2Jr/b1pUD90uciDaS8cXNDzCWvNmT/PhQe5e8nTnnnkt8Ds/SIjibcum/fqDhKopxAY8AkSrPn+IGDEKOO+U3XOP6djFs2H5N9+orhOahiQk5KnEUWa+CzkVzhp8bMHRbg81qhjjXuIKbHjSLSIBKWqockGtKinY+z4/RdBUF6pcc3JmnlxVcNgrI4SEzKUZSwcD2QCyxzKve+gAmg6ZuSRkpPFa6mfThu7LJNu3H5K42uCpNvPAsoedolKV/LHe/eJ+BbaG5MG0NaSGVPRUmNFMFFSSpXEcXwbVh7UETOZZtoVNRGOIbbkig3McEtR68cG0RZAoJevWYo7Dg/lZ1CQzblWeUvVHmr8fY4Nqd9JJiH/zEX24mJviH60fAyFr0A3c4bC1j3yZU60VgJxXn8JgJXLUIsiBnmKmMYz+7yBQFBvqb2eYnuW59joZBf56/wXvWIR4R8wTmV80i1mZy+S4+BUES+hzjk0uXpC///z/IlqHZ1monzlXp8aCfhGKMti73FI1KbL1q6IKO4fuBuZ59gagjn5xU79muMpHXg6S+e+gDM/U9BKLHbl9l6o8czQKl4RUkJJiqftQG2i3BMg/TQlUYFkJDYBOOvAugYuzYSDnZbDDd/aSd9x0Oe6F+bJcHfl9+gp6L5/TgA+BdFFovbfCrQ40s5vMPw8866pNX8zyFGeFWdxIpPVp9Rg1UPOVFbFZrvaFq/YAzHQgqMWpahMYfqHpmwXfHL1/kpYmGuHFwT55mQu0dylfNuq2Oq0hTMCPwqfxnuBIPLXfci4Y1ANy+1CUipQxld/izVh16WyG2Q0CQQ9NqtAnx1HCHwDj7sYxOSB0wopZSnOzxQOcExmxrVTF2BkOthVpGfuhaGECfCJpJKpjnihY+xOT2QJxN61+9K6QSqtv2Shr82I3jgJrqBg0wELFZPjvHpvzTtaJnLK6Vb97Yn933koO/saN7fsjwNKzp4l2lJVx2orjCGzC/4ZL4zCver6aQYtC5sdoychuFE6ufOiog+VWi5UDkbmvmtah/3aArEBIi39s5ILUnlFLgilcGuz9CQshEY7fw2ouoILAYPVT/gyAIq3TFAIwVsl+ktkRz/qGfnCDGrm5gsl/l9QdvCWGsjPz3dU7XuqKfdUrr/6XIgjp4rey6AJBmCmUJMjITHVdFb5m1p+dLMCL8t55zD42cmftmLEJC0Da04YiRCVUBLLa8D071/N5UBNBXDh0LFsmhV/5B5ExOB4j3WVG/S3lfK5o+V6ELHvy6RR9n4ac+VsK4VE4yphPvV+kG9FegTBH4ZRXL2HytUHCduJazB/KykjfetYxOXTLws267aGOd+I+JhKP//+VnXmS90OD/jvLcVu0asyqcuYN1mSb6XTlCkqv1vigZPIYwNF/zpWcT1GR/6aEIRjkh0yhg4LXJfaGobYJTY4JI58KiAKgmmgAKWdl5nYCeLqavRJGQNuYuZtZFGx+IkI4w4NS2xwbetNMunOjBu/hmKCI/w7tfiiyUd//4rbTeWt4izBY8YvGIN6vyKYmP/8X8wHKCeN+WRcKM70+tXKNGyevU9H2Dg5BsljnTf8YbsJ1TmMs74Ce2XlHisleguhyeg44rQOHZuw/6HTkhnnurK2d62q6yS7210SsAIaR+jXMQA+svkrLpsUY+F30Uw89uOdGAR6vo4FIME0EfVVeHTu6eKicfhSqOeXJhbftcd08sWEnNUL1C9fnprTgd83IMut8onVUF0hvqzZfHduPjbjwEXIcoYmy+P6tcJZHmeOv6VrvEdkHDJecjHuHeWANe79VG662qTjA/HCvumVv3qL+LrOcpqGps2ZGwQdFJ7PU4iuyRlBrwfO+xnPyr47s2cXVbWzAyznDiBGjCM3ksxjjqM62GE9C8f5U38kB3VjtabKp/nRdvMESPGDG90bWRLAt1Qk5DyLuazRR1YzdC1c+hZXvAWV8xA72S4A8B67vjVhbba3MMop293FeEXpe7zItMWrJG/LOH9ByOXmYnNJfjmfuX9KbrpgLOba4nZ+fl8Gbdv/ihv+6wFGKHCYrVwmhFC0J3V2bn2tIB1wCc1CST3d3X2OyxhguXcs4sm679UngzofuSeBewMFJboIQHbUh/m2JhW2hG9DIvG2t7yZIzKBTz9wBtnNC+2pCRYhSIuQ1j8xsz5VvqnyUIthvuoyyu7fNIrg/KQUVmGQaqkqZk/Vx5b33/gsEs8yX7SC1J+NV4icz6bvIE7C5G6McBaI8rVg56q5QBJWxn/87Q1sPK4+sQa8fLU5gXo4paaq4cOcQ4wR0VBHPGjKh+UlPCbA1nLXyEUX45qZ8J7/Ln4FPJE2TdzD0Z8MLSNQiykMMmSyOCiFfy84Rq60emYB2vD09KjYwsoIpeDcBDTElBbXxND72yhd9pC/1CMid/5HUMvAL27OtcIJDzNKpRPNqPOpyt2aPGz9QWIs9hQ9LiX5s8m9hjTUu/f7MyIatjjd+tSfQ3ufZxPpmJhTaBtZtKLUcfOCUqADuO+QoH8B9v6U+P0HV1GLQmtoNFTb3s74ivZgjES0qfK+8RdGgBbcCMSy8eBvh98+et1KIFqSe1KQPyXULBMTsIYnysIwiZBJYdI20vseV+wuJkcqGemehKjaAb9L57xZm3g2zX0bZ2xk/fU+bCo7TlnbW7JuF1YdURo/2Gw7VclDG1W7LOtas2LX4upifZ/23rzpsnY/ALfRgrcWP5hYmV9VxVOQA1fZvp9F2UNU+7d7xRyVm5wiLp3/0dlV7vdw1PMiZrbDAYzIVqEjRY2YU03sJhPnlwIPcZUG5ltL6S8XCxU1eYS5cjr34veBmXAvy7yN4ZjArIG0dfD/5UpBNlX1ZPoxJOwyqRi3wQWtOzd4oNKh0LkoTm8cwqgIfKhqqGOhwo71I+zXnMemTv2B2AUzABWyFztGgGULjDDzWYwJUVBTjKCn5K2QGMK1CQT7SzziOjo+BhAmqBjzuc3xYym2eedGeOIRJVyTwDw37iCMe4g5Vbnsb5ZBdxOAnMT7HU4DHpxWGuQ7GeiY30Cpbvzss55+5Km1YsbD5ea3NI9QNYIXol5apgSu9dZ8f8xS5dtHpido5BclDuLWY4lhik0tbJa07yJhH0BOyEut/GRbYTS6RfiTYWGMCkNpfSHi7HvdiTglEVHKZXaVhezH4kkXiIvKopYAlPusftpE4a5IZwvw1x/eLvoDIh/zpo9FiQInsTb2SAkKHV42XYBjpJDg4374XiVb3ws4qM0s9eSQ5HzsMU4OZJKuopFjBM+dAZEl8RUMx5uU2N486Kr141tVsGQfGjORYMCJAMsxELeNT4RmWjRcpdTGBwcx6XN9drWqPmJzcrGrH4+DRc7+n1w3kPZwu0BkNr6hQrqgo7JTB9A5kdJ/H7P4cWBMwsmuixAzJB3yrQpnGIq90lxAXLzDCdn1LPibsRt7rHNjgQBklRgPZ8vTbjXdgXrTWQsK5MdrXXQVPp0Rinq3frzZKJ0qD6Qhc40VzAraUXlob1gvkhK3vpmHgI6FRlQZNx6eRqkp0zy4AQlX813fAPtL3jMRaitGFFjo0zmErloC+h+YYdVQ6k4F/epxAoF0BmqEoKNTt6j4vQZNQ2BoqF9Vj53TOIoNmDiu9Xp15RkIgQIGcoLpfoIbenzpGUAtqFJp5W+LLnx38jHeECTJ/navKY1NWfN0sY1T8/pB8kIH3DU3DX+u6W3YwpypBMYOhbSxGjq84RZ84fWJow8pyHqn4S/9J15EcCMsXqrfwyd9mhiu3+rEo9pPpoJkdZqHjra4NvzFwuThNKy6hao/SlLw3ZADUcUp3w3SRVfW2rhl80zOgTYnKE0Hs2qp1J6H3xqPqIkvUDRMFDYyRbsFI3M9MEyovPk8rlw7/0a81cDVLmBsR2ze2pBuKb23fbeZC0uXoIvDppfTwIDxk1Oq2dGesGc+oJXWJLGkOha3CX+DUnzgAp9HGH9RsPZN63Hn4RMA5eSVhPHO+9RcRb/IOgtW31V1Q5IPGtoxPjC+MEJbVlIMYADd9aHYWUIQKopuPOHmoqSkubnAKnzgKHqgIOfW5RdAgotN6BN+O2ZYHkuemLnvQ8U9THVrS1RtLmKbcC7PeeDsYznvqzeg6VCNwmr0Yyx1wnLjyT84BZz3EJyCptD3yeueAyDWIs0L2qs/VQ3HUyqfrja0V1LdDzqAikeWuV4sc7RLIB69jEIBjCkyZedoUHqCrOvShVzyd73OdrJW0hPOuQv2qOoHDc9xVb6Yu6uq3Xqp2ZaH46A7lzevbxQEmfrzvAYSJuZ4WDk1Hz3QX1LVdiUK0EvlAGAYlG3Md30r7dcPN63yqBCIj25prpvZP0nI4+EgWoFG95V596CurXpKRBGRjQlHCvy5Ib/iW8nZJWwrET3mgd6mEhfP4KCuaLjopWs7h+MdXFdIv8dHQJgg1xi1eYqB0uDYjxwVmri0Sv5XKut/onqapC+FQiC2C1lvYJ9MVco6yDYsS3AANUfMtvtbYI2hfwZatiSsnoUeMZd34GVjkMMKA+XnjJpXgRW2SHTZplVowPmJsvXy6w3cfO1AK2dvtZEKTkC/TY9LFiKHCG0DnrMQdGm2lzlBHM9iEYynH2UcVMhUEjsc0oDBTgo2ZSQ1gzkAHeWeBXYFjYLuuf8yzTCy7/RFR81WDjXMbq2BOH5dURnxo6oivmxL3cKzKInlZkD31nvpHB9Kk7GfcfE1t+1V64b9LtgeJGlpRFxQCAqWJ5DoY77ski8gsOEOr2uywZaoO/NGa0X0y1pNQHBi3b2SUGNpcZxDT7rLbBf1FSnQ8guxGW3W+36BW0gBje4DOz6Ba6SVk0xiKgt+q2JOFyr4SYfnu+Ic1QZYIuwHBrgzr6UvOcSCzPTOo7D6IC4ISeS7zkl4h+2VoeHpnG/uWR3+ysNgPcOIXQbv0n4mr3BwQcdKJxgPSeyuP/z1Jjg4e9nUvoXegqQVIE30EHx5GHv+FAVUNTowYDJgyFhf5IvlYmEqRif6+WN1MkEJmDcQITx9FX23a4mxy1AQRsOHO/+eImX9l8EMJI3oPWzVXxSOeHU1dUWYr2uAA7AMb+vAEZSbU3qob9ibCyXeypEMpZ6863o6QPqlqGHZkuWABSTVNd4cOh9hv3qEpSx2Zy/DJMP6cItEmiBJ5PFqQnDEIt3NrA3COlOSgz43D7gpNFNJ5MBh4oFzhDPiglC2ypsNU4ISywY2erkyb1NC3Qh/IfWj0eDgZI4/ln8WPfBsT3meTjq1Uqt1E7Zl/qftqkx6aM9KueMCekSnMrcHj1CqTWWzEzPsZGcDe3Ue4Ws+XFYVxNbOFF8ezkvQGR6ZOtOLU2lQEnMBStx47vE6Pb7AYMBRj2OOfZXfisjJnpTfSNjo6sZ6qSvNxZNmDeS7Gk3yYyCk1HtKN2UnhMIjOXUzAqDv90lx9O/q/AT1ZMnit5XQe9wmQxnE/WSH0CqZ9/2Hy+Sfmpeg8RwsHI5Z8kC8H293m/LHVVM/BA7HaTJYg5Enk7M/xWpq0192ACfBai2LA/qrCjCr6Dh1BIMzMXINBmX96MJ5Hn2nxln/RXPFhwHxUmSV0EV2V0jm86/dxxuYSU1W7sVkEbN9EzkG0QFwPhyHKyb3t+Fj5WoUUTErcazE/N6EW6Lvp0d//SDPj7EV9UdJN+Amnf3Wwk3A0SlJ9Z00yvXZ7n3z70G47Hfsow8Wq1JXcfwnA+Yxa5mFsgV464KKP4T31wqIgzFPd3eCe3j5ory5fBF2hgCFyVFrLzI9eetNXvM7oQqyFgDo4CTp/hDV9NMX9JDHQ/nyHTLvZLNLF6ftn2OxjGm8+PqOwhxnPHWipkE/8wbtyri80Sr7pMNkQGMfo4ZYK9OcCC4ESVFFbLMIvlxSoRqWie0wxqnLfcLSXMSpMMQEJYDVObYsXIQNv4TGNwjq1kvT1UOkicTrG3IaBZ3XdScS3u8sgeZPVpOLkbiF940FjbCeNRINNvDbd01EPBrTCPpm12m43ze1bBB59Ia6Ovhnur/Nvx3IxwSWol+3H2qfCJR8df6aQf4v6WiONxkK+IqT4pKQrZK/LplgDI/PJZbOep8dtbV7oCr6CgfpWa8NczOkPx81iSHbsNhVSJBOtrLIMrL31LK9TqHqAbAHe0RLmmV806kRLDLNEhUEJfm9u0sxpkL93Zgd6rw+tqBfTMi59xqXHLXSHwSbSBl0EK0+loECOPtrl+/nsaFe197di4yUgoe4jKoAJDXc6DGDjrQOoFDWZJ9HXwt8xDrQP+7aRwWKWI1GF8s8O4KzxWBBcwnl3vnl1Oez3oh6Ea1vjR7/z7DDTrFtqU2W/KAEzAuXDNZ7MY73MF216dzdSbWmUp4lcm7keJfWaMHgut9x5C9mj66Z0lJ+yhsjVvyiWrfk1lzPOTdhG15Y7gQlXtacvI7qv/XNSscDwqkgwHT/gUsD5yB7LdRRvJxQGYINn9hTpodKFVSTPrtGvyQw+HlRFXIkodErAGu9Iy1YpfSPc3jkFh5CX3lPxv7aqjE/JAfTIpEjGb/H7MO0e2vsViSW1qa/Lmi4/n4DEI3g7lYrcanspDfEpKkdV1OjSLOy0BCUqVoECaB55vs06rXl4jqmLsPsFM/7vYJ0vrBhDCm/00A/H81l1uekJ/6Lml3Hb9+NKiLqATJmDpyzfYZFHumEjC662L0Bwkxi7E9U4cQA0XMVDuMYAIeLMPgQaMVOd8fmt5SflFIfuBoszeAw7ow5gXPE2Y/yBc/7jExARUf/BxIHQBF5Sn3i61w4z5xJdCyO1F1X3+3ax+JSvMeZ7S6QSKp1Fp/sjYz6Z+VgCZzibGeEoujryfMulH7Rai5kAft9ebcW50DyJr2uo2z97mTWIu45YsSnNSMrrNUuG1XsYBtD9TDYzQffKB87vWbkM4EbPAFgoBV4GQS+vtFDUqOFAoi1nTtmIOvg38N4hT2Sn8r8clmBCXspBlMBYTnrqFJGBT3wZOzAyJDre9dHH7+x7qaaKDOB4UQALD5ecS0DE4obubQEiuJZ0EpBVpLuYcce8Aa4PYd/V4DLDAJBYKQPCWTcrEaZ5HYbJi11Gd6hjGom1ii18VHYnG28NKpkz2UKVPxlhYSp8uZr367iOmoy7zsxehW9wzcy2zG0a80PBMCRQMb32hnaHeOR8fnNDzZhaNYhkOdDsBUZ3loDMa1YP0uS0cjUP3b/6DBlqmZOeNABDsLl5BI5QJups8uxAuWJdkUB/pO6Zax6tsg7fN5mjjDgMGngO+DPcKqiHIDbFIGudxtPTIyDi9SFMKBDcfdGQRv41q1AqmxgkVfJMnP8w/Bc7N9/TR6C7mGObFqFkIEom8sKi2xYqJLTCHK7cxzaZvqODo22c3wisBCP4HeAgcRbNPAsBkNRhSmD48dHupdBRw4mIvtS5oeF6zeT1KMCyhMnmhpkFAGWnGscoNkwvQ8ZM5lE/vgTHFYL99OuNxdFBxTEDd5v2qLR8y9WkXsWgG6kZNndFG+pO/UAkOCipqIhL3hq7cRSdrCq7YhUsTocEcnaFa6nVkhnSeRYUA1YO0z5itF9Sly3VlxYDw239TJJH6f3EUfYO5lb7bcFcz8Bp7Oo8QmnsUHOz/fagVUBtKEw1iT88j+aKkv8cscKNkMxjYr8344D1kFoZ7/td1W6LCNYN594301tUGRmFjAzeRg5vyoM1F6+bJZ/Q54jN/k8SFd3DxPTYaAUsivsBfgTn7Mx8H2SpPt4GOdYRnEJOH6jHM2p6SgB0gzIRq6fHxGMmSmqaPCmlfwxiuloaVIitLGN8wie2CDWhkzLoCJcODh7KIOAqbHEvXdUxaS4TTTs07Clzj/6GmVs9kiZDerMxEnhUB6QQPlcfqkG9882RqHoLiHGBoHfQuXIsAG8GTAtao2KVwRnvvam8jo1e312GQAKWEa4sUVEAMG4G6ckcONDwRcg1e2D3+ohXgY4UAWF8wHKQMrSnzCgfFpsxh+aHXMGtPQroQasRY4U6UdG0rz1Vjbka0MekOGRZQEvqQFlxseFor8zWFgHek3v29+WqN6gaK5gZOTOMZzpQIC1201LkMCXild3vWXSc5UX9xcFYfbRPzGFa1FDcPfPB/jUEq/FeGt419CI3YmBlVoHsa4KdcwQP5ZSwHHhFJ7/Ph/Rap/4vmG91eDwPP0lDfCDRCLszTqfzM71xpmiKi2HwS4WlqvGNwtvwF5Dqpn6KTq8ax00UMPkxDcZrEEEsIvHiUXXEphdb4GB4FymlPwBz4Gperqq5pW7TQ6/yNRhW8VT5NhuP0udlxo4gILq5ZxAZk8ZGh3g4CqxJlPKY7AQxupfUcVpWT5VItp1+30UqoyP4wWsRo3olRRgkWZZ2ZN6VC3OZFeXB8NbnUrSdikNptD1QiGuKkr8EmSR/AK9Rw+FF3s5uwuPbvHGiPeFOViltMK7AUaOsq9+x9cndk3iJEE5LKZRlWJbKOZweROzmPNVPkjE3K/TyA57Rs68TkZ3MR8akKpm7cFjnjPd/DdkWjgYoKHSr5Wu5ssoBYU4acRs5g2DHxUmdq8VXOXRbunD8QN0LhgkssgahcdoYsNvuXGUK/KXD/7oFb+VGdhqIn02veuM5bLudJOc2Ky0GMaG4W/xWBxIJcL7yliJOXOpx0AkBqUgzlDczmLT4iILXDxxtRR1oZa2JWFgiAb43obrJnG/TZC2KSK2wqOzRZTXavZZFMb1f3bXvVaNaK828w9TO610gk8JNf3gMfETzXXsbcvRGCG9JWQZ6+cDPqc4466Yo2RcKH+PILeKOqtnlbInR3MmBeGG3FH10yzkybuqEC2HSQwpA0An7d9+73BkDUTm30bZmoP/RGbgFN+GrCOfADgqr0WbI1a1okpFms8iHYw9hm0zUvlEMivBRxModrbJJ+9/p3jUdQQ9BCtQdxnOGrT5dzRUmw0593/mbRSdBg0nRvRZM5/E16m7ZHmDEtWhwvfdZCZ8J8M12W0yRMszXamWfQTwIZ4ayYktrnscQuWr8idp3PjT2eF/jmtdhIfcpMnb+IfZY2FebW6UY/AK3jP4u3Tu4zE4qlnQgLFbM19EBIsNf7KhjdbqQ/D6yiDb+NlEi2SKD+ivXVUK8ib0oBo366gXkR8ZxGjpJIDcEgZPa9TcYe0TIbiPl/rPUQDu3XBJ9X/GNq3FAUsKsll57DzaGMrjcT+gctp+9MLYXCq+sqP81eVQ0r9lt+gcQfZbACRbEjvlMskztZG8gbC8Qn9tt26Q7y7nDrbZq/LEz7kR6Jc6pg3N9rVX8Y5MJrGlML9p9lU4jbTkKqCveeZUJjHB03m2KRKR2TytoFkTXOLg7keU1s1lrPMQJpoOKLuAAC+y1HlJucU6ysB5hsXhvSPPLq5J7JtnqHKZ4vYjC4Vy8153QY+6780xDuGARsGbOs1WqzH0QS765rnSKEbbKlkO8oI/VDwUd0is13tKpqILu1mDJFNy/iJAWcvDgjxvusIT+PGz3ST/J9r9Mtfd0jpaGeiLYIqXc7DiHSS8TcjFVksi66PEkxW1z6ujbLLUGNNYnzOWpH8BZGK4bCK7iR+MbIv8ncDAz1u4StN3vTTzewr9IQjk9wxFxn+6N1ddKs0vffJiS08N3a4G1SVrlZ97Q/M+8G9fe5AP6d9/Qq4WRnORVhofPIKEdCr3llspUfE0oKIIYoByBRPh+bX1HLS3JWGJRhIvE1aW4NTd8ePi4Z+kXb+Z8snYfSNcqijhAgVsx4RCM54cXUiYkjeBmmC4ajOHrChoELscJJC7+9jjMjw5BagZKlgRMiSNYz7h7vvZIoQqbtQmspc0cUk1G/73iXtSpROl5wtLgQi0mW2Ex8i3WULhcggx6E1LMVHUsdc9GHI1PH3U2Ko0PyGdn9KdVOLm7FPBui0i9a0HpA60MsewVE4z8CAt5d401Gv6zXlIT5Ybit1VIA0FCs7wtvYreru1fUyW3oLAZ/+aTnZrOcYRNVA8spoRtlRoWflsRClFcgzkqiHOrf0/SVw+EpVaFlJ0g4Kxq1MMOmiQdpMNpte8lMMQqm6cIFXlnGbfJllysKDi+0JJMotkqgIxOSQgU9dn/lWkeVf8nUm3iwX2Nl3WDw9i6AUK3vBAbZZrcJpDQ/N64AVwjT07Jef30GSSmtNu2WlW7YoyW2FlWfZFQUwk867EdLYKk9VG6JgEnBiBxkY7LMo4YLQJJlAo9l/oTvJkSARDF/XtyAzM8O2t3eT/iXa6wDN3WewNmQHdPfsxChU/KtLG2Mn8i4ZqKdSlIaBZadxJmRzVS/o4yA65RTSViq60oa395Lqw0pzY4SipwE0SXXsKV+GZraGSkr/RW08wPRvqvSUkYBMA9lPx4m24az+IHmCbXA+0faxTRE9wuGeO06DIXa6QlKJ3puIyiuAVfPr736vzo2pBirS+Vxel3TMm3JKhz9o2ZoRvaFVpIkykb0Hcm4oHFBMcNSNj7/4GJt43ogonY2Vg4nsDQIWxAcorpXACzgBqQPjYsE/VUpXpwNManEru4NwMCFPkXvMoqvoeLN3qyu/N1eWEHttMD65v19l/0kH2mR35iv/FI+yjoHJ9gPMz67af3Mq/BoWXqu3rphiWMXVkmnPSEkpGpUI2h1MThideGFEOK6YZHPwYzMBvpNC7+ZHxPb7epfefGyIB4JzO9DTNEYnDLVVHdQyvOEVefrk6Uv5kTQYVYWWdqrdcIl7yljwwIWdfQ/y+2QB3eR/qxYObuYyB4gTbo2in4PzarU1sO9nETkmj9/AoxDA+JM3GMqQtJR4jtduHtnoCLxd1gQUscHRB/MoRYIEsP2pDZ9KvHgtlk1iTbWWbHhohwFEYX7y51fUV2nuUmnoUcqnWIQAAgl9LTVX+Bc0QGNEhChxHR4YjfE51PUdGfsSFE6ck7BL3/hTf9jLq4G1IafINxOLKeAtO7quulYvH5YOBc+zX7CrMgWnW47/jfRsWnJjYYoE7xMfWV2HN2iyIqLI"),read_sorted_array=()=>read_sorted(n),read_sorted_set=()=>new Set(read_sorted_array());c=new Map(read_mapped(n)),u=read_sorted_set(),d=read_sorted_array(),p=new Set(read_sorted_array().map(e=>d[e])),d=new Set(d),f=read_sorted_set(),read_sorted_set();let o=read_sorted_arrays(n),i=n(),read_chunked=()=>new Set(read_sorted_array().flatMap(e=>o[e]).concat(read_sorted_array()));m=read_array_while(e=>{let t=read_array_while(n).map(e=>e+96);if(t.length){let o=e>=i;return t[0]-=32,t=str_from_cps(t),o&&(t=`Restricted[${t}]`),{N:t,P:read_chunked(),Q:read_chunked(),M:!n(),R:o}}}),g=read_sorted_set(),b=new Map;let s=read_sorted_array().concat(Array_from(g)).sort((e,t)=>e-t);for(let{V:e,M:t}of(s.forEach((e,t)=>{let o=n(),i=s[t]=o?s[t-o]:{V:[],M:new Map};i.V.push(e),g.has(e)||b.set(e,i)}),new Set(b.values()))){let n=[];for(let t of e){let e=m.filter(e=>group_has_cp(e,t)),o=n.find(({G:t})=>e.some(e=>t.has(e)));o||(o={G:new Set,V:[]},n.push(o)),o.V.push(t),e.forEach(e=>o.G.add(e))}let o=n.flatMap(e=>Array_from(e.G));for(let{G:e,V:i}of n){let n=new Set(o.filter(t=>!e.has(t)));for(let e of i)t.set(e,n)}}let l=new Set,C=new Set,add_to_union=e=>l.has(e)?C.add(e):l.add(e);for(let e of m){for(let t of e.P)add_to_union(t);for(let t of e.Q)add_to_union(t)}for(let e of l)b.has(e)||C.has(e)||b.set(e,1);for(let o of(y=new Set(Array_from(l).concat(Array_from(decomposed(l).map(unpack_cp)))),v=(e=[],t=read_sorted(n),function expand({S:t,B:n},o,i){if(!(4&t)||i!==o[o.length-1])for(let s of(2&t&&(i=o[o.length-1]),1&t&&e.push(o),n))for(let e of s.Q)expand(s,[...o,e],i)}(function decode(e){return{S:n(),B:read_array_while(()=>{let e=read_sorted(n).map(e=>t[e]);if(e.length)return decode(e)}),Q:e}}([]),[]),e).map(e=>Emoji.from(e)).sort(compare_arrays),w=new Map,v)){let e=[w];for(let t of o){let n=e.map(e=>{let n=e.get(t);return n||(n=new Map,e.set(t,n)),n});65039===t?e.push(...n):e=n}for(let t of e)t.V=o}}function quoted_cp(e){return(should_escape(e)?"":`${bidi_qq(safe_str_from_cps([e]))} `)+quote_cp(e)}function bidi_qq(e){return`"${e}"\u200E`}function safe_str_from_cps(e,t=quote_cp){var n;let o=[];n=e[0],init(),d.has(n)&&o.push("◌");let i=0,s=e.length;for(let n=0;ne.P.has(t));return o&&(n=`${o.N} ${n}`),Error(`illegal mixture: ${e.N} + ${n}`)}function error_placement(e){return Error(`illegal placement: ${e}`)}function filter_fe0f(e){return e.filter(e=>65039!=e)}let EnsAvatarInvalidMetadataError=class EnsAvatarInvalidMetadataError extends X.G{constructor({data:e}){super("Unable to extract image from metadata. The metadata may be malformed or invalid.",{metaMessages:["- Metadata must be a JSON object with at least an `image`, `image_url` or `image_data` property.","",`Provided data: ${JSON.stringify(e)}`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EnsAvatarInvalidMetadataError"})}};let EnsAvatarInvalidNftUriError=class EnsAvatarInvalidNftUriError extends X.G{constructor({reason:e}){super(`ENS NFT avatar URI is invalid. ${e}`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EnsAvatarInvalidNftUriError"})}};let EnsAvatarUriResolutionError=class EnsAvatarUriResolutionError extends X.G{constructor({uri:e}){super(`Unable to resolve ENS avatar URI "${e}". The URI may be malformed, invalid, or does not respond with a valid image.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EnsAvatarUriResolutionError"})}};let EnsAvatarUnsupportedNamespaceError=class EnsAvatarUnsupportedNamespaceError extends X.G{constructor({namespace:e}){super(`ENS NFT avatar namespace "${e}" is not supported. Must be "erc721" or "erc1155".`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EnsAvatarUnsupportedNamespaceError"})}};let ef=/(?https?:\/\/[^\/]*|ipfs:\/|ipns:\/|ar:\/)?(?\/)?(?ipfs\/|ipns\/)?(?[\w\-.]+)(?\/.*)?/,em=/^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[A-Za-z2-7]{58,}|B[A-Z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|F[0-9A-F]{50,})(\/(?[\w\-.]+))?(?\/.*)?$/,eg=/^data:([a-zA-Z\-/+]*);base64,([^"].*)/,eb=/^data:([a-zA-Z\-/+]*)?(;[a-zA-Z0-9].*?)?(,)/;async function isImageUri(e){try{let t=await fetch(e,{method:"HEAD"});if(200===t.status){let e=t.headers.get("content-type");return e?.startsWith("image/")}return!1}catch(t){if("object"==typeof t&&void 0!==t.response||!globalThis.hasOwnProperty("Image"))return!1;return new Promise(t=>{let n=new Image;n.onload=()=>{t(!0)},n.onerror=()=>{t(!1)},n.src=e})}}function getGateway(e,t){return e?e.endsWith("/")?e.slice(0,-1):e:t}function resolveAvatarUri({uri:e,gatewayUrls:t}){let n=eg.test(e);if(n)return{uri:e,isOnChain:!0,isEncoded:n};let o=getGateway(t?.ipfs,"https://ipfs.io"),i=getGateway(t?.arweave,"https://arweave.net"),s=e.match(ef),{protocol:l,subpath:c,target:u,subtarget:d=""}=s?.groups||{},p="ipns:/"===l||"ipns/"===c,f="ipfs:/"===l||"ipfs/"===c||em.test(e);if(e.startsWith("http")&&!p&&!f){let n=e;return t?.arweave&&(n=e.replace(/https:\/\/arweave.net/g,t?.arweave)),{uri:n,isOnChain:!1,isEncoded:!1}}if((p||f)&&u)return{uri:`${o}/${p?"ipns":"ipfs"}/${u}${d}`,isOnChain:!1,isEncoded:!1};if("ar:/"===l&&u)return{uri:`${i}/${u}${d||""}`,isOnChain:!1,isEncoded:!1};let m=e.replace(eb,"");if(m.startsWith("e.json()),o=await parseAvatarUri({gatewayUrls:e,uri:getJsonImage(n)});return o}catch{throw new EnsAvatarUriResolutionError({uri:t})}}async function parseAvatarUri({gatewayUrls:e,uri:t}){let{uri:n,isOnChain:o}=resolveAvatarUri({uri:t,gatewayUrls:e});if(o)return n;let i=await isImageUri(n);if(i)return n;throw new EnsAvatarUriResolutionError({uri:t})}async function getNftTokenUri(e,{nft:t}){if("erc721"===t.namespace)return readContract(e,{address:t.contractAddress,abi:[{name:"tokenURI",type:"function",stateMutability:"view",inputs:[{name:"tokenId",type:"uint256"}],outputs:[{name:"",type:"string"}]}],functionName:"tokenURI",args:[BigInt(t.tokenID)]});if("erc1155"===t.namespace)return readContract(e,{address:t.contractAddress,abi:[{name:"uri",type:"function",stateMutability:"view",inputs:[{name:"_id",type:"uint256"}],outputs:[{name:"",type:"string"}]}],functionName:"uri",args:[BigInt(t.tokenID)]});throw new EnsAvatarUnsupportedNamespaceError({namespace:t.namespace})}async function parseAvatarRecord(e,{gatewayUrls:t,record:n}){return/eip155:/i.test(n)?parseNftAvatarUri(e,{gatewayUrls:t,record:n}):parseAvatarUri({uri:n,gatewayUrls:t})}async function parseNftAvatarUri(e,{gatewayUrls:t,record:n}){let o=function(e){let t=e;t.startsWith("did:nft:")&&(t=t.replace("did:nft:","").replace(/_/g,"/"));let[n,o,i]=t.split("/"),[s,l]=n.split(":"),[c,u]=o.split(":");if(!s||"eip155"!==s.toLowerCase())throw new EnsAvatarInvalidNftUriError({reason:"Only EIP-155 supported"});if(!l)throw new EnsAvatarInvalidNftUriError({reason:"Chain ID not found"});if(!u)throw new EnsAvatarInvalidNftUriError({reason:"Contract address not found"});if(!i)throw new EnsAvatarInvalidNftUriError({reason:"Token ID not found"});if(!c)throw new EnsAvatarInvalidNftUriError({reason:"ERC namespace not found"});return{chainID:parseInt(l),namespace:c.toLowerCase(),contractAddress:u,tokenID:i}}(n),i=await getNftTokenUri(e,{nft:o}),{uri:s,isOnChain:l,isEncoded:c}=resolveAvatarUri({uri:i,gatewayUrls:t});if(l&&(s.includes("data:application/json;base64,")||s.startsWith("{"))){let e=c?atob(s.replace("data:application/json;base64,","")):s,n=JSON.parse(e);return parseAvatarUri({uri:getJsonImage(n),gatewayUrls:t})}let u=o.tokenID;return"erc1155"===o.namespace&&(u=u.replace("0x","").padStart(64,"0")),getMetadataAvatarUri({gatewayUrls:t,uri:s.replace(/(?:0x)?{id}/,u)})}var ey=n(21746);function isNullUniversalResolverError(e,t){if(!(e instanceof X.G))return!1;let n=e.walk(e=>e instanceof q.Lu);return n instanceof q.Lu&&(!!(n.data?.errorName==="ResolverNotFound"||n.data?.errorName==="ResolverWildcardNotSupported"||n.data?.errorName==="ResolverNotContract"||n.data?.errorName==="ResolverError"||n.data?.errorName==="HttpError"||n.reason?.includes("Wildcard on non-extended resolvers is not supported"))||"reverse"===t&&n.reason===ey.$[50])}var ev=n(57040),ew=n(11187),eC=n(49550),eE=n(15102);function encodedLabelToLabelhash(e){if(66!==e.length||0!==e.indexOf("[")||65!==e.indexOf("]"))return null;let t=`0x${e.slice(1,65)}`;return(0,eE.v)(t)?t:null}function namehash(e){let t=new Uint8Array(32).fill(0);if(!e)return(0,Q.ci)(t);let n=e.split(".");for(let e=n.length-1;e>=0;e-=1){let o=encodedLabelToLabelhash(n[e]),i=o?(0,ew.O0)(o):(0,eC.w)((0,ew.qX)(n[e]),"bytes");t=(0,eC.w)((0,ev.zo)([t,i]),"bytes")}return(0,Q.ci)(t)}function packetToBytes(e){let t=e.replace(/^\.|\.$/gm,"");if(0===t.length)return new Uint8Array(1);let n=new Uint8Array((0,ew.qX)(t).byteLength+2),o=0,i=t.split(".");for(let e=0;e255){var s;t=(0,ew.qX)((s=function(e){let t=new Uint8Array(32).fill(0);return e?encodedLabelToLabelhash(e)||(0,eC.w)((0,ew.qX)(e)):(0,Q.ci)(t)}(i[e]),`[${s.slice(2)}]`))}n[o]=t.length,n.set(t,o+1),o+=t.length+1}return n.byteLength!==o+1?n.slice(0,o+1):n}async function getEnsText(e,{blockNumber:t,blockTag:n,name:o,key:i,gatewayUrls:s,strict:l,universalResolverAddress:c}){let u=c;if(!u){if(!e.chain)throw Error("client chain not configured. universalResolverAddress is required.");u=(0,ee.L)({blockNumber:t,chain:e.chain,contract:"ensUniversalResolver"})}try{let l={address:u,abi:Z.k3,functionName:"resolve",args:[(0,Q.NC)(packetToBytes(o)),(0,$.R)({abi:Z.nZ,functionName:"text",args:[namehash(o),i]})],blockNumber:t,blockTag:n},c=getAction_getAction(e,readContract,"readContract"),d=s?await c({...l,args:[...l.args,s]}):await c(l);if("0x"===d[0])return null;let p=(0,Y.k)({abi:Z.nZ,functionName:"text",data:d[0]});return""===p?null:p}catch(e){if(l)throw e;if(isNullUniversalResolverError(e,"resolve"))return null;throw e}}async function getEnsAvatar(e,{blockNumber:t,blockTag:n,assetGatewayUrls:o,name:i,gatewayUrls:s,strict:l,universalResolverAddress:c}){let u=await getAction_getAction(e,getEnsText,"getEnsText")({blockNumber:t,blockTag:n,key:"avatar",name:i,universalResolverAddress:c,gatewayUrls:s,strict:l});if(!u)return null;try{return await parseAvatarRecord(e,{record:u,gatewayUrls:o})}catch{return null}}var ex=n(66403);async function getEnsName(e,{address:t,blockNumber:n,blockTag:o,gatewayUrls:i,strict:s,universalResolverAddress:l}){let c=l;if(!c){if(!e.chain)throw Error("client chain not configured. universalResolverAddress is required.");c=(0,ee.L)({blockNumber:n,chain:e.chain,contract:"ensUniversalResolver"})}let u=`${t.toLowerCase().substring(2)}.addr.reverse`;try{let s={address:c,abi:Z.du,functionName:"reverse",args:[(0,Q.NC)(packetToBytes(u))],blockNumber:n,blockTag:o},l=getAction_getAction(e,readContract,"readContract"),[d,p]=i?await l({...s,args:[...s.args,i]}):await l(s);if(t.toLowerCase()!==p.toLowerCase())return null;return d}catch(e){if(s)throw e;if(isNullUniversalResolverError(e,"reverse"))return null;throw e}}async function getEnsAddress(e,{blockNumber:t,blockTag:n,coinType:o,name:i,gatewayUrls:s,strict:l,universalResolverAddress:c}){let u=c;if(!u){if(!e.chain)throw Error("client chain not configured. universalResolverAddress is required.");u=(0,ee.L)({blockNumber:t,chain:e.chain,contract:"ensUniversalResolver"})}try{let l=(0,$.R)({abi:Z.X$,functionName:"addr",...null!=o?{args:[namehash(i),BigInt(o)]}:{args:[namehash(i)]}}),c={address:u,abi:Z.k3,functionName:"resolve",args:[(0,Q.NC)(packetToBytes(i)),l],blockNumber:t,blockTag:n},d=getAction_getAction(e,readContract,"readContract"),p=s?await d({...c,args:[...c.args,s]}):await d(c);if("0x"===p[0])return null;let f=(0,Y.k)({abi:Z.X$,args:null!=o?[namehash(i),BigInt(o)]:void 0,functionName:"addr",data:p[0]});if("0x"===f||"0x00"===(0,W.f)(f))return null;return f}catch(e){if(l)throw e;if(isNullUniversalResolverError(e,"resolve"))return null;throw e}}async function getEnsResolver(e,{blockNumber:t,blockTag:n,name:o,universalResolverAddress:i}){let s=i;if(!s){if(!e.chain)throw Error("client chain not configured. universalResolverAddress is required.");s=(0,ee.L)({blockNumber:t,chain:e.chain,contract:"ensUniversalResolver"})}let[l]=await getAction_getAction(e,readContract,"readContract")({address:s,abi:[{inputs:[{type:"bytes"}],name:"findResolver",outputs:[{type:"address"},{type:"bytes32"}],stateMutability:"view",type:"function"}],functionName:"findResolver",args:[(0,Q.NC)(packetToBytes(o))],blockNumber:t,blockTag:n});return l}function createFilterRequestScope(e,{method:t}){let n={};return"fallback"===e.transport.type&&e.transport.onResponse?.(({method:e,response:o,status:i,transport:s})=>{"success"===i&&t===e&&(n[o]=s.request)}),t=>n[t]||e.request}async function createBlockFilter(e){let t=createFilterRequestScope(e,{method:"eth_newBlockFilter"}),n=await e.request({method:"eth_newBlockFilter"});return{id:n,request:t(n),type:"block"}}let FilterTypeNotSupportedError=class FilterTypeNotSupportedError extends X.G{constructor(e){super(`Filter type "${e}" is not supported.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"FilterTypeNotSupportedError"})}};var eA=n(96005),ek=n(45444),eB=n(80522),eS=n(40840);let eI="/docs/contract/encodeEventTopics";function encodeEventTopics(e){let{abi:t,eventName:n,args:o}=e,i=t[0];if(n){let e=(0,eS.mE)({abi:t,name:n});if(!e)throw new J.mv(n,{docsPath:eI});i=e}if("event"!==i.type)throw new J.mv(void 0,{docsPath:eI});let s=(0,eB.t)(i),l=(0,eA.n)(s),c=[];if(o&&"inputs"in i){let e=i.inputs?.filter(e=>"indexed"in e&&e.indexed),t=Array.isArray(o)?o:Object.values(o).length>0?e?.map(e=>o[e.name])??[]:[];t.length>0&&(c=e?.map((e,n)=>Array.isArray(t[n])?t[n].map((o,i)=>encodeArg({param:e,value:t[n][i]})):t[n]?encodeArg({param:e,value:t[n]}):null)??[])}return[l,...c]}function encodeArg({param:e,value:t}){if("string"===e.type||"bytes"===e.type)return(0,eC.w)((0,ew.O0)(t));if("tuple"===e.type||e.type.match(/^(.*)\[(\d+)?\]$/))throw new FilterTypeNotSupportedError(e.type);return(0,ek.E)([e],[t])}async function createContractEventFilter(e,t){let{address:n,abi:o,args:i,eventName:s,fromBlock:l,strict:c,toBlock:u}=t,d=createFilterRequestScope(e,{method:"eth_newFilter"}),p=s?encodeEventTopics({abi:o,args:i,eventName:s}):void 0,f=await e.request({method:"eth_newFilter",params:[{address:n,fromBlock:"bigint"==typeof l?(0,Q.eC)(l):l,toBlock:"bigint"==typeof u?(0,Q.eC)(u):u,topics:p}]});return{abi:o,args:i,eventName:s,id:f,request:d(f),strict:!!c,type:"event"}}async function createEventFilter(e,{address:t,args:n,event:o,events:i,fromBlock:s,strict:l,toBlock:c}={}){let u=i??(o?[o]:void 0),d=createFilterRequestScope(e,{method:"eth_newFilter"}),p=[];u&&(p=[u.flatMap(e=>encodeEventTopics({abi:[e],eventName:e.name,args:n}))],o&&(p=p[0]));let f=await e.request({method:"eth_newFilter",params:[{address:t,fromBlock:"bigint"==typeof s?(0,Q.eC)(s):s,toBlock:"bigint"==typeof c?(0,Q.eC)(c):c,...p.length?{topics:p}:{}}]});return{abi:u,args:n,eventName:o?o.name:void 0,fromBlock:s,id:f,request:d(f),strict:!!l,toBlock:c,type:"event"}}async function createPendingTransactionFilter(e){let t=createFilterRequestScope(e,{method:"eth_newPendingTransactionFilter"}),n=await e.request({method:"eth_newPendingTransactionFilter"});return{id:n,request:t(n),type:"transaction"}}var ej=n(14503),eT=n(39625),eP=n(67795),eM=n(33639);let EstimateGasExecutionError=class EstimateGasExecutionError extends X.G{constructor(e,{account:t,docsPath:n,chain:o,data:i,gas:s,gasPrice:l,maxFeePerGas:c,maxPriorityFeePerGas:u,nonce:d,to:p,value:f}){let m=(0,eM.xr)({from:t?.address,to:p,value:void 0!==f&&`${(0,eT.d)(f)} ${o?.nativeCurrency?.symbol||"ETH"}`,data:i,gas:s,gasPrice:void 0!==l&&`${(0,eP.o)(l)} gwei`,maxFeePerGas:void 0!==c&&`${(0,eP.o)(c)} gwei`,maxPriorityFeePerGas:void 0!==u&&`${(0,eP.o)(u)} gwei`,nonce:d});super(e.shortMessage,{cause:e,docsPath:n,metaMessages:[...e.metaMessages?[...e.metaMessages," "]:[],"Estimate Gas Arguments:",m].filter(Boolean)}),Object.defineProperty(this,"cause",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"EstimateGasExecutionError"}),this.cause=e}};var eO=n(26445),eR=n(87469),eU=n(61163),eF=n(74688),eN=n(47531);let BaseFeeScalarError=class BaseFeeScalarError extends X.G{constructor(){super("`baseFeeMultiplier` must be greater than 1."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"BaseFeeScalarError"})}};let Eip1559FeesNotSupportedError=class Eip1559FeesNotSupportedError extends X.G{constructor(){super("Chain does not support EIP-1559 fees."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Eip1559FeesNotSupportedError"})}};let MaxFeePerGasTooLowError=class MaxFeePerGasTooLowError extends X.G{constructor({maxPriorityFeePerGas:e}){super(`\`maxFeePerGas\` cannot be less than the \`maxPriorityFeePerGas\` (${(0,eP.o)(e)} gwei).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"MaxFeePerGasTooLowError"})}};let BlockNotFoundError=class BlockNotFoundError extends X.G{constructor({blockHash:e,blockNumber:t}){let n="Block";e&&(n=`Block at hash "${e}"`),t&&(n=`Block at number "${t}"`),super(`${n} could not be found.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"BlockNotFoundError"})}};var eD=n(43310);async function getBlock(e,{blockHash:t,blockNumber:n,blockTag:o,includeTransactions:i}={}){let s=i??!1,l=void 0!==n?(0,Q.eC)(n):void 0,c=null;if(!(c=t?await e.request({method:"eth_getBlockByHash",params:[t,s]}):await e.request({method:"eth_getBlockByNumber",params:[l||(o??"latest"),s]})))throw new BlockNotFoundError({blockHash:t,blockNumber:n});let u=e.chain?.formatters?.block?.format||eD.Z;return u(c)}async function getGasPrice(e){let t=await e.request({method:"eth_gasPrice"});return BigInt(t)}async function estimateMaxPriorityFeePerGas(e,t){return internal_estimateMaxPriorityFeePerGas(e,t)}async function internal_estimateMaxPriorityFeePerGas(e,t){let{block:n,chain:o=e.chain,request:i}=t||{};if("function"==typeof o?.fees?.defaultPriorityFee){let t=n||await getAction_getAction(e,getBlock,"getBlock")({});return o.fees.defaultPriorityFee({block:t,client:e,request:i})}if(void 0!==o?.fees?.defaultPriorityFee)return o?.fees?.defaultPriorityFee;try{let t=await e.request({method:"eth_maxPriorityFeePerGas"});return(0,G.y_)(t)}catch{let[t,o]=await Promise.all([n?Promise.resolve(n):getAction_getAction(e,getBlock,"getBlock")({}),getAction_getAction(e,getGasPrice,"getGasPrice")({})]);if("bigint"!=typeof t.baseFeePerGas)throw new Eip1559FeesNotSupportedError;let i=o-t.baseFeePerGas;if(i<0n)return 0n;return i}}async function estimateFeesPerGas(e,t){return internal_estimateFeesPerGas(e,t)}async function internal_estimateFeesPerGas(e,t){let{block:n,chain:o=e.chain,request:i,type:s="eip1559"}=t||{},l=await (async()=>"function"==typeof o?.fees?.baseFeeMultiplier?o.fees.baseFeeMultiplier({block:n,client:e,request:i}):o?.fees?.baseFeeMultiplier??1.2)();if(l<1)throw new BaseFeeScalarError;let c=l.toString().split(".")[1]?.length??0,u=10**c,multiply=e=>e*BigInt(Math.ceil(l*u))/BigInt(u),d=n||await getAction_getAction(e,getBlock,"getBlock")({});if("function"==typeof o?.fees?.estimateFeesPerGas)return o.fees.estimateFeesPerGas({block:n,client:e,multiply,request:i,type:s});if("eip1559"===s){if("bigint"!=typeof d.baseFeePerGas)throw new Eip1559FeesNotSupportedError;let t="bigint"==typeof i?.maxPriorityFeePerGas?i.maxPriorityFeePerGas:await internal_estimateMaxPriorityFeePerGas(e,{block:d,chain:o,request:i}),n=multiply(d.baseFeePerGas),s=i?.maxFeePerGas??n+t;return{maxFeePerGas:s,maxPriorityFeePerGas:t}}let p=i?.gasPrice??multiply(await getAction_getAction(e,getGasPrice,"getGasPrice")({}));return{gasPrice:p}}async function getTransactionCount(e,{address:t,blockTag:n="latest",blockNumber:o}){let i=await e.request({method:"eth_getTransactionCount",params:[t,o?(0,Q.eC)(o):n]});return(0,G.ly)(i)}var e_=n(82994);async function getChainId_getChainId(e){let t=await e.request({method:"eth_chainId"});return(0,G.ly)(t)}async function prepareTransactionRequest(e,t){let{account:n=e.account,chain:o,chainId:i,gas:s,nonce:l,parameters:c=["chainId","fees","gas","nonce","type"],type:u}=t,d=n?(0,ej.T)(n):void 0,p=await getAction_getAction(e,getBlock,"getBlock")({blockTag:"latest"}),f={...t,...d?{from:d?.address}:{}};if(c.includes("chainId")&&(o?f.chainId=o.id:void 0!==i?f.chainId=i:f.chainId=await getAction_getAction(e,getChainId_getChainId,"getChainId")({})),c.includes("nonce")&&void 0===l&&d&&(f.nonce=await getAction_getAction(e,getTransactionCount,"getTransactionCount")({address:d.address,blockTag:"pending"})),(c.includes("fees")||c.includes("type"))&&void 0===u)try{f.type=(0,e_.l)(f)}catch{f.type="bigint"==typeof p.baseFeePerGas?"eip1559":"legacy"}if(c.includes("fees")){if("eip1559"===f.type||"eip4844"===f.type){let{maxFeePerGas:n,maxPriorityFeePerGas:i}=await internal_estimateFeesPerGas(e,{block:p,chain:o,request:f});if(void 0===t.maxPriorityFeePerGas&&t.maxFeePerGas&&t.maxFeePerGas{let t=(0,eR.k)(e,n);return t instanceof eO.cj?e:t})();return new EstimateGasExecutionError(o,{docsPath:t,...n})}(n,{...t,account:o,chain:e.chain})}}async function estimateContractGas(e,t){let{abi:n,address:o,args:i,functionName:s,...l}=t,c=(0,$.R)({abi:n,args:i,functionName:s});try{let t=await getAction_getAction(e,estimateGas,"estimateGas")({data:c,to:o,...l});return t}catch(t){let e=l.account?(0,ej.T)(l.account):void 0;throw getContractError(t,{abi:n,address:o,args:i,docsPath:"/docs/contract/estimateContractGas",functionName:s,sender:e?.address})}}async function getBlobBaseFee(e){let t=await e.request({method:"eth_blobBaseFee"});return BigInt(t)}let eL=new Map,ez=new Map;async function withCache(e,{cacheKey:t,cacheTime:n=1/0}){let o=function(e){let buildCache=(e,t)=>({clear:()=>t.delete(e),get:()=>t.get(e),set:n=>t.set(e,n)}),t=buildCache(e,eL),n=buildCache(e,ez);return{clear:()=>{t.clear(),n.clear()},promise:t,response:n}}(t),i=o.response.get();if(i&&n>0){let e=new Date().getTime()-i.created.getTime();if(e`blockNumber.${e}`;async function getBlockNumber(e,{cacheTime:t=e.cacheTime}={}){let n=await withCache(()=>e.request({method:"eth_blockNumber"}),{cacheKey:cacheKey(e.uid),cacheTime:t});return BigInt(n)}async function getBlockTransactionCount(e,{blockHash:t,blockNumber:n,blockTag:o="latest"}={}){let i;let s=void 0!==n?(0,Q.eC)(n):void 0;return i=t?await e.request({method:"eth_getBlockTransactionCountByHash",params:[t]}):await e.request({method:"eth_getBlockTransactionCountByNumber",params:[s||o]}),(0,G.ly)(i)}async function getBytecode(e,{address:t,blockNumber:n,blockTag:o="latest"}){let i=void 0!==n?(0,Q.eC)(n):void 0,s=await e.request({method:"eth_getCode",params:[t,i||o]});if("0x"!==s)return s}var eq=n(39135),eG=n(66238),eW=n(78398);let eH="/docs/contract/decodeEventLog";function decodeEventLog(e){let{abi:t,data:n,strict:o,topics:i}=e,s=o??!0,[l,...c]=i;if(!l)throw new J.FM({docsPath:eH});let u=t.find(e=>"event"===e.type&&l===(0,eA.n)((0,eB.t)(e)));if(!(u&&"name"in u)||"event"!==u.type)throw new J.lC(l,{docsPath:eH});let{name:d,inputs:p}=u,f=p?.some(e=>!("name"in e&&e.name)),m=f?[]:{},g=p.filter(e=>"indexed"in e&&e.indexed);for(let e=0;e!("indexed"in e&&e.indexed));if(b.length>0){if(n&&"0x"!==n)try{let e=(0,eW.r)(b,n);if(e){if(f)m=[...m,...e];else for(let t=0;t0?m:void 0}}function parseEventLogs({abi:e,eventName:t,logs:n,strict:o=!0}){return n.map(n=>{try{let i=decodeEventLog({...n,abi:e,strict:o});if(t&&!t.includes(i.eventName))return null;return{...i,...n}}catch(i){let e,t;if(i instanceof J.lC)return null;if(i instanceof J.SM||i instanceof J.Gy){if(o)return null;e=i.abiItem.name,t=i.abiItem.inputs?.some(e=>!("name"in e&&e.name))}return{...n,args:t?[]:{},eventName:e}}}).filter(Boolean)}var eQ=n(53992);async function getLogs(e,{address:t,blockHash:n,fromBlock:o,toBlock:i,event:s,events:l,args:c,strict:u}={}){let d;let p=u??!1,f=l??(s?[s]:void 0),m=[];f&&(m=[f.flatMap(e=>encodeEventTopics({abi:[e],eventName:e.name,args:c}))],s&&(m=m[0])),d=n?await e.request({method:"eth_getLogs",params:[{address:t,topics:m,blockHash:n}]}):await e.request({method:"eth_getLogs",params:[{address:t,topics:m,fromBlock:"bigint"==typeof o?(0,Q.eC)(o):o,toBlock:"bigint"==typeof i?(0,Q.eC)(i):i}]});let g=d.map(e=>(0,eQ.U)(e));return f?parseEventLogs({abi:f,logs:g,strict:p}):g}async function getContractEvents(e,t){let{abi:n,address:o,args:i,blockHash:s,eventName:l,fromBlock:c,toBlock:u,strict:d}=t,p=l?(0,eS.mE)({abi:n,name:l}):void 0,f=p?void 0:n.filter(e=>"event"===e.type);return getAction_getAction(e,getLogs,"getLogs")({address:o,args:i,blockHash:s,event:p,events:f,fromBlock:c,toBlock:u,strict:d})}async function getFeeHistory(e,{blockCount:t,blockNumber:n,blockTag:o="latest",rewardPercentiles:i}){let s=n?(0,Q.eC)(n):void 0,l=await e.request({method:"eth_feeHistory",params:[(0,Q.eC)(t),s||o,i]});return{baseFeePerGas:l.baseFeePerGas.map(e=>BigInt(e)),gasUsedRatio:l.gasUsedRatio,oldestBlock:BigInt(l.oldestBlock),reward:l.reward?.map(e=>e.map(e=>BigInt(e)))}}async function getFilterChanges(e,{filter:t}){let n="strict"in t&&t.strict,o=await t.request({method:"eth_getFilterChanges",params:[t.id]});if("string"==typeof o[0])return o;let i=o.map(e=>(0,eQ.U)(e));return"abi"in t&&t.abi?parseEventLogs({abi:t.abi,logs:i,strict:n}):i}async function getFilterLogs(e,{filter:t}){let n=t.strict??!1,o=await t.request({method:"eth_getFilterLogs",params:[t.id]}),i=o.map(e=>(0,eQ.U)(e));return t.abi?parseEventLogs({abi:t.abi,logs:i,strict:n}):i}async function getProof(e,{address:t,blockNumber:n,blockTag:o,storageKeys:i}){let s=void 0!==n?(0,Q.eC)(n):void 0,l=await e.request({method:"eth_getProof",params:[t,i,s||(o??"latest")]});return{...l,balance:l.balance?BigInt(l.balance):void 0,nonce:l.nonce?(0,G.ly)(l.nonce):void 0,storageProof:l.storageProof?l.storageProof.map(e=>({...e,value:BigInt(e.value)})):void 0}}async function getStorageAt(e,{address:t,blockNumber:n,blockTag:o="latest",slot:i}){let s=void 0!==n?(0,Q.eC)(n):void 0,l=await e.request({method:"eth_getStorageAt",params:[t,i,s||o]});return l}var eK=n(6073);async function getTransaction(e,{blockHash:t,blockNumber:n,blockTag:o,hash:i,index:s}){let l=o||"latest",c=void 0!==n?(0,Q.eC)(n):void 0,u=null;if(i?u=await e.request({method:"eth_getTransactionByHash",params:[i]}):t?u=await e.request({method:"eth_getTransactionByBlockHashAndIndex",params:[t,(0,Q.eC)(s)]}):(c||l)&&(u=await e.request({method:"eth_getTransactionByBlockNumberAndIndex",params:[c||l,(0,Q.eC)(s)]})),!u)throw new eM.Bh({blockHash:t,blockNumber:n,blockTag:l,hash:i,index:s});let d=e.chain?.formatters?.transaction?.format||eK.Tr;return d(u)}async function getTransactionConfirmations(e,{hash:t,transactionReceipt:n}){let[o,i]=await Promise.all([getAction_getAction(e,getBlockNumber,"getBlockNumber")({}),t?getAction_getAction(e,getTransaction,"getBlockNumber")({hash:t}):void 0]),s=n?.blockNumber||i?.blockNumber;return s?o-s+1n:0n}var eV=n(30866);async function getTransactionReceipt(e,{hash:t}){let n=await e.request({method:"eth_getTransactionReceipt",params:[t]});if(!n)throw new eM.Yb({hash:t});let o=e.chain?.formatters?.transactionReceipt?.format||eV.f;return o(n)}async function simulateContract(e,t){let{abi:n,address:o,args:i,dataSuffix:s,functionName:l,...c}=t,u=c.account?(0,ej.T)(c.account):e.account,d=(0,$.R)({abi:n,args:i,functionName:l});try{let{data:p}=await getAction_getAction(e,er.RE,"call")({batch:!1,data:`${d}${s?s.replace("0x",""):""}`,to:o,...c,account:u}),f=(0,Y.k)({abi:n,args:i,functionName:l,data:p||"0x"}),m=n.filter(e=>"name"in e&&e.name===t.functionName);return{result:f,request:{abi:m,address:o,args:i,dataSuffix:s,functionName:l,...c,account:u}}}catch(e){throw getContractError(e,{abi:n,address:o,args:i,docsPath:"/docs/contract/simulateContract",functionName:l,sender:u?.address})}}async function uninstallFilter(e,{filter:t}){return t.request({method:"eth_uninstallFilter",params:[t.id]})}var eZ=n(27499);let eJ="/docs/contract/encodeDeployData";async function verifyHash(e,{address:t,hash:n,signature:o,...i}){let s=(0,eE.v)(o)?o:(0,Q.NC)(o);try{let{data:o}=await getAction_getAction(e,er.RE,"call")({data:function(e){let{abi:t,args:n,bytecode:o}=e;if(!n||0===n.length)return o;let i=t.find(e=>"type"in e&&"constructor"===e.type);if(!i)throw new J.fM({docsPath:eJ});if(!("inputs"in i)||!i.inputs||0===i.inputs.length)throw new J.cO({docsPath:eJ});let s=(0,ek.E)(i.inputs,n);return(0,ev.SM)([o,s])}({abi:Z.$o,args:[t,n,s],bytecode:"0x60806040523480156200001157600080fd5b50604051620007003803806200070083398101604081905262000034916200056f565b6000620000438484846200004f565b9050806000526001601ff35b600080846001600160a01b0316803b806020016040519081016040528181526000908060200190933c90507f6492649264926492649264926492649264926492649264926492649264926492620000a68462000451565b036200021f57600060608085806020019051810190620000c79190620005ce565b8651929550909350915060000362000192576000836001600160a01b031683604051620000f5919062000643565b6000604051808303816000865af19150503d806000811462000134576040519150601f19603f3d011682016040523d82523d6000602084013e62000139565b606091505b5050905080620001905760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b505b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90620001c4908b90869060040162000661565b602060405180830381865afa158015620001e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020891906200069d565b6001600160e01b031916149450505050506200044a565b805115620002b157604051630b135d3f60e11b808252906001600160a01b03871690631626ba7e9062000259908890889060040162000661565b602060405180830381865afa15801562000277573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029d91906200069d565b6001600160e01b031916149150506200044a565b8251604114620003195760405162461bcd60e51b815260206004820152603a6024820152600080516020620006e083398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e677468000000000000606482015260840162000187565b620003236200046b565b506020830151604080850151855186939260009185919081106200034b576200034b620006c9565b016020015160f81c9050601b81148015906200036b57508060ff16601c14155b15620003cf5760405162461bcd60e51b815260206004820152603b6024820152600080516020620006e083398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c75650000000000606482015260840162000187565b6040805160008152602081018083528a905260ff83169181019190915260608101849052608081018390526001600160a01b038a169060019060a0016020604051602081039080840390855afa1580156200042e573d6000803e3d6000fd5b505050602060405103516001600160a01b031614955050505050505b9392505050565b60006020825110156200046357600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b03811681146200049f57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004d5578181015183820152602001620004bb565b50506000910152565b600082601f830112620004f057600080fd5b81516001600160401b03808211156200050d576200050d620004a2565b604051601f8301601f19908116603f01168101908282118183101715620005385762000538620004a2565b816040528381528660208588010111156200055257600080fd5b62000565846020830160208901620004b8565b9695505050505050565b6000806000606084860312156200058557600080fd5b8351620005928162000489565b6020850151604086015191945092506001600160401b03811115620005b657600080fd5b620005c486828701620004de565b9150509250925092565b600080600060608486031215620005e457600080fd5b8351620005f18162000489565b60208501519093506001600160401b03808211156200060f57600080fd5b6200061d87838801620004de565b935060408601519150808211156200063457600080fd5b50620005c486828701620004de565b6000825162000657818460208701620004b8565b9190910192915050565b828152604060208201526000825180604084015262000688816060850160208701620004b8565b601f01601f1916919091016060019392505050565b600060208284031215620006b057600080fd5b81516001600160e01b0319811681146200044a57600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572"}),...i});return function(e,t){let n=(0,eE.v)(e)?(0,ew.O0)(e):e,o=(0,eE.v)(t)?(0,ew.O0)(t):t;return(0,eZ.Wd)(n,o)}(o??"0x0","0x1")}catch(e){if(e instanceof q.cg)return!1;throw e}}async function verifyMessage(e,{address:t,message:n,signature:o,...i}){let s=function(e,t){let n="string"==typeof e?(0,ew.qX)(e):e.raw instanceof Uint8Array?e.raw:(0,ew.O0)(e.raw),o=(0,ew.qX)(`Ethereum Signed Message: +${n.length}`);return(0,eC.w)((0,ev.zo)([o,n]),void 0)}(n);return verifyHash(e,{address:t,hash:s,signature:o,...i})}var eX=n(26087),eY=n(60480);let e$=/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/,e0=/^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/;function hashStruct({data:e,primaryType:t,types:n}){let o=function encodeData({data:e,primaryType:t,types:n}){let o=[{type:"bytes32"}],i=[function({primaryType:e,types:t}){let n=(0,Q.NC)(function({primaryType:e,types:t}){let n="",o=function findTypeDependencies({primaryType:e,types:t},n=new Set){let o=e.match(/^\w*/u),i=o?.[0];if(n.has(i)||void 0===t[i])return n;for(let e of(n.add(i),t[i]))findTypeDependencies({primaryType:e.type,types:t},n);return n}({primaryType:e,types:t});o.delete(e);let i=[e,...Array.from(o).sort()];for(let e of i)n+=`${e}(${t[e].map(({name:e,type:t})=>`${t} ${e}`).join(",")})`;return n}({primaryType:e,types:t}));return(0,eC.w)(n)}({primaryType:t,types:n})];for(let s of n[t]){let[t,l]=function encodeField({types:e,name:t,type:n,value:o}){if(void 0!==e[n])return[{type:"bytes32"},(0,eC.w)(encodeData({data:o,primaryType:n,types:e}))];if("bytes"===n){let e=o.length%2?"0":"";return o=`0x${e+o.slice(2)}`,[{type:"bytes32"},(0,eC.w)(o)]}if("string"===n)return[{type:"bytes32"},(0,eC.w)((0,Q.NC)(o))];if(n.lastIndexOf("]")===n.length-1){let i=n.slice(0,n.lastIndexOf("[")),s=o.map(n=>encodeField({name:t,type:i,types:e,value:n}));return[{type:"bytes32"},(0,eC.w)((0,ek.E)(s.map(([e])=>e),s.map(([,e])=>e)))]}return[{type:n},o]}({types:n,name:s.name,type:s.type,value:e[s.name]});o.push(t),i.push(l)}return(0,ek.E)(o,i)}({data:e,primaryType:t,types:n});return(0,eC.w)(o)}async function verifyTypedData(e,t){let{address:n,signature:o,message:i,primaryType:s,types:l,domain:c,...u}=t,d=function(e){let{domain:t={},message:n,primaryType:o}=e,i={EIP712Domain:function({domain:e}){return["string"==typeof e?.name&&{name:"name",type:"string"},e?.version&&{name:"version",type:"string"},"number"==typeof e?.chainId&&{name:"chainId",type:"uint256"},e?.verifyingContract&&{name:"verifyingContract",type:"address"},e?.salt&&{name:"salt",type:"bytes32"}].filter(Boolean)}({domain:t}),...e.types};!function(e){let{domain:t,message:n,primaryType:o,types:i}=e,validateData=(e,t)=>{for(let n of e){let{name:e,type:o}=n,s=t[e],l=o.match(e0);if(l&&("number"==typeof s||"bigint"==typeof s)){let[e,t,n]=l;(0,Q.eC)(s,{signed:"int"===t,size:parseInt(n)/8})}if("address"===o&&"string"==typeof s&&!(0,eY.U)(s))throw new eX.b({address:s});let c=o.match(e$);if(c){let[e,t]=c;if(t&&(0,eq.d)(s)!==parseInt(t))throw new J.KY({expectedSize:parseInt(t),givenSize:(0,eq.d)(s)})}let u=i[o];u&&validateData(u,s)}};if(i.EIP712Domain&&t&&validateData(i.EIP712Domain,t),"EIP712Domain"!==o){let e=i[o];validateData(e,n)}}({domain:t,message:n,primaryType:o,types:i});let s=["0x1901"];return t&&s.push(function({domain:e,types:t}){return hashStruct({data:e,primaryType:"EIP712Domain",types:t})}({domain:t,types:i})),"EIP712Domain"!==o&&s.push(hashStruct({data:n,primaryType:o,types:i})),(0,eC.w)((0,ev.zo)(s))}({message:i,primaryType:s,types:l,domain:c});return verifyHash(e,{address:n,hash:d,signature:o,...u})}let e1=new Map,e6=new Map,e3=0;function observe(e,t,n){let o=++e3,getListeners=()=>e1.get(e)||[],unsubscribe=()=>{let t=getListeners();e1.set(e,t.filter(e=>e.id!==o))},unwatch=()=>{let t=e6.get(e);1===getListeners().length&&t&&t(),unsubscribe()},i=getListeners();if(e1.set(e,[...i,{id:o,fns:t}]),i&&i.length>0)return unwatch;let s={};for(let e in t)s[e]=(...t)=>{let n=getListeners();if(0!==n.length)for(let o of n)o.fns[e]?.(...t)};let l=n(s);return"function"==typeof l&&e6.set(e,l),unwatch}var e2=n(7760),e7=n(96070),e8=n(62914);function poll(e,{emitOnBegin:t,initialWaitTime:n,interval:o}){let i=!0,unwatch=()=>i=!1,watch=async()=>{let s;t&&(s=await e({unpoll:unwatch}));let l=await n?.(s)??o;await (0,e8.D)(l);let poll=async()=>{i&&(await e({unpoll:unwatch}),await (0,e8.D)(o),poll())};poll()};return watch(),unwatch}function watchBlockNumber(e,{emitOnBegin:t=!1,emitMissed:n=!1,onBlockNumber:o,onError:i,poll:s,pollingInterval:l=e.pollingInterval}){let c;let u=void 0!==s?s:"webSocket"!==e.transport.type;return u?(()=>{let s=(0,e7.P)(["watchBlockNumber",e.uid,t,n,l]);return observe(s,{onBlockNumber:o,onError:i},o=>poll(async()=>{try{let t=await getAction_getAction(e,getBlockNumber,"getBlockNumber")({cacheTime:0});if(c){if(t===c)return;if(t-c>1&&n)for(let e=c+1n;ec)&&(o.onBlockNumber(t,c),c=t)}catch(e){o.onError?.(e)}},{emitOnBegin:t,interval:l}))})():(()=>{let s=(0,e7.P)(["watchBlockNumber",e.uid,t,n]);return observe(s,{onBlockNumber:o,onError:i},t=>{let n=!0,unsubscribe=()=>n=!1;return(async()=>{try{let{unsubscribe:o}=await e.transport.subscribe({params:["newHeads"],onData(e){if(!n)return;let o=(0,G.y_)(e.result?.number);t.onBlockNumber(o,c),c=o},onError(e){t.onError?.(e)}});unsubscribe=o,n||unsubscribe()}catch(e){i?.(e)}})(),()=>unsubscribe()})})()}async function waitForTransactionReceipt(e,{confirmations:t=1,hash:n,onReplaced:o,pollingInterval:i=e.pollingInterval,retryCount:s=6,retryDelay:l=({count:e})=>200*~~(1<{c&&setTimeout(()=>b(new eM.mc({hash:n})),c);let y=observe(f,{onReplaced:o,resolve:g,reject:b},o=>{let c=getAction_getAction(e,watchBlockNumber,"watchBlockNumber")({emitMissed:!0,emitOnBegin:!0,poll:!0,pollingInterval:i,async onBlockNumber(i){if(m)return;let f=i,done=e=>{c(),e(),y()};try{if(p){if(t>1&&(!p.blockNumber||f-p.blockNumber+1no.resolve(p));return}if(u||(m=!0,await (0,e2.J)(async()=>{(u=await getAction_getAction(e,getTransaction,"getTransaction")({hash:n})).blockNumber&&(f=u.blockNumber)},{delay:l,retryCount:s}),m=!1),p=await getAction_getAction(e,getTransactionReceipt,"getTransactionReceipt")({hash:n}),t>1&&(!p.blockNumber||f-p.blockNumber+1no.resolve(p))}catch(n){if(n instanceof eM.Bh||n instanceof eM.Yb){if(!u){m=!1;return}try{d=u,m=!0;let n=await (0,e2.J)(()=>getAction_getAction(e,getBlock,"getBlock")({blockNumber:f,includeTransactions:!0}),{delay:l,retryCount:s,shouldRetry:({error:e})=>e instanceof BlockNotFoundError});m=!1;let i=n.transactions.find(({from:e,nonce:t})=>e===d.from&&t===d.nonce);if(!i||(p=await getAction_getAction(e,getTransactionReceipt,"getTransactionReceipt")({hash:i.hash}),t>1&&(!p.blockNumber||f-p.blockNumber+1n{o.onReplaced?.({reason:c,replacedTransaction:d,transaction:i,transactionReceipt:p}),o.resolve(p)})}catch(e){done(()=>o.reject(e))}}else done(()=>o.reject(n))}}})})})}async function sendRawTransaction(e,{serializedTransaction:t}){return e.request({method:"eth_sendRawTransaction",params:[t]},{retryCount:0})}function publicActions(e){return{call:t=>(0,er.RE)(e,t),createBlockFilter:()=>createBlockFilter(e),createContractEventFilter:t=>createContractEventFilter(e,t),createEventFilter:t=>createEventFilter(e,t),createPendingTransactionFilter:()=>createPendingTransactionFilter(e),estimateContractGas:t=>estimateContractGas(e,t),estimateGas:t=>estimateGas(e,t),getBalance:t=>getBalance(e,t),getBlobBaseFee:()=>getBlobBaseFee(e),getBlock:t=>getBlock(e,t),getBlockNumber:t=>getBlockNumber(e,t),getBlockTransactionCount:t=>getBlockTransactionCount(e,t),getBytecode:t=>getBytecode(e,t),getChainId:()=>getChainId_getChainId(e),getContractEvents:t=>getContractEvents(e,t),getEnsAddress:t=>getEnsAddress(e,t),getEnsAvatar:t=>getEnsAvatar(e,t),getEnsName:t=>getEnsName(e,t),getEnsResolver:t=>getEnsResolver(e,t),getEnsText:t=>getEnsText(e,t),getFeeHistory:t=>getFeeHistory(e,t),estimateFeesPerGas:t=>estimateFeesPerGas(e,t),getFilterChanges:t=>getFilterChanges(e,t),getFilterLogs:t=>getFilterLogs(e,t),getGasPrice:()=>getGasPrice(e),getLogs:t=>getLogs(e,t),getProof:t=>getProof(e,t),estimateMaxPriorityFeePerGas:t=>estimateMaxPriorityFeePerGas(e,t),getStorageAt:t=>getStorageAt(e,t),getTransaction:t=>getTransaction(e,t),getTransactionConfirmations:t=>getTransactionConfirmations(e,t),getTransactionCount:t=>getTransactionCount(e,t),getTransactionReceipt:t=>getTransactionReceipt(e,t),multicall:t=>multicall(e,t),prepareTransactionRequest:t=>prepareTransactionRequest(e,t),readContract:t=>readContract(e,t),sendRawTransaction:t=>sendRawTransaction(e,t),simulateContract:t=>simulateContract(e,t),verifyMessage:t=>verifyMessage(e,t),verifyTypedData:t=>verifyTypedData(e,t),uninstallFilter:t=>uninstallFilter(e,t),waitForTransactionReceipt:t=>waitForTransactionReceipt(e,t),watchBlocks:t=>(function(e,{blockTag:t="latest",emitMissed:n=!1,emitOnBegin:o=!1,onBlock:i,onError:s,includeTransactions:l,poll:c,pollingInterval:u=e.pollingInterval}){let d,p,f;let m=void 0!==c?c:"webSocket"!==e.transport.type,g=l??!1;return m?(()=>{let l=(0,e7.P)(["watchBlocks",e.uid,n,o,g,u]);return observe(l,{onBlock:i,onError:s},i=>poll(async()=>{try{let o=await getAction_getAction(e,getBlock,"getBlock")({blockTag:t,includeTransactions:g});if(o.number&&d?.number){if(o.number===d.number)return;if(o.number-d.number>1&&n)for(let t=d?.number+1n;td.number)&&(i.onBlock(o,d),d=o)}catch(e){i.onError?.(e)}},{emitOnBegin:o,interval:u}))})():(p=!0,f=()=>p=!1,(async()=>{try{let{unsubscribe:t}=await e.transport.subscribe({params:["newHeads"],onData(t){if(!p)return;let n=e.chain?.formatters?.block?.format||eD.Z,o=n(t.result);i(o,d),d=o},onError(e){s?.(e)}});f=t,p||f()}catch(e){s?.(e)}})(),()=>f())})(e,t),watchBlockNumber:t=>watchBlockNumber(e,t),watchContractEvent:t=>(function(e,t){let{abi:n,address:o,args:i,batch:s=!0,eventName:l,onError:c,onLogs:u,poll:d,pollingInterval:p=e.pollingInterval,strict:f}=t,m=void 0!==d?d:"webSocket"!==e.transport.type;return m?(()=>{let t=f??!1,d=(0,e7.P)(["watchContractEvent",o,i,s,e.uid,l,p,t]);return observe(d,{onLogs:u,onError:c},c=>{let u,d;let f=!1,m=poll(async()=>{if(!f){try{d=await getAction_getAction(e,createContractEventFilter,"createContractEventFilter")({abi:n,address:o,args:i,eventName:l,strict:t})}catch{}f=!0;return}try{let p;if(d)p=await getAction_getAction(e,getFilterChanges,"getFilterChanges")({filter:d});else{let s=await getAction_getAction(e,getBlockNumber,"getBlockNumber")({});p=u&&u!==s?await getAction_getAction(e,getContractEvents,"getContractEvents")({abi:n,address:o,args:i,eventName:l,fromBlock:u+1n,toBlock:s,strict:t}):[],u=s}if(0===p.length)return;if(s)c.onLogs(p);else for(let e of p)c.onLogs([e])}catch(e){d&&e instanceof et.yR&&(f=!1),c.onError?.(e)}},{emitOnBegin:!0,interval:p});return async()=>{d&&await getAction_getAction(e,uninstallFilter,"uninstallFilter")({filter:d}),m()}})})():(()=>{let t=(0,e7.P)(["watchContractEvent",o,i,s,e.uid,l,p,f??!1]),d=!0,unsubscribe=()=>d=!1;return observe(t,{onLogs:u,onError:c},t=>((async()=>{try{let s=l?encodeEventTopics({abi:n,eventName:l,args:i}):[],{unsubscribe:c}=await e.transport.subscribe({params:["logs",{address:o,topics:s}],onData(e){if(!d)return;let o=e.result;try{let{eventName:e,args:i}=decodeEventLog({abi:n,data:o.data,topics:o.topics,strict:f}),s=(0,eQ.U)(o,{args:i,eventName:e});t.onLogs([s])}catch(s){let e,n;if(s instanceof J.SM||s instanceof J.Gy){if(f)return;e=s.abiItem.name,n=s.abiItem.inputs?.some(e=>!("name"in e&&e.name))}let i=(0,eQ.U)(o,{args:n?[]:{},eventName:e});t.onLogs([i])}},onError(e){t.onError?.(e)}});unsubscribe=c,d||unsubscribe()}catch(e){c?.(e)}})(),()=>unsubscribe()))})()})(e,t),watchEvent:t=>(function(e,{address:t,args:n,batch:o=!0,event:i,events:s,onError:l,onLogs:c,poll:u,pollingInterval:d=e.pollingInterval,strict:p}){let f,m;let g=void 0!==u?u:"webSocket"!==e.transport.type,b=p??!1;return g?(()=>{let u=(0,e7.P)(["watchEvent",t,n,o,e.uid,i,d]);return observe(u,{onLogs:c,onError:l},l=>{let c,u;let p=!1,f=poll(async()=>{if(!p){try{u=await getAction_getAction(e,createEventFilter,"createEventFilter")({address:t,args:n,event:i,events:s,strict:b})}catch{}p=!0;return}try{let d;if(u)d=await getAction_getAction(e,getFilterChanges,"getFilterChanges")({filter:u});else{let o=await getAction_getAction(e,getBlockNumber,"getBlockNumber")({});d=c&&c!==o?await getAction_getAction(e,getLogs,"getLogs")({address:t,args:n,event:i,events:s,fromBlock:c+1n,toBlock:o}):[],c=o}if(0===d.length)return;if(o)l.onLogs(d);else for(let e of d)l.onLogs([e])}catch(e){u&&e instanceof et.yR&&(p=!1),l.onError?.(e)}},{emitOnBegin:!0,interval:d});return async()=>{u&&await getAction_getAction(e,uninstallFilter,"uninstallFilter")({filter:u}),f()}})})():(f=!0,m=()=>f=!1,(async()=>{try{let o=s??(i?[i]:void 0),u=[];o&&(u=[o.flatMap(e=>encodeEventTopics({abi:[e],eventName:e.name,args:n}))],i&&(u=u[0]));let{unsubscribe:d}=await e.transport.subscribe({params:["logs",{address:t,topics:u}],onData(e){if(!f)return;let t=e.result;try{let{eventName:e,args:n}=decodeEventLog({abi:o??[],data:t.data,topics:t.topics,strict:b}),i=(0,eQ.U)(t,{args:n,eventName:e});c([i])}catch(i){let e,n;if(i instanceof J.SM||i instanceof J.Gy){if(p)return;e=i.abiItem.name,n=i.abiItem.inputs?.some(e=>!("name"in e&&e.name))}let o=(0,eQ.U)(t,{args:n?[]:{},eventName:e});c([o])}},onError(e){l?.(e)}});m=d,f||m()}catch(e){l?.(e)}})(),()=>m())})(e,t),watchPendingTransactions:t=>(function(e,{batch:t=!0,onError:n,onTransactions:o,poll:i,pollingInterval:s=e.pollingInterval}){let l,c;let u=void 0!==i?i:"webSocket"!==e.transport.type;return u?(()=>{let i=(0,e7.P)(["watchPendingTransactions",e.uid,t,s]);return observe(i,{onTransactions:o,onError:n},n=>{let o;let i=poll(async()=>{try{if(!o)try{o=await getAction_getAction(e,createPendingTransactionFilter,"createPendingTransactionFilter")({});return}catch(e){throw i(),e}let s=await getAction_getAction(e,getFilterChanges,"getFilterChanges")({filter:o});if(0===s.length)return;if(t)n.onTransactions(s);else for(let e of s)n.onTransactions([e])}catch(e){n.onError?.(e)}},{emitOnBegin:!0,interval:s});return async()=>{o&&await getAction_getAction(e,uninstallFilter,"uninstallFilter")({filter:o}),i()}})})():(l=!0,c=()=>l=!1,(async()=>{try{let{unsubscribe:t}=await e.transport.subscribe({params:["newPendingTransactions"],onData(e){if(!l)return;let t=e.result;o([t])},onError(e){n?.(e)}});c=t,l||c()}catch(e){n?.(e)}})(),()=>c())})(e,t)}}function getPublicClient(e,t={}){let n=function(e,t={}){let n;try{n=e.getClient(t)}catch{}return n}(e,t);return n?.extend(publicActions)}var e5=n(52798),e4=n(33397);function useAccountEffect_useAccountEffect(e={}){let{onConnect:t,onDisconnect:n}=e,o=(0,z.Z)(e);(0,D.useEffect)(()=>(0,e4.u)(o,{onChange(e,o){if(("reconnecting"===o.status||"connecting"===o.status&&void 0===o.address)&&"connected"===e.status){let{address:n,addresses:i,chain:s,chainId:l,connector:c}=e,u="reconnecting"===o.status||void 0===o.status;t?.({address:n,addresses:i,chain:s,chainId:l,connector:c,isReconnected:u})}else"connected"===o.status&&"disconnected"===e.status&&n?.()}}),[o,t,n])}var e9=n(98029);async function disconnect(e,t={}){let n;if(t.connector)n=t.connector;else{let{connections:t,current:o}=e.state,i=t.get(o);n=i?.connector}let o=e.state.connections;n&&(await n.disconnect(),n.emitter.off("change",e._internal.events.change),n.emitter.off("disconnect",e._internal.events.disconnect),n.emitter.on("connect",e._internal.events.connect),o.delete(n.uid)),e.setState(e=>{if(0===o.size)return{...e,connections:new Map,current:void 0,status:"disconnected"};let t=o.values().next().value;return{...e,connections:new Map(o),current:t.connector.uid}});{let t=e.state.current;if(!t)return;let n=e.state.connections.get(t)?.connector;if(!n)return;await e.storage?.setItem("recentConnectorId",n.id)}}var te=n(74751);let tt=[];function getConnections(e){let t=[...e.state.connections.values()];return"reconnecting"===e.state.status||(0,te.v)(tt,t)?tt:(tt=t,t)}function useDisconnect(e={}){let{mutation:t}=e,n=(0,z.Z)(e),{mutate:o,mutateAsync:i,...s}=(0,e9.D)({...t,mutationFn:e=>disconnect(n,e),mutationKey:["disconnect"]});return{...s,connectors:(function(e={}){let t=(0,z.Z)(e);return(0,D.useSyncExternalStore)(e=>(function(e,t){let{onChange:n}=t;return e.subscribe(()=>getConnections(e),n,{equalityFn:te.v})})(t,{onChange:e}),()=>getConnections(t),()=>getConnections(t))})({config:n}).map(e=>e.connector),disconnect:o,disconnectAsync:i}}var tr=n(73935),tn=n(70655),ta="right-scroll-bar-position",to="width-before-scroll-bar";function assignRef(e,t){return"function"==typeof e?e(t):e&&(e.current=t),e}var ti="undefined"!=typeof window?D.useLayoutEffect:D.useEffect,ts=new WeakMap,tl=(void 0===x&&(x={}),(void 0===A&&(A=function(e){return e}),k=[],B=!1,S={read:function(){if(B)throw Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return k.length?k[k.length-1]:null},useMedium:function(e){var t=A(e,B);return k.push(t),function(){k=k.filter(function(e){return e!==t})}},assignSyncMedium:function(e){for(B=!0;k.length;){var t=k;k=[],t.forEach(e)}k={push:function(t){return e(t)},filter:function(){return k}}},assignMedium:function(e){B=!0;var t=[];if(k.length){var n=k;k=[],n.forEach(e),t=k}var executeQueue=function(){var n=t;t=[],n.forEach(e)},cycle=function(){return Promise.resolve().then(executeQueue)};cycle(),k={push:function(e){t.push(e),cycle()},filter:function(e){return t=t.filter(e),k}}}}).options=(0,tn.__assign)({async:!0,ssr:!1},x),S),nothing=function(){},tc=D.forwardRef(function(e,t){var n,o,i,s,l=D.useRef(null),c=D.useState({onScrollCapture:nothing,onWheelCapture:nothing,onTouchMoveCapture:nothing}),u=c[0],d=c[1],p=e.forwardProps,f=e.children,m=e.className,g=e.removeScrollBar,b=e.enabled,y=e.shards,v=e.sideCar,w=e.noIsolation,C=e.inert,E=e.allowPinchZoom,x=e.as,A=void 0===x?"div":x,k=e.gapMode,B=(0,tn.__rest)(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noIsolation","inert","allowPinchZoom","as","gapMode"]),S=(n=[l,t],o=function(e){return n.forEach(function(t){return assignRef(t,e)})},(i=(0,D.useState)(function(){return{value:null,callback:o,facade:{get current(){return i.value},set current(value){var e=i.value;e!==value&&(i.value=value,i.callback(value,e))}}}})[0]).callback=o,s=i.facade,ti(function(){var e=ts.get(s);if(e){var t=new Set(e),o=new Set(n),i=s.current;t.forEach(function(e){o.has(e)||assignRef(e,null)}),o.forEach(function(e){t.has(e)||assignRef(e,i)})}ts.set(s,n)},[n]),s),I=(0,tn.__assign)((0,tn.__assign)({},B),u);return D.createElement(D.Fragment,null,b&&D.createElement(v,{sideCar:tl,removeScrollBar:g,shards:y,noIsolation:w,inert:C,setCallbacks:d,allowPinchZoom:!!E,lockRef:l,gapMode:k}),p?D.cloneElement(D.Children.only(f),(0,tn.__assign)((0,tn.__assign)({},I),{ref:S})):D.createElement(A,(0,tn.__assign)({},I,{className:m,ref:S}),f))});tc.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1},tc.classNames={fullWidth:to,zeroRight:ta};var SideCar=function(e){var t=e.sideCar,n=(0,tn.__rest)(e,["sideCar"]);if(!t)throw Error("Sidecar: please provide `sideCar` property to import the right car");var o=t.read();if(!o)throw Error("Sidecar medium not found");return D.createElement(o,(0,tn.__assign)({},n))};SideCar.isSideCarExport=!0;var stylesheetSingleton=function(){var e=0,t=null;return{add:function(o){if(0==e&&(t=function(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=I||n.nc;return t&&e.setAttribute("nonce",t),e}())){var i,s;(i=t).styleSheet?i.styleSheet.cssText=o:i.appendChild(document.createTextNode(o)),s=t,(document.head||document.getElementsByTagName("head")[0]).appendChild(s)}e++},remove:function(){--e||!t||(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},styleHookSingleton=function(){var e=stylesheetSingleton();return function(t,n){D.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&n])}},styleSingleton=function(){var e=styleHookSingleton();return function(t){return e(t.styles,t.dynamic),null}},tu={left:0,top:0,right:0,gap:0},parse=function(e){return parseInt(e||"",10)||0},getOffset=function(e){var t=window.getComputedStyle(document.body),n=t["padding"===e?"paddingLeft":"marginLeft"],o=t["padding"===e?"paddingTop":"marginTop"],i=t["padding"===e?"paddingRight":"marginRight"];return[parse(n),parse(o),parse(i)]},getGapWidth=function(e){if(void 0===e&&(e="margin"),"undefined"==typeof window)return tu;var t=getOffset(e),n=document.documentElement.clientWidth,o=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,o-n+t[2]-t[0])}},td=styleSingleton(),tp="data-scroll-locked",getStyles=function(e,t,n,o){var i=e.left,s=e.top,l=e.right,c=e.gap;return void 0===n&&(n="margin"),"\n .".concat("with-scroll-bars-hidden"," {\n overflow: hidden ").concat(o,";\n padding-right: ").concat(c,"px ").concat(o,";\n }\n body[").concat(tp,"] {\n overflow: hidden ").concat(o,";\n overscroll-behavior: contain;\n ").concat([t&&"position: relative ".concat(o,";"),"margin"===n&&"\n padding-left: ".concat(i,"px;\n padding-top: ").concat(s,"px;\n padding-right: ").concat(l,"px;\n margin-left:0;\n margin-top:0;\n margin-right: ").concat(c,"px ").concat(o,";\n "),"padding"===n&&"padding-right: ".concat(c,"px ").concat(o,";")].filter(Boolean).join(""),"\n }\n \n .").concat(ta," {\n right: ").concat(c,"px ").concat(o,";\n }\n \n .").concat(to," {\n margin-right: ").concat(c,"px ").concat(o,";\n }\n \n .").concat(ta," .").concat(ta," {\n right: 0 ").concat(o,";\n }\n \n .").concat(to," .").concat(to," {\n margin-right: 0 ").concat(o,";\n }\n \n body[").concat(tp,"] {\n ").concat("--removed-body-scroll-bar-size",": ").concat(c,"px;\n }\n")},getCurrentUseCounter=function(){var e=parseInt(document.body.getAttribute(tp)||"0",10);return isFinite(e)?e:0},useLockAttribute=function(){D.useEffect(function(){return document.body.setAttribute(tp,(getCurrentUseCounter()+1).toString()),function(){var e=getCurrentUseCounter()-1;e<=0?document.body.removeAttribute(tp):document.body.setAttribute(tp,e.toString())}},[])},RemoveScrollBar=function(e){var t=e.noRelative,n=e.noImportant,o=e.gapMode,i=void 0===o?"margin":o;useLockAttribute();var s=D.useMemo(function(){return getGapWidth(i)},[i]);return D.createElement(td,{styles:getStyles(s,!t,i,n?"":"!important")})},th=!1;if("undefined"!=typeof window)try{var tf=Object.defineProperty({},"passive",{get:function(){return th=!0,!0}});window.addEventListener("test",tf,tf),window.removeEventListener("test",tf,tf)}catch(e){th=!1}var tm=!!th&&{passive:!1},elementCanBeScrolled=function(e,t){var n=window.getComputedStyle(e);return"hidden"!==n[t]&&!(n.overflowY===n.overflowX&&"TEXTAREA"!==e.tagName&&"visible"===n[t])},locationCouldBeScrolled=function(e,t){var n=t.ownerDocument,o=t;do{if("undefined"!=typeof ShadowRoot&&o instanceof ShadowRoot&&(o=o.host),elementCouldBeScrolled(e,o)){var i=getScrollVariables(e,o);if(i[1]>i[2])return!0}o=o.parentNode}while(o&&o!==n.body);return!1},elementCouldBeScrolled=function(e,t){return"v"===e?elementCanBeScrolled(t,"overflowY"):elementCanBeScrolled(t,"overflowX")},getScrollVariables=function(e,t){return"v"===e?[t.scrollTop,t.scrollHeight,t.clientHeight]:[t.scrollLeft,t.scrollWidth,t.clientWidth]},handleScroll=function(e,t,n,o,i){var s,l=(s=window.getComputedStyle(t).direction,"h"===e&&"rtl"===s?-1:1),c=l*o,u=n.target,d=t.contains(u),p=!1,f=c>0,m=0,g=0;do{var b=getScrollVariables(e,u),y=b[0],v=b[1]-b[2]-l*y;(y||v)&&elementCouldBeScrolled(e,u)&&(m+=v,g+=y),u=u instanceof ShadowRoot?u.host:u.parentNode}while(!d&&u!==document.body||d&&(t.contains(u)||t===u));return f&&(i&&1>Math.abs(m)||!i&&c>m)?p=!0:!f&&(i&&1>Math.abs(g)||!i&&-c>g)&&(p=!0),p},getTouchXY=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},getDeltaXY=function(e){return[e.deltaX,e.deltaY]},extractRef=function(e){return e&&"current"in e?e.current:e},tg=0,tb=[],ty=(tl.useMedium(function(e){var t=D.useRef([]),n=D.useRef([0,0]),o=D.useRef(),i=D.useState(tg++)[0],s=D.useState(styleSingleton)[0],l=D.useRef(e);D.useEffect(function(){l.current=e},[e]),D.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(i));var t=(0,tn.__spreadArray)([e.lockRef.current],(e.shards||[]).map(extractRef),!0).filter(Boolean);return t.forEach(function(e){return e.classList.add("allow-interactivity-".concat(i))}),function(){document.body.classList.remove("block-interactivity-".concat(i)),t.forEach(function(e){return e.classList.remove("allow-interactivity-".concat(i))})}}},[e.inert,e.lockRef.current,e.shards]);var c=D.useCallback(function(e,t){if("touches"in e&&2===e.touches.length)return!l.current.allowPinchZoom;var i,s=getTouchXY(e),c=n.current,u="deltaX"in e?e.deltaX:c[0]-s[0],d="deltaY"in e?e.deltaY:c[1]-s[1],p=e.target,f=Math.abs(u)>Math.abs(d)?"h":"v";if("touches"in e&&"h"===f&&"range"===p.type)return!1;var m=locationCouldBeScrolled(f,p);if(!m)return!0;if(m?i=f:(i="v"===f?"h":"v",m=locationCouldBeScrolled(f,p)),!m)return!1;if(!o.current&&"changedTouches"in e&&(u||d)&&(o.current=i),!i)return!0;var g=o.current||i;return handleScroll(g,t,e,"h"===g?u:d,!0)},[]),u=D.useCallback(function(e){if(tb.length&&tb[tb.length-1]===s){var n="deltaY"in e?getDeltaXY(e):getTouchXY(e),o=t.current.filter(function(t){var o;return t.name===e.type&&(t.target===e.target||e.target===t.shadowParent)&&(o=t.delta)[0]===n[0]&&o[1]===n[1]})[0];if(o&&o.should){e.cancelable&&e.preventDefault();return}if(!o){var i=(l.current.shards||[]).map(extractRef).filter(Boolean).filter(function(t){return t.contains(e.target)});(i.length>0?c(e,i[0]):!l.current.noIsolation)&&e.cancelable&&e.preventDefault()}}},[]),d=D.useCallback(function(e,n,o,i){var s={name:e,delta:n,target:o,should:i,shadowParent:function(e){for(var t=null;null!==e;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}(o)};t.current.push(s),setTimeout(function(){t.current=t.current.filter(function(e){return e!==s})},1)},[]),p=D.useCallback(function(e){n.current=getTouchXY(e),o.current=void 0},[]),f=D.useCallback(function(t){d(t.type,getDeltaXY(t),t.target,c(t,e.lockRef.current))},[]),m=D.useCallback(function(t){d(t.type,getTouchXY(t),t.target,c(t,e.lockRef.current))},[]);D.useEffect(function(){return tb.push(s),e.setCallbacks({onScrollCapture:f,onWheelCapture:f,onTouchMoveCapture:m}),document.addEventListener("wheel",u,tm),document.addEventListener("touchmove",u,tm),document.addEventListener("touchstart",p,tm),function(){tb=tb.filter(function(e){return e!==s}),document.removeEventListener("wheel",u,tm),document.removeEventListener("touchmove",u,tm),document.removeEventListener("touchstart",p,tm)}},[]);var g=e.removeScrollBar,b=e.inert;return D.createElement(D.Fragment,null,b?D.createElement(s,{styles:"\n .block-interactivity-".concat(i," {pointer-events: none;}\n .allow-interactivity-").concat(i," {pointer-events: all;}\n")}):null,g?D.createElement(RemoveScrollBar,{gapMode:e.gapMode}):null)}),SideCar),tv=D.forwardRef(function(e,t){return D.createElement(tc,(0,tn.__assign)({},e,{ref:t,sideCar:ty}))});function vanilla_extract_private_esm_getVarName(e){var t=e.match(/^var\((.*)\)$/);return t?t[1]:e}function assignInlineVars(e,t){var n={};if("object"==typeof t)!function vanilla_extract_private_esm_walkObject(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=e.constructor();for(var i in e){var s=e[i],l=[...n,i];"string"==typeof s||"number"==typeof s||null==s?o[i]=t(s,l):"object"!=typeof s||Array.isArray(s)?console.warn('Skipping invalid key "'.concat(l.join("."),'". Should be a string, number, null or object. Received: "').concat(Array.isArray(s)?"Array":typeof s,'"')):o[i]=vanilla_extract_private_esm_walkObject(s,t,l)}return o}(t,(t,o)=>{null!=t&&(n[vanilla_extract_private_esm_getVarName(function(e,t){var n=e;for(var o of t){if(!(o in n))throw Error("Path ".concat(t.join(" -> ")," does not exist in object"));n=n[o]}return n}(e,o))]=String(t))});else for(var o in e){var i=e[o];null!=i&&(n[vanilla_extract_private_esm_getVarName(o)]=i)}return Object.defineProperty(n,"toString",{value:function(){return Object.keys(this).map(e=>"".concat(e,":").concat(this[e])).join(";")},writable:!1}),n}tv.classNames=tc.classNames;var tw=n(87675);async function connect(e,t){let n;if((n="function"==typeof t.connector?e._internal.connectors.setup(t.connector):t.connector).uid===e.state.current)throw new tw.wi;try{e.setState(e=>({...e,status:"connecting"})),n.emitter.emit("message",{type:"connecting"});let o=await n.connect({chainId:t.chainId}),i=o.accounts;return n.emitter.off("connect",e._internal.events.connect),n.emitter.on("change",e._internal.events.change),n.emitter.on("disconnect",e._internal.events.disconnect),await e.storage?.setItem("recentConnectorId",n.id),e.setState(e=>({...e,connections:new Map(e.connections).set(n.uid,{accounts:i,chainId:o.chainId,connector:n}),current:n.uid,status:"connected"})),{accounts:i,chainId:o.chainId}}catch(t){throw e.setState(e=>({...e,status:e.current?"connected":"disconnected"})),t}}let tC=[];function getConnectors(e){let t=e.connectors;return(0,te.v)(tC,t)?tC:(tC=t,t)}var tE=n(42238),tx=n(55585),tA=n(7066);let ProviderNotFoundError=class ProviderNotFoundError extends tA.G{constructor(){super("Provider not found."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ProviderNotFoundError"})}};let SwitchChainNotSupportedError=class SwitchChainNotSupportedError extends tA.G{constructor({connector:e}){super(`"${e.name}" does not support programmatic chain switching.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"SwitchChainNotSupportedError"})}};async function switchChain(e,t){let{chainId:n}=t,o=e.state.connections.get(t.connector?.uid??e.state.current);if(o){let e=o.connector;if(!e.switchChain)throw new SwitchChainNotSupportedError({connector:e});let t=await e.switchChain({chainId:n});return t}let i=e.chains.find(e=>e.id===n);if(!i)throw new tw.X4;return e.setState(e=>({...e,chainId:n})),i}let tk=[];function getChains(e){let t=e.chains;return(0,te.v)(tk,t)?tk:(tk=t,t)}var tB=n(92592),tS=n(78863);let UrlRequiredError=class UrlRequiredError extends X.G{constructor(){super("No URL was provided to the Transport. Please provide a valid RPC URL to the Transport.",{docsPath:"/docs/clients/intro"})}};var tI=n(32357);function withTimeout(e,{errorInstance:t=Error("timed out"),timeout:n,signal:o}){return new Promise((i,s)=>{(async()=>{let l;try{let c=new AbortController;n>0&&(l=setTimeout(()=>{o?c.abort():s(t)},n)),i(await e({signal:c?.signal||null}))}catch(e){"AbortError"===e.name&&s(t),s(e)}finally{clearTimeout(l)}})()})}let tj={current:0,take(){return this.current++},reset(){this.current=0}};var tT=n(91628),tP=n(16189);let subscribeWithSelector=e=>(t,n,o)=>{let i=o.subscribe;o.subscribe=(e,t,n)=>{let s=e;if(t){let i=(null==n?void 0:n.equalityFn)||Object.is,l=e(o.getState());s=n=>{let o=e(n);if(!i(l,o)){let e=l;t(l=o,e)}},(null==n?void 0:n.fireImmediately)&&t(l,l)}return i(s)};let s=e(t,n,o);return s},toThenable=e=>t=>{try{let n=e(t);if(n instanceof Promise)return n;return{then:e=>toThenable(e)(n),catch(e){return this}}}catch(e){return{then(e){return this},catch:t=>toThenable(t)(e)}}},oldImpl=(e,t)=>(n,o,i)=>{let s,l,c={getStorage:()=>localStorage,serialize:JSON.stringify,deserialize:JSON.parse,partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},u=!1,d=new Set,p=new Set;try{s=c.getStorage()}catch(e){}if(!s)return e((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${c.name}', the given storage is currently unavailable.`),n(...e)},o,i);let f=toThenable(c.serialize),setItem=()=>{let e;let t=c.partialize({...o()}),n=f({state:t,version:c.version}).then(e=>s.setItem(c.name,e)).catch(t=>{e=t});if(e)throw e;return n},m=i.setState;i.setState=(e,t)=>{m(e,t),setItem()};let g=e((...e)=>{n(...e),setItem()},o,i),hydrate=()=>{var e;if(!s)return;u=!1,d.forEach(e=>e(o()));let t=(null==(e=c.onRehydrateStorage)?void 0:e.call(c,o()))||void 0;return toThenable(s.getItem.bind(s))(c.name).then(e=>{if(e)return c.deserialize(e)}).then(e=>{if(e){if("number"!=typeof e.version||e.version===c.version)return e.state;if(c.migrate)return c.migrate(e.state,e.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}}).then(e=>{var t;return n(l=c.merge(e,null!=(t=o())?t:g),!0),setItem()}).then(()=>{null==t||t(l,void 0),u=!0,p.forEach(e=>e(l))}).catch(e=>{null==t||t(void 0,e)})};return i.persist={setOptions:e=>{c={...c,...e},e.getStorage&&(s=e.getStorage())},clearStorage:()=>{null==s||s.removeItem(c.name)},getOptions:()=>c,rehydrate:()=>hydrate(),hasHydrated:()=>u,onHydrate:e=>(d.add(e),()=>{d.delete(e)}),onFinishHydration:e=>(p.add(e),()=>{p.delete(e)})},hydrate(),l||g},newImpl=(e,t)=>(n,o,i)=>{let s,l={storage:function(e,t){let n;try{n=e()}catch(e){return}return{getItem:e=>{var o;let parse=e=>null===e?null:JSON.parse(e,null==t?void 0:t.reviver),i=null!=(o=n.getItem(e))?o:null;return i instanceof Promise?i.then(parse):parse(i)},setItem:(e,o)=>n.setItem(e,JSON.stringify(o,null==t?void 0:t.replacer)),removeItem:e=>n.removeItem(e)}}(()=>localStorage),partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},c=!1,u=new Set,d=new Set,p=l.storage;if(!p)return e((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${l.name}', the given storage is currently unavailable.`),n(...e)},o,i);let setItem=()=>{let e=l.partialize({...o()});return p.setItem(l.name,{state:e,version:l.version})},f=i.setState;i.setState=(e,t)=>{f(e,t),setItem()};let m=e((...e)=>{n(...e),setItem()},o,i),hydrate=()=>{var e,t;if(!p)return;c=!1,u.forEach(e=>{var t;return e(null!=(t=o())?t:m)});let i=(null==(t=l.onRehydrateStorage)?void 0:t.call(l,null!=(e=o())?e:m))||void 0;return toThenable(p.getItem.bind(p))(l.name).then(e=>{if(e){if("number"!=typeof e.version||e.version===l.version)return e.state;if(l.migrate)return l.migrate(e.state,e.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}}).then(e=>{var t;return n(s=l.merge(e,null!=(t=o())?t:m),!0),setItem()}).then(()=>{null==i||i(s,void 0),s=o(),c=!0,d.forEach(e=>e(s))}).catch(e=>{null==i||i(void 0,e)})};return i.persist={setOptions:e=>{l={...l,...e},e.storage&&(p=e.storage)},clearStorage:()=>{null==p||p.removeItem(l.name)},getOptions:()=>l,rehydrate:()=>hydrate(),hasHydrated:()=>c,onHydrate:e=>(u.add(e),()=>{u.delete(e)}),onFinishHydration:e=>(d.add(e),()=>{d.delete(e)})},l.skipHydration||hydrate(),s||m},persist=(e,t)=>"getStorage"in t||"serialize"in t||"deserialize"in t?(console.warn("[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead."),oldImpl(e,t)):newImpl(e,t),createStoreImpl=e=>{let t;let n=new Set,setState=(e,o)=>{let i="function"==typeof e?e(t):e;if(!Object.is(i,t)){let e=t;t=(null!=o?o:"object"!=typeof i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},getState=()=>t,o={setState,getState,subscribe:e=>(n.add(e),()=>n.delete(e)),destroy:()=>{console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),n.clear()}};return t=e(setState,getState,o),o},vanilla_createStore=e=>e?createStoreImpl(e):createStoreImpl;var tM=n(45775);function normalizeChainId(e){if("string"==typeof e)return Number.parseInt(e,"0x"===e.trim().substring(0,2)?16:10);if("bigint"==typeof e)return Number(e);if("number"==typeof e)return e;throw Error(`Cannot normalize chainId "${e}" of type "${typeof e}"`)}let tO={coinbaseWallet:{id:"coinbaseWallet",name:"Coinbase Wallet",provider:e=>e?.coinbaseWalletExtension?e.coinbaseWalletExtension:findProvider(e,"isCoinbaseWallet")},metaMask:{id:"metaMask",name:"MetaMask",provider:e=>findProvider(e,e=>{if(!e.isMetaMask||e.isBraveWallet&&!e._events&&!e._state)return!1;for(let t of["isApexWallet","isAvalanche","isBitKeep","isBlockWallet","isKuCoinWallet","isMathWallet","isOkxWallet","isOKExWallet","isOneInchIOSWallet","isOneInchAndroidWallet","isOpera","isPortal","isRabby","isTokenPocket","isTokenary","isZerion"])if(e[t])return!1;return!0})},phantom:{id:"phantom",name:"Phantom",provider:e=>e?.phantom?.ethereum?e.phantom?.ethereum:findProvider(e,"isPhantom")}};function injected(e={}){let{shimDisconnect:t=!0,unstable_shimAsyncInject:n}=e;function getTarget(){let t=e.target;if("function"==typeof t){let e=t();if(e)return e}return"object"==typeof t?t:"string"==typeof t?{...tO[t]??{id:t,name:`${t[0].toUpperCase()}${t.slice(1)}`,provider:`is${t[0].toUpperCase()}${t.slice(1)}`}}:{id:"injected",name:"Injected",provider:e=>e?.ethereum}}return o=>({get icon(){return getTarget().icon},get id(){return getTarget().id},get name(){return getTarget().name},type:injected.type,async setup(){let t=await this.getProvider();t&&e.target&&t.on("connect",this.onConnect.bind(this))},async connect({chainId:n,isReconnecting:i}={}){let s=await this.getProvider();if(!s)throw new ProviderNotFoundError;let l=null;if(!i){l=await this.getAccounts().catch(()=>null);let e=!!l?.length;if(e)try{let e=await s.request({method:"wallet_requestPermissions",params:[{eth_accounts:{}}]});l=e[0]?.caveats?.[0]?.value?.map(e=>tM.K(e))}catch(e){if(e.code===et.ab.code)throw new et.ab(e);if(e.code===et.pT.code)throw e}}try{if(!l?.length){let e=await s.request({method:"eth_requestAccounts"});l=e.map(e=>(0,tM.K)(e))}s.removeListener("connect",this.onConnect.bind(this)),s.on("accountsChanged",this.onAccountsChanged.bind(this)),s.on("chainChanged",this.onChainChanged),s.on("disconnect",this.onDisconnect.bind(this));let i=await this.getChainId();if(n&&i!==n){let e=await this.switchChain({chainId:n}).catch(e=>{if(e.code===et.ab.code)throw e;return{id:i}});i=e?.id??i}return t&&(await o.storage?.removeItem(`${this.id}.disconnected`),e.target||await o.storage?.setItem("injected.connected",!0)),{accounts:l,chainId:i}}catch(e){if(e.code===et.ab.code)throw new et.ab(e);if(e.code===et.pT.code)throw new et.pT(e);throw e}},async disconnect(){let n=await this.getProvider();if(!n)throw new ProviderNotFoundError;n.removeListener("accountsChanged",this.onAccountsChanged.bind(this)),n.removeListener("chainChanged",this.onChainChanged),n.removeListener("disconnect",this.onDisconnect.bind(this)),n.on("connect",this.onConnect.bind(this)),t&&(await o.storage?.setItem(`${this.id}.disconnected`,!0),e.target||await o.storage?.removeItem("injected.connected"))},async getAccounts(){let e=await this.getProvider();if(!e)throw new ProviderNotFoundError;let t=await e.request({method:"eth_accounts"});return t.map(e=>(0,tM.K)(e))},async getChainId(){let e=await this.getProvider();if(!e)throw new ProviderNotFoundError;let t=await e.request({method:"eth_chainId"});return normalizeChainId(t)},async getProvider(){let e;if("undefined"==typeof window)return;let t=getTarget();return(e="function"==typeof t.provider?t.provider(window):"string"==typeof t.provider?findProvider(window,t.provider):t.provider)&&!e.removeListener&&("off"in e&&"function"==typeof e.off?e.removeListener=e.off:e.removeListener=()=>{}),e},async isAuthorized(){try{let i=t&&await o.storage?.getItem(`${this.id}.disconnected`);if(i)return!1;if(!e.target){let e=await o.storage?.getItem("injected.connected");if(!e)return!1}let s=await this.getProvider();if(!s){if(void 0!==n&&!1!==n){let handleEthereum=async()=>{"undefined"!=typeof window&&window.removeEventListener("ethereum#initialized",handleEthereum);let e=await this.getProvider();return!!e},e="number"==typeof n?n:1e3,t=await Promise.race([..."undefined"!=typeof window?[new Promise(e=>window.addEventListener("ethereum#initialized",()=>e(handleEthereum()),{once:!0}))]:[],new Promise(t=>setTimeout(()=>t(handleEthereum()),e))]);if(t)return!0}throw new ProviderNotFoundError}let l=await (0,e2.J)(()=>withTimeout(()=>this.getAccounts(),{timeout:100}));return!!l.length}catch{return!1}},async switchChain({chainId:e}){let t=await this.getProvider();if(!t)throw new ProviderNotFoundError;let n=o.chains.find(t=>t.id===e);if(!n)throw new et.x3(new tw.X4);try{return await Promise.all([t.request({method:"wallet_switchEthereumChain",params:[{chainId:(0,Q.eC)(e)}]}),new Promise(t=>o.emitter.once("change",({chainId:n})=>{n===e&&t()}))]),n}catch(o){if(4902===o.code||o?.data?.originalError?.code===4902)try{let o;let{default:i,...s}=n.blockExplorers??{};i&&(o=[i.url,...Object.values(s).map(e=>e.url)]),await t.request({method:"wallet_addEthereumChain",params:[{chainId:(0,Q.eC)(e),chainName:n.name,nativeCurrency:n.nativeCurrency,rpcUrls:[n.rpcUrls.default?.http[0]??""],blockExplorerUrls:o}]});let l=await this.getChainId();if(l!==e)throw new et.ab(Error("User rejected switch after adding network."));return n}catch(e){throw new et.ab(e)}if(o.code===et.ab.code)throw new et.ab(o);throw new et.x3(o)}},async onAccountsChanged(e){if(0===e.length)this.onDisconnect();else if(o.emitter.listenerCount("connect")){let e=(await this.getChainId()).toString();this.onConnect({chainId:e}),t&&await o.storage?.removeItem(`${this.id}.disconnected`)}else o.emitter.emit("change",{accounts:e.map(e=>(0,tM.K)(e))})},onChainChanged(e){let t=normalizeChainId(e);o.emitter.emit("change",{chainId:t})},async onConnect(e){let t=await this.getAccounts();if(0===t.length)return;let n=normalizeChainId(e.chainId);o.emitter.emit("connect",{accounts:t,chainId:n});let i=await this.getProvider();i&&(i.removeListener("connect",this.onConnect.bind(this)),i.on("accountsChanged",this.onAccountsChanged.bind(this)),i.on("chainChanged",this.onChainChanged),i.on("disconnect",this.onDisconnect.bind(this)))},async onDisconnect(e){let t=await this.getProvider();e&&1013===e.code&&t&&(await this.getAccounts()).length||(o.emitter.emit("disconnect"),t&&(t.removeListener("accountsChanged",this.onAccountsChanged.bind(this)),t.removeListener("chainChanged",this.onChainChanged),t.removeListener("disconnect",this.onDisconnect.bind(this)),t.on("connect",this.onConnect.bind(this))))}})}function findProvider(e,t){function isProvider(e){return"function"==typeof t?t(e):"string"!=typeof t||e[t]}let n=e.ethereum;return n?.providers?n.providers.find(e=>isProvider(e)):n&&isProvider(n)?n:void 0}injected.type="injected";var tR=n(26729),__classPrivateFieldGet=function(e,t,n,o){if("a"===n&&!o)throw TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!o:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?o:"a"===n?o.call(e):o?o.value:t.get(e)};let Emitter=class Emitter{constructor(e){Object.defineProperty(this,"uid",{enumerable:!0,configurable:!0,writable:!0,value:e}),j.set(this,new tR)}on(e,t){__classPrivateFieldGet(this,j,"f").on(e,t)}once(e,t){__classPrivateFieldGet(this,j,"f").once(e,t)}off(e,t){__classPrivateFieldGet(this,j,"f").off(e,t)}emit(e,...t){let n=t[0];__classPrivateFieldGet(this,j,"f").emit(e,{uid:this.uid,...n})}listenerCount(e){return __classPrivateFieldGet(this,j,"f").listenerCount(e)}};function deserialize_deserialize(e,t){return JSON.parse(e,(e,n)=>{let o=n;return o?.__type==="bigint"&&(o=BigInt(o.value)),o?.__type==="Map"&&(o=new Map(o.value)),t?.(e,o)??o})}function getReferenceKey(e,t){return e.slice(0,t).join(".")||"."}function getCutoff(e,t){let{length:n}=e;for(let o=0;o{let o=n;return"bigint"==typeof o&&(o={__type:"bigint",value:n.toString()}),o instanceof Map&&(o={__type:"Map",value:Array.from(n.entries())}),t?.(e,o)??o},o),n??void 0)}j=new WeakMap;let tU={getItem:()=>null,setItem:()=>{},removeItem:()=>{}},tF=256;var tN=n(79983);function walletConnect(e){let t,o;let i=e.isNewChainsStale??!0,s="eip155";return l=>({id:"walletConnect",name:"WalletConnect",type:walletConnect.type,async setup(){let e=await this.getProvider().catch(()=>null);e&&(e.on("connect",this.onConnect.bind(this)),e.on("session_delete",this.onSessionDelete.bind(this)))},async connect({chainId:e,...t}={}){try{let n=await this.getProvider();if(!n)throw new ProviderNotFoundError;n.on("display_uri",this.onDisplayUri);let o=e;if(!o){let e=await l.storage?.getItem("state")??{},t=l.chains.some(t=>t.id===e.chainId);o=t?e.chainId:l.chains[0]?.id}if(!o)throw Error("No chains found on connector.");let i=await this.isChainsStale();if(n.session&&i&&await n.disconnect(),!n.session||i){let e=l.chains.filter(e=>e.id!==o).map(e=>e.id);await n.connect({optionalChains:[o,...e],..."pairingTopic"in t?{pairingTopic:t.pairingTopic}:{}}),this.setRequestedChainsIds(l.chains.map(e=>e.id))}let s=(await n.enable()).map(e=>(0,tM.K)(e)),c=await this.getChainId();return n.removeListener("display_uri",this.onDisplayUri),n.removeListener("connect",this.onConnect.bind(this)),n.on("accountsChanged",this.onAccountsChanged.bind(this)),n.on("chainChanged",this.onChainChanged),n.on("disconnect",this.onDisconnect.bind(this)),n.on("session_delete",this.onSessionDelete.bind(this)),{accounts:s,chainId:c}}catch(e){if(/(user rejected|connection request reset)/i.test(e?.message))throw new et.ab(e);throw e}},async disconnect(){let e=await this.getProvider();try{await e?.disconnect()}catch(e){if(!/No matching key/i.test(e.message))throw e}finally{e?.removeListener("accountsChanged",this.onAccountsChanged.bind(this)),e?.removeListener("chainChanged",this.onChainChanged),e?.removeListener("disconnect",this.onDisconnect.bind(this)),e?.removeListener("session_delete",this.onSessionDelete.bind(this)),e?.on("connect",this.onConnect.bind(this)),this.setRequestedChainsIds([])}},async getAccounts(){let e=await this.getProvider();return e.accounts.map(e=>(0,tM.K)(e))},async getProvider({chainId:i}={}){async function initProvider(){let t=l.chains.map(e=>e.id);if(!t.length)return;let{EthereumProvider:o}=await Promise.all([n.e(1194),n.e(3138),n.e(5883)]).then(n.bind(n,33138));return await o.init({...e,disableProviderPing:!0,optionalChains:t,projectId:e.projectId,rpcMap:Object.fromEntries(l.chains.map(e=>[e.id,e.rpcUrls.default.http[0]])),showQrModal:e.showQrModal??!0})}return t||(o||(o=initProvider()),t=await o,t?.events.setMaxListeners(1/0)),i&&await this.switchChain?.({chainId:i}),t},async getChainId(){let e=await this.getProvider();return e.chainId},async isAuthorized(){try{let[e,t]=await Promise.all([this.getAccounts(),this.getProvider()]);if(!e.length)return!1;let n=await this.isChainsStale();if(n&&t.session)return await t.disconnect().catch(()=>{}),!1;return!0}catch{return!1}},async switchChain({chainId:e}){let t=l.chains.find(t=>t.id===e);if(!t)throw new et.x3(new tw.X4);try{let n=await this.getProvider(),o=this.getNamespaceChainsIds(),i=this.getNamespaceMethods(),s=o.includes(e);if(!s&&i.includes("wallet_addEthereumChain")){await n.request({method:"wallet_addEthereumChain",params:[{chainId:(0,Q.eC)(t.id),blockExplorerUrls:[t.blockExplorers?.default.url],chainName:t.name,nativeCurrency:t.nativeCurrency,rpcUrls:[...t.rpcUrls.default.http]}]});let o=await this.getRequestedChainsIds();this.setRequestedChainsIds([...o,e])}return await n.request({method:"wallet_switchEthereumChain",params:[{chainId:(0,Q.eC)(e)}]}),t}catch(t){let e="string"==typeof t?t:t?.message;if(/user rejected request/i.test(e))throw new et.ab(t);throw new et.x3(t)}},onAccountsChanged(e){0===e.length?this.onDisconnect():l.emitter.emit("change",{accounts:e.map(e=>(0,tM.K)(e))})},onChainChanged(e){let t=normalizeChainId(e);l.emitter.emit("change",{chainId:t})},async onConnect(e){let t=normalizeChainId(e.chainId),n=await this.getAccounts();l.emitter.emit("connect",{accounts:n,chainId:t})},async onDisconnect(e){this.setRequestedChainsIds([]),l.emitter.emit("disconnect");let t=await this.getProvider();t.removeListener("accountsChanged",this.onAccountsChanged.bind(this)),t.removeListener("chainChanged",this.onChainChanged),t.removeListener("disconnect",this.onDisconnect.bind(this)),t.removeListener("session_delete",this.onSessionDelete.bind(this)),t.on("connect",this.onConnect.bind(this))},onDisplayUri(e){l.emitter.emit("message",{type:"display_uri",data:e})},onSessionDelete(){this.onDisconnect()},getNamespaceChainsIds(){if(!t)return[];let e=t.session?.namespaces[s]?.chains?.map(e=>parseInt(e.split(":")[1]||""));return e??[]},getNamespaceMethods(){if(!t)return[];let e=t.session?.namespaces[s]?.methods;return e??[]},async getRequestedChainsIds(){return await l.storage?.getItem(this.requestedChainsStorageKey)??[]},async isChainsStale(){let e=this.getNamespaceMethods();if(e.includes("wallet_addEthereumChain")||!i)return!1;let t=l.chains.map(e=>e.id),n=this.getNamespaceChainsIds();if(n.length&&!n.some(e=>t.includes(e)))return!1;let o=await this.getRequestedChainsIds();return!t.every(e=>o.includes(e))},async setRequestedChainsIds(e){await l.storage?.setItem(this.requestedChainsStorageKey,e)},get requestedChainsStorageKey(){return`${this.id}.requestedChains`}})}function coinbaseWallet(e){let t,o;return i=>({id:"coinbaseWalletSDK",name:"Coinbase Wallet",type:coinbaseWallet.type,async connect({chainId:e}={}){try{let t=await this.getProvider(),n=(await t.request({method:"eth_requestAccounts"})).map(e=>(0,tM.K)(e));t.on("accountsChanged",this.onAccountsChanged),t.on("chainChanged",this.onChainChanged),t.on("disconnect",this.onDisconnect.bind(this));let o=await this.getChainId();if(e&&o!==e){let t=await this.switchChain({chainId:e}).catch(e=>{if(e.code===et.ab.code)throw e;return{id:o}});o=t?.id??o}return{accounts:n,chainId:o}}catch(e){if(/(user closed modal|accounts received is empty|user denied account)/i.test(e.message))throw new et.ab(e);throw e}},async disconnect(){let e=await this.getProvider();e.removeListener("accountsChanged",this.onAccountsChanged),e.removeListener("chainChanged",this.onChainChanged),e.removeListener("disconnect",this.onDisconnect.bind(this)),e.disconnect(),e.close()},async getAccounts(){let e=await this.getProvider();return(await e.request({method:"eth_accounts"})).map(e=>(0,tM.K)(e))},async getChainId(){let e=await this.getProvider(),t=await e.request({method:"eth_chainId"});return normalizeChainId(t)},async getProvider(){if(!o){let{default:s}=await Promise.all([n.e(1194),n.e(5811),n.e(6878)]).then(n.t.bind(n,45811,19));t=new("function"!=typeof s&&"function"==typeof s.default?s.default:s)({reloadOnDisconnect:!1,...e});let l=t.walletExtension?.getChainId(),c=i.chains.find(t=>e.chainId?t.id===e.chainId:t.id===l)||i.chains[0],u=e.chainId||c?.id,d=e.jsonRpcUrl||c?.rpcUrls.default.http[0];o=t.makeWeb3Provider(d,u)}return o},async isAuthorized(){try{let e=await this.getAccounts();return!!e.length}catch{return!1}},async switchChain({chainId:e}){let t=i.chains.find(t=>t.id===e);if(!t)throw new et.x3(new tw.X4);let n=await this.getProvider(),o=(0,Q.eC)(t.id);try{return await n.request({method:"wallet_switchEthereumChain",params:[{chainId:o}]}),t}catch(e){if(4902===e.code)try{return await n.request({method:"wallet_addEthereumChain",params:[{chainId:o,chainName:t.name,nativeCurrency:t.nativeCurrency,rpcUrls:[t.rpcUrls.default?.http[0]??""],blockExplorerUrls:[t.blockExplorers?.default.url]}]}),t}catch(e){throw new et.ab(e)}throw new et.x3(e)}},onAccountsChanged(e){0===e.length?i.emitter.emit("disconnect"):i.emitter.emit("change",{accounts:e.map(e=>(0,tM.K)(e))})},onChainChanged(e){let t=normalizeChainId(e);i.emitter.emit("change",{chainId:t})},async onDisconnect(e){i.emitter.emit("disconnect");let t=await this.getProvider();t.removeListener("accountsChanged",this.onAccountsChanged),t.removeListener("chainChanged",this.onChainChanged),t.removeListener("disconnect",this.onDisconnect.bind(this))}})}walletConnect.type="walletConnect",coinbaseWallet.type="coinbaseWallet";var tD=function(e){var{conditions:t}=e;if(!t)throw Error("Styles have no conditions");var n=createNormalizeValueFn(e);return addRecipe(function(e,o){if("string"==typeof e||"number"==typeof e||"boolean"==typeof e){if(!t.defaultCondition)throw Error("No default condition");return o(e,t.defaultCondition)}var i=Array.isArray(e)?n(e):e,s={};for(var l in i)null!=i[l]&&(s[l]=o(i[l],l));return s},{importPath:"@vanilla-extract/sprinkles/createUtils",importName:"createMapValueFn",args:[{conditions:e.conditions}]})}({conditions:{defaultCondition:"smallScreen",conditionNames:["smallScreen","largeScreen"],responsiveArray:void 0}}),t_=createNormalizeValueFn({conditions:{defaultCondition:"smallScreen",conditionNames:["smallScreen","largeScreen"],responsiveArray:void 0}}),tL=function(){return createSprinkles_c8550e00_esm_createSprinkles(composeStyles)(...arguments)}({conditions:{defaultCondition:"base",conditionNames:["base","hover","active"],responsiveArray:void 0},styles:{background:{values:{accentColor:{conditions:{base:"ju367v9i",hover:"ju367v9j",active:"ju367v9k"},defaultClass:"ju367v9i"},accentColorForeground:{conditions:{base:"ju367v9l",hover:"ju367v9m",active:"ju367v9n"},defaultClass:"ju367v9l"},actionButtonBorder:{conditions:{base:"ju367v9o",hover:"ju367v9p",active:"ju367v9q"},defaultClass:"ju367v9o"},actionButtonBorderMobile:{conditions:{base:"ju367v9r",hover:"ju367v9s",active:"ju367v9t"},defaultClass:"ju367v9r"},actionButtonSecondaryBackground:{conditions:{base:"ju367v9u",hover:"ju367v9v",active:"ju367v9w"},defaultClass:"ju367v9u"},closeButton:{conditions:{base:"ju367v9x",hover:"ju367v9y",active:"ju367v9z"},defaultClass:"ju367v9x"},closeButtonBackground:{conditions:{base:"ju367va0",hover:"ju367va1",active:"ju367va2"},defaultClass:"ju367va0"},connectButtonBackground:{conditions:{base:"ju367va3",hover:"ju367va4",active:"ju367va5"},defaultClass:"ju367va3"},connectButtonBackgroundError:{conditions:{base:"ju367va6",hover:"ju367va7",active:"ju367va8"},defaultClass:"ju367va6"},connectButtonInnerBackground:{conditions:{base:"ju367va9",hover:"ju367vaa",active:"ju367vab"},defaultClass:"ju367va9"},connectButtonText:{conditions:{base:"ju367vac",hover:"ju367vad",active:"ju367vae"},defaultClass:"ju367vac"},connectButtonTextError:{conditions:{base:"ju367vaf",hover:"ju367vag",active:"ju367vah"},defaultClass:"ju367vaf"},connectionIndicator:{conditions:{base:"ju367vai",hover:"ju367vaj",active:"ju367vak"},defaultClass:"ju367vai"},downloadBottomCardBackground:{conditions:{base:"ju367val",hover:"ju367vam",active:"ju367van"},defaultClass:"ju367val"},downloadTopCardBackground:{conditions:{base:"ju367vao",hover:"ju367vap",active:"ju367vaq"},defaultClass:"ju367vao"},error:{conditions:{base:"ju367var",hover:"ju367vas",active:"ju367vat"},defaultClass:"ju367var"},generalBorder:{conditions:{base:"ju367vau",hover:"ju367vav",active:"ju367vaw"},defaultClass:"ju367vau"},generalBorderDim:{conditions:{base:"ju367vax",hover:"ju367vay",active:"ju367vaz"},defaultClass:"ju367vax"},menuItemBackground:{conditions:{base:"ju367vb0",hover:"ju367vb1",active:"ju367vb2"},defaultClass:"ju367vb0"},modalBackdrop:{conditions:{base:"ju367vb3",hover:"ju367vb4",active:"ju367vb5"},defaultClass:"ju367vb3"},modalBackground:{conditions:{base:"ju367vb6",hover:"ju367vb7",active:"ju367vb8"},defaultClass:"ju367vb6"},modalBorder:{conditions:{base:"ju367vb9",hover:"ju367vba",active:"ju367vbb"},defaultClass:"ju367vb9"},modalText:{conditions:{base:"ju367vbc",hover:"ju367vbd",active:"ju367vbe"},defaultClass:"ju367vbc"},modalTextDim:{conditions:{base:"ju367vbf",hover:"ju367vbg",active:"ju367vbh"},defaultClass:"ju367vbf"},modalTextSecondary:{conditions:{base:"ju367vbi",hover:"ju367vbj",active:"ju367vbk"},defaultClass:"ju367vbi"},profileAction:{conditions:{base:"ju367vbl",hover:"ju367vbm",active:"ju367vbn"},defaultClass:"ju367vbl"},profileActionHover:{conditions:{base:"ju367vbo",hover:"ju367vbp",active:"ju367vbq"},defaultClass:"ju367vbo"},profileForeground:{conditions:{base:"ju367vbr",hover:"ju367vbs",active:"ju367vbt"},defaultClass:"ju367vbr"},selectedOptionBorder:{conditions:{base:"ju367vbu",hover:"ju367vbv",active:"ju367vbw"},defaultClass:"ju367vbu"},standby:{conditions:{base:"ju367vbx",hover:"ju367vby",active:"ju367vbz"},defaultClass:"ju367vbx"}}},borderColor:{values:{accentColor:{conditions:{base:"ju367vc0",hover:"ju367vc1",active:"ju367vc2"},defaultClass:"ju367vc0"},accentColorForeground:{conditions:{base:"ju367vc3",hover:"ju367vc4",active:"ju367vc5"},defaultClass:"ju367vc3"},actionButtonBorder:{conditions:{base:"ju367vc6",hover:"ju367vc7",active:"ju367vc8"},defaultClass:"ju367vc6"},actionButtonBorderMobile:{conditions:{base:"ju367vc9",hover:"ju367vca",active:"ju367vcb"},defaultClass:"ju367vc9"},actionButtonSecondaryBackground:{conditions:{base:"ju367vcc",hover:"ju367vcd",active:"ju367vce"},defaultClass:"ju367vcc"},closeButton:{conditions:{base:"ju367vcf",hover:"ju367vcg",active:"ju367vch"},defaultClass:"ju367vcf"},closeButtonBackground:{conditions:{base:"ju367vci",hover:"ju367vcj",active:"ju367vck"},defaultClass:"ju367vci"},connectButtonBackground:{conditions:{base:"ju367vcl",hover:"ju367vcm",active:"ju367vcn"},defaultClass:"ju367vcl"},connectButtonBackgroundError:{conditions:{base:"ju367vco",hover:"ju367vcp",active:"ju367vcq"},defaultClass:"ju367vco"},connectButtonInnerBackground:{conditions:{base:"ju367vcr",hover:"ju367vcs",active:"ju367vct"},defaultClass:"ju367vcr"},connectButtonText:{conditions:{base:"ju367vcu",hover:"ju367vcv",active:"ju367vcw"},defaultClass:"ju367vcu"},connectButtonTextError:{conditions:{base:"ju367vcx",hover:"ju367vcy",active:"ju367vcz"},defaultClass:"ju367vcx"},connectionIndicator:{conditions:{base:"ju367vd0",hover:"ju367vd1",active:"ju367vd2"},defaultClass:"ju367vd0"},downloadBottomCardBackground:{conditions:{base:"ju367vd3",hover:"ju367vd4",active:"ju367vd5"},defaultClass:"ju367vd3"},downloadTopCardBackground:{conditions:{base:"ju367vd6",hover:"ju367vd7",active:"ju367vd8"},defaultClass:"ju367vd6"},error:{conditions:{base:"ju367vd9",hover:"ju367vda",active:"ju367vdb"},defaultClass:"ju367vd9"},generalBorder:{conditions:{base:"ju367vdc",hover:"ju367vdd",active:"ju367vde"},defaultClass:"ju367vdc"},generalBorderDim:{conditions:{base:"ju367vdf",hover:"ju367vdg",active:"ju367vdh"},defaultClass:"ju367vdf"},menuItemBackground:{conditions:{base:"ju367vdi",hover:"ju367vdj",active:"ju367vdk"},defaultClass:"ju367vdi"},modalBackdrop:{conditions:{base:"ju367vdl",hover:"ju367vdm",active:"ju367vdn"},defaultClass:"ju367vdl"},modalBackground:{conditions:{base:"ju367vdo",hover:"ju367vdp",active:"ju367vdq"},defaultClass:"ju367vdo"},modalBorder:{conditions:{base:"ju367vdr",hover:"ju367vds",active:"ju367vdt"},defaultClass:"ju367vdr"},modalText:{conditions:{base:"ju367vdu",hover:"ju367vdv",active:"ju367vdw"},defaultClass:"ju367vdu"},modalTextDim:{conditions:{base:"ju367vdx",hover:"ju367vdy",active:"ju367vdz"},defaultClass:"ju367vdx"},modalTextSecondary:{conditions:{base:"ju367ve0",hover:"ju367ve1",active:"ju367ve2"},defaultClass:"ju367ve0"},profileAction:{conditions:{base:"ju367ve3",hover:"ju367ve4",active:"ju367ve5"},defaultClass:"ju367ve3"},profileActionHover:{conditions:{base:"ju367ve6",hover:"ju367ve7",active:"ju367ve8"},defaultClass:"ju367ve6"},profileForeground:{conditions:{base:"ju367ve9",hover:"ju367vea",active:"ju367veb"},defaultClass:"ju367ve9"},selectedOptionBorder:{conditions:{base:"ju367vec",hover:"ju367ved",active:"ju367vee"},defaultClass:"ju367vec"},standby:{conditions:{base:"ju367vef",hover:"ju367veg",active:"ju367veh"},defaultClass:"ju367vef"}}},boxShadow:{values:{connectButton:{conditions:{base:"ju367vei",hover:"ju367vej",active:"ju367vek"},defaultClass:"ju367vei"},dialog:{conditions:{base:"ju367vel",hover:"ju367vem",active:"ju367ven"},defaultClass:"ju367vel"},profileDetailsAction:{conditions:{base:"ju367veo",hover:"ju367vep",active:"ju367veq"},defaultClass:"ju367veo"},selectedOption:{conditions:{base:"ju367ver",hover:"ju367ves",active:"ju367vet"},defaultClass:"ju367ver"},selectedWallet:{conditions:{base:"ju367veu",hover:"ju367vev",active:"ju367vew"},defaultClass:"ju367veu"},walletLogo:{conditions:{base:"ju367vex",hover:"ju367vey",active:"ju367vez"},defaultClass:"ju367vex"}}},color:{values:{accentColor:{conditions:{base:"ju367vf0",hover:"ju367vf1",active:"ju367vf2"},defaultClass:"ju367vf0"},accentColorForeground:{conditions:{base:"ju367vf3",hover:"ju367vf4",active:"ju367vf5"},defaultClass:"ju367vf3"},actionButtonBorder:{conditions:{base:"ju367vf6",hover:"ju367vf7",active:"ju367vf8"},defaultClass:"ju367vf6"},actionButtonBorderMobile:{conditions:{base:"ju367vf9",hover:"ju367vfa",active:"ju367vfb"},defaultClass:"ju367vf9"},actionButtonSecondaryBackground:{conditions:{base:"ju367vfc",hover:"ju367vfd",active:"ju367vfe"},defaultClass:"ju367vfc"},closeButton:{conditions:{base:"ju367vff",hover:"ju367vfg",active:"ju367vfh"},defaultClass:"ju367vff"},closeButtonBackground:{conditions:{base:"ju367vfi",hover:"ju367vfj",active:"ju367vfk"},defaultClass:"ju367vfi"},connectButtonBackground:{conditions:{base:"ju367vfl",hover:"ju367vfm",active:"ju367vfn"},defaultClass:"ju367vfl"},connectButtonBackgroundError:{conditions:{base:"ju367vfo",hover:"ju367vfp",active:"ju367vfq"},defaultClass:"ju367vfo"},connectButtonInnerBackground:{conditions:{base:"ju367vfr",hover:"ju367vfs",active:"ju367vft"},defaultClass:"ju367vfr"},connectButtonText:{conditions:{base:"ju367vfu",hover:"ju367vfv",active:"ju367vfw"},defaultClass:"ju367vfu"},connectButtonTextError:{conditions:{base:"ju367vfx",hover:"ju367vfy",active:"ju367vfz"},defaultClass:"ju367vfx"},connectionIndicator:{conditions:{base:"ju367vg0",hover:"ju367vg1",active:"ju367vg2"},defaultClass:"ju367vg0"},downloadBottomCardBackground:{conditions:{base:"ju367vg3",hover:"ju367vg4",active:"ju367vg5"},defaultClass:"ju367vg3"},downloadTopCardBackground:{conditions:{base:"ju367vg6",hover:"ju367vg7",active:"ju367vg8"},defaultClass:"ju367vg6"},error:{conditions:{base:"ju367vg9",hover:"ju367vga",active:"ju367vgb"},defaultClass:"ju367vg9"},generalBorder:{conditions:{base:"ju367vgc",hover:"ju367vgd",active:"ju367vge"},defaultClass:"ju367vgc"},generalBorderDim:{conditions:{base:"ju367vgf",hover:"ju367vgg",active:"ju367vgh"},defaultClass:"ju367vgf"},menuItemBackground:{conditions:{base:"ju367vgi",hover:"ju367vgj",active:"ju367vgk"},defaultClass:"ju367vgi"},modalBackdrop:{conditions:{base:"ju367vgl",hover:"ju367vgm",active:"ju367vgn"},defaultClass:"ju367vgl"},modalBackground:{conditions:{base:"ju367vgo",hover:"ju367vgp",active:"ju367vgq"},defaultClass:"ju367vgo"},modalBorder:{conditions:{base:"ju367vgr",hover:"ju367vgs",active:"ju367vgt"},defaultClass:"ju367vgr"},modalText:{conditions:{base:"ju367vgu",hover:"ju367vgv",active:"ju367vgw"},defaultClass:"ju367vgu"},modalTextDim:{conditions:{base:"ju367vgx",hover:"ju367vgy",active:"ju367vgz"},defaultClass:"ju367vgx"},modalTextSecondary:{conditions:{base:"ju367vh0",hover:"ju367vh1",active:"ju367vh2"},defaultClass:"ju367vh0"},profileAction:{conditions:{base:"ju367vh3",hover:"ju367vh4",active:"ju367vh5"},defaultClass:"ju367vh3"},profileActionHover:{conditions:{base:"ju367vh6",hover:"ju367vh7",active:"ju367vh8"},defaultClass:"ju367vh6"},profileForeground:{conditions:{base:"ju367vh9",hover:"ju367vha",active:"ju367vhb"},defaultClass:"ju367vh9"},selectedOptionBorder:{conditions:{base:"ju367vhc",hover:"ju367vhd",active:"ju367vhe"},defaultClass:"ju367vhc"},standby:{conditions:{base:"ju367vhf",hover:"ju367vhg",active:"ju367vhh"},defaultClass:"ju367vhf"}}}}},{conditions:{defaultCondition:"smallScreen",conditionNames:["smallScreen","largeScreen"],responsiveArray:void 0},styles:{alignItems:{values:{"flex-start":{conditions:{smallScreen:"ju367v0",largeScreen:"ju367v1"},defaultClass:"ju367v0"},"flex-end":{conditions:{smallScreen:"ju367v2",largeScreen:"ju367v3"},defaultClass:"ju367v2"},center:{conditions:{smallScreen:"ju367v4",largeScreen:"ju367v5"},defaultClass:"ju367v4"}}},display:{values:{none:{conditions:{smallScreen:"ju367v6",largeScreen:"ju367v7"},defaultClass:"ju367v6"},block:{conditions:{smallScreen:"ju367v8",largeScreen:"ju367v9"},defaultClass:"ju367v8"},flex:{conditions:{smallScreen:"ju367va",largeScreen:"ju367vb"},defaultClass:"ju367va"},inline:{conditions:{smallScreen:"ju367vc",largeScreen:"ju367vd"},defaultClass:"ju367vc"}}}}},{conditions:void 0,styles:{margin:{mappings:["marginTop","marginBottom","marginLeft","marginRight"]},marginX:{mappings:["marginLeft","marginRight"]},marginY:{mappings:["marginTop","marginBottom"]},padding:{mappings:["paddingTop","paddingBottom","paddingLeft","paddingRight"]},paddingX:{mappings:["paddingLeft","paddingRight"]},paddingY:{mappings:["paddingTop","paddingBottom"]},alignSelf:{values:{"flex-start":{defaultClass:"ju367ve"},"flex-end":{defaultClass:"ju367vf"},center:{defaultClass:"ju367vg"}}},backgroundSize:{values:{cover:{defaultClass:"ju367vh"}}},borderRadius:{values:{1:{defaultClass:"ju367vi"},6:{defaultClass:"ju367vj"},10:{defaultClass:"ju367vk"},13:{defaultClass:"ju367vl"},actionButton:{defaultClass:"ju367vm"},connectButton:{defaultClass:"ju367vn"},menuButton:{defaultClass:"ju367vo"},modal:{defaultClass:"ju367vp"},modalMobile:{defaultClass:"ju367vq"},"25%":{defaultClass:"ju367vr"},full:{defaultClass:"ju367vs"}}},borderStyle:{values:{solid:{defaultClass:"ju367vt"}}},borderWidth:{values:{0:{defaultClass:"ju367vu"},1:{defaultClass:"ju367vv"},2:{defaultClass:"ju367vw"},4:{defaultClass:"ju367vx"}}},cursor:{values:{pointer:{defaultClass:"ju367vy"},none:{defaultClass:"ju367vz"}}},pointerEvents:{values:{none:{defaultClass:"ju367v10"},all:{defaultClass:"ju367v11"}}},minHeight:{values:{8:{defaultClass:"ju367v12"},44:{defaultClass:"ju367v13"}}},flexDirection:{values:{row:{defaultClass:"ju367v14"},column:{defaultClass:"ju367v15"}}},fontFamily:{values:{body:{defaultClass:"ju367v16"}}},fontSize:{values:{12:{defaultClass:"ju367v17"},13:{defaultClass:"ju367v18"},14:{defaultClass:"ju367v19"},16:{defaultClass:"ju367v1a"},18:{defaultClass:"ju367v1b"},20:{defaultClass:"ju367v1c"},23:{defaultClass:"ju367v1d"}}},fontWeight:{values:{regular:{defaultClass:"ju367v1e"},medium:{defaultClass:"ju367v1f"},semibold:{defaultClass:"ju367v1g"},bold:{defaultClass:"ju367v1h"},heavy:{defaultClass:"ju367v1i"}}},gap:{values:{0:{defaultClass:"ju367v1j"},1:{defaultClass:"ju367v1k"},2:{defaultClass:"ju367v1l"},3:{defaultClass:"ju367v1m"},4:{defaultClass:"ju367v1n"},5:{defaultClass:"ju367v1o"},6:{defaultClass:"ju367v1p"},8:{defaultClass:"ju367v1q"},10:{defaultClass:"ju367v1r"},12:{defaultClass:"ju367v1s"},14:{defaultClass:"ju367v1t"},16:{defaultClass:"ju367v1u"},18:{defaultClass:"ju367v1v"},20:{defaultClass:"ju367v1w"},24:{defaultClass:"ju367v1x"},28:{defaultClass:"ju367v1y"},32:{defaultClass:"ju367v1z"},36:{defaultClass:"ju367v20"},44:{defaultClass:"ju367v21"},64:{defaultClass:"ju367v22"},"-1":{defaultClass:"ju367v23"}}},height:{values:{1:{defaultClass:"ju367v24"},2:{defaultClass:"ju367v25"},4:{defaultClass:"ju367v26"},8:{defaultClass:"ju367v27"},12:{defaultClass:"ju367v28"},20:{defaultClass:"ju367v29"},24:{defaultClass:"ju367v2a"},28:{defaultClass:"ju367v2b"},30:{defaultClass:"ju367v2c"},32:{defaultClass:"ju367v2d"},34:{defaultClass:"ju367v2e"},36:{defaultClass:"ju367v2f"},40:{defaultClass:"ju367v2g"},44:{defaultClass:"ju367v2h"},48:{defaultClass:"ju367v2i"},54:{defaultClass:"ju367v2j"},60:{defaultClass:"ju367v2k"},200:{defaultClass:"ju367v2l"},full:{defaultClass:"ju367v2m"},max:{defaultClass:"ju367v2n"}}},justifyContent:{values:{"flex-start":{defaultClass:"ju367v2o"},"flex-end":{defaultClass:"ju367v2p"},center:{defaultClass:"ju367v2q"},"space-between":{defaultClass:"ju367v2r"},"space-around":{defaultClass:"ju367v2s"}}},textAlign:{values:{left:{defaultClass:"ju367v2t"},center:{defaultClass:"ju367v2u"},inherit:{defaultClass:"ju367v2v"}}},marginBottom:{values:{0:{defaultClass:"ju367v2w"},1:{defaultClass:"ju367v2x"},2:{defaultClass:"ju367v2y"},3:{defaultClass:"ju367v2z"},4:{defaultClass:"ju367v30"},5:{defaultClass:"ju367v31"},6:{defaultClass:"ju367v32"},8:{defaultClass:"ju367v33"},10:{defaultClass:"ju367v34"},12:{defaultClass:"ju367v35"},14:{defaultClass:"ju367v36"},16:{defaultClass:"ju367v37"},18:{defaultClass:"ju367v38"},20:{defaultClass:"ju367v39"},24:{defaultClass:"ju367v3a"},28:{defaultClass:"ju367v3b"},32:{defaultClass:"ju367v3c"},36:{defaultClass:"ju367v3d"},44:{defaultClass:"ju367v3e"},64:{defaultClass:"ju367v3f"},"-1":{defaultClass:"ju367v3g"}}},marginLeft:{values:{0:{defaultClass:"ju367v3h"},1:{defaultClass:"ju367v3i"},2:{defaultClass:"ju367v3j"},3:{defaultClass:"ju367v3k"},4:{defaultClass:"ju367v3l"},5:{defaultClass:"ju367v3m"},6:{defaultClass:"ju367v3n"},8:{defaultClass:"ju367v3o"},10:{defaultClass:"ju367v3p"},12:{defaultClass:"ju367v3q"},14:{defaultClass:"ju367v3r"},16:{defaultClass:"ju367v3s"},18:{defaultClass:"ju367v3t"},20:{defaultClass:"ju367v3u"},24:{defaultClass:"ju367v3v"},28:{defaultClass:"ju367v3w"},32:{defaultClass:"ju367v3x"},36:{defaultClass:"ju367v3y"},44:{defaultClass:"ju367v3z"},64:{defaultClass:"ju367v40"},"-1":{defaultClass:"ju367v41"}}},marginRight:{values:{0:{defaultClass:"ju367v42"},1:{defaultClass:"ju367v43"},2:{defaultClass:"ju367v44"},3:{defaultClass:"ju367v45"},4:{defaultClass:"ju367v46"},5:{defaultClass:"ju367v47"},6:{defaultClass:"ju367v48"},8:{defaultClass:"ju367v49"},10:{defaultClass:"ju367v4a"},12:{defaultClass:"ju367v4b"},14:{defaultClass:"ju367v4c"},16:{defaultClass:"ju367v4d"},18:{defaultClass:"ju367v4e"},20:{defaultClass:"ju367v4f"},24:{defaultClass:"ju367v4g"},28:{defaultClass:"ju367v4h"},32:{defaultClass:"ju367v4i"},36:{defaultClass:"ju367v4j"},44:{defaultClass:"ju367v4k"},64:{defaultClass:"ju367v4l"},"-1":{defaultClass:"ju367v4m"}}},marginTop:{values:{0:{defaultClass:"ju367v4n"},1:{defaultClass:"ju367v4o"},2:{defaultClass:"ju367v4p"},3:{defaultClass:"ju367v4q"},4:{defaultClass:"ju367v4r"},5:{defaultClass:"ju367v4s"},6:{defaultClass:"ju367v4t"},8:{defaultClass:"ju367v4u"},10:{defaultClass:"ju367v4v"},12:{defaultClass:"ju367v4w"},14:{defaultClass:"ju367v4x"},16:{defaultClass:"ju367v4y"},18:{defaultClass:"ju367v4z"},20:{defaultClass:"ju367v50"},24:{defaultClass:"ju367v51"},28:{defaultClass:"ju367v52"},32:{defaultClass:"ju367v53"},36:{defaultClass:"ju367v54"},44:{defaultClass:"ju367v55"},64:{defaultClass:"ju367v56"},"-1":{defaultClass:"ju367v57"}}},maxWidth:{values:{1:{defaultClass:"ju367v58"},2:{defaultClass:"ju367v59"},4:{defaultClass:"ju367v5a"},8:{defaultClass:"ju367v5b"},12:{defaultClass:"ju367v5c"},20:{defaultClass:"ju367v5d"},24:{defaultClass:"ju367v5e"},28:{defaultClass:"ju367v5f"},30:{defaultClass:"ju367v5g"},32:{defaultClass:"ju367v5h"},34:{defaultClass:"ju367v5i"},36:{defaultClass:"ju367v5j"},40:{defaultClass:"ju367v5k"},44:{defaultClass:"ju367v5l"},48:{defaultClass:"ju367v5m"},54:{defaultClass:"ju367v5n"},60:{defaultClass:"ju367v5o"},200:{defaultClass:"ju367v5p"},full:{defaultClass:"ju367v5q"},max:{defaultClass:"ju367v5r"}}},minWidth:{values:{1:{defaultClass:"ju367v5s"},2:{defaultClass:"ju367v5t"},4:{defaultClass:"ju367v5u"},8:{defaultClass:"ju367v5v"},12:{defaultClass:"ju367v5w"},20:{defaultClass:"ju367v5x"},24:{defaultClass:"ju367v5y"},28:{defaultClass:"ju367v5z"},30:{defaultClass:"ju367v60"},32:{defaultClass:"ju367v61"},34:{defaultClass:"ju367v62"},36:{defaultClass:"ju367v63"},40:{defaultClass:"ju367v64"},44:{defaultClass:"ju367v65"},48:{defaultClass:"ju367v66"},54:{defaultClass:"ju367v67"},60:{defaultClass:"ju367v68"},200:{defaultClass:"ju367v69"},full:{defaultClass:"ju367v6a"},max:{defaultClass:"ju367v6b"}}},overflow:{values:{hidden:{defaultClass:"ju367v6c"}}},paddingBottom:{values:{0:{defaultClass:"ju367v6d"},1:{defaultClass:"ju367v6e"},2:{defaultClass:"ju367v6f"},3:{defaultClass:"ju367v6g"},4:{defaultClass:"ju367v6h"},5:{defaultClass:"ju367v6i"},6:{defaultClass:"ju367v6j"},8:{defaultClass:"ju367v6k"},10:{defaultClass:"ju367v6l"},12:{defaultClass:"ju367v6m"},14:{defaultClass:"ju367v6n"},16:{defaultClass:"ju367v6o"},18:{defaultClass:"ju367v6p"},20:{defaultClass:"ju367v6q"},24:{defaultClass:"ju367v6r"},28:{defaultClass:"ju367v6s"},32:{defaultClass:"ju367v6t"},36:{defaultClass:"ju367v6u"},44:{defaultClass:"ju367v6v"},64:{defaultClass:"ju367v6w"},"-1":{defaultClass:"ju367v6x"}}},paddingLeft:{values:{0:{defaultClass:"ju367v6y"},1:{defaultClass:"ju367v6z"},2:{defaultClass:"ju367v70"},3:{defaultClass:"ju367v71"},4:{defaultClass:"ju367v72"},5:{defaultClass:"ju367v73"},6:{defaultClass:"ju367v74"},8:{defaultClass:"ju367v75"},10:{defaultClass:"ju367v76"},12:{defaultClass:"ju367v77"},14:{defaultClass:"ju367v78"},16:{defaultClass:"ju367v79"},18:{defaultClass:"ju367v7a"},20:{defaultClass:"ju367v7b"},24:{defaultClass:"ju367v7c"},28:{defaultClass:"ju367v7d"},32:{defaultClass:"ju367v7e"},36:{defaultClass:"ju367v7f"},44:{defaultClass:"ju367v7g"},64:{defaultClass:"ju367v7h"},"-1":{defaultClass:"ju367v7i"}}},paddingRight:{values:{0:{defaultClass:"ju367v7j"},1:{defaultClass:"ju367v7k"},2:{defaultClass:"ju367v7l"},3:{defaultClass:"ju367v7m"},4:{defaultClass:"ju367v7n"},5:{defaultClass:"ju367v7o"},6:{defaultClass:"ju367v7p"},8:{defaultClass:"ju367v7q"},10:{defaultClass:"ju367v7r"},12:{defaultClass:"ju367v7s"},14:{defaultClass:"ju367v7t"},16:{defaultClass:"ju367v7u"},18:{defaultClass:"ju367v7v"},20:{defaultClass:"ju367v7w"},24:{defaultClass:"ju367v7x"},28:{defaultClass:"ju367v7y"},32:{defaultClass:"ju367v7z"},36:{defaultClass:"ju367v80"},44:{defaultClass:"ju367v81"},64:{defaultClass:"ju367v82"},"-1":{defaultClass:"ju367v83"}}},paddingTop:{values:{0:{defaultClass:"ju367v84"},1:{defaultClass:"ju367v85"},2:{defaultClass:"ju367v86"},3:{defaultClass:"ju367v87"},4:{defaultClass:"ju367v88"},5:{defaultClass:"ju367v89"},6:{defaultClass:"ju367v8a"},8:{defaultClass:"ju367v8b"},10:{defaultClass:"ju367v8c"},12:{defaultClass:"ju367v8d"},14:{defaultClass:"ju367v8e"},16:{defaultClass:"ju367v8f"},18:{defaultClass:"ju367v8g"},20:{defaultClass:"ju367v8h"},24:{defaultClass:"ju367v8i"},28:{defaultClass:"ju367v8j"},32:{defaultClass:"ju367v8k"},36:{defaultClass:"ju367v8l"},44:{defaultClass:"ju367v8m"},64:{defaultClass:"ju367v8n"},"-1":{defaultClass:"ju367v8o"}}},position:{values:{absolute:{defaultClass:"ju367v8p"},fixed:{defaultClass:"ju367v8q"},relative:{defaultClass:"ju367v8r"}}},WebkitUserSelect:{values:{none:{defaultClass:"ju367v8s"}}},right:{values:{0:{defaultClass:"ju367v8t"}}},transition:{values:{default:{defaultClass:"ju367v8u"},transform:{defaultClass:"ju367v8v"}}},userSelect:{values:{none:{defaultClass:"ju367v8w"}}},width:{values:{1:{defaultClass:"ju367v8x"},2:{defaultClass:"ju367v8y"},4:{defaultClass:"ju367v8z"},8:{defaultClass:"ju367v90"},12:{defaultClass:"ju367v91"},20:{defaultClass:"ju367v92"},24:{defaultClass:"ju367v93"},28:{defaultClass:"ju367v94"},30:{defaultClass:"ju367v95"},32:{defaultClass:"ju367v96"},34:{defaultClass:"ju367v97"},36:{defaultClass:"ju367v98"},40:{defaultClass:"ju367v99"},44:{defaultClass:"ju367v9a"},48:{defaultClass:"ju367v9b"},54:{defaultClass:"ju367v9c"},60:{defaultClass:"ju367v9d"},200:{defaultClass:"ju367v9e"},full:{defaultClass:"ju367v9f"},max:{defaultClass:"ju367v9g"}}},backdropFilter:{values:{modalOverlay:{defaultClass:"ju367v9h"}}}}}),tz={colors:{accentColor:"var(--rk-colors-accentColor)",accentColorForeground:"var(--rk-colors-accentColorForeground)",actionButtonBorder:"var(--rk-colors-actionButtonBorder)",actionButtonBorderMobile:"var(--rk-colors-actionButtonBorderMobile)",actionButtonSecondaryBackground:"var(--rk-colors-actionButtonSecondaryBackground)",closeButton:"var(--rk-colors-closeButton)",closeButtonBackground:"var(--rk-colors-closeButtonBackground)",connectButtonBackground:"var(--rk-colors-connectButtonBackground)",connectButtonBackgroundError:"var(--rk-colors-connectButtonBackgroundError)",connectButtonInnerBackground:"var(--rk-colors-connectButtonInnerBackground)",connectButtonText:"var(--rk-colors-connectButtonText)",connectButtonTextError:"var(--rk-colors-connectButtonTextError)",connectionIndicator:"var(--rk-colors-connectionIndicator)",downloadBottomCardBackground:"var(--rk-colors-downloadBottomCardBackground)",downloadTopCardBackground:"var(--rk-colors-downloadTopCardBackground)",error:"var(--rk-colors-error)",generalBorder:"var(--rk-colors-generalBorder)",generalBorderDim:"var(--rk-colors-generalBorderDim)",menuItemBackground:"var(--rk-colors-menuItemBackground)",modalBackdrop:"var(--rk-colors-modalBackdrop)",modalBackground:"var(--rk-colors-modalBackground)",modalBorder:"var(--rk-colors-modalBorder)",modalText:"var(--rk-colors-modalText)",modalTextDim:"var(--rk-colors-modalTextDim)",modalTextSecondary:"var(--rk-colors-modalTextSecondary)",profileAction:"var(--rk-colors-profileAction)",profileActionHover:"var(--rk-colors-profileActionHover)",profileForeground:"var(--rk-colors-profileForeground)",selectedOptionBorder:"var(--rk-colors-selectedOptionBorder)",standby:"var(--rk-colors-standby)"},fonts:{body:"var(--rk-fonts-body)"},radii:{actionButton:"var(--rk-radii-actionButton)",connectButton:"var(--rk-radii-connectButton)",menuButton:"var(--rk-radii-menuButton)",modal:"var(--rk-radii-modal)",modalMobile:"var(--rk-radii-modalMobile)"},shadows:{connectButton:"var(--rk-shadows-connectButton)",dialog:"var(--rk-shadows-dialog)",profileDetailsAction:"var(--rk-shadows-profileDetailsAction)",selectedOption:"var(--rk-shadows-selectedOption)",selectedWallet:"var(--rk-shadows-selectedWallet)",walletLogo:"var(--rk-shadows-walletLogo)"},blurs:{modalOverlay:"var(--rk-blurs-modalOverlay)"}},tq={shrink:"_12cbo8i6",shrinkSm:"_12cbo8i7"},tG={grow:"_12cbo8i4",growLg:"_12cbo8i5"};function touchableStyles({active:e,hover:t}){return["_12cbo8i3 ju367v8r",t&&tG[t],tq[e]]}var tW=(0,D.createContext)(null);function useAuthenticationStatus(){var e;let t=(0,D.useContext)(tW);return null!=(e=null==t?void 0:t.status)?e:null}function useConnectionStatus(){let e=useAuthenticationStatus(),{isConnected:t}=(0,_.m)();return t?e&&("loading"===e||"unauthenticated"===e)?e:"connected":"disconnected"}function isAndroid(){return"undefined"!=typeof navigator&&/android/i.test(navigator.userAgent)}function isIOS(){return"undefined"!=typeof navigator&&/iPhone|iPod/.test(navigator.userAgent)||"undefined"!=typeof navigator&&(/iPad/.test(navigator.userAgent)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)}function isMobile(){return isAndroid()||isIOS()}var tH={a:"iekbcca",blockquote:"iekbcc2",button:"iekbcc9",input:"iekbcc8 iekbcc5 iekbcc4",mark:"iekbcc6",ol:"iekbcc1",q:"iekbcc2",select:"iekbcc7 iekbcc5 iekbcc4",table:"iekbcc3",textarea:"iekbcc5 iekbcc4",ul:"iekbcc1"},atoms=({reset:e,...t})=>{if(!e)return tL(t);let n=tH[e],o=tL(t);return(0,L.Z)("iekbcc0",n,o)},tQ=D.forwardRef(({as:e="div",className:t,testId:n,...o},i)=>{let s={},l={};for(let e in o)tL.properties.has(e)?s[e]=o[e]:l[e]=o[e];let c=atoms({reset:"string"==typeof e?e:"div",...s});return D.createElement(e,{className:(0,L.Z)(c,t),...l,"data-testid":n?`rk-${n.replace(/^rk-/,"")}`:void 0,ref:i})});tQ.displayName="Box";var tK=new Map,tV=new Map;async function loadAsyncImage(e){let t=tV.get(e);if(t)return t;let load=async()=>e().then(async t=>(tK.set(e,t),t)),n=load().catch(t=>load().catch(t=>{tV.delete(e)}));return tV.set(e,n),n}async function loadImages(...e){return await Promise.all(e.map(e=>"function"==typeof e?loadAsyncImage(e):e))}function useAsyncImage(e){let t="function"==typeof e?tK.get(e):void 0,n=function(){let[,e]=(0,D.useReducer)(e=>e+1,0);return e}();return(0,D.useEffect)(()=>{"function"!=typeof e||t||loadAsyncImage(e).then(n)},[e,t,n]),"function"==typeof e?t:e}function AsyncImage({alt:e,background:t,borderColor:n,borderRadius:o,useAsImage:i,boxShadow:s,height:l,src:c,width:u,testId:d}){let p=isIOS(),f=useAsyncImage(c),m=f&&/^http/.test(f),[g,b]=(0,D.useReducer)(()=>!0,!1);return D.createElement(tQ,{"aria-label":e,borderRadius:o,boxShadow:s,height:"string"==typeof l?l:void 0,overflow:"hidden",position:"relative",role:"img",style:{background:t,height:"number"==typeof l?l:void 0,width:"number"==typeof u?u:void 0},width:"string"==typeof u?u:void 0,testId:d},D.createElement(tQ,{...i?{"aria-hidden":!0,as:"img",src:f}:m?{"aria-hidden":!0,as:"img",onLoad:b,src:f}:{backgroundSize:"cover"},height:"full",position:"absolute",...p?{WebkitUserSelect:"none"}:{},style:{WebkitTouchCallout:"none",transition:"opacity .15s linear",userSelect:"none",...i?{}:m?{opacity:g?1:0}:{backgroundImage:f?`url(${f})`:void 0,backgroundRepeat:"no-repeat",opacity:f?1:0}},width:"full"}),n?D.createElement(tQ,{..."object"==typeof n&&"custom"in n?{style:{borderColor:n.custom}}:{borderColor:n},borderRadius:o,borderStyle:"solid",borderWidth:"1",height:"full",position:"relative",width:"full"}):null)}var useRandomId=e=>(0,D.useMemo)(()=>`${e}_${Math.round(1e9*Math.random())}`,[e]),SpinnerIcon=({height:e=21,width:t=21})=>{let n=useRandomId("spinner");return D.createElement("svg",{className:"_1luule42",fill:"none",height:e,viewBox:"0 0 21 21",width:t,xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Loading"),D.createElement("clipPath",{id:n},D.createElement("path",{d:"M10.5 3C6.35786 3 3 6.35786 3 10.5C3 14.6421 6.35786 18 10.5 18C11.3284 18 12 18.6716 12 19.5C12 20.3284 11.3284 21 10.5 21C4.70101 21 0 16.299 0 10.5C0 4.70101 4.70101 0 10.5 0C16.299 0 21 4.70101 21 10.5C21 11.3284 20.3284 12 19.5 12C18.6716 12 18 11.3284 18 10.5C18 6.35786 14.6421 3 10.5 3Z"})),D.createElement("foreignObject",{clipPath:`url(#${n})`,height:"21",width:"21",x:"0",y:"0"},D.createElement("div",{className:"_1luule43"})))},tZ=[{color:"#FC5C54",emoji:"\uD83C\uDF36"},{color:"#FFD95A",emoji:"\uD83E\uDD11"},{color:"#E95D72",emoji:"\uD83D\uDC19"},{color:"#6A87C8",emoji:"\uD83E\uDED0"},{color:"#5FD0F3",emoji:"\uD83D\uDC33"},{color:"#FC5C54",emoji:"\uD83E\uDD36"},{color:"#75C06B",emoji:"\uD83C\uDF32"},{color:"#FFDD86",emoji:"\uD83C\uDF1E"},{color:"#5FC6D4",emoji:"\uD83D\uDC12"},{color:"#FF949A",emoji:"\uD83D\uDC35"},{color:"#FF8024",emoji:"\uD83E\uDD8A"},{color:"#9BA1A4",emoji:"\uD83D\uDC3C"},{color:"#EC66FF",emoji:"\uD83E\uDD84"},{color:"#FF8CBC",emoji:"\uD83D\uDC37"},{color:"#FF9A23",emoji:"\uD83D\uDC27"},{color:"#FF949A",emoji:"\uD83E\uDDA9"},{color:"#C5DADB",emoji:"\uD83D\uDC7D"},{color:"#FC5C54",emoji:"\uD83C\uDF88"},{color:"#FF949A",emoji:"\uD83C\uDF49"},{color:"#FFD95A",emoji:"\uD83C\uDF89"},{color:"#A8CE63",emoji:"\uD83D\uDC32"},{color:"#71ABFF",emoji:"\uD83C\uDF0E"},{color:"#FFE279",emoji:"\uD83C\uDF4A"},{color:"#B6B1B6",emoji:"\uD83D\uDC2D"},{color:"#FF6780",emoji:"\uD83C\uDF63"},{color:"#FFD95A",emoji:"\uD83D\uDC25"},{color:"#A575FF",emoji:"\uD83D\uDC7E"},{color:"#A8CE63",emoji:"\uD83E\uDD66"},{color:"#FC5C54",emoji:"\uD83D\uDC79"},{color:"#FFE279",emoji:"\uD83D\uDE40"},{color:"#5FD0F3",emoji:"⛱"},{color:"#4D82FF",emoji:"⛵️"},{color:"#FFE279",emoji:"\uD83E\uDD73"},{color:"#FF949A",emoji:"\uD83E\uDD2F"},{color:"#FFB35A",emoji:"\uD83E\uDD20"}],defaultAvatar=({address:e,ensImage:t,size:n})=>{let[o,i]=(0,D.useState)(!1);(0,D.useEffect)(()=>{if(t){let e=new Image;e.src=t,e.onload=()=>i(!0)}},[t]);let{color:s,emoji:l}=(0,D.useMemo)(()=>(function(e){let t=Math.abs(function(e){let t=0;if(0===e.length)return t;for(let n=0;nD.createElement("svg",{fill:"none",height:"7",width:"14",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Dropdown"),D.createElement("path",{d:"M12.75 1.54001L8.51647 5.0038C7.77974 5.60658 6.72026 5.60658 5.98352 5.0038L1.75 1.54001",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2.5",xmlns:"http://www.w3.org/2000/svg"})),tX=new class{constructor(e){for(let[t,n]of(this.listeners=new Set,this.defaultLocale="en",this.enableFallback=!1,this.locale="en",this.cachedLocales=[],this.translations={},Object.entries(e)))this.cachedLocales=[...this.cachedLocales,t],this.translations={...this.translations,...this.flattenTranslation(n,t)}}missingMessage(e){return`[missing: "${this.locale}.${e}" translation]`}flattenTranslation(e,t){let n={},flatten=(e,t)=>{for(let o of Object.keys(e)){let i=`${t}.${o}`,s=e[o];"object"==typeof s&&null!==s?flatten(s,i):n[i]=s}};return flatten(e,t),n}translateWithReplacements(e,t={}){let n=e;for(let e in t){let o=t[e];n=n.replace(`%{${e}}`,o)}return n}t(e,t,n){let o=`${this.locale}.${e}`,i=this.translations[o];if(!i){if(this.enableFallback){let n=`${this.defaultLocale}.${e}`,o=this.translations[n];if(o)return this.translateWithReplacements(o,t)}return(null==n?void 0:n.rawKeyIfTranslationMissing)?e:this.missingMessage(e)}return this.translateWithReplacements(i,t)}isLocaleCached(e){return this.cachedLocales.includes(e)}updateLocale(e){this.locale=e,this.notifyListeners()}setTranslations(e,t){let n=this.isLocaleCached(e);n||(this.cachedLocales=[...this.cachedLocales,e],this.translations={...this.translations,...this.flattenTranslation(t,e)}),this.locale=e,this.notifyListeners()}notifyListeners(){for(let e of this.listeners)e()}onChange(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}}({en:JSON.parse(N.I),"en-US":JSON.parse(N.I)});tX.defaultLocale="en-US",tX.locale="en-US",tX.enableFallback=!0;var fetchTranslations=async e=>{switch(e){case"ar":case"ar-AR":return(await n.e(4507).then(n.bind(n,24507))).default;case"en":case"en-US":default:return(await n.e(3688).then(n.bind(n,93688))).default;case"es":case"es-419":return(await n.e(2499).then(n.bind(n,32499))).default;case"fr":case"fr-FR":return(await n.e(8989).then(n.bind(n,78989))).default;case"hi":case"hi-IN":return(await n.e(9212).then(n.bind(n,19212))).default;case"id":case"id-ID":return(await n.e(2840).then(n.bind(n,52840))).default;case"ja":case"ja-JP":return(await n.e(6210).then(n.bind(n,96210))).default;case"ko":case"ko-KR":return(await n.e(1961).then(n.bind(n,61961))).default;case"pt":case"pt-BR":return(await n.e(5850).then(n.bind(n,75850))).default;case"ru":case"ru-RU":return(await n.e(6626).then(n.bind(n,46626))).default;case"th":case"th-TH":return(await n.e(5515).then(n.bind(n,25515))).default;case"tr":case"tr-TR":return(await n.e(499).then(n.bind(n,60499))).default;case"ua":case"uk-UA":return(await n.e(3760).then(n.bind(n,3760))).default;case"zh":case"zh-CN":return(await n.e(2896).then(n.bind(n,72896))).default}};async function setLocale(e){let t=tX.isLocaleCached(e);if(t){tX.updateLocale(e);return}let n=await fetchTranslations(e);tX.setTranslations(e,JSON.parse(n))}var detectedBrowserLocale=()=>{var e;if("undefined"!=typeof window&&"undefined"!=typeof navigator){if(null==(e=navigator.languages)?void 0:e.length)return navigator.languages[0];if(navigator.language)return navigator.language}},tY=(0,D.createContext)({i18n:tX}),I18nProvider=({children:e,locale:t})=>{let[n,o]=(0,D.useState)(0),i=(0,D.useMemo)(()=>detectedBrowserLocale(),[]);(0,D.useEffect)(()=>{let e=tX.onChange(()=>{o(e=>e+1)});return e},[]),(0,D.useEffect)(()=>{t&&t!==tX.locale?setLocale(t):!t&&i&&i!==tX.locale&&setLocale(i)},[t,i]);let s=(0,D.useMemo)(()=>({t:(e,t)=>tX.t(e,t),i18n:tX}),[n]);return D.createElement(tY.Provider,{value:s},e)};function isNotNullish(e){return null!=e}var t$={iconBackground:"#96bedc",iconUrl:async()=>(await n.e(1727).then(n.bind(n,1727))).default},t0={iconBackground:"#e84141",iconUrl:async()=>(await n.e(6237).then(n.bind(n,36237))).default},t1={iconBackground:"#0052ff",iconUrl:async()=>(await n.e(1711).then(n.bind(n,41711))).default},t6={iconBackground:"#ebac0e",iconUrl:async()=>(await n.e(4253).then(n.bind(n,84253))).default},t3={iconBackground:"#002D74",iconUrl:async()=>(await n.e(5939).then(n.bind(n,95939))).default},t2={iconBackground:"#484c50",iconUrl:async()=>(await n.e(5488).then(n.bind(n,85488))).default},t7={iconBackground:"#ff5a57",iconUrl:async()=>(await n.e(704).then(n.bind(n,60704))).default},t8={iconBackground:"#9f71ec",iconUrl:async()=>(await n.e(8881).then(n.bind(n,48881))).default},t5={iconBackground:"#f9f7ec",iconUrl:async()=>(await n.e(135).then(n.bind(n,70135))).default},t4={iconBackground:"#f9f7ec",iconUrl:async()=>(await n.e(4583).then(n.bind(n,94583))).default},t9={iconBackground:"#000000",iconUrl:async()=>(await n.e(5119).then(n.bind(n,65119))).default},re=Object.fromEntries(Object.values({arbitrum:{chainId:42161,name:"Arbitrum",...t$},arbitrumGoerli:{chainId:421613,...t$},arbitrumSepolia:{chainId:421614,...t$},avalanche:{chainId:43114,...t0},avalancheFuji:{chainId:43113,...t0},base:{chainId:8453,name:"Base",...t1},baseGoerli:{chainId:84531,...t1},baseSepolia:{chainId:84532,...t1},bsc:{chainId:56,name:"BSC",...t6},bscTestnet:{chainId:97,...t6},cronos:{chainId:25,...t3},cronosTestnet:{chainId:338,...t3},goerli:{chainId:5,...t2},hardhat:{chainId:31337,iconBackground:"#f9f7ec",iconUrl:async()=>(await n.e(6253).then(n.bind(n,26253))).default},holesky:{chainId:17e3,...t2},kovan:{chainId:42,...t2},localhost:{chainId:1337,...t2},mainnet:{chainId:1,name:"Ethereum",...t2},optimism:{chainId:10,name:"Optimism",...t7},optimismGoerli:{chainId:420,...t7},optimismKovan:{chainId:69,...t7},optimismSepolia:{chainId:11155420,...t7},polygon:{chainId:137,name:"Polygon",...t8},polygonMumbai:{chainId:80001,...t8},rinkeby:{chainId:4,...t2},ropsten:{chainId:3,...t2},ronin:{chainId:2020,iconBackground:"#1273EA",iconUrl:async()=>(await n.e(1424).then(n.bind(n,81424))).default},sepolia:{chainId:11155111,...t2},xdc:{chainId:50,name:"XinFin",...t5},xdcTestnet:{chainId:51,...t5},zkSync:{chainId:324,name:"zkSync",...t4},zkSyncTestnet:{chainId:280,...t4},zora:{chainId:7777777,name:"Zora",...t9},zoraSepolia:{chainId:999999999,...t9},zoraTestnet:{chainId:999,...t9}}).filter(isNotNullish).map(({chainId:e,...t})=>[e,t])),provideRainbowKitChains=e=>e.map(e=>{var t,n,o,i;let s=null!=(t=re[e.id])?t:{};return{...e,name:null!=(n=s.name)?n:e.name,iconUrl:null!=(o=e.iconUrl)?o:s.iconUrl,iconBackground:null!=(i=e.iconBackground)?i:s.iconBackground}}),rt=(0,D.createContext)({chains:[]});function RainbowKitChainProvider({children:e,initialChain:t}){let{chains:n}=(0,z.Z)();return D.createElement(rt.Provider,{value:(0,D.useMemo)(()=>({chains:provideRainbowKitChains(n),initialChainId:"number"==typeof t?t:null==t?void 0:t.id}),[n,t])},e)}var useRainbowKitChains=()=>(0,D.useContext)(rt).chains,useInitialChainId=()=>(0,D.useContext)(rt).initialChainId,useRainbowKitChainsById=()=>{let e=useRainbowKitChains();return(0,D.useMemo)(()=>{let t={};for(let n of e)t[n.id]=n;return t},[e])},rr=(0,D.createContext)({showBalance:void 0,setShowBalance:()=>{}});function ShowBalanceProvider({children:e}){let[t,n]=(0,D.useState)();return D.createElement(rr.Provider,{value:{showBalance:t,setShowBalance:n}},e)}var useShowBalance=()=>(0,D.useContext)(rr);function useIsMainnetConfigured(){let e=useRainbowKitChains(),t=ex.R.id,n=e.some(e=>e.id===t);return n}function useMainnetEnsAvatar(e){var t;let n=useIsMainnetConfigured(),{data:o}=function(e={}){let{name:t,query:n={}}=e,o=(0,z.Z)(e),i=useChainId(),s=function(e,t={}){return{async queryFn({queryKey:t}){let{name:n,scopeKey:o,...i}=t[1];if(!n)throw Error("name is required");return function(e,t){let{chainId:n,...o}=t,i=e.getClient({chainId:n}),s=(0,K.s)(i,getEnsAvatar,"getEnsAvatar");return s(o)}(e,{...i,name:n})},queryKey:function(e={}){return["ensAvatar",filterQueryOptions(e)]}(t)}}(o,{...e,chainId:e.chainId??i}),l=!!(t&&(n.enabled??!0));return query_useQuery({...n,...s,enabled:l})}({chainId:ex.R.id,name:e?(t=function(e,t,n){if(!e)return[];init();let o=0;return e.split(".").map(e=>{let i=function(e){let t=[];for(let n=0,o=e.length;n0;)if(95!==e[--t])throw Error("underscore allowed only at start")}(f),!(s.emoji=l>1||o[0].is_emoji)&&f.every(e=>e<128))!function(e){if(e.length>=4&&45==e[2]&&45==e[3])throw Error(`invalid label extension: "${str_from_cps(e.slice(0,4))}"`)}(f),e="ASCII";else{let t=o.flatMap(e=>e.is_emoji?[]:e);if(t.length){if(d.has(f[0]))throw error_placement("leading combining mark");for(let e=1;egroup_has_cp(e,n));if(!e.length){if(m.some(e=>group_has_cp(e,n)))throw error_group_member(t[0],n);throw error_disallowed(n)}if(t=e,1==e.length)break}return t}(n);(function(e,t){for(let n of t)if(!group_has_cp(e,n))throw error_group_member(e,n);if(e.M){let e=decomposed(t).map(unpack_cp);for(let t=1,n=e.length;t4)throw Error(`excessive non-spacing marks: ${bidi_qq(safe_str_from_cps(e.slice(t-1,o)))} (${o-t}/4)`);t=o}}})(i,t),function(e,t){let n;let o=[];for(let e of t){let t=b.get(e);if(1===t)return;if(t){let o=t.M.get(e);if(!(n=n?n.filter(e=>o.has(e)):Array_from(o)).length)return}else o.push(e)}if(n){for(let t of n)if(o.every(e=>group_has_cp(t,e)))throw Error(`whole-script confusable: ${e.N}/${t.N}`)}}(i,n),e=i.N}else e="Emoji"}s.type=e}catch(e){s.error=e}return s})}(e,nfc,filter_fe0f)).map(({input:e,error:n,output:o})=>{if(n){let o=n.message;throw Error(1==t.length?o:`Invalid label ${bidi_qq(safe_str_from_cps(e))}: ${o}`)}return str_from_cps(o)}).join("."):void 0,query:{enabled:n}});return o}function useMainnetEnsName(e){let t=useIsMainnetConfigured(),{data:n}=function(e={}){let{address:t,query:n={}}=e,o=(0,z.Z)(e),i=useChainId(),s=function(e,t={}){return{async queryFn({queryKey:t}){let{address:n,scopeKey:o,...i}=t[1];if(!n)throw Error("address is required");return function(e,t){let{chainId:n,...o}=t,i=e.getClient({chainId:n}),s=(0,K.s)(i,getEnsName,"getEnsName");return s(o)}(e,{...i,address:n})},queryKey:function(e={}){return["ensName",filterQueryOptions(e)]}(t)}}(o,{...e,chainId:e.chainId??i}),l=!!(t&&(n.enabled??!0));return query_useQuery({...n,...s,enabled:l})}({chainId:ex.R.id,address:e,query:{enabled:t}});return n}function dist_useChainId(){var e;let{chain:t}=(0,_.m)();return null!=(e=null==t?void 0:t.id)?e:null}var rn="rk-transactions";function loadData(){return function(e){try{let t=e?JSON.parse(e):{};return"object"==typeof t?t:{}}catch{return{}}}("undefined"!=typeof localStorage?localStorage.getItem(rn):null)}var ra=/^0x([A-Fa-f0-9]{64})$/,ro=(0,D.createContext)(null);function TransactionStoreProvider({children:e}){let t=function(e={}){let t=(0,z.Z)(e);return(0,e5.useSyncExternalStoreWithSelector)(e=>(function(e,t){let{onChange:n}=t;return e.subscribe(()=>getPublicClient(e),n,{equalityFn:(e,t)=>e?.uid===t?.uid})})(t,{onChange:e}),()=>getPublicClient(t,e),()=>getPublicClient(t,e),e=>e,(e,t)=>e?.uid===t?.uid)}(),{address:n}=(0,_.m)(),o=dist_useChainId(),[i]=(0,D.useState)(()=>null!=T?T:T=function({provider:e}){let t=loadData(),n=e,o=new Set,i=new Map;function getTransactions(e,n){var o,i;return null!=(i=null==(o=t[e])?void 0:o[n])?i:[]}function setTransactionStatus(e,t,n,o){updateTransactions(e,t,e=>e.map(e=>e.hash===n?{...e,status:o}:e))}async function waitForPendingTransactions(e,t){await Promise.all(getTransactions(e,t).filter(e=>"pending"===e.status).map(async o=>{let{confirmations:s,hash:l}=o,c=i.get(l);if(c)return await c;let u=n.waitForTransactionReceipt({confirmations:s,hash:l,timeout:3e5}).then(({status:n})=>{i.delete(l),void 0!==n&&setTransactionStatus(e,t,l,0===n||"reverted"===n?"failed":"confirmed")}).catch(()=>{setTransactionStatus(e,t,l,"failed")});return i.set(l,u),await u}))}function updateTransactions(e,n,i){var s,l;(t=loadData())[e]=null!=(s=t[e])?s:{};let c=0,u=i(null!=(l=t[e][n])?l:[]).filter(({status:e})=>"pending"===e||c++<=10);t[e][n]=u.length>0?u:void 0,localStorage.setItem(rn,JSON.stringify(t)),function(){for(let e of o)e()}(),waitForPendingTransactions(e,n)}return{addTransaction:function(e,t,n){let o=function(e){let t=[];return ra.test(e.hash)||t.push("Invalid transaction hash"),"string"!=typeof e.description&&t.push("Transaction must have a description"),void 0!==e.confirmations&&(!Number.isInteger(e.confirmations)||e.confirmations<1)&&t.push("Transaction confirmations must be a positiver integer"),t}(n);if(o.length>0)throw Error(["Unable to add transaction",...o].join("\n"));updateTransactions(e,t,e=>[{...n,status:"pending"},...e.filter(({hash:e})=>e!==n.hash)])},clearTransactions:function(e,t){updateTransactions(e,t,()=>[])},getTransactions,onChange:function(e){return o.add(e),()=>{o.delete(e)}},setProvider:function(e){n=e},waitForPendingTransactions}}({provider:t}));return(0,D.useEffect)(()=>{i.setProvider(t)},[i,t]),(0,D.useEffect)(()=>{n&&o&&i.waitForPendingTransactions(n,o)},[i,n,o]),D.createElement(ro.Provider,{value:i},e)}function useTransactionStore(){let e=(0,D.useContext)(ro);if(!e)throw Error("Transaction hooks must be used within RainbowKitProvider");return e}function useRecentTransactions(){let e=useTransactionStore(),{address:t}=(0,_.m)(),n=dist_useChainId(),[o,i]=(0,D.useState)(()=>e&&t&&n?e.getTransactions(t,n):[]);return(0,D.useEffect)(()=>{if(e&&t&&n)return i(e.getTransactions(t,n)),e.onChange(()=>{i(e.getTransactions(t,n))})},[e,t,n]),o}var resolveThemeVars=e=>"function"==typeof e?e():e;function cssStringFromTheme(e,t={}){return Object.entries(function(e,{extends:t}={}){let n={...assignInlineVars(tz,resolveThemeVars(e))};if(!t)return n;let o=assignInlineVars(tz,resolveThemeVars(t)),i=Object.fromEntries(Object.entries(n).filter(([e,t])=>t!==o[e]));return i}(e,t)).map(([e,t])=>`${e}:${t.replace(/[:;{}]/g,"")};`).join("")}var ri={appName:void 0,disclaimer:void 0,learnMoreUrl:"https://learn.rainbow.me/understanding-web3?utm_source=rainbowkit&utm_campaign=learnmore"},rs=(0,D.createContext)(ri),rl=(0,D.createContext)(!1),useWindowSize=()=>{let[e,t]=(0,D.useState)({height:void 0,width:void 0});return(0,D.useEffect)(()=>{var e;let n;let o=(e=()=>{t({height:window.innerHeight,width:window.innerWidth})},()=>{n&&clearTimeout(n),n=setTimeout(()=>{n=null,e()},500)});return window.addEventListener("resize",o),o(),()=>window.removeEventListener("resize",o)},[]),e},rc=(0,D.createContext)({connector:null,setConnector:()=>{}});function WalletButtonProvider({children:e}){let[t,n]=(0,D.useState)(null);return D.createElement(rc.Provider,{value:(0,D.useMemo)(()=>({connector:t,setConnector:n}),[t])},e)}var ru={COMPACT:"compact",WIDE:"wide"},rd=(0,D.createContext)(ru.WIDE);function ModalSizeProvider({children:e,modalSize:t}){let{width:n}=useWindowSize(),{connector:o}=(0,D.useContext)(rc);return D.createElement(rd.Provider,{value:n&&n<768||o?ru.COMPACT:t},e)}var rp=(0,D.createContext)(!1);function isSafari(){return"undefined"!=typeof navigator&&/Version\/([0-9._]+).*Safari/.test(navigator.userAgent)}function getBrowser(){var e;if("undefined"==typeof navigator)return"Browser";let t=navigator.userAgent.toLowerCase();return(null==(e=navigator.brave)?void 0:e.isBrave)?"Brave":t.indexOf("edg/")>-1?"Edge":t.indexOf("op")>-1?"Opera":"undefined"!=typeof document&&""!==getComputedStyle(document.body).getPropertyValue("--arc-palette-focus")?"Arc":t.indexOf("chrome")>-1?"Chrome":t.indexOf("firefox")>-1?"Firefox":isSafari()?"Safari":"Browser"}var{os:rh}=(0,tE.UAParser)();function getPlatform(){return"Windows"===rh.name?"Windows":"Mac OS"===rh.name?"macOS":["Ubuntu","Mint","Fedora","Debian","Arch","Linux"].includes(rh.name)?"Linux":"Desktop"}var getExtensionDownloadUrl=e=>{var t,n,o,i,s,l,c,u,d,p,f,m;let g=getBrowser();return null!=(m=({Arc:null==(t=null==e?void 0:e.downloadUrls)?void 0:t.chrome,Brave:null==(n=null==e?void 0:e.downloadUrls)?void 0:n.chrome,Chrome:null==(o=null==e?void 0:e.downloadUrls)?void 0:o.chrome,Edge:(null==(i=null==e?void 0:e.downloadUrls)?void 0:i.edge)||(null==(s=null==e?void 0:e.downloadUrls)?void 0:s.chrome),Firefox:null==(l=null==e?void 0:e.downloadUrls)?void 0:l.firefox,Opera:(null==(c=null==e?void 0:e.downloadUrls)?void 0:c.opera)||(null==(u=null==e?void 0:e.downloadUrls)?void 0:u.chrome),Safari:null==(d=null==e?void 0:e.downloadUrls)?void 0:d.safari,Browser:null==(p=null==e?void 0:e.downloadUrls)?void 0:p.browserExtension})[g])?m:null==(f=null==e?void 0:e.downloadUrls)?void 0:f.browserExtension},getMobileDownloadUrl=e=>{var t,n,o,i;let s=isIOS();return null!=(i=s?null==(t=null==e?void 0:e.downloadUrls)?void 0:t.ios:null==(n=null==e?void 0:e.downloadUrls)?void 0:n.android)?i:null==(o=null==e?void 0:e.downloadUrls)?void 0:o.mobile},getDesktopDownloadUrl=e=>{var t,n,o,i,s,l;let c=getPlatform();return null!=(l=({Windows:null==(t=null==e?void 0:e.downloadUrls)?void 0:t.windows,macOS:null==(n=null==e?void 0:e.downloadUrls)?void 0:n.macos,Linux:null==(o=null==e?void 0:e.downloadUrls)?void 0:o.linux,Desktop:null==(i=null==e?void 0:e.downloadUrls)?void 0:i.desktop})[c])?l:null==(s=null==e?void 0:e.downloadUrls)?void 0:s.desktop},isRecentWallet=(e,t)=>e.some(e=>e.id===t),isRainbowKitConnector=e=>!!e.isRainbowKitConnector,isEIP6963Connector=e=>{var t;return!!(!e.isRainbowKitConnector&&(null==(t=e.icon)?void 0:t.startsWith("data:image"))&&e.uid&&e.name)},rainbowKitConnectorWithWalletConnect=(e,t)=>{let n="walletConnect"===e.id&&t;return n?{...e,walletConnectModalConnector:t}:e},connectorsWithRecentWallets=({wallets:e,recentWallets:t})=>[...t,...e.filter(e=>!isRecentWallet(t,e.id))],rf="rk-recent";function getRecentWalletIds(){return"undefined"!=typeof localStorage?function(e){try{let t=e?JSON.parse(e):[];return Array.isArray(t)?t:[]}catch{return[]}}(localStorage.getItem(rf)):[]}function useWalletConnectors(e=!1){var t,n,o,i;let s=useRainbowKitChains(),l=useInitialChainId(),{connectAsync:c,connectors:u}=function(e={}){let{mutation:t}=e,n=(0,z.Z)(e),o=function(e={}){let t=(0,z.Z)(e);return(0,D.useSyncExternalStore)(e=>(function(e,t){let{onChange:n}=t;return e._internal.connectors.subscribe((e,t)=>{n(Object.values(e),t)})})(t,{onChange:e}),()=>getConnectors(t),()=>getConnectors(t))}({config:n}),{mutate:i,mutateAsync:s,...l}=(0,e9.D)({...t,mutationFn:e=>connect(n,e),mutationKey:["connect"]});return(0,D.useEffect)(()=>n.subscribe(({status:e})=>e,(e,t)=>{"connected"===t&&"disconnected"===e&&l.reset()}),[n,l]),{...l,connect:i,connectAsync:s,connectors:o}}(),{setIsWalletConnectModalOpen:d}=useWalletConnectOpenState(),p=u.map(e=>({...e,...e.rkDetails||{}}));async function connectWallet(e){var t,n,o;let i=await e.getChainId(),u=await c({chainId:null!=(o=null!=l?l:null==(t=s.find(({id:e})=>e===i))?void 0:t.id)?o:null==(n=s[0])?void 0:n.id,connector:e});return u&&function(e){var t;let n=(t=[e,...getRecentWalletIds()],[...new Set(t)]);localStorage.setItem(rf,JSON.stringify(n))}(e.id),u}async function connectToWalletConnectModal(e){try{d(!0),await connectWallet(e),d(!1)}catch(t){let e="UserRejectedRequestError"===t.name||"Connection request reset. Please try again."===t.message;if(d(!1),!e)throw t}}let getWalletConnectUri=async(e,t)=>{let n=await e.getProvider();return"coinbase"===e.id?n.qrUrl:new Promise(e=>n.once("display_uri",n=>{e(t(n))}))},f=p.find(e=>"walletConnect"===e.id&&e.isWalletConnectModalConnector),m=p.filter(isEIP6963Connector).map(e=>({...e,groupIndex:0})),g=p.filter(isRainbowKitConnector).filter(e=>!e.isWalletConnectModalConnector).filter(t=>{if(!e)return!0;let n=m.some(e=>e.id===t.rdns);return!n}).map(e=>rainbowKitConnectorWithWalletConnect(e,f)),b=[...m,...g],y=function(e,t){let n={};for(let o of e){let e=t(o);e&&(n[e]=o)}return n}(b,e=>e.id),v=getRecentWalletIds().map(e=>y[e]).filter(Boolean).slice(0,3),w=[],C=connectorsWithRecentWallets({wallets:b,recentWallets:v});for(let e of C){if(!e)continue;let s=isEIP6963Connector(e),l=isRecentWallet(v,e.id);if(s){w.push({...e,iconUrl:e.icon,ready:!0,connect:()=>connectWallet(e),groupName:"Installed",recent:l});continue}w.push({...e,ready:null==(t=e.installed)||t,connect:()=>connectWallet(e),desktopDownloadUrl:getDesktopDownloadUrl(e),extensionDownloadUrl:getExtensionDownloadUrl(e),groupName:e.groupName,mobileDownloadUrl:getMobileDownloadUrl(e),getQrCodeUri:(null==(n=e.qrCode)?void 0:n.getUri)?()=>getWalletConnectUri(e,e.qrCode.getUri):void 0,getDesktopUri:(null==(o=e.desktop)?void 0:o.getUri)?()=>getWalletConnectUri(e,e.desktop.getUri):void 0,getMobileUri:(null==(i=e.mobile)?void 0:i.getUri)?()=>{var t;return getWalletConnectUri(e,null==(t=e.mobile)?void 0:t.getUri)}:void 0,recent:l,showWalletConnectModal:e.walletConnectModalConnector?()=>connectToWalletConnectModal(e.walletConnectModalConnector):void 0})}return w}var src=async()=>(await n.e(794).then(n.bind(n,20794))).default,preloadAssetsIcon=()=>loadImages(src),AssetsIcon=()=>D.createElement(AsyncImage,{background:"#d0d5de",borderRadius:"10",height:"48",src,width:"48"}),src2=async()=>(await n.e(3200).then(n.bind(n,3200))).default,preloadLoginIcon=()=>loadImages(src2),LoginIcon=()=>D.createElement(AsyncImage,{background:"#d0d5de",borderRadius:"10",height:"48",src:src2,width:"48"}),rm=D.forwardRef(({as:e="div",children:t,className:n,color:o,display:i,font:s="body",id:l,size:c="16",style:u,tabIndex:d,textAlign:p="inherit",weight:f="regular",testId:m},g)=>D.createElement(tQ,{as:e,className:n,color:o,display:i,fontFamily:s,fontSize:c,fontWeight:f,id:l,ref:g,style:u,tabIndex:d,textAlign:p,testId:m},t));rm.displayName="Text";var rg={large:{fontSize:"16",paddingX:"24",paddingY:"10"},medium:{fontSize:"14",height:"28",paddingX:"12",paddingY:"4"},small:{fontSize:"14",paddingX:"10",paddingY:"5"}};function ActionButton({disabled:e=!1,href:t,label:n,onClick:o,rel:i="noreferrer noopener",size:s="medium",target:l="_blank",testId:c,type:u="primary"}){let d="primary"===u,p="large"!==s,f=isMobile(),m=e?"actionButtonSecondaryBackground":d?"accentColor":p?"actionButtonSecondaryBackground":null,{fontSize:g,height:b,paddingX:y,paddingY:v}=rg[s];return D.createElement(tQ,{...t?e?{}:{as:"a",href:t,rel:i,target:l}:{as:"button",type:"button"},onClick:e?void 0:o,...f&&p?{}:{borderColor:!f||p||d?"actionButtonBorder":"actionButtonBorderMobile",borderStyle:"solid",borderWidth:"1"},borderRadius:"actionButton",className:!e&&touchableStyles({active:"shrinkSm",hover:"grow"}),display:"block",paddingX:y,paddingY:v,style:{willChange:"transform"},testId:c,textAlign:"center",transition:"transform",...m?{background:m}:{},...b?{height:b}:{}},D.createElement(rm,{color:e?"modalTextSecondary":d?"accentColorForeground":"accentColor",size:g,weight:"bold"},n))}var CloseIcon=()=>isMobile()?D.createElement("svg",{"aria-hidden":!0,fill:"none",height:"11.5",viewBox:"0 0 11.5 11.5",width:"11.5",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Close"),D.createElement("path",{d:"M2.13388 0.366117C1.64573 -0.122039 0.854272 -0.122039 0.366117 0.366117C-0.122039 0.854272 -0.122039 1.64573 0.366117 2.13388L3.98223 5.75L0.366117 9.36612C-0.122039 9.85427 -0.122039 10.6457 0.366117 11.1339C0.854272 11.622 1.64573 11.622 2.13388 11.1339L5.75 7.51777L9.36612 11.1339C9.85427 11.622 10.6457 11.622 11.1339 11.1339C11.622 10.6457 11.622 9.85427 11.1339 9.36612L7.51777 5.75L11.1339 2.13388C11.622 1.64573 11.622 0.854272 11.1339 0.366117C10.6457 -0.122039 9.85427 -0.122039 9.36612 0.366117L5.75 3.98223L2.13388 0.366117Z",fill:"currentColor"})):D.createElement("svg",{"aria-hidden":!0,fill:"none",height:"10",viewBox:"0 0 10 10",width:"10",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Close"),D.createElement("path",{d:"M1.70711 0.292893C1.31658 -0.0976311 0.683417 -0.0976311 0.292893 0.292893C-0.0976311 0.683417 -0.0976311 1.31658 0.292893 1.70711L3.58579 5L0.292893 8.29289C-0.0976311 8.68342 -0.0976311 9.31658 0.292893 9.70711C0.683417 10.0976 1.31658 10.0976 1.70711 9.70711L5 6.41421L8.29289 9.70711C8.68342 10.0976 9.31658 10.0976 9.70711 9.70711C10.0976 9.31658 10.0976 8.68342 9.70711 8.29289L6.41421 5L9.70711 1.70711C10.0976 1.31658 10.0976 0.683417 9.70711 0.292893C9.31658 -0.0976311 8.68342 -0.0976311 8.29289 0.292893L5 3.58579L1.70711 0.292893Z",fill:"currentColor"})),CloseButton=({"aria-label":e="Close",onClose:t})=>{let n=isMobile();return D.createElement(tQ,{alignItems:"center","aria-label":e,as:"button",background:"closeButtonBackground",borderColor:"actionButtonBorder",borderRadius:"full",borderStyle:"solid",borderWidth:n?"0":"1",className:touchableStyles({active:"shrinkSm",hover:"growLg"}),color:"closeButton",display:"flex",height:n?"30":"28",justifyContent:"center",onClick:t,style:{willChange:"transform"},transition:"default",type:"button",width:n?"30":"28"},D.createElement(CloseIcon,null))},signInIcon=async()=>(await n.e(2898).then(n.bind(n,92898))).default;function SignIn({onClose:e,onCloseModal:t}){let{i18n:n}=(0,D.useContext)(tY),[{status:o,...i},s]=D.useState({status:"idle"}),l=function(){var e;let{adapter:t}=null!=(e=(0,D.useContext)(tW))?e:{};if(!t)throw Error("No authentication adapter found");return t}(),c=(0,D.useCallback)(async()=>{try{let e=await l.getNonce();s(t=>({...t,nonce:e}))}catch{s(e=>({...e,errorMessage:n.t("sign_in.message.preparing_error"),status:"idle"}))}},[l,n.t]),u=(0,D.useRef)(!1);D.useEffect(()=>{u.current||(u.current=!0,c())},[c]);let d=isMobile(),{address:p,chain:f}=(0,_.m)(),{signMessageAsync:m}=(0,tx.Q)(),signIn=async()=>{try{let e;let o=null==f?void 0:f.id,{nonce:c}=i;if(!p||!o||!c)return;s(e=>({...e,errorMessage:void 0,status:"signing"}));let u=l.createMessage({address:p,chainId:o,nonce:c});try{e=await m({message:l.getMessageBody({message:u})})}catch(e){if(e instanceof et.ab)return s(e=>({...e,status:"idle"}));return s(e=>({...e,errorMessage:n.t("sign_in.signature.signing_error"),status:"idle"}))}s(e=>({...e,status:"verifying"}));try{let n=await l.verify({message:u,signature:e});if(n){t();return}throw Error()}catch{return s(e=>({...e,errorMessage:n.t("sign_in.signature.verifying_error"),status:"idle"}))}}catch{s({errorMessage:n.t("sign_in.signature.oops_error"),status:"idle"})}};return D.createElement(tQ,{position:"relative"},D.createElement(tQ,{display:"flex",paddingRight:"16",paddingTop:"16",position:"absolute",right:"0"},D.createElement(CloseButton,{onClose:e})),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:d?"32":"24",padding:"24",paddingX:"18",style:{paddingTop:d?"60px":"36px"}},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:d?"6":"4",style:{maxWidth:d?320:280}},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:d?"32":"16"},D.createElement(AsyncImage,{height:40,src:signInIcon,width:40}),D.createElement(rm,{color:"modalText",size:d?"20":"18",textAlign:"center",weight:"heavy"},n.t("sign_in.label"))),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:d?"16":"12"},D.createElement(rm,{color:"modalTextSecondary",size:d?"16":"14",textAlign:"center"},n.t("sign_in.description")),"idle"===o&&i.errorMessage?D.createElement(rm,{color:"error",size:d?"16":"14",textAlign:"center",weight:"bold"},i.errorMessage):null)),D.createElement(tQ,{alignItems:d?void 0:"center",display:"flex",flexDirection:"column",gap:"8",width:"full"},D.createElement(ActionButton,{disabled:!i.nonce||"signing"===o||"verifying"===o,label:i.nonce?"signing"===o?n.t("sign_in.signature.waiting"):"verifying"===o?n.t("sign_in.signature.verifying"):n.t("sign_in.message.send"):n.t("sign_in.message.preparing"),onClick:signIn,size:d?"large":"medium",testId:"auth-message-button"}),d?D.createElement(ActionButton,{label:"Cancel",onClick:e,size:"large",type:"secondary"}):D.createElement(tQ,{as:"button",borderRadius:"full",className:touchableStyles({active:"shrink",hover:"grow"}),display:"block",onClick:e,paddingX:"10",paddingY:"5",rel:"noreferrer",style:{willChange:"transform"},target:"_blank",transition:"default"},D.createElement(rm,{color:"closeButton",size:d?"16":"14",weight:"bold"},n.t("sign_in.message.cancel"))))))}var rb="WALLETCONNECT_DEEPLINK_CHOICE";function clearWalletConnectDeepLink(){localStorage.removeItem(rb)}var ry=(0,D.createContext)(void 0),rv="data-rk",createThemeRootProps=e=>({[rv]:e||""}),createThemeRootSelector=e=>{if(e&&!/^[a-zA-Z0-9_]+$/.test(e))throw Error(`Invalid ID: ${e}`);return e?`[${rv}="${e}"]`:`[${rv}]`},useThemeRootProps=()=>{let e=(0,D.useContext)(ry);return createThemeRootProps(e)},rw=lightTheme();function RainbowKitProvider({appInfo:e,avatar:t,children:n,coolMode:o=!1,id:i,initialChain:s,locale:l,modalSize:c=ru.WIDE,showRecentTransactions:u=!1,theme:d=rw}){if(!function(){let e=useRainbowKitChains(),t=useWalletConnectors(),n="unauthenticated"===useAuthenticationStatus(),o=(0,D.useCallback)(()=>{loadImages(...t.map(e=>e.iconUrl),...e.map(e=>e.iconUrl).filter(isNotNullish)),isMobile()||(preloadAssetsIcon(),preloadLoginIcon()),n&&loadImages(signInIcon)},[t,e,n]);(0,D.useEffect)(()=>{o()},[o])}(),!function(){let e=(0,D.useCallback)(()=>{!function({version:e}){localStorage.setItem("rk-version",e)}({version:"2.0.2"})},[]);(0,D.useEffect)(()=>{e()},[e])}(),useAccountEffect_useAccountEffect({onDisconnect:clearWalletConnectDeepLink}),"function"==typeof d)throw Error('A theme function was provided to the "theme" prop instead of a theme object. You must execute this function to get the resulting theme object.');let p=createThemeRootSelector(i),f={...ri,...e},m=null!=t?t:defaultAvatar;return D.createElement(RainbowKitChainProvider,{initialChain:s},D.createElement(WalletButtonProvider,null,D.createElement(I18nProvider,{locale:l},D.createElement(rl.Provider,{value:o},D.createElement(ModalSizeProvider,{modalSize:c},D.createElement(rp.Provider,{value:u},D.createElement(TransactionStoreProvider,null,D.createElement(tJ.Provider,{value:m},D.createElement(rs.Provider,{value:f},D.createElement(ry.Provider,{value:i},D.createElement(ShowBalanceProvider,null,D.createElement(ModalProvider,null,d?D.createElement("div",{...createThemeRootProps(i)},D.createElement("style",{dangerouslySetInnerHTML:{__html:[`${p}{${cssStringFromTheme("lightMode"in d?d.lightMode:d)}}`,"darkMode"in d?`@media(prefers-color-scheme:dark){${p}{${cssStringFromTheme(d.darkMode,{extends:d.lightMode})}}}`:null].join("")}}),n):n))))))))))))}var moveFocusWithin=(e,t)=>{let n=e.querySelectorAll("button:not(:disabled), a[href]");0!==n.length&&n["end"===t?n.length-1:0].focus()};function FocusTrap(e){let t=(0,D.useRef)(null);return(0,D.useEffect)(()=>{let e=document.activeElement;return()=>{var t;null==(t=e.focus)||t.call(e)}},[]),(0,D.useEffect)(()=>{if(t.current){let e=t.current.querySelector("[data-auto-focus]");e?e.focus():t.current.focus()}},[]),D.createElement(D.Fragment,null,D.createElement("div",{onFocus:(0,D.useCallback)(()=>t.current&&moveFocusWithin(t.current,"end"),[]),tabIndex:0}),D.createElement("div",{ref:t,style:{outline:"none"},tabIndex:-1,...e}),D.createElement("div",{onFocus:(0,D.useCallback)(()=>t.current&&moveFocusWithin(t.current,"start"),[]),tabIndex:0}))}var stopPropagation=e=>e.stopPropagation();function Dialog({children:e,onClose:t,open:n,titleId:o}){(0,D.useEffect)(()=>{let handleEscape=e=>n&&"Escape"===e.key&&t();return document.addEventListener("keydown",handleEscape),()=>document.removeEventListener("keydown",handleEscape)},[n,t]);let[i,s]=(0,D.useState)(!0);(0,D.useEffect)(()=>{s("hidden"!==getComputedStyle(window.document.body).overflow)},[]);let l=(0,D.useCallback)(()=>t(),[t]),c=useThemeRootProps(),u=isMobile();return D.createElement(D.Fragment,null,n?(0,tr.createPortal)(D.createElement(tv,{enabled:i},D.createElement(tQ,{...c},D.createElement(tQ,{...c,alignItems:u?"flex-end":"center","aria-labelledby":o,"aria-modal":!0,className:"_9pm4ki3 ju367v9h ju367vb3 ju367va ju367v2q ju367v8q",onClick:l,position:"fixed",role:"dialog"},D.createElement(FocusTrap,{className:"_9pm4ki5 ju367va ju367v15 ju367v8r",onClick:stopPropagation,role:"document"},e)))),document.body):null)}function DialogContent({bottomSheetOnMobile:e=!1,children:t,marginTop:n,padding:o="16",paddingBottom:i,wide:s=!1}){let l=isMobile(),c=(0,D.useContext)(rd),u=c===ru.COMPACT;return D.createElement(tQ,{marginTop:n},D.createElement(tQ,{className:[s?l?"_1ckjpok2 _1ckjpok1 ju367vb6 ju367vdr ju367vp ju367vt ju367vv ju367vel ju367va ju367v15 ju367v6c ju367v8r":u?"_1ckjpok4 _1ckjpok1 ju367vb6 ju367vdr ju367vp ju367vt ju367vv ju367vel ju367va ju367v15 ju367v6c ju367v8r":"_1ckjpok3 _1ckjpok1 ju367vb6 ju367vdr ju367vp ju367vt ju367vv ju367vel ju367va ju367v15 ju367v6c ju367v8r":"_1ckjpok1 ju367vb6 ju367vdr ju367vp ju367vt ju367vv ju367vel ju367va ju367v15 ju367v6c ju367v8r",l?"_1ckjpok6 ju367vq":null,l&&e?"_1ckjpok7":null].join(" ")},D.createElement(tQ,{padding:o,paddingBottom:null!=i?i:o},t)))}var rC=["k","m","b","t"];function toPrecision(e,t=1){return e.toString().replace(RegExp(`(.+\\.\\d{${t}})\\d+`),"$1").replace(/(\.[1-9]*)0+$/,"$1").replace(/\.$/,"")}function abbreviateETHBalance(e){if(e<1)return toPrecision(e,3);if(e<100)return toPrecision(e,2);if(e<1e4)return new Intl.NumberFormat().format(parseFloat(toPrecision(e,1)));let t=String(e);for(let n=rC.length-1;n>=0;n--){let o=10**((n+1)*3);if(o<=e){t=toPrecision(e=10*e/o/10,1)+rC[n];break}}return t}function formatAddress(e){return e.length<8?e:`${e.substring(0,4)}\u2026${e.substring(e.length-4)}`}function formatENS(e){if(!e)return"";let t=e.split("."),n=t.pop();return t.join(".").length>24?`${t.join(".").substring(0,24)}...`:`${t.join(".")}.${n}`}var CopiedIcon=()=>D.createElement("svg",{fill:"none",height:"13",viewBox:"0 0 13 13",width:"13",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Copied"),D.createElement("path",{d:"M4.94568 12.2646C5.41052 12.2646 5.77283 12.0869 6.01892 11.7109L12.39 1.96973C12.5677 1.69629 12.6429 1.44336 12.6429 1.2041C12.6429 0.561523 12.1644 0.0966797 11.5082 0.0966797C11.057 0.0966797 10.7767 0.260742 10.5033 0.691406L4.9115 9.50977L2.07458 5.98926C1.82166 5.68848 1.54822 5.55176 1.16541 5.55176C0.502319 5.55176 0.0238037 6.02344 0.0238037 6.66602C0.0238037 6.95312 0.112671 7.20605 0.358765 7.48633L3.88611 11.7588C4.18005 12.1074 4.50818 12.2646 4.94568 12.2646Z",fill:"currentColor"})),CopyIcon=()=>D.createElement("svg",{fill:"none",height:"16",viewBox:"0 0 17 16",width:"17",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Copy"),D.createElement("path",{d:"M3.04236 12.3027H4.18396V13.3008C4.18396 14.8525 5.03845 15.7002 6.59705 15.7002H13.6244C15.183 15.7002 16.0375 14.8525 16.0375 13.3008V6.24609C16.0375 4.69434 15.183 3.84668 13.6244 3.84668H12.4828V2.8418C12.4828 1.29688 11.6283 0.442383 10.0697 0.442383H3.04236C1.48376 0.442383 0.629272 1.29004 0.629272 2.8418V9.90332C0.629272 11.4551 1.48376 12.3027 3.04236 12.3027ZM3.23376 10.5391C2.68689 10.5391 2.39294 10.2656 2.39294 9.68457V3.06055C2.39294 2.47949 2.68689 2.21289 3.23376 2.21289H9.8783C10.4252 2.21289 10.7191 2.47949 10.7191 3.06055V3.84668H6.59705C5.03845 3.84668 4.18396 4.69434 4.18396 6.24609V10.5391H3.23376ZM6.78845 13.9365C6.24158 13.9365 5.94763 13.6699 5.94763 13.0889V6.45801C5.94763 5.87695 6.24158 5.61035 6.78845 5.61035H13.433C13.9799 5.61035 14.2738 5.87695 14.2738 6.45801V13.0889C14.2738 13.6699 13.9799 13.9365 13.433 13.9365H6.78845Z",fill:"currentColor"})),DisconnectIcon=()=>D.createElement("svg",{fill:"none",height:"16",viewBox:"0 0 18 16",width:"18",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Disconnect"),D.createElement("path",{d:"M2.67834 15.5908H9.99963C11.5514 15.5908 12.399 14.7432 12.399 13.1777V10.2656H10.6354V12.9863C10.6354 13.5332 10.3688 13.8271 9.78772 13.8271H2.89026C2.3092 13.8271 2.0426 13.5332 2.0426 12.9863V3.15625C2.0426 2.60254 2.3092 2.30859 2.89026 2.30859H9.78772C10.3688 2.30859 10.6354 2.60254 10.6354 3.15625V5.89746H12.399V2.95801C12.399 1.39941 11.5514 0.544922 9.99963 0.544922H2.67834C1.12659 0.544922 0.278931 1.39941 0.278931 2.95801V13.1777C0.278931 14.7432 1.12659 15.5908 2.67834 15.5908ZM7.43616 8.85059H14.0875L15.0924 8.78906L14.566 9.14453L13.6842 9.96484C13.5406 10.1016 13.4586 10.2861 13.4586 10.4844C13.4586 10.8398 13.7321 11.168 14.1217 11.168C14.3199 11.168 14.4635 11.0928 14.6002 10.9561L16.7809 8.68652C16.986 8.48145 17.0543 8.27637 17.0543 8.06445C17.0543 7.85254 16.986 7.64746 16.7809 7.43555L14.6002 5.17285C14.4635 5.03613 14.3199 4.9541 14.1217 4.9541C13.7321 4.9541 13.4586 5.27539 13.4586 5.6377C13.4586 5.83594 13.5406 6.02734 13.6842 6.15723L14.566 6.98438L15.0924 7.33984L14.0875 7.27148H7.43616C7.01917 7.27148 6.65686 7.62012 6.65686 8.06445C6.65686 8.50195 7.01917 8.85059 7.43616 8.85059Z",fill:"currentColor"})),chainToExplorerUrl=e=>{var t,n;return null==(n=null==(t=null==e?void 0:e.blockExplorers)?void 0:t.default)?void 0:n.url},ExternalLinkIcon=()=>D.createElement("svg",{fill:"none",height:"19",viewBox:"0 0 20 19",width:"20",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Link"),D.createElement("path",{d:"M10 18.9443C15.0977 18.9443 19.2812 14.752 19.2812 9.6543C19.2812 4.56543 15.0889 0.373047 10 0.373047C4.90234 0.373047 0.71875 4.56543 0.71875 9.6543C0.71875 14.752 4.91113 18.9443 10 18.9443ZM10 16.6328C6.1416 16.6328 3.03906 13.5215 3.03906 9.6543C3.03906 5.7959 6.13281 2.68457 10 2.68457C13.8584 2.68457 16.9697 5.7959 16.9697 9.6543C16.9785 13.5215 13.8672 16.6328 10 16.6328ZM12.7158 12.1416C13.2432 12.1416 13.5684 11.7549 13.5684 11.1836V7.19336C13.5684 6.44629 13.1377 6.05957 12.417 6.05957H8.40918C7.8291 6.05957 7.45117 6.38477 7.45117 6.91211C7.45117 7.43945 7.8291 7.77344 8.40918 7.77344H9.69238L10.7207 7.63281L9.53418 8.67871L6.73047 11.4912C6.53711 11.6758 6.41406 11.9395 6.41406 12.2031C6.41406 12.7832 6.85352 13.1699 7.39844 13.1699C7.68848 13.1699 7.92578 13.0732 8.1543 12.8623L10.9316 10.0762L11.9775 8.89844L11.8545 9.98828V11.1836C11.8545 11.7725 12.1885 12.1416 12.7158 12.1416Z",fill:"currentColor"})),CancelIcon=()=>D.createElement("svg",{fill:"none",height:"19",viewBox:"0 0 20 19",width:"20",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Cancel"),D.createElement("path",{d:"M10 18.9443C15.0977 18.9443 19.2812 14.752 19.2812 9.6543C19.2812 4.56543 15.0889 0.373047 10 0.373047C4.90234 0.373047 0.71875 4.56543 0.71875 9.6543C0.71875 14.752 4.91113 18.9443 10 18.9443ZM10 16.6328C6.1416 16.6328 3.03906 13.5215 3.03906 9.6543C3.03906 5.7959 6.13281 2.68457 10 2.68457C13.8584 2.68457 16.9697 5.7959 16.9697 9.6543C16.9785 13.5215 13.8672 16.6328 10 16.6328ZM7.29297 13.3018C7.58301 13.3018 7.81152 13.2139 7.99609 13.0205L10 11.0166L12.0127 13.0205C12.1973 13.2051 12.4258 13.3018 12.707 13.3018C13.2432 13.3018 13.6562 12.8887 13.6562 12.3525C13.6562 12.0977 13.5508 11.8691 13.3662 11.6934L11.3535 9.67188L13.375 7.6416C13.5596 7.44824 13.6562 7.22852 13.6562 6.98242C13.6562 6.44629 13.2432 6.0332 12.7158 6.0332C12.4346 6.0332 12.2148 6.12109 12.0215 6.31445L10 8.32715L7.9873 6.32324C7.80273 6.12988 7.58301 6.04199 7.29297 6.04199C6.76562 6.04199 6.35254 6.45508 6.35254 6.99121C6.35254 7.2373 6.44922 7.46582 6.63379 7.6416L8.65527 9.67188L6.63379 11.6934C6.44922 11.8691 6.35254 12.1064 6.35254 12.3525C6.35254 12.8887 6.76562 13.3018 7.29297 13.3018Z",fill:"currentColor"})),SuccessIcon=()=>D.createElement("svg",{fill:"none",height:"20",viewBox:"0 0 20 20",width:"20",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Success"),D.createElement("path",{d:"M10 19.4443C15.0977 19.4443 19.2812 15.252 19.2812 10.1543C19.2812 5.06543 15.0889 0.873047 10 0.873047C4.90234 0.873047 0.71875 5.06543 0.71875 10.1543C0.71875 15.252 4.91113 19.4443 10 19.4443ZM10 17.1328C6.1416 17.1328 3.03906 14.0215 3.03906 10.1543C3.03906 6.2959 6.13281 3.18457 10 3.18457C13.8584 3.18457 16.9697 6.2959 16.9697 10.1543C16.9785 14.0215 13.8672 17.1328 10 17.1328ZM9.07715 14.3379C9.4375 14.3379 9.7627 14.1533 9.97363 13.8369L13.7441 8.00977C13.8848 7.79883 13.9814 7.5791 13.9814 7.36816C13.9814 6.84961 13.5244 6.48926 13.0322 6.48926C12.707 6.48926 12.4258 6.66504 12.2148 7.0166L9.05957 12.0967L7.5918 10.2949C7.37207 10.0225 7.13477 9.9082 6.84473 9.9082C6.33496 9.9082 5.92188 10.3125 5.92188 10.8223C5.92188 11.0684 6.00098 11.2793 6.18555 11.5078L8.1543 13.8545C8.40918 14.1709 8.70801 14.3379 9.07715 14.3379Z",fill:"currentColor"})),getTxStatusIcon=e=>{switch(e){case"pending":default:return SpinnerIcon;case"confirmed":return SuccessIcon;case"failed":return CancelIcon}};function TxItem({tx:e}){let t=isMobile(),n=getTxStatusIcon(e.status),o="failed"===e.status?"error":"accentColor",{chain:i}=(0,_.m)(),s="confirmed"===e.status?"Confirmed":"failed"===e.status?"Failed":"Pending",l=chainToExplorerUrl(i);return D.createElement(D.Fragment,null,D.createElement(tQ,{...l?{as:"a",background:{hover:"profileForeground"},borderRadius:"menuButton",className:touchableStyles({active:"shrink"}),href:`${l}/tx/${e.hash}`,rel:"noreferrer noopener",target:"_blank",transition:"default"}:{},color:"modalText",display:"flex",flexDirection:"row",justifyContent:"space-between",padding:"8",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:t?"16":"14"},D.createElement(tQ,{color:o},D.createElement(n,null)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:t?"3":"1"},D.createElement(tQ,null,D.createElement(rm,{color:"modalText",font:"body",size:t?"16":"14",weight:"bold"},null==e?void 0:e.description)),D.createElement(tQ,null,D.createElement(rm,{color:"pending"===e.status?"modalTextSecondary":o,font:"body",size:"14",weight:t?"medium":"regular"},s)))),l&&D.createElement(tQ,{alignItems:"center",color:"modalTextDim",display:"flex"},D.createElement(ExternalLinkIcon,null))))}function TxList({address:e}){let t=useRecentTransactions(),n=function(){let e=useTransactionStore(),{address:t}=(0,_.m)(),n=dist_useChainId();return(0,D.useCallback)(()=>{if(!t||!n)throw Error("No address or chain ID found");e.clearTransactions(t,n)},[e,t,n])}(),{chain:o}=(0,_.m)(),i=chainToExplorerUrl(o),s=t.slice(0,3),l=s.length>0,c=isMobile(),{appName:u}=(0,D.useContext)(rs),{i18n:d}=(0,D.useContext)(tY);return D.createElement(D.Fragment,null,D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"10",paddingBottom:"2",paddingTop:"16",paddingX:c?"8":"18"},l&&D.createElement(tQ,{paddingBottom:c?"4":"0",paddingTop:"8",paddingX:c?"12":"6"},D.createElement(tQ,{display:"flex",justifyContent:"space-between"},D.createElement(rm,{color:"modalTextSecondary",size:c?"16":"14",weight:"semibold"},d.t("profile.transactions.recent.title")),D.createElement(tQ,{style:{marginBottom:-6,marginLeft:-10,marginRight:-10,marginTop:-6}},D.createElement(tQ,{as:"button",background:{hover:"profileForeground"},borderRadius:"actionButton",className:touchableStyles({active:"shrink"}),onClick:n,paddingX:c?"8":"12",paddingY:c?"4":"5",transition:"default",type:"button"},D.createElement(rm,{color:"modalTextSecondary",size:c?"16":"14",weight:"semibold"},d.t("profile.transactions.clear.label")))))),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},l?s.map(e=>D.createElement(TxItem,{key:e.hash,tx:e})):D.createElement(D.Fragment,null,D.createElement(tQ,{padding:c?"12":"8"},D.createElement(rm,{color:"modalTextDim",size:c?"16":"14",weight:c?"medium":"bold"},u?d.t("profile.transactions.description",{appName:u}):d.t("profile.transactions.description_fallback"))),c&&D.createElement(tQ,{background:"generalBorderDim",height:"1",marginX:"12",marginY:"8"})))),i&&D.createElement(tQ,{paddingBottom:"18",paddingX:c?"8":"18"},D.createElement(tQ,{alignItems:"center",as:"a",background:{hover:"profileForeground"},borderRadius:"menuButton",className:touchableStyles({active:"shrink"}),color:"modalTextDim",display:"flex",flexDirection:"row",href:`${i}/address/${e}`,justifyContent:"space-between",paddingX:"8",paddingY:"12",rel:"noreferrer noopener",style:{willChange:"transform"},target:"_blank",transition:"default",width:"full",...c?{paddingLeft:"12"}:{}},D.createElement(rm,{color:"modalText",font:"body",size:c?"16":"14",weight:c?"semibold":"bold"},d.t("profile.explorer.label")),D.createElement(ExternalLinkIcon,null))))}function ProfileDetailsAction({action:e,icon:t,label:n,testId:o,url:i}){let s=isMobile();return D.createElement(tQ,{...i?{as:"a",href:i,rel:"noreferrer noopener",target:"_blank"}:{as:"button",type:"button"},background:{base:"profileAction",...s?{}:{hover:"profileActionHover"}},borderRadius:"menuButton",boxShadow:"profileDetailsAction",className:touchableStyles({active:"shrinkSm",hover:s?void 0:"grow"}),display:"flex",onClick:e,padding:s?"6":"8",style:{willChange:"transform"},testId:o,transition:"default",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"1",justifyContent:"center",paddingTop:"2",width:"full"},D.createElement(tQ,{color:"modalText",height:"max"},t),D.createElement(tQ,null,D.createElement(rm,{color:"modalText",size:s?"12":"13",weight:"semibold"},n))))}function ProfileDetails({address:e,ensAvatar:t,ensName:n,onClose:o,onDisconnect:i}){let s=(0,D.useContext)(rp),{data:l}=useBalance({address:e}),[c,u]=(0,D.useState)(!1),d=(0,D.useCallback)(()=>{e&&(navigator.clipboard.writeText(e),u(!0))},[e]);if((0,D.useEffect)(()=>{if(c){let e=setTimeout(()=>{u(!1)},1500);return()=>clearTimeout(e)}},[c]),!e)return null;let p=n?formatENS(n):formatAddress(e),f=null==l?void 0:l.formatted,m=f?abbreviateETHBalance(parseFloat(f)):void 0,g="rk_profile_title",b=isMobile(),{i18n:y}=(0,D.useContext)(tY);return D.createElement(D.Fragment,null,D.createElement(tQ,{display:"flex",flexDirection:"column"},D.createElement(tQ,{background:"profileForeground",padding:"16"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:b?"16":"12",justifyContent:"center",margin:"8",style:{textAlign:"center"}},D.createElement(tQ,{style:{position:"absolute",right:16,top:16,willChange:"transform"}},D.createElement(CloseButton,{onClose:o}))," ",D.createElement(tQ,{marginTop:b?"24":"0"},D.createElement(Avatar,{address:e,imageUrl:t,size:b?82:74})),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:b?"4":"0",textAlign:"center"},D.createElement(tQ,{textAlign:"center"},D.createElement(rm,{as:"h1",color:"modalText",id:g,size:b?"20":"18",weight:"heavy"},p)),!!l&&D.createElement(tQ,{textAlign:"center"},D.createElement(rm,{as:"h1",color:"modalTextSecondary",id:g,size:b?"16":"14",weight:"semibold"},m," ",l.symbol)))),D.createElement(tQ,{display:"flex",flexDirection:"row",gap:"8",margin:"2",marginTop:"16"},D.createElement(ProfileDetailsAction,{action:d,icon:c?D.createElement(CopiedIcon,null):D.createElement(CopyIcon,null),label:c?y.t("profile.copy_address.copied"):y.t("profile.copy_address.label")}),D.createElement(ProfileDetailsAction,{action:i,icon:D.createElement(DisconnectIcon,null),label:y.t("profile.disconnect.label"),testId:"disconnect-button"}))),s&&D.createElement(D.Fragment,null,D.createElement(tQ,{background:"generalBorder",height:"1",marginTop:"-1"}),D.createElement(tQ,null,D.createElement(TxList,{address:e})))))}function AccountModal({onClose:e,open:t}){let{address:n}=(0,_.m)(),o=useMainnetEnsName(n),i=useMainnetEnsAvatar(o),{disconnect:s}=useDisconnect();return n?D.createElement(D.Fragment,null,n&&D.createElement(Dialog,{onClose:e,open:t,titleId:"rk_account_modal_title"},D.createElement(DialogContent,{bottomSheetOnMobile:!0,padding:"0"},D.createElement(ProfileDetails,{address:n,ensAvatar:i,ensName:o,onClose:e,onDisconnect:s})))):null}var DisconnectSqIcon=({size:e})=>D.createElement("svg",{fill:"none",height:e,viewBox:"0 0 28 28",width:e,xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Disconnect"),D.createElement("path",{d:"M6.742 22.195h8.367c1.774 0 2.743-.968 2.743-2.758V16.11h-2.016v3.11c0 .625-.305.96-.969.96H6.984c-.664 0-.968-.335-.968-.96V7.984c0-.632.304-.968.968-.968h7.883c.664 0 .969.336.969.968v3.133h2.016v-3.36c0-1.78-.97-2.757-2.743-2.757H6.742C4.97 5 4 5.977 4 7.758v11.68c0 1.789.969 2.757 2.742 2.757Zm5.438-7.703h7.601l1.149-.07-.602.406-1.008.938a.816.816 0 0 0-.258.593c0 .407.313.782.758.782.227 0 .39-.086.547-.243l2.492-2.593c.235-.235.313-.47.313-.711 0-.242-.078-.477-.313-.719l-2.492-2.586c-.156-.156-.32-.25-.547-.25-.445 0-.758.367-.758.781 0 .227.094.446.258.594l1.008.945.602.407-1.149-.079H12.18a.904.904 0 0 0 0 1.805Z",fill:"currentColor"})),rE=D.forwardRef(({children:e,currentlySelected:t=!1,onClick:n,testId:o,...i},s)=>{let l=isMobile();return D.createElement(tQ,{as:"button",borderRadius:"menuButton",disabled:t,display:"flex",onClick:n,ref:s,testId:o,type:"button"},D.createElement(tQ,{borderRadius:"menuButton",className:[l?"v9horb0":void 0,!t&&touchableStyles({active:"shrink"})],padding:l?"8":"6",transition:"default",width:"full",...t?{background:"accentColor",borderColor:"selectedOptionBorder",borderStyle:"solid",borderWidth:"1",boxShadow:"selectedOption",color:"accentColorForeground"}:{background:{hover:"menuItemBackground"},color:"modalText",transition:"default"},...i},e))});rE.displayName="MenuButton";var Chain_default=({chainId:e,currentChainId:t,switchChain:n,chainIconSize:o,isLoading:i,src:s,name:l,iconBackground:c,idx:u})=>{let d=isMobile(),{i18n:p}=(0,D.useContext)(tY),f=useRainbowKitChains(),m=t===e;return D.createElement(D.Fragment,null,D.createElement(rE,{currentlySelected:m,onClick:m?void 0:()=>n({chainId:e}),testId:`chain-option-${e}`},D.createElement(tQ,{fontFamily:"body",fontSize:"16",fontWeight:"bold"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",justifyContent:"space-between"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"4",height:o},s&&D.createElement(tQ,{height:"full",marginRight:"8"},D.createElement(AsyncImage,{alt:l,background:c,borderRadius:"full",height:o,src:s,width:o,testId:`chain-option-${e}-icon`})),D.createElement("div",null,l)),m&&D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",marginRight:"6"},D.createElement(rm,{color:"accentColorForeground",size:"14",weight:"medium"},p.t("chains.connected")),D.createElement(tQ,{background:"connectionIndicator",borderColor:"selectedOptionBorder",borderRadius:"full",borderStyle:"solid",borderWidth:"1",height:"8",marginLeft:"8",width:"8"})),i&&D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",marginRight:"6"},D.createElement(rm,{color:"modalText",size:"14",weight:"medium"},p.t("chains.confirm")),D.createElement(tQ,{background:"standby",borderRadius:"full",height:"8",marginLeft:"8",width:"8"}))))),d&&uswitchChain(n,e),mutationKey:["switchChain"]});return{...s,chains:function(e={}){let t=(0,z.Z)(e);return(0,D.useSyncExternalStore)(e=>(function(e,t){let{onChange:n}=t;return e._internal.chains.subscribe((e,t)=>{n(e,t)})})(t,{onChange:e}),()=>getChains(t),()=>getChains(t))}({config:n}),switchChain:o,switchChainAsync:i}}({mutation:{onMutate:({chainId:e})=>{s(e)},onSuccess:()=>{i&&s(null)},onError:()=>{i&&s(null)},onSettled:()=>{e()}}}),{i18n:c}=(0,D.useContext)(tY),{disconnect:u}=useDisconnect(),d="rk_chain_modal_title",p=isMobile(),f=o.some(e=>e.id===n),m=p?"36":"28",g=useRainbowKitChains();return n?D.createElement(Dialog,{onClose:e,open:t,titleId:d},D.createElement(DialogContent,{bottomSheetOnMobile:!0,paddingBottom:"0"},D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"14"},D.createElement(tQ,{display:"flex",flexDirection:"row",justifyContent:"space-between"},p&&D.createElement(tQ,{width:"30"}),D.createElement(tQ,{paddingBottom:"0",paddingLeft:"8",paddingTop:"4"},D.createElement(rm,{as:"h1",color:"modalText",id:d,size:p?"20":"18",weight:"heavy"},c.t("chains.title"))),D.createElement(CloseButton,{onClose:e})),!f&&D.createElement(tQ,{marginX:"8",textAlign:p?"center":"left"},D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},c.t("chains.wrong_network"))),D.createElement(tQ,{className:p?"_18dqw9x1":"_18dqw9x0",display:"flex",flexDirection:"column",gap:"4",padding:"2",paddingBottom:"16"},g.map(({iconBackground:e,iconUrl:t,id:o,name:s},c)=>D.createElement(Chain_default,{key:o,chainId:o,currentChainId:n,switchChain:l,chainIconSize:m,isLoading:i===o,src:t,name:s,iconBackground:e,idx:c})),!f&&D.createElement(D.Fragment,null,D.createElement(tQ,{background:"generalBorderDim",height:"1",marginX:"8"}),D.createElement(rE,{onClick:()=>u(),testId:"chain-option-disconnect"},D.createElement(tQ,{color:"error",fontFamily:"body",fontSize:"16",fontWeight:"bold"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",justifyContent:"space-between"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"4",height:m},D.createElement(tQ,{alignItems:"center",color:"error",height:m,justifyContent:"center",marginRight:"8"},D.createElement(DisconnectSqIcon,{size:Number(m)})),D.createElement("div",null,c.t("chains.disconnect"))))))))))):null}var DisclaimerLink=({children:e,href:t})=>D.createElement(tQ,{as:"a",color:"accentColor",href:t,rel:"noreferrer",target:"_blank"},e),DisclaimerText=({children:e})=>D.createElement(rm,{color:"modalTextSecondary",size:"12",weight:"medium"},e);function ConnectModalIntro({compactModeEnabled:e=!1,getWallet:t}){let{disclaimer:n,learnMoreUrl:o}=(0,D.useContext)(rs),{i18n:i}=(0,D.useContext)(tY);return D.createElement(D.Fragment,null,D.createElement(tQ,{alignItems:"center",color:"accentColor",display:"flex",flexDirection:"column",height:"full",justifyContent:"space-around"},D.createElement(tQ,{marginBottom:"10"},!e&&D.createElement(rm,{color:"modalText",size:"18",weight:"heavy"},i.t("intro.title"))),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"32",justifyContent:"center",marginY:"20",style:{maxWidth:312}},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16"},D.createElement(tQ,{borderRadius:"6",height:"48",minWidth:"48",width:"48"},D.createElement(AssetsIcon,null)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},i.t("intro.digital_asset.title")),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},i.t("intro.digital_asset.description")))),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16"},D.createElement(tQ,{borderRadius:"6",height:"48",minWidth:"48",width:"48"},D.createElement(LoginIcon,null)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},i.t("intro.login.title")),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},i.t("intro.login.description"))))),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"12",justifyContent:"center",margin:"10"},D.createElement(ActionButton,{label:i.t("intro.get.label"),onClick:t}),D.createElement(tQ,{as:"a",className:touchableStyles({active:"shrink",hover:"grow"}),display:"block",href:o,paddingX:"12",paddingY:"4",rel:"noreferrer",style:{willChange:"transform"},target:"_blank",transition:"default"},D.createElement(rm,{color:"accentColor",size:"14",weight:"bold"},i.t("intro.learn_more.label")))),n&&!e&&D.createElement(tQ,{marginBottom:"8",marginTop:"12",textAlign:"center"},D.createElement(n,{Link:DisclaimerLink,Text:DisclaimerText}))))}var BackIcon=()=>D.createElement("svg",{fill:"none",height:"17",viewBox:"0 0 11 17",width:"11",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Back"),D.createElement("path",{d:"M0.99707 8.6543C0.99707 9.08496 1.15527 9.44531 1.51562 9.79688L8.16016 16.3096C8.43262 16.5732 8.74902 16.7051 9.13574 16.7051C9.90918 16.7051 10.5508 16.0811 10.5508 15.3076C10.5508 14.9121 10.3838 14.5605 10.0938 14.2705L4.30176 8.64551L10.0938 3.0293C10.3838 2.74805 10.5508 2.3877 10.5508 2.00098C10.5508 1.23633 9.90918 0.603516 9.13574 0.603516C8.74902 0.603516 8.43262 0.735352 8.16016 0.999023L1.51562 7.51172C1.15527 7.85449 1.00586 8.21484 0.99707 8.6543Z",fill:"currentColor"})),InfoIcon=()=>D.createElement("svg",{fill:"none",height:"12",viewBox:"0 0 8 12",width:"8",xmlns:"http://www.w3.org/2000/svg"},D.createElement("title",null,"Info"),D.createElement("path",{d:"M3.64258 7.99609C4.19336 7.99609 4.5625 7.73828 4.68555 7.24609C4.69141 7.21094 4.70312 7.16406 4.70898 7.13477C4.80859 6.60742 5.05469 6.35547 6.04492 5.76367C7.14648 5.10156 7.67969 4.3457 7.67969 3.24414C7.67969 1.39844 6.17383 0.255859 3.95898 0.255859C2.32422 0.255859 1.05859 0.894531 0.548828 1.86719C0.396484 2.14844 0.320312 2.44727 0.320312 2.74023C0.314453 3.37305 0.742188 3.79492 1.42188 3.79492C1.91406 3.79492 2.33594 3.54883 2.53516 3.11523C2.78711 2.47656 3.23242 2.21289 3.83594 2.21289C4.55664 2.21289 5.10742 2.65234 5.10742 3.29102C5.10742 3.9707 4.7793 4.29883 3.81836 4.87891C3.02148 5.36523 2.50586 5.92773 2.50586 6.76562V6.90039C2.50586 7.55664 2.96289 7.99609 3.64258 7.99609ZM3.67188 11.4473C4.42773 11.4473 5.04297 10.8672 5.04297 10.1406C5.04297 9.41406 4.42773 8.83984 3.67188 8.83984C2.91602 8.83984 2.30664 9.41406 2.30664 10.1406C2.30664 10.8672 2.91602 11.4473 3.67188 11.4473Z",fill:"currentColor"})),InfoButton=({"aria-label":e="Info",onClick:t})=>{let n=isMobile();return D.createElement(tQ,{alignItems:"center","aria-label":e,as:"button",background:"closeButtonBackground",borderColor:"actionButtonBorder",borderRadius:"full",borderStyle:"solid",borderWidth:n?"0":"1",className:touchableStyles({active:"shrinkSm",hover:"growLg"}),color:"closeButton",display:"flex",height:n?"30":"28",justifyContent:"center",onClick:t,style:{willChange:"transform"},transition:"default",type:"button",width:n?"30":"28"},D.createElement(InfoIcon,null))},useCoolMode=e=>{let t=(0,D.useRef)(null),n=(0,D.useContext)(rl),o=useAsyncImage(e);return(0,D.useEffect)(()=>{if(n&&t.current&&o)return function(e,t){let n;rx++;let o=[15,20,25,35,45],i=[],s=!1,l=0,c=0,u=getContainer();!function loop(){s&&i.length<35&&function(){let e=o[Math.floor(Math.random()*o.length)],n=360*Math.random(),s=c-e/2,d=l-e/2,p=document.createElement("div");p.innerHTML=``,p.setAttribute("style",`position:absolute;will-change:transform;top:${s}px;left:${d}px;transform:rotate(${n}deg)`),u.appendChild(p),i.push({direction:.5>=Math.random()?-1:1,element:p,left:d,size:e,speedHorz:10*Math.random(),speedUp:25*Math.random(),spinSpeed:35*Math.random()*(.5>=Math.random()?-1:1),spinVal:n,top:s})}(),function(){for(let e of i)e.left=e.left-e.speedHorz*e.direction,e.top=e.top-e.speedUp,e.speedUp=Math.min(e.size,e.speedUp-1),e.spinVal=e.spinVal+e.spinSpeed,e.top>=Math.max(window.innerHeight,document.body.clientHeight)+e.size&&(i=i.filter(t=>t!==e),e.element.remove()),e.element.setAttribute("style",`position:absolute;will-change:transform;top:${e.top}px;left:${e.left}px;transform:rotate(${e.spinVal}deg)`)}(),n=requestAnimationFrame(loop)}();let d="ontouchstart"in window||navigator.msMaxTouchPoints,p=d?"touchstart":"mousedown",f=d?"touchend":"mouseup",m=d?"touchmove":"mousemove",updateMousePosition=e=>{var t,n;"touches"in e?(l=null==(t=e.touches)?void 0:t[0].clientX,c=null==(n=e.touches)?void 0:n[0].clientY):(l=e.clientX,c=e.clientY)},tapHandler=e=>{updateMousePosition(e),s=!0},disableAutoAddParticle=()=>{s=!1};return e.addEventListener(m,updateMousePosition,{passive:!1}),e.addEventListener(p,tapHandler),e.addEventListener(f,disableAutoAddParticle),e.addEventListener("mouseleave",disableAutoAddParticle),()=>{e.removeEventListener(m,updateMousePosition),e.removeEventListener(p,tapHandler),e.removeEventListener(f,disableAutoAddParticle),e.removeEventListener("mouseleave",disableAutoAddParticle);let t=setInterval(()=>{n&&0===i.length&&(cancelAnimationFrame(n),clearInterval(t),0==--rx&&u.remove())},500)}}(t.current,o)},[n,o]),t},getContainer=()=>{let e="_rk_coolMode",t=document.getElementById(e);if(t)return t;let n=document.createElement("div");return n.setAttribute("id",e),n.setAttribute("style","overflow:hidden;position:fixed;height:100%;top:0;left:0;right:0;bottom:0;pointer-events:none;z-index:2147483647"),document.body.appendChild(n),n},rx=0,ModalSelection=({as:e="button",currentlySelected:t=!1,iconBackground:n,iconUrl:o,name:i,onClick:s,ready:l,recent:c,testId:u,isRainbowKitConnector:d,...p})=>{let f=useCoolMode(o),[m,g]=(0,D.useState)(!1),{i18n:b}=(0,D.useContext)(tY);return D.createElement(tQ,{display:"flex",flexDirection:"column",onMouseEnter:()=>g(!0),onMouseLeave:()=>g(!1),ref:f},D.createElement(tQ,{as:e,borderRadius:"menuButton",borderStyle:"solid",borderWidth:"1",className:t?void 0:["g5kl0l0",touchableStyles({active:"shrink"})],disabled:t,onClick:s,padding:"5",style:{willChange:"transform"},testId:u,transition:"default",width:"full",...t?{background:"accentColor",borderColor:"selectedOptionBorder",boxShadow:"selectedWallet"}:{background:{hover:"menuItemBackground"}},...p},D.createElement(tQ,{color:t?"accentColorForeground":"modalText",disabled:!l,fontFamily:"body",fontSize:"16",fontWeight:"bold",transition:"default"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"12"},D.createElement(AsyncImage,{background:n,...!m&&d?{borderColor:"actionButtonBorder"}:{},useAsImage:!d,borderRadius:"6",height:"28",src:o,width:"28"}),D.createElement(tQ,null,D.createElement(tQ,{style:{marginTop:c?-2:void 0},maxWidth:"200"},i),c&&D.createElement(rm,{color:t?"accentColorForeground":"accentColor",size:"12",style:{lineHeight:1,marginTop:-1},weight:"medium"},b.t("connect.recent")))))))};ModalSelection.displayName="ModalSelection";var rA="rk-latest-id",convertHexToRGBA=(e,t=1)=>{let n=e.replace("#","");3===n.length&&(n=`${n[0]}${n[0]}${n[1]}${n[1]}${n[2]}${n[2]}`);let o=parseInt(n.substring(0,2),16),i=parseInt(n.substring(2,4),16),s=parseInt(n.substring(4,6),16);return t>1&&t<=100&&(t/=100),`rgba(${o},${i},${s},${t})`},getGradientRGBAs=e=>e?[convertHexToRGBA(e,.2),convertHexToRGBA(e,.14),convertHexToRGBA(e,.1)]:null,isHexString=e=>/^#([0-9a-f]{3}){1,2}$/i.test(e),src3=async()=>(await n.e(9600).then(n.bind(n,99600))).default,preloadConnectIcon=()=>loadImages(src3),ConnectIcon=()=>D.createElement(AsyncImage,{background:"#515a70",borderColor:"generalBorder",borderRadius:"10",height:"48",src:src3,width:"48"}),src4=async()=>(await n.e(8137).then(n.bind(n,68137))).default,preloadCreateIcon=()=>loadImages(src4),CreateIcon=()=>D.createElement(AsyncImage,{background:"#e3a5e8",borderColor:"generalBorder",borderRadius:"10",height:"48",src:src4,width:"48"}),src5=async()=>(await n.e(1748).then(n.bind(n,31748))).default,preloadRefreshIcon=()=>loadImages(src5),RefreshIcon=()=>D.createElement(AsyncImage,{background:"#515a70",borderColor:"generalBorder",borderRadius:"10",height:"48",src:src5,width:"48"}),src6=async()=>(await n.e(5806).then(n.bind(n,75806))).default,preloadScanIcon=()=>loadImages(src6),ScanIcon=()=>D.createElement(AsyncImage,{background:"#515a70",borderColor:"generalBorder",borderRadius:"10",height:"48",src:src6,width:"48"}),generateMatrix=(e,t)=>{let n=Array.prototype.slice.call(tB.create(e,{errorCorrectionLevel:t}).modules.data,0),o=Math.sqrt(n.length);return n.reduce((e,t,n)=>(n%o==0?e.push([t]):e[e.length-1].push(t))&&e,[])};function QRCode({ecl:e="M",logoBackground:t,logoMargin:n=10,logoSize:o=50,logoUrl:i,size:s=200,uri:l}){let c=s-2*parseInt("20",10),u=(0,D.useMemo)(()=>{let t=[],n=generateMatrix(l,e),i=c/n.length;[{x:0,y:0},{x:1,y:0},{x:0,y:1}].forEach(({x:e,y:o})=>{let s=(n.length-7)*i*e,l=(n.length-7)*i*o;for(let n=0;n<3;n++)t.push(D.createElement("rect",{fill:n%2!=0?"white":"black",height:i*(7-2*n),key:`${n}-${e}-${o}`,rx:-((n-2)*5)+(0===n?2:0),ry:-((n-2)*5)+(0===n?2:0),width:i*(7-2*n),x:s+i*n,y:l+i*n}))});let s=Math.floor((o+25)/i),u=n.length/2-s/2,d=n.length/2+s/2-1;return n.forEach((e,o)=>{e.forEach((e,s)=>{!n[o][s]||o<7&&s<7||o>n.length-8&&s<7||o<7&&s>n.length-8||o>u&&ou&&s{let e=getBrowser();switch(e){case"Arc":return(await n.e(6328).then(n.bind(n,76328))).default;case"Brave":return(await n.e(6551).then(n.bind(n,86551))).default;case"Chrome":return(await n.e(7682).then(n.bind(n,57682))).default;case"Edge":return(await n.e(934).then(n.bind(n,60934))).default;case"Firefox":return(await n.e(9223).then(n.bind(n,99223))).default;case"Opera":return(await n.e(9941).then(n.bind(n,89941))).default;case"Safari":return(await n.e(2604).then(n.bind(n,62604))).default;default:return(await n.e(2746).then(n.bind(n,92746))).default}},preloadBrowserIcon=()=>loadImages(getBrowserSrc),getPlatformSrc=async()=>{let e=getPlatform();switch(e){case"Windows":return(await n.e(5710).then(n.bind(n,35710))).default;case"macOS":return(await n.e(8906).then(n.bind(n,8906))).default;default:return(await n.e(8366).then(n.bind(n,78366))).default}},preloadPlatformIcon=()=>loadImages(getPlatformSrc);function GetDetail({getWalletDownload:e,compactModeEnabled:t}){let n=useWalletConnectors().filter(e=>e.isRainbowKitConnector),o=n.splice(0,5),{i18n:i}=(0,D.useContext)(tY);return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",height:"full",marginTop:"18",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"28",height:"full",width:"full"},null==o?void 0:o.filter(e=>{var t;return e.extensionDownloadUrl||e.desktopDownloadUrl||e.qrCode&&(null==(t=e.downloadUrls)?void 0:t.qrCode)}).map(t=>{let{downloadUrls:n,iconBackground:o,iconUrl:s,id:l,name:c,qrCode:u}=t,d=(null==n?void 0:n.qrCode)&&u,p=!!t.extensionDownloadUrl,f=(null==n?void 0:n.qrCode)&&p,m=(null==n?void 0:n.qrCode)&&!!t.desktopDownloadUrl;return D.createElement(tQ,{alignItems:"center",display:"flex",gap:"16",justifyContent:"space-between",key:t.id,width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16"},D.createElement(AsyncImage,{background:o,borderColor:"actionButtonBorder",borderRadius:"10",height:"48",src:s,width:"48"}),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"2"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},c),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},f?i.t("get.mobile_and_extension.description"):m?i.t("get.mobile_and_desktop.description"):d?i.t("get.mobile.description"):p?i.t("get.extension.description"):null))),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(ActionButton,{label:i.t("get.action.label"),onClick:()=>e(l),type:"secondary"})))})),D.createElement(tQ,{alignItems:"center",borderRadius:"10",display:"flex",flexDirection:"column",gap:"8",justifyContent:"space-between",marginBottom:"4",paddingY:"8",style:{maxWidth:275,textAlign:"center"}},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},i.t("get.looking_for.title")),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},t?i.t("get.looking_for.desktop.compact_description"):i.t("get.looking_for.desktop.wide_description"))))}function ConnectDetail({changeWalletStep:e,compactModeEnabled:t,connectionError:n,onClose:o,qrCodeUri:i,reconnect:s,wallet:l}){let{downloadUrls:c,iconBackground:u,iconUrl:d,name:p,qrCode:f,ready:m,showWalletConnectModal:g,getDesktopUri:b}=l,y=!!b,v=isSafari(),{i18n:w}=(0,D.useContext)(tY),C=!!l.extensionDownloadUrl,E=(null==c?void 0:c.qrCode)&&C,x=(null==c?void 0:c.qrCode)&&!!l.desktopDownloadUrl,A=f&&i,onDesktopUri=async()=>{let e=await (null==b?void 0:b());window.open(e,v?"_blank":"_self")},k=g?{description:t?w.t("connect.walletconnect.description.compact"):w.t("connect.walletconnect.description.full"),label:w.t("connect.walletconnect.open.label"),onClick:()=>{o(),g()}}:A?{description:w.t("connect.secondary_action.get.description",{wallet:p}),label:w.t("connect.secondary_action.get.label"),onClick:()=>e(E||x?"DOWNLOAD_OPTIONS":"DOWNLOAD")}:null,{width:B}=useWindowSize();return(0,D.useEffect)(()=>{preloadBrowserIcon(),preloadPlatformIcon()},[]),D.createElement(tQ,{display:"flex",flexDirection:"column",height:"full",width:"full"},A?D.createElement(tQ,{alignItems:"center",display:"flex",height:"full",justifyContent:"center"},D.createElement(QRCode,{logoBackground:u,logoSize:t?60:72,logoUrl:d,size:t?318:B&&B<768?Math.max(280,Math.min(B-308,382)):382,uri:i})):D.createElement(tQ,{alignItems:"center",display:"flex",justifyContent:"center",style:{flexGrow:1}},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"8"},D.createElement(tQ,{borderRadius:"10",height:"44",overflow:"hidden"},D.createElement(AsyncImage,{useAsImage:!l.isRainbowKitConnector,height:"44",src:d,width:"44"})),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"4",paddingX:"32",style:{textAlign:"center"}},D.createElement(rm,{color:"modalText",size:"18",weight:"bold"},m?w.t("connect.status.opening",{wallet:p}):C?w.t("connect.status.not_installed",{wallet:p}):w.t("connect.status.not_available",{wallet:p})),!m&&C?D.createElement(tQ,{paddingTop:"20"},D.createElement(ActionButton,{href:l.extensionDownloadUrl,label:w.t("connect.secondary_action.install.label"),type:"secondary"})):null,m&&!A&&D.createElement(D.Fragment,null,D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",justifyContent:"center"},D.createElement(rm,{color:"modalTextSecondary",size:"14",textAlign:"center",weight:"medium"},w.t("connect.status.confirm"))),D.createElement(tQ,{alignItems:"center",color:"modalText",display:"flex",flexDirection:"row",height:"32",marginTop:"8"},n?D.createElement(ActionButton,{label:w.t("connect.secondary_action.retry.label"),onClick:async()=>{y&&onDesktopUri(),s(l)}}):D.createElement(tQ,{color:"modalTextSecondary"},D.createElement(SpinnerIcon,null))))))),D.createElement(tQ,{alignItems:"center",borderRadius:"10",display:"flex",flexDirection:"row",gap:"8",height:"28",justifyContent:"space-between",marginTop:"12"},m&&k&&D.createElement(D.Fragment,null,D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},k.description),D.createElement(ActionButton,{label:k.label,onClick:k.onClick,type:"secondary"}))))}var DownloadOptionsBox=({actionLabel:e,description:t,iconAccent:n,iconBackground:o,iconUrl:i,isCompact:s,onAction:l,title:c,url:u,variant:d})=>{let p="browser"===d,f=!p&&n&&getGradientRGBAs(n);return D.createElement(tQ,{alignItems:"center",borderRadius:"13",display:"flex",justifyContent:"center",overflow:"hidden",paddingX:s?"18":"44",position:"relative",style:{flex:1,isolation:"isolate"},width:"full"},D.createElement(tQ,{borderColor:"actionButtonBorder",borderRadius:"13",borderStyle:"solid",borderWidth:"1",style:{bottom:"0",left:"0",position:"absolute",right:"0",top:"0",zIndex:1}}),p&&D.createElement(tQ,{background:"downloadTopCardBackground",height:"full",position:"absolute",style:{zIndex:0},width:"full"},D.createElement(tQ,{display:"flex",flexDirection:"row",justifyContent:"space-between",style:{bottom:"0",filter:"blur(20px)",left:"0",position:"absolute",right:"0",top:"0",transform:"translate3d(0, 0, 0)"}},D.createElement(tQ,{style:{filter:"blur(100px)",marginLeft:-27,marginTop:-20,opacity:.6,transform:"translate3d(0, 0, 0)"}},D.createElement(AsyncImage,{borderRadius:"full",height:"200",src:i,width:"200"})),D.createElement(tQ,{style:{filter:"blur(100px)",marginRight:0,marginTop:105,opacity:.6,overflow:"auto",transform:"translate3d(0, 0, 0)"}},D.createElement(AsyncImage,{borderRadius:"full",height:"200",src:i,width:"200"})))),!p&&f&&D.createElement(tQ,{background:"downloadBottomCardBackground",style:{bottom:"0",left:"0",position:"absolute",right:"0",top:"0"}},D.createElement(tQ,{position:"absolute",style:{background:`radial-gradient(50% 50% at 50% 50%, ${f[0]} 0%, ${f[1]} 25%, rgba(0,0,0,0) 100%)`,height:564,left:-215,top:-197,transform:"translate3d(0, 0, 0)",width:564}}),D.createElement(tQ,{position:"absolute",style:{background:`radial-gradient(50% 50% at 50% 50%, ${f[2]} 0%, rgba(0, 0, 0, 0) 100%)`,height:564,left:-1,top:-76,transform:"translate3d(0, 0, 0)",width:564}})),D.createElement(tQ,{alignItems:"flex-start",display:"flex",flexDirection:"row",gap:"24",height:"max",justifyContent:"center",style:{zIndex:1}},D.createElement(tQ,null,D.createElement(AsyncImage,{height:"60",src:i,width:"60",...o?{background:o,borderColor:"generalBorder",borderRadius:"10"}:null})),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4",style:{flex:1},width:"full"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},c),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},t),D.createElement(tQ,{marginTop:"14",width:"max"},D.createElement(ActionButton,{href:u,label:e,onClick:l,size:"medium"})))))};function DownloadOptionsDetail({changeWalletStep:e,wallet:t}){let n=getBrowser(),o=getPlatform(),i=(0,D.useContext)(rd),s="compact"===i,{desktop:l,desktopDownloadUrl:c,extension:u,extensionDownloadUrl:d,mobileDownloadUrl:p}=t,{i18n:f}=(0,D.useContext)(tY);return(0,D.useEffect)(()=>{preloadCreateIcon(),preloadScanIcon(),preloadRefreshIcon(),preloadConnectIcon()},[]),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"24",height:"full",marginBottom:"8",marginTop:"4",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"8",height:"full",justifyContent:"center",width:"full"},d&&D.createElement(DownloadOptionsBox,{actionLabel:f.t("get_options.extension.download.label",{browser:n}),description:f.t("get_options.extension.description"),iconUrl:getBrowserSrc,isCompact:s,onAction:()=>e((null==u?void 0:u.instructions)?"INSTRUCTIONS_EXTENSION":"CONNECT"),title:f.t("get_options.extension.title",{wallet:t.name,browser:n}),url:d,variant:"browser"}),c&&D.createElement(DownloadOptionsBox,{actionLabel:f.t("get_options.desktop.download.label",{platform:o}),description:f.t("get_options.desktop.description"),iconUrl:getPlatformSrc,isCompact:s,onAction:()=>e((null==l?void 0:l.instructions)?"INSTRUCTIONS_DESKTOP":"CONNECT"),title:f.t("get_options.desktop.title",{wallet:t.name,platform:o}),url:c,variant:"desktop"}),p&&D.createElement(DownloadOptionsBox,{actionLabel:f.t("get_options.mobile.download.label",{wallet:t.name}),description:f.t("get_options.mobile.description"),iconAccent:t.iconAccent,iconBackground:t.iconBackground,iconUrl:t.iconUrl,isCompact:s,onAction:()=>{e("DOWNLOAD")},title:f.t("get_options.mobile.title",{wallet:t.name}),variant:"app"})))}function DownloadDetail({changeWalletStep:e,wallet:t}){let{downloadUrls:n,qrCode:o}=t,{i18n:i}=(0,D.useContext)(tY);return(0,D.useEffect)(()=>{preloadCreateIcon(),preloadScanIcon()},[]),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"24",height:"full",width:"full"},D.createElement(tQ,{style:{maxWidth:220,textAlign:"center"}},D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"semibold"},i.t("get_mobile.description"))),D.createElement(tQ,{height:"full"},(null==n?void 0:n.qrCode)?D.createElement(QRCode,{logoSize:0,size:268,uri:n.qrCode}):null),D.createElement(tQ,{alignItems:"center",borderRadius:"10",display:"flex",flexDirection:"row",gap:"8",height:"34",justifyContent:"space-between",marginBottom:"12",paddingY:"8"},D.createElement(ActionButton,{label:i.t("get_mobile.continue.label"),onClick:()=>e((null==o?void 0:o.instructions)?"INSTRUCTIONS_MOBILE":"CONNECT")})))}var rk={connect:()=>D.createElement(ConnectIcon,null),create:()=>D.createElement(CreateIcon,null),install:e=>D.createElement(AsyncImage,{background:e.iconBackground,borderColor:"generalBorder",borderRadius:"10",height:"48",src:e.iconUrl,width:"48"}),refresh:()=>D.createElement(RefreshIcon,null),scan:()=>D.createElement(ScanIcon,null)};function InstructionMobileDetail({connectWallet:e,wallet:t}){var n,o,i,s;let{i18n:l}=(0,D.useContext)(tY);return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",height:"full",width:"full"},D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"28",height:"full",justifyContent:"center",paddingY:"32",style:{maxWidth:320}},null==(o=null==(n=null==t?void 0:t.qrCode)?void 0:n.instructions)?void 0:o.steps.map((e,n)=>{var o;return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16",key:n},D.createElement(tQ,{borderRadius:"10",height:"48",minWidth:"48",overflow:"hidden",position:"relative",width:"48"},null==(o=rk[e.step])?void 0:o.call(rk,t)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},l.t(e.title,void 0,{rawKeyIfTranslationMissing:!0})),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},l.t(e.description,void 0,{rawKeyIfTranslationMissing:!0}))))})),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"12",justifyContent:"center",marginBottom:"16"},D.createElement(ActionButton,{label:l.t("get_instructions.mobile.connect.label"),onClick:()=>e(t)}),D.createElement(tQ,{as:"a",className:touchableStyles({active:"shrink",hover:"grow"}),display:"block",href:null==(s=null==(i=null==t?void 0:t.qrCode)?void 0:i.instructions)?void 0:s.learnMoreUrl,paddingX:"12",paddingY:"4",rel:"noreferrer",style:{willChange:"transform"},target:"_blank",transition:"default"},D.createElement(rm,{color:"accentColor",size:"14",weight:"bold"},l.t("get_instructions.mobile.learn_more.label")))))}function InstructionExtensionDetail({wallet:e}){var t,n,o,i;let{i18n:s}=(0,D.useContext)(tY);return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",height:"full",width:"full"},D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"28",height:"full",justifyContent:"center",paddingY:"32",style:{maxWidth:320}},null==(n=null==(t=null==e?void 0:e.extension)?void 0:t.instructions)?void 0:n.steps.map((t,n)=>{var o;return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16",key:n},D.createElement(tQ,{borderRadius:"10",height:"48",minWidth:"48",overflow:"hidden",position:"relative",width:"48"},null==(o=rk[t.step])?void 0:o.call(rk,e)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},s.t(t.title,void 0,{rawKeyIfTranslationMissing:!0})),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},s.t(t.description,void 0,{rawKeyIfTranslationMissing:!0}))))})),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"12",justifyContent:"center",marginBottom:"16"},D.createElement(ActionButton,{label:s.t("get_instructions.extension.refresh.label"),onClick:window.location.reload.bind(window.location)}),D.createElement(tQ,{as:"a",className:touchableStyles({active:"shrink",hover:"grow"}),display:"block",href:null==(i=null==(o=null==e?void 0:e.extension)?void 0:o.instructions)?void 0:i.learnMoreUrl,paddingX:"12",paddingY:"4",rel:"noreferrer",style:{willChange:"transform"},target:"_blank",transition:"default"},D.createElement(rm,{color:"accentColor",size:"14",weight:"bold"},s.t("get_instructions.extension.learn_more.label")))))}function InstructionDesktopDetail({connectWallet:e,wallet:t}){var n,o,i,s;let{i18n:l}=(0,D.useContext)(tY);return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",height:"full",width:"full"},D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"28",height:"full",justifyContent:"center",paddingY:"32",style:{maxWidth:320}},null==(o=null==(n=null==t?void 0:t.desktop)?void 0:n.instructions)?void 0:o.steps.map((e,n)=>{var o;return D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"16",key:n},D.createElement(tQ,{borderRadius:"10",height:"48",minWidth:"48",overflow:"hidden",position:"relative",width:"48"},null==(o=rk[e.step])?void 0:o.call(rk,t)),D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},D.createElement(rm,{color:"modalText",size:"14",weight:"bold"},l.t(e.title,void 0,{rawKeyIfTranslationMissing:!0})),D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},l.t(e.description,void 0,{rawKeyIfTranslationMissing:!0}))))})),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"12",justifyContent:"center",marginBottom:"16"},D.createElement(ActionButton,{label:l.t("get_instructions.desktop.connect.label"),onClick:()=>e(t)}),D.createElement(tQ,{as:"a",className:touchableStyles({active:"shrink",hover:"grow"}),display:"block",href:null==(s=null==(i=null==t?void 0:t.desktop)?void 0:i.instructions)?void 0:s.learnMoreUrl,paddingX:"12",paddingY:"4",rel:"noreferrer",style:{willChange:"transform"},target:"_blank",transition:"default"},D.createElement(rm,{color:"accentColor",size:"14",weight:"bold"},l.t("get_instructions.desktop.learn_more.label")))))}function DesktopOptions({onClose:e}){let t;let[n,o]=(0,D.useState)(),[i,s]=(0,D.useState)(),[l,c]=(0,D.useState)(),u=!!(null==i?void 0:i.qrCode)&&l,[d,p]=(0,D.useState)(!1),f=(0,D.useContext)(rd),m=f===ru.COMPACT,{disclaimer:g}=(0,D.useContext)(rs),{i18n:b}=(0,D.useContext)(tY),y=isSafari(),v=(0,D.useRef)(!1),{connector:w}=(0,D.useContext)(rc),C=!w,E=useWalletConnectors(C).filter(e=>e.ready||!!e.extensionDownloadUrl).sort((e,t)=>e.groupIndex-t.groupIndex),x=function(e,t){let n={};for(let o of e){let e=t(o);e&&(n[e]||(n[e]=[]),n[e].push(o))}return n}(E,e=>e.groupName),A=["Recommended","Other","Popular","More","Others","Installed"];(0,D.useEffect)(()=>{w&&!v.current&&(changeWalletStep("CONNECT"),selectWallet(w),v.current=!0)},[w]);let connectToWallet=e=>{var t,n;p(!1),e.ready&&(null==(n=null==(t=null==e?void 0:e.connect)?void 0:t.call(e))||n.catch(()=>{p(!0)}))},onDesktopUri=async e=>{let t=E.find(t=>e.id===t.id);(null==t?void 0:t.getDesktopUri)&&setTimeout(async()=>{var e;let n=await (null==(e=null==t?void 0:t.getDesktopUri)?void 0:e.call(t));n&&window.open(n,y?"_blank":"_self")},0)},onQrCode=async e=>{var t;let n=E.find(t=>e.id===t.id),o=await (null==(t=null==n?void 0:n.getQrCodeUri)?void 0:t.call(n));c(o),setTimeout(()=>{s(n),changeWalletStep("CONNECT")},o?0:50)},selectWallet=async e=>{var t;t=e.id,localStorage.setItem(rA,t),e.ready&&(onQrCode(e),onDesktopUri(e)),connectToWallet(e),o(e.id),e.ready||(s(e),changeWalletStep((null==e?void 0:e.extensionDownloadUrl)?"DOWNLOAD_OPTIONS":"CONNECT"))},clearSelectedWallet=()=>{o(void 0),s(void 0),c(void 0)},changeWalletStep=(e,t=!1)=>{t&&"GET"===e&&"GET"===k?clearSelectedWallet():t||"GET"!==e?t||"CONNECT"!==e||B("CONNECT"):B("GET"),I(e)},[k,B]=(0,D.useState)("NONE"),[S,I]=(0,D.useState)("NONE"),j=null,T=null,P=null;(0,D.useEffect)(()=>{p(!1)},[S,i]);let M=!!(null==i?void 0:i.extensionDownloadUrl),O=!!(M&&(null==i?void 0:i.mobileDownloadUrl));switch(S){case"NONE":j=D.createElement(ConnectModalIntro,{getWallet:()=>changeWalletStep("GET")});break;case"LEARN_COMPACT":j=D.createElement(ConnectModalIntro,{compactModeEnabled:m,getWallet:()=>changeWalletStep("GET")}),T=b.t("intro.title"),P="NONE";break;case"GET":j=D.createElement(GetDetail,{getWalletDownload:e=>{var t;o(e);let n=E.find(t=>e===t.id),i=null==(t=null==n?void 0:n.downloadUrls)?void 0:t.qrCode,l=!!(null==n?void 0:n.desktopDownloadUrl),c=!!(null==n?void 0:n.extensionDownloadUrl);s(n),i&&(c||l)?changeWalletStep("DOWNLOAD_OPTIONS"):i?changeWalletStep("DOWNLOAD"):l?changeWalletStep("INSTRUCTIONS_DESKTOP"):changeWalletStep("INSTRUCTIONS_EXTENSION")},compactModeEnabled:m}),T=b.t("get.title"),P=m?"LEARN_COMPACT":"NONE";break;case"CONNECT":j=i&&D.createElement(ConnectDetail,{changeWalletStep,compactModeEnabled:m,connectionError:d,onClose:e,qrCodeUri:l,reconnect:connectToWallet,wallet:i}),T=u&&("WalletConnect"===i.name?b.t("connect_scan.fallback_title"):b.t("connect_scan.title",{wallet:i.name})),P=m?w?null:"NONE":null,t=m?w?()=>{}:clearSelectedWallet:()=>{};break;case"DOWNLOAD_OPTIONS":j=i&&D.createElement(DownloadOptionsDetail,{changeWalletStep,wallet:i}),T=i&&b.t("get_options.short_title",{wallet:i.name}),P=w?"CONNECT":m?"NONE":null;break;case"DOWNLOAD":j=i&&D.createElement(DownloadDetail,{changeWalletStep,wallet:i}),T=i&&b.t("get_mobile.title",{wallet:i.name}),P=O?"DOWNLOAD_OPTIONS":k;break;case"INSTRUCTIONS_MOBILE":j=i&&D.createElement(InstructionMobileDetail,{connectWallet:selectWallet,wallet:i}),T=i&&b.t("get_options.title",{wallet:m&&i.shortName||i.name}),P="DOWNLOAD";break;case"INSTRUCTIONS_EXTENSION":j=i&&D.createElement(InstructionExtensionDetail,{wallet:i}),T=i&&b.t("get_options.title",{wallet:m&&i.shortName||i.name}),P="DOWNLOAD_OPTIONS";break;case"INSTRUCTIONS_DESKTOP":j=i&&D.createElement(InstructionDesktopDetail,{connectWallet:selectWallet,wallet:i}),T=i&&b.t("get_options.title",{wallet:m&&i.shortName||i.name}),P="DOWNLOAD_OPTIONS"}return D.createElement(tQ,{display:"flex",flexDirection:"row",style:{maxHeight:m?468:504}},(!m||"NONE"===S)&&D.createElement(tQ,{className:m?"_1vwt0cg4":"_1vwt0cg3",display:"flex",flexDirection:"column",marginTop:"16"},D.createElement(tQ,{display:"flex",justifyContent:"space-between"},m&&g&&D.createElement(tQ,{marginLeft:"16",width:"28"},D.createElement(InfoButton,{onClick:()=>changeWalletStep("LEARN_COMPACT")})),m&&!g&&D.createElement(tQ,{marginLeft:"16",width:"28"}),D.createElement(tQ,{marginLeft:m?"0":"6",paddingBottom:"8",paddingTop:"2",paddingX:"18"},D.createElement(rm,{as:"h1",color:"modalText",id:"rk_connect_title",size:"18",weight:"heavy",testId:"connect-header-label"},b.t("connect.title"))),m&&D.createElement(tQ,{marginRight:"16"},D.createElement(CloseButton,{onClose:e}))),D.createElement(tQ,{className:"_1vwt0cg2 ju367v7a ju367v7v",paddingBottom:"18"},Object.entries(x).map(([e,t],o)=>t.length>0&&D.createElement(D.Fragment,{key:o},e?D.createElement(tQ,{marginBottom:"8",marginTop:"16",marginX:"6"},D.createElement(rm,{color:"Installed"===e?"accentColor":"modalTextSecondary",size:"14",weight:"bold"},A.includes(e)?b.t(`connector_group.${e.toLowerCase()}`):e)):null,D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"4"},t.map(e=>D.createElement(ModalSelection,{currentlySelected:e.id===n,iconBackground:e.iconBackground,iconUrl:e.iconUrl,key:e.id,name:e.name,onClick:()=>selectWallet(e),ready:e.ready,recent:e.recent,testId:`wallet-option-${e.id}`,isRainbowKitConnector:e.isRainbowKitConnector})))))),m&&D.createElement(D.Fragment,null,D.createElement(tQ,{background:"generalBorder",height:"1",marginTop:"-1"}),g?D.createElement(tQ,{paddingX:"24",paddingY:"16",textAlign:"center"},D.createElement(g,{Link:DisclaimerLink,Text:DisclaimerText})):D.createElement(tQ,{alignItems:"center",display:"flex",justifyContent:"space-between",paddingX:"24",paddingY:"16"},D.createElement(tQ,{paddingY:"4"},D.createElement(rm,{color:"modalTextSecondary",size:"14",weight:"medium"},b.t("connect.new_to_ethereum.description"))),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"row",gap:"4",justifyContent:"center"},D.createElement(tQ,{className:touchableStyles({active:"shrink",hover:"grow"}),cursor:"pointer",onClick:()=>changeWalletStep("LEARN_COMPACT"),paddingY:"4",style:{willChange:"transform"},transition:"default"},D.createElement(rm,{color:"accentColor",size:"14",weight:"bold"},b.t("connect.new_to_ethereum.learn_more.label"))))))),(!m||"NONE"!==S)&&D.createElement(D.Fragment,null,!m&&D.createElement(tQ,{background:"generalBorder",minWidth:"1",width:"1"}),D.createElement(tQ,{display:"flex",flexDirection:"column",margin:"16",style:{flexGrow:1}},D.createElement(tQ,{alignItems:"center",display:"flex",justifyContent:"space-between",marginBottom:"12"},D.createElement(tQ,{width:"28"},P&&D.createElement(tQ,{as:"button",className:touchableStyles({active:"shrinkSm",hover:"growLg"}),color:"accentColor",onClick:()=>{P&&changeWalletStep(P,!0),null==t||t()},paddingX:"8",paddingY:"4",style:{boxSizing:"content-box",height:17,willChange:"transform"},transition:"default",type:"button"},D.createElement(BackIcon,null))),D.createElement(tQ,{display:"flex",justifyContent:"center",style:{flexGrow:1}},T&&D.createElement(rm,{color:"modalText",size:"18",textAlign:"center",weight:"heavy"},T)),D.createElement(CloseButton,{onClose:e})),D.createElement(tQ,{display:"flex",flexDirection:"column",style:{minHeight:m?396:432}},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"6",height:"full",justifyContent:"center",marginX:"8"},j)))))}var LoadingSpinner=({wallet:e})=>D.createElement("svg",{className:"_1am14413",viewBox:"0 0 86 86",width:"86",height:"86"},D.createElement("title",null,"Loading"),D.createElement("rect",{x:"3",y:"3",width:80,height:80,rx:20,ry:20,strokeDasharray:"53.333333333333336 "+320/3,strokeDashoffset:160,className:"_1am14412",style:{stroke:(null==e?void 0:e.iconAccent)||"#0D3887"}}));function WalletButton({onClose:e,wallet:t,connecting:n}){let{connect:o,iconBackground:i,iconUrl:s,id:l,name:c,getMobileUri:u,ready:d,shortName:p,showWalletConnectModal:f}=t,m=useCoolMode(s),g=(0,D.useRef)(!1),{i18n:b}=(0,D.useContext)(tY),y=(0,D.useCallback)(async()=>{let onMobileUri=async()=>{let e=await (null==u?void 0:u());if(e){if(e&&function({mobileUri:e,name:t}){localStorage.setItem(rb,JSON.stringify({href:e.split("?")[0],name:t}))}({mobileUri:e,name:c}),e.startsWith("http")){let t=document.createElement("a");t.href=e,t.target="_blank",t.rel="noreferrer noopener",t.click()}else window.location.href=e}};if("walletConnect"!==l&&onMobileUri(),f){f(),null==e||e();return}null==o||o()},[o,u,f,e,c,l]);return(0,D.useEffect)(()=>{n&&!g.current&&(y(),g.current=!0)},[n,y]),D.createElement(tQ,{as:"button",color:d?"modalText":"modalTextSecondary",disabled:!d,fontFamily:"body",key:l,onClick:y,ref:m,style:{overflow:"visible",textAlign:"center"},testId:`wallet-option-${l}`,type:"button",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",justifyContent:"center"},D.createElement(tQ,{display:"flex",alignItems:"center",justifyContent:"center",paddingBottom:"8",paddingTop:"10",position:"relative"},n?D.createElement(LoadingSpinner,{wallet:t}):null,D.createElement(AsyncImage,{background:i,borderRadius:"13",boxShadow:"walletLogo",height:"60",src:s,width:"60"})),n?null:D.createElement(tQ,{display:"flex",flexDirection:"column",textAlign:"center"},D.createElement(rm,{as:"h2",color:t.ready?"modalText":"modalTextSecondary",size:"13",weight:"medium"},D.createElement(tQ,{as:"span",position:"relative"},null!=p?p:c,!t.ready&&" (unsupported)")),t.recent&&D.createElement(rm,{color:"accentColor",size:"12",weight:"medium"},b.t("connect.recent")))))}function MobileOptions({onClose:e}){var t;let n=useWalletConnectors().filter(e=>e.isRainbowKitConnector),{disclaimer:o,learnMoreUrl:i}=(0,D.useContext)(rs),s=null,l=null,c=!1,u=null,[d,p]=(0,D.useState)("CONNECT"),{i18n:f}=(0,D.useContext)(tY),m=isIOS();switch(d){case"CONNECT":s=f.t("connect.title"),c=!0,l=D.createElement(tQ,null,D.createElement(tQ,{background:"profileForeground",className:"_1am14410",display:"flex",paddingBottom:"20",paddingTop:"6"},D.createElement(tQ,{display:"flex",style:{margin:"0 auto"}},n.filter(e=>e.ready).map(t=>D.createElement(tQ,{key:t.id,paddingX:"20"},D.createElement(tQ,{width:"60"},D.createElement(WalletButton,{onClose:e,wallet:t})))))),D.createElement(tQ,{background:"generalBorder",height:"1",marginBottom:"32",marginTop:"-1"}),D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",gap:"32",paddingX:"32",style:{textAlign:"center"}},D.createElement(tQ,{display:"flex",flexDirection:"column",gap:"8",textAlign:"center"},D.createElement(rm,{color:"modalText",size:"16",weight:"bold"},f.t("intro.title")),D.createElement(rm,{color:"modalTextSecondary",size:"16"},f.t("intro.description")))),D.createElement(tQ,{paddingTop:"32",paddingX:"20"},D.createElement(tQ,{display:"flex",gap:"14",justifyContent:"center"},D.createElement(ActionButton,{label:f.t("intro.get.label"),onClick:()=>p("GET"),size:"large",type:"secondary"}),D.createElement(ActionButton,{href:i,label:f.t("intro.learn_more.label"),size:"large",type:"secondary"}))),o&&D.createElement(tQ,{marginTop:"28",marginX:"32",textAlign:"center"},D.createElement(o,{Link:DisclaimerLink,Text:DisclaimerText})));break;case"GET":{s=f.t("get.title"),u="CONNECT";let e=null==(t=null==n?void 0:n.filter(e=>{var t,n,o;return(null==(t=e.downloadUrls)?void 0:t.ios)||(null==(n=e.downloadUrls)?void 0:n.android)||(null==(o=e.downloadUrls)?void 0:o.mobile)}))?void 0:t.splice(0,3);l=D.createElement(tQ,null,D.createElement(tQ,{alignItems:"center",display:"flex",flexDirection:"column",height:"full",marginBottom:"36",marginTop:"5",paddingTop:"12",width:"full"},e.map((t,n)=>{let{downloadUrls:o,iconBackground:i,iconUrl:s,name:l}=t;return(null==o?void 0:o.ios)||(null==o?void 0:o.android)||(null==o?void 0:o.mobile)?D.createElement(tQ,{display:"flex",gap:"16",key:t.id,paddingX:"20",width:"full"},D.createElement(tQ,{style:{minHeight:48,minWidth:48}},D.createElement(AsyncImage,{background:i,borderColor:"generalBorder",borderRadius:"10",height:"48",src:s,width:"48"})),D.createElement(tQ,{display:"flex",flexDirection:"column",width:"full"},D.createElement(tQ,{alignItems:"center",display:"flex",height:"48"},D.createElement(tQ,{width:"full"},D.createElement(rm,{color:"modalText",size:"18",weight:"bold"},l)),D.createElement(ActionButton,{href:(m?null==o?void 0:o.ios:null==o?void 0:o.android)||(null==o?void 0:o.mobile),label:f.t("get.action.label"),size:"small",type:"secondary"})),np(u),padding:"16",style:{height:17,willChange:"transform"},transition:"default",type:"button"},D.createElement(BackIcon,null))),D.createElement(tQ,{marginTop:"4",textAlign:"center",width:"full"},D.createElement(rm,{as:"h1",color:"modalText",id:"rk_connect_title",size:"20",weight:"bold"},s)),D.createElement(tQ,{alignItems:"center",display:"flex",height:"32",paddingRight:"14",position:"absolute",right:"0"},D.createElement(tQ,{style:{marginBottom:-20,marginTop:-20}},D.createElement(CloseButton,{onClose:e}))))),D.createElement(tQ,{display:"flex",flexDirection:"column"},l))}var MobileStatus=({onClose:e})=>{let{connector:t}=(0,D.useContext)(rc),{i18n:n}=(0,D.useContext)(tY),o=(null==t?void 0:t.name)||"";return D.createElement(tQ,null,D.createElement(tQ,{display:"flex",paddingBottom:"32",justifyContent:"center",alignItems:"center",background:"profileForeground",flexDirection:"column"},D.createElement(tQ,{width:"full",display:"flex",justifyContent:"flex-end",marginTop:"18",marginRight:"24"},D.createElement(CloseButton,{onClose:e})),D.createElement(tQ,{width:"60"},D.createElement(WalletButton,{onClose:e,wallet:t,connecting:!0})),D.createElement(tQ,{marginTop:"20"},D.createElement(rm,{textAlign:"center",color:"modalText",size:"18",weight:"semibold"},n.t("connect.status.connect_mobile",{wallet:o}))),D.createElement(tQ,{maxWidth:"full",marginTop:"8"},D.createElement(rm,{textAlign:"center",color:"modalText",size:"16",weight:"medium"},n.t("connect.status.confirm_mobile",{wallet:o})))))};function ConnectOptions({onClose:e}){let{connector:t}=(0,D.useContext)(rc);return isMobile()?t?D.createElement(MobileStatus,{onClose:e}):D.createElement(MobileOptions,{onClose:e}):D.createElement(DesktopOptions,{onClose:e})}function ConnectModal({onClose:e,open:t}){let n="rk_connect_title",o=useConnectionStatus(),{disconnect:i}=useDisconnect(),{isConnecting:s}=(0,_.m)(),l=D.useCallback(()=>{e(),i()},[e,i]),c=D.useCallback(()=>{s&&i(),e()},[e,i,s]);return"disconnected"===o?D.createElement(Dialog,{onClose:c,open:t,titleId:n},D.createElement(DialogContent,{bottomSheetOnMobile:!0,padding:"0",wide:!0},D.createElement(ConnectOptions,{onClose:c}))):"unauthenticated"===o?D.createElement(Dialog,{onClose:l,open:t,titleId:n},D.createElement(DialogContent,{bottomSheetOnMobile:!0,padding:"0"},D.createElement(SignIn,{onClose:l,onCloseModal:e}))):null}function useModalStateValue(){let[e,t]=(0,D.useState)(!1);return{closeModal:(0,D.useCallback)(()=>t(!1),[]),isModalOpen:e,openModal:(0,D.useCallback)(()=>t(!0),[])}}var rB=(0,D.createContext)({accountModalOpen:!1,chainModalOpen:!1,connectModalOpen:!1,isWalletConnectModalOpen:!1,setIsWalletConnectModalOpen:()=>{}});function ModalProvider({children:e}){let{closeModal:t,isModalOpen:n,openModal:o}=useModalStateValue(),{closeModal:i,isModalOpen:s,openModal:l}=useModalStateValue(),{closeModal:c,isModalOpen:u,openModal:d}=useModalStateValue(),[p,f]=(0,D.useState)(!1),m=useConnectionStatus(),{chainId:g}=(0,_.m)(),{chains:b}=(0,z.Z)(),y=b.some(e=>e.id===g);function closeModals({keepConnectModalOpen:e=!1}={}){e||t(),i(),c()}let v="unauthenticated"===useAuthenticationStatus();return useAccountEffect_useAccountEffect({onConnect:()=>closeModals({keepConnectModalOpen:v}),onDisconnect:()=>closeModals()}),(0,D.useEffect)(()=>{v&&closeModals()},[v]),D.createElement(rB.Provider,{value:(0,D.useMemo)(()=>({accountModalOpen:s,chainModalOpen:u,connectModalOpen:n,isWalletConnectModalOpen:p,openAccountModal:y&&"connected"===m?l:void 0,openChainModal:"connected"===m?d:void 0,openConnectModal:"disconnected"===m||"unauthenticated"===m?o:void 0,setIsWalletConnectModalOpen:f}),[m,s,u,n,l,d,o,y,p])},e,D.createElement(ConnectModal,{onClose:t,open:n}),D.createElement(AccountModal,{onClose:i,open:s}),D.createElement(ChainModal,{onClose:c,open:u}))}function useWalletConnectOpenState(){let{isWalletConnectModalOpen:e,setIsWalletConnectModalOpen:t}=(0,D.useContext)(rB);return{isWalletConnectModalOpen:e,setIsWalletConnectModalOpen:t}}var noop=()=>{};function ConnectButtonRenderer({children:e}){var t,n,o,i;let s=function(){let[e,t]=(0,D.useState)(!1);return(0,D.useEffect)(()=>(t(!0),()=>{t(!1)}),[]),(0,D.useCallback)(()=>e,[e])}(),{address:l}=(0,_.m)(),c=useMainnetEnsName(l),u=useMainnetEnsAvatar(c),{chainId:d}=(0,_.m)(),{chains:p}=(0,z.Z)(),f=p.some(e=>e.id===d),m=useRainbowKitChainsById(),g=null!=(t=useAuthenticationStatus())?t:void 0,b=d?m[d]:void 0,y=null!=(n=null==b?void 0:b.name)?n:void 0,v=null!=(o=null==b?void 0:b.iconUrl)?o:void 0,w=null!=(i=null==b?void 0:b.iconBackground)?i:void 0,C=useAsyncImage(v),E=(0,D.useContext)(rp),x=useRecentTransactions().some(({status:e})=>"pending"===e)&&E,{showBalance:A}=useShowBalance(),k="boolean"==typeof A?A:!A||t_(A)[isMobile()?"smallScreen":"largeScreen"],{data:B}=useBalance({address:k?l:void 0}),S=B?`${abbreviateETHBalance(parseFloat(B.formatted))} ${B.symbol}`:void 0,{openConnectModal:I}=function(){let{connectModalOpen:e,openConnectModal:t}=(0,D.useContext)(rB),{isWalletConnectModalOpen:n}=useWalletConnectOpenState();return{connectModalOpen:e||n,openConnectModal:t}}(),{openChainModal:j}=function(){let{chainModalOpen:e,openChainModal:t}=(0,D.useContext)(rB);return{chainModalOpen:e,openChainModal:t}}(),{openAccountModal:T}=function(){let{accountModalOpen:e,openAccountModal:t}=(0,D.useContext)(rB);return{accountModalOpen:e,openAccountModal:t}}(),{accountModalOpen:P,chainModalOpen:M,connectModalOpen:O}=function(){let{accountModalOpen:e,chainModalOpen:t,connectModalOpen:n}=(0,D.useContext)(rB);return{accountModalOpen:e,chainModalOpen:t,connectModalOpen:n}}();return D.createElement(D.Fragment,null,e({account:l?{address:l,balanceDecimals:null==B?void 0:B.decimals,balanceFormatted:null==B?void 0:B.formatted,balanceSymbol:null==B?void 0:B.symbol,displayBalance:S,displayName:c?formatENS(c):formatAddress(l),ensAvatar:null!=u?u:void 0,ensName:null!=c?c:void 0,hasPendingTransactions:x}:void 0,accountModalOpen:P,authenticationStatus:g,chain:d?{hasIcon:!!v,iconBackground:w,iconUrl:C,id:d,name:y,unsupported:!f}:void 0,chainModalOpen:M,connectModalOpen:O,mounted:s(),openAccountModal:null!=T?T:noop,openChainModal:null!=j?j:noop,openConnectModal:null!=I?I:noop}))}ConnectButtonRenderer.displayName="ConnectButton.Custom";var rS={accountStatus:"full",chainStatus:{largeScreen:"full",smallScreen:"icon"},label:"Connect Wallet",showBalance:{largeScreen:!0,smallScreen:!1}};function ConnectButton({accountStatus:e=rS.accountStatus,chainStatus:t=rS.chainStatus,label:n=rS.label,showBalance:o=rS.showBalance}){let i=useRainbowKitChains(),s=useConnectionStatus(),{setShowBalance:l}=useShowBalance(),[c,u]=(0,D.useState)(!1),{i18n:d}=(0,D.useContext)(tY);return(0,D.useEffect)(()=>{l(o),c||u(!0)},[o,l]),c?D.createElement(ConnectButtonRenderer,null,({account:l,chain:c,mounted:u,openAccountModal:p,openChainModal:f,openConnectModal:m})=>{var g,b,y;let v=u&&"loading"!==s,w=null!=(g=null==c?void 0:c.unsupported)&&g;return D.createElement(tQ,{display:"flex",gap:"12",...!v&&{"aria-hidden":!0,style:{opacity:0,pointerEvents:"none",userSelect:"none"}}},v&&l&&"connected"===s?D.createElement(D.Fragment,null,c&&(i.length>1||w)&&D.createElement(tQ,{alignItems:"center","aria-label":"Chain Selector",as:"button",background:w?"connectButtonBackgroundError":"connectButtonBackground",borderRadius:"connectButton",boxShadow:"connectButton",className:touchableStyles({active:"shrink",hover:"grow"}),color:w?"connectButtonTextError":"connectButtonText",display:tD(t,e=>"none"===e?"none":"flex"),fontFamily:"body",fontWeight:"bold",gap:"6",key:w?"unsupported":"supported",onClick:f,paddingX:"10",paddingY:"8",testId:w?"wrong-network-button":"chain-button",transition:"default",type:"button"},w?D.createElement(tQ,{alignItems:"center",display:"flex",height:"24",paddingX:"4"},d.t("connect_wallet.wrong_network.label")):D.createElement(tQ,{alignItems:"center",display:"flex",gap:"6"},c.hasIcon?D.createElement(tQ,{display:tD(t,e=>"full"===e||"icon"===e?"block":"none"),height:"24",width:"24"},D.createElement(AsyncImage,{alt:null!=(b=c.name)?b:"Chain icon",background:c.iconBackground,borderRadius:"full",height:"24",src:c.iconUrl,width:"24"})):null,D.createElement(tQ,{display:tD(t,e=>"icon"!==e||c.iconUrl?"full"===e||"name"===e?"block":"none":"block")},null!=(y=c.name)?y:c.id)),D.createElement(DropdownIcon,null)),!w&&D.createElement(tQ,{alignItems:"center",as:"button",background:"connectButtonBackground",borderRadius:"connectButton",boxShadow:"connectButton",className:touchableStyles({active:"shrink",hover:"grow"}),color:"connectButtonText",display:"flex",fontFamily:"body",fontWeight:"bold",onClick:p,testId:"account-button",transition:"default",type:"button"},l.displayBalance&&D.createElement(tQ,{display:tD(o,e=>e?"block":"none"),padding:"8",paddingLeft:"12"},l.displayBalance),D.createElement(tQ,{background:t_(o)[isMobile()?"smallScreen":"largeScreen"]?"connectButtonInnerBackground":"connectButtonBackground",borderColor:"connectButtonBackground",borderRadius:"connectButton",borderStyle:"solid",borderWidth:"2",color:"connectButtonText",fontFamily:"body",fontWeight:"bold",paddingX:"8",paddingY:"6",transition:"default"},D.createElement(tQ,{alignItems:"center",display:"flex",gap:"6",height:"24"},D.createElement(tQ,{display:tD(e,e=>"full"===e||"avatar"===e?"block":"none")},D.createElement(Avatar,{address:l.address,imageUrl:l.ensAvatar,loading:l.hasPendingTransactions,size:24})),D.createElement(tQ,{alignItems:"center",display:"flex",gap:"6"},D.createElement(tQ,{display:tD(e,e=>"full"===e||"address"===e?"block":"none")},l.displayName),D.createElement(DropdownIcon,null)))))):D.createElement(tQ,{as:"button",background:"accentColor",borderRadius:"connectButton",boxShadow:"connectButton",className:touchableStyles({active:"shrink",hover:"grow"}),color:"accentColorForeground",fontFamily:"body",fontWeight:"bold",height:"40",key:"connect",onClick:m,paddingX:"14",testId:"connect-button",transition:"default",type:"button"},u&&"Connect Wallet"===n?d.t("connect_wallet.label"):n))}):D.createElement(D.Fragment,null)}ConnectButton.__defaultProps=rS,ConnectButton.Custom=ConnectButtonRenderer;var computeWalletConnectMetaData=({appName:e,appDescription:t,appUrl:n,appIcon:o})=>({name:e,description:null!=t?t:e,url:null!=n?n:"undefined"!=typeof window?window.location.href:"",icons:[...o?[o]:[]]}),connectorsForWallets=(e,{projectId:t,walletConnectParameters:n,appName:o,appDescription:i,appUrl:s,appIcon:l})=>{let c=-1,u=[],d=[],p=[],f=computeWalletConnectMetaData({appName:o,appDescription:i,appUrl:s,appIcon:l});e.forEach(({groupName:e,wallets:i},s)=>{i.forEach(i=>{c++;let u=i({projectId:t,appName:o,appIcon:l,options:{metadata:f,...n},walletConnectParameters:{metadata:f,...n}});if((null==u?void 0:u.iconAccent)&&!isHexString(null==u?void 0:u.iconAccent))throw Error(`Property \`iconAccent\` is not a hex value for wallet: ${u.name}`);let m={...u,groupIndex:s+1,groupName:e,index:c};"function"==typeof u.hidden?p.push(m):d.push(m)})});let m=[...d,...p];for(let{createConnector:e,groupIndex:t,groupName:n,hidden:o,...i}of m){if("function"==typeof o){let e=o();if(e)continue}let walletMetaData=e=>({rkDetails:Object.fromEntries(Object.entries({...i,groupIndex:t,groupName:n,isRainbowKitConnector:!0,...e||{}}).filter(([e,t])=>void 0!==t))}),s="walletConnect"===i.id;s&&u.push(e(walletMetaData({isWalletConnectModalConnector:!0,showQrModal:!0})));let l=e(walletMetaData());u.push(l)}return u},rI=new Map,getOrCreateWalletConnectInstance=({projectId:e,walletConnectParameters:t,rkDetailsShowQrModal:n})=>{let o={...t||{},projectId:e,showQrModal:!1};n&&(o={...o,showQrModal:!0});let i=JSON.stringify(o),s=rI.get(i);if(s)return s;let l=walletConnect(o);return rI.set(i,l),l};function getWalletConnectConnector({projectId:e,walletConnectParameters:t}){if(!e||""===e)throw Error("No projectId found. Every dApp must now provide a WalletConnect Cloud projectId to enable WalletConnect v2 https://www.rainbowkit.com/docs/installation#configure");return"YOUR_PROJECT_ID"===e&&(e="21fef48091f12692cad574a6f7753643"),n=>(function({projectId:e,walletDetails:t,walletConnectParameters:n}){return o=>({...getOrCreateWalletConnectInstance({projectId:e,walletConnectParameters:n,rkDetailsShowQrModal:t.rkDetails.showQrModal})(o),...t})})({projectId:e,walletDetails:n,walletConnectParameters:t})}function getExplicitInjectedProvider(e){if("undefined"==typeof window||void 0===window.ethereum)return;let t=window.ethereum.providers;return t?t.find(t=>t[e]):window.ethereum[e]?window.ethereum:void 0}function getWindowProviderNamespace(e){let providerSearch=(e,t)=>{let[n,...o]=t.split("."),i=e[n];if(i)return 0===o.length?i:providerSearch(i,o.join("."))};if("undefined"!=typeof window)return providerSearch(window,e)}function hasInjectedProvider({flag:e,namespace:t}){return!!t&&void 0!==getWindowProviderNamespace(t)||!!e&&void 0!==getExplicitInjectedProvider(e)}function getInjectedConnector({flag:e,namespace:t,target:n}){let o=n||function({flag:e,namespace:t}){var n;if("undefined"==typeof window)return;if(t){let e=getWindowProviderNamespace(t);if(e)return e}let o=null==(n=window.ethereum)?void 0:n.providers;if(e){let t=getExplicitInjectedProvider(e);if(t)return t}return void 0!==o&&o.length>0?o[0]:window.ethereum}({flag:e,namespace:t});return e=>{let t=o?{target:()=>({id:e.rkDetails.id,name:e.rkDetails.name,provider:o})}:{};return n=>({...injected(t)(n),...e})}}var dist_coinbaseWallet=({appName:e,appIcon:t})=>{let o=hasInjectedProvider({flag:"isCoinbaseWallet"}),i=isIOS();return{id:"coinbase",name:"Coinbase Wallet",shortName:"Coinbase",rdns:"com.coinbase.wallet",iconUrl:async()=>(await n.e(1950).then(n.bind(n,41950))).default,iconAccent:"#2c5ff6",iconBackground:"#2c5ff6",installed:o||void 0,downloadUrls:{android:"https://play.google.com/store/apps/details?id=org.toshi",ios:"https://apps.apple.com/us/app/coinbase-wallet-store-crypto/id1278383455",mobile:"https://coinbase.com/wallet/downloads",qrCode:"https://coinbase-wallet.onelink.me/q5Sx/fdb9b250",chrome:"https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad",browserExtension:"https://coinbase.com/wallet"},...i?{}:{qrCode:{getUri:e=>e,instructions:{learnMoreUrl:"https://coinbase.com/wallet/articles/getting-started-mobile",steps:[{description:"wallet_connectors.coinbase.qr_code.step1.description",step:"install",title:"wallet_connectors.coinbase.qr_code.step1.title"},{description:"wallet_connectors.coinbase.qr_code.step2.description",step:"create",title:"wallet_connectors.coinbase.qr_code.step2.title"},{description:"wallet_connectors.coinbase.qr_code.step3.description",step:"scan",title:"wallet_connectors.coinbase.qr_code.step3.title"}]}},extension:{instructions:{learnMoreUrl:"https://coinbase.com/wallet/articles/getting-started-extension",steps:[{description:"wallet_connectors.coinbase.extension.step1.description",step:"install",title:"wallet_connectors.coinbase.extension.step1.title"},{description:"wallet_connectors.coinbase.extension.step2.description",step:"create",title:"wallet_connectors.coinbase.extension.step2.title"},{description:"wallet_connectors.coinbase.extension.step3.description",step:"refresh",title:"wallet_connectors.coinbase.extension.step3.title"}]}}},createConnector:n=>o=>({...coinbaseWallet({appName:e,appLogoUrl:t,headlessMode:!0})(o),...n})}};function isMetaMask(e){return!!(null==e?void 0:e.isMetaMask)&&(!e.isBraveWallet||!!e._events||!!e._state)&&!e.isApexWallet&&!e.isAvalanche&&!e.isBackpack&&!e.isBifrost&&!e.isBitKeep&&!e.isBitski&&!e.isBlockWallet&&!e.isCoinbaseWallet&&!e.isDawn&&!e.isEnkrypt&&!e.isExodus&&!e.isFrame&&!e.isFrontier&&!e.isGamestop&&!e.isHyperPay&&!e.isImToken&&!e.isKuCoinWallet&&!e.isMathWallet&&!e.isOkxWallet&&!e.isOKExWallet&&!e.isOneInchIOSWallet&&!e.isOneInchAndroidWallet&&!e.isOpera&&!e.isPhantom&&!e.isPortal&&!e.isRabby&&!e.isRainbow&&!e.isStatus&&!e.isTalisman&&!e.isTally&&!e.isTokenPocket&&!e.isTokenary&&!e.isTrust&&!e.isTrustWallet&&!e.isXDEFI&&!e.isZeal&&!e.isZerion}var metaMaskWallet=({projectId:e,walletConnectParameters:t})=>{var o,i,s;let l=hasInjectedProvider({flag:"isMetaMask"}),c=!l,getUri=e=>isAndroid()?e:isIOS()?`metamask://wc?uri=${encodeURIComponent(e)}`:`https://metamask.app.link/wc?uri=${encodeURIComponent(e)}`;return{id:"metaMask",name:"MetaMask",rdns:"io.metamask",iconUrl:async()=>(await n.e(4419).then(n.bind(n,84419))).default,iconAccent:"#f6851a",iconBackground:"#fff",installed:c?void 0:l,downloadUrls:{android:"https://play.google.com/store/apps/details?id=io.metamask",ios:"https://apps.apple.com/us/app/metamask/id1438144202",mobile:"https://metamask.io/download",qrCode:"https://metamask.io/download",chrome:"https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn",edge:"https://microsoftedge.microsoft.com/addons/detail/metamask/ejbalbakoplchlghecdalmeeeajnimhm",firefox:"https://addons.mozilla.org/firefox/addon/ether-metamask",opera:"https://addons.opera.com/extensions/details/metamask-10",browserExtension:"https://metamask.io/download"},mobile:{getUri:c?getUri:void 0},qrCode:c?{getUri,instructions:{learnMoreUrl:"https://metamask.io/faqs/",steps:[{description:"wallet_connectors.metamask.qr_code.step1.description",step:"install",title:"wallet_connectors.metamask.qr_code.step1.title"},{description:"wallet_connectors.metamask.qr_code.step2.description",step:"create",title:"wallet_connectors.metamask.qr_code.step2.title"},{description:"wallet_connectors.metamask.qr_code.step3.description",step:"refresh",title:"wallet_connectors.metamask.qr_code.step3.title"}]}}:void 0,extension:{instructions:{learnMoreUrl:"https://metamask.io/faqs/",steps:[{description:"wallet_connectors.metamask.extension.step1.description",step:"install",title:"wallet_connectors.metamask.extension.step1.title"},{description:"wallet_connectors.metamask.extension.step2.description",step:"create",title:"wallet_connectors.metamask.extension.step2.title"},{description:"wallet_connectors.metamask.extension.step3.description",step:"refresh",title:"wallet_connectors.metamask.extension.step3.title"}]}},createConnector:c?getWalletConnectConnector({projectId:e,walletConnectParameters:t}):getInjectedConnector({target:"undefined"!=typeof window?null!=(s=null==(i=null==(o=window.ethereum)?void 0:o.providers)?void 0:i.find(isMetaMask))?s:window.ethereum:void 0})}},rainbowWallet=({projectId:e,walletConnectParameters:t})=>{let o=hasInjectedProvider({flag:"isRainbow"}),i=!o,getUri=e=>isAndroid()?e:isIOS()?`rainbow://wc?uri=${encodeURIComponent(e)}&connector=rainbowkit`:`https://rnbwapp.com/wc?uri=${encodeURIComponent(e)}&connector=rainbowkit`;return{id:"rainbow",name:"Rainbow",rdns:"me.rainbow",iconUrl:async()=>(await n.e(1608).then(n.bind(n,31608))).default,iconBackground:"#0c2f78",installed:i?void 0:o,downloadUrls:{android:"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Drainbowkit&utm_source=rainbowkit",ios:"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=rainbowkit&mt=8",mobile:"https://rainbow.download?utm_source=rainbowkit",qrCode:"https://rainbow.download?utm_source=rainbowkit&utm_medium=qrcode",browserExtension:"https://rainbow.me/extension?utm_source=rainbowkit"},mobile:{getUri:i?getUri:void 0},qrCode:i?{getUri,instructions:{learnMoreUrl:"https://learn.rainbow.me/connect-to-a-website-or-app?utm_source=rainbowkit&utm_medium=connector&utm_campaign=learnmore",steps:[{description:"wallet_connectors.rainbow.qr_code.step1.description",step:"install",title:"wallet_connectors.rainbow.qr_code.step1.title"},{description:"wallet_connectors.rainbow.qr_code.step2.description",step:"create",title:"wallet_connectors.rainbow.qr_code.step2.title"},{description:"wallet_connectors.rainbow.qr_code.step3.description",step:"scan",title:"wallet_connectors.rainbow.qr_code.step3.title"}]}}:void 0,createConnector:i?getWalletConnectConnector({projectId:e,walletConnectParameters:t}):getInjectedConnector({flag:"isRainbow"})}},walletConnectWallet=({projectId:e,options:t})=>({id:"walletConnect",name:"WalletConnect",installed:void 0,iconUrl:async()=>(await n.e(3525).then(n.bind(n,33525))).default,iconBackground:"#3b99fc",qrCode:{getUri:e=>e},createConnector:getWalletConnectConnector({projectId:e,walletConnectParameters:t})}),createDefaultTransports=e=>{let t=e.reduce((e,t)=>{let n=t.id;return e[n]=function(e,t={}){let{batch:n,fetchOptions:o,key:i="http",name:s="HTTP JSON-RPC",onFetchResponse:l,retryDelay:c}=t;return({chain:u,retryCount:d,timeout:p})=>{let{batchSize:f=1e3,wait:m=0}="object"==typeof n?n:{},g=t.retryCount??d,b=p??t.timeout??1e4,y=e||u?.rpcUrls.default.http[0];if(!y)throw new UrlRequiredError;let v=function(e,t={}){return{async request(n){let{body:o,fetchOptions:i={},onResponse:s=t.onResponse,timeout:l=t.timeout??1e4}=n,{headers:c,method:u,signal:d}={...t.fetchOptions,...i};try{let t;let n=await withTimeout(async({signal:t})=>{let n=await fetch(e,{...i,body:Array.isArray(o)?(0,e7.P)(o.map(e=>({jsonrpc:"2.0",id:e.id??tj.take(),...e}))):(0,e7.P)({jsonrpc:"2.0",id:o.id??tj.take(),...o}),headers:{...c,"Content-Type":"application/json"},method:u||"POST",signal:d||(l>0?t:null)});return n},{errorInstance:new tS.W5({body:o,url:e}),timeout:l,signal:!0});if(s&&await s(n),t=n.headers.get("Content-Type")?.startsWith("application/json")?await n.json():await n.text(),!n.ok)throw new tS.Gg({body:o,details:(0,e7.P)(t.error)||n.statusText,headers:n.headers,status:n.status,url:e});return t}catch(t){if(t instanceof tS.Gg||t instanceof tS.W5)throw t;throw new tS.Gg({body:o,details:t.message,url:e})}}}}(y,{fetchOptions:o,onResponse:l,timeout:b});return(0,tT.q)({key:i,name:s,async request({method:t,params:o}){let i={method:t,params:o},{schedule:s}=(0,tI.S)({id:`${e}`,wait:m,shouldSplitBatch:e=>e.length>f,fn:e=>v.request({body:e}),sort:(e,t)=>e.id-t.id}),fn=async e=>n?s(e):[await v.request({body:e})],[{error:l,result:c}]=await fn(i);if(l)throw new tS.bs({body:i,error:l,url:y});return c},retryCount:g,retryDelay:c,timeout:b,type:"http"},{fetchOptions:o,url:y})}}(),e},{});return t},getDefaultConfig=({appName:e,appDescription:t,appUrl:n,appIcon:o,wallets:i,projectId:s,...l})=>{let{transports:c,chains:u,...d}=l,p=computeWalletConnectMetaData({appName:e,appDescription:t,appUrl:n,appIcon:o}),f=connectorsForWallets(i||[{groupName:"Popular",wallets:[rainbowWallet,dist_coinbaseWallet,metaMaskWallet,walletConnectWallet]}],{projectId:s,appName:e,appDescription:t,appUrl:n,appIcon:o,walletConnectParameters:{metadata:p}});return c||(c=createDefaultTransports(u)),function(e){let t;let{multiInjectedProviderDiscovery:n=!0,storage:o=function(e){let{deserialize:t=deserialize_deserialize,key:n="wagmi",serialize:o=serialize_serialize,storage:i=tU}=e;function unwrap(e){return e instanceof Promise?e.then(e=>e).catch(()=>null):e}return{...i,key:n,async getItem(e,o){let s=i.getItem(`${n}.${e}`),l=await unwrap(s);return l?t(l)??null:o??null},async setItem(e,t){let s=`${n}.${e}`;null===t?await unwrap(i.removeItem(s)):await unwrap(i.setItem(s,o(t)))},async removeItem(e){await unwrap(i.removeItem(`${n}.${e}`))}}}({storage:"undefined"!=typeof window&&window.localStorage?window.localStorage:tU}),syncConnectedChain:i=!0,ssr:s,...l}=e,c="undefined"!=typeof window&&n?function(){let e=new Set,t=[],request=()=>(function(e){let handler=t=>e(t.detail);return window.addEventListener("eip6963:announceProvider",handler),window.dispatchEvent(new CustomEvent("eip6963:requestProvider")),()=>window.removeEventListener("eip6963:announceProvider",handler)})(n=>{t.some(({info:e})=>e.uuid===n.info.uuid)||(t=[...t,n],e.forEach(e=>e(t,{added:[n]})))}),n=request();return{_listeners:()=>e,clear(){e.forEach(e=>e([],{removed:[...t]})),t=[]},destroy(){this.clear(),e.clear(),n()},findProvider:({rdns:e})=>t.find(t=>t.info.rdns===e),getProviders:()=>t,reset(){this.clear(),n(),n=request()},subscribe:(n,{emitImmediately:o}={})=>(e.add(n),o&&n(t,{added:t}),()=>e.delete(n))}}():void 0,u=vanilla_createStore(()=>l.chains),d=vanilla_createStore(()=>[...l.connectors??[],...s?[]:c?.getProviders().map(providerDetailToConnector)??[]].map(setup));function setup(e){var t;let n=(t=function(e=11){if(!C||tF+e>512){C="",tF=0;for(let e=0;e<256;e++)C+=(256+256*Math.random()|0).toString(16).substring(1)}return C.substring(tF,tF+++e)}(),new Emitter(t)),i={...e({emitter:n,chains:u.getState(),storage:o}),emitter:n,uid:n.uid};return n.on("connect",connect),i.setup?.(),i}function providerDetailToConnector(e){let{info:t}=e,n=e.provider;return injected({target:{...t,id:t.rdns,provider:n}})}let p=new Map;function getInitialState(){return{chainId:u.getState()[0].id,connections:new Map,current:void 0,status:"disconnected"}}let f="0.0.0-canary-";t=tN.i.startsWith(f)?parseInt(tN.i.replace(f,"")):parseInt(tN.i.split(".")[0]??"0");let m=vanilla_createStore(subscribeWithSelector(o?persist(getInitialState,{migrate(e,n){if(n===t)return e;let o=getInitialState(),i=e&&"object"==typeof e&&"chainId"in e&&"number"==typeof e.chainId?e.chainId:o.chainId;return{...o,chainId:i}},name:"store",partialize:e=>({connections:{__type:"Map",value:Array.from(e.connections.entries()).map(([e,t])=>{let{id:n,name:o,type:i,uid:s}=t.connector;return[e,{...t,connector:{id:n,name:o,type:i,uid:s}}]})},chainId:e.chainId,current:e.current}),skipHydration:s,storage:o,version:t}):getInitialState));function change(e){m.setState(t=>{let n=t.connections.get(e.uid);return n?{...t,connections:new Map(t.connections).set(e.uid,{accounts:e.accounts??n.accounts,chainId:e.chainId??n.chainId,connector:n.connector})}:t})}function connect(e){"connecting"!==m.getState().status&&"reconnecting"!==m.getState().status&&m.setState(t=>{let n=d.getState().find(t=>t.uid===e.uid);return n?{...t,connections:new Map(t.connections).set(e.uid,{accounts:e.accounts,chainId:e.chainId,connector:n}),current:e.uid,status:"connected"}:t})}return i&&m.subscribe(({connections:e,current:t})=>t?e.get(t)?.chainId:void 0,e=>{let t=u.getState().some(t=>t.id===e);if(t)return m.setState(t=>({...t,chainId:e??t.chainId}))}),c?.subscribe(e=>{let t=new Map;for(let e of d.getState())t.set(e.id,!0);let n=[];for(let o of e){let e=setup(providerDetailToConnector(o));t.has(e.id)||n.push(e)}d.setState(e=>[...e,...n],!0)}),{get chains(){return u.getState()},get connectors(){return d.getState()},storage:o,getClient:function(e={}){let t;let n=e.chainId??m.getState().chainId,o=u.getState().find(e=>e.id===n);if(e.chainId&&!o)throw new tw.X4;{let e=p.get(m.getState().chainId);if(e&&!o)return e;if(!o)throw new tw.X4}{let e=p.get(n);if(e)return e}if(l.client)t=l.client({chain:o});else{let e=o.id,n=u.getState().map(e=>e.id),i={},s=Object.entries(l);for(let[t,o]of s)if("chains"!==t&&"client"!==t&&"connectors"!==t&&"transports"!==t){if("object"==typeof o){if(e in o)i[t]=o[e];else{let e=n.some(e=>e in o);if(e)continue;i[t]=o}}else i[t]=o}t=(0,tP.e)({...i,chain:o,batch:i.batch??{multicall:!0},transport:t=>l.transports[e]({...t,connectors:d})})}return p.set(n,t),t},get state(){return m.getState()},setState(e){let t;t="function"==typeof e?e(m.getState()):e;let n=getInitialState();"object"!=typeof t&&(t=n);let o=Object.keys(n).some(e=>!(e in t));o&&(t=n),m.setState(t,!0)},subscribe:(e,t,n)=>m.subscribe(e,t,n?{...n,fireImmediately:n.emitImmediately}:void 0),_internal:{mipd:c,store:m,ssr:!!s,syncConnectedChain:i,transports:l.transports,chains:{setState(e){let t="function"==typeof e?e(u.getState()):e;if(0!==t.length)return u.setState(t,!0)},subscribe:e=>u.subscribe(e)},connectors:{providerDetailToConnector,setup,setState:e=>d.setState("function"==typeof e?e(d.getState()):e,!0),subscribe:e=>d.subscribe(e)},events:{change,connect,disconnect:function disconnect(e){m.setState(t=>{let n=t.connections.get(e.uid);if(n&&(n.connector.emitter.off("change",change),n.connector.emitter.off("disconnect",disconnect),n.connector.emitter.on("connect",connect)),t.connections.delete(e.uid),0===t.connections.size)return{...t,connections:new Map,current:void 0,status:"disconnected"};let o=t.connections.values().next().value;return{...t,connections:new Map(t.connections),current:o.connector.uid}})}}}}}({connectors:f,chains:u,transports:c,...d})}},66474:function(e,t,n){"use strict";n.d(t,{j:function(){return s}});var o=n(7506),i=n(24139),s=new class extends o.l{#L;#z;#q;constructor(){super(),this.#q=e=>{if(!i.sk&&window.addEventListener){let listener=()=>e();return window.addEventListener("visibilitychange",listener,!1),()=>{window.removeEventListener("visibilitychange",listener)}}}}onSubscribe(){this.#z||this.setEventListener(this.#q)}onUnsubscribe(){this.hasListeners()||(this.#z?.(),this.#z=void 0)}setEventListener(e){this.#q=e,this.#z?.(),this.#z=e(e=>{"boolean"==typeof e?this.setFocused(e):this.onFocus()})}setFocused(e){let t=this.#L!==e;t&&(this.#L=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return"boolean"==typeof this.#L?this.#L:globalThis.document?.visibilityState!=="hidden"}}},59289:function(e,t,n){"use strict";n.d(t,{R:function(){return getDefaultState},m:function(){return l}});var o=n(27037),i=n(48907),s=n(72008),l=class extends i.F{#G;#d;#u;#W;constructor(e){super(),this.mutationId=e.mutationId,this.#d=e.defaultOptions,this.#u=e.mutationCache,this.#G=[],this.state=e.state||getDefaultState(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options={...this.#d,...e},this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#G.includes(e)||(this.#G.push(e),this.clearGcTimeout(),this.#u.notify({type:"observerAdded",mutation:this,observer:e}))}removeObserver(e){this.#G=this.#G.filter(t=>t!==e),this.scheduleGc(),this.#u.notify({type:"observerRemoved",mutation:this,observer:e})}optionalRemove(){this.#G.length||("pending"===this.state.status?this.scheduleGc():this.#u.remove(this))}continue(){return this.#W?.continue()??this.execute(this.state.variables)}async execute(e){let t="pending"===this.state.status;try{if(!t){this.#H({type:"pending",variables:e}),await this.#u.config.onMutate?.(e,this);let t=await this.options.onMutate?.(e);t!==this.state.context&&this.#H({type:"pending",context:t,variables:e})}let n=await (this.#W=(0,s.Mz)({fn:()=>this.options.mutationFn?this.options.mutationFn(e):Promise.reject(Error("No mutationFn found")),onFail:(e,t)=>{this.#H({type:"failed",failureCount:e,error:t})},onPause:()=>{this.#H({type:"pause"})},onContinue:()=>{this.#H({type:"continue"})},retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode}),this.#W.promise);return await this.#u.config.onSuccess?.(n,e,this.state.context,this),await this.options.onSuccess?.(n,e,this.state.context),await this.#u.config.onSettled?.(n,null,this.state.variables,this.state.context,this),await this.options.onSettled?.(n,null,e,this.state.context),this.#H({type:"success",data:n}),n}catch(t){try{throw await this.#u.config.onError?.(t,e,this.state.context,this),await this.options.onError?.(t,e,this.state.context),await this.#u.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this),await this.options.onSettled?.(void 0,t,e,this.state.context),t}finally{this.#H({type:"error",error:t})}}}#H(e){this.state=(t=>{switch(e.type){case"failed":return{...t,failureCount:e.failureCount,failureReason:e.error};case"pause":return{...t,isPaused:!0};case"continue":return{...t,isPaused:!1};case"pending":return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:!(0,s.Kw)(this.options.networkMode),status:"pending",variables:e.variables,submittedAt:Date.now()};case"success":return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:"error"}}})(this.state),o.V.batch(()=>{this.#G.forEach(t=>{t.onMutationUpdate(e)}),this.#u.notify({mutation:this,type:"updated",action:e})})}};function getDefaultState(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}},27037:function(e,t,n){"use strict";n.d(t,{V:function(){return o}});var o=function(){let e=[],t=0,notifyFn=e=>{e()},batchNotifyFn=e=>{e()},scheduleFn=e=>setTimeout(e,0),schedule=n=>{t?e.push(n):scheduleFn(()=>{notifyFn(n)})},flush=()=>{let t=e;e=[],t.length&&scheduleFn(()=>{batchNotifyFn(()=>{t.forEach(e=>{notifyFn(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{--t||flush()}return n},batchCalls:e=>(...t)=>{schedule(()=>{e(...t)})},schedule,setNotifyFunction:e=>{notifyFn=e},setBatchNotifyFunction:e=>{batchNotifyFn=e},setScheduler:e=>{scheduleFn=e}}}()},14304:function(e,t,n){"use strict";n.d(t,{N:function(){return s}});var o=n(7506),i=n(24139),s=new class extends o.l{#Q=!0;#z;#q;constructor(){super(),this.#q=e=>{if(!i.sk&&window.addEventListener){let onlineListener=()=>e(!0),offlineListener=()=>e(!1);return window.addEventListener("online",onlineListener,!1),window.addEventListener("offline",offlineListener,!1),()=>{window.removeEventListener("online",onlineListener),window.removeEventListener("offline",offlineListener)}}}}onSubscribe(){this.#z||this.setEventListener(this.#q)}onUnsubscribe(){this.hasListeners()||(this.#z?.(),this.#z=void 0)}setEventListener(e){this.#q=e,this.#z?.(),this.#z=e(this.setOnline.bind(this))}setOnline(e){let t=this.#Q!==e;t&&(this.#Q=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#Q}}},56888:function(e,t,n){"use strict";n.d(t,{A:function(){return c},z:function(){return fetchState}});var o=n(24139),i=n(27037),s=n(72008),l=n(48907),c=class extends l.F{#K;#V;#Z;#W;#G;#d;#J;constructor(e){super(),this.#J=!1,this.#d=e.defaultOptions,this.setOptions(e.options),this.#G=[],this.#Z=e.cache,this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#K=e.state||function(e){let t="function"==typeof e.initialData?e.initialData():e.initialData,n=void 0!==t,o=n?"function"==typeof e.initialDataUpdatedAt?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?o??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}(this.options),this.state=this.#K,this.scheduleGc()}get meta(){return this.options.meta}setOptions(e){this.options={...this.#d,...e},this.updateGcTime(this.options.gcTime)}optionalRemove(){this.#G.length||"idle"!==this.state.fetchStatus||this.#Z.remove(this)}setData(e,t){let n=(0,o.oE)(this.state.data,e,this.options);return this.#H({data:n,type:"success",dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e,t){this.#H({type:"setState",state:e,setStateOptions:t})}cancel(e){let t=this.#W?.promise;return this.#W?.cancel(e),t?t.then(o.ZT).catch(o.ZT):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState(this.#K)}isActive(){return this.#G.some(e=>!1!==e.options.enabled)}isDisabled(){return this.getObserversCount()>0&&!this.isActive()}isStale(){return!!this.state.isInvalidated||(this.getObserversCount()>0?this.#G.some(e=>e.getCurrentResult().isStale):void 0===this.state.data)}isStaleByTime(e=0){return this.state.isInvalidated||void 0===this.state.data||!(0,o.Kp)(this.state.dataUpdatedAt,e)}onFocus(){let e=this.#G.find(e=>e.shouldFetchOnWindowFocus());e?.refetch({cancelRefetch:!1}),this.#W?.continue()}onOnline(){let e=this.#G.find(e=>e.shouldFetchOnReconnect());e?.refetch({cancelRefetch:!1}),this.#W?.continue()}addObserver(e){this.#G.includes(e)||(this.#G.push(e),this.clearGcTimeout(),this.#Z.notify({type:"observerAdded",query:this,observer:e}))}removeObserver(e){this.#G.includes(e)&&(this.#G=this.#G.filter(t=>t!==e),this.#G.length||(this.#W&&(this.#J?this.#W.cancel({revert:!0}):this.#W.cancelRetry()),this.scheduleGc()),this.#Z.notify({type:"observerRemoved",query:this,observer:e}))}getObserversCount(){return this.#G.length}invalidate(){this.state.isInvalidated||this.#H({type:"invalidate"})}fetch(e,t){if("idle"!==this.state.fetchStatus){if(void 0!==this.state.data&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#W)return this.#W.continueRetry(),this.#W.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.#G.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,i={queryKey:this.queryKey,meta:this.meta},addSignalProperty=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#J=!0,n.signal)})};addSignalProperty(i);let l={fetchOptions:t,options:this.options,queryKey:this.queryKey,state:this.state,fetchFn:()=>this.options.queryFn&&this.options.queryFn!==o.CN?(this.#J=!1,this.options.persister)?this.options.persister(this.options.queryFn,i,this):this.options.queryFn(i):Promise.reject(Error(`Missing queryFn: '${this.options.queryHash}'`))};addSignalProperty(l),this.options.behavior?.onFetch(l,this),this.#V=this.state,("idle"===this.state.fetchStatus||this.state.fetchMeta!==l.fetchOptions?.meta)&&this.#H({type:"fetch",meta:l.fetchOptions?.meta});let onError=e=>{(0,s.DV)(e)&&e.silent||this.#H({type:"error",error:e}),(0,s.DV)(e)||(this.#Z.config.onError?.(e,this),this.#Z.config.onSettled?.(this.state.data,e,this)),this.isFetchingOptimistic||this.scheduleGc(),this.isFetchingOptimistic=!1};return this.#W=(0,s.Mz)({fn:l.fetchFn,abort:n.abort.bind(n),onSuccess:e=>{if(void 0===e){onError(Error(`${this.queryHash} data is undefined`));return}this.setData(e),this.#Z.config.onSuccess?.(e,this),this.#Z.config.onSettled?.(e,this.state.error,this),this.isFetchingOptimistic||this.scheduleGc(),this.isFetchingOptimistic=!1},onError,onFail:(e,t)=>{this.#H({type:"failed",failureCount:e,error:t})},onPause:()=>{this.#H({type:"pause"})},onContinue:()=>{this.#H({type:"continue"})},retry:l.options.retry,retryDelay:l.options.retryDelay,networkMode:l.options.networkMode}),this.#W.promise}#H(e){this.state=(t=>{switch(e.type){case"failed":return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case"pause":return{...t,fetchStatus:"paused"};case"continue":return{...t,fetchStatus:"fetching"};case"fetch":return{...t,...fetchState(t.data,this.options),fetchMeta:e.meta??null};case"success":return{...t,data:e.data,dataUpdateCount:t.dataUpdateCount+1,dataUpdatedAt:e.dataUpdatedAt??Date.now(),error:null,isInvalidated:!1,status:"success",...!e.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};case"error":let n=e.error;if((0,s.DV)(n)&&n.revert&&this.#V)return{...this.#V,fetchStatus:"idle"};return{...t,error:n,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:n,fetchStatus:"idle",status:"error"};case"invalidate":return{...t,isInvalidated:!0};case"setState":return{...t,...e.state}}})(this.state),i.V.batch(()=>{this.#G.forEach(e=>{e.onQueryUpdate()}),this.#Z.notify({query:this,type:"updated",action:e})})}};function fetchState(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:(0,s.Kw)(t.networkMode)?"fetching":"paused",...void 0===e&&{error:null,status:"pending"}}}},48907:function(e,t,n){"use strict";n.d(t,{F:function(){return i}});var o=n(24139),i=class{#X;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),(0,o.PN)(this.gcTime)&&(this.#X=setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(o.sk?1/0:3e5))}clearGcTimeout(){this.#X&&(clearTimeout(this.#X),this.#X=void 0)}}},72008:function(e,t,n){"use strict";n.d(t,{DV:function(){return isCancelledError},Kw:function(){return canFetch},Mz:function(){return createRetryer}});var o=n(66474),i=n(14304),s=n(24139);function defaultRetryDelay(e){return Math.min(1e3*2**e,3e4)}function canFetch(e){return(e??"online")!=="online"||i.N.isOnline()}var l=class{constructor(e){this.revert=e?.revert,this.silent=e?.silent}};function isCancelledError(e){return e instanceof l}function createRetryer(e){let t,n,c,u=!1,d=0,p=!1,f=new Promise((e,t)=>{n=e,c=t}),shouldPause=()=>!o.j.isFocused()||"always"!==e.networkMode&&!i.N.isOnline(),resolve=o=>{p||(p=!0,e.onSuccess?.(o),t?.(),n(o))},reject=n=>{p||(p=!0,e.onError?.(n),t?.(),c(n))},pause=()=>new Promise(n=>{t=e=>{let t=p||!shouldPause();return t&&n(e),t},e.onPause?.()}).then(()=>{t=void 0,p||e.onContinue?.()}),run=()=>{let t;if(!p){try{t=e.fn()}catch(e){t=Promise.reject(e)}Promise.resolve(t).then(resolve).catch(t=>{if(p)return;let n=e.retry??(s.sk?0:3),o=e.retryDelay??defaultRetryDelay,i="function"==typeof o?o(d,t):o,l=!0===n||"number"==typeof n&&d{if(shouldPause())return pause()}).then(()=>{u?reject(t):run()})})}};return canFetch(e.networkMode)?run():pause().then(run),{promise:f,cancel:t=>{p||(reject(new l(t)),e.abort?.())},continue:()=>{let e=t?.();return e?f:Promise.resolve()},cancelRetry:()=>{u=!0},continueRetry:()=>{u=!1}}}},7506:function(e,t,n){"use strict";n.d(t,{l:function(){return o}});var o=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}}},24139:function(e,t,n){"use strict";n.d(t,{CN:function(){return i},Ht:function(){return addToStart},Kp:function(){return timeUntilStale},PN:function(){return isValidTimeout},Rm:function(){return hashQueryKeyByOptions},SE:function(){return functionalUpdate},VS:function(){return shallowEqualObjects},VX:function(){return addToEnd},X7:function(){return matchMutation},Ym:function(){return hashKey},ZT:function(){return noop},_v:function(){return sleep},_x:function(){return matchQuery},oE:function(){return replaceData},sk:function(){return o},to:function(){return partialMatchKey}});var o="undefined"==typeof window||"Deno"in globalThis;function noop(){}function functionalUpdate(e,t){return"function"==typeof e?e(t):e}function isValidTimeout(e){return"number"==typeof e&&e>=0&&e!==1/0}function timeUntilStale(e,t){return Math.max(e+(t||0)-Date.now(),0)}function matchQuery(e,t){let{type:n="all",exact:o,fetchStatus:i,predicate:s,queryKey:l,stale:c}=e;if(l){if(o){if(t.queryHash!==hashQueryKeyByOptions(l,t.options))return!1}else if(!partialMatchKey(t.queryKey,l))return!1}if("all"!==n){let e=t.isActive();if("active"===n&&!e||"inactive"===n&&e)return!1}return("boolean"!=typeof c||t.isStale()===c)&&(!i||i===t.state.fetchStatus)&&(!s||!!s(t))}function matchMutation(e,t){let{exact:n,status:o,predicate:i,mutationKey:s}=e;if(s){if(!t.options.mutationKey)return!1;if(n){if(hashKey(t.options.mutationKey)!==hashKey(s))return!1}else if(!partialMatchKey(t.options.mutationKey,s))return!1}return(!o||t.state.status===o)&&(!i||!!i(t))}function hashQueryKeyByOptions(e,t){let n=t?.queryKeyHashFn||hashKey;return n(e)}function hashKey(e){return JSON.stringify(e,(e,t)=>isPlainObject(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function partialMatchKey(e,t){return e===t||typeof e==typeof t&&!!e&&!!t&&"object"==typeof e&&"object"==typeof t&&!Object.keys(t).some(n=>!partialMatchKey(e[n],t[n]))}function shallowEqualObjects(e,t){if(!t||Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(e[n]!==t[n])return!1;return!0}function isPlainArray(e){return Array.isArray(e)&&e.length===Object.keys(e).length}function isPlainObject(e){if(!hasObjectPrototype(e))return!1;let t=e.constructor;if(void 0===t)return!0;let n=t.prototype;return!!(hasObjectPrototype(n)&&n.hasOwnProperty("isPrototypeOf"))}function hasObjectPrototype(e){return"[object Object]"===Object.prototype.toString.call(e)}function sleep(e){return new Promise(t=>{setTimeout(t,e)})}function replaceData(e,t,n){return"function"==typeof n.structuralSharing?n.structuralSharing(e,t):!1!==n.structuralSharing?function replaceEqualDeep(e,t){if(e===t)return e;let n=isPlainArray(e)&&isPlainArray(t);if(n||isPlainObject(e)&&isPlainObject(t)){let o=n?e:Object.keys(e),i=o.length,s=n?t:Object.keys(t),l=s.length,c=n?[]:{},u=0;for(let i=0;in?o.slice(1):o}function addToStart(e,t,n=0){let o=[t,...e];return n&&o.length>n?o.slice(0,-1):o}var i=Symbol()},30202:function(e,t,n){"use strict";n.d(t,{NL:function(){return useQueryClient},aH:function(){return QueryClientProvider}});var o=n(67294),i=n(85893),s=o.createContext(void 0),useQueryClient=e=>{let t=o.useContext(s);if(e)return e;if(!t)throw Error("No QueryClient set, use QueryClientProvider to set one");return t},QueryClientProvider=({client:e,children:t})=>(o.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,i.jsx)(s.Provider,{value:e,children:t}))},98029:function(e,t,n){"use strict";n.d(t,{D:function(){return useMutation}});var o=n(67294),i=n(59289),s=n(27037),l=n(7506),c=n(24139),u=class extends l.l{#b;#C=void 0;#Y;#$;constructor(e,t){super(),this.#b=e,this.setOptions(t),this.bindMethods(),this.#ee()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#b.defaultMutationOptions(e),(0,c.VS)(this.options,t)||this.#b.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#Y,observer:this}),t?.mutationKey&&this.options.mutationKey&&(0,c.Ym)(t.mutationKey)!==(0,c.Ym)(this.options.mutationKey)?this.reset():this.#Y?.state.status==="pending"&&this.#Y.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#Y?.removeObserver(this)}onMutationUpdate(e){this.#ee(),this.#_(e)}getCurrentResult(){return this.#C}reset(){this.#Y?.removeObserver(this),this.#Y=void 0,this.#ee(),this.#_()}mutate(e,t){return this.#$=t,this.#Y?.removeObserver(this),this.#Y=this.#b.getMutationCache().build(this.#b,this.options),this.#Y.addObserver(this),this.#Y.execute(e)}#ee(){let e=this.#Y?.state??(0,i.R)();this.#C={...e,isPending:"pending"===e.status,isSuccess:"success"===e.status,isError:"error"===e.status,isIdle:"idle"===e.status,mutate:this.mutate,reset:this.reset}}#_(e){s.V.batch(()=>{if(this.#$&&this.hasListeners()){let t=this.#C.variables,n=this.#C.context;e?.type==="success"?(this.#$.onSuccess?.(e.data,t,n),this.#$.onSettled?.(e.data,null,t,n)):e?.type==="error"&&(this.#$.onError?.(e.error,t,n),this.#$.onSettled?.(void 0,e.error,t,n))}this.listeners.forEach(e=>{e(this.#C)})})}},d=n(30202),p=n(86290);function useMutation(e,t){let n=(0,d.NL)(t),[i]=o.useState(()=>new u(n,e));o.useEffect(()=>{i.setOptions(e)},[i,e]);let l=o.useSyncExternalStore(o.useCallback(e=>i.subscribe(s.V.batchCalls(e)),[i]),()=>i.getCurrentResult(),()=>i.getCurrentResult()),c=o.useCallback((e,t)=>{i.mutate(e,t).catch(p.Z)},[i]);if(l.error&&(0,p.L)(i.options.throwOnError,[l.error]))throw l.error;return{...l,mutate:c,mutateAsync:l.mutate}}},86290:function(e,t,n){"use strict";function shouldThrowError(e,t){return"function"==typeof e?e(...t):!!e}function noop(){}n.d(t,{L:function(){return shouldThrowError},Z:function(){return noop}})},52425:function(e,t,n){"use strict";function getAccount(e){let t=e.state.current,n=e.state.connections.get(t),o=n?.accounts,i=o?.[0],s=e.chains.find(e=>e.id===n?.chainId),l=e.state.status;switch(l){case"connected":return{address:i,addresses:o,chain:s,chainId:n?.chainId,connector:n?.connector,isConnected:!0,isConnecting:!1,isDisconnected:!1,isReconnecting:!1,status:l};case"reconnecting":return{address:i,addresses:o,chain:s,chainId:n?.chainId,connector:n?.connector,isConnected:!!i,isConnecting:!1,isDisconnected:!1,isReconnecting:!0,status:l};case"connecting":return{address:i,addresses:o,chain:s,chainId:n?.chainId,connector:n?.connector,isConnected:!1,isConnecting:!0,isDisconnected:!1,isReconnecting:!1,status:l};case"disconnected":return{address:void 0,addresses:void 0,chain:void 0,chainId:void 0,connector:void 0,isConnected:!1,isConnecting:!1,isDisconnected:!0,isReconnecting:!1,status:l}}}n.d(t,{D:function(){return getAccount}})},33397:function(e,t,n){"use strict";n.d(t,{u:function(){return watchAccount}});var o=n(74751),i=n(52425);function watchAccount(e,t){let{onChange:n}=t;return e.subscribe(()=>(0,i.D)(e),n,{equalityFn(e,t){let{connector:n,...i}=e,{connector:s,...l}=t;return(0,o.v)(i,l)&&n?.id===s?.id&&n?.uid===s?.uid}})}},7066:function(e,t,n){"use strict";n.d(t,{G:function(){return BaseError}});var o,i,s=n(79983);let getVersion=()=>`@wagmi/core@${s.i}`;var __classPrivateFieldGet=function(e,t,n,o){if("a"===n&&!o)throw TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!o:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?o:"a"===n?o.call(e):o?o.value:t.get(e)};let BaseError=class BaseError extends Error{get docsBaseUrl(){return"https://wagmi.sh/core"}get version(){return getVersion()}constructor(e,t={}){super(),o.add(this),Object.defineProperty(this,"details",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"docsPath",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"metaMessages",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"shortMessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"WagmiCoreError"});let n=t.cause instanceof BaseError?t.cause.details:t.cause?.message?t.cause.message:t.details,i=t.cause instanceof BaseError&&t.cause.docsPath||t.docsPath;this.message=[e||"An error occurred.","",...t.metaMessages?[...t.metaMessages,""]:[],...i?[`Docs: ${this.docsBaseUrl}${i}.html${t.docsSlug?`#${t.docsSlug}`:""}`]:[],...n?[`Details: ${n}`]:[],`Version: ${this.version}`].join("\n"),t.cause&&(this.cause=t.cause),this.details=n,this.docsPath=i,this.metaMessages=t.metaMessages,this.shortMessage=e}walk(e){return __classPrivateFieldGet(this,o,"m",i).call(this,this,e)}};o=new WeakSet,i=function _BaseError_walk(e,t){return t?.(e)?e:e.cause?__classPrivateFieldGet(this,o,"m",_BaseError_walk).call(this,e.cause,t):e}},87675:function(e,t,n){"use strict";n.d(t,{JK:function(){return ConnectorAccountNotFoundError},X4:function(){return ChainNotConfiguredError},aH:function(){return ConnectorNotConnectedError},wi:function(){return ConnectorAlreadyConnectedError}});var o=n(7066);let ChainNotConfiguredError=class ChainNotConfiguredError extends o.G{constructor(){super("Chain not configured."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ChainNotConfiguredError"})}};let ConnectorAlreadyConnectedError=class ConnectorAlreadyConnectedError extends o.G{constructor(){super("Connector already connected."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ConnectorAlreadyConnectedError"})}};let ConnectorNotConnectedError=class ConnectorNotConnectedError extends o.G{constructor(){super("Connector not connected."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ConnectorNotConnectedError"})}};let ConnectorAccountNotFoundError=class ConnectorAccountNotFoundError extends o.G{constructor({address:e,connector:t}){super(`Account "${e}" not found for connector "${t.name}".`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ConnectorAccountNotFoundError"})}}},74751:function(e,t,n){"use strict";n.d(t,{v:function(){return function deepEqual(e,t){if(e===t)return!0;if(e&&t&&"object"==typeof e&&"object"==typeof t){let n,o;if(e.constructor!==t.constructor)return!1;if(Array.isArray(e)&&Array.isArray(t)){if((n=e.length)!==t.length)return!1;for(o=n;0!=o--;)if(!deepEqual(e[o],t[o]))return!1;return!0}if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();let i=Object.keys(e);if((n=i.length)!==Object.keys(t).length)return!1;for(o=n;0!=o--;)if(!Object.prototype.hasOwnProperty.call(t,i[o]))return!1;for(o=n;0!=o--;){let n=i[o];if(n&&!deepEqual(e[n],t[n]))return!1}return!0}return e!=e&&t!=t}}})},81946:function(e,t,n){"use strict";function getAction(e,t,n){let o=e[t.name];if("function"==typeof o)return o;let i=e[n];return"function"==typeof i?i:n=>t(e,n)}n.d(t,{s:function(){return getAction}})},79983:function(e,t,n){"use strict";n.d(t,{i:function(){return o}});let o="2.6.9"},90512:function(e,t,n){"use strict";t.Z=function(){for(var e,t,n=0,o="",i=arguments.length;nvoid 0!==e).length>0)}({request:v})&&!i)try{return await scheduleMulticall(e,{...v,blockNumber:f,blockTag:m})}catch(e){if(!(e instanceof c.pZ)&&!(e instanceof c.mm))throw e}let w=await e.request({method:"eth_call",params:i?[v,o,i]:[v,o]});if("0x"===w)return{data:void 0};return{data:w}}catch(c){let o=function(e){if(!(e instanceof l.G))return;let t=e.walk();return"object"==typeof t?.data?t.data?.data:t.data}(c),{offchainLookup:i,offchainLookupSignature:s}=await n.e(422).then(n.bind(n,10422));if(o?.slice(0,10)===s&&M)return{data:await i(e,{data:o,to:M})};throw function(e,{docsPath:t,...n}){let o=(()=>{let t=(0,w.k)(e,n);return t instanceof v.cj?e:t})();return new u.cg(o,{docsPath:t,...n})}(c,{...t,account:F,chain:e.chain})}}async function scheduleMulticall(e,t){let{batchSize:n=1024,wait:o=0}="object"==typeof e.batch?.multicall?e.batch.multicall:{},{blockNumber:s,blockTag:l="latest",data:d,multicallAddress:p,to:g}=t,v=p;if(!v){if(!e.chain)throw new c.pZ;v=(0,b.L)({blockNumber:s,chain:e.chain,contract:"multicall3"})}let w=s?(0,y.eC)(s):void 0,C=w||l,{schedule:E}=(0,x.S)({id:`${e.uid}.${C}`,wait:o,shouldSplitBatch(e){let t=e.reduce((e,{data:t})=>e+(t.length-2),0);return t>2*n},fn:async t=>{let n=t.map(e=>({allowFailure:!0,callData:e.data,target:e.to})),o=(0,m.R)({abi:i.F8,args:[n],functionName:"aggregate3"}),s=await e.request({method:"eth_call",params:[{data:o,to:v},C]});return(0,f.k)({abi:i.F8,args:[n],functionName:"aggregate3",data:s||"0x"})}}),[{returnData:A,success:k}]=await E({data:d,to:g});if(!k)throw new u.VQ({data:A});return"0x"===A?{data:void 0}:{data:A}}function parseStateMapping(e){if(e&&0!==e.length)return e.reduce((e,{slot:t,value:n})=>{if(66!==t.length)throw new d.W_({size:t.length,targetSize:66,type:"hex"});if(66!==n.length)throw new d.W_({size:n.length,targetSize:66,type:"hex"});return e[t]=n,e},{})}},66403:function(e,t,n){"use strict";n.d(t,{R:function(){return i}});var o=n(86164);let i=(0,o.a)({id:1,name:"Ethereum",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://cloudflare-eth.com"]}},blockExplorers:{default:{name:"Etherscan",url:"https://etherscan.io",apiUrl:"https://api.etherscan.io/api"}},contracts:{ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},ensUniversalResolver:{address:"0xce01f8eee7E479C928F8919abD53E553a36CeF67",blockCreated:19258213},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14353601}}})},16189:function(e,t,n){"use strict";let o;n.d(t,{e:function(){return createClient}});var i=n(14503);let s=256;function createClient(e){let{batch:t,cacheTime:n=e.pollingInterval??4e3,key:l="base",name:c="Base Client",pollingInterval:u=4e3,type:d="base"}=e,p=e.chain,f=e.account?(0,i.T)(e.account):void 0,{config:m,request:g,value:b}=e.transport({chain:p,pollingInterval:u}),y={...m,...b},v={account:f,batch:t,cacheTime:n,chain:p,key:l,name:c,pollingInterval:u,request:g,transport:y,type:d,uid:function(e=11){if(!o||s+e>512){o="",s=0;for(let e=0;e<256;e++)o+=(256+256*Math.random()|0).toString(16).substring(1)}return o.substring(s,s+++e)}()};return Object.assign(v,{extend:function extend(e){return t=>{let n=t(e);for(let e in v)delete n[e];let o={...e,...n};return Object.assign(o,{extend:extend(o)})}}(v)})}},91628:function(e,t,n){"use strict";n.d(t,{q:function(){return createTransport}});var o=n(62027),i=n(78863),s=n(39028),l=n(7760);function createTransport({key:e,name:t,request:n,retryCount:c=3,retryDelay:u=150,timeout:d,type:p},f){return{config:{key:e,name:t,request:n,retryCount:c,retryDelay:u,timeout:d,type:p},request:function(e,t={}){return async(n,c={})=>{let{retryDelay:u=150,retryCount:d=3}={...t,...c};return(0,l.J)(async()=>{try{return await e(n)}catch(e){switch(e.code){case s.s7.code:throw new s.s7(e);case s.B.code:throw new s.B(e);case s.LX.code:throw new s.LX(e);case s.nY.code:throw new s.nY(e);case s.XS.code:throw new s.XS(e);case s.yR.code:throw new s.yR(e);case s.Og.code:throw new s.Og(e);case s.pT.code:throw new s.pT(e);case s.KB.code:throw new s.KB(e);case s.gS.code:throw new s.gS(e);case s.Pv.code:throw new s.Pv(e);case s.GD.code:throw new s.GD(e);case s.ab.code:throw new s.ab(e);case s.PE.code:throw new s.PE(e);case s.Ts.code:throw new s.Ts(e);case s.u5.code:throw new s.u5(e);case s.I0.code:throw new s.I0(e);case s.x3.code:throw new s.x3(e);case 5e3:throw new s.ab(e);default:if(e instanceof o.G)throw e;throw new s.ir(e)}}},{delay:({count:e,error:t})=>{if(t&&t instanceof i.Gg){let e=t?.headers?.get("Retry-After");if(e?.match(/\d/))return 1e3*parseInt(e)}return~~(1<"code"in e&&"number"==typeof e.code?-1===e.code||e.code===s.Pv.code||e.code===s.XS.code:!(e instanceof i.Gg)||!e.status||403===e.status||408===e.status||413===e.status||429===e.status||500===e.status||502===e.status||503===e.status||504===e.status})}}(n,{retryCount:c,retryDelay:u}),value:f}}},16693:function(e,t,n){"use strict";n.d(t,{$o:function(){return d},F8:function(){return o},X$:function(){return u},du:function(){return l},k3:function(){return s},nZ:function(){return c}});let o=[{inputs:[{components:[{name:"target",type:"address"},{name:"allowFailure",type:"bool"},{name:"callData",type:"bytes"}],name:"calls",type:"tuple[]"}],name:"aggregate3",outputs:[{components:[{name:"success",type:"bool"},{name:"returnData",type:"bytes"}],name:"returnData",type:"tuple[]"}],stateMutability:"view",type:"function"}],i=[{inputs:[],name:"ResolverNotFound",type:"error"},{inputs:[],name:"ResolverWildcardNotSupported",type:"error"},{inputs:[],name:"ResolverNotContract",type:"error"},{inputs:[{name:"returnData",type:"bytes"}],name:"ResolverError",type:"error"},{inputs:[{components:[{name:"status",type:"uint16"},{name:"message",type:"string"}],name:"errors",type:"tuple[]"}],name:"HttpError",type:"error"}],s=[...i,{name:"resolve",type:"function",stateMutability:"view",inputs:[{name:"name",type:"bytes"},{name:"data",type:"bytes"}],outputs:[{name:"",type:"bytes"},{name:"address",type:"address"}]},{name:"resolve",type:"function",stateMutability:"view",inputs:[{name:"name",type:"bytes"},{name:"data",type:"bytes"},{name:"gateways",type:"string[]"}],outputs:[{name:"",type:"bytes"},{name:"address",type:"address"}]}],l=[...i,{name:"reverse",type:"function",stateMutability:"view",inputs:[{type:"bytes",name:"reverseName"}],outputs:[{type:"string",name:"resolvedName"},{type:"address",name:"resolvedAddress"},{type:"address",name:"reverseResolver"},{type:"address",name:"resolver"}]},{name:"reverse",type:"function",stateMutability:"view",inputs:[{type:"bytes",name:"reverseName"},{type:"string[]",name:"gateways"}],outputs:[{type:"string",name:"resolvedName"},{type:"address",name:"resolvedAddress"},{type:"address",name:"reverseResolver"},{type:"address",name:"resolver"}]}],c=[{name:"text",type:"function",stateMutability:"view",inputs:[{name:"name",type:"bytes32"},{name:"key",type:"string"}],outputs:[{name:"",type:"string"}]}],u=[{name:"addr",type:"function",stateMutability:"view",inputs:[{name:"name",type:"bytes32"}],outputs:[{name:"",type:"address"}]},{name:"addr",type:"function",stateMutability:"view",inputs:[{name:"name",type:"bytes32"},{name:"coinType",type:"uint256"}],outputs:[{name:"",type:"bytes"}]}],d=[{inputs:[{internalType:"address",name:"_signer",type:"address"},{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes",name:"_signature",type:"bytes"}],stateMutability:"nonpayable",type:"constructor"}]},21746:function(e,t,n){"use strict";n.d(t,{$:function(){return o},Up:function(){return i},hZ:function(){return s}});let o={1:"An `assert` condition failed.",17:"Arithmetic operation resulted in underflow or overflow.",18:"Division or modulo by zero (e.g. `5 / 0` or `23 % 0`).",33:"Attempted to convert to an invalid type.",34:"Attempted to access a storage byte array that is incorrectly encoded.",49:"Performed `.pop()` on an empty array",50:"Array index is out of bounds.",65:"Allocated too much memory or created an array which is too large.",81:"Attempted to call a zero-initialized variable of internal function type."},i={inputs:[{name:"message",type:"string"}],name:"Error",type:"error"},s={inputs:[{name:"reason",type:"uint256"}],name:"Panic",type:"error"}},84192:function(e,t,n){"use strict";n.d(t,{Bd:function(){return s},Zn:function(){return i},ez:function(){return o}});let o={gwei:9,wei:18},i={ether:-9,wei:9},s={ether:-18,gwei:-9}},57412:function(e,t,n){"use strict";n.d(t,{CI:function(){return InvalidAbiDecodingTypeError},FM:function(){return AbiEventSignatureEmptyTopicsError},Gy:function(){return DecodeLogTopicsMismatch},KY:function(){return BytesSizeMismatchError},M4:function(){return AbiEncodingBytesSizeMismatchError},MX:function(){return AbiFunctionOutputsNotFoundError},S4:function(){return AbiItemAmbiguityError},SM:function(){return DecodeLogDataMismatch},cO:function(){return AbiConstructorParamsNotFoundError},dh:function(){return InvalidAbiEncodingTypeError},fM:function(){return AbiConstructorNotFoundError},fs:function(){return AbiEncodingLengthMismatchError},gr:function(){return AbiEncodingArrayLengthMismatchError},hn:function(){return InvalidArrayError},lC:function(){return AbiEventSignatureNotFoundError},mv:function(){return AbiEventNotFoundError},wM:function(){return InvalidDefinitionTypeError},wb:function(){return AbiDecodingZeroDataError},xB:function(){return AbiDecodingDataSizeTooSmallError},xL:function(){return AbiFunctionNotFoundError},yP:function(){return AbiErrorSignatureNotFoundError}});var o=n(80522),i=n(39135),s=n(62027);let AbiConstructorNotFoundError=class AbiConstructorNotFoundError extends s.G{constructor({docsPath:e}){super("A constructor was not found on the ABI.\nMake sure you are using the correct ABI and that the constructor exists on it.",{docsPath:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiConstructorNotFoundError"})}};let AbiConstructorParamsNotFoundError=class AbiConstructorParamsNotFoundError extends s.G{constructor({docsPath:e}){super("Constructor arguments were provided (`args`), but a constructor parameters (`inputs`) were not found on the ABI.\nMake sure you are using the correct ABI, and that the `inputs` attribute on the constructor exists.",{docsPath:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiConstructorParamsNotFoundError"})}};let AbiDecodingDataSizeTooSmallError=class AbiDecodingDataSizeTooSmallError extends s.G{constructor({data:e,params:t,size:n}){super(`Data size of ${n} bytes is too small for given parameters.`,{metaMessages:[`Params: (${(0,o.h)(t,{includeName:!0})})`,`Data: ${e} (${n} bytes)`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiDecodingDataSizeTooSmallError"}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"params",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"size",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.data=e,this.params=t,this.size=n}};let AbiDecodingZeroDataError=class AbiDecodingZeroDataError extends s.G{constructor(){super('Cannot decode zero data ("0x") with ABI parameters.'),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiDecodingZeroDataError"})}};let AbiEncodingArrayLengthMismatchError=class AbiEncodingArrayLengthMismatchError extends s.G{constructor({expectedLength:e,givenLength:t,type:n}){super(`ABI encoding array length mismatch for type ${n}. Expected length: ${e} Given length: ${t}`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiEncodingArrayLengthMismatchError"})}};let AbiEncodingBytesSizeMismatchError=class AbiEncodingBytesSizeMismatchError extends s.G{constructor({expectedSize:e,value:t}){super(`Size of bytes "${t}" (bytes${(0,i.d)(t)}) does not match expected size (bytes${e}).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiEncodingBytesSizeMismatchError"})}};let AbiEncodingLengthMismatchError=class AbiEncodingLengthMismatchError extends s.G{constructor({expectedLength:e,givenLength:t}){super(`ABI encoding params/values length mismatch. Expected length (params): ${e} @@ -1140,11 +1140,11 @@ Cannot decode function result without knowing what the parameter types are. Make sure you are using the correct ABI and that the function exists on it.`,{docsPath:t}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiFunctionOutputsNotFoundError"})}};let AbiItemAmbiguityError=class AbiItemAmbiguityError extends s.G{constructor(e,t){super("Found ambiguous types in overloaded ABI items.",{metaMessages:[`\`${e.type}\` in \`${(0,o.t)(e.abiItem)}\`, and`,`\`${t.type}\` in \`${(0,o.t)(t.abiItem)}\``,"","These types encode differently and cannot be distinguished at runtime.","Remove one of the ambiguous items in the ABI."]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiItemAmbiguityError"})}};let BytesSizeMismatchError=class BytesSizeMismatchError extends s.G{constructor({expectedSize:e,givenSize:t}){super(`Expected bytes${e}, got bytes${t}.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"BytesSizeMismatchError"})}};let DecodeLogDataMismatch=class DecodeLogDataMismatch extends s.G{constructor({abiItem:e,data:t,params:n,size:i}){super(`Data size of ${i} bytes is too small for non-indexed event parameters.`,{metaMessages:[`Params: (${(0,o.h)(n,{includeName:!0})})`,`Data: ${t} (${i} bytes)`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"DecodeLogDataMismatch"}),Object.defineProperty(this,"abiItem",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"params",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"size",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.abiItem=e,this.data=t,this.params=n,this.size=i}};let DecodeLogTopicsMismatch=class DecodeLogTopicsMismatch extends s.G{constructor({abiItem:e,param:t}){super(`Expected a topic for indexed event parameter${t.name?` "${t.name}"`:""} on event "${(0,o.t)(e,{includeName:!0})}".`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"DecodeLogTopicsMismatch"}),Object.defineProperty(this,"abiItem",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.abiItem=e}};let InvalidAbiEncodingTypeError=class InvalidAbiEncodingTypeError extends s.G{constructor(e,{docsPath:t}){super(`Type "${e}" is not a valid encoding type. Please provide a valid ABI type.`,{docsPath:t}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidAbiEncodingType"})}};let InvalidAbiDecodingTypeError=class InvalidAbiDecodingTypeError extends s.G{constructor(e,{docsPath:t}){super(`Type "${e}" is not a valid decoding type. Please provide a valid ABI type.`,{docsPath:t}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidAbiDecodingType"})}};let InvalidArrayError=class InvalidArrayError extends s.G{constructor(e){super(`Value "${e}" is not a valid array.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidArrayError"})}};let InvalidDefinitionTypeError=class InvalidDefinitionTypeError extends s.G{constructor(e){super(`"${e}" is not a valid definition type. -Valid types: "function", "event", "error"`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidDefinitionTypeError"})}}},26087:function(e,t,n){"use strict";n.d(t,{b:function(){return InvalidAddressError}});var o=n(62027);let InvalidAddressError=class InvalidAddressError extends o.G{constructor({address:e}){super(`Address "${e}" is invalid.`,{metaMessages:["- Address must be a hex value of 20 bytes (40 hex characters).","- Address must match its checksum counterpart."]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidAddressError"})}}},62027:function(e,t,n){"use strict";n.d(t,{G:function(){return BaseError}});var o=n(35280);let BaseError=class BaseError extends Error{constructor(e,t={}){super(),Object.defineProperty(this,"details",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"docsPath",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"metaMessages",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"shortMessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ViemError"}),Object.defineProperty(this,"version",{enumerable:!0,configurable:!0,writable:!0,value:(0,o.bo)()});let n=t.cause instanceof BaseError?t.cause.details:t.cause?.message?t.cause.message:t.details,i=t.cause instanceof BaseError&&t.cause.docsPath||t.docsPath;this.message=[e||"An error occurred.","",...t.metaMessages?[...t.metaMessages,""]:[],...i?[`Docs: https://viem.sh${i}${t.docsSlug?`#${t.docsSlug}`:""}`]:[],...n?[`Details: ${n}`]:[],`Version: ${this.version}`].join("\n"),t.cause&&(this.cause=t.cause),this.details=n,this.docsPath=i,this.metaMessages=t.metaMessages,this.shortMessage=e}walk(e){return function walk(e,t){return t?.(e)?e:e&&"object"==typeof e&&"cause"in e?walk(e.cause,t):t?null:e}(this,e)}}},80377:function(e,t,n){"use strict";n.d(t,{hJ:function(){return InvalidChainIdError},mm:function(){return ChainDoesNotSupportContract},pZ:function(){return ClientChainNotConfiguredError}});var o=n(62027);let ChainDoesNotSupportContract=class ChainDoesNotSupportContract extends o.G{constructor({blockNumber:e,chain:t,contract:n}){super(`Chain "${t.name}" does not support contract "${n.name}".`,{metaMessages:["This could be due to any of the following:",...e&&n.blockCreated&&n.blockCreated>e?[`- The contract "${n.name}" was not deployed until block ${n.blockCreated} (current block ${e}).`]:[`- The chain does not have the contract "${n.name}" configured.`]]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ChainDoesNotSupportContract"})}};let ClientChainNotConfiguredError=class ClientChainNotConfiguredError extends o.G{constructor(){super("No chain was provided to the Client."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ClientChainNotConfiguredError"})}};let InvalidChainIdError=class InvalidChainIdError extends o.G{constructor({chainId:e}){super("number"==typeof e?`Chain ID "${e}" is invalid.`:"Chain ID is invalid."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidChainIdError"})}}},97405:function(e,t,n){"use strict";n.d(t,{cg:function(){return CallExecutionError},uq:function(){return ContractFunctionExecutionError},Lu:function(){return ContractFunctionRevertedError},Dk:function(){return ContractFunctionZeroDataError},VQ:function(){return RawContractError}});var o=n(14503),i=n(21746),s=n(86899),l=n(80522),c=n(96070);function formatAbiItemWithArgs({abiItem:e,args:t,includeFunctionName:n=!0,includeName:o=!1}){if("name"in e&&"inputs"in e&&e.inputs)return`${n?e.name:""}(${e.inputs.map((e,n)=>`${o&&e.name?`${e.name}: `:""}${"object"==typeof t[n]?(0,c.P)(t[n]):t[n]}`).join(", ")})`}var u=n(40840),d=n(39625),p=n(67795),f=n(57412),m=n(62027),b=n(20443),g=n(33639),y=n(35280);let CallExecutionError=class CallExecutionError extends m.G{constructor(e,{account:t,docsPath:n,chain:i,data:s,gas:l,gasPrice:c,maxFeePerGas:u,maxPriorityFeePerGas:f,nonce:m,to:y,value:v,stateOverride:w}){let C=t?(0,o.T)(t):void 0,E=(0,g.xr)({from:C?.address,to:y,value:void 0!==v&&`${(0,d.d)(v)} ${i?.nativeCurrency?.symbol||"ETH"}`,data:s,gas:l,gasPrice:void 0!==c&&`${(0,p.o)(c)} gwei`,maxFeePerGas:void 0!==u&&`${(0,p.o)(u)} gwei`,maxPriorityFeePerGas:void 0!==f&&`${(0,p.o)(f)} gwei`,nonce:m});w&&(E+=` -${(0,b.Bj)(w)}`),super(e.shortMessage,{cause:e,docsPath:n,metaMessages:[...e.metaMessages?[...e.metaMessages," "]:[],"Raw Call Arguments:",E].filter(Boolean)}),Object.defineProperty(this,"cause",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"CallExecutionError"}),this.cause=e}};let ContractFunctionExecutionError=class ContractFunctionExecutionError extends m.G{constructor(e,{abi:t,args:n,contractAddress:o,docsPath:i,functionName:s,sender:c}){let d=(0,u.mE)({abi:t,args:n,name:s}),p=d?formatAbiItemWithArgs({abiItem:d,args:n,includeFunctionName:!1,includeName:!1}):void 0,f=d?(0,l.t)(d,{includeName:!0}):void 0,m=(0,g.xr)({address:o&&(0,y.CR)(o),function:f,args:p&&"()"!==p&&`${[...Array(s?.length??0).keys()].map(()=>" ").join("")}${p}`,sender:c});super(e.shortMessage||`An unknown error occurred while executing the contract function "${s}".`,{cause:e,docsPath:i,metaMessages:[...e.metaMessages?[...e.metaMessages," "]:[],"Contract Call:",m].filter(Boolean)}),Object.defineProperty(this,"abi",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"args",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"cause",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"contractAddress",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"formattedArgs",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"functionName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"sender",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ContractFunctionExecutionError"}),this.abi=t,this.args=n,this.cause=e,this.contractAddress=o,this.functionName=s,this.sender=c}};let ContractFunctionRevertedError=class ContractFunctionRevertedError extends m.G{constructor({abi:e,data:t,functionName:n,message:o}){let c,u,d,p,m;if(t&&"0x"!==t)try{m=(0,s.p)({abi:e,data:t});let{abiItem:n,errorName:o,args:c}=m;if("Error"===o)d=c[0];else if("Panic"===o){let[e]=c;d=i.$[e]}else{let e=n?(0,l.t)(n,{includeName:!0}):void 0,t=n&&c?formatAbiItemWithArgs({abiItem:n,args:c,includeFunctionName:!1,includeName:!1}):void 0;u=[e?`Error: ${e}`:"",t&&"()"!==t?` ${[...Array(o?.length??0).keys()].map(()=>" ").join("")}${t}`:""]}}catch(e){c=e}else o&&(d=o);c instanceof f.yP&&(p=c.signature,u=[`Unable to decode signature "${p}" as it was not found on the provided ABI.`,"Make sure you are using the correct ABI and that the error exists on it.",`You can look up the decoded signature here: https://openchain.xyz/signatures?query=${p}.`]),super(d&&"execution reverted"!==d||p?[`The contract function "${n}" reverted with the following ${p?"signature":"reason"}:`,d||p].join("\n"):`The contract function "${n}" reverted.`,{cause:c,metaMessages:u}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ContractFunctionRevertedError"}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reason",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"signature",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.data=m,this.reason=d,this.signature=p}};let ContractFunctionZeroDataError=class ContractFunctionZeroDataError extends m.G{constructor({functionName:e}){super(`The contract function "${e}" returned no data ("0x").`,{metaMessages:["This could be due to any of the following:",` - The contract does not have the function "${e}",`," - The parameters passed to the contract function may be invalid, or"," - The address is not a contract."]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ContractFunctionZeroDataError"})}};let RawContractError=class RawContractError extends m.G{constructor({data:e,message:t}){super(t||""),Object.defineProperty(this,"code",{enumerable:!0,configurable:!0,writable:!0,value:3}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"RawContractError"}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.data=e}}},66238:function(e,t,n){"use strict";n.d(t,{KD:function(){return RecursiveReadLimitExceededError},T_:function(){return NegativeOffsetError},lQ:function(){return PositionOutOfBoundsError}});var o=n(62027);let NegativeOffsetError=class NegativeOffsetError extends o.G{constructor({offset:e}){super(`Offset \`${e}\` cannot be negative.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"NegativeOffsetError"})}};let PositionOutOfBoundsError=class PositionOutOfBoundsError extends o.G{constructor({length:e,position:t}){super(`Position \`${t}\` is out of bounds (\`0 < position < ${e}\`).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"PositionOutOfBoundsError"})}};let RecursiveReadLimitExceededError=class RecursiveReadLimitExceededError extends o.G{constructor({count:e,limit:t}){super(`Recursive read limit of \`${t}\` exceeded (recursive read count: \`${e}\`).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"RecursiveReadLimitExceededError"})}}},69760:function(e,t,n){"use strict";n.d(t,{$s:function(){return SizeExceedsPaddingSizeError},W_:function(){return InvalidBytesLengthError},mV:function(){return SliceOffsetOutOfBoundsError}});var o=n(62027);let SliceOffsetOutOfBoundsError=class SliceOffsetOutOfBoundsError extends o.G{constructor({offset:e,position:t,size:n}){super(`Slice ${"start"===t?"starting":"ending"} at offset "${e}" is out-of-bounds (size: ${n}).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"SliceOffsetOutOfBoundsError"})}};let SizeExceedsPaddingSizeError=class SizeExceedsPaddingSizeError extends o.G{constructor({size:e,targetSize:t,type:n}){super(`${n.charAt(0).toUpperCase()}${n.slice(1).toLowerCase()} size (${e}) exceeds padding size (${t}).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"SizeExceedsPaddingSizeError"})}};let InvalidBytesLengthError=class InvalidBytesLengthError extends o.G{constructor({size:e,targetSize:t,type:n}){super(`${n.charAt(0).toUpperCase()}${n.slice(1).toLowerCase()} is expected to be ${t} ${n} long, but is ${e} ${n} long.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidBytesLengthError"})}}},87788:function(e,t,n){"use strict";n.d(t,{J5:function(){return IntegerOutOfRangeError},M6:function(){return SizeOverflowError},yr:function(){return InvalidBytesBooleanError}});var o=n(62027);let IntegerOutOfRangeError=class IntegerOutOfRangeError extends o.G{constructor({max:e,min:t,signed:n,size:o,value:i}){super(`Number "${i}" is not in safe ${o?`${8*o}-bit ${n?"signed":"unsigned"} `:""}integer range ${e?`(${t} to ${e})`:`(above ${t})`}`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"IntegerOutOfRangeError"})}};let InvalidBytesBooleanError=class InvalidBytesBooleanError extends o.G{constructor(e){super(`Bytes value "${e}" is not a valid boolean. The bytes array must contain a single byte of either a 0 or 1 value.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidBytesBooleanError"})}};let SizeOverflowError=class SizeOverflowError extends o.G{constructor({givenSize:e,maxSize:t}){super(`Size cannot exceed ${t} bytes. Given size: ${e} bytes.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"SizeOverflowError"})}}},26445:function(e,t,n){"use strict";n.d(t,{C_:function(){return InsufficientFundsError},G$:function(){return FeeCapTooLowError},Hh:function(){return FeeCapTooHighError},M_:function(){return ExecutionRevertedError},WF:function(){return IntrinsicGasTooHighError},ZI:function(){return NonceTooHighError},cj:function(){return UnknownNodeError},cs:function(){return TipAboveFeeCapError},dR:function(){return IntrinsicGasTooLowError},pZ:function(){return TransactionTypeNotSupportedError},se:function(){return NonceMaxValueError},vU:function(){return NonceTooLowError}});var o=n(67795),i=n(62027);let ExecutionRevertedError=class ExecutionRevertedError extends i.G{constructor({cause:e,message:t}={}){let n=t?.replace("execution reverted: ","")?.replace("execution reverted","");super(`Execution reverted ${n?`with reason: ${n}`:"for an unknown reason"}.`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ExecutionRevertedError"})}};Object.defineProperty(ExecutionRevertedError,"code",{enumerable:!0,configurable:!0,writable:!0,value:3}),Object.defineProperty(ExecutionRevertedError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/execution reverted/});let FeeCapTooHighError=class FeeCapTooHighError extends i.G{constructor({cause:e,maxFeePerGas:t}={}){super(`The fee cap (\`maxFeePerGas\`${t?` = ${(0,o.o)(t)} gwei`:""}) cannot be higher than the maximum allowed value (2^256-1).`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"FeeCapTooHigh"})}};Object.defineProperty(FeeCapTooHighError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/max fee per gas higher than 2\^256-1|fee cap higher than 2\^256-1/});let FeeCapTooLowError=class FeeCapTooLowError extends i.G{constructor({cause:e,maxFeePerGas:t}={}){super(`The fee cap (\`maxFeePerGas\`${t?` = ${(0,o.o)(t)}`:""} gwei) cannot be lower than the block base fee.`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"FeeCapTooLow"})}};Object.defineProperty(FeeCapTooLowError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/max fee per gas less than block base fee|fee cap less than block base fee|transaction is outdated/});let NonceTooHighError=class NonceTooHighError extends i.G{constructor({cause:e,nonce:t}={}){super(`Nonce provided for the transaction ${t?`(${t}) `:""}is higher than the next one expected.`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"NonceTooHighError"})}};Object.defineProperty(NonceTooHighError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/nonce too high/});let NonceTooLowError=class NonceTooLowError extends i.G{constructor({cause:e,nonce:t}={}){super(`Nonce provided for the transaction ${t?`(${t}) `:""}is lower than the current nonce of the account. +Valid types: "function", "event", "error"`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidDefinitionTypeError"})}}},26087:function(e,t,n){"use strict";n.d(t,{b:function(){return InvalidAddressError}});var o=n(62027);let InvalidAddressError=class InvalidAddressError extends o.G{constructor({address:e}){super(`Address "${e}" is invalid.`,{metaMessages:["- Address must be a hex value of 20 bytes (40 hex characters).","- Address must match its checksum counterpart."]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidAddressError"})}}},62027:function(e,t,n){"use strict";n.d(t,{G:function(){return BaseError}});var o=n(35280);let BaseError=class BaseError extends Error{constructor(e,t={}){super(),Object.defineProperty(this,"details",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"docsPath",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"metaMessages",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"shortMessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ViemError"}),Object.defineProperty(this,"version",{enumerable:!0,configurable:!0,writable:!0,value:(0,o.bo)()});let n=t.cause instanceof BaseError?t.cause.details:t.cause?.message?t.cause.message:t.details,i=t.cause instanceof BaseError&&t.cause.docsPath||t.docsPath;this.message=[e||"An error occurred.","",...t.metaMessages?[...t.metaMessages,""]:[],...i?[`Docs: https://viem.sh${i}${t.docsSlug?`#${t.docsSlug}`:""}`]:[],...n?[`Details: ${n}`]:[],`Version: ${this.version}`].join("\n"),t.cause&&(this.cause=t.cause),this.details=n,this.docsPath=i,this.metaMessages=t.metaMessages,this.shortMessage=e}walk(e){return function walk(e,t){return t?.(e)?e:e&&"object"==typeof e&&"cause"in e?walk(e.cause,t):t?null:e}(this,e)}}},80377:function(e,t,n){"use strict";n.d(t,{hJ:function(){return InvalidChainIdError},mm:function(){return ChainDoesNotSupportContract},pZ:function(){return ClientChainNotConfiguredError}});var o=n(62027);let ChainDoesNotSupportContract=class ChainDoesNotSupportContract extends o.G{constructor({blockNumber:e,chain:t,contract:n}){super(`Chain "${t.name}" does not support contract "${n.name}".`,{metaMessages:["This could be due to any of the following:",...e&&n.blockCreated&&n.blockCreated>e?[`- The contract "${n.name}" was not deployed until block ${n.blockCreated} (current block ${e}).`]:[`- The chain does not have the contract "${n.name}" configured.`]]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ChainDoesNotSupportContract"})}};let ClientChainNotConfiguredError=class ClientChainNotConfiguredError extends o.G{constructor(){super("No chain was provided to the Client."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ClientChainNotConfiguredError"})}};let InvalidChainIdError=class InvalidChainIdError extends o.G{constructor({chainId:e}){super("number"==typeof e?`Chain ID "${e}" is invalid.`:"Chain ID is invalid."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidChainIdError"})}}},97405:function(e,t,n){"use strict";n.d(t,{cg:function(){return CallExecutionError},uq:function(){return ContractFunctionExecutionError},Lu:function(){return ContractFunctionRevertedError},Dk:function(){return ContractFunctionZeroDataError},VQ:function(){return RawContractError}});var o=n(14503),i=n(21746),s=n(86899),l=n(80522),c=n(96070);function formatAbiItemWithArgs({abiItem:e,args:t,includeFunctionName:n=!0,includeName:o=!1}){if("name"in e&&"inputs"in e&&e.inputs)return`${n?e.name:""}(${e.inputs.map((e,n)=>`${o&&e.name?`${e.name}: `:""}${"object"==typeof t[n]?(0,c.P)(t[n]):t[n]}`).join(", ")})`}var u=n(40840),d=n(39625),p=n(67795),f=n(57412),m=n(62027),g=n(20443),b=n(33639),y=n(35280);let CallExecutionError=class CallExecutionError extends m.G{constructor(e,{account:t,docsPath:n,chain:i,data:s,gas:l,gasPrice:c,maxFeePerGas:u,maxPriorityFeePerGas:f,nonce:m,to:y,value:v,stateOverride:w}){let C=t?(0,o.T)(t):void 0,E=(0,b.xr)({from:C?.address,to:y,value:void 0!==v&&`${(0,d.d)(v)} ${i?.nativeCurrency?.symbol||"ETH"}`,data:s,gas:l,gasPrice:void 0!==c&&`${(0,p.o)(c)} gwei`,maxFeePerGas:void 0!==u&&`${(0,p.o)(u)} gwei`,maxPriorityFeePerGas:void 0!==f&&`${(0,p.o)(f)} gwei`,nonce:m});w&&(E+=` +${(0,g.Bj)(w)}`),super(e.shortMessage,{cause:e,docsPath:n,metaMessages:[...e.metaMessages?[...e.metaMessages," "]:[],"Raw Call Arguments:",E].filter(Boolean)}),Object.defineProperty(this,"cause",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"CallExecutionError"}),this.cause=e}};let ContractFunctionExecutionError=class ContractFunctionExecutionError extends m.G{constructor(e,{abi:t,args:n,contractAddress:o,docsPath:i,functionName:s,sender:c}){let d=(0,u.mE)({abi:t,args:n,name:s}),p=d?formatAbiItemWithArgs({abiItem:d,args:n,includeFunctionName:!1,includeName:!1}):void 0,f=d?(0,l.t)(d,{includeName:!0}):void 0,m=(0,b.xr)({address:o&&(0,y.CR)(o),function:f,args:p&&"()"!==p&&`${[...Array(s?.length??0).keys()].map(()=>" ").join("")}${p}`,sender:c});super(e.shortMessage||`An unknown error occurred while executing the contract function "${s}".`,{cause:e,docsPath:i,metaMessages:[...e.metaMessages?[...e.metaMessages," "]:[],"Contract Call:",m].filter(Boolean)}),Object.defineProperty(this,"abi",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"args",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"cause",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"contractAddress",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"formattedArgs",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"functionName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"sender",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ContractFunctionExecutionError"}),this.abi=t,this.args=n,this.cause=e,this.contractAddress=o,this.functionName=s,this.sender=c}};let ContractFunctionRevertedError=class ContractFunctionRevertedError extends m.G{constructor({abi:e,data:t,functionName:n,message:o}){let c,u,d,p,m;if(t&&"0x"!==t)try{m=(0,s.p)({abi:e,data:t});let{abiItem:n,errorName:o,args:c}=m;if("Error"===o)d=c[0];else if("Panic"===o){let[e]=c;d=i.$[e]}else{let e=n?(0,l.t)(n,{includeName:!0}):void 0,t=n&&c?formatAbiItemWithArgs({abiItem:n,args:c,includeFunctionName:!1,includeName:!1}):void 0;u=[e?`Error: ${e}`:"",t&&"()"!==t?` ${[...Array(o?.length??0).keys()].map(()=>" ").join("")}${t}`:""]}}catch(e){c=e}else o&&(d=o);c instanceof f.yP&&(p=c.signature,u=[`Unable to decode signature "${p}" as it was not found on the provided ABI.`,"Make sure you are using the correct ABI and that the error exists on it.",`You can look up the decoded signature here: https://openchain.xyz/signatures?query=${p}.`]),super(d&&"execution reverted"!==d||p?[`The contract function "${n}" reverted with the following ${p?"signature":"reason"}:`,d||p].join("\n"):`The contract function "${n}" reverted.`,{cause:c,metaMessages:u}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ContractFunctionRevertedError"}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reason",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"signature",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.data=m,this.reason=d,this.signature=p}};let ContractFunctionZeroDataError=class ContractFunctionZeroDataError extends m.G{constructor({functionName:e}){super(`The contract function "${e}" returned no data ("0x").`,{metaMessages:["This could be due to any of the following:",` - The contract does not have the function "${e}",`," - The parameters passed to the contract function may be invalid, or"," - The address is not a contract."]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ContractFunctionZeroDataError"})}};let RawContractError=class RawContractError extends m.G{constructor({data:e,message:t}){super(t||""),Object.defineProperty(this,"code",{enumerable:!0,configurable:!0,writable:!0,value:3}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"RawContractError"}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.data=e}}},66238:function(e,t,n){"use strict";n.d(t,{KD:function(){return RecursiveReadLimitExceededError},T_:function(){return NegativeOffsetError},lQ:function(){return PositionOutOfBoundsError}});var o=n(62027);let NegativeOffsetError=class NegativeOffsetError extends o.G{constructor({offset:e}){super(`Offset \`${e}\` cannot be negative.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"NegativeOffsetError"})}};let PositionOutOfBoundsError=class PositionOutOfBoundsError extends o.G{constructor({length:e,position:t}){super(`Position \`${t}\` is out of bounds (\`0 < position < ${e}\`).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"PositionOutOfBoundsError"})}};let RecursiveReadLimitExceededError=class RecursiveReadLimitExceededError extends o.G{constructor({count:e,limit:t}){super(`Recursive read limit of \`${t}\` exceeded (recursive read count: \`${e}\`).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"RecursiveReadLimitExceededError"})}}},69760:function(e,t,n){"use strict";n.d(t,{$s:function(){return SizeExceedsPaddingSizeError},W_:function(){return InvalidBytesLengthError},mV:function(){return SliceOffsetOutOfBoundsError}});var o=n(62027);let SliceOffsetOutOfBoundsError=class SliceOffsetOutOfBoundsError extends o.G{constructor({offset:e,position:t,size:n}){super(`Slice ${"start"===t?"starting":"ending"} at offset "${e}" is out-of-bounds (size: ${n}).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"SliceOffsetOutOfBoundsError"})}};let SizeExceedsPaddingSizeError=class SizeExceedsPaddingSizeError extends o.G{constructor({size:e,targetSize:t,type:n}){super(`${n.charAt(0).toUpperCase()}${n.slice(1).toLowerCase()} size (${e}) exceeds padding size (${t}).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"SizeExceedsPaddingSizeError"})}};let InvalidBytesLengthError=class InvalidBytesLengthError extends o.G{constructor({size:e,targetSize:t,type:n}){super(`${n.charAt(0).toUpperCase()}${n.slice(1).toLowerCase()} is expected to be ${t} ${n} long, but is ${e} ${n} long.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidBytesLengthError"})}}},87788:function(e,t,n){"use strict";n.d(t,{J5:function(){return IntegerOutOfRangeError},M6:function(){return SizeOverflowError},yr:function(){return InvalidBytesBooleanError}});var o=n(62027);let IntegerOutOfRangeError=class IntegerOutOfRangeError extends o.G{constructor({max:e,min:t,signed:n,size:o,value:i}){super(`Number "${i}" is not in safe ${o?`${8*o}-bit ${n?"signed":"unsigned"} `:""}integer range ${e?`(${t} to ${e})`:`(above ${t})`}`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"IntegerOutOfRangeError"})}};let InvalidBytesBooleanError=class InvalidBytesBooleanError extends o.G{constructor(e){super(`Bytes value "${e}" is not a valid boolean. The bytes array must contain a single byte of either a 0 or 1 value.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidBytesBooleanError"})}};let SizeOverflowError=class SizeOverflowError extends o.G{constructor({givenSize:e,maxSize:t}){super(`Size cannot exceed ${t} bytes. Given size: ${e} bytes.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"SizeOverflowError"})}}},26445:function(e,t,n){"use strict";n.d(t,{C_:function(){return InsufficientFundsError},G$:function(){return FeeCapTooLowError},Hh:function(){return FeeCapTooHighError},M_:function(){return ExecutionRevertedError},WF:function(){return IntrinsicGasTooHighError},ZI:function(){return NonceTooHighError},cj:function(){return UnknownNodeError},cs:function(){return TipAboveFeeCapError},dR:function(){return IntrinsicGasTooLowError},pZ:function(){return TransactionTypeNotSupportedError},se:function(){return NonceMaxValueError},vU:function(){return NonceTooLowError}});var o=n(67795),i=n(62027);let ExecutionRevertedError=class ExecutionRevertedError extends i.G{constructor({cause:e,message:t}={}){let n=t?.replace("execution reverted: ","")?.replace("execution reverted","");super(`Execution reverted ${n?`with reason: ${n}`:"for an unknown reason"}.`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ExecutionRevertedError"})}};Object.defineProperty(ExecutionRevertedError,"code",{enumerable:!0,configurable:!0,writable:!0,value:3}),Object.defineProperty(ExecutionRevertedError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/execution reverted/});let FeeCapTooHighError=class FeeCapTooHighError extends i.G{constructor({cause:e,maxFeePerGas:t}={}){super(`The fee cap (\`maxFeePerGas\`${t?` = ${(0,o.o)(t)} gwei`:""}) cannot be higher than the maximum allowed value (2^256-1).`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"FeeCapTooHigh"})}};Object.defineProperty(FeeCapTooHighError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/max fee per gas higher than 2\^256-1|fee cap higher than 2\^256-1/});let FeeCapTooLowError=class FeeCapTooLowError extends i.G{constructor({cause:e,maxFeePerGas:t}={}){super(`The fee cap (\`maxFeePerGas\`${t?` = ${(0,o.o)(t)}`:""} gwei) cannot be lower than the block base fee.`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"FeeCapTooLow"})}};Object.defineProperty(FeeCapTooLowError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/max fee per gas less than block base fee|fee cap less than block base fee|transaction is outdated/});let NonceTooHighError=class NonceTooHighError extends i.G{constructor({cause:e,nonce:t}={}){super(`Nonce provided for the transaction ${t?`(${t}) `:""}is higher than the next one expected.`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"NonceTooHighError"})}};Object.defineProperty(NonceTooHighError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/nonce too high/});let NonceTooLowError=class NonceTooLowError extends i.G{constructor({cause:e,nonce:t}={}){super(`Nonce provided for the transaction ${t?`(${t}) `:""}is lower than the current nonce of the account. Try increasing the nonce or find the latest nonce with \`getTransactionCount\`.`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"NonceTooLowError"})}};Object.defineProperty(NonceTooLowError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/nonce too low|transaction already imported|already known/});let NonceMaxValueError=class NonceMaxValueError extends i.G{constructor({cause:e,nonce:t}={}){super(`Nonce provided for the transaction ${t?`(${t}) `:""}exceeds the maximum allowed nonce.`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"NonceMaxValueError"})}};Object.defineProperty(NonceMaxValueError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/nonce has max value/});let InsufficientFundsError=class InsufficientFundsError extends i.G{constructor({cause:e}={}){super("The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.",{cause:e,metaMessages:["This error could arise when the account does not have enough funds to:"," - pay for the total gas fee,"," - pay for the value to send."," ","The cost of the transaction is calculated as `gas * gas fee + value`, where:"," - `gas` is the amount of gas needed for transaction to execute,"," - `gas fee` is the gas fee,"," - `value` is the amount of ether to send to the recipient."]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InsufficientFundsError"})}};Object.defineProperty(InsufficientFundsError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/insufficient funds/});let IntrinsicGasTooHighError=class IntrinsicGasTooHighError extends i.G{constructor({cause:e,gas:t}={}){super(`The amount of gas ${t?`(${t}) `:""}provided for the transaction exceeds the limit allowed for the block.`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"IntrinsicGasTooHighError"})}};Object.defineProperty(IntrinsicGasTooHighError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/intrinsic gas too high|gas limit reached/});let IntrinsicGasTooLowError=class IntrinsicGasTooLowError extends i.G{constructor({cause:e,gas:t}={}){super(`The amount of gas ${t?`(${t}) `:""}provided for the transaction is too low.`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"IntrinsicGasTooLowError"})}};Object.defineProperty(IntrinsicGasTooLowError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/intrinsic gas too low/});let TransactionTypeNotSupportedError=class TransactionTypeNotSupportedError extends i.G{constructor({cause:e}){super("The transaction type is not supported for this chain.",{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"TransactionTypeNotSupportedError"})}};Object.defineProperty(TransactionTypeNotSupportedError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/transaction type not valid/});let TipAboveFeeCapError=class TipAboveFeeCapError extends i.G{constructor({cause:e,maxPriorityFeePerGas:t,maxFeePerGas:n}={}){super(`The provided tip (\`maxPriorityFeePerGas\`${t?` = ${(0,o.o)(t)} gwei`:""}) cannot be higher than the fee cap (\`maxFeePerGas\`${n?` = ${(0,o.o)(n)} gwei`:""}).`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"TipAboveFeeCapError"})}};Object.defineProperty(TipAboveFeeCapError,"nodeMessage",{enumerable:!0,configurable:!0,writable:!0,value:/max priority fee per gas higher than max fee per gas|tip higher than fee cap/});let UnknownNodeError=class UnknownNodeError extends i.G{constructor({cause:e}){super(`An error occurred while executing: ${e?.shortMessage}`,{cause:e}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"UnknownNodeError"})}}},78863:function(e,t,n){"use strict";n.d(t,{Gg:function(){return HttpRequestError},W5:function(){return TimeoutError},bs:function(){return RpcRequestError}});var o=n(96070),i=n(62027),s=n(35280);let HttpRequestError=class HttpRequestError extends i.G{constructor({body:e,details:t,headers:n,status:i,url:l}){super("HTTP request failed.",{details:t,metaMessages:[i&&`Status: ${i}`,`URL: ${(0,s.Gr)(l)}`,e&&`Request body: ${(0,o.P)(e)}`].filter(Boolean)}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"HttpRequestError"}),Object.defineProperty(this,"body",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"headers",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"status",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"url",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.body=e,this.headers=n,this.status=i,this.url=l}};let RpcRequestError=class RpcRequestError extends i.G{constructor({body:e,error:t,url:n}){super("RPC Request failed.",{cause:t,details:t.message,metaMessages:[`URL: ${(0,s.Gr)(n)}`,`Request body: ${(0,o.P)(e)}`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"RpcRequestError"}),Object.defineProperty(this,"code",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.code=t.code}};let TimeoutError=class TimeoutError extends i.G{constructor({body:e,url:t}){super("The request took too long to respond.",{details:"The request timed out.",metaMessages:[`URL: ${(0,s.Gr)(t)}`,`Request body: ${(0,o.P)(e)}`]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"TimeoutError"})}}},39028:function(e,t,n){"use strict";n.d(t,{B:function(){return InvalidRequestRpcError},GD:function(){return JsonRpcVersionUnsupportedError},I0:function(){return ChainDisconnectedError},KB:function(){return TransactionRejectedRpcError},LX:function(){return MethodNotFoundRpcError},Og:function(){return ResourceNotFoundRpcError},PE:function(){return UnauthorizedProviderError},Pv:function(){return LimitExceededRpcError},Ts:function(){return UnsupportedProviderMethodError},XS:function(){return InternalRpcError},ab:function(){return UserRejectedRequestError},gS:function(){return MethodNotSupportedRpcError},ir:function(){return UnknownRpcError},nY:function(){return InvalidParamsRpcError},pT:function(){return ResourceUnavailableRpcError},s7:function(){return ParseRpcError},u5:function(){return ProviderDisconnectedError},x3:function(){return SwitchChainError},yR:function(){return InvalidInputRpcError}});var o=n(62027),i=n(78863);let RpcError=class RpcError extends o.G{constructor(e,{code:t,docsPath:n,metaMessages:o,shortMessage:s}){super(s,{cause:e,docsPath:n,metaMessages:o||e?.metaMessages}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"RpcError"}),Object.defineProperty(this,"code",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.name=e.name,this.code=e instanceof i.bs?e.code:t??-1}};let ProviderRpcError=class ProviderRpcError extends RpcError{constructor(e,t){super(e,t),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ProviderRpcError"}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.data=t.data}};let ParseRpcError=class ParseRpcError extends RpcError{constructor(e){super(e,{code:ParseRpcError.code,shortMessage:"Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ParseRpcError"})}};Object.defineProperty(ParseRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32700});let InvalidRequestRpcError=class InvalidRequestRpcError extends RpcError{constructor(e){super(e,{code:InvalidRequestRpcError.code,shortMessage:"JSON is not a valid request object."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidRequestRpcError"})}};Object.defineProperty(InvalidRequestRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32600});let MethodNotFoundRpcError=class MethodNotFoundRpcError extends RpcError{constructor(e){super(e,{code:MethodNotFoundRpcError.code,shortMessage:"The method does not exist / is not available."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"MethodNotFoundRpcError"})}};Object.defineProperty(MethodNotFoundRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32601});let InvalidParamsRpcError=class InvalidParamsRpcError extends RpcError{constructor(e){super(e,{code:InvalidParamsRpcError.code,shortMessage:"Invalid parameters were provided to the RPC method.\nDouble check you have provided the correct parameters."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidParamsRpcError"})}};Object.defineProperty(InvalidParamsRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32602});let InternalRpcError=class InternalRpcError extends RpcError{constructor(e){super(e,{code:InternalRpcError.code,shortMessage:"An internal error was received."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InternalRpcError"})}};Object.defineProperty(InternalRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32603});let InvalidInputRpcError=class InvalidInputRpcError extends RpcError{constructor(e){super(e,{code:InvalidInputRpcError.code,shortMessage:"Missing or invalid parameters.\nDouble check you have provided the correct parameters."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidInputRpcError"})}};Object.defineProperty(InvalidInputRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32e3});let ResourceNotFoundRpcError=class ResourceNotFoundRpcError extends RpcError{constructor(e){super(e,{code:ResourceNotFoundRpcError.code,shortMessage:"Requested resource not found."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ResourceNotFoundRpcError"})}};Object.defineProperty(ResourceNotFoundRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32001});let ResourceUnavailableRpcError=class ResourceUnavailableRpcError extends RpcError{constructor(e){super(e,{code:ResourceUnavailableRpcError.code,shortMessage:"Requested resource not available."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ResourceUnavailableRpcError"})}};Object.defineProperty(ResourceUnavailableRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32002});let TransactionRejectedRpcError=class TransactionRejectedRpcError extends RpcError{constructor(e){super(e,{code:TransactionRejectedRpcError.code,shortMessage:"Transaction creation failed."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"TransactionRejectedRpcError"})}};Object.defineProperty(TransactionRejectedRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32003});let MethodNotSupportedRpcError=class MethodNotSupportedRpcError extends RpcError{constructor(e){super(e,{code:MethodNotSupportedRpcError.code,shortMessage:"Method is not implemented."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"MethodNotSupportedRpcError"})}};Object.defineProperty(MethodNotSupportedRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32004});let LimitExceededRpcError=class LimitExceededRpcError extends RpcError{constructor(e){super(e,{code:LimitExceededRpcError.code,shortMessage:"Request exceeds defined limit."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"LimitExceededRpcError"})}};Object.defineProperty(LimitExceededRpcError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32005});let JsonRpcVersionUnsupportedError=class JsonRpcVersionUnsupportedError extends RpcError{constructor(e){super(e,{code:JsonRpcVersionUnsupportedError.code,shortMessage:"Version of JSON-RPC protocol is not supported."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"JsonRpcVersionUnsupportedError"})}};Object.defineProperty(JsonRpcVersionUnsupportedError,"code",{enumerable:!0,configurable:!0,writable:!0,value:-32006});let UserRejectedRequestError=class UserRejectedRequestError extends ProviderRpcError{constructor(e){super(e,{code:UserRejectedRequestError.code,shortMessage:"User rejected the request."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"UserRejectedRequestError"})}};Object.defineProperty(UserRejectedRequestError,"code",{enumerable:!0,configurable:!0,writable:!0,value:4001});let UnauthorizedProviderError=class UnauthorizedProviderError extends ProviderRpcError{constructor(e){super(e,{code:UnauthorizedProviderError.code,shortMessage:"The requested method and/or account has not been authorized by the user."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"UnauthorizedProviderError"})}};Object.defineProperty(UnauthorizedProviderError,"code",{enumerable:!0,configurable:!0,writable:!0,value:4100});let UnsupportedProviderMethodError=class UnsupportedProviderMethodError extends ProviderRpcError{constructor(e){super(e,{code:UnsupportedProviderMethodError.code,shortMessage:"The Provider does not support the requested method."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"UnsupportedProviderMethodError"})}};Object.defineProperty(UnsupportedProviderMethodError,"code",{enumerable:!0,configurable:!0,writable:!0,value:4200});let ProviderDisconnectedError=class ProviderDisconnectedError extends ProviderRpcError{constructor(e){super(e,{code:ProviderDisconnectedError.code,shortMessage:"The Provider is disconnected from all chains."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ProviderDisconnectedError"})}};Object.defineProperty(ProviderDisconnectedError,"code",{enumerable:!0,configurable:!0,writable:!0,value:4900});let ChainDisconnectedError=class ChainDisconnectedError extends ProviderRpcError{constructor(e){super(e,{code:ChainDisconnectedError.code,shortMessage:"The Provider is not connected to the requested chain."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ChainDisconnectedError"})}};Object.defineProperty(ChainDisconnectedError,"code",{enumerable:!0,configurable:!0,writable:!0,value:4901});let SwitchChainError=class SwitchChainError extends ProviderRpcError{constructor(e){super(e,{code:SwitchChainError.code,shortMessage:"An error occurred when attempting to switch chain."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"SwitchChainError"})}};Object.defineProperty(SwitchChainError,"code",{enumerable:!0,configurable:!0,writable:!0,value:4902});let UnknownRpcError=class UnknownRpcError extends RpcError{constructor(e){super(e,{shortMessage:"An unknown RPC error occurred."}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"UnknownRpcError"})}}},20443:function(e,t,n){"use strict";n.d(t,{Bj:function(){return prettyStateOverride},Nc:function(){return AccountStateConflictError},Z8:function(){return StateAssignmentConflictError}});var o=n(62027);let AccountStateConflictError=class AccountStateConflictError extends o.G{constructor({address:e}){super(`State for account "${e}" is set multiple times.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AccountStateConflictError"})}};let StateAssignmentConflictError=class StateAssignmentConflictError extends o.G{constructor(){super("state and stateDiff are set on the same account."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"StateAssignmentConflictError"})}};function prettyStateMapping(e){return e.reduce((e,{slot:t,value:n})=>`${e} ${t}: ${n} `,"")}function prettyStateOverride(e){return e.reduce((e,{address:t,...n})=>{let o=`${e} ${t}: `;return n.nonce&&(o+=` nonce: ${n.nonce} `),n.balance&&(o+=` balance: ${n.balance} `),n.code&&(o+=` code: ${n.code} -`),n.state&&(o+=" state:\n"+prettyStateMapping(n.state)),n.stateDiff&&(o+=" stateDiff:\n"+prettyStateMapping(n.stateDiff)),o}," State Override:\n").slice(0,-1)}},33639:function(e,t,n){"use strict";n.d(t,{Bh:function(){return TransactionNotFoundError},JC:function(){return InvalidStorageKeySizeError},Yb:function(){return TransactionReceiptNotFoundError},j3:function(){return InvalidSerializableTransactionError},mc:function(){return WaitForTransactionReceiptTimeoutError},vl:function(){return InvalidLegacyVError},xY:function(){return FeeConflictError},xr:function(){return prettyPrint}});var o=n(62027);function prettyPrint(e){let t=Object.entries(e).map(([e,t])=>void 0===t||!1===t?null:[e,t]).filter(Boolean),n=t.reduce((e,[t])=>Math.max(e,t.length),0);return t.map(([e,t])=>` ${`${e}:`.padEnd(n+1)} ${t}`).join("\n")}let FeeConflictError=class FeeConflictError extends o.G{constructor(){super("Cannot specify both a `gasPrice` and a `maxFeePerGas`/`maxPriorityFeePerGas`.\nUse `maxFeePerGas`/`maxPriorityFeePerGas` for EIP-1559 compatible networks, and `gasPrice` for others."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"FeeConflictError"})}};let InvalidLegacyVError=class InvalidLegacyVError extends o.G{constructor({v:e}){super(`Invalid \`v\` value "${e}". Expected 27 or 28.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidLegacyVError"})}};let InvalidSerializableTransactionError=class InvalidSerializableTransactionError extends o.G{constructor({transaction:e}){super("Cannot infer a transaction type from provided transaction.",{metaMessages:["Provided Transaction:","{",prettyPrint(e),"}","","To infer the type, either provide:","- a `type` to the Transaction, or","- an EIP-1559 Transaction with `maxFeePerGas`, or","- an EIP-2930 Transaction with `gasPrice` & `accessList`, or","- an EIP-4844 Transaction with `blobs`, `blobVersionedHashes`, `sidecars`, or","- a Legacy Transaction with `gasPrice`"]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidSerializableTransactionError"})}};let InvalidStorageKeySizeError=class InvalidStorageKeySizeError extends o.G{constructor({storageKey:e}){super(`Size for storage key "${e}" is invalid. Expected 32 bytes. Got ${Math.floor((e.length-2)/2)} bytes.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidStorageKeySizeError"})}};let TransactionNotFoundError=class TransactionNotFoundError extends o.G{constructor({blockHash:e,blockNumber:t,blockTag:n,hash:o,index:i}){let s="Transaction";n&&void 0!==i&&(s=`Transaction at block time "${n}" at index "${i}"`),e&&void 0!==i&&(s=`Transaction at block hash "${e}" at index "${i}"`),t&&void 0!==i&&(s=`Transaction at block number "${t}" at index "${i}"`),o&&(s=`Transaction with hash "${o}"`),super(`${s} could not be found.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"TransactionNotFoundError"})}};let TransactionReceiptNotFoundError=class TransactionReceiptNotFoundError extends o.G{constructor({hash:e}){super(`Transaction receipt with hash "${e}" could not be found. The Transaction may not be processed on a block yet.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"TransactionReceiptNotFoundError"})}};let WaitForTransactionReceiptTimeoutError=class WaitForTransactionReceiptTimeoutError extends o.G{constructor({hash:e}){super(`Timed out while waiting for transaction with hash "${e}" to be confirmed.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"WaitForTransactionReceiptTimeoutError"})}}},35280:function(e,t,n){"use strict";n.d(t,{CR:function(){return getContractAddress},Gr:function(){return getUrl},bo:function(){return getVersion}});let getContractAddress=e=>e,getUrl=e=>e,getVersion=()=>"viem@2.8.14"},78398:function(e,t,n){"use strict";n.d(t,{r:function(){return decodeAbiParameters}});var o=n(57412),i=n(45775),s=n(11221),l=n(39135),c=n(3972),u=n(61836),d=n(87788),p=n(95946),f=n(92106);function bytesToNumber(e,t={}){void 0!==t.size&&(0,p.Yf)(e,{size:t.size});let n=(0,f.ci)(e,t);return(0,p.ly)(n,t)}var m=n(11187),b=n(45444);function decodeAbiParameters(e,t){let n="string"==typeof t?(0,m.nr)(t):t,g=(0,s.q)(n);if(0===(0,l.d)(n)&&e.length>0)throw new o.wb;if((0,l.d)(t)&&32>(0,l.d)(t))throw new o.xB({data:"string"==typeof t?t:(0,f.ci)(t),params:e,size:(0,l.d)(t)});let y=0,v=[];for(let t=0;t!e),i=o?[]:{},s=0;if(hasDynamicChild(t)){let l=bytesToNumber(e.readBytes(32)),c=n+l;for(let n=0;n1||n[0]>1)throw new d.yr(n);return!!n[0]}(e.readBytes(32),{size:32}),32];if(t.type.startsWith("bytes"))return function(e,t,{staticPosition:n}){let[o,i]=t.type.split("bytes");if(!i){let t=bytesToNumber(e.readBytes(32));e.setPosition(n+t);let o=bytesToNumber(e.readBytes(32));if(0===o)return e.setPosition(n+32),["0x",32];let i=e.readBytes(o);return e.setPosition(n+32),[(0,f.ci)(i),32]}let s=(0,f.ci)(e.readBytes(parseInt(i),32));return[s,32]}(e,t,{staticPosition:n});if(t.type.startsWith("uint")||t.type.startsWith("int"))return function(e,t){let n=t.type.startsWith("int"),o=parseInt(t.type.split("int")[1]||"256"),i=e.readBytes(32);return[o>48?function(e,t={}){void 0!==t.size&&(0,p.Yf)(e,{size:t.size});let n=(0,f.ci)(e,t);return(0,p.y_)(n,t)}(i,{signed:n}):bytesToNumber(i,{signed:n}),32]}(e,t);if("string"===t.type)return function(e,{staticPosition:t}){let n=bytesToNumber(e.readBytes(32)),o=t+n;e.setPosition(o);let i=bytesToNumber(e.readBytes(32));if(0===i)return e.setPosition(t+32),["",32];let s=e.readBytes(i,32),l=function(e,t={}){let n=e;return void 0!==t.size&&((0,p.Yf)(n,{size:t.size}),n=(0,u.f)(n,{dir:"right"})),new TextDecoder().decode(n)}((0,u.f)(s));return e.setPosition(t+32),[l,32]}(e,{staticPosition:n});throw new o.CI(t.type,{docsPath:"/docs/contract/decodeAbiParameters"})}(g,n,{staticPosition:0});y+=l,v.push(s)}return v}function hasDynamicChild(e){let{type:t}=e;if("string"===t||"bytes"===t||t.endsWith("[]"))return!0;if("tuple"===t)return e.components?.some(hasDynamicChild);let n=(0,b.S)(e.type);return!!(n&&hasDynamicChild({...e,type:n[1]}))}},86899:function(e,t,n){"use strict";n.d(t,{p:function(){return decodeErrorResult}});var o=n(21746),i=n(57412),s=n(3972),l=n(58034),c=n(78398),u=n(80522);function decodeErrorResult(e){let{abi:t,data:n}=e,d=(0,s.tP)(n,0,4);if("0x"===d)throw new i.wb;let p=[...t||[],o.Up,o.hZ],f=p.find(e=>"error"===e.type&&d===(0,l.C)((0,u.t)(e)));if(!f)throw new i.yP(d,{docsPath:"/docs/contract/decodeErrorResult"});return{abiItem:f,args:"inputs"in f&&f.inputs&&f.inputs.length>0?(0,c.r)(f.inputs,(0,s.tP)(n,4)):void 0,errorName:f.name}}},7210:function(e,t,n){"use strict";n.d(t,{k:function(){return decodeFunctionResult}});var o=n(57412),i=n(78398),s=n(40840);let l="/docs/contract/decodeFunctionResult";function decodeFunctionResult(e){let{abi:t,args:n,functionName:c,data:u}=e,d=t[0];if(c){let e=(0,s.mE)({abi:t,args:n,name:c});if(!e)throw new o.xL(c,{docsPath:l});d=e}if("function"!==d.type)throw new o.xL(void 0,{docsPath:l});if(!d.outputs)throw new o.MX(d.name,{docsPath:l});let p=(0,i.r)(d.outputs,u);return p&&p.length>1?p:p&&1===p.length?p[0]:void 0}},45444:function(e,t,n){"use strict";n.d(t,{E:function(){return encodeAbiParameters},S:function(){return getArrayComponents}});var o=n(57412),i=n(26087),s=n(62027),l=n(60480),c=n(57040),u=n(61769),d=n(39135),p=n(3972),f=n(92106);function encodeAbiParameters(e,t){if(e.length!==t.length)throw new o.fs({expectedLength:e.length,givenLength:t.length});let n=function({params:e,values:t}){let n=[];for(let m=0;m0?(0,c.zo)([t,e]):t}}if(s)return{dynamic:!0,encoded:e}}return{dynamic:!1,encoded:(0,c.zo)(l.map(({encoded:e})=>e))}}(t,{length:i,param:{...e,type:s}})}if("tuple"===e.type)return function(e,{param:t}){let n=!1,o=[];for(let i=0;ie))}}(t,{param:e});if("address"===e.type)return function(e){if(!(0,l.U)(e))throw new i.b({address:e});return{dynamic:!1,encoded:(0,u.gc)(e.toLowerCase())}}(t);if("bool"===e.type)return function(e){if("boolean"!=typeof e)throw new s.G(`Invalid boolean value: "${e}" (type: ${typeof e}). Expected: \`true\` or \`false\`.`);return{dynamic:!1,encoded:(0,u.gc)((0,f.C4)(e))}}(t);if(e.type.startsWith("uint")||e.type.startsWith("int")){let n=e.type.startsWith("int");return function(e,{signed:t}){return{dynamic:!1,encoded:(0,f.eC)(e,{size:32,signed:t})}}(t,{signed:n})}if(e.type.startsWith("bytes"))return function(e,{param:t}){let[,n]=t.type.split("bytes"),i=(0,d.d)(e);if(!n){let t=e;return i%32!=0&&(t=(0,u.gc)(t,{dir:"right",size:32*Math.ceil((e.length-2)/2/32)})),{dynamic:!0,encoded:(0,c.zo)([(0,u.gc)((0,f.eC)(i,{size:32})),t])}}if(i!==parseInt(n))throw new o.M4({expectedSize:parseInt(n),value:e});return{dynamic:!1,encoded:(0,u.gc)(e,{dir:"right"})}}(t,{param:e});if("string"===e.type)return function(e){let t=(0,f.$G)(e),n=Math.ceil((0,d.d)(t)/32),o=[];for(let e=0;e(function(e,{includeName:t}){return e.type.startsWith("tuple")?`(${formatAbiParams(e.components,{includeName:t})})${e.type.slice(5)}`:e.type+(t&&e.name?` ${e.name}`:"")})(e,{includeName:t})).join(t?", ":","):""}},40840:function(e,t,n){"use strict";n.d(t,{mE:function(){return getAbiItem}});var o=n(57412),i=n(15102),s=n(60480),l=n(96005),c=n(58034);function getAbiItem(e){let t;let{abi:n,args:u=[],name:d}=e,p=(0,i.v)(d,{strict:!1}),f=n.filter(e=>p?"function"===e.type?(0,c.C)(e)===d:"event"===e.type&&(0,l.n)(e)===d:"name"in e&&e.name===d);if(0!==f.length){if(1===f.length)return f[0];for(let e of f){if(!("inputs"in e))continue;if(!u||0===u.length){if(!e.inputs||0===e.inputs.length)return e;continue}if(!e.inputs||0===e.inputs.length||e.inputs.length!==u.length)continue;let n=u.every((t,n)=>{let o="inputs"in e&&e.inputs[n];return!!o&&function isArgOfType(e,t){let n=typeof e,o=t.type;switch(o){case"address":return(0,s.U)(e,{strict:!1});case"bool":return"boolean"===n;case"function":case"string":return"string"===n;default:if("tuple"===o&&"components"in t)return Object.values(t.components).every((t,n)=>isArgOfType(Object.values(e)[n],t));if(/^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(o))return"number"===n||"bigint"===n;if(/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(o))return"string"===n||e instanceof Uint8Array;if(/[a-z]+[1-9]{0,3}(\[[0-9]{0,}\])+$/.test(o))return Array.isArray(e)&&e.every(e=>isArgOfType(e,{...t,type:o.replace(/(\[[0-9]{0,}\])$/,"")}));return!1}}(t,o)});if(n){if(t&&"inputs"in t&&t.inputs){let n=function getAmbiguousTypes(e,t,n){for(let o in e){let i=e[o],l=t[o];if("tuple"===i.type&&"tuple"===l.type&&"components"in i&&"components"in l)return getAmbiguousTypes(i.components,l.components,n[o]);let c=[i.type,l.type],u=!!(c.includes("address")&&c.includes("bytes20"))||!!(c.includes("address")&&c.includes("string")||c.includes("address")&&c.includes("bytes"))&&(0,s.U)(n[o],{strict:!1});if(u)return c}}(e.inputs,t.inputs,u);if(n)throw new o.S4({abiItem:e,type:n[0]},{abiItem:t,type:n[1]})}t=e}}return t||f[0]}}},45775:function(e,t,n){"use strict";n.d(t,{K:function(){return getAddress},x:function(){return checksumAddress}});var o=n(26087),i=n(11187),s=n(49550),l=n(60480);function checksumAddress(e,t){let n=t?`${t}${e.toLowerCase()}`:e.substring(2).toLowerCase(),o=(0,s.w)((0,i.qX)(n),"bytes"),l=(t?n.substring(`${t}0x`.length):n).split("");for(let e=0;e<40;e+=2)o[e>>1]>>4>=8&&l[e]&&(l[e]=l[e].toUpperCase()),(15&o[e>>1])>=8&&l[e+1]&&(l[e+1]=l[e+1].toUpperCase());return`0x${l.join("")}`}function getAddress(e,t){if(!(0,l.U)(e))throw new o.b({address:e});return checksumAddress(e,t)}},60480:function(e,t,n){"use strict";n.d(t,{U:function(){return isAddress}});let LruMap=class LruMap extends Map{constructor(e){super(),Object.defineProperty(this,"maxSize",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.maxSize=e}set(e,t){return super.set(e,t),this.maxSize&&this.size>this.maxSize&&this.delete(this.keys().next().value),this}};var o=n(45775);let i=/^0x[a-fA-F0-9]{40}$/,s=new LruMap(8192);function isAddress(e,{strict:t=!0}={}){if(s.has(e))return s.get(e);let n=!!i.test(e)&&(e.toLowerCase()===e||!t||(0,o.x)(e)===e);return s.set(e,n),n}},86164:function(e,t,n){"use strict";function defineChain(e){return{formatters:void 0,fees:void 0,serializers:void 0,...e}}n.d(t,{a:function(){return defineChain}})},47864:function(e,t,n){"use strict";n.d(t,{L:function(){return getChainContractAddress}});var o=n(80377);function getChainContractAddress({blockNumber:e,chain:t,contract:n}){let i=t?.contracts?.[n];if(!i)throw new o.mm({chain:t,contract:{name:n}});if(e&&i.blockCreated&&i.blockCreated>e)throw new o.mm({blockNumber:e,chain:t,contract:{name:n,blockCreated:i.blockCreated}});return i.address}},11221:function(e,t,n){"use strict";n.d(t,{q:function(){return createCursor}});var o=n(66238);let i={bytes:new Uint8Array,dataView:new DataView(new ArrayBuffer(0)),position:0,positionReadCount:new Map,recursiveReadCount:0,recursiveReadLimit:1/0,assertReadLimit(){if(this.recursiveReadCount>=this.recursiveReadLimit)throw new o.KD({count:this.recursiveReadCount+1,limit:this.recursiveReadLimit})},assertPosition(e){if(e<0||e>this.bytes.length-1)throw new o.lQ({length:this.bytes.length,position:e})},decrementPosition(e){if(e<0)throw new o.T_({offset:e});let t=this.position-e;this.assertPosition(t),this.position=t},getReadCount(e){return this.positionReadCount.get(e||this.position)||0},incrementPosition(e){if(e<0)throw new o.T_({offset:e});let t=this.position+e;this.assertPosition(t),this.position=t},inspectByte(e){let t=e??this.position;return this.assertPosition(t),this.bytes[t]},inspectBytes(e,t){let n=t??this.position;return this.assertPosition(n+e-1),this.bytes.subarray(n,n+e)},inspectUint8(e){let t=e??this.position;return this.assertPosition(t),this.bytes[t]},inspectUint16(e){let t=e??this.position;return this.assertPosition(t+1),this.dataView.getUint16(t)},inspectUint24(e){let t=e??this.position;return this.assertPosition(t+2),(this.dataView.getUint16(t)<<8)+this.dataView.getUint8(t+2)},inspectUint32(e){let t=e??this.position;return this.assertPosition(t+3),this.dataView.getUint32(t)},pushByte(e){this.assertPosition(this.position),this.bytes[this.position]=e,this.position++},pushBytes(e){this.assertPosition(this.position+e.length-1),this.bytes.set(e,this.position),this.position+=e.length},pushUint8(e){this.assertPosition(this.position),this.bytes[this.position]=e,this.position++},pushUint16(e){this.assertPosition(this.position+1),this.dataView.setUint16(this.position,e),this.position+=2},pushUint24(e){this.assertPosition(this.position+2),this.dataView.setUint16(this.position,e>>8),this.dataView.setUint8(this.position+2,255&e),this.position+=3},pushUint32(e){this.assertPosition(this.position+3),this.dataView.setUint32(this.position,e),this.position+=4},readByte(){this.assertReadLimit(),this._touch();let e=this.inspectByte();return this.position++,e},readBytes(e,t){this.assertReadLimit(),this._touch();let n=this.inspectBytes(e);return this.position+=t??e,n},readUint8(){this.assertReadLimit(),this._touch();let e=this.inspectUint8();return this.position+=1,e},readUint16(){this.assertReadLimit(),this._touch();let e=this.inspectUint16();return this.position+=2,e},readUint24(){this.assertReadLimit(),this._touch();let e=this.inspectUint24();return this.position+=3,e},readUint32(){this.assertReadLimit(),this._touch();let e=this.inspectUint32();return this.position+=4,e},setPosition(e){let t=this.position;return this.assertPosition(e),this.position=e,()=>this.position=t},_touch(){if(this.recursiveReadLimit===1/0)return;let e=this.getReadCount();this.positionReadCount.set(this.position,e+1),e>0&&this.recursiveReadCount++}};function createCursor(e,{recursiveReadLimit:t=8192}={}){let n=Object.create(i);return n.bytes=e,n.dataView=new DataView(e.buffer,e.byteOffset,e.byteLength),n.positionReadCount=new Map,n.recursiveReadLimit=t,n}},57040:function(e,t,n){"use strict";function concat(e){return"string"==typeof e[0]?concatHex(e):function(e){let t=0;for(let n of e)t+=n.length;let n=new Uint8Array(t),o=0;for(let t of e)n.set(t,o),o+=t.length;return n}(e)}function concatHex(e){return`0x${e.reduce((e,t)=>e+t.replace("0x",""),"")}`}n.d(t,{SM:function(){return concatHex},zo:function(){return concat}})},15102:function(e,t,n){"use strict";function isHex(e,{strict:t=!0}={}){return!!e&&"string"==typeof e&&(t?/^0x[0-9a-fA-F]*$/.test(e):e.startsWith("0x"))}n.d(t,{v:function(){return isHex}})},61769:function(e,t,n){"use strict";n.d(t,{gc:function(){return padHex},vk:function(){return pad}});var o=n(69760);function pad(e,{dir:t,size:n=32}={}){return"string"==typeof e?padHex(e,{dir:t,size:n}):function(e,{dir:t,size:n=32}={}){if(null===n)return e;if(e.length>n)throw new o.$s({size:e.length,targetSize:n,type:"bytes"});let i=new Uint8Array(n);for(let o=0;o2*n)throw new o.$s({size:Math.ceil(i.length/2),targetSize:n,type:"hex"});return`0x${i["right"===t?"padEnd":"padStart"](2*n,"0")}`}},39135:function(e,t,n){"use strict";n.d(t,{d:function(){return size}});var o=n(15102);function size(e){return(0,o.v)(e,{strict:!1})?Math.ceil((e.length-2)/2):e.length}},3972:function(e,t,n){"use strict";n.d(t,{T4:function(){return sliceBytes},tP:function(){return slice}});var o=n(69760),i=n(15102),s=n(39135);function slice(e,t,n,{strict:o}={}){return(0,i.v)(e,{strict:!1})?function(e,t,n,{strict:o}={}){assertStartOffset(e,t);let i=`0x${e.replace("0x","").slice((t??0)*2,(n??e.length)*2)}`;return o&&assertEndOffset(i,t,n),i}(e,t,n,{strict:o}):sliceBytes(e,t,n,{strict:o})}function assertStartOffset(e,t){if("number"==typeof t&&t>0&&t>(0,s.d)(e)-1)throw new o.mV({offset:t,position:"start",size:(0,s.d)(e)})}function assertEndOffset(e,t,n){if("number"==typeof t&&"number"==typeof n&&(0,s.d)(e)!==n-t)throw new o.mV({offset:n,position:"end",size:(0,s.d)(e)})}function sliceBytes(e,t,n,{strict:o}={}){assertStartOffset(e,t);let i=e.slice(t,n);return o&&assertEndOffset(i,t,n),i}},61836:function(e,t,n){"use strict";function trim(e,{dir:t="left"}={}){let n="string"==typeof e?e.replace("0x",""):e,o=0;for(let e=0;et)throw new o.M6({givenSize:(0,i.d)(e),maxSize:t})}function hexToBigInt(e,t={}){let{signed:n}=t;t.size&&assertSize(e,{size:t.size});let o=BigInt(e);if(!n)return o;let i=(e.length-2)/2,s=(1n<<8n*BigInt(i)-1n)-1n;return o<=s?o:o-BigInt(`0x${"f".padStart(2*i,"f")}`)-1n}function hexToNumber(e,t={}){return Number(hexToBigInt(e,t))}function hexToString(e,t={}){let n=(0,l.nr)(e);return t.size&&(assertSize(n,{size:t.size}),n=(0,s.f)(n,{dir:"right"})),new TextDecoder().decode(n)}},11187:function(e,t,n){"use strict";n.d(t,{O0:function(){return toBytes},nr:function(){return hexToBytes},qX:function(){return stringToBytes}});var o=n(62027),i=n(15102),s=n(61769),l=n(95946),c=n(92106);let u=new TextEncoder;function toBytes(e,t={}){return"number"==typeof e||"bigint"==typeof e?function(e,t){let n=(0,c.eC)(e,t);return hexToBytes(n)}(e,t):"boolean"==typeof e?function(e,t={}){let n=new Uint8Array(1);return(n[0]=Number(e),"number"==typeof t.size)?((0,l.Yf)(n,{size:t.size}),(0,s.vk)(n,{size:t.size})):n}(e,t):(0,i.v)(e)?hexToBytes(e,t):stringToBytes(e,t)}let d={zero:48,nine:57,A:65,F:70,a:97,f:102};function charCodeToBase16(e){return e>=d.zero&&e<=d.nine?e-d.zero:e>=d.A&&e<=d.F?e-(d.A-10):e>=d.a&&e<=d.f?e-(d.a-10):void 0}function hexToBytes(e,t={}){let n=e;t.size&&((0,l.Yf)(n,{size:t.size}),n=(0,s.vk)(n,{dir:"right",size:t.size}));let i=n.slice(2);i.length%2&&(i=`0${i}`);let c=i.length/2,u=new Uint8Array(c);for(let e=0,t=0;et.toString(16).padStart(2,"0"));function toHex(e,t={}){return"number"==typeof e||"bigint"==typeof e?numberToHex(e,t):"string"==typeof e?stringToHex(e,t):"boolean"==typeof e?boolToHex(e,t):bytesToHex(e,t)}function boolToHex(e,t={}){let n=`0x${Number(e)}`;return"number"==typeof t.size?((0,s.Yf)(n,{size:t.size}),(0,i.vk)(n,{size:t.size})):n}function bytesToHex(e,t={}){let n="";for(let t=0;tn||ce.code===i.M_.code):e;return s instanceof o.G?new i.M_({cause:e,message:s.details}):i.M_.nodeMessage.test(n)?new i.M_({cause:e,message:e.details}):i.Hh.nodeMessage.test(n)?new i.Hh({cause:e,maxFeePerGas:t?.maxFeePerGas}):i.G$.nodeMessage.test(n)?new i.G$({cause:e,maxFeePerGas:t?.maxFeePerGas}):i.ZI.nodeMessage.test(n)?new i.ZI({cause:e,nonce:t?.nonce}):i.vU.nodeMessage.test(n)?new i.vU({cause:e,nonce:t?.nonce}):i.se.nodeMessage.test(n)?new i.se({cause:e,nonce:t?.nonce}):i.C_.nodeMessage.test(n)?new i.C_({cause:e}):i.WF.nodeMessage.test(n)?new i.WF({cause:e,gas:t?.gas}):i.dR.nodeMessage.test(n)?new i.dR({cause:e,gas:t?.gas}):i.pZ.nodeMessage.test(n)?new i.pZ({cause:e}):i.cs.nodeMessage.test(n)?new i.cs({cause:e,maxFeePerGas:t?.maxFeePerGas,maxPriorityFeePerGas:t?.maxPriorityFeePerGas}):new i.cj({cause:e})}},43310:function(e,t,n){"use strict";n.d(t,{G:function(){return s},Z:function(){return formatBlock}});var o=n(21366),i=n(6073);function formatBlock(e){let t=e.transactions?.map(e=>"string"==typeof e?e:i.Tr(e));return{...e,baseFeePerGas:e.baseFeePerGas?BigInt(e.baseFeePerGas):null,blobGasUsed:e.blobGasUsed?BigInt(e.blobGasUsed):void 0,difficulty:e.difficulty?BigInt(e.difficulty):void 0,excessBlobGas:e.excessBlobGas?BigInt(e.excessBlobGas):void 0,gasLimit:e.gasLimit?BigInt(e.gasLimit):void 0,gasUsed:e.gasUsed?BigInt(e.gasUsed):void 0,hash:e.hash?e.hash:null,logsBloom:e.logsBloom?e.logsBloom:null,nonce:e.nonce?e.nonce:null,number:e.number?BigInt(e.number):null,size:e.size?BigInt(e.size):void 0,timestamp:e.timestamp?BigInt(e.timestamp):void 0,transactions:t,totalDifficulty:e.totalDifficulty?BigInt(e.totalDifficulty):null}}let s=(0,o.$)("block",formatBlock)},61163:function(e,t,n){"use strict";function extract(e,{format:t}){if(!t)return{};let n={},o=t(e||{});return!function extract_(t){let o=Object.keys(t);for(let i of o)i in e&&(n[i]=e[i]),t[i]&&"object"==typeof t[i]&&!Array.isArray(t[i])&&extract_(t[i])}(o),n}n.d(t,{K:function(){return extract}})},21366:function(e,t,n){"use strict";function defineFormatter(e,t){return({exclude:n,format:o})=>({exclude:n,format:e=>{let i=t(e);if(n)for(let e of n)delete i[e];return{...i,...o(e)}},type:e})}n.d(t,{$:function(){return defineFormatter}})},53992:function(e,t,n){"use strict";function formatLog(e,{args:t,eventName:n}={}){return{...e,blockHash:e.blockHash?e.blockHash:null,blockNumber:e.blockNumber?BigInt(e.blockNumber):null,logIndex:e.logIndex?Number(e.logIndex):null,transactionHash:e.transactionHash?e.transactionHash:null,transactionIndex:e.transactionIndex?Number(e.transactionIndex):null,...n?{args:t,eventName:n}:{}}}n.d(t,{U:function(){return formatLog}})},6073:function(e,t,n){"use strict";n.d(t,{Tr:function(){return formatTransaction},c8:function(){return s},y_:function(){return l}});var o=n(95946),i=n(21366);let s={"0x0":"legacy","0x1":"eip2930","0x2":"eip1559","0x3":"eip4844"};function formatTransaction(e){let t={...e,blockHash:e.blockHash?e.blockHash:null,blockNumber:e.blockNumber?BigInt(e.blockNumber):null,chainId:e.chainId?(0,o.ly)(e.chainId):void 0,gas:e.gas?BigInt(e.gas):void 0,gasPrice:e.gasPrice?BigInt(e.gasPrice):void 0,maxFeePerBlobGas:e.maxFeePerBlobGas?BigInt(e.maxFeePerBlobGas):void 0,maxFeePerGas:e.maxFeePerGas?BigInt(e.maxFeePerGas):void 0,maxPriorityFeePerGas:e.maxPriorityFeePerGas?BigInt(e.maxPriorityFeePerGas):void 0,nonce:e.nonce?(0,o.ly)(e.nonce):void 0,to:e.to?e.to:null,transactionIndex:e.transactionIndex?Number(e.transactionIndex):null,type:e.type?s[e.type]:void 0,typeHex:e.type?e.type:void 0,value:e.value?BigInt(e.value):void 0,v:e.v?BigInt(e.v):void 0};return t.yParity=(()=>{if(e.yParity)return Number(e.yParity);if("bigint"==typeof t.v){if(0n===t.v||27n===t.v)return 0;if(1n===t.v||28n===t.v)return 1;if(t.v>=35n)return t.v%2n===0n?1:0}})(),"legacy"===t.type&&(delete t.accessList,delete t.maxFeePerBlobGas,delete t.maxFeePerGas,delete t.maxPriorityFeePerGas,delete t.yParity),"eip2930"===t.type&&(delete t.maxFeePerBlobGas,delete t.maxFeePerGas,delete t.maxPriorityFeePerGas),"eip1559"===t.type&&delete t.maxFeePerBlobGas,t}let l=(0,i.$)("transaction",formatTransaction)},30866:function(e,t,n){"use strict";n.d(t,{d:function(){return u},f:function(){return formatTransactionReceipt}});var o=n(95946),i=n(21366),s=n(53992),l=n(6073);let c={"0x0":"reverted","0x1":"success"};function formatTransactionReceipt(e){let t={...e,blockNumber:e.blockNumber?BigInt(e.blockNumber):null,contractAddress:e.contractAddress?e.contractAddress:null,cumulativeGasUsed:e.cumulativeGasUsed?BigInt(e.cumulativeGasUsed):null,effectiveGasPrice:e.effectiveGasPrice?BigInt(e.effectiveGasPrice):null,gasUsed:e.gasUsed?BigInt(e.gasUsed):null,logs:e.logs?e.logs.map(e=>(0,s.U)(e)):null,to:e.to?e.to:null,transactionIndex:e.transactionIndex?(0,o.ly)(e.transactionIndex):null,status:e.status?c[e.status]:null,type:e.type?l.c8[e.type]||e.type:null};return e.blobGasPrice&&(t.blobGasPrice=BigInt(e.blobGasPrice)),e.blobGasUsed&&(t.blobGasUsed=BigInt(e.blobGasUsed)),t}let u=(0,i.$)("transactionReceipt",formatTransactionReceipt)},74688:function(e,t,n){"use strict";n.d(t,{iy:function(){return l},tG:function(){return formatTransactionRequest}});var o=n(92106),i=n(21366);let s={legacy:"0x0",eip2930:"0x1",eip1559:"0x2",eip4844:"0x3"};function formatTransactionRequest(e){let t={...e};return void 0!==e.blobs&&"string"!=typeof e.blobs[0]&&(t.blobs=e.blobs.map(e=>(0,o.ci)(e))),void 0!==e.gas&&(t.gas=(0,o.eC)(e.gas)),void 0!==e.gasPrice&&(t.gasPrice=(0,o.eC)(e.gasPrice)),void 0!==e.maxFeePerBlobGas&&(t.maxFeePerBlobGas=(0,o.eC)(e.maxFeePerBlobGas)),void 0!==e.maxFeePerGas&&(t.maxFeePerGas=(0,o.eC)(e.maxFeePerGas)),void 0!==e.maxPriorityFeePerGas&&(t.maxPriorityFeePerGas=(0,o.eC)(e.maxPriorityFeePerGas)),void 0!==e.nonce&&(t.nonce=(0,o.eC)(e.nonce)),void 0!==e.type&&(t.type=s[e.type]),void 0!==e.value&&(t.value=(0,o.eC)(e.value)),t}let l=(0,i.$)("transactionRequest",formatTransactionRequest)},49550:function(e,t,n){"use strict";n.d(t,{w:function(){return keccak256}});var o=n(22250),i=n(15102),s=n(11187),l=n(92106);function keccak256(e,t){let n=(0,o.fr)((0,i.v)(e,{strict:!1})?(0,s.O0)(e):e);return"bytes"===(t||"hex")?n:(0,l.NC)(n)}},96005:function(e,t,n){"use strict";n.d(t,{n:function(){return i}});var o=n(67684);let i=o.r},58034:function(e,t,n){"use strict";n.d(t,{C:function(){return toFunctionSelector}});var o=n(3972),i=n(67684);let toFunctionSelector=e=>(0,o.tP)((0,i.r)(e),0,4)},67684:function(e,t,n){"use strict";n.d(t,{r:function(){return toSignatureHash}});var o=n(11187),i=n(49550);let hash=e=>(0,i.w)((0,o.O0)(e)),s=/^tuple(?(\[(\d*)\])*)$/;function formatAbiParameters(e){let t="",n=e.length;for(let o=0;o{var t;let n="string"==typeof e?e:"function"===(t=e).type?`function ${t.name}(${formatAbiParameters(t.inputs)})${t.stateMutability&&"nonpayable"!==t.stateMutability?` ${t.stateMutability}`:""}${t.outputs.length?` returns (${formatAbiParameters(t.outputs)})`:""}`:"event"===t.type?`event ${t.name}(${formatAbiParameters(t.inputs)})`:"error"===t.type?`error ${t.name}(${formatAbiParameters(t.inputs)})`:"constructor"===t.type?`constructor(${formatAbiParameters(t.inputs)})${"payable"===t.stateMutability?" payable":""}`:"fallback"===t.type?"fallback()":"receive() external payable";return function(e){let t=!0,n="",o=0,i="",s=!1;for(let l=0;l{let t=getScheduler();flush();let n=t.map(({args:e})=>e);0!==n.length&&e(n).then(e=>{s&&Array.isArray(e)&&e.sort(s);for(let n=0;n{for(let n=0;no.delete(t),getBatchedArgs=()=>getScheduler().map(({args:e})=>e),getScheduler=()=>o.get(t)||[],setScheduler=e=>o.set(t,[...getScheduler(),e]);return{flush,async schedule(e){let t={},o=new Promise((e,n)=>{t.resolve=e,t.reject=n}),s=n?.([...getBatchedArgs(),e]);s&&exec();let l=getScheduler().length>0;return l?setScheduler({args:e,pendingPromise:t}):(setScheduler({args:e,pendingPromise:t}),setTimeout(exec,i)),o}}}},7760:function(e,t,n){"use strict";n.d(t,{J:function(){return withRetry}});var o=n(62914);function withRetry(e,{delay:t=100,retryCount:n=2,shouldRetry:i=()=>!0}={}){return new Promise((s,l)=>{let attemptRetry=async({count:c=0}={})=>{let retry=async({error:e})=>{let n="function"==typeof t?t({count:c,error:e}):t;n&&await (0,o.D)(n),attemptRetry({count:c+1})};try{let t=await e();s(t)}catch(e){if(cJSON.stringify(e,(e,n)=>{let o="bigint"==typeof n?n.toString():n;return"function"==typeof t?t(e,o):o},n)},47531:function(e,t,n){"use strict";n.d(t,{F:function(){return assertRequest}});var o=n(14503),i=n(26087),s=n(26445),l=n(33639),c=n(60480);function assertRequest(e){let{account:t,gasPrice:n,maxFeePerGas:u,maxPriorityFeePerGas:d,to:p}=e,f=t?(0,o.T)(t):void 0;if(f&&!(0,c.U)(f.address))throw new i.b({address:f.address});if(p&&!(0,c.U)(p))throw new i.b({address:p});if(void 0!==n&&(void 0!==u||void 0!==d))throw new l.xY;if(u&&u>2n**256n-1n)throw new s.Hh({maxFeePerGas:u});if(d&&u&&d>u)throw new s.cs({maxFeePerGas:u,maxPriorityFeePerGas:d})}},82994:function(e,t,n){"use strict";n.d(t,{l:function(){return getTransactionType}});var o=n(33639);function getTransactionType(e){if(e.type)return e.type;if(void 0!==e.blobs||void 0!==e.blobVersionedHashes||void 0!==e.maxFeePerBlobGas||void 0!==e.sidecars)return"eip4844";if(void 0!==e.maxFeePerGas||void 0!==e.maxPriorityFeePerGas)return"eip1559";if(void 0!==e.gasPrice)return void 0!==e.accessList?"eip2930":"legacy";throw new o.j3({transaction:e})}},39625:function(e,t,n){"use strict";n.d(t,{d:function(){return formatEther}});var o=n(84192),i=n(15229);function formatEther(e,t="wei"){return(0,i.b)(e,o.ez[t])}},67795:function(e,t,n){"use strict";n.d(t,{o:function(){return formatGwei}});var o=n(84192),i=n(15229);function formatGwei(e,t="wei"){return(0,i.b)(e,o.Zn[t])}},15229:function(e,t,n){"use strict";function formatUnits(e,t){let n=e.toString(),o=n.startsWith("-");o&&(n=n.slice(1));let[i,s]=[(n=n.padStart(t,"0")).slice(0,n.length-t),n.slice(n.length-t)];return s=s.replace(/(0+)$/,""),`${o?"-":""}${i||"0"}${s?`.${s}`:""}`}n.d(t,{b:function(){return formatUnits}})},62914:function(e,t,n){"use strict";async function wait(e){return new Promise(t=>setTimeout(t,e))}n.d(t,{D:function(){return wait}})},99931:function(e,t,n){"use strict";n.d(t,{V:function(){return s},F:function(){return WagmiProvider}});var o=n(67294);let i=!1;async function reconnect(e,t={}){let n;if(i)return[];i=!0,e.setState(e=>({...e,status:e.current?"reconnecting":"connecting"}));let o=[];if(t.connectors?.length)for(let n of t.connectors){let t;t="function"==typeof n?e._internal.connectors.setup(n):n,o.push(t)}else o.push(...e.connectors);try{n=await e.storage?.getItem("recentConnectorId")}catch{}let s={};for(let[,t]of e.state.connections)s[t.connector.id]=1;n&&(s[n]=0);let l=Object.keys(s).length>0?[...o].sort((e,t)=>(s[e.id]??10)-(s[t.id]??10)):o,c=!1,u=[],d=[];for(let t of l){let n=await t.getProvider();if(!n||d.some(e=>e===n))continue;let o=await t.isAuthorized();if(!o)continue;let i=await t.connect({isReconnecting:!0}).catch(()=>null);i&&(t.emitter.off("connect",e._internal.events.connect),t.emitter.on("change",e._internal.events.change),t.emitter.on("disconnect",e._internal.events.disconnect),e.setState(e=>{let n=new Map(c?e.connections:new Map).set(t.uid,{accounts:i.accounts,chainId:i.chainId,connector:t});return{...e,current:c?e.current:t.uid,connections:n}}),u.push({accounts:i.accounts,chainId:i.chainId,connector:t}),d.push(n),c=!0)}return("reconnecting"===e.state.status||"connecting"===e.state.status)&&(c?e.setState(e=>({...e,status:"connected"})):e.setState(e=>({...e,connections:new Map,current:void 0,status:"disconnected"}))),i=!1,u}function Hydrate(e){let{children:t,config:n,initialState:i,reconnectOnMount:s=!0}=e,{onMount:l}=function(e,t){let{initialState:n,reconnectOnMount:o}=t;return n&&!e._internal.store.persist.hasHydrated()&&e.setState({...n,connections:o?n.connections:new Map,status:o?"reconnecting":"disconnected"}),{async onMount(){if(e._internal.ssr){await e._internal.store.persist.rehydrate();let t=e._internal.mipd?.getProviders().map(e._internal.connectors.providerDetailToConnector).map(e._internal.connectors.setup);e._internal.connectors.setState(e=>[...e,...t??[]])}o?reconnect(e):e.storage&&e.setState(e=>({...e,connections:new Map}))}}}(n,{initialState:i,reconnectOnMount:s});n._internal.ssr||l();let c=(0,o.useRef)(!0);return(0,o.useEffect)(()=>{if(c.current&&n._internal.ssr)return l(),()=>{c.current=!1}},[]),t}let s=(0,o.createContext)(void 0);function WagmiProvider(e){let{children:t,config:n}=e;return(0,o.createElement)(Hydrate,e,(0,o.createElement)(s.Provider,{value:n},t))}},92321:function(e,t,n){"use strict";n.d(t,{m:function(){return useAccount}});var o=n(33397),i=n(52425),s=n(37122),l=n(74751),c=n(67294),u=n(52798);let isPlainObject=e=>"object"==typeof e&&!Array.isArray(e);function useAccount(e={}){let t=(0,s.Z)(e);return function(e,t,n=t,o=l.v){let i=(0,c.useRef)([]),s=(0,u.useSyncExternalStoreWithSelector)(e,t,n,e=>e,(e,t)=>{if(isPlainObject(e)&&isPlainObject(t)&&i.current.length){for(let n of i.current){let i=o(e[n],t[n]);if(!i)return!1}return!0}return o(e,t)});if(isPlainObject(s)){let e={...s};return Object.defineProperties(e,Object.entries(e).reduce((e,[t,n])=>({...e,[t]:{configurable:!1,enumerable:!0,get:()=>(i.current.includes(t)||i.current.push(t),n)}}),{})),e}return s}(e=>(0,o.u)(t,{onChange:e}),()=>(0,i.D)(t))}},37122:function(e,t,n){"use strict";n.d(t,{Z:function(){return useConfig}});var o=n(67294),i=n(99931),s=n(7066);let getVersion=()=>"wagmi@2.5.11";let BaseError=class BaseError extends s.G{constructor(){super(...arguments),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"WagmiError"})}get docsBaseUrl(){return"https://wagmi.sh/react"}get version(){return getVersion()}};let WagmiProviderNotFoundError=class WagmiProviderNotFoundError extends BaseError{constructor(){super("`useConfig` must be used within `WagmiProvider`.",{docsPath:"https://wagmi.sh/react/api/WagmiProvider"}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"WagmiProviderNotFoundError"})}};function useConfig(e={}){let t=e.config??(0,o.useContext)(i.V);if(!t)throw new WagmiProviderNotFoundError;return t}},55585:function(e,t,n){"use strict";n.d(t,{Q:function(){return useSignMessage}});var o=n(98029),i=n(14503),s=n(62027);let AccountNotFoundError=class AccountNotFoundError extends s.G{constructor({docsPath:e}={}){super("Could not find an Account to execute with this Action.\nPlease provide an Account with the `account` argument on the Action, or by supplying an `account` to the WalletClient.",{docsPath:e,docsSlug:"account"}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AccountNotFoundError"})}};var l=n(92106);async function signMessage(e,{account:t=e.account,message:n}){if(!t)throw new AccountNotFoundError({docsPath:"/docs/actions/wallet/signMessage"});let o=(0,i.T)(t);if("local"===o.type)return o.signMessage({message:n});let s="string"==typeof n?(0,l.$G)(n):n.raw instanceof Uint8Array?(0,l.NC)(n.raw):n.raw;return e.request({method:"personal_sign",params:[s,o.address]},{retryCount:0})}var c=n(81946),u=n(16189),d=n(91628),p=n(87675);async function getConnectorClient(e,t={}){let n;if(t.connector){let{connector:e}=t,[o,i]=await Promise.all([e.getAccounts(),e.getChainId()]);n={accounts:o,chainId:i,connector:e}}else n=e.state.connections.get(e.state.current);if(!n)throw new p.aH;let o=t.chainId??n.chainId,s=n.connector;if(s.getClient)return s.getClient({chainId:o});let l=(0,i.T)(t.account??n.accounts[0]),c=e.chains.find(e=>e.id===o),f=await n.connector.getProvider({chainId:o});if(t.account&&!n.accounts.includes(l.address))throw new p.JK({address:l.address,connector:s});return(0,u.e)({account:l,chain:c,name:"Connector Client",transport:e=>(function(e,t={}){let{key:n="custom",name:o="Custom Provider",retryDelay:i}=t;return({retryCount:s})=>(0,d.q)({key:n,name:o,request:e.request.bind(e),retryCount:t.retryCount??s,retryDelay:i,type:"custom"})})(f)({...e,retryCount:0})})}async function signMessage_signMessage(e,t){let n;let{account:o,connector:i,...s}=t;n="object"==typeof o&&"local"===o.type?e.getClient():await getConnectorClient(e,{account:o,connector:i});let l=(0,c.s)(n,signMessage,"signMessage");return l({...s,...o?{account:o}:{}})}var f=n(37122);function useSignMessage(e={}){let{mutation:t}=e,n=(0,f.Z)(e),{mutate:i,mutateAsync:s,...l}=(0,o.D)({...t,mutationFn:e=>signMessage_signMessage(n,e),mutationKey:["signMessage"]});return{...l,signMessage:i,signMessageAsync:s}}}},function(e){var __webpack_exec__=function(t){return e(e.s=t)};e.O(0,[9774,179],function(){return __webpack_exec__(6840),__webpack_exec__(59974)}),_N_E=e.O()}]); \ No newline at end of file +`),n.state&&(o+=" state:\n"+prettyStateMapping(n.state)),n.stateDiff&&(o+=" stateDiff:\n"+prettyStateMapping(n.stateDiff)),o}," State Override:\n").slice(0,-1)}},33639:function(e,t,n){"use strict";n.d(t,{Bh:function(){return TransactionNotFoundError},JC:function(){return InvalidStorageKeySizeError},Yb:function(){return TransactionReceiptNotFoundError},j3:function(){return InvalidSerializableTransactionError},mc:function(){return WaitForTransactionReceiptTimeoutError},vl:function(){return InvalidLegacyVError},xY:function(){return FeeConflictError},xr:function(){return prettyPrint}});var o=n(62027);function prettyPrint(e){let t=Object.entries(e).map(([e,t])=>void 0===t||!1===t?null:[e,t]).filter(Boolean),n=t.reduce((e,[t])=>Math.max(e,t.length),0);return t.map(([e,t])=>` ${`${e}:`.padEnd(n+1)} ${t}`).join("\n")}let FeeConflictError=class FeeConflictError extends o.G{constructor(){super("Cannot specify both a `gasPrice` and a `maxFeePerGas`/`maxPriorityFeePerGas`.\nUse `maxFeePerGas`/`maxPriorityFeePerGas` for EIP-1559 compatible networks, and `gasPrice` for others."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"FeeConflictError"})}};let InvalidLegacyVError=class InvalidLegacyVError extends o.G{constructor({v:e}){super(`Invalid \`v\` value "${e}". Expected 27 or 28.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidLegacyVError"})}};let InvalidSerializableTransactionError=class InvalidSerializableTransactionError extends o.G{constructor({transaction:e}){super("Cannot infer a transaction type from provided transaction.",{metaMessages:["Provided Transaction:","{",prettyPrint(e),"}","","To infer the type, either provide:","- a `type` to the Transaction, or","- an EIP-1559 Transaction with `maxFeePerGas`, or","- an EIP-2930 Transaction with `gasPrice` & `accessList`, or","- an EIP-4844 Transaction with `blobs`, `blobVersionedHashes`, `sidecars`, or","- a Legacy Transaction with `gasPrice`"]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidSerializableTransactionError"})}};let InvalidStorageKeySizeError=class InvalidStorageKeySizeError extends o.G{constructor({storageKey:e}){super(`Size for storage key "${e}" is invalid. Expected 32 bytes. Got ${Math.floor((e.length-2)/2)} bytes.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"InvalidStorageKeySizeError"})}};let TransactionNotFoundError=class TransactionNotFoundError extends o.G{constructor({blockHash:e,blockNumber:t,blockTag:n,hash:o,index:i}){let s="Transaction";n&&void 0!==i&&(s=`Transaction at block time "${n}" at index "${i}"`),e&&void 0!==i&&(s=`Transaction at block hash "${e}" at index "${i}"`),t&&void 0!==i&&(s=`Transaction at block number "${t}" at index "${i}"`),o&&(s=`Transaction with hash "${o}"`),super(`${s} could not be found.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"TransactionNotFoundError"})}};let TransactionReceiptNotFoundError=class TransactionReceiptNotFoundError extends o.G{constructor({hash:e}){super(`Transaction receipt with hash "${e}" could not be found. The Transaction may not be processed on a block yet.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"TransactionReceiptNotFoundError"})}};let WaitForTransactionReceiptTimeoutError=class WaitForTransactionReceiptTimeoutError extends o.G{constructor({hash:e}){super(`Timed out while waiting for transaction with hash "${e}" to be confirmed.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"WaitForTransactionReceiptTimeoutError"})}}},35280:function(e,t,n){"use strict";n.d(t,{CR:function(){return getContractAddress},Gr:function(){return getUrl},bo:function(){return getVersion}});let getContractAddress=e=>e,getUrl=e=>e,getVersion=()=>"viem@2.8.14"},78398:function(e,t,n){"use strict";n.d(t,{r:function(){return decodeAbiParameters}});var o=n(57412),i=n(45775),s=n(11221),l=n(39135),c=n(3972),u=n(61836),d=n(87788),p=n(95946),f=n(92106);function bytesToNumber(e,t={}){void 0!==t.size&&(0,p.Yf)(e,{size:t.size});let n=(0,f.ci)(e,t);return(0,p.ly)(n,t)}var m=n(11187),g=n(45444);function decodeAbiParameters(e,t){let n="string"==typeof t?(0,m.nr)(t):t,b=(0,s.q)(n);if(0===(0,l.d)(n)&&e.length>0)throw new o.wb;if((0,l.d)(t)&&32>(0,l.d)(t))throw new o.xB({data:"string"==typeof t?t:(0,f.ci)(t),params:e,size:(0,l.d)(t)});let y=0,v=[];for(let t=0;t!e),i=o?[]:{},s=0;if(hasDynamicChild(t)){let l=bytesToNumber(e.readBytes(32)),c=n+l;for(let n=0;n1||n[0]>1)throw new d.yr(n);return!!n[0]}(e.readBytes(32),{size:32}),32];if(t.type.startsWith("bytes"))return function(e,t,{staticPosition:n}){let[o,i]=t.type.split("bytes");if(!i){let t=bytesToNumber(e.readBytes(32));e.setPosition(n+t);let o=bytesToNumber(e.readBytes(32));if(0===o)return e.setPosition(n+32),["0x",32];let i=e.readBytes(o);return e.setPosition(n+32),[(0,f.ci)(i),32]}let s=(0,f.ci)(e.readBytes(parseInt(i),32));return[s,32]}(e,t,{staticPosition:n});if(t.type.startsWith("uint")||t.type.startsWith("int"))return function(e,t){let n=t.type.startsWith("int"),o=parseInt(t.type.split("int")[1]||"256"),i=e.readBytes(32);return[o>48?function(e,t={}){void 0!==t.size&&(0,p.Yf)(e,{size:t.size});let n=(0,f.ci)(e,t);return(0,p.y_)(n,t)}(i,{signed:n}):bytesToNumber(i,{signed:n}),32]}(e,t);if("string"===t.type)return function(e,{staticPosition:t}){let n=bytesToNumber(e.readBytes(32)),o=t+n;e.setPosition(o);let i=bytesToNumber(e.readBytes(32));if(0===i)return e.setPosition(t+32),["",32];let s=e.readBytes(i,32),l=function(e,t={}){let n=e;return void 0!==t.size&&((0,p.Yf)(n,{size:t.size}),n=(0,u.f)(n,{dir:"right"})),new TextDecoder().decode(n)}((0,u.f)(s));return e.setPosition(t+32),[l,32]}(e,{staticPosition:n});throw new o.CI(t.type,{docsPath:"/docs/contract/decodeAbiParameters"})}(b,n,{staticPosition:0});y+=l,v.push(s)}return v}function hasDynamicChild(e){let{type:t}=e;if("string"===t||"bytes"===t||t.endsWith("[]"))return!0;if("tuple"===t)return e.components?.some(hasDynamicChild);let n=(0,g.S)(e.type);return!!(n&&hasDynamicChild({...e,type:n[1]}))}},86899:function(e,t,n){"use strict";n.d(t,{p:function(){return decodeErrorResult}});var o=n(21746),i=n(57412),s=n(3972),l=n(58034),c=n(78398),u=n(80522);function decodeErrorResult(e){let{abi:t,data:n}=e,d=(0,s.tP)(n,0,4);if("0x"===d)throw new i.wb;let p=[...t||[],o.Up,o.hZ],f=p.find(e=>"error"===e.type&&d===(0,l.C)((0,u.t)(e)));if(!f)throw new i.yP(d,{docsPath:"/docs/contract/decodeErrorResult"});return{abiItem:f,args:"inputs"in f&&f.inputs&&f.inputs.length>0?(0,c.r)(f.inputs,(0,s.tP)(n,4)):void 0,errorName:f.name}}},7210:function(e,t,n){"use strict";n.d(t,{k:function(){return decodeFunctionResult}});var o=n(57412),i=n(78398),s=n(40840);let l="/docs/contract/decodeFunctionResult";function decodeFunctionResult(e){let{abi:t,args:n,functionName:c,data:u}=e,d=t[0];if(c){let e=(0,s.mE)({abi:t,args:n,name:c});if(!e)throw new o.xL(c,{docsPath:l});d=e}if("function"!==d.type)throw new o.xL(void 0,{docsPath:l});if(!d.outputs)throw new o.MX(d.name,{docsPath:l});let p=(0,i.r)(d.outputs,u);return p&&p.length>1?p:p&&1===p.length?p[0]:void 0}},45444:function(e,t,n){"use strict";n.d(t,{E:function(){return encodeAbiParameters},S:function(){return getArrayComponents}});var o=n(57412),i=n(26087),s=n(62027),l=n(60480),c=n(57040),u=n(61769),d=n(39135),p=n(3972),f=n(92106);function encodeAbiParameters(e,t){if(e.length!==t.length)throw new o.fs({expectedLength:e.length,givenLength:t.length});let n=function({params:e,values:t}){let n=[];for(let m=0;m0?(0,c.zo)([t,e]):t}}if(s)return{dynamic:!0,encoded:e}}return{dynamic:!1,encoded:(0,c.zo)(l.map(({encoded:e})=>e))}}(t,{length:i,param:{...e,type:s}})}if("tuple"===e.type)return function(e,{param:t}){let n=!1,o=[];for(let i=0;ie))}}(t,{param:e});if("address"===e.type)return function(e){if(!(0,l.U)(e))throw new i.b({address:e});return{dynamic:!1,encoded:(0,u.gc)(e.toLowerCase())}}(t);if("bool"===e.type)return function(e){if("boolean"!=typeof e)throw new s.G(`Invalid boolean value: "${e}" (type: ${typeof e}). Expected: \`true\` or \`false\`.`);return{dynamic:!1,encoded:(0,u.gc)((0,f.C4)(e))}}(t);if(e.type.startsWith("uint")||e.type.startsWith("int")){let n=e.type.startsWith("int");return function(e,{signed:t}){return{dynamic:!1,encoded:(0,f.eC)(e,{size:32,signed:t})}}(t,{signed:n})}if(e.type.startsWith("bytes"))return function(e,{param:t}){let[,n]=t.type.split("bytes"),i=(0,d.d)(e);if(!n){let t=e;return i%32!=0&&(t=(0,u.gc)(t,{dir:"right",size:32*Math.ceil((e.length-2)/2/32)})),{dynamic:!0,encoded:(0,c.zo)([(0,u.gc)((0,f.eC)(i,{size:32})),t])}}if(i!==parseInt(n))throw new o.M4({expectedSize:parseInt(n),value:e});return{dynamic:!1,encoded:(0,u.gc)(e,{dir:"right"})}}(t,{param:e});if("string"===e.type)return function(e){let t=(0,f.$G)(e),n=Math.ceil((0,d.d)(t)/32),o=[];for(let e=0;e(function(e,{includeName:t}){return e.type.startsWith("tuple")?`(${formatAbiParams(e.components,{includeName:t})})${e.type.slice(5)}`:e.type+(t&&e.name?` ${e.name}`:"")})(e,{includeName:t})).join(t?", ":","):""}},40840:function(e,t,n){"use strict";n.d(t,{mE:function(){return getAbiItem}});var o=n(57412),i=n(15102),s=n(60480),l=n(96005),c=n(58034);function getAbiItem(e){let t;let{abi:n,args:u=[],name:d}=e,p=(0,i.v)(d,{strict:!1}),f=n.filter(e=>p?"function"===e.type?(0,c.C)(e)===d:"event"===e.type&&(0,l.n)(e)===d:"name"in e&&e.name===d);if(0!==f.length){if(1===f.length)return f[0];for(let e of f){if(!("inputs"in e))continue;if(!u||0===u.length){if(!e.inputs||0===e.inputs.length)return e;continue}if(!e.inputs||0===e.inputs.length||e.inputs.length!==u.length)continue;let n=u.every((t,n)=>{let o="inputs"in e&&e.inputs[n];return!!o&&function isArgOfType(e,t){let n=typeof e,o=t.type;switch(o){case"address":return(0,s.U)(e,{strict:!1});case"bool":return"boolean"===n;case"function":case"string":return"string"===n;default:if("tuple"===o&&"components"in t)return Object.values(t.components).every((t,n)=>isArgOfType(Object.values(e)[n],t));if(/^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(o))return"number"===n||"bigint"===n;if(/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(o))return"string"===n||e instanceof Uint8Array;if(/[a-z]+[1-9]{0,3}(\[[0-9]{0,}\])+$/.test(o))return Array.isArray(e)&&e.every(e=>isArgOfType(e,{...t,type:o.replace(/(\[[0-9]{0,}\])$/,"")}));return!1}}(t,o)});if(n){if(t&&"inputs"in t&&t.inputs){let n=function getAmbiguousTypes(e,t,n){for(let o in e){let i=e[o],l=t[o];if("tuple"===i.type&&"tuple"===l.type&&"components"in i&&"components"in l)return getAmbiguousTypes(i.components,l.components,n[o]);let c=[i.type,l.type],u=!!(c.includes("address")&&c.includes("bytes20"))||!!(c.includes("address")&&c.includes("string")||c.includes("address")&&c.includes("bytes"))&&(0,s.U)(n[o],{strict:!1});if(u)return c}}(e.inputs,t.inputs,u);if(n)throw new o.S4({abiItem:e,type:n[0]},{abiItem:t,type:n[1]})}t=e}}return t||f[0]}}},45775:function(e,t,n){"use strict";n.d(t,{K:function(){return getAddress},x:function(){return checksumAddress}});var o=n(26087),i=n(11187),s=n(49550),l=n(60480);function checksumAddress(e,t){let n=t?`${t}${e.toLowerCase()}`:e.substring(2).toLowerCase(),o=(0,s.w)((0,i.qX)(n),"bytes"),l=(t?n.substring(`${t}0x`.length):n).split("");for(let e=0;e<40;e+=2)o[e>>1]>>4>=8&&l[e]&&(l[e]=l[e].toUpperCase()),(15&o[e>>1])>=8&&l[e+1]&&(l[e+1]=l[e+1].toUpperCase());return`0x${l.join("")}`}function getAddress(e,t){if(!(0,l.U)(e))throw new o.b({address:e});return checksumAddress(e,t)}},60480:function(e,t,n){"use strict";n.d(t,{U:function(){return isAddress}});let LruMap=class LruMap extends Map{constructor(e){super(),Object.defineProperty(this,"maxSize",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.maxSize=e}set(e,t){return super.set(e,t),this.maxSize&&this.size>this.maxSize&&this.delete(this.keys().next().value),this}};var o=n(45775);let i=/^0x[a-fA-F0-9]{40}$/,s=new LruMap(8192);function isAddress(e,{strict:t=!0}={}){if(s.has(e))return s.get(e);let n=!!i.test(e)&&(e.toLowerCase()===e||!t||(0,o.x)(e)===e);return s.set(e,n),n}},86164:function(e,t,n){"use strict";function defineChain(e){return{formatters:void 0,fees:void 0,serializers:void 0,...e}}n.d(t,{a:function(){return defineChain}})},47864:function(e,t,n){"use strict";n.d(t,{L:function(){return getChainContractAddress}});var o=n(80377);function getChainContractAddress({blockNumber:e,chain:t,contract:n}){let i=t?.contracts?.[n];if(!i)throw new o.mm({chain:t,contract:{name:n}});if(e&&i.blockCreated&&i.blockCreated>e)throw new o.mm({blockNumber:e,chain:t,contract:{name:n,blockCreated:i.blockCreated}});return i.address}},11221:function(e,t,n){"use strict";n.d(t,{q:function(){return createCursor}});var o=n(66238);let i={bytes:new Uint8Array,dataView:new DataView(new ArrayBuffer(0)),position:0,positionReadCount:new Map,recursiveReadCount:0,recursiveReadLimit:1/0,assertReadLimit(){if(this.recursiveReadCount>=this.recursiveReadLimit)throw new o.KD({count:this.recursiveReadCount+1,limit:this.recursiveReadLimit})},assertPosition(e){if(e<0||e>this.bytes.length-1)throw new o.lQ({length:this.bytes.length,position:e})},decrementPosition(e){if(e<0)throw new o.T_({offset:e});let t=this.position-e;this.assertPosition(t),this.position=t},getReadCount(e){return this.positionReadCount.get(e||this.position)||0},incrementPosition(e){if(e<0)throw new o.T_({offset:e});let t=this.position+e;this.assertPosition(t),this.position=t},inspectByte(e){let t=e??this.position;return this.assertPosition(t),this.bytes[t]},inspectBytes(e,t){let n=t??this.position;return this.assertPosition(n+e-1),this.bytes.subarray(n,n+e)},inspectUint8(e){let t=e??this.position;return this.assertPosition(t),this.bytes[t]},inspectUint16(e){let t=e??this.position;return this.assertPosition(t+1),this.dataView.getUint16(t)},inspectUint24(e){let t=e??this.position;return this.assertPosition(t+2),(this.dataView.getUint16(t)<<8)+this.dataView.getUint8(t+2)},inspectUint32(e){let t=e??this.position;return this.assertPosition(t+3),this.dataView.getUint32(t)},pushByte(e){this.assertPosition(this.position),this.bytes[this.position]=e,this.position++},pushBytes(e){this.assertPosition(this.position+e.length-1),this.bytes.set(e,this.position),this.position+=e.length},pushUint8(e){this.assertPosition(this.position),this.bytes[this.position]=e,this.position++},pushUint16(e){this.assertPosition(this.position+1),this.dataView.setUint16(this.position,e),this.position+=2},pushUint24(e){this.assertPosition(this.position+2),this.dataView.setUint16(this.position,e>>8),this.dataView.setUint8(this.position+2,255&e),this.position+=3},pushUint32(e){this.assertPosition(this.position+3),this.dataView.setUint32(this.position,e),this.position+=4},readByte(){this.assertReadLimit(),this._touch();let e=this.inspectByte();return this.position++,e},readBytes(e,t){this.assertReadLimit(),this._touch();let n=this.inspectBytes(e);return this.position+=t??e,n},readUint8(){this.assertReadLimit(),this._touch();let e=this.inspectUint8();return this.position+=1,e},readUint16(){this.assertReadLimit(),this._touch();let e=this.inspectUint16();return this.position+=2,e},readUint24(){this.assertReadLimit(),this._touch();let e=this.inspectUint24();return this.position+=3,e},readUint32(){this.assertReadLimit(),this._touch();let e=this.inspectUint32();return this.position+=4,e},setPosition(e){let t=this.position;return this.assertPosition(e),this.position=e,()=>this.position=t},_touch(){if(this.recursiveReadLimit===1/0)return;let e=this.getReadCount();this.positionReadCount.set(this.position,e+1),e>0&&this.recursiveReadCount++}};function createCursor(e,{recursiveReadLimit:t=8192}={}){let n=Object.create(i);return n.bytes=e,n.dataView=new DataView(e.buffer,e.byteOffset,e.byteLength),n.positionReadCount=new Map,n.recursiveReadLimit=t,n}},57040:function(e,t,n){"use strict";function concat(e){return"string"==typeof e[0]?concatHex(e):function(e){let t=0;for(let n of e)t+=n.length;let n=new Uint8Array(t),o=0;for(let t of e)n.set(t,o),o+=t.length;return n}(e)}function concatHex(e){return`0x${e.reduce((e,t)=>e+t.replace("0x",""),"")}`}n.d(t,{SM:function(){return concatHex},zo:function(){return concat}})},15102:function(e,t,n){"use strict";function isHex(e,{strict:t=!0}={}){return!!e&&"string"==typeof e&&(t?/^0x[0-9a-fA-F]*$/.test(e):e.startsWith("0x"))}n.d(t,{v:function(){return isHex}})},61769:function(e,t,n){"use strict";n.d(t,{gc:function(){return padHex},vk:function(){return pad}});var o=n(69760);function pad(e,{dir:t,size:n=32}={}){return"string"==typeof e?padHex(e,{dir:t,size:n}):function(e,{dir:t,size:n=32}={}){if(null===n)return e;if(e.length>n)throw new o.$s({size:e.length,targetSize:n,type:"bytes"});let i=new Uint8Array(n);for(let o=0;o2*n)throw new o.$s({size:Math.ceil(i.length/2),targetSize:n,type:"hex"});return`0x${i["right"===t?"padEnd":"padStart"](2*n,"0")}`}},39135:function(e,t,n){"use strict";n.d(t,{d:function(){return size}});var o=n(15102);function size(e){return(0,o.v)(e,{strict:!1})?Math.ceil((e.length-2)/2):e.length}},3972:function(e,t,n){"use strict";n.d(t,{T4:function(){return sliceBytes},tP:function(){return slice}});var o=n(69760),i=n(15102),s=n(39135);function slice(e,t,n,{strict:o}={}){return(0,i.v)(e,{strict:!1})?function(e,t,n,{strict:o}={}){assertStartOffset(e,t);let i=`0x${e.replace("0x","").slice((t??0)*2,(n??e.length)*2)}`;return o&&assertEndOffset(i,t,n),i}(e,t,n,{strict:o}):sliceBytes(e,t,n,{strict:o})}function assertStartOffset(e,t){if("number"==typeof t&&t>0&&t>(0,s.d)(e)-1)throw new o.mV({offset:t,position:"start",size:(0,s.d)(e)})}function assertEndOffset(e,t,n){if("number"==typeof t&&"number"==typeof n&&(0,s.d)(e)!==n-t)throw new o.mV({offset:n,position:"end",size:(0,s.d)(e)})}function sliceBytes(e,t,n,{strict:o}={}){assertStartOffset(e,t);let i=e.slice(t,n);return o&&assertEndOffset(i,t,n),i}},61836:function(e,t,n){"use strict";function trim(e,{dir:t="left"}={}){let n="string"==typeof e?e.replace("0x",""):e,o=0;for(let e=0;et)throw new o.M6({givenSize:(0,i.d)(e),maxSize:t})}function hexToBigInt(e,t={}){let{signed:n}=t;t.size&&assertSize(e,{size:t.size});let o=BigInt(e);if(!n)return o;let i=(e.length-2)/2,s=(1n<<8n*BigInt(i)-1n)-1n;return o<=s?o:o-BigInt(`0x${"f".padStart(2*i,"f")}`)-1n}function hexToNumber(e,t={}){return Number(hexToBigInt(e,t))}function hexToString(e,t={}){let n=(0,l.nr)(e);return t.size&&(assertSize(n,{size:t.size}),n=(0,s.f)(n,{dir:"right"})),new TextDecoder().decode(n)}},11187:function(e,t,n){"use strict";n.d(t,{O0:function(){return toBytes},nr:function(){return hexToBytes},qX:function(){return stringToBytes}});var o=n(62027),i=n(15102),s=n(61769),l=n(95946),c=n(92106);let u=new TextEncoder;function toBytes(e,t={}){return"number"==typeof e||"bigint"==typeof e?function(e,t){let n=(0,c.eC)(e,t);return hexToBytes(n)}(e,t):"boolean"==typeof e?function(e,t={}){let n=new Uint8Array(1);return(n[0]=Number(e),"number"==typeof t.size)?((0,l.Yf)(n,{size:t.size}),(0,s.vk)(n,{size:t.size})):n}(e,t):(0,i.v)(e)?hexToBytes(e,t):stringToBytes(e,t)}let d={zero:48,nine:57,A:65,F:70,a:97,f:102};function charCodeToBase16(e){return e>=d.zero&&e<=d.nine?e-d.zero:e>=d.A&&e<=d.F?e-(d.A-10):e>=d.a&&e<=d.f?e-(d.a-10):void 0}function hexToBytes(e,t={}){let n=e;t.size&&((0,l.Yf)(n,{size:t.size}),n=(0,s.vk)(n,{dir:"right",size:t.size}));let i=n.slice(2);i.length%2&&(i=`0${i}`);let c=i.length/2,u=new Uint8Array(c);for(let e=0,t=0;et.toString(16).padStart(2,"0"));function toHex(e,t={}){return"number"==typeof e||"bigint"==typeof e?numberToHex(e,t):"string"==typeof e?stringToHex(e,t):"boolean"==typeof e?boolToHex(e,t):bytesToHex(e,t)}function boolToHex(e,t={}){let n=`0x${Number(e)}`;return"number"==typeof t.size?((0,s.Yf)(n,{size:t.size}),(0,i.vk)(n,{size:t.size})):n}function bytesToHex(e,t={}){let n="";for(let t=0;tn||ce.code===i.M_.code):e;return s instanceof o.G?new i.M_({cause:e,message:s.details}):i.M_.nodeMessage.test(n)?new i.M_({cause:e,message:e.details}):i.Hh.nodeMessage.test(n)?new i.Hh({cause:e,maxFeePerGas:t?.maxFeePerGas}):i.G$.nodeMessage.test(n)?new i.G$({cause:e,maxFeePerGas:t?.maxFeePerGas}):i.ZI.nodeMessage.test(n)?new i.ZI({cause:e,nonce:t?.nonce}):i.vU.nodeMessage.test(n)?new i.vU({cause:e,nonce:t?.nonce}):i.se.nodeMessage.test(n)?new i.se({cause:e,nonce:t?.nonce}):i.C_.nodeMessage.test(n)?new i.C_({cause:e}):i.WF.nodeMessage.test(n)?new i.WF({cause:e,gas:t?.gas}):i.dR.nodeMessage.test(n)?new i.dR({cause:e,gas:t?.gas}):i.pZ.nodeMessage.test(n)?new i.pZ({cause:e}):i.cs.nodeMessage.test(n)?new i.cs({cause:e,maxFeePerGas:t?.maxFeePerGas,maxPriorityFeePerGas:t?.maxPriorityFeePerGas}):new i.cj({cause:e})}},43310:function(e,t,n){"use strict";n.d(t,{G:function(){return s},Z:function(){return formatBlock}});var o=n(21366),i=n(6073);function formatBlock(e){let t=e.transactions?.map(e=>"string"==typeof e?e:i.Tr(e));return{...e,baseFeePerGas:e.baseFeePerGas?BigInt(e.baseFeePerGas):null,blobGasUsed:e.blobGasUsed?BigInt(e.blobGasUsed):void 0,difficulty:e.difficulty?BigInt(e.difficulty):void 0,excessBlobGas:e.excessBlobGas?BigInt(e.excessBlobGas):void 0,gasLimit:e.gasLimit?BigInt(e.gasLimit):void 0,gasUsed:e.gasUsed?BigInt(e.gasUsed):void 0,hash:e.hash?e.hash:null,logsBloom:e.logsBloom?e.logsBloom:null,nonce:e.nonce?e.nonce:null,number:e.number?BigInt(e.number):null,size:e.size?BigInt(e.size):void 0,timestamp:e.timestamp?BigInt(e.timestamp):void 0,transactions:t,totalDifficulty:e.totalDifficulty?BigInt(e.totalDifficulty):null}}let s=(0,o.$)("block",formatBlock)},61163:function(e,t,n){"use strict";function extract(e,{format:t}){if(!t)return{};let n={},o=t(e||{});return!function extract_(t){let o=Object.keys(t);for(let i of o)i in e&&(n[i]=e[i]),t[i]&&"object"==typeof t[i]&&!Array.isArray(t[i])&&extract_(t[i])}(o),n}n.d(t,{K:function(){return extract}})},21366:function(e,t,n){"use strict";function defineFormatter(e,t){return({exclude:n,format:o})=>({exclude:n,format:e=>{let i=t(e);if(n)for(let e of n)delete i[e];return{...i,...o(e)}},type:e})}n.d(t,{$:function(){return defineFormatter}})},53992:function(e,t,n){"use strict";function formatLog(e,{args:t,eventName:n}={}){return{...e,blockHash:e.blockHash?e.blockHash:null,blockNumber:e.blockNumber?BigInt(e.blockNumber):null,logIndex:e.logIndex?Number(e.logIndex):null,transactionHash:e.transactionHash?e.transactionHash:null,transactionIndex:e.transactionIndex?Number(e.transactionIndex):null,...n?{args:t,eventName:n}:{}}}n.d(t,{U:function(){return formatLog}})},6073:function(e,t,n){"use strict";n.d(t,{Tr:function(){return formatTransaction},c8:function(){return s},y_:function(){return l}});var o=n(95946),i=n(21366);let s={"0x0":"legacy","0x1":"eip2930","0x2":"eip1559","0x3":"eip4844"};function formatTransaction(e){let t={...e,blockHash:e.blockHash?e.blockHash:null,blockNumber:e.blockNumber?BigInt(e.blockNumber):null,chainId:e.chainId?(0,o.ly)(e.chainId):void 0,gas:e.gas?BigInt(e.gas):void 0,gasPrice:e.gasPrice?BigInt(e.gasPrice):void 0,maxFeePerBlobGas:e.maxFeePerBlobGas?BigInt(e.maxFeePerBlobGas):void 0,maxFeePerGas:e.maxFeePerGas?BigInt(e.maxFeePerGas):void 0,maxPriorityFeePerGas:e.maxPriorityFeePerGas?BigInt(e.maxPriorityFeePerGas):void 0,nonce:e.nonce?(0,o.ly)(e.nonce):void 0,to:e.to?e.to:null,transactionIndex:e.transactionIndex?Number(e.transactionIndex):null,type:e.type?s[e.type]:void 0,typeHex:e.type?e.type:void 0,value:e.value?BigInt(e.value):void 0,v:e.v?BigInt(e.v):void 0};return t.yParity=(()=>{if(e.yParity)return Number(e.yParity);if("bigint"==typeof t.v){if(0n===t.v||27n===t.v)return 0;if(1n===t.v||28n===t.v)return 1;if(t.v>=35n)return t.v%2n===0n?1:0}})(),"legacy"===t.type&&(delete t.accessList,delete t.maxFeePerBlobGas,delete t.maxFeePerGas,delete t.maxPriorityFeePerGas,delete t.yParity),"eip2930"===t.type&&(delete t.maxFeePerBlobGas,delete t.maxFeePerGas,delete t.maxPriorityFeePerGas),"eip1559"===t.type&&delete t.maxFeePerBlobGas,t}let l=(0,i.$)("transaction",formatTransaction)},30866:function(e,t,n){"use strict";n.d(t,{d:function(){return u},f:function(){return formatTransactionReceipt}});var o=n(95946),i=n(21366),s=n(53992),l=n(6073);let c={"0x0":"reverted","0x1":"success"};function formatTransactionReceipt(e){let t={...e,blockNumber:e.blockNumber?BigInt(e.blockNumber):null,contractAddress:e.contractAddress?e.contractAddress:null,cumulativeGasUsed:e.cumulativeGasUsed?BigInt(e.cumulativeGasUsed):null,effectiveGasPrice:e.effectiveGasPrice?BigInt(e.effectiveGasPrice):null,gasUsed:e.gasUsed?BigInt(e.gasUsed):null,logs:e.logs?e.logs.map(e=>(0,s.U)(e)):null,to:e.to?e.to:null,transactionIndex:e.transactionIndex?(0,o.ly)(e.transactionIndex):null,status:e.status?c[e.status]:null,type:e.type?l.c8[e.type]||e.type:null};return e.blobGasPrice&&(t.blobGasPrice=BigInt(e.blobGasPrice)),e.blobGasUsed&&(t.blobGasUsed=BigInt(e.blobGasUsed)),t}let u=(0,i.$)("transactionReceipt",formatTransactionReceipt)},74688:function(e,t,n){"use strict";n.d(t,{iy:function(){return l},tG:function(){return formatTransactionRequest}});var o=n(92106),i=n(21366);let s={legacy:"0x0",eip2930:"0x1",eip1559:"0x2",eip4844:"0x3"};function formatTransactionRequest(e){let t={...e};return void 0!==e.blobs&&"string"!=typeof e.blobs[0]&&(t.blobs=e.blobs.map(e=>(0,o.ci)(e))),void 0!==e.gas&&(t.gas=(0,o.eC)(e.gas)),void 0!==e.gasPrice&&(t.gasPrice=(0,o.eC)(e.gasPrice)),void 0!==e.maxFeePerBlobGas&&(t.maxFeePerBlobGas=(0,o.eC)(e.maxFeePerBlobGas)),void 0!==e.maxFeePerGas&&(t.maxFeePerGas=(0,o.eC)(e.maxFeePerGas)),void 0!==e.maxPriorityFeePerGas&&(t.maxPriorityFeePerGas=(0,o.eC)(e.maxPriorityFeePerGas)),void 0!==e.nonce&&(t.nonce=(0,o.eC)(e.nonce)),void 0!==e.type&&(t.type=s[e.type]),void 0!==e.value&&(t.value=(0,o.eC)(e.value)),t}let l=(0,i.$)("transactionRequest",formatTransactionRequest)},49550:function(e,t,n){"use strict";n.d(t,{w:function(){return keccak256}});var o=n(22250),i=n(15102),s=n(11187),l=n(92106);function keccak256(e,t){let n=(0,o.fr)((0,i.v)(e,{strict:!1})?(0,s.O0)(e):e);return"bytes"===(t||"hex")?n:(0,l.NC)(n)}},96005:function(e,t,n){"use strict";n.d(t,{n:function(){return i}});var o=n(67684);let i=o.r},58034:function(e,t,n){"use strict";n.d(t,{C:function(){return toFunctionSelector}});var o=n(3972),i=n(67684);let toFunctionSelector=e=>(0,o.tP)((0,i.r)(e),0,4)},67684:function(e,t,n){"use strict";n.d(t,{r:function(){return toSignatureHash}});var o=n(11187),i=n(49550);let hash=e=>(0,i.w)((0,o.O0)(e)),s=/^tuple(?(\[(\d*)\])*)$/;function formatAbiParameters(e){let t="",n=e.length;for(let o=0;o{var t;let n="string"==typeof e?e:"function"===(t=e).type?`function ${t.name}(${formatAbiParameters(t.inputs)})${t.stateMutability&&"nonpayable"!==t.stateMutability?` ${t.stateMutability}`:""}${t.outputs.length?` returns (${formatAbiParameters(t.outputs)})`:""}`:"event"===t.type?`event ${t.name}(${formatAbiParameters(t.inputs)})`:"error"===t.type?`error ${t.name}(${formatAbiParameters(t.inputs)})`:"constructor"===t.type?`constructor(${formatAbiParameters(t.inputs)})${"payable"===t.stateMutability?" payable":""}`:"fallback"===t.type?"fallback()":"receive() external payable";return function(e){let t=!0,n="",o=0,i="",s=!1;for(let l=0;l{let t=getScheduler();flush();let n=t.map(({args:e})=>e);0!==n.length&&e(n).then(e=>{s&&Array.isArray(e)&&e.sort(s);for(let n=0;n{for(let n=0;no.delete(t),getBatchedArgs=()=>getScheduler().map(({args:e})=>e),getScheduler=()=>o.get(t)||[],setScheduler=e=>o.set(t,[...getScheduler(),e]);return{flush,async schedule(e){let t={},o=new Promise((e,n)=>{t.resolve=e,t.reject=n}),s=n?.([...getBatchedArgs(),e]);s&&exec();let l=getScheduler().length>0;return l?setScheduler({args:e,pendingPromise:t}):(setScheduler({args:e,pendingPromise:t}),setTimeout(exec,i)),o}}}},7760:function(e,t,n){"use strict";n.d(t,{J:function(){return withRetry}});var o=n(62914);function withRetry(e,{delay:t=100,retryCount:n=2,shouldRetry:i=()=>!0}={}){return new Promise((s,l)=>{let attemptRetry=async({count:c=0}={})=>{let retry=async({error:e})=>{let n="function"==typeof t?t({count:c,error:e}):t;n&&await (0,o.D)(n),attemptRetry({count:c+1})};try{let t=await e();s(t)}catch(e){if(cJSON.stringify(e,(e,n)=>{let o="bigint"==typeof n?n.toString():n;return"function"==typeof t?t(e,o):o},n)},47531:function(e,t,n){"use strict";n.d(t,{F:function(){return assertRequest}});var o=n(14503),i=n(26087),s=n(26445),l=n(33639),c=n(60480);function assertRequest(e){let{account:t,gasPrice:n,maxFeePerGas:u,maxPriorityFeePerGas:d,to:p}=e,f=t?(0,o.T)(t):void 0;if(f&&!(0,c.U)(f.address))throw new i.b({address:f.address});if(p&&!(0,c.U)(p))throw new i.b({address:p});if(void 0!==n&&(void 0!==u||void 0!==d))throw new l.xY;if(u&&u>2n**256n-1n)throw new s.Hh({maxFeePerGas:u});if(d&&u&&d>u)throw new s.cs({maxFeePerGas:u,maxPriorityFeePerGas:d})}},82994:function(e,t,n){"use strict";n.d(t,{l:function(){return getTransactionType}});var o=n(33639);function getTransactionType(e){if(e.type)return e.type;if(void 0!==e.blobs||void 0!==e.blobVersionedHashes||void 0!==e.maxFeePerBlobGas||void 0!==e.sidecars)return"eip4844";if(void 0!==e.maxFeePerGas||void 0!==e.maxPriorityFeePerGas)return"eip1559";if(void 0!==e.gasPrice)return void 0!==e.accessList?"eip2930":"legacy";throw new o.j3({transaction:e})}},39625:function(e,t,n){"use strict";n.d(t,{d:function(){return formatEther}});var o=n(84192),i=n(15229);function formatEther(e,t="wei"){return(0,i.b)(e,o.ez[t])}},67795:function(e,t,n){"use strict";n.d(t,{o:function(){return formatGwei}});var o=n(84192),i=n(15229);function formatGwei(e,t="wei"){return(0,i.b)(e,o.Zn[t])}},15229:function(e,t,n){"use strict";function formatUnits(e,t){let n=e.toString(),o=n.startsWith("-");o&&(n=n.slice(1));let[i,s]=[(n=n.padStart(t,"0")).slice(0,n.length-t),n.slice(n.length-t)];return s=s.replace(/(0+)$/,""),`${o?"-":""}${i||"0"}${s?`.${s}`:""}`}n.d(t,{b:function(){return formatUnits}})},62914:function(e,t,n){"use strict";async function wait(e){return new Promise(t=>setTimeout(t,e))}n.d(t,{D:function(){return wait}})},99931:function(e,t,n){"use strict";n.d(t,{V:function(){return s},F:function(){return WagmiProvider}});var o=n(67294);let i=!1;async function reconnect(e,t={}){let n;if(i)return[];i=!0,e.setState(e=>({...e,status:e.current?"reconnecting":"connecting"}));let o=[];if(t.connectors?.length)for(let n of t.connectors){let t;t="function"==typeof n?e._internal.connectors.setup(n):n,o.push(t)}else o.push(...e.connectors);try{n=await e.storage?.getItem("recentConnectorId")}catch{}let s={};for(let[,t]of e.state.connections)s[t.connector.id]=1;n&&(s[n]=0);let l=Object.keys(s).length>0?[...o].sort((e,t)=>(s[e.id]??10)-(s[t.id]??10)):o,c=!1,u=[],d=[];for(let t of l){let n=await t.getProvider();if(!n||d.some(e=>e===n))continue;let o=await t.isAuthorized();if(!o)continue;let i=await t.connect({isReconnecting:!0}).catch(()=>null);i&&(t.emitter.off("connect",e._internal.events.connect),t.emitter.on("change",e._internal.events.change),t.emitter.on("disconnect",e._internal.events.disconnect),e.setState(e=>{let n=new Map(c?e.connections:new Map).set(t.uid,{accounts:i.accounts,chainId:i.chainId,connector:t});return{...e,current:c?e.current:t.uid,connections:n}}),u.push({accounts:i.accounts,chainId:i.chainId,connector:t}),d.push(n),c=!0)}return("reconnecting"===e.state.status||"connecting"===e.state.status)&&(c?e.setState(e=>({...e,status:"connected"})):e.setState(e=>({...e,connections:new Map,current:void 0,status:"disconnected"}))),i=!1,u}function Hydrate(e){let{children:t,config:n,initialState:i,reconnectOnMount:s=!0}=e,{onMount:l}=function(e,t){let{initialState:n,reconnectOnMount:o}=t;return n&&!e._internal.store.persist.hasHydrated()&&e.setState({...n,connections:o?n.connections:new Map,status:o?"reconnecting":"disconnected"}),{async onMount(){if(e._internal.ssr){await e._internal.store.persist.rehydrate();let t=e._internal.mipd?.getProviders().map(e._internal.connectors.providerDetailToConnector).map(e._internal.connectors.setup);e._internal.connectors.setState(e=>[...e,...t??[]])}o?reconnect(e):e.storage&&e.setState(e=>({...e,connections:new Map}))}}}(n,{initialState:i,reconnectOnMount:s});n._internal.ssr||l();let c=(0,o.useRef)(!0);return(0,o.useEffect)(()=>{if(c.current&&n._internal.ssr)return l(),()=>{c.current=!1}},[]),t}let s=(0,o.createContext)(void 0);function WagmiProvider(e){let{children:t,config:n}=e;return(0,o.createElement)(Hydrate,e,(0,o.createElement)(s.Provider,{value:n},t))}},92321:function(e,t,n){"use strict";n.d(t,{m:function(){return useAccount}});var o=n(33397),i=n(52425),s=n(37122),l=n(74751),c=n(67294),u=n(52798);let isPlainObject=e=>"object"==typeof e&&!Array.isArray(e);function useAccount(e={}){let t=(0,s.Z)(e);return function(e,t,n=t,o=l.v){let i=(0,c.useRef)([]),s=(0,u.useSyncExternalStoreWithSelector)(e,t,n,e=>e,(e,t)=>{if(isPlainObject(e)&&isPlainObject(t)&&i.current.length){for(let n of i.current){let i=o(e[n],t[n]);if(!i)return!1}return!0}return o(e,t)});if(isPlainObject(s)){let e={...s};return Object.defineProperties(e,Object.entries(e).reduce((e,[t,n])=>({...e,[t]:{configurable:!1,enumerable:!0,get:()=>(i.current.includes(t)||i.current.push(t),n)}}),{})),e}return s}(e=>(0,o.u)(t,{onChange:e}),()=>(0,i.D)(t))}},37122:function(e,t,n){"use strict";n.d(t,{Z:function(){return useConfig}});var o=n(67294),i=n(99931),s=n(7066);let getVersion=()=>"wagmi@2.5.11";let BaseError=class BaseError extends s.G{constructor(){super(...arguments),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"WagmiError"})}get docsBaseUrl(){return"https://wagmi.sh/react"}get version(){return getVersion()}};let WagmiProviderNotFoundError=class WagmiProviderNotFoundError extends BaseError{constructor(){super("`useConfig` must be used within `WagmiProvider`.",{docsPath:"https://wagmi.sh/react/api/WagmiProvider"}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"WagmiProviderNotFoundError"})}};function useConfig(e={}){let t=e.config??(0,o.useContext)(i.V);if(!t)throw new WagmiProviderNotFoundError;return t}},55585:function(e,t,n){"use strict";n.d(t,{Q:function(){return useSignMessage}});var o=n(98029),i=n(14503),s=n(62027);let AccountNotFoundError=class AccountNotFoundError extends s.G{constructor({docsPath:e}={}){super("Could not find an Account to execute with this Action.\nPlease provide an Account with the `account` argument on the Action, or by supplying an `account` to the WalletClient.",{docsPath:e,docsSlug:"account"}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AccountNotFoundError"})}};var l=n(92106);async function signMessage(e,{account:t=e.account,message:n}){if(!t)throw new AccountNotFoundError({docsPath:"/docs/actions/wallet/signMessage"});let o=(0,i.T)(t);if("local"===o.type)return o.signMessage({message:n});let s="string"==typeof n?(0,l.$G)(n):n.raw instanceof Uint8Array?(0,l.NC)(n.raw):n.raw;return e.request({method:"personal_sign",params:[s,o.address]},{retryCount:0})}var c=n(81946),u=n(16189),d=n(91628),p=n(87675);async function getConnectorClient(e,t={}){let n;if(t.connector){let{connector:e}=t,[o,i]=await Promise.all([e.getAccounts(),e.getChainId()]);n={accounts:o,chainId:i,connector:e}}else n=e.state.connections.get(e.state.current);if(!n)throw new p.aH;let o=t.chainId??n.chainId,s=n.connector;if(s.getClient)return s.getClient({chainId:o});let l=(0,i.T)(t.account??n.accounts[0]),c=e.chains.find(e=>e.id===o),f=await n.connector.getProvider({chainId:o});if(t.account&&!n.accounts.includes(l.address))throw new p.JK({address:l.address,connector:s});return(0,u.e)({account:l,chain:c,name:"Connector Client",transport:e=>(function(e,t={}){let{key:n="custom",name:o="Custom Provider",retryDelay:i}=t;return({retryCount:s})=>(0,d.q)({key:n,name:o,request:e.request.bind(e),retryCount:t.retryCount??s,retryDelay:i,type:"custom"})})(f)({...e,retryCount:0})})}async function signMessage_signMessage(e,t){let n;let{account:o,connector:i,...s}=t;n="object"==typeof o&&"local"===o.type?e.getClient():await getConnectorClient(e,{account:o,connector:i});let l=(0,c.s)(n,signMessage,"signMessage");return l({...s,...o?{account:o}:{}})}var f=n(37122);function useSignMessage(e={}){let{mutation:t}=e,n=(0,f.Z)(e),{mutate:i,mutateAsync:s,...l}=(0,o.D)({...t,mutationFn:e=>signMessage_signMessage(n,e),mutationKey:["signMessage"]});return{...l,signMessage:i,signMessageAsync:s}}}},function(e){var __webpack_exec__=function(t){return e(e.s=t)};e.O(0,[9774,179],function(){return __webpack_exec__(6840),__webpack_exec__(59974)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/dist/dashboard/_next/static/chunks/pages/_error-e4216aab802f5810.js b/dist/controlpanel/_next/static/chunks/pages/_error-e4216aab802f5810.js similarity index 100% rename from dist/dashboard/_next/static/chunks/pages/_error-e4216aab802f5810.js rename to dist/controlpanel/_next/static/chunks/pages/_error-e4216aab802f5810.js diff --git a/dist/controlpanel/_next/static/chunks/pages/index-68352c78cef0caeb.js b/dist/controlpanel/_next/static/chunks/pages/index-68352c78cef0caeb.js new file mode 100644 index 000000000..fef030a2a --- /dev/null +++ b/dist/controlpanel/_next/static/chunks/pages/index-68352c78cef0caeb.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5405],{48312:function(e,n,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/",function(){return t(87540)}])},87540:function(e,n,t){"use strict";t.r(n),t.d(n,{default:function(){return Home}});var a,r,l=t(85893),s=t(9008),o=t.n(s),i=t(25675),d=t.n(i),c={src:"/_next/static/media/logo-nodes.249ea9ed.svg",height:283,width:425,blurWidth:0,blurHeight:0},u=t(30378),h=t.n(u),x=t(89192),Navigation=()=>(0,l.jsxs)("div",{className:h().navbarParent,children:[(0,l.jsx)("div",{className:h().logoWrapper,children:(0,l.jsx)(d(),{src:c,alt:"Ocean Node Logo",height:70})}),(0,l.jsx)("div",{className:h().connectButtonWrapper,children:(0,l.jsx)(x.NL,{})})]}),j=t(94428),m=t.n(j),components_Footer=()=>{let e=new Date().getFullYear();return(0,l.jsxs)("div",{className:m().footerContainer,children:[(0,l.jsxs)("p",{children:["@ ",e,", Ocean Nodes"]}),(0,l.jsxs)("div",{className:m().footerLinks,children:[(0,l.jsx)("a",{href:"https://oceanprotocol.com/",target:"_blank",children:"Website"}),(0,l.jsx)("a",{href:"https://github.com/oceanprotocol/ocean-node",target:"_blank",children:"GitHub"}),(0,l.jsx)("a",{href:"https://discord.com/invite/TnXjkR5",target:"_blank",children:"Discord"})]})]})},p=t(67294),v=t(73301),f=t.n(v),_=t(59581),b=t(46085),g=t.n(b),N=t(69417),y=t(94054),C=t(50135),S=t(33841),Z=t(30638),I=t(23599),w=t(10586),P=t(50720),T=t(67971),k=t(27484),E=t.n(k),A={src:"/_next/static/media/download.0a4876ec.svg",height:30,width:30,blurWidth:0,blurHeight:0};function DownloadButton(){let[e,n]=(0,p.useState)(!1),[t,a]=(0,p.useState)(!1),[r,s]=(0,p.useState)(E()()),[o,i]=(0,p.useState)(E()()),[c,u]=(0,p.useState)(""),[h,x]=(0,p.useState)(""),[j,m]=(0,p.useState)(""),{signature:v,expiryTimestamp:f}=(0,_.O)(),b=(0,p.useCallback)(async()=>{let e=r?"&startTime=".concat(r.toISOString()):"",n=o?"&endTime=".concat(o.toISOString()):"",t=c?"&maxLogs=".concat(c):"",l=h&&"all"!==h?"&moduleName=".concat(h):"",s=j&&"all"!==j?'&level="'.concat(j,'"'):"";a(!0);try{if(!f||!v){console.error("Missing expiryTimestamp or signature");return}let r=await fetch("/logs?".concat(e).concat(n).concat(t).concat(l).concat(s),{headers:{"Content-Type":"application/json"},method:"POST",body:JSON.stringify({expiryTimestamp:f,signature:v})}),o=await r.json();if(o){let e="data:application/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(o)),n=document.createElement("a");n.setAttribute("href",e),n.setAttribute("download","LogsData.json"),document.body.appendChild(n),n.click(),n.remove()}a(!1)}catch(e){console.error(e),a(!1)}},[r,o,c,h,j]);return(0,l.jsxs)("div",{className:g().column,children:[(0,l.jsx)(N.Z,{type:"button",onClick:()=>n(!e),children:"Download Logs"}),e&&(0,l.jsxs)("div",{className:g().filters,children:[(0,l.jsxs)(P._,{dateAdapter:w.y,children:[(0,l.jsx)(y.Z,{fullWidth:!0,margin:"normal",children:(0,l.jsx)(T.x,{label:"Start Date",value:r,onChange:e=>s(e)})}),(0,l.jsx)(y.Z,{fullWidth:!0,margin:"normal",children:(0,l.jsx)(T.x,{label:"End Date",value:o,onChange:e=>i(e)})})]}),(0,l.jsx)(C.Z,{label:"Max Logs",type:"number",value:c,onChange:e=>u(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined"}),(0,l.jsxs)(y.Z,{fullWidth:!0,margin:"normal",children:[(0,l.jsx)(S.Z,{id:"select-module-name-label",children:"Module Name"}),(0,l.jsxs)(Z.Z,{labelId:"select-module-name-label",label:"Module Name",id:"module-name",value:h,onChange:e=>x(e.target.value),children:[(0,l.jsx)(I.Z,{value:"all",children:"all"}),(0,l.jsx)(I.Z,{value:"http",children:"http"}),(0,l.jsx)(I.Z,{value:"p2p",children:"p2p"}),(0,l.jsx)(I.Z,{value:"indexer",children:"indexer"}),(0,l.jsx)(I.Z,{value:"reindexer",children:"reindexer"}),(0,l.jsx)(I.Z,{value:"provider",children:"provider"}),(0,l.jsx)(I.Z,{value:"database",children:"database"}),(0,l.jsx)(I.Z,{value:"config",children:"config"}),(0,l.jsx)(I.Z,{value:"core",children:"core"}),(0,l.jsx)(I.Z,{value:"OceanNode",children:"OceanNode"})]})]}),(0,l.jsxs)(y.Z,{fullWidth:!0,margin:"normal",children:[(0,l.jsx)(S.Z,{id:"select-level-label",children:"Level"}),(0,l.jsxs)(Z.Z,{labelId:"select-level-label",label:"Level",id:"level",value:j,onChange:e=>m(e.target.value),children:[(0,l.jsx)(I.Z,{value:"all",children:"all"}),(0,l.jsx)(I.Z,{value:"error",children:"error"}),(0,l.jsx)(I.Z,{value:"warn",children:"warn"}),(0,l.jsx)(I.Z,{value:"info",children:"info"}),(0,l.jsx)(I.Z,{value:"http",children:"http"}),(0,l.jsx)(I.Z,{value:"verbose",children:"verbose"}),(0,l.jsx)(I.Z,{value:"debug",children:"debug"}),(0,l.jsx)(I.Z,{value:"silly",children:"silly"})]})]}),(0,l.jsx)(N.Z,{type:"button",onClick:b,variant:"outlined",startIcon:(0,l.jsx)(d(),{src:A,alt:"download button",width:24,height:24}),disabled:t,children:"Download"})]})]})}function StopNode(){let[e,n]=(0,p.useState)(!1),{signature:t,expiryTimestamp:a}=(0,_.O)();async function stopNode(){n(!0);try{a&&t&&await fetch("/directCommand",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"POST",body:JSON.stringify({command:"stopNode",expiryTimestamp:a,signature:t})}),alert("The node has been stopped. The control panel will no longer be displayed."),window.location.reload()}catch(e){console.error("error",e)}finally{n(!1)}}return(0,l.jsx)(N.Z,{onClick:stopNode,variant:"outlined",color:"error",children:e?(0,l.jsx)(()=>(0,l.jsx)("span",{className:g().loader}),{}):(0,l.jsx)("div",{children:"Stop Node"})})}var O=t(92321),D=t(31536);function NetworkSelector(e){let{chainId:n,setChainId:t}=e,{networks:a}=(0,_.O)();return(0,l.jsxs)(y.Z,{fullWidth:!0,margin:"normal",variant:"outlined",children:[(0,l.jsx)(S.Z,{id:"network-select-label",children:"Network"}),(0,l.jsx)(Z.Z,{labelId:"network-select-label",id:"network-select",value:n||"",onChange:e=>t(e.target.value),label:"Network",children:Object.values(a).map(e=>(0,l.jsx)(I.Z,{value:e.chainId.toString(),children:e.network},e.chainId))})]})}(a=r||(r={})).DELIVERED="DELIVERED",a.PENDING="PENDING",a.FAILURE="FAILURE",a.SUCCESS="SUCCESS";let checkJobPool=async function(e){try{let n=await fetch("/api/services/jobs/"+(e||""),{headers:{Accept:"application/json","Content-Type":"application/json"},method:"GET"}),t=await n.json();return t.jobs}catch(e){console.error(e)}return[]};function getSeverityFromStatus(e){switch(e){case r.DELIVERED:return"info";case r.SUCCESS:return"success";case r.PENDING:return"warning";default:return"error"}}function isJobDone(e){return[r.SUCCESS,r.FAILURE].includes(e)}var R=t(8434);function JobStatusPanel(e){let n=e.job?function(e){switch(e){case r.DELIVERED:return"DodgerBlue";case r.PENDING:return"LightSlateGrey";case r.SUCCESS:return"ForestGreen";case r.FAILURE:return"OrangeRed";default:return"black"}}(e.job.status):"black";return(0,l.jsx)("div",{children:null!==e.job&&(0,l.jsxs)(R.Z,{sx:{bgcolor:n},variant:"filled",severity:e.severity,onClose:()=>{},children:["Job with id ",(0,l.jsx)("strong",{children:e.job.jobId})," has status"," ",(0,l.jsx)("strong",{children:e.job.status})]})})}var W=t(602);function ReIndexChain(){let[e,n]=(0,p.useState)(!1),[t,a]=(0,p.useState)(!1),[s,o]=(0,p.useState)(),{signature:i,expiryTimestamp:d}=(0,_.O)(),[c,u]=(0,p.useState)("info"),[h,x]=(0,p.useState)(null),j=null;async function reIndex(){a(!0);try{if(d&&i&&s){let e=await fetch("/directCommand",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"POST",body:JSON.stringify({command:"reindexChain",chainId:s,expiryTimestamp:d,signature:i})});if(200===e.status){let t=await e.json();u(t.status===r.DELIVERED?"info":"error"),x(t),alert("Chain with ID ".concat(s," is now being reindexed."));let a=!1;j=setInterval(async()=>{let e=await checkJobPool(t.jobId);if(1===e.length){let n=e[0];u(getSeverityFromStatus(n.status)),a=isJobDone(n.status),x(n)}else x(null)},3e3),a&&j&&(0,W.clearInterval)(j),n(!1)}else alert("Error reindexing chain. Please try again.")}}catch(e){console.error("error",e)}finally{a(!1)}}return(0,l.jsxs)("div",{className:g().column,children:[(0,l.jsx)(N.Z,{type:"button",onClick:()=>n(!e),children:"ReIndex Chain"}),e&&(0,l.jsxs)("div",{className:g().filters,children:[(0,l.jsx)(NetworkSelector,{chainId:s,setChainId:o}),(0,l.jsx)(N.Z,{type:"button",onClick:reIndex,variant:"outlined",disabled:t,children:"ReIndex Chain"})]}),(0,l.jsx)(JobStatusPanel,{job:h,severity:c})]})}function ReIndexTransaction(){let[e,n]=(0,p.useState)(!1),[t,a]=(0,p.useState)(!1),[s,o]=(0,p.useState)(),[i,d]=(0,p.useState)(),{signature:c,expiryTimestamp:u}=(0,_.O)(),[h,x]=(0,p.useState)("info"),[j,m]=(0,p.useState)(null),v=null;async function reIndexTx(){a(!0);try{if(u&&c&&s&&i){let e=await fetch("/directCommand",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"POST",body:JSON.stringify({command:"reindexTx",chainId:s,txId:i,expiryTimestamp:u,signature:c})});if(200===e.status){let t=await e.json();x(t.status===r.DELIVERED?"info":"error"),m(t),alert("Transaction with TX ID ".concat(i," on chain ").concat(s," is now being reindexed."));let a=!1;v=setInterval(async()=>{let e=await checkJobPool(t.jobId);if(1===e.length){let n=e[0];x(getSeverityFromStatus(n.status)),a=isJobDone(n.status),m(n)}else m(null)},3e3),a&&v&&clearInterval(v),n(!1)}else alert("Error reindexing transaction. Please try again.")}}catch(e){console.error("error",e)}finally{a(!1)}}return(0,l.jsxs)("div",{className:g().column,children:[(0,l.jsx)(N.Z,{type:"button",onClick:()=>n(!e),children:"ReIndex Transaction"}),e&&(0,l.jsxs)("div",{className:g().filters,children:[(0,l.jsx)(NetworkSelector,{chainId:s,setChainId:o}),(0,l.jsx)(C.Z,{label:"Transaction ID",value:i,onChange:e=>d(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined"}),(0,l.jsx)(N.Z,{type:"button",onClick:reIndexTx,variant:"outlined",disabled:t,children:"ReIndex Transaction"})]}),(0,l.jsx)(JobStatusPanel,{job:j,severity:h})]})}var L=t(58703),F=t(64666),B=t(37645),J=t(6514),H=t(58951),U=t(31425);function TransferFees(){let[e,n]=(0,p.useState)(!1),[t,a]=(0,p.useState)(!1),[r,s]=(0,p.useState)(""),[o,i]=(0,p.useState)(""),[d,c]=(0,p.useState)(""),[u,h]=(0,p.useState)(""),{signature:x,expiryTimestamp:j}=(0,_.O)(),[m,v]=(0,p.useState)(null),[f,b]=(0,p.useState)(!1),[y,S]=(0,p.useState)(!1),[Z,I]=(0,p.useState)(null),[w,P]=(0,p.useState)(null),validateInputs=()=>r&&o&&d&&u?isNaN(Number(d))?(v("Token amount must be a number."),!1):(v(null),!0):(v("All fields are required."),!1);async function transferFees(){if(validateInputs()){a(!0);try{let e=await fetch("/directCommand",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"POST",body:JSON.stringify({command:"collectFees",chainId:r,tokenAddress:o,tokenAmount:d,destinationAddress:u,expiryTimestamp:j,signature:x})});if(200===e.status){let t=await e.json();(null==t?void 0:t.tx)&&(null==t?void 0:t.message)&&(P(t.tx),I(t.message),S(!0),b(!0),n(!1))}else v(e.statusText?e.statusText:"Error transferring fees. Please try again.")}catch(e){console.error("error",e),v("Error transferring fees. Please try again.")}finally{a(!1)}}}let handleDialogClose=()=>{S(!1)};return(0,l.jsxs)("div",{className:g().column,children:[(0,l.jsx)(N.Z,{variant:"text",onClick:()=>n(!e),children:"Transfer Fees"}),e&&(0,l.jsxs)("div",{className:g().filters,children:[(0,l.jsx)(C.Z,{label:"Chain ID",value:r,onChange:e=>s(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined",type:"number"}),(0,l.jsx)(C.Z,{label:"Token Address",value:o,onChange:e=>i(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined"}),(0,l.jsx)(C.Z,{label:"Token Amount",value:d,onChange:e=>c(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined",type:"number"}),(0,l.jsx)(C.Z,{label:"Destination Address",value:u,onChange:e=>h(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined"}),m&&(0,l.jsx)(R.Z,{severity:"error",children:m}),(0,l.jsx)(N.Z,{type:"button",onClick:transferFees,variant:"outlined",disabled:t,fullWidth:!0,children:"Transfer Fees"})]}),(0,l.jsx)(L.Z,{open:f,autoHideDuration:6e3,onClose:()=>b(!1),message:"Fees successfully transferred!"}),(0,l.jsxs)(F.Z,{open:y,onClose:handleDialogClose,"aria-labelledby":"alert-dialog-title","aria-describedby":"alert-dialog-description",children:[(0,l.jsx)(B.Z,{id:"alert-dialog-title",children:"Transfer Successful"}),(0,l.jsx)(J.Z,{children:(0,l.jsx)(H.Z,{id:"alert-dialog-description",children:Z&&(0,l.jsxs)("span",{children:[Z," ",(0,l.jsx)("br",{}),(0,l.jsx)("strong",{style:{marginTop:"10px",display:"block"},children:"Transaction Hash:"})," ",w]})})}),(0,l.jsx)(U.Z,{children:(0,l.jsx)(N.Z,{onClick:handleDialogClose,autoFocus:!0,children:"Close"})})]})]})}function AdminActions(){let{generateSignature:e,signature:n,validTimestamp:t,admin:a}=(0,_.O)(),{isConnected:r}=(0,O.m)();return(0,l.jsxs)("div",{className:g().root,children:[(0,l.jsx)("div",{className:g().title,children:"ADMIN ACTIONS"}),!r&&(0,l.jsx)(x.NL,{}),r&&!a&&(0,l.jsx)("div",{className:g().unauthorised,children:"Your account does not have admin access"}),(!n||!t)&&r&&a&&(0,l.jsx)("button",{type:"button",className:g().unlockButton,onClick:e,children:"Unlock"}),r&&n&&t&&r&&a&&(0,l.jsxs)(D.Z,{spacing:2,direction:"column",children:[(0,l.jsx)(DownloadButton,{}),(0,l.jsx)(ReIndexChain,{}),(0,l.jsx)(ReIndexTransaction,{}),(0,l.jsx)(TransferFees,{}),(0,l.jsx)(StopNode,{})]})]})}var Q=t(17044),G=t.n(Q);function Spinner(){return(0,l.jsx)("span",{className:G().loader})}var M=t(85108),q=t.n(M),V=t(75368),X=t.n(V),K={src:"/_next/static/media/copy.63713a04.svg",height:16,width:15,blurWidth:0,blurHeight:0};function Copy(e){let{text:n}=e,[t,a]=(0,p.useState)(!1),copyToClipboard=e=>{let n=document.createElement("textarea");n.value=e,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)};return(0,p.useEffect)(()=>{if(!t)return;let e=setTimeout(()=>{a(!1)},1e3);return()=>clearTimeout(e)},[t]),(0,l.jsxs)("div",{className:X().action,onClick:()=>{copyToClipboard(n),a(!0)},children:[(0,l.jsx)(d(),{src:K,alt:"icont-copy",className:X().icon}),t&&(0,l.jsx)("div",{className:X().feedback,children:"Copied!"})]})}var z=t(15861);function NodePeers(){let[e,n]=(0,p.useState)([]),[t,a]=(0,p.useState)(!0),[r,s]=(0,p.useState)(!1),fetchNodePeers=async()=>{a(!0);try{let e=await fetch("/getOceanPeers",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"GET"}),t=await e.json();n(t)}catch(e){console.error("error",e)}finally{a(!1)}};(0,p.useEffect)(()=>{fetchNodePeers();let e=setInterval(()=>{fetchNodePeers()},12e4);return()=>clearInterval(e)},[]);let o=r?e:e.slice(0,10);return(0,l.jsxs)("div",{className:q().nodes,children:[(0,l.jsxs)("div",{className:q().title24,children:["Connected Nodes (Total ",e.length,")"]}),t?(0,l.jsx)("div",{className:q().loaderContainer,children:(0,l.jsx)(Spinner,{})}):(0,l.jsxs)(l.Fragment,{children:[e.length>0?o.map(e=>(0,l.jsxs)("div",{className:q().nodeAddress,children:[e," ",(0,l.jsx)(Copy,{text:e})]},e)):(0,l.jsx)(z.Z,{variant:"body1",children:"There are no nodes connected"}),!r&&e.length>10&&(0,l.jsx)(N.Z,{onClick:()=>s(!0),variant:"text",color:"primary",children:"Show All"}),r&&e.length>10&&(0,l.jsx)(N.Z,{onClick:()=>s(!1),variant:"text",color:"primary",children:"Show Less"})]})]})}function SupportedStorage(e){let{data:n}=e;return(0,l.jsxs)("div",{className:f().indexer,children:[(0,l.jsx)("div",{className:f().title29,children:"SUPPORTED STORAGE"}),(0,l.jsxs)("div",{className:f().provider,children:[(0,l.jsxs)("div",{className:f().providerRow,children:[(0,l.jsx)("div",{className:f().providerTitle,children:(0,l.jsx)("b",{children:"arwave:"})}),(0,l.jsxs)("div",{children:[null==n?void 0:n.supportedStorage.arwave.toString()," "]})]}),(0,l.jsxs)("div",{className:f().providerRow,children:[(0,l.jsx)("div",{className:f().providerTitle,children:(0,l.jsx)("b",{children:"ipfs:"})}),(0,l.jsxs)("div",{children:[null==n?void 0:n.supportedStorage.ipfs.toString()," "]})]}),(0,l.jsxs)("div",{className:f().providerRow,children:[(0,l.jsx)("div",{className:f().providerTitle,children:(0,l.jsx)("b",{children:"url:"})}),(0,l.jsxs)("div",{children:[null==n?void 0:n.supportedStorage.url.toString()," "]})]})]})]})}function SupportedNetworks_SupportedStorage(e){let{data:n}=e;return(0,l.jsxs)("div",{className:f().indexer,children:[(0,l.jsx)("div",{className:f().title29,children:"SUPPORTED Networks"}),(0,l.jsx)("div",{className:f().provider,children:null==n?void 0:n.provider.map(e=>(0,l.jsxs)("div",{className:f().providerRow,children:[(0,l.jsx)("div",{className:f().providerTitle,children:(0,l.jsx)("b",{children:e.chainId})}),(0,l.jsxs)("div",{children:[e.network," "]})]}))})]})}var Y=t(93967),$=t.n(Y),ee=t(72882),en=t(7906),et=t(53184),ea=t(53816),er=t(53252),el=t(295),es=t(27061);function IndexQueue(){let[e,n]=(0,p.useState)([]),{networks:t}=(0,_.O)(),[a,r]=(0,p.useState)(!1),s=null;return(0,p.useEffect)(()=>{let fetchQueue=()=>{fetch("/api/services/indexQueue").then(e=>{400===e.status?(console.warn("Cannot fetch queue: Node is not running Indexer"),r(!0),s&&clearInterval(s)):e.json().then(e=>{let a=e.queue.map(e=>{let n=t.find(n=>n.chainId===e.chainId);return{txId:e.txId,chainId:e.chainId,chain:n?n.network:"Unknown Network"}});n(a)})}).catch(e=>{console.error("Error fetching queue:",e)})};fetchQueue();let e=1e4;return es.env.INDEXER_INTERVAL&&(e=Number(es.env.INDEXER_INTERVAL)),s=setInterval(fetchQueue,e),()=>{s&&clearInterval(s)}},[]),(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{className:f().title24,style:{paddingTop:"55px",paddingBottom:"55px"},children:"Indexing Queue"}),e.length>0?(0,l.jsx)(ee.Z,{children:(0,l.jsxs)(en.Z,{"aria-label":"simple table",children:[(0,l.jsx)(et.Z,{children:(0,l.jsxs)(ea.Z,{children:[(0,l.jsx)(er.Z,{children:(0,l.jsx)("b",{children:"Transaction ID"})}),(0,l.jsx)(er.Z,{align:"right",children:(0,l.jsx)("b",{children:"Network"})})]})}),(0,l.jsx)(el.Z,{children:e.map((e,n)=>(0,l.jsxs)(ea.Z,{children:[(0,l.jsx)(er.Z,{component:"th",scope:"row",children:e.txId}),(0,l.jsx)(er.Z,{align:"right",children:e.chain})]},n))})]})}):(0,l.jsx)("p",{children:"Indexing queue is empty."}),a&&(0,l.jsx)(R.Z,{className:f().indexerQueueAlert,severity:"warning",onClose:()=>{r(!1)},children:"Node is not running Indexer. No need to get queue at this point!"})]})}var eo=t(86886),ei=t(66242);function Indexer(e){let{data:n}=e;return(0,l.jsxs)("div",{className:$()([f().indexer,f().borderBottom]),children:[(0,l.jsx)("div",{className:f().title29,children:"INDEXER"}),(0,l.jsx)(eo.ZP,{container:!0,spacing:2,children:null==n?void 0:n.indexer.map(e=>(0,l.jsx)(eo.ZP,{item:!0,xs:12,sm:6,md:4,children:(0,l.jsxs)(ei.Z,{className:$()([f().indexBlock,e.delayed&&f().delayed]),sx:{marginBottom:4,borderRadius:"8px",position:"relative"},children:[(0,l.jsx)("h5",{children:e.network}),(0,l.jsxs)("div",{children:["ChainID: ",e.chainId]}),(0,l.jsxs)("div",{children:["BLOCK: ",e.block]})]},e.block)},e.block))}),(0,l.jsx)(IndexQueue,{})]})}function AdminAccounts(){let{allAdmins:e}=(0,_.O)();return(0,l.jsxs)("div",{className:f().indexer,children:[(0,l.jsx)("div",{className:f().title29,children:"Admin Accounts"}),(0,l.jsx)("div",{className:f().provider,children:e.map((e,n)=>(0,l.jsx)("div",{className:f().providerRow,children:e},n))})]})}function NodePlatform(e){let{platformData:n}=e;return(0,l.jsxs)("div",{className:f().indexer,children:[(0,l.jsx)("div",{className:f().title29,children:"PLATFORM"}),(0,l.jsx)("div",{className:f().provider,children:n.map(e=>(0,l.jsxs)("div",{className:f().providerRow,children:[(0,l.jsx)("div",{className:f().providerTitle,children:(0,l.jsxs)("b",{children:[e.key,":"]})}),(0,l.jsxs)("div",{children:[e.value," "]})]},e.value))})]})}var ed=t(5616),ec=t(67720);function ControlPanel(){let[e,n]=(0,p.useState)(),[t,a]=(0,p.useState)(!0),[r,s]=(0,p.useState)(""),{setAllAdmins:o,setNetworks:i}=(0,_.O)();(0,p.useEffect)(()=>{a(!0);try{fetch("/directCommand",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"POST",body:JSON.stringify({command:"status"})}).then(e=>e.json()).then(e=>{n(e),o(e.allowedAdmins),i(e.indexer),a(!1)})}catch(e){a(!1),console.error("error",e)}},[]),(0,p.useEffect)(()=>{fetch("https://api.ipify.org?format=json").then(e=>e.json()).then(e=>{s(e.ip)}).catch(e=>{console.error("Failed to fetch IP address:",e)})},[]);let d=[{id:null==e?void 0:e.id,ip:r,indexerData:null==e?void 0:e.indexer}],c=[];return e&&Object.keys(null==e?void 0:e.platform).forEach(n=>{let t={key:n,value:JSON.stringify(null==e?void 0:e.platform[n])};c.push(t)}),(0,l.jsxs)("div",{className:f().root,children:[(0,l.jsx)(AdminActions,{}),(0,l.jsx)("div",{className:f().bodyContainer,children:t?(0,l.jsx)("div",{className:f().loaderContainer,children:(0,l.jsx)(Spinner,{})}):(0,l.jsxs)("div",{className:f().body,children:[(0,l.jsx)(()=>(0,l.jsxs)(ed.Z,{p:2,children:[(0,l.jsx)(z.Z,{variant:"h5",gutterBottom:!0,children:"NETWORK"}),(0,l.jsx)(ec.Z,{}),(0,l.jsxs)(ed.Z,{mt:2,mb:2,children:[(0,l.jsx)(z.Z,{variant:"h6",children:"HTTP Status"}),(0,l.jsxs)(z.Z,{variant:"body1",children:["HTTP - ",(null==e?void 0:e.http)?"UP":"DOWN"]})]}),(0,l.jsx)(ec.Z,{}),(0,l.jsxs)(ed.Z,{mt:2,mb:2,children:[(0,l.jsx)(z.Z,{variant:"h6",children:"P2P Status"}),(0,l.jsxs)(z.Z,{variant:"body1",children:["P2P - ",(null==e?void 0:e.p2p)?"UP":"DOWN"]})]}),(0,l.jsx)(ec.Z,{}),(0,l.jsxs)(ed.Z,{mt:2,mb:2,children:[(0,l.jsx)(z.Z,{variant:"h6",children:"NODE ID"}),d.map(e=>(0,l.jsxs)(ed.Z,{display:"flex",alignItems:"center",mb:1,children:[(0,l.jsx)(z.Z,{variant:"body1",className:f().node,children:e.id}),(0,l.jsx)(Copy,{text:null==e?void 0:e.id})]},e.id))]}),(0,l.jsx)(ec.Z,{}),(0,l.jsxs)(ed.Z,{mt:2,mb:2,children:[(0,l.jsx)(z.Z,{variant:"h6",children:"Address"}),(0,l.jsxs)(ed.Z,{display:"flex",alignItems:"center",children:[(0,l.jsx)(z.Z,{variant:"body1",className:f().node,children:null==e?void 0:e.address}),(0,l.jsx)(Copy,{text:null==e?void 0:e.address})]})]}),(0,l.jsx)(ec.Z,{}),(0,l.jsx)(ed.Z,{mt:2,children:(0,l.jsx)(NodePeers,{})})]}),{}),(0,l.jsx)(Indexer,{data:e}),(0,l.jsx)(SupportedNetworks_SupportedStorage,{data:e}),(0,l.jsx)(SupportedStorage,{data:e}),(0,l.jsx)(AdminAccounts,{}),(0,l.jsx)(NodePlatform,{platformData:c})]})})]})}function Home(){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(o(),{children:[(0,l.jsx)("title",{children:"Ocean Node Control Panel"}),(0,l.jsx)("meta",{name:"description",content:"Ocean Node Control Panel"}),(0,l.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),(0,l.jsx)("link",{rel:"icon",href:"/favicon.ico"})]}),(0,l.jsx)("header",{children:(0,l.jsx)(Navigation,{})}),(0,l.jsx)("main",{children:(0,l.jsx)(ControlPanel,{})}),(0,l.jsx)("footer",{children:(0,l.jsx)(components_Footer,{})})]})}},46085:function(e){e.exports={download:"Admin_download__ZZ4G0",unlockButton:"Admin_unlockButton__ke4Fn",buttonIcon:"Admin_buttonIcon___M4VS",loader:"Admin_loader__3WuLo",rotation:"Admin_rotation__lknWO",rotationBack:"Admin_rotationBack__qlWG_",root:"Admin_root__Q70by",title:"Admin_title__Xr7QQ",unauthorised:"Admin_unauthorised__6u5Bb"}},73301:function(e){e.exports={root:"ControlPanel_root__xgSoz",bodyContainer:"ControlPanel_bodyContainer__3gJmO",body:"ControlPanel_body__eJ4pu",details:"ControlPanel_details__FsHZf",columnP2P:"ControlPanel_columnP2P__E9d_w",columnHTTP:"ControlPanel_columnHTTP__H98wo",nodes:"ControlPanel_nodes__7wMOb",indexerQueueAlert:"ControlPanel_indexerQueueAlert__jqHbA",borderBottom:"ControlPanel_borderBottom__oU9PK",title29:"ControlPanel_title29__gz68F",title24:"ControlPanel_title24__7IKGZ",nodeAddress:"ControlPanel_nodeAddress__ZeK2z",node:"ControlPanel_node__zZlAF",indexer:"ControlPanel_indexer__TQbAJ",indexBlock:"ControlPanel_indexBlock__hRwv5",delayed:"ControlPanel_delayed__Y0IkO",provider:"ControlPanel_provider__AiLH1",providerRow:"ControlPanel_providerRow__iMvo9",providerTitle:"ControlPanel_providerTitle__aVYme",loaderContainer:"ControlPanel_loaderContainer__pvP_d",loader:"ControlPanel_loader__bbp5M",rotation:"ControlPanel_rotation__oC0WX"}},75368:function(e){e.exports={icon:"Copy_icon__BB7bs",feedback:"Copy_feedback__Wse_F",action:"Copy_action__IlKRq",button:"Copy_button__zsJoM"}},94428:function(e){e.exports={footerContainer:"style_footerContainer___mKsH",footerLinks:"style_footerLinks__1vBvO"}},30378:function(e){e.exports={navbarParent:"style_navbarParent__OgqE_",logoWrapper:"style_logoWrapper__ARfWA",connectButtonWrapper:"style_connectButtonWrapper__G4TF7"}},85108:function(e){e.exports={title24:"style_title24__8ssRQ",loaderContainer:"style_loaderContainer__dYPch",nodes:"style_nodes__ioZOx",nodeAddress:"style_nodeAddress__t2M8E"}},17044:function(e){e.exports={loader:"style_loader__s3fCW",rotation:"style_rotation__wALkg"}}},function(e){e.O(0,[5679,9774,2888,179],function(){return e(e.s=48312)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/dist/dashboard/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js b/dist/controlpanel/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js similarity index 100% rename from dist/dashboard/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js rename to dist/controlpanel/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js diff --git a/dist/dashboard/_next/static/chunks/webpack-fe817b75e2ea8908.js b/dist/controlpanel/_next/static/chunks/webpack-ec2fc339f6558e23.js similarity index 98% rename from dist/dashboard/_next/static/chunks/webpack-fe817b75e2ea8908.js rename to dist/controlpanel/_next/static/chunks/webpack-ec2fc339f6558e23.js index 51cd06ec5..f37260e70 100644 --- a/dist/dashboard/_next/static/chunks/webpack-fe817b75e2ea8908.js +++ b/dist/controlpanel/_next/static/chunks/webpack-ec2fc339f6558e23.js @@ -1 +1 @@ -!function(){"use strict";var e,r,_,t,c,a,n,u,i,f={},b={};function __webpack_require__(e){var r=b[e];if(void 0!==r)return r.exports;var _=b[e]={id:e,loaded:!1,exports:{}},t=!0;try{f[e].call(_.exports,_,_.exports,__webpack_require__),t=!1}finally{t&&delete b[e]}return _.loaded=!0,_.exports}__webpack_require__.m=f,__webpack_require__.amdO={},e=[],__webpack_require__.O=function(r,_,t,c){if(_){c=c||0;for(var a=e.length;a>0&&e[a-1][2]>c;a--)e[a]=e[a-1];e[a]=[_,t,c];return}for(var n=1/0,a=0;a=c&&Object.keys(__webpack_require__.O).every(function(e){return __webpack_require__.O[e](_[i])})?_.splice(i--,1):(u=!1,c0&&e[a-1][2]>c;a--)e[a]=e[a-1];e[a]=[_,t,c];return}for(var n=1/0,a=0;a=c&&Object.keys(__webpack_require__.O).every(function(e){return __webpack_require__.O[e](_[i])})?_.splice(i--,1):(u=!1,ch5{color:#3d4551;font-family:Helvetica;font-size:18px;font-style:normal;font-weight:700;line-height:150%;min-width:55px}.Dashboard_root__SCu4R{display:flex;flex-direction:row;gap:28px;position:relative;min-height:550px}.Dashboard_bodyContainer__Fs5NF{position:relative;width:100%}.Dashboard_body__kpkou{padding:40px 72px;border-radius:12px;background:#fff;width:100%}.Dashboard_details__TI_cX{display:flex;flex-direction:row;width:100%}.Dashboard_columnP2P__0zKqU{border-right:1.5px solid #eef1f5}.Dashboard_columnHTTP__lhw_5,.Dashboard_columnP2P__0zKqU{border-bottom:1.5px solid #eef1f5;width:50%}.Dashboard_columnP2P__0zKqU>div{padding:18px 18px 18px 0}.Dashboard_columnHTTP__lhw_5>div{padding:18px}.Dashboard_nodes__7r0Ge{display:flex;flex-direction:column;gap:15px;color:var(--Gray-Gray-500,#718096);font-family:Helvetica;font-size:18px;font-style:normal;font-weight:400;line-height:140%}.Dashboard_indexerQueueAlert__iCMHE{width:640}.Dashboard_borderBottom__5pTDi{border-bottom:1.5px solid #eef1f5}.Dashboard_title29__TBf_2{font-size:20px;margin-bottom:38px}.Dashboard_title24__q5w52,.Dashboard_title29__TBf_2{color:#3d4551;font-family:Helvetica;font-style:normal;font-weight:700;line-height:140%}.Dashboard_title24__q5w52{font-size:18px}.Dashboard_nodeAddress__jgxgu{display:flex;flex-direction:row;gap:18px}.Dashboard_nodeAddress__jgxgu>h5{color:#3d4551;font-family:Helvetica;font-size:18px;font-style:normal;font-weight:700;line-height:150%;min-width:55px}.Dashboard_node__UCu0_{display:flex;flex-direction:row;gap:18px}.Dashboard_node__UCu0_:hover{color:#333;cursor:pointer}.Dashboard_indexer__PpMWp{padding-bottom:55px;padding-top:55px}.Dashboard_indexBlock__Ng0C_{display:flex;flex-direction:column;gap:9px;padding:24px 28px;border-radius:8px;border:1px solid rgba(78,203,113,.7);border-top:10px solid rgba(38,194,81,.7);min-width:240px;color:#3d4551;font-family:Helvetica;font-size:16px;font-style:normal;font-weight:400;line-height:140%}.Dashboard_indexBlock__Ng0C_ h5{margin-bottom:18px;color:#3d4551;font-family:Helvetica;font-size:18px;font-style:normal;font-weight:700;line-height:150%}.Dashboard_delayed__3Tj7O{border:1px solid rgba(234,89,47,.9);border-top:10px solid rgba(234,89,47,.9)}.Dashboard_provider__wMZ4i{display:flex;flex-direction:column;gap:10px}.Dashboard_providerRow__k2QJ8{display:flex;flex-direction:row;gap:4px;font-weight:500}.Dashboard_providerTitle__5DXbm{min-width:100px}.Dashboard_loaderContainer__CAGjT{position:absolute;width:100%;height:100%;background-color:rgba(51,51,51,.2);display:flex;flex-direction:row;justify-content:center;align-items:center;border-radius:12px}.Dashboard_loader__p4KHC{width:48px;height:48px;border:2px solid #fff;border-radius:50%;display:inline-block;position:relative;box-sizing:border-box;animation:Dashboard_rotation__RIDl3 1s linear infinite}.Dashboard_loader__p4KHC:after,.Dashboard_loader__p4KHC:before{content:"";box-sizing:border-box;position:absolute;left:0;top:0;background:#ff3d00;width:6px;height:6px;transform:translate(150%,150%);border-radius:50%}.Dashboard_loader__p4KHC:before{left:auto;top:auto;right:0;bottom:0;transform:translate(-150%,-150%)}@keyframes Dashboard_rotation__RIDl3{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@media screen and (max-width:700px){.Dashboard_root__SCu4R{flex-direction:column}.Dashboard_body__kpkou{max-width:none;width:90vw;margin:0 auto;padding:20px}.Dashboard_details__TI_cX{flex-direction:column}.Dashboard_columnHTTP__lhw_5{width:100%}.Dashboard_columnP2P__0zKqU{width:100%;border-right:0}} \ No newline at end of file +.style_navbarParent__OgqE_{display:flex;justify-content:space-between;align-items:center;color:var(--gray-700);background-color:#fff;border-radius:15px;box-shadow:0 7px 23px 0 rgba(0,0,0,.05);-webkit-backdrop-filter:blur(10.5px);backdrop-filter:blur(10.5px);padding:11px 24px;width:100%;margin:0 auto}.style_logoWrapper__ARfWA{flex-shrink:0;min-width:108px}.style_connectButtonWrapper__G4TF7{flex-shrink:0}@media screen and (max-width:700px){.style_navbarParent__OgqE_{width:90vw;margin:0 auto}}.style_footerContainer___mKsH{max-width:1244px;margin:0 auto}.style_footerContainer___mKsH,.style_footerLinks__1vBvO{display:flex;justify-content:space-between;align-items:center}.style_footerLinks__1vBvO{gap:60px}@media screen and (max-width:700px){.style_footerContainer___mKsH{flex-direction:column}.style_footerLinks__1vBvO{flex-direction:column;margin-top:12px;gap:12px}}.Admin_download__ZZ4G0{display:flex;flex-direction:row;justify-content:center;flex-wrap:nowrap;align-items:center;width:100%;gap:4px;color:#4a5360;font-family:Helvetica;font-size:16px;font-style:normal;font-weight:500;line-height:140%;text-align:left;background:transparent;border:transparent}.Admin_unlockButton__ke4Fn{padding:10px 20px;background-color:#007bff;border:none;color:#fff;text-transform:uppercase;font-weight:700;cursor:pointer;transition:background-color .3s,transform .2s;border-radius:4px;outline:none}.Admin_unlockButton__ke4Fn:hover{background-color:#0056b3;transform:scale(1.05)}.Admin_unlockButton__ke4Fn:active{transform:scale(.95)}.Admin_unlockButton__ke4Fn:focus{box-shadow:0 0 0 2px rgba(0,123,255,.5)}.Admin_buttonIcon___M4VS{color:#a0aec0}.Admin_download__ZZ4G0:hover{background-color:transparent;color:#000}.Admin_loader__3WuLo{width:48px;height:48px;border-color:#fff;border-style:solid solid dotted dotted;border-width:3px;border-radius:50%;display:inline-block;position:relative;box-sizing:border-box;animation:Admin_rotation__lknWO 2s linear infinite}.Admin_loader__3WuLo:after{content:"";box-sizing:border-box;position:absolute;left:0;right:0;top:0;bottom:0;margin:auto;border:3px #ff3d00;border-style:solid solid dotted;width:24px;height:24px;border-radius:50%;animation:Admin_rotationBack__qlWG_ 1s linear infinite;transform-origin:center center}@keyframes Admin_rotation__lknWO{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes Admin_rotationBack__qlWG_{0%{transform:rotate(0deg)}to{transform:rotate(-1turn)}}.Admin_root__Q70by{border-radius:12px;background:#fff;max-width:320px;min-width:245px;display:flex;flex-direction:column;padding:20px}.Admin_title__Xr7QQ{color:#3d4551;font-family:Helvetica;font-size:20px;font-style:normal;font-weight:700;line-height:140%;margin-bottom:47px}.Admin_unauthorised__6u5Bb{color:#ff3d00}@media screen and (max-width:700px){.Admin_root__Q70by{max-width:none;width:90vw;margin:0 auto;padding:20px}}.style_loader__s3fCW{width:48px;height:48px;border:2px solid #fff;border-radius:50%;display:inline-block;position:relative;box-sizing:border-box;animation:style_rotation__wALkg 1s linear infinite}.style_loader__s3fCW:after,.style_loader__s3fCW:before{content:"";box-sizing:border-box;position:absolute;left:0;top:0;background:#ff3d00;width:6px;height:6px;transform:translate(150%,150%);border-radius:50%}.style_loader__s3fCW:before{left:auto;top:auto;right:0;bottom:0;transform:translate(-150%,-150%)}@keyframes style_rotation__wALkg{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.Copy_icon__BB7bs{background-color:transparent}.Copy_feedback__Wse_F{color:#000;font-size:10px}.Copy_action__IlKRq{display:flex;flex-direction:row;align-items:center;gap:10px}.Copy_action__IlKRq:hover{cursor:pointer}.Copy_button__zsJoM{background-color:transparent;border:none}.style_title24__8ssRQ{color:#3d4551;font-family:Helvetica;font-size:18px;font-style:normal;font-weight:700;line-height:140%}.style_loaderContainer__dYPch{position:absolute;width:100%;height:100%;background-color:rgba(51,51,51,.2);display:flex;flex-direction:row;justify-content:center;align-items:center;border-radius:12px}.style_nodes__ioZOx{display:flex;flex-direction:column;gap:15px;position:relative;color:var(--Gray-Gray-500,#718096);font-family:Helvetica;font-size:18px;font-style:normal;font-weight:400;line-height:140%}.style_nodeAddress__t2M8E{display:flex;flex-direction:row;gap:18px}.style_nodeAddress__t2M8E:hover{color:#333;cursor:pointer}.style_nodeAddress__t2M8E>h5{color:#3d4551;font-family:Helvetica;font-size:18px;font-style:normal;font-weight:700;line-height:150%;min-width:55px}.ControlPanel_root__xgSoz{display:flex;flex-direction:row;gap:28px;position:relative;min-height:550px}.ControlPanel_bodyContainer__3gJmO{position:relative;width:100%}.ControlPanel_body__eJ4pu{padding:40px 72px;border-radius:12px;background:#fff;width:100%}.ControlPanel_details__FsHZf{display:flex;flex-direction:row;width:100%}.ControlPanel_columnP2P__E9d_w{border-right:1.5px solid #eef1f5}.ControlPanel_columnHTTP__H98wo,.ControlPanel_columnP2P__E9d_w{border-bottom:1.5px solid #eef1f5;width:50%}.ControlPanel_columnP2P__E9d_w>div{padding:18px 18px 18px 0}.ControlPanel_columnHTTP__H98wo>div{padding:18px}.ControlPanel_nodes__7wMOb{display:flex;flex-direction:column;gap:15px;color:var(--Gray-Gray-500,#718096);font-family:Helvetica;font-size:18px;font-style:normal;font-weight:400;line-height:140%}.ControlPanel_indexerQueueAlert__jqHbA{width:640}.ControlPanel_borderBottom__oU9PK{border-bottom:1.5px solid #eef1f5}.ControlPanel_title29__gz68F{font-size:20px;margin-bottom:38px}.ControlPanel_title24__7IKGZ,.ControlPanel_title29__gz68F{color:#3d4551;font-family:Helvetica;font-style:normal;font-weight:700;line-height:140%}.ControlPanel_title24__7IKGZ{font-size:18px}.ControlPanel_nodeAddress__ZeK2z{display:flex;flex-direction:row;gap:18px}.ControlPanel_nodeAddress__ZeK2z>h5{color:#3d4551;font-family:Helvetica;font-size:18px;font-style:normal;font-weight:700;line-height:150%;min-width:55px}.ControlPanel_node__zZlAF{display:flex;flex-direction:row;gap:18px}.ControlPanel_node__zZlAF:hover{color:#333;cursor:pointer}.ControlPanel_indexer__TQbAJ{padding-bottom:55px;padding-top:55px}.ControlPanel_indexBlock__hRwv5{display:flex;flex-direction:column;gap:9px;padding:24px 28px;border-radius:8px;border:1px solid rgba(78,203,113,.7);border-top:10px solid rgba(38,194,81,.7);min-width:240px;color:#3d4551;font-family:Helvetica;font-size:16px;font-style:normal;font-weight:400;line-height:140%}.ControlPanel_indexBlock__hRwv5 h5{margin-bottom:18px;color:#3d4551;font-family:Helvetica;font-size:18px;font-style:normal;font-weight:700;line-height:150%}.ControlPanel_delayed__Y0IkO{border:1px solid rgba(234,89,47,.9);border-top:10px solid rgba(234,89,47,.9)}.ControlPanel_provider__AiLH1{display:flex;flex-direction:column;gap:10px}.ControlPanel_providerRow__iMvo9{display:flex;flex-direction:row;gap:4px;font-weight:500}.ControlPanel_providerTitle__aVYme{min-width:100px}.ControlPanel_loaderContainer__pvP_d{position:absolute;width:100%;height:100%;background-color:rgba(51,51,51,.2);display:flex;flex-direction:row;justify-content:center;align-items:center;border-radius:12px}.ControlPanel_loader__bbp5M{width:48px;height:48px;border:2px solid #fff;border-radius:50%;display:inline-block;position:relative;box-sizing:border-box;animation:ControlPanel_rotation__oC0WX 1s linear infinite}.ControlPanel_loader__bbp5M:after,.ControlPanel_loader__bbp5M:before{content:"";box-sizing:border-box;position:absolute;left:0;top:0;background:#ff3d00;width:6px;height:6px;transform:translate(150%,150%);border-radius:50%}.ControlPanel_loader__bbp5M:before{left:auto;top:auto;right:0;bottom:0;transform:translate(-150%,-150%)}@keyframes ControlPanel_rotation__oC0WX{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@media screen and (max-width:700px){.ControlPanel_root__xgSoz{flex-direction:column}.ControlPanel_body__eJ4pu{max-width:none;width:90vw;margin:0 auto;padding:20px}.ControlPanel_details__FsHZf{flex-direction:column}.ControlPanel_columnHTTP__H98wo{width:100%}.ControlPanel_columnP2P__E9d_w{width:100%;border-right:0}} \ No newline at end of file diff --git a/dist/dashboard/_next/static/dWTZat63Weh2kEqjHUkGv/_buildManifest.js b/dist/controlpanel/_next/static/dbdm9KL_uDQpXQXjY0ctm/_buildManifest.js similarity index 64% rename from dist/dashboard/_next/static/dWTZat63Weh2kEqjHUkGv/_buildManifest.js rename to dist/controlpanel/_next/static/dbdm9KL_uDQpXQXjY0ctm/_buildManifest.js index 3019a6c81..cc4ded36e 100644 --- a/dist/dashboard/_next/static/dWTZat63Weh2kEqjHUkGv/_buildManifest.js +++ b/dist/controlpanel/_next/static/dbdm9KL_uDQpXQXjY0ctm/_buildManifest.js @@ -1 +1 @@ -self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/5679-bec633b225238aa1.js","static/css/a66f1c922ed6fd7f.css","static/chunks/pages/index-2dd5da6078999ac1.js"],"/_error":["static/chunks/pages/_error-e4216aab802f5810.js"],sortedPages:["/","/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB(); \ No newline at end of file +self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/5679-bec633b225238aa1.js","static/css/8b9f4a8789776f9a.css","static/chunks/pages/index-68352c78cef0caeb.js"],"/_error":["static/chunks/pages/_error-e4216aab802f5810.js"],sortedPages:["/","/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB(); \ No newline at end of file diff --git a/dist/dashboard/_next/static/dWTZat63Weh2kEqjHUkGv/_ssgManifest.js b/dist/controlpanel/_next/static/dbdm9KL_uDQpXQXjY0ctm/_ssgManifest.js similarity index 100% rename from dist/dashboard/_next/static/dWTZat63Weh2kEqjHUkGv/_ssgManifest.js rename to dist/controlpanel/_next/static/dbdm9KL_uDQpXQXjY0ctm/_ssgManifest.js diff --git a/dist/dashboard/_next/static/media/copy.63713a04.svg b/dist/controlpanel/_next/static/media/copy.63713a04.svg similarity index 100% rename from dist/dashboard/_next/static/media/copy.63713a04.svg rename to dist/controlpanel/_next/static/media/copy.63713a04.svg diff --git a/dist/dashboard/_next/static/media/download.0a4876ec.svg b/dist/controlpanel/_next/static/media/download.0a4876ec.svg similarity index 100% rename from dist/dashboard/_next/static/media/download.0a4876ec.svg rename to dist/controlpanel/_next/static/media/download.0a4876ec.svg diff --git a/dist/dashboard/_next/static/media/logo-nodes.249ea9ed.svg b/dist/controlpanel/_next/static/media/logo-nodes.249ea9ed.svg similarity index 100% rename from dist/dashboard/_next/static/media/logo-nodes.249ea9ed.svg rename to dist/controlpanel/_next/static/media/logo-nodes.249ea9ed.svg diff --git a/dist/controlpanel/index.html b/dist/controlpanel/index.html new file mode 100644 index 000000000..d72efd16f --- /dev/null +++ b/dist/controlpanel/index.html @@ -0,0 +1 @@ +Ocean Node Control Panel
Ocean Node Logo
ADMIN ACTIONS
\ No newline at end of file diff --git a/dist/dashboard/_next/static/chunks/pages/index-2dd5da6078999ac1.js b/dist/dashboard/_next/static/chunks/pages/index-2dd5da6078999ac1.js deleted file mode 100644 index f6395e505..000000000 --- a/dist/dashboard/_next/static/chunks/pages/index-2dd5da6078999ac1.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5405],{48312:function(e,n,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/",function(){return t(30431)}])},30431:function(e,n,t){"use strict";t.r(n),t.d(n,{default:function(){return Home}});var a,r,s=t(85893),i=t(9008),l=t.n(i),o=t(25675),d=t.n(o),c={src:"/_next/static/media/logo-nodes.249ea9ed.svg",height:283,width:425,blurWidth:0,blurHeight:0},u=t(30378),h=t.n(u),x=t(89192),Navigation=()=>(0,s.jsxs)("div",{className:h().navbarParent,children:[(0,s.jsx)("div",{className:h().logoWrapper,children:(0,s.jsx)(d(),{src:c,alt:"Ocean Node Logo",height:70})}),(0,s.jsx)("div",{className:h().connectButtonWrapper,children:(0,s.jsx)(x.NL,{})})]}),j=t(94428),m=t.n(j),components_Footer=()=>{let e=new Date().getFullYear();return(0,s.jsxs)("div",{className:m().footerContainer,children:[(0,s.jsxs)("p",{children:["@ ",e,", Ocean Nodes"]}),(0,s.jsxs)("div",{className:m().footerLinks,children:[(0,s.jsx)("a",{href:"https://oceanprotocol.com/",target:"_blank",children:"Website"}),(0,s.jsx)("a",{href:"https://github.com/oceanprotocol/ocean-node",target:"_blank",children:"GitHub"}),(0,s.jsx)("a",{href:"https://discord.com/invite/TnXjkR5",target:"_blank",children:"Discord"})]})]})},p=t(67294),v=t(11706),b=t.n(v),_=t(59581),f=t(46085),g=t.n(f),N=t(69417),y=t(94054),S=t(50135),C=t(33841),Z=t(30638),I=t(23599),w=t(10586),T=t(50720),D=t(67971),k=t(27484),E=t.n(k),A={src:"/_next/static/media/download.0a4876ec.svg",height:30,width:30,blurWidth:0,blurHeight:0};function DownloadButton(){let[e,n]=(0,p.useState)(!1),[t,a]=(0,p.useState)(!1),[r,i]=(0,p.useState)(E()()),[l,o]=(0,p.useState)(E()()),[c,u]=(0,p.useState)(""),[h,x]=(0,p.useState)(""),[j,m]=(0,p.useState)(""),{signature:v,expiryTimestamp:b}=(0,_.O)(),f=(0,p.useCallback)(async()=>{let e=r?"&startTime=".concat(r.toISOString()):"",n=l?"&endTime=".concat(l.toISOString()):"",t=c?"&maxLogs=".concat(c):"",s=h&&"all"!==h?"&moduleName=".concat(h):"",i=j&&"all"!==j?'&level="'.concat(j,'"'):"";a(!0);try{if(!b||!v){console.error("Missing expiryTimestamp or signature");return}let r=await fetch("/logs?".concat(e).concat(n).concat(t).concat(s).concat(i),{headers:{"Content-Type":"application/json"},method:"POST",body:JSON.stringify({expiryTimestamp:b,signature:v})}),l=await r.json();if(l){let e="data:application/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(l)),n=document.createElement("a");n.setAttribute("href",e),n.setAttribute("download","LogsData.json"),document.body.appendChild(n),n.click(),n.remove()}a(!1)}catch(e){console.error(e),a(!1)}},[r,l,c,h,j]);return(0,s.jsxs)("div",{className:g().column,children:[(0,s.jsx)(N.Z,{type:"button",onClick:()=>n(!e),children:"Download Logs"}),e&&(0,s.jsxs)("div",{className:g().filters,children:[(0,s.jsxs)(T._,{dateAdapter:w.y,children:[(0,s.jsx)(y.Z,{fullWidth:!0,margin:"normal",children:(0,s.jsx)(D.x,{label:"Start Date",value:r,onChange:e=>i(e)})}),(0,s.jsx)(y.Z,{fullWidth:!0,margin:"normal",children:(0,s.jsx)(D.x,{label:"End Date",value:l,onChange:e=>o(e)})})]}),(0,s.jsx)(S.Z,{label:"Max Logs",type:"number",value:c,onChange:e=>u(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined"}),(0,s.jsxs)(y.Z,{fullWidth:!0,margin:"normal",children:[(0,s.jsx)(C.Z,{id:"select-module-name-label",children:"Module Name"}),(0,s.jsxs)(Z.Z,{labelId:"select-module-name-label",label:"Module Name",id:"module-name",value:h,onChange:e=>x(e.target.value),children:[(0,s.jsx)(I.Z,{value:"all",children:"all"}),(0,s.jsx)(I.Z,{value:"http",children:"http"}),(0,s.jsx)(I.Z,{value:"p2p",children:"p2p"}),(0,s.jsx)(I.Z,{value:"indexer",children:"indexer"}),(0,s.jsx)(I.Z,{value:"reindexer",children:"reindexer"}),(0,s.jsx)(I.Z,{value:"provider",children:"provider"}),(0,s.jsx)(I.Z,{value:"database",children:"database"}),(0,s.jsx)(I.Z,{value:"config",children:"config"}),(0,s.jsx)(I.Z,{value:"core",children:"core"}),(0,s.jsx)(I.Z,{value:"OceanNode",children:"OceanNode"})]})]}),(0,s.jsxs)(y.Z,{fullWidth:!0,margin:"normal",children:[(0,s.jsx)(C.Z,{id:"select-level-label",children:"Level"}),(0,s.jsxs)(Z.Z,{labelId:"select-level-label",label:"Level",id:"level",value:j,onChange:e=>m(e.target.value),children:[(0,s.jsx)(I.Z,{value:"all",children:"all"}),(0,s.jsx)(I.Z,{value:"error",children:"error"}),(0,s.jsx)(I.Z,{value:"warn",children:"warn"}),(0,s.jsx)(I.Z,{value:"info",children:"info"}),(0,s.jsx)(I.Z,{value:"http",children:"http"}),(0,s.jsx)(I.Z,{value:"verbose",children:"verbose"}),(0,s.jsx)(I.Z,{value:"debug",children:"debug"}),(0,s.jsx)(I.Z,{value:"silly",children:"silly"})]})]}),(0,s.jsx)(N.Z,{type:"button",onClick:f,variant:"outlined",startIcon:(0,s.jsx)(d(),{src:A,alt:"download button",width:24,height:24}),disabled:t,children:"Download"})]})]})}function StopNode(){let[e,n]=(0,p.useState)(!1),{signature:t,expiryTimestamp:a}=(0,_.O)();async function stopNode(){n(!0);try{a&&t&&await fetch("/directCommand",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"POST",body:JSON.stringify({command:"stopNode",expiryTimestamp:a,signature:t})}),alert("The node has been stopped. The dashboard will no longer be displayed."),window.location.reload()}catch(e){console.error("error",e)}finally{n(!1)}}return(0,s.jsx)(N.Z,{onClick:stopNode,variant:"outlined",color:"error",children:e?(0,s.jsx)(()=>(0,s.jsx)("span",{className:g().loader}),{}):(0,s.jsx)("div",{children:"Stop Node"})})}var P=t(92321),O=t(31536);function NetworkSelector(e){let{chainId:n,setChainId:t}=e,{networks:a}=(0,_.O)();return(0,s.jsxs)(y.Z,{fullWidth:!0,margin:"normal",variant:"outlined",children:[(0,s.jsx)(C.Z,{id:"network-select-label",children:"Network"}),(0,s.jsx)(Z.Z,{labelId:"network-select-label",id:"network-select",value:n||"",onChange:e=>t(e.target.value),label:"Network",children:Object.values(a).map(e=>(0,s.jsx)(I.Z,{value:e.chainId.toString(),children:e.network},e.chainId))})]})}(a=r||(r={})).DELIVERED="DELIVERED",a.PENDING="PENDING",a.FAILURE="FAILURE",a.SUCCESS="SUCCESS";let checkJobPool=async function(e){try{let n=await fetch("/api/services/jobs/"+(e||""),{headers:{Accept:"application/json","Content-Type":"application/json"},method:"GET"}),t=await n.json();return t.jobs}catch(e){console.error(e)}return[]};function getSeverityFromStatus(e){switch(e){case r.DELIVERED:return"info";case r.SUCCESS:return"success";case r.PENDING:return"warning";default:return"error"}}function isJobDone(e){return[r.SUCCESS,r.FAILURE].includes(e)}var R=t(8434);function JobStatusPanel(e){let n=e.job?function(e){switch(e){case r.DELIVERED:return"DodgerBlue";case r.PENDING:return"LightSlateGrey";case r.SUCCESS:return"ForestGreen";case r.FAILURE:return"OrangeRed";default:return"black"}}(e.job.status):"black";return(0,s.jsx)("div",{children:null!==e.job&&(0,s.jsxs)(R.Z,{sx:{bgcolor:n},variant:"filled",severity:e.severity,onClose:()=>{},children:["Job with id ",(0,s.jsx)("strong",{children:e.job.jobId})," has status"," ",(0,s.jsx)("strong",{children:e.job.status})]})})}var W=t(602);function ReIndexChain(){let[e,n]=(0,p.useState)(!1),[t,a]=(0,p.useState)(!1),[i,l]=(0,p.useState)(),{signature:o,expiryTimestamp:d}=(0,_.O)(),[c,u]=(0,p.useState)("info"),[h,x]=(0,p.useState)(null),j=null;async function reIndex(){a(!0);try{if(d&&o&&i){let e=await fetch("/directCommand",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"POST",body:JSON.stringify({command:"reindexChain",chainId:i,expiryTimestamp:d,signature:o})});if(200===e.status){let t=await e.json();u(t.status===r.DELIVERED?"info":"error"),x(t),alert("Chain with ID ".concat(i," is now being reindexed."));let a=!1;j=setInterval(async()=>{let e=await checkJobPool(t.jobId);if(1===e.length){let n=e[0];u(getSeverityFromStatus(n.status)),a=isJobDone(n.status),x(n)}else x(null)},3e3),a&&j&&(0,W.clearInterval)(j),n(!1)}else alert("Error reindexing chain. Please try again.")}}catch(e){console.error("error",e)}finally{a(!1)}}return(0,s.jsxs)("div",{className:g().column,children:[(0,s.jsx)(N.Z,{type:"button",onClick:()=>n(!e),children:"ReIndex Chain"}),e&&(0,s.jsxs)("div",{className:g().filters,children:[(0,s.jsx)(NetworkSelector,{chainId:i,setChainId:l}),(0,s.jsx)(N.Z,{type:"button",onClick:reIndex,variant:"outlined",disabled:t,children:"ReIndex Chain"})]}),(0,s.jsx)(JobStatusPanel,{job:h,severity:c})]})}function ReIndexTransaction(){let[e,n]=(0,p.useState)(!1),[t,a]=(0,p.useState)(!1),[i,l]=(0,p.useState)(),[o,d]=(0,p.useState)(),{signature:c,expiryTimestamp:u}=(0,_.O)(),[h,x]=(0,p.useState)("info"),[j,m]=(0,p.useState)(null),v=null;async function reIndexTx(){a(!0);try{if(u&&c&&i&&o){let e=await fetch("/directCommand",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"POST",body:JSON.stringify({command:"reindexTx",chainId:i,txId:o,expiryTimestamp:u,signature:c})});if(200===e.status){let t=await e.json();x(t.status===r.DELIVERED?"info":"error"),m(t),alert("Transaction with TX ID ".concat(o," on chain ").concat(i," is now being reindexed."));let a=!1;v=setInterval(async()=>{let e=await checkJobPool(t.jobId);if(1===e.length){let n=e[0];x(getSeverityFromStatus(n.status)),a=isJobDone(n.status),m(n)}else m(null)},3e3),a&&v&&clearInterval(v),n(!1)}else alert("Error reindexing transaction. Please try again.")}}catch(e){console.error("error",e)}finally{a(!1)}}return(0,s.jsxs)("div",{className:g().column,children:[(0,s.jsx)(N.Z,{type:"button",onClick:()=>n(!e),children:"ReIndex Transaction"}),e&&(0,s.jsxs)("div",{className:g().filters,children:[(0,s.jsx)(NetworkSelector,{chainId:i,setChainId:l}),(0,s.jsx)(S.Z,{label:"Transaction ID",value:o,onChange:e=>d(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined"}),(0,s.jsx)(N.Z,{type:"button",onClick:reIndexTx,variant:"outlined",disabled:t,children:"ReIndex Transaction"})]}),(0,s.jsx)(JobStatusPanel,{job:j,severity:h})]})}var L=t(58703),F=t(64666),B=t(37645),J=t(6514),U=t(58951),G=t(31425);function TransferFees(){let[e,n]=(0,p.useState)(!1),[t,a]=(0,p.useState)(!1),[r,i]=(0,p.useState)(""),[l,o]=(0,p.useState)(""),[d,c]=(0,p.useState)(""),[u,h]=(0,p.useState)(""),{signature:x,expiryTimestamp:j}=(0,_.O)(),[m,v]=(0,p.useState)(null),[b,f]=(0,p.useState)(!1),[y,C]=(0,p.useState)(!1),[Z,I]=(0,p.useState)(null),[w,T]=(0,p.useState)(null),validateInputs=()=>r&&l&&d&&u?isNaN(Number(d))?(v("Token amount must be a number."),!1):(v(null),!0):(v("All fields are required."),!1);async function transferFees(){if(validateInputs()){a(!0);try{let e=await fetch("/directCommand",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"POST",body:JSON.stringify({command:"collectFees",chainId:r,tokenAddress:l,tokenAmount:d,destinationAddress:u,expiryTimestamp:j,signature:x})});if(200===e.status){let t=await e.json();(null==t?void 0:t.tx)&&(null==t?void 0:t.message)&&(T(t.tx),I(t.message),C(!0),f(!0),n(!1))}else v(e.statusText?e.statusText:"Error transferring fees. Please try again.")}catch(e){console.error("error",e),v("Error transferring fees. Please try again.")}finally{a(!1)}}}let handleDialogClose=()=>{C(!1)};return(0,s.jsxs)("div",{className:g().column,children:[(0,s.jsx)(N.Z,{variant:"text",onClick:()=>n(!e),children:"Transfer Fees"}),e&&(0,s.jsxs)("div",{className:g().filters,children:[(0,s.jsx)(S.Z,{label:"Chain ID",value:r,onChange:e=>i(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined",type:"number"}),(0,s.jsx)(S.Z,{label:"Token Address",value:l,onChange:e=>o(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined"}),(0,s.jsx)(S.Z,{label:"Token Amount",value:d,onChange:e=>c(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined",type:"number"}),(0,s.jsx)(S.Z,{label:"Destination Address",value:u,onChange:e=>h(e.target.value),fullWidth:!0,margin:"normal",variant:"outlined"}),m&&(0,s.jsx)(R.Z,{severity:"error",children:m}),(0,s.jsx)(N.Z,{type:"button",onClick:transferFees,variant:"outlined",disabled:t,fullWidth:!0,children:"Transfer Fees"})]}),(0,s.jsx)(L.Z,{open:b,autoHideDuration:6e3,onClose:()=>f(!1),message:"Fees successfully transferred!"}),(0,s.jsxs)(F.Z,{open:y,onClose:handleDialogClose,"aria-labelledby":"alert-dialog-title","aria-describedby":"alert-dialog-description",children:[(0,s.jsx)(B.Z,{id:"alert-dialog-title",children:"Transfer Successful"}),(0,s.jsx)(J.Z,{children:(0,s.jsx)(U.Z,{id:"alert-dialog-description",children:Z&&(0,s.jsxs)("span",{children:[Z," ",(0,s.jsx)("br",{}),(0,s.jsx)("strong",{style:{marginTop:"10px",display:"block"},children:"Transaction Hash:"})," ",w]})})}),(0,s.jsx)(G.Z,{children:(0,s.jsx)(N.Z,{onClick:handleDialogClose,autoFocus:!0,children:"Close"})})]})]})}function AdminActions(){let{generateSignature:e,signature:n,validTimestamp:t,admin:a}=(0,_.O)(),{isConnected:r}=(0,P.m)();return(0,s.jsxs)("div",{className:g().root,children:[(0,s.jsx)("div",{className:g().title,children:"ADMIN ACTIONS"}),!r&&(0,s.jsx)(x.NL,{}),r&&!a&&(0,s.jsx)("div",{className:g().unauthorised,children:"Your account does not have admin access"}),(!n||!t)&&r&&a&&(0,s.jsx)("button",{type:"button",className:g().unlockButton,onClick:e,children:"Unlock"}),r&&n&&t&&r&&a&&(0,s.jsxs)(O.Z,{spacing:2,direction:"column",children:[(0,s.jsx)(DownloadButton,{}),(0,s.jsx)(ReIndexChain,{}),(0,s.jsx)(ReIndexTransaction,{}),(0,s.jsx)(TransferFees,{}),(0,s.jsx)(StopNode,{})]})]})}var H=t(17044),Q=t.n(H);function Spinner(){return(0,s.jsx)("span",{className:Q().loader})}var M=t(85108),q=t.n(M),X=t(75368),V=t.n(X),K={src:"/_next/static/media/copy.63713a04.svg",height:16,width:15,blurWidth:0,blurHeight:0};function Copy(e){let{text:n}=e,[t,a]=(0,p.useState)(!1),copyToClipboard=e=>{let n=document.createElement("textarea");n.value=e,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)};return(0,p.useEffect)(()=>{if(!t)return;let e=setTimeout(()=>{a(!1)},1e3);return()=>clearTimeout(e)},[t]),(0,s.jsxs)("div",{className:V().action,onClick:()=>{copyToClipboard(n),a(!0)},children:[(0,s.jsx)(d(),{src:K,alt:"icont-copy",className:V().icon}),t&&(0,s.jsx)("div",{className:V().feedback,children:"Copied!"})]})}var Y=t(15861);function NodePeers(){let[e,n]=(0,p.useState)([]),[t,a]=(0,p.useState)(!0),[r,i]=(0,p.useState)(!1),fetchNodePeers=async()=>{a(!0);try{let e=await fetch("/getOceanPeers",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"GET"}),t=await e.json();n(t)}catch(e){console.error("error",e)}finally{a(!1)}};(0,p.useEffect)(()=>{fetchNodePeers();let e=setInterval(()=>{fetchNodePeers()},12e4);return()=>clearInterval(e)},[]);let l=r?e:e.slice(0,10);return(0,s.jsxs)("div",{className:q().nodes,children:[(0,s.jsxs)("div",{className:q().title24,children:["Connected Nodes (Total ",e.length,")"]}),t?(0,s.jsx)("div",{className:q().loaderContainer,children:(0,s.jsx)(Spinner,{})}):(0,s.jsxs)(s.Fragment,{children:[e.length>0?l.map(e=>(0,s.jsxs)("div",{className:q().nodeAddress,children:[e," ",(0,s.jsx)(Copy,{text:e})]},e)):(0,s.jsx)(Y.Z,{variant:"body1",children:"There are no nodes connected"}),!r&&e.length>10&&(0,s.jsx)(N.Z,{onClick:()=>i(!0),variant:"text",color:"primary",children:"Show All"}),r&&e.length>10&&(0,s.jsx)(N.Z,{onClick:()=>i(!1),variant:"text",color:"primary",children:"Show Less"})]})]})}function SupportedStorage(e){let{data:n}=e;return(0,s.jsxs)("div",{className:b().indexer,children:[(0,s.jsx)("div",{className:b().title29,children:"SUPPORTED STORAGE"}),(0,s.jsxs)("div",{className:b().provider,children:[(0,s.jsxs)("div",{className:b().providerRow,children:[(0,s.jsx)("div",{className:b().providerTitle,children:(0,s.jsx)("b",{children:"arwave:"})}),(0,s.jsxs)("div",{children:[null==n?void 0:n.supportedStorage.arwave.toString()," "]})]}),(0,s.jsxs)("div",{className:b().providerRow,children:[(0,s.jsx)("div",{className:b().providerTitle,children:(0,s.jsx)("b",{children:"ipfs:"})}),(0,s.jsxs)("div",{children:[null==n?void 0:n.supportedStorage.ipfs.toString()," "]})]}),(0,s.jsxs)("div",{className:b().providerRow,children:[(0,s.jsx)("div",{className:b().providerTitle,children:(0,s.jsx)("b",{children:"url:"})}),(0,s.jsxs)("div",{children:[null==n?void 0:n.supportedStorage.url.toString()," "]})]})]})]})}function SupportedNetworks_SupportedStorage(e){let{data:n}=e;return(0,s.jsxs)("div",{className:b().indexer,children:[(0,s.jsx)("div",{className:b().title29,children:"SUPPORTED Networks"}),(0,s.jsx)("div",{className:b().provider,children:null==n?void 0:n.provider.map(e=>(0,s.jsxs)("div",{className:b().providerRow,children:[(0,s.jsx)("div",{className:b().providerTitle,children:(0,s.jsx)("b",{children:e.chainId})}),(0,s.jsxs)("div",{children:[e.network," "]})]}))})]})}var z=t(93967),$=t.n(z),ee=t(72882),en=t(7906),et=t(53184),ea=t(53816),er=t(53252),es=t(295),ei=t(27061);function IndexQueue(){let[e,n]=(0,p.useState)([]),{networks:t}=(0,_.O)(),[a,r]=(0,p.useState)(!1),i=null;return(0,p.useEffect)(()=>{let fetchQueue=()=>{fetch("/api/services/indexQueue").then(e=>{400===e.status?(console.warn("Cannot fetch queue: Node is not running Indexer"),r(!0),i&&clearInterval(i)):e.json().then(e=>{let a=e.queue.map(e=>{let n=t.find(n=>n.chainId===e.chainId);return{txId:e.txId,chainId:e.chainId,chain:n?n.network:"Unknown Network"}});n(a)})}).catch(e=>{console.error("Error fetching queue:",e)})};fetchQueue();let e=1e4;return ei.env.INDEXER_INTERVAL&&(e=Number(ei.env.INDEXER_INTERVAL)),i=setInterval(fetchQueue,e),()=>{i&&clearInterval(i)}},[]),(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:b().title24,style:{paddingTop:"55px",paddingBottom:"55px"},children:"Indexing Queue"}),e.length>0?(0,s.jsx)(ee.Z,{children:(0,s.jsxs)(en.Z,{"aria-label":"simple table",children:[(0,s.jsx)(et.Z,{children:(0,s.jsxs)(ea.Z,{children:[(0,s.jsx)(er.Z,{children:(0,s.jsx)("b",{children:"Transaction ID"})}),(0,s.jsx)(er.Z,{align:"right",children:(0,s.jsx)("b",{children:"Network"})})]})}),(0,s.jsx)(es.Z,{children:e.map((e,n)=>(0,s.jsxs)(ea.Z,{children:[(0,s.jsx)(er.Z,{component:"th",scope:"row",children:e.txId}),(0,s.jsx)(er.Z,{align:"right",children:e.chain})]},n))})]})}):(0,s.jsx)("p",{children:"Indexing queue is empty."}),a&&(0,s.jsx)(R.Z,{className:b().indexerQueueAlert,severity:"warning",onClose:()=>{r(!1)},children:"Node is not running Indexer. No need to get queue at this point!"})]})}var el=t(86886),eo=t(66242);function Indexer(e){let{data:n}=e;return(0,s.jsxs)("div",{className:$()([b().indexer,b().borderBottom]),children:[(0,s.jsx)("div",{className:b().title29,children:"INDEXER"}),(0,s.jsx)(el.ZP,{container:!0,spacing:2,children:null==n?void 0:n.indexer.map(e=>(0,s.jsx)(el.ZP,{item:!0,xs:12,sm:6,md:4,children:(0,s.jsxs)(eo.Z,{className:$()([b().indexBlock,e.delayed&&b().delayed]),sx:{marginBottom:4,borderRadius:"8px",position:"relative"},children:[(0,s.jsx)("h5",{children:e.network}),(0,s.jsxs)("div",{children:["ChainID: ",e.chainId]}),(0,s.jsxs)("div",{children:["BLOCK: ",e.block]})]},e.block)},e.block))}),(0,s.jsx)(IndexQueue,{})]})}function AdminAccounts(){let{allAdmins:e}=(0,_.O)();return(0,s.jsxs)("div",{className:b().indexer,children:[(0,s.jsx)("div",{className:b().title29,children:"Admin Accounts"}),(0,s.jsx)("div",{className:b().provider,children:e.map((e,n)=>(0,s.jsx)("div",{className:b().providerRow,children:e},n))})]})}function NodePlatform(e){let{platformData:n}=e;return(0,s.jsxs)("div",{className:b().indexer,children:[(0,s.jsx)("div",{className:b().title29,children:"PLATFORM"}),(0,s.jsx)("div",{className:b().provider,children:n.map(e=>(0,s.jsxs)("div",{className:b().providerRow,children:[(0,s.jsx)("div",{className:b().providerTitle,children:(0,s.jsxs)("b",{children:[e.key,":"]})}),(0,s.jsxs)("div",{children:[e.value," "]})]},e.value))})]})}var ed=t(5616),ec=t(67720);function Dashboard(){let[e,n]=(0,p.useState)(),[t,a]=(0,p.useState)(!0),[r,i]=(0,p.useState)(""),{setAllAdmins:l,setNetworks:o}=(0,_.O)();(0,p.useEffect)(()=>{a(!0);try{fetch("/directCommand",{headers:{Accept:"application/json","Content-Type":"application/json"},method:"POST",body:JSON.stringify({command:"status"})}).then(e=>e.json()).then(e=>{n(e),l(e.allowedAdmins),o(e.indexer),a(!1)})}catch(e){a(!1),console.error("error",e)}},[]),(0,p.useEffect)(()=>{fetch("https://api.ipify.org?format=json").then(e=>e.json()).then(e=>{i(e.ip)}).catch(e=>{console.error("Failed to fetch IP address:",e)})},[]);let d=[{id:null==e?void 0:e.id,ip:r,indexerData:null==e?void 0:e.indexer}],c=[];return e&&Object.keys(null==e?void 0:e.platform).forEach(n=>{let t={key:n,value:JSON.stringify(null==e?void 0:e.platform[n])};c.push(t)}),(0,s.jsxs)("div",{className:b().root,children:[(0,s.jsx)(AdminActions,{}),(0,s.jsx)("div",{className:b().bodyContainer,children:t?(0,s.jsx)("div",{className:b().loaderContainer,children:(0,s.jsx)(Spinner,{})}):(0,s.jsxs)("div",{className:b().body,children:[(0,s.jsx)(()=>(0,s.jsxs)(ed.Z,{p:2,children:[(0,s.jsx)(Y.Z,{variant:"h5",gutterBottom:!0,children:"NETWORK"}),(0,s.jsx)(ec.Z,{}),(0,s.jsxs)(ed.Z,{mt:2,mb:2,children:[(0,s.jsx)(Y.Z,{variant:"h6",children:"HTTP Status"}),(0,s.jsxs)(Y.Z,{variant:"body1",children:["HTTP - ",(null==e?void 0:e.http)?"UP":"DOWN"]})]}),(0,s.jsx)(ec.Z,{}),(0,s.jsxs)(ed.Z,{mt:2,mb:2,children:[(0,s.jsx)(Y.Z,{variant:"h6",children:"P2P Status"}),(0,s.jsxs)(Y.Z,{variant:"body1",children:["P2P - ",(null==e?void 0:e.p2p)?"UP":"DOWN"]})]}),(0,s.jsx)(ec.Z,{}),(0,s.jsxs)(ed.Z,{mt:2,mb:2,children:[(0,s.jsx)(Y.Z,{variant:"h6",children:"NODE ID"}),d.map(e=>(0,s.jsxs)(ed.Z,{display:"flex",alignItems:"center",mb:1,children:[(0,s.jsx)(Y.Z,{variant:"body1",className:b().node,children:e.id}),(0,s.jsx)(Copy,{text:null==e?void 0:e.id})]},e.id))]}),(0,s.jsx)(ec.Z,{}),(0,s.jsxs)(ed.Z,{mt:2,mb:2,children:[(0,s.jsx)(Y.Z,{variant:"h6",children:"Address"}),(0,s.jsxs)(ed.Z,{display:"flex",alignItems:"center",children:[(0,s.jsx)(Y.Z,{variant:"body1",className:b().node,children:null==e?void 0:e.address}),(0,s.jsx)(Copy,{text:null==e?void 0:e.address})]})]}),(0,s.jsx)(ec.Z,{}),(0,s.jsx)(ed.Z,{mt:2,children:(0,s.jsx)(NodePeers,{})})]}),{}),(0,s.jsx)(Indexer,{data:e}),(0,s.jsx)(SupportedNetworks_SupportedStorage,{data:e}),(0,s.jsx)(SupportedStorage,{data:e}),(0,s.jsx)(AdminAccounts,{}),(0,s.jsx)(NodePlatform,{platformData:c})]})})]})}function Home(){return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(l(),{children:[(0,s.jsx)("title",{children:"Ocean nodes"}),(0,s.jsx)("meta",{name:"description",content:"Ocean nodes dashboard"}),(0,s.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),(0,s.jsx)("link",{rel:"icon",href:"/favicon.ico"})]}),(0,s.jsx)("header",{children:(0,s.jsx)(Navigation,{})}),(0,s.jsx)("main",{children:(0,s.jsx)(Dashboard,{})}),(0,s.jsx)("footer",{children:(0,s.jsx)(components_Footer,{})})]})}},46085:function(e){e.exports={download:"Admin_download__ZZ4G0",unlockButton:"Admin_unlockButton__ke4Fn",buttonIcon:"Admin_buttonIcon___M4VS",loader:"Admin_loader__3WuLo",rotation:"Admin_rotation__lknWO",rotationBack:"Admin_rotationBack__qlWG_",root:"Admin_root__Q70by",title:"Admin_title__Xr7QQ",unauthorised:"Admin_unauthorised__6u5Bb"}},75368:function(e){e.exports={icon:"Copy_icon__BB7bs",feedback:"Copy_feedback__Wse_F",action:"Copy_action__IlKRq",button:"Copy_button__zsJoM"}},11706:function(e){e.exports={root:"Dashboard_root__SCu4R",bodyContainer:"Dashboard_bodyContainer__Fs5NF",body:"Dashboard_body__kpkou",details:"Dashboard_details__TI_cX",columnP2P:"Dashboard_columnP2P__0zKqU",columnHTTP:"Dashboard_columnHTTP__lhw_5",nodes:"Dashboard_nodes__7r0Ge",indexerQueueAlert:"Dashboard_indexerQueueAlert__iCMHE",borderBottom:"Dashboard_borderBottom__5pTDi",title29:"Dashboard_title29__TBf_2",title24:"Dashboard_title24__q5w52",nodeAddress:"Dashboard_nodeAddress__jgxgu",node:"Dashboard_node__UCu0_",indexer:"Dashboard_indexer__PpMWp",indexBlock:"Dashboard_indexBlock__Ng0C_",delayed:"Dashboard_delayed__3Tj7O",provider:"Dashboard_provider__wMZ4i",providerRow:"Dashboard_providerRow__k2QJ8",providerTitle:"Dashboard_providerTitle__5DXbm",loaderContainer:"Dashboard_loaderContainer__CAGjT",loader:"Dashboard_loader__p4KHC",rotation:"Dashboard_rotation__RIDl3"}},94428:function(e){e.exports={footerContainer:"style_footerContainer___mKsH",footerLinks:"style_footerLinks__1vBvO"}},30378:function(e){e.exports={navbarParent:"style_navbarParent__OgqE_",logoWrapper:"style_logoWrapper__ARfWA",connectButtonWrapper:"style_connectButtonWrapper__G4TF7"}},85108:function(e){e.exports={title24:"style_title24__8ssRQ",loaderContainer:"style_loaderContainer__dYPch",nodes:"style_nodes__ioZOx",nodeAddress:"style_nodeAddress__t2M8E"}},17044:function(e){e.exports={loader:"style_loader__s3fCW",rotation:"style_rotation__wALkg"}}},function(e){e.O(0,[5679,9774,2888,179],function(){return e(e.s=48312)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/dist/dashboard/index.html b/dist/dashboard/index.html deleted file mode 100644 index 0215a33c6..000000000 --- a/dist/dashboard/index.html +++ /dev/null @@ -1 +0,0 @@ -Ocean nodes
Ocean Node Logo
ADMIN ACTIONS
\ No newline at end of file diff --git a/docs/API.md b/docs/API.md index 89a054bf9..afbfb3276 100644 --- a/docs/API.md +++ b/docs/API.md @@ -203,7 +203,15 @@ returns amount of tokens to transfer to the provider account returns encrypted blob -#### Request +#### Query Parameters + +| name | type | required | description | +| --------------- | ------ | -------- | ------------------------------------------------------- | +| nonce | string | v | is required to verify a request paired with a signature | +| consumerAddress | string | v | consumer address | +| signature | string | v | signed message based on ` nonce` | + +#### Request body ``` string @@ -217,6 +225,44 @@ string --- +## EncryptFile + +### `HTTP` POST /api/services/encryptFile + +#### Description + +returns encrypted file + +#### Query Parameters + +| name | type | required | description | +| --------------- | ------ | -------- | ------------------------------------------------------- | +| nonce | string | v | is required to verify a request paired with a signature | +| consumerAddress | string | v | consumer address | +| signature | string | v | signed message based on ` nonce` | + +#### Request body + +if Content-Type = 'application/json' + +``` +BaseFileObject +``` + +if Content-Type = 'application/octet-stream' || 'multipart/form-data' + +``` +FileContent(bytes) +``` + +#### Response + +``` +0x123 +``` + +--- + ## Decrypt DDO ### `HTTP` POST /api/services/decrypt @@ -404,19 +450,58 @@ returns list of logs --- -## Advertise Did +## Get providers for a string -### `HTTP` GET /advertiseDid/?did=did:op:123" +### `HTTP` GET /getProvidersForString/?input=did:op:123" #### Description -returns empty if advertising did around peers was successful +returns list of nodes providing the specific element(s) (dids, c2d resources, etc) #### Query Parameters -| name | type | required | description | -| ---- | ------ | -------- | ------------------ | -| did | string | v | document id or did | +| name | type | required | description | +| ----- | ------ | -------- | ---------------------- | +| input | string | v | did, c2d resource, etc | + +## Get providers for a list of strings + +### `HTTP` POST /getProvidersForStrings?timeout=10" + +#### Description + +returns list of nodes providing all specific elements. + +#### Query Parameters + +| name | type | required | description | +| ------- | ------ | -------- | ---------------------- | +| timeout | string | optional | timeout in miliseconds | + +#### Request + +```json +["{\"c2d\":{\"free\":false,\"disk\":1}}", "{\"c2d\":{\"free\":false,\"cpu\":1}}"] +``` + +#### Response + +```json +[ + { + "id": "16Uiu2HAmENNgCY1QAdQrPxipgUCQjyookUgpnbgXua4ZMju4Rkou", + "multiaddrs": [ + "/ip4/10.255.255.254/tcp/41015/ws", + "/ip4/10.255.255.254/tcp/41347", + "/ip4/127.0.0.1/tcp/41015/ws", + "/ip4/127.0.0.1/tcp/41347", + "/ip4/172.27.58.101/tcp/41015/ws", + "/ip4/172.27.58.101/tcp/41347", + "/ip6/::1/tcp/37527" + ] + } +] +``` --- @@ -449,42 +534,58 @@ returns P2P peer --- -## Get P2P Peers +## find peer multiaddress -### `HTTP` GET /getP2PPeers +### `HTTP` GET /findPeer/? #### Description -returns list of all P2P peers +returns P2P peer multiaddresses if found in DHT + +#### Query Parameters + +| name | type | required | description | +| ------- | ------ | -------- | ----------- | +| peerId | string | v | peer id | +| timeout | int | optional | timeout | #### Response ``` -[ - { - "id": "PeerId", - "addresses": [{ multiaddr: "123", isCertified: true }], - "protocols": ["123", "123", "123"], - "metadata": {}, - "tags": {} - } -] +{ + "id": "16Uiu2HAmLhRDqfufZiQnxvQs2XHhd6hwkLSPfjAQg1gH8wgRixiP", + "multiaddrs": [ + "/ip4/127.0.0.1/tcp/9000", + "/ip4/127.0.0.1/tcp/9001/ws", + "/ip4/172.18.0.2/tcp/9000", + "/ip4/172.18.0.2/tcp/9001/ws", + "/ip6/::1/tcp/9002" + ] +} ``` --- -## Get Ocean Peers +## Get P2P Peers -### `HTTP` GET /getOceanPeers +### `HTTP` GET /getP2PPeers #### Description -returns list of ocean node peers +returns list of all P2P peers #### Response ``` -["PeerId", "PeerId", "PeerId"] +[ + { + "id": "PeerId", + "addresses": [{ multiaddr: "123", isCertified: true }], + "protocols": ["123", "123", "123"], + "metadata": {}, + "tags": {} + } +] ``` --- @@ -501,13 +602,14 @@ returns an empty object if it is valid otherwise an array with error #### Parameters -| name | type | required | description | -| ---------- | ------ | -------- | ------------------------------------------------- | -| command | string | v | command name | -| node | string | | if not present it means current node | -| id | string | v | document id or did | -| chainId | number | v | chain id of network on which document is provided | -| nftAddress | string | v | address of nft token | +| name | type | required | description | +| ---------- | -------- | -------- | ------------------------------------------------- | +| command | string | v | command name | +| node | string | | if not present it means current node | +| multiAddrs | string[] | | if passed, use this instead of peerStore & DHT | +| id | string | v | document id or did | +| chainId | number | v | chain id of network on which document is provided | +| nftAddress | string | v | address of nft token | #### Request @@ -1078,38 +1180,6 @@ byte array --- -## Echo - -### `HTTP` POST /directCommand - -### `P2P` command: echo - -#### Description - -returns OK - -#### Parameters - -| name | type | required | description | -| ------- | ------ | -------- | ------------------------------------ | -| command | string | v | command name | -| node | string | | if not present it means current node | - -#### Request - -```json -{ - "command": "echo", - "node": "PeerId" -} -``` - -#### Response - -``` -OK -``` - ## Get indexing queue ### `HTTP` GET /api/services/indexQueue @@ -1128,7 +1198,7 @@ returns the current indexing queue, as an array of objects ## PolicyServer Passthrough -### `HTTP` POST /PolicyServerPassthrough +### `HTTP` POST /api/services/PolicyServerPassthrough ### `P2P` command: PolicyServerPassthrough @@ -1173,3 +1243,344 @@ Forwards request to PolicyServer (if any) } } ``` + +--- + +## Fetch Config + +### `HTTP` GET /api/admin/config + +#### Description + +returns current node configuration with sensitive data hidden (admin only) + +#### Parameters + +| name | type | required | description | +| --------------- | ------ | -------- | -------------------------------------------- | +| expiryTimestamp | number | v | expiry timestamp for the request | +| signature | string | v | signed message to authenticate admin request | + +#### Request + +```json +{ + "expiryTimestamp": 1234567890, + "signature": "0x123" +} +``` + +#### Response + +```json +{ + "keys": { + "privateKey": "[*** HIDDEN CONTENT ***]" + }, + "chainIds": [1], + "rpcs": { "1": "https://eth-mainnet.g.alchemy.com/v2/..." }, + "...": "..." +} +``` + +--- + +## Update Config + +### `HTTP` POST /api/admin/config/update + +#### Description + +updates node configuration and reloads it gracefully (admin only) + +#### Parameters + +| name | type | required | description | +| --------------- | ------ | -------- | -------------------------------------------------- | +| expiryTimestamp | number | v | expiry timestamp for the request | +| signature | string | v | signed message to authenticate admin request | +| config | object | v | partial configuration object with fields to update | + +#### Request + +```json +{ + "expiryTimestamp": 1234567890, + "signature": "0x123", + "config": { + "chainIds": [1], + "rpcs": { "1": "https://eth-mainnet.g.alchemy.com/v2/..." } + } +} +``` + +#### Response + +```json +{ + "keys": { + "privateKey": "[*** HIDDEN CONTENT ***]" + }, + "chainIds": [1], + "rpcs": { "1": "https://eth-mainnet.g.alchemy.com/v2/..." }, + "...": "..." +} +``` + +--- + +# Compute + +For starters, you can find a list of algorithms in the [Ocean Algorithms repository](https://github.com/oceanprotocol/algo_dockers) and the docker images in the [Algo Dockerhub](https://hub.docker.com/r/oceanprotocol/algo_dockers/tags). + +## Compute object definitions + +### Dataset (`ComputeAsset` Interface) + +The `ComputeAsset` interface defines the structure of a compute asset in the Ocean Node. It can include information about the file object, document ID, service ID, transfer transaction ID, and user data. + +#### Properties + +- **fileObject**: Optional. An object of type `BaseFileObject` representing the file associated with the compute asset. +- **documentId**: Optional. A string representing the document ID of the compute asset. +- **serviceId**: Optional. A string representing the service ID associated with the compute asset. +- **transferTxId**: Optional. A string representing the transaction ID for the transfer of the compute asset. +- **userdata**: Optional. An object containing additional user-defined data related to the compute asset. + +```typescript +export interface ComputeAsset { + fileObject?: BaseFileObject + documentId?: string + serviceId?: string + transferTxId?: string + userdata?: { [key: string]: any } +} +``` + +This interface is used to encapsulate the details of a compute asset, which can be utilized in various compute-related operations within the Ocean Node. + +### `ComputeAlgorithm` Interface + +The `ComputeAlgorithm` interface defines the structure of a compute algorithm in the Ocean Node. +It can include information about the file object, document ID, service ID, transfer transaction ID, algorithm custom data, metadata and user data. + +#### Properties + +- **documentId**: Optional. A string representing the document ID of the compute algorithm. +- **serviceId**: Optional. A string representing the service ID associated with the compute algorithm. +- **fileObject**: Optional. An object of type `BaseFileObject` representing the file associated with the compute algorithm. +- **meta**: Optional. An object of type `MetadataAlgorithm` containing metadata related to the compute algorithm. +- **transferTxId**: Optional. A string representing the transaction ID for the transfer of the compute algorithm. +- **algocustomdata**: Optional. An object containing additional custom data related to the compute algorithm. +- **userdata**: Optional. An object containing additional user-defined data related to the compute algorithm. +- **envs**: Optional. Array of keys:values to be used as environment variables for algo. + +```typescript +export interface ComputeAlgorithm { + documentId?: string + serviceId?: string + fileObject?: BaseFileObject + meta?: MetadataAlgorithm + transferTxId?: string + algocustomdata?: { [key: string]: any } + userdata?: { [key: string]: any } +} +``` + +This interface is used to encapsulate the details of a compute algorithm, which can be utilized in various compute-related operations within the Ocean Node. + +## Compute commands + +### `HTTP` GET /api/services/computeEnvironments + +### `P2P` command: getComputeEnvironments + +#### Description + +fetch all compute environments + +#### Response + +```json +[ + { + "id": "0x7d187e4c751367be694497ead35e2937ece3c7f3b325dcb4f7571e5972d092bd-0xf173fdc0a9c7cc1c34f8aaf6b3aafe866795851b567436e1d4fbab17b0e26ca1", + "runningJobs": 0, + "consumerAddress": "0xf9C5B7eE7708efAc6dC6Bc7d4b0455eBbf22b519", + "platform": { "architecture": "x86_64", "os": "Ubuntu 22.04.3 LTS" }, + "fees": { "1": [[{ "feeToken": "0x123", "prices": [{ "id": "cpu", "price": 1 }] }]] }, + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "resources": [ + { "id": "cpu", "total": 16, "max": 16, "min": 1, "inUse": 0 }, + { + "id": "ram", + "total": 33617674240, + "max": 33617674240, + "min": 1000000000, + "inUse": 0 + }, + { "id": "disk", "total": 1000000000, "max": 1000000000, "min": 0, "inUse": 0 } + ], + "free": { + "maxJobDuration": 60, + "minJobDuration": 10, + "maxJobs": 3, + "resources": [ + { "id": "cpu", "max": 1, "inUse": 0 }, + { "id": "ram", "max": 1000000000, "inUse": 0 }, + { "id": "disk", "max": 1000000000, "inUse": 0 } + ] + }, + "runningfreeJobs": 0 + } +] +``` + +### `HTTP` POST /api/services/freeCompute + +### `P2P` command: freeStartCompute + +#### Description + +starts a free compute job and returns jobId if succesfull + +#### Parameters + +| name | type | required | description | +| ----------------- | ------ | -------- | ----------------------------------------------------------------------------- | +| command | string | v | command name | +| node | string | | if not present it means current node | +| consumerAddress | string | v | consumer address | +| signature | string | v | signature (msg=String(nonce) ) | +| nonce | string | v | nonce for the request | +| datasets | object | | list of ComputeAsset to be used as inputs | +| algorithm | object | | ComputeAlgorithm definition | +| environment | string | v | compute environment to use | +| resources | object | | optional list of required resources | +| metadata | object | | optional metadata for the job, data provided by the user | +| additionalViewers | object | | optional array of addresses that are allowed to fetch the result | +| queueMaxWaitTime | number | | optional max time in seconds a job can wait in the queue before being started | + +#### Request + +```json +{ + "command": "freeStartCompute", + "datasets": [], + "algorithm": { + "meta": { "container": { "image": "ubuntu", "entrypoint": "/bin/bash'" } } + }, + "consumerAddress": "0x00", + "signature": "123", + "nonce": 1, + "environment": "0x7d187e4c751367be694497ead35e2937ece3c7f3b325dcb4f7571e5972d092bd-0xbeaf12703d708f39ef98c3d8939ce458553254176dbb69fe83d535883c4cee38", + "resources": [{ "id": "cpu", "amount": 1 }], + "metadata": { "key": "value" } +} +``` + +#### Response + +```json +[ + { + "owner": "0x00", + "jobId": "0x7d187e4c751367be694497ead35e2937ece3c7f3b325dcb4f7571e5972d092bd-a4ad237d-dfd8-404c-a5d6-b8fc3a1f66d3", + "dateCreated": "1742291065.119", + "dateFinished": null, + "status": 0, + "statusText": "Job started", + "results": [], + "agreementId": null, + "expireTimestamp": 1742291065.119, + "environment": "0x7d187e4c751367be694497ead35e2937ece3c7f3b325dcb4f7571e5972d092bd-0xf173fdc0a9c7cc1c34f8aaf6b3aafe866795851b567436e1d4fbab17b0e26ca1", + "resources": [ + { "id": "cpu", "amount": 1 }, + { "id": "ram", "amount": 1000000000 }, + { "id": "disk", "amount": 0 } + ], + "isFree": true, + "metadata": { "key": "value" } + } +] +``` + +### `HTTP` GET /api/services/compute + +### `P2P` command: getComputeStatus + +#### Description + +returns job status + +#### Parameters + +Required at least one of the following parameters: + +| name | type | required | description | +| --------------- | ------ | -------- | ------------------------------------ | +| consumerAddress | string | | consumer address to use as filter | +| jobId | string | | jobId address to use as filter | +| agreementId | string | | agreementId address to use as filter | + +#### Response + +```json +[ + { + "owner": "0x00", + "did": null, + "jobId": "a4ad237d-dfd8-404c-a5d6-b8fc3a1f66d3", + "dateCreated": "1742291065.119", + "dateFinished": null, + "status": 0, + "statusText": "Job started", + "results": [], + "inputDID": null, + "algoDID": null, + "agreementId": null, + "expireTimestamp": 1742291065.119, + "environment": "0x7d187e4c751367be694497ead35e2937ece3c7f3b325dcb4f7571e5972d092bd-0xf173fdc0a9c7cc1c34f8aaf6b3aafe866795851b567436e1d4fbab17b0e26ca1", + "resources": [ + { + "id": "cpu", + "amount": 1 + }, + { + "id": "ram", + "amount": 1000000000 + }, + { + "id": "disk", + "amount": 1000000000 + } + ], + "isFree": true, + "metadata": { "key": "value" } + } +] +``` + +### `HTTP` GET /api/services/computeResult + +### `P2P` command: getComputeResult + +#### Description + +returns job result + +#### Parameters + +| name | type | required | description | +| --------------- | ------ | -------- | -------------------------------------------------------------- | +| consumerAddress | string | v | consumer address to use as filter | +| jobId | string | v | jobId address to use as filter | +| signature | string | v | signature (consumerAddress + jobId + index.toString() + nonce) | +| nonce | string | v | nonce for the request | +| index | number | v | index of result (0 for main result, 1 for logs) | + +#### Response + +File content diff --git a/docs/Arhitecture.md b/docs/Arhitecture.md index 18382205a..8b4e47c55 100644 --- a/docs/Arhitecture.md +++ b/docs/Arhitecture.md @@ -69,12 +69,19 @@ Nodes lip2p implementation: ## 4.1 Indexer An off-chain, multi-chain metadata & chain events cache. It continually monitors the chains for well known events and caches them. (V4 equivalence: Aquarius) -Features: +**Architecture:** + - **Single-threaded, non-blocking design**: Uses Node.js async/await for concurrent execution across multiple chains + - **ChainIndexer instances**: Each blockchain network is monitored by a dedicated ChainIndexer instance running concurrently via the event loop + - **Event-driven communication**: Components communicate through EventEmitter for clean separation of concerns + - **Efficient I/O handling**: All RPC calls, database operations, and network requests are non-blocking, allowing high concurrency without worker threads + +**Features:** - monitors MetadataCreated & MetadataUpdated and stores DDO - validates DDO, according to multiple SHACL schemas - provides proof for valid DDOs - monitors datatokens contracts & stores orders - allows querys for all the above + - supports graceful shutdown and chain-specific reindexing ## 4.2 Provider - Performs checks on chain for buyer permissions and payments diff --git a/docs/C2DV2.md b/docs/C2DV2.md deleted file mode 100644 index 1a835f81b..000000000 --- a/docs/C2DV2.md +++ /dev/null @@ -1,186 +0,0 @@ -# C2D V2 ARHITECTURE - -C2Dv2 continues the concept of bringing algo to the data, allowing both public and private use of datasets for use with algorithms. -Although the previous versions was relying on external components (Provider -> Operator Service (running in k8) -> multiple Operator-Engines (each running in it's own k8 namespace)), C2DV2 is embedded entirely in ocean-node. - -It has a modular approach, allowing multiple compute engines to be connected to the same ocean-node engine. This compute engines can be internal (docker or k8 (if ocean-node runs in a k8 env)), or external (in future, we could integrate projects like Bachalau, iExec, etc (TBD)) - -### Additional features - -- allow multiple c2d engines connected to same ocean-node -- allow multiple jobs(stages) in a workflow -- a job can depend(or not) on a previous stage -> parallel/serial jobs - -![No image](imgs/c2dv2-modules.png 'Arhitecture') - -## Workflows - -A workflow defines one or more jobs to be executed. Each job may have dependencies from a previous job - -``` -[ - index: number - jobId: generated by orchestrator - runAfter: if defined, wait for specific jobId to finish - input: [ - index: number - did?: string - serviceId?: string, - files?: filesObject - ], - algorithm: { - did?: string - serviceId?: string - files?: filesObject - rawcode?: string - container?: { - entrypoint: string - image: string - tag: string - } - } -] -``` - -## Orchestration layer - -Former known as "operator-service", this layer handles interactions between ocean-node core layer and different execution environments. - -In a nutshell, it should: - -- exposing list of compute environments for all engines -- exposing list of running jobs and limits (max concurrent jobs, etc) -- take a new job (created by startJob core handler) -- determine which module to use (docker, k8, Bachalau, etc) -- insert workflow in database -- signal engine handler to take over the job execution -- read workflow status when c2d getStatus core is called -- serve job results when c2d getJobResult is called - -Since, due to technical constrains, both internal modules (docker and k8) will use docker images for data provisioning (old pod-configuration) and results publishing (old pod-publishing), orchestration layer will also expose two new core commands: - -- c2dJobStatusUpdate (called by both pod-config and pob-publishing to update job status) -- c2dJobPublishResult (called by pod-publishing when results have to be uploaded) - -When any of pod-\*\* will call one of those endpoints, we must verify the signature and respond accordingly - -### Payment flow in Orchestration - -Will be based on a escrow contract. -Orchestrator will: - -- compute sum(maxDuration) from all jobs in the workflow -- calculate required fee (depend on previous step, token, environment, etc) -- lock amount in escrow contract -- wait until all jobs are finished (success or not) -- calculate actual duration spent -- compute proof -- withdraw payment & put proof and release the difference back to the customer. - -## C2D Engines - -A C2D Engine is a piece of code that handles c2d jobs that are running on a specific orchestration implementation. - -This documents focuses on internal compute engines: - Docker based (host with docker environment installed) - K8 based (if ocean-node runs inside a k8 cluster) - -An engine that uses external services (like Bachalau) has the same logic, but mostly likely will interact with remote APIs - -An engine is responsible for: - -- store workflows and each job status (so, on restart we can resume flows or continue running flow) -- queue new jobs - -### Docker engine - -This module requires docker service installed at the host level. - -It will leverage Docker API to: - -- create job volume (with quotas) -- start provisioning container (aka pod-configuration) -- monitor it's status -- create yml for algo, with hw constrains (cpu,ram) -- pass devices for gpu envs -- start algorithm container -- monitor algo health & timeout constrains -- stop algo if quota is exceeded -- start publishing container -- delete job volume - -``` -title C2Dv2 message flow for docker module -User -> Ocean-node: start c2d job -Ocean-node -> Orchestration-class: start c2d job -Orchestration-class -> Orchestration-class: determinte module and insert workflow, random private key in db -Orchestration-class -> Docker-engine: queue job -Docker-engine -> Docker_host_api: create job volume -Docker-engine -> Docker-engine: create yaml for pod-configuration, set private key -Docker-engine -> Docker_host_api: start pod-configuration -Pod_configuration -> Pod_configuration: starts ocean-node as pod-config -Pod_configuration -> Ocean-node: call c2dJobProvision -Ocean-node -> Pod_configuration: return workflow -Pod_configuration -> Pod_configuration : download inputs & algo -Pod_configuration -> Ocean-node: call c2dJobStatusUpdate -Ocean-node -> Docker-engine: download success, start algo -Docker-engine -> Docker-engine: create yaml for algo -Docker-engine -> Docker_host_api: start algo container -Docker-engine -> Docker-engine: monitor algo container, stop if timeout -Docker-engine -> Docker-engine: create yaml for pod-publishing, set private key -Docker-engine -> Docker_host_api: start pod-publishing -Docker_host_api -> Pod-Publishing: start as docker container -Pod-Publishing -> Pod-Publishing : prepare output -Pod-Publishing -> Ocean-node: call c2dJobPublishResult -Pod-Publishing -> Ocean-node: call c2dJobStatusUpdate - - -``` - -![No image](imgs/C2Dv2_message_flow_for_docker_module.png 'Arhitecture') - -### kubernetes engine - -This module requires access to k8 credentials (or autodetect them if ocean-node already runs in a k8 cluster). - -It will leverage K8 API to: - -- create job volume (with quotas) -- start provisioning container (aka pod-configuration) -- monitor it's status -- create yml for algo, with hw constrains (cpu,ram) -- pass devices for gpu envs -- start algorithm container -- monitor algo health & timeout constrains -- stop algo if quota is exceeded -- start publishing container -- delete job volume - -## POD-\* common description - -For a efficient communication between ocean-node and the two containers, the easiest way is to use p2p/http api. -Thus, all pod-\* will run a ocean-node instance (each will have a job generated random key), and they will connect to the main ocean-node instance. Main ocean-node instance peerNodeId or http API endpoint will be inserted in yaml. -Each pod-\*\* will use a private key, also exposed in yaml. - -So, each yml of pod-\* will contain the following envs: - nodePeerId ? - nodeHttpApi ? - privateKey - -### Pod-configuration - -In the past, pod-configuration was a standalone repo, built as docker image. -In this implementation, it will be ocean-node, with a different entrypoint (entry_configuration.js) - -Implementation: - -- call ocean-node/c2dJobProvision and get workflow's input section -- download all assets -- call ocean-node/c2dJobStatusUpdate core command to update status (provision finished or errors) - -### Pod-publishing - -In the past, pod-publishing was a standalone repo, built as docker image. -In this implementation, it will be ocean-node, with a different entrypoint (entry_publishing.js) - -Implementation: - -- read output folder -- if multiples files or folders are detected, create a zip with all those files/folders -- call ocean-node/c2dJobPublishResult core command and let ocean-node handle storage -- call ocean-node/c2dJobStatusUpdate core command to update job as done diff --git a/docs/GPU.md b/docs/GPU.md new file mode 100644 index 000000000..bbf36d210 --- /dev/null +++ b/docs/GPU.md @@ -0,0 +1,715 @@ +Supporting GPUs for c2d jobs comes down to: + +- define gpu list for each c2d env +- pass docker args for each gpu +- set a price for each gpu (see [Compute pricing](compute-pricing.md) for pricing units and examples) + +## Nvidia GPU Example + +Start by installing nvidia cuda drivers (ie:https://docs.nvidia.com/cuda/cuda-installation-guide-linux/), then install nvidia container toolkit (https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) + +Once that is done, check if you can get gpu details by running 'nvidia-smi': + +``` +root@gpu-1:/repos/ocean/ocean-node# nvidia-smi +Fri Apr 25 06:00:34 2025 ++-----------------------------------------------------------------------------------------+ +| NVIDIA-SMI 550.163.01 Driver Version: 550.163.01 CUDA Version: 12.4 | +|-----------------------------------------+------------------------+----------------------+ +| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | +| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | +| | | MIG M. | +|=========================================+========================+======================| +| 0 NVIDIA GeForce GTX 1060 3GB Off | 00000000:01:00.0 Off | N/A | +| 0% 39C P8 6W / 120W | 2MiB / 3072MiB | 0% Default | +| | | N/A | ++-----------------------------------------+------------------------+----------------------+ + ++-----------------------------------------------------------------------------------------+ +| Processes: | +| GPU GI CI PID Type Process name GPU Memory | +| ID ID Usage | +|=========================================================================================| +| No running processes found | ++-----------------------------------------------------------------------------------------+ +``` + +Now, time to get the id of the gpu: + +```bash +root@gpu-1:/repos/ocean/ocean-node# nvidia-smi --query-gpu=name,uuid --format=csv +name, uuid +NVIDIA GeForce GTX 1060 3GB, GPU-294c6802-bb2f-fedb-f9e0-a26b9142dd81 +``` + +Now, we can define the gpu for node: + +```json +{ + "id": "myGPU", + "description": "NVIDIA GeForce GTX 1060 3GB", + "type": "gpu", + "total": 1, + "init": { + "deviceRequests": { + "Driver": "nvidia", + "DeviceIDs": ["GPU-294c6802-bb2f-fedb-f9e0-a26b9142dd81"], + "Capabilities": [["gpu"]] + } + } +} +``` + +Don't forget to add it to fees definition and free definition (if desired). + +Here is the full definition of DOCKER_COMPUTE_ENVIRONMENTS: + +```json +[ + { + "socketPath": "/var/run/docker.sock", + "resources": [ + { + "id": "myGPU", + "description": "NVIDIA GeForce GTX 1060 3GB", + "type": "gpu", + "total": 1, + "init": { + "deviceRequests": { + "Driver": "nvidia", + "DeviceIDs": ["GPU-294c6802-bb2f-fedb-f9e0-a26b9142dd81"], + "Capabilities": [["gpu"]] + } + } + }, + { "id": "disk", "total": 1 } + ], + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "fees": { + "1": [ + { + "feeToken": "0x123", + "prices": [ + { "id": "cpu", "price": 1 }, + { "id": "nyGPU", "price": 3 } + ] + } + ] + }, + "free": { + "maxJobDuration": 60, + "minJobDuration": 10, + "maxJobs": 3, + "resources": [ + { "id": "cpu", "max": 1 }, + { "id": "ram", "max": 1 }, + { "id": "disk", "max": 1 }, + { "id": "myGPU", "max": 1 } + ] + } + } +] +``` + +And you should have it in your compute envs: + +```bash +root@gpu-1:/repos/ocean/ocean-node# curl http://localhost:8000/api/services/computeEnvironments +``` + +```json +[ + { + "id": "0xd6b10b27aab01a72070a5164c07d0517755838b9cb9857e2d5649287ec3aaaa2-0x66073c81f833deaa2f8e2a508f69cf78f8a99b17ba1a64f369af921750f93914", + "runningJobs": 0, + "consumerAddress": "0x00", + "platform": { "architecture": "x86_64", "os": "Ubuntu 22.04.3 LTS" }, + "fees": { + "1": [ + { + "feeToken": "0x123", + "prices": [ + { "id": "cpu", "price": 1 }, + { "id": "myGPU", "price": 3 } + ] + } + ] + }, + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "resources": [ + { "id": "cpu", "total": 8, "max": 8, "min": 1, "inUse": 0 }, + { + "id": "ram", + "total": 23, + "max": 23, + "min": 1, + "inUse": 0 + }, + { + "id": "myGPU", + "description": "NVIDIA GeForce GTX 1060 3GB", + "type": "gpu", + "total": 1, + "init": { + "deviceRequests": { + "Driver": "nvidia", + "DeviceIDs": ["GPU-294c6802-bb2f-fedb-f9e0-a26b9142dd81"], + "Capabilities": [["gpu"]] + } + }, + "max": 1, + "min": 0, + "inUse": 0 + }, + { "id": "disk", "total": 1, "max": 1, "min": 0, "inUse": 0 } + ], + "free": { + "maxJobDuration": 60, + "minJobDuration": 10, + "maxJobs": 3, + "resources": [ + { "id": "cpu", "max": 1, "inUse": 0 }, + { "id": "ram", "max": 1, "inUse": 0 }, + { "id": "disk", "max": 1, "inUse": 0 }, + { "id": "myGPU", "max": 1, "inUse": 0 } + ] + }, + "runningfreeJobs": 0 + } +] +``` + +Start a free job using: + +```json +{ + "command": "freeStartCompute", + "algorithm": { + "meta": { + "container": { + "image": "tensorflow/tensorflow", + "tag": "2.17.0-gpu", + "entrypoint": "python $ALGO" + }, + "rawcode": "import tensorflow as tf\nsess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(log_device_placement=True))\nprint(\"Num GPUs Available: \", len(tf.config.list_physical_devices('GPU')))\ngpus = tf.config.list_physical_devices('GPU')\nfor gpu in gpus:\n\tprint('Name:', gpu.name, ' Type:', gpu.device_type)" + } + }, + "consumerAddress": "0x00", + "signature": "123", + "nonce": 1, + "environment": "0xd6b10b27aab01a72070a5164c07d0517755838b9cb9857e2d5649287ec3aaaa2-0x66073c81f833deaa2f8e2a508f69cf78f8a99b17ba1a64f369af921750f93914", + "resources": [ + { + "id": "cpu", + "amount": 1 + }, + { + "id": "myGPU", + "amount": 1 + } + ] +} +``` + +And the output of `getComputeResult` should look like: + +```bash +2025-04-25 06:18:20.890217: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered +2025-04-25 06:18:21.192330: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered +2025-04-25 06:18:21.292230: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered +WARNING: All log messages before absl::InitializeLog() is called are written to STDERR +I0000 00:00:1745561915.985558 1 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 +I0000 00:00:1745561915.993514 1 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 +I0000 00:00:1745561915.993799 1 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 +Num GPUs Available: 1 +Name: /physical_device:GPU:0 Type: GPU +``` + +## AMD Radeon 9070 XT ON WSL2 + +First, install ROCm (https://rocm.docs.amd.com/projects/radeon/en/latest/docs/install/wsl/install-radeon.html) + +Then define DOCKER_COMPUTE_ENVIRONMENTS with + +```json +[ + { + "socketPath": "/var/run/docker.sock", + "resources": [ + { + "id": "myGPU", + "description": "AMD Radeon RX 9070 XT", + "type": "gpu", + "total": 1, + "init": { + "advanced": { + "IpcMode": "host", + "ShmSize": 8589934592, + "CapAdd": ["SYS_PTRACE"], + "Devices": ["/dev/dxg", "/dev/dri/card0"], + "Binds": [ + "/usr/lib/wsl/lib/libdxcore.so:/usr/lib/libdxcore.so", + "/opt/rocm/lib/libhsa-runtime64.so.1:/opt/rocm/lib/libhsa-runtime64.so.1" + ], + "SecurityOpt": { + "seccomp": "unconfined" + } + } + } + }, + { + "id": "disk", + "total": 1 + } + ], + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "fees": { + "1": [ + { + "feeToken": "0x123", + "prices": [ + { + "id": "cpu", + "price": 1 + }, + { + "id": "nyGPU", + "price": 3 + } + ] + } + ] + }, + "free": { + "maxJobDuration": 60, + "minJobDuration": 10, + "maxJobs": 3, + "resources": [ + { + "id": "cpu", + "max": 1 + }, + { + "id": "ram", + "max": 1 + }, + { + "id": "disk", + "max": 1 + }, + { + "id": "myGPU", + "max": 1 + } + ] + } + } +] +``` + +aka + +```bash +export DOCKER_COMPUTE_ENVIRONMENTS="[{\"socketPath\":\"/var/run/docker.sock\",\"resources\":[{\"id\":\"myGPU\",\"description\":\"AMD Radeon RX 9070 XT\",\"type\":\"gpu\",\"total\":1,\"init\":{\"advanced\":{ +\"IpcMode\":\"host\",\"CapAdd\":[\"CAP_SYS_PTRACE\"],\"Devices\":[\"/dev/dxg\",\"/dev/dri/card0\"],\"Binds\":[\"/usr/lib/wsl/lib/libdxcore.so:/usr/lib/libdxcore.so\",\"/opt/rocm/lib/libhsa-runtime64.so.1:/opt/rocm/lib/libhsa-runtime64.so.1\"],\"SecurityOpt\":{\"seccomp\":\"unconfined\"}}}},{\"id\":\"disk\",\"total\":10}],\"storageExpiry\":604800,\"maxJobDuration\":3600,\"minJobDuration\":60,\"fees\":{\"1\":[{\"feeToken\":\"0x123\",\"prices\":[{\"id\":\"cpu\",\"price\":1},{\"id\":\"nyGPU\",\"price\":3}]}]},\"free\":{\"maxJobDuration\":60,\"minJobDuration\":10,\"maxJobs\":3,\"resources\":[{\"id\":\"cpu\",\"max\":1},{\"id\":\"ram\",\"max\":1},{\"id\":\"disk\",\"max\":1},{\"id\":\"myGPU\",\"max\":1}]}}]" +``` + +you should have it in your compute envs: + +```bash +root@gpu-1:/repos/ocean/ocean-node# curl http://localhost:8000/api/services/computeEnvironments +``` + +```json +[ + { + "id": "0xbb5773e734e1b188165dac88d9a3dc8ac28bc9f5624b45fa8bbd8fca043de7c1-0x2c2761f938cf186eeb81f71dee06ad7edb299493e39c316c390d0c0691e6585c", + "runningJobs": 0, + "consumerAddress": "0x00", + "platform": { + "architecture": "x86_64", + "os": "Ubuntu 24.04.2 LTS" + }, + "fees": { + "1": [ + { + "feeToken": "0x123", + "prices": [ + { + "id": "cpu", + "price": 1 + }, + { + "id": "nyGPU", + "price": 3 + } + ] + } + ] + }, + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "resources": [ + { + "id": "cpu", + "total": 16, + "max": 16, + "min": 1, + "inUse": 0 + }, + { + "id": "ram", + "total": 31, + "max": 31, + "min": 1, + "inUse": 0 + }, + { + "id": "myGPU", + "description": "AMD Radeon RX 9070 XT", + "type": "gpu", + "total": 1, + "init": { + "advanced": { + "IpcMode": "host", + "CapAdd": ["CAP_SYS_PTRACE"], + "Devices": ["/dev/dxg", "/dev/dri/card0"], + "Binds": [ + "/usr/lib/wsl/lib/libdxcore.so:/usr/lib/libdxcore.so", + "/opt/rocm/lib/libhsa-runtime64.so.1:/opt/rocm/lib/libhsa-runtime64.so.1" + ], + "SecurityOpt": { + "seccomp": "unconfined" + } + } + }, + "max": 1, + "min": 0, + "inUse": 0 + }, + { + "id": "disk", + "total": 10, + "max": 10, + "min": 0, + "inUse": 0 + } + ], + "free": { + "maxJobDuration": 60, + "minJobDuration": 10, + "maxJobs": 3, + "resources": [ + { + "id": "cpu", + "max": 1, + "inUse": 0 + }, + { + "id": "ram", + "max": 1, + "inUse": 0 + }, + { + "id": "disk", + "max": 1, + "inUse": 0 + }, + { + "id": "myGPU", + "max": 1, + "inUse": 0 + } + ] + }, + "runningfreeJobs": 0 + } +] +``` + +Start a free job with + +```json +{ + "command": "freeStartCompute", + "datasets": [ + { + "fileObject": { + "type": "url", + "url": "https://raw.githubusercontent.com/oceanprotocol/test-algorithm/master/javascript/algo.js", + "method": "get" + } + } + ], + "algorithm": { + "meta": { + "container": { + "image": "rocm/tensorflow", + "tag": "rocm6.4-py3.12-tf2.18-dev", + "entrypoint": "python $ALGO" + }, + "rawcode": "import tensorflow as tf\nsess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(log_device_placement=True))\nprint(\"Num GPUs Available: \", len(tf.config.list_physical_devices('GPU')))\ngpus = tf.config.list_physical_devices('GPU')\nfor gpu in gpus:\n\tprint('Name:', gpu.name, ' Type:', gpu.device_type)" + } + }, + "consumerAddress": "0x00", + "signature": "123", + "nonce": 1, + "environment": "0xbb5773e734e1b188165dac88d9a3dc8ac28bc9f5624b45fa8bbd8fca043de7c1-0x2c2761f938cf186eeb81f71dee06ad7edb299493e39c316c390d0c0691e6585c", + "resources": [ + { + "id": "cpu", + "amount": 1 + }, + { + "id": "myGPU", + "amount": 1 + } + ] +} +``` + +and get the results + +```bash +2025-04-25 15:16:15.218050: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. +To enable the following instructions: SSE3 SSE4.1 SSE4.2 AVX AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. +WARNING: All log messages before absl::InitializeLog() is called are written to STDERR +I0000 00:00:1745594260.720023 1 gpu_device.cc:2022] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 2874 MB memory: -> device: 0, name: AMD Radeon RX 9070 XT, pci bus id: 0000:0d:00.0 +2025-04-25 15:17:44.018225: I tensorflow/core/common_runtime/direct_session.cc:378] Device mapping: +/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: AMD Radeon RX 9070 XT, pci bus id: 0000:0d:00.0 + +Num GPUs Available: 1 +Name: /physical_device:GPU:0 Type: GPU +Warning: Resource leak detected by SharedSignalPool, 385 Signals leaked. +pid:1 tid:0x7f4476ac1740 [~VaMgr] frag_map_ size is not 1. +``` + +## Intel Arc GPU Example + +First, install Intel GPU drivers (https://dgpu-docs.intel.com/driver/installation.html), then install Intel container toolkit (https://github.com/intel/intel-device-plugins-for-kubernetes/tree/main/cmd/gpu_plugin) + +Once that is done, check if you can get gpu details by running `clinfo`: + +```bash +root@gpu-1:/repos/ocean/ocean-node# clinfo +Number of platforms: 1 + Platform #0: Intel(R) OpenCL Graphics + Number of devices: 1 + Device #0: Intel(R) Arc(TM) A770M Graphics + Board name: Intel Arc Graphics + Vendor ID: 0x8086 + Device ID: 0x56a0 + Device Topology (NV12): PCI[ B#3 D#0 F#0 ] + Max compute units: 32 + Max clock frequency: 2400 MHz + Device extensions: cl_khr_fp64 cl_khr_fp16 cl_intel_subgroups ... +``` + +Now, get the device UUID: + +```bash +root@gpu-1:/repos/ocean/ocean-node# lspci -D | grep VGA +0000:03:00.0 VGA compatible controller: Intel Corporation Arc Graphics +``` + +For container runtime, Intel Arc GPUs use `/dev/dri/renderD128` or similar: + +```bash +root@gpu-1:/repos/ocean/ocean-node# ls -la /dev/dri/ +crw-rw---- 1 root render 226, 0 Apr 25 10:00 card0 +crw-rw---- 1 root render 226, 128 Apr 25 10:00 renderD128 +``` + +Now, we can define the GPU for the node: + +```json +{ + "id": "intelGPU", + "description": "Intel Arc A770M Graphics", + "type": "gpu", + "total": 1, + "init": { + "advanced": { + "Devices": ["/dev/dri/renderD128", "/dev/dri/card0"], + "GroupAdd": ["video", "render"], + "CapAdd": ["SYS_ADMIN"] + } + } +} +``` + +Here is the full definition of DOCKER_COMPUTE_ENVIRONMENTS with Intel GPU: + +```json +[ + { + "socketPath": "/var/run/docker.sock", + "resources": [ + { + "id": "intelGPU", + "description": "Intel Arc A770M Graphics", + "type": "gpu", + "total": 1, + "init": { + "advanced": { + "Devices": ["/dev/dri/renderD128", "/dev/dri/card0"], + "GroupAdd": ["video", "render"], + "CapAdd": ["SYS_ADMIN"] + } + } + }, + { "id": "disk", "total": 1 } + ], + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "fees": { + "1": [ + { + "feeToken": "0x123", + "prices": [ + { "id": "cpu", "price": 1 }, + { "id": "intelGPU", "price": 2 } + ] + } + ] + }, + "free": { + "maxJobDuration": 60, + "minJobDuration": 10, + "maxJobs": 3, + "resources": [ + { "id": "cpu", "max": 1 }, + { "id": "ram", "max": 1 }, + { "id": "disk", "max": 1 }, + { "id": "intelGPU", "max": 1 } + ] + } + } +] +``` + +Verify you have it in your compute environments: + +```bash +root@gpu-1:/repos/ocean/ocean-node# curl http://localhost:8000/api/services/computeEnvironments +``` + +```json +[ + { + "id": "0xaa1234567890abcdef1234567890abcdef1234567890abcdef1234567890ab-0xbb0987654321fedcba0987654321fedcba0987654321fedcba0987654321fed", + "runningJobs": 0, + "consumerAddress": "0x00", + "platform": { "architecture": "x86_64", "os": "Ubuntu 22.04.3 LTS" }, + "fees": { + "1": [ + { + "feeToken": "0x123", + "prices": [ + { "id": "cpu", "price": 1 }, + { "id": "intelGPU", "price": 2 } + ] + } + ] + }, + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "resources": [ + { "id": "cpu", "total": 16, "max": 16, "min": 1, "inUse": 0 }, + { + "id": "ram", + "total": 32, + "max": 32, + "min": 1, + "inUse": 0 + }, + { + "id": "intelGPU", + "description": "Intel Arc A770M Graphics", + "type": "gpu", + "total": 1, + "init": { + "advanced": { + "Devices": ["/dev/dri/renderD128", "/dev/dri/card0"], + "GroupAdd": ["video", "render"], + "CapAdd": ["SYS_ADMIN"] + } + }, + "max": 1, + "min": 0, + "inUse": 0 + }, + { "id": "disk", "total": 1, "max": 1, "min": 0, "inUse": 0 } + ], + "free": { + "maxJobDuration": 60, + "minJobDuration": 10, + "maxJobs": 3, + "resources": [ + { "id": "cpu", "max": 1, "inUse": 0 }, + { "id": "ram", "max": 1, "inUse": 0 }, + { "id": "disk", "max": 1, "inUse": 0 }, + { "id": "intelGPU", "max": 1, "inUse": 0 } + ] + }, + "runningfreeJobs": 0 + } +] +``` + +Start a free job using Intel GPU with: + +```json +{ + "command": "freeStartCompute", + "algorithm": { + "meta": { + "container": { + "image": "intel/oneapi-runtime", + "tag": "2024.0-devel-ubuntu22.04", + "entrypoint": "python $ALGO" + }, + "rawcode": "import os\nprint('GPU device available:')\nos.system('clinfo')" + } + }, + "consumerAddress": "0x00", + "signature": "123", + "nonce": 1, + "environment": "0xaa1234567890abcdef1234567890abcdef1234567890abcdef1234567890ab-0xbb0987654321fedcba0987654321fedcba0987654321fedcba0987654321fed", + "resources": [ + { + "id": "cpu", + "amount": 1 + }, + { + "id": "intelGPU", + "amount": 1 + } + ] +} +``` + +And the output of `getComputeResult` should look like: + +```bash +Number of platforms: 1 + Platform #0: Intel(R) OpenCL Graphics + Number of devices: 1 + Device #0: Intel(R) Arc(TM) A770M Graphics + Board name: Intel Arc Graphics + Vendor ID: 0x8086 + Device ID: 0x56a0 + Device Topology (NV12): PCI[ B#3 D#0 F#0 ] + Max compute units: 32 + Max clock frequency: 2400 MHz + Device extensions: cl_khr_fp64 cl_khr_fp16 cl_intel_subgroups ... +``` diff --git a/docs/KeyManager.md b/docs/KeyManager.md new file mode 100644 index 000000000..a1a470814 --- /dev/null +++ b/docs/KeyManager.md @@ -0,0 +1,111 @@ +# KeyManager Architecture + +## Overview + +KeyManager supports multiple key source types through a provider abstraction pattern. This allows the system to support different key management solutions (raw private keys, GCP KMS, AWS KMS, etc.) without changing the core KeyManager logic. + +## Architecture + +``` +KeyManager + ├── IKeyProvider (interface) + │ ├── RawPrivateKeyProvider (implemented) + │ ├── GcpKmsProvider (future) + │ └── AwsKmsProvider (future) + │ + └── Factory Pattern + └── createKeyProvider(config) → IKeyProvider +``` + +## Components + +### 1. IKeyProvider Interface (`types.ts`) + +Base interface that all key providers must implement: + +```typescript +interface IKeyProvider { + getType(): KeyProviderType + initialize(): Promise + getPeerId(): PeerId + getLibp2pPrivateKey(): any + getLibp2pPublicKey(): Uint8Array + getEthAddress(): string + getRawPrivateKeyBytes(): Uint8Array + cleanup?(): Promise +} +``` + +### 2. KeyProviderType Enum + +Defines supported key provider types: + +- `RAW` - Raw private key from environment variable + +### 3. RawPrivateKeyProvider (`providers/RawPrivateKeyProvider.ts`) + +Implementation for raw private keys: + +- Loads private key from config +- Derives libp2p keys and peerId +- Derives Ethereum address +- Provides raw private key bytes for EVM signer creation + +### 4. Factory (`factory.ts`) + +Creates and initializes the appropriate key provider: + +```typescript +createKeyProvider(config: KeyProviderConfig): Promise +``` + +### 5. KeyManager (`index.ts`) + +Main class that: + +- Wraps a key provider +- Manages EVM signer caching +- Provides unified API for key access + +## Usage + +### Current Usage (Raw Private Key) + +```typescript +import { createKeyProvider } from './components/KeyManager/index.js' + +const keyManager = new KeyManager(config) +``` + +## Adding New Key Providers + +To add a new key provider (e.g., AWS KMS): + +1. **Add to KeyProviderType**: + +```typescript +export type KeyProviderType = 'raw' | 'gcp-kms' | 'aws' //new +``` + +2. **Create provider class**: + +```typescript +export class AwsKmsProvider implements IKeyProvider { + // Implement all interface methods +} +``` + +3. **Update factory**: + +```typescript +case 'aws'': + provider = new AwsKmsProvider(config) + break +``` + +## Benefits + +1. **Extensibility**: Easy to add new key sources +2. **Testability**: Can mock key providers for testing +3. **Security**: Supports secure key management solutions (KMS) +4. **Separation of Concerns**: Key retrieval logic separated from key usage logic diff --git a/docs/PolicyServer.md b/docs/PolicyServer.md index e092a7532..20c4ea956 100644 --- a/docs/PolicyServer.md +++ b/docs/PolicyServer.md @@ -95,6 +95,18 @@ Called whenever a new encrypt command is received by Ocean Node } ``` +### encryptFile + +Called whenever a new encryptFile command is received by Ocean Node + +```json +{ + "action": "encrypt", + "policyServer": {}, + "file"?: object +} +``` + ### decrypt Called whenever a new decrypt command is received by Ocean Node diff --git a/docs/compute-pricing.md b/docs/compute-pricing.md new file mode 100644 index 000000000..e2912bd46 --- /dev/null +++ b/docs/compute-pricing.md @@ -0,0 +1,276 @@ +# Compute Environment Configuration and Pricing + +This guide explains how to configure your node’s Docker compute environments and how to set prices for each resource. It covers the `DOCKER_COMPUTE_ENVIRONMENTS` variable (or equivalent config), the fee structure, pricing units, and examples for CPU, RAM, disk, and GPU. + +## Overview + +- **Configuration**: Define compute environments via the `DOCKER_COMPUTE_ENVIRONMENTS` environment variable (JSON) or via `config.json` under `dockerComputeEnvironments`. +- **Resources**: Each environment declares resources (e.g. `cpu`, `ram`, `disk`, and optionally GPUs). You must declare a `disk` resource. +- **Pricing**: For each chain and fee token, you set a `price` per resource. Cost is computed as **price × amount × duration (in minutes, rounded up)**. + +## Pricing Units + +| Resource | Unit of `amount` | Price meaning | Cost formula | +| -------- | ---------------- | ------------------ | ------------------------------------ | +| **CPU** | Number of CPUs | Per CPU per minute | `price × cpus × ceil(duration/60)` | +| **RAM** | Gigabytes (GB) | Per GB per minute | `price × ramGB × ceil(duration/60)` | +| **Disk** | Gigabytes (GB) | Per GB per minute | `price × diskGB × ceil(duration/60)` | +| **GPU** | Number of GPUs | Per GPU per minute | `price × gpus × ceil(duration/60)` | + +So: + +- **CPU and GPU**: price is **per resource per minute** (e.g. 2 CPUs at price 1 for 90 minutes → 2 × 1 × 90 = 180). +- **Memory (RAM) and storage (disk)**: price is **per minute per gigabyte** (e.g. 4 GB RAM at price 0.5 for 60 minutes → 0.5 × 4 × 60 = 120). + +Duration is always in seconds; it is converted to minutes with **ceil(duration / 60)** (e.g. 61 seconds → 2 minutes). + +--- + +## Where to Configure + +1. **Environment variable** + Set `DOCKER_COMPUTE_ENVIRONMENTS` to a JSON string (array of compute environment objects). + Example: + `export DOCKER_COMPUTE_ENVIRONMENTS='[{"socketPath":"/var/run/docker.sock",...}]'` + +2. **Config file** + Put the same array in your JSON config under the key `dockerComputeEnvironments`, and point the node to that file (e.g. via `CONFIG_PATH`). + +If both are set, the environment variable typically overrides the config. See [Environmental Variables](env.md) and `ENVIRONMENT_VARIABLES` in `src/utils/constants.ts`. + +--- + +## Environment Structure (Summary) + +Each element of `DOCKER_COMPUTE_ENVIRONMENTS` is an object with at least: + +- **socketPath**: Docker socket (e.g. `"/var/run/docker.sock"`). +- **resources**: List of resources (see below). Must include `disk`. +- **storageExpiry**, **maxJobDuration**, **minJobDuration**: Required (seconds). +- **fees**: Per-chain, per-token pricing (see next section). +- **access** (optional): Who can run paid jobs (`addresses`, `accessLists`). +- **free** (optional): Limits and access for free jobs. + +### Resources + +- **cpu**, **ram**, **disk**: Standard resources. `disk` is mandatory. + **Disk** and **RAM** are in **GB** (e.g. `"total": 10` = 10 GB). +- **GPU**: Add a resource with `"type": "gpu"` and either `deviceRequests` (NVIDIA) or `advanced` (AMD/Intel). See [GPU.md](GPU.md) for full examples. + +--- + +## Fee Structure + +`fees` is an object keyed by **chain ID** (string). Each value is an array of fee options: + +```json +"fees": { + "1": [ + { + "feeToken": "0x...", + "prices": [ + { "id": "cpu", "price": 1 }, + { "id": "ram", "price": 0.5 }, + { "id": "disk", "price": 0.2 }, + { "id": "myGPU", "price": 3 } + ] + } + ] +} +``` + +- **feeToken**: Token contract address used for payment on that chain. +- **prices**: List of `{ "id": "", "price": }`. + Only resources listed here are billable; omit a resource to offer it without charge (e.g. for free tier only). + +**Important**: The `id` in `prices` must match the resource `id` in `resources` and in `free.resources` (e.g. if the GPU resource is `"id": "myGPU"`, use `"id": "myGPU"` in `prices`, not `"nyGPU"`). + +--- + +## Cost Examples + +Assume: + +- **CPU** price = 1 (per CPU per minute) +- **RAM** price = 0.5 (per GB per minute) +- **Disk** price = 0.2 (per GB per minute) +- **GPU** price = 3 (per GPU per minute) + +Job: 2 CPUs, 4 GB RAM, 10 GB disk, 1 GPU, duration **125 seconds** (ceil = 3 minutes). + +- CPU: 1 × 2 × 3 = **6** +- RAM: 0.5 × 4 × 3 = **6** +- Disk: 0.2 × 10 × 3 = **6** +- GPU: 3 × 1 × 3 = **9** + **Total cost = 27** (in the smallest unit of the fee token). + +--- + +## Example 1: CPU, RAM, and Disk with Prices + +```json +[ + { + "socketPath": "/var/run/docker.sock", + "resources": [{ "id": "disk", "total": 10 }], + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "fees": { + "1": [ + { + "feeToken": "0x967da4048cD07aB37855c090aAF366e4ce1b9F48", + "prices": [ + { "id": "cpu", "price": 1 }, + { "id": "ram", "price": 0.5 }, + { "id": "disk", "price": 0.2 } + ] + } + ] + }, + "free": { + "maxJobDuration": 60, + "minJobDuration": 10, + "maxJobs": 3, + "resources": [ + { "id": "cpu", "max": 1 }, + { "id": "ram", "max": 1 }, + { "id": "disk", "max": 1 } + ] + } + } +] +``` + +- **CPU**: 1 unit per CPU per minute. +- **RAM**: 0.5 units per GB per minute. +- **Disk**: 0.2 units per GB per minute. + +--- + +## Example 2: CPU + NVIDIA GPU + +Get the GPU UUID: + +```bash +nvidia-smi --query-gpu=name,uuid --format=csv +``` + +Then define one GPU and set a price per GPU per minute (e.g. 3): + +```json +[ + { + "socketPath": "/var/run/docker.sock", + "resources": [ + { + "id": "myGPU", + "description": "NVIDIA GeForce GTX 1060 3GB", + "type": "gpu", + "total": 1, + "init": { + "deviceRequests": { + "Driver": "nvidia", + "DeviceIDs": ["GPU-294c6802-bb2f-fedb-f9e0-a26b9142dd81"], + "Capabilities": [["gpu"]] + } + } + }, + { "id": "disk", "total": 1 } + ], + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "fees": { + "1": [ + { + "feeToken": "0x123", + "prices": [ + { "id": "cpu", "price": 1 }, + { "id": "myGPU", "price": 3 } + ] + } + ] + }, + "free": { + "maxJobDuration": 60, + "minJobDuration": 10, + "maxJobs": 3, + "resources": [ + { "id": "cpu", "max": 1 }, + { "id": "ram", "max": 1 }, + { "id": "disk", "max": 1 }, + { "id": "myGPU", "max": 1 } + ] + } + } +] +``` + +Ensure the fee `id` matches the resource `id` (`myGPU`). Price 3 = 3 units per GPU per minute. + +--- + +## Example 3: Multiple Chains and Tokens + +You can support several chains and multiple fee tokens per chain: + +```json +"fees": { + "1": [ + { + "feeToken": "0xTokenA", + "prices": [ + { "id": "cpu", "price": 1 }, + { "id": "ram", "price": 0.5 }, + { "id": "disk", "price": 0.2 } + ] + }, + { + "feeToken": "0xTokenB", + "prices": [ + { "id": "cpu", "price": 2 }, + { "id": "ram", "price": 1 }, + { "id": "disk", "price": 0.5 } + ] + } + ], + "137": [ + { + "feeToken": "0xPolygonToken", + "prices": [ + { "id": "cpu", "price": 1 }, + { "id": "ram", "price": 0.5 }, + { "id": "disk", "price": 0.2 } + ] + } + ] +} +``` + +Consumers choose chain and token when starting a job; the node uses the matching `prices` for that chain and token. + +--- + +## Example 4: AMD or Intel GPU + +For **AMD (e.g. ROCm on WSL2)** or **Intel Arc**, use a GPU resource with `init.advanced` instead of `deviceRequests`. Still set a **per-GPU per-minute** price in `fees.prices` (same formula: price × gpus × ceil(duration/60)). + +- **AMD Radeon (WSL2/ROCm)**: See [GPU.md – AMD Radeon 9070 XT](GPU.md#amd-radeon-9070-xt-on-wsl2) for `advanced` (Devices, Binds, CapAdd, etc.). Use a consistent `id` (e.g. `myGPU`) in `resources` and in `fees.prices`. +- **Intel Arc**: See [GPU.md – Intel Arc GPU](GPU.md#intel-arc-gpu-example) for `advanced` (Devices, GroupAdd, CapAdd). Again, use the same `id` in `fees.prices` (e.g. `intelGPU`). + +In all cases, the pricing rule is: **price × amount × ceil(duration/60)** with amount = number of GPUs. + +--- + +## Checklist + +- [ ] `DOCKER_COMPUTE_ENVIRONMENTS` (or `dockerComputeEnvironments` in config) is a JSON array. +- [ ] Every environment has a **disk** resource (and optionally cpu, ram, GPU). +- [ ] **Disk** and **RAM** amounts are in **GB**. +- [ ] **fees** has an entry per chain ID; each entry has `feeToken` and `prices` with `id` matching resource ids. +- [ ] **CPU / GPU**: price = per resource per minute. +- [ ] **RAM / Disk**: price = per GB per minute. +- [ ] For free tier, list the same resource ids in `free.resources`; omit from `prices` if they should be free only. + +For GPU setup details (NVIDIA, AMD, Intel), see [GPU.md](GPU.md). For other env vars and config options, see [env.md](env.md). diff --git a/docs/dockerDeployment.md b/docs/dockerDeployment.md index ef1d675d9..5110c8b52 100644 --- a/docs/dockerDeployment.md +++ b/docs/dockerDeployment.md @@ -62,6 +62,23 @@ CONTAINER ID IMAGE COMMAND CREATE 858a59502302 typesense/typesense:26.0 "/opt/typesense-serv…" 17 seconds ago Up 10 seconds 0.0.0.0:8108->8108/tcp, :::8108->8108/tcp typesense ``` +## Upgrade Ocean Node + +Ocean Node container image is updated regularly. To upgrade to the latest version, run the following script. Required updated will be notified through our communication channels. + +```shell +$ ./scripts/ocean-node-update.sh +``` + +If script is not executed you can change permissions and execute it. + +```shell +$ chmod +x scripts/ocean-node-update.sh +$ ./scripts/ocean-node-update.sh +``` + +--- + Additional notes: - the docker compose file generated will have the following format. For all available configurations, refer to the [Environment Variables](https://github.com/oceanprotocol/ocean-node/blob/main/docs/env.md) documentation @@ -91,15 +108,16 @@ services: # ADDRESS_FILE: '' # NODE_ENV: '' # AUTHORIZED_DECRYPTERS: '' + # AUTHORIZED_DECRYPTERS_LIST: '' # OPERATOR_SERVICE_URL: '' INTERFACES: '["HTTP","P2P"]' # ALLOWED_VALIDATORS: '' # INDEXER_NETWORKS: '[]' ALLOWED_ADMINS: '["<>"]' # INDEXER_INTERVAL: '' - DASHBOARD: 'true' + CONTROL_PANEL: 'true' # RATE_DENY_LIST: '' - # MAX_REQ_PER_SECOND: '' + # MAX_REQ_PER_MINUTE: '' # MAX_CHECKSUM_LENGTH: '' # LOG_LEVEL: '' HTTP_API_PORT: '8000' diff --git a/docs/env.md b/docs/env.md index a20500736..520502578 100644 --- a/docs/env.md +++ b/docs/env.md @@ -5,6 +5,7 @@ Environmental variables are also tracked in `ENVIRONMENT_VARIABLES` within `src/ ## Core - `PRIVATE_KEY` (Required): The private key for the node, required for node operations. Example: `"0x1d751ded5a32226054cd2e71261039b65afb9ee1c746d055dd699b1150a5befc"` +- `CONFIG_PATH`: Absolute path to JSON config file - `RPCS`: JSON object defining RPC endpoints for various networks. Example: `"{ \"11155420\":{ \"rpc\":\"https://sepolia.optimism.io\", \"fallbackRPCs\": [\"https://public.stackup.sh/api/v1/node/optimism-sepolia\"], \"chainId\": 11155420, \"network\": \"optimism-sepolia\", \"chunkSize\": 1000 }}"` - `DB_URL`: URL for connecting to the database. Required for running a database with the node. Example: `"http://localhost:8108/?apiKey=xyz"` - `IPFS_GATEWAY`: The gateway URL for IPFS, used for downloading files from IPFS. Example: `"https://ipfs.io/"` @@ -15,16 +16,43 @@ Environmental variables are also tracked in `ENVIRONMENT_VARIABLES` within `src/ - `ADDRESS_FILE`: File location where Ocean contract addresses are saved. Example: `"ADDRESS_FILE=${HOME}/.ocean/ocean-contracts/artifacts/address.json"` - `NODE_ENV`: Typically used to specify the environment (e.g., development, production) the node is running in. Example: `'development'` - `AUTHORIZED_DECRYPTERS`: A JSON array of addresses that are authorized to decrypt data. Example: `"['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']"` +- `AUTHORIZED_DECRYPTERS_LIST`: AccessList contract addresses (per chain). If present, only accounts present on the given access lists can decrypt data. Example: `"{ \"8996\": [\"0x967da4048cD07aB37855c090aAF366e4ce1b9F48\",\"0x388C818CA8B9251b393131C08a736A67ccB19297\"] }"` - `OPERATOR_SERVICE_URL`: Configures C2D cluster URLs for the node. Example: `"[\"http://example.c2d.cluster1.com\",\"http://example.cd2.cluster2.com\"]"` - `INTERFACES`: Network interfaces the node supports, e.g., HTTP and P2P. By default, if not specified, both are supported. Example: `"[\"HTTP\",\"P2P\"]"` - `ALLOWED_VALIDATORS`: Array of addresses for allowed validators to verify asset signatures before indexing. Example: `"[\"0x123\",\"0x456\"]"` +- `ALLOWED_VALIDATORS_LIST`: Array of access list addresses (per chain) for allowed validators to verify asset signatures before indexing. Example: `"{ \"8996\": [\"0x123\",\"0x456\"]"` - `INDEXER_INTERVAL`: Sets the interval in milliseconds for the indexer to crawl. The default is 30 seconds if not set. Example: `10000` - `INDEXER_NETWORKS`: Specifies the networks the Indexer will crawl. If not set, the Indexer will index all networks defined in the RPCS environment variable. If set to an empty string, indexing will be disabled. Example: `[1, 137]` - `ALLOWED_ADMINS`: Sets the public address of accounts which have access to admin endpoints e.g. shutting down the node. Example: `"[\"0x967da4048cD07aB37855c090aAF366e4ce1b9F48\",\"0x388C818CA8B9251b393131C08a736A67ccB19297\"]"` -- `DASHBOARD`: If `false` the dashboard will not run. If not set or `true` the dashboard will start with the node. Example: `false` +- `ALLOWED_ADMINS_LIST`: Array of access list addresses (per chain) for accounts that have access to admin endpoints. Example: `"{ \"8996\": [\"0x123\",\"0x456\"]"` +- `CONTROL_PANEL`: If `false` the control panel will not run. If not set or `true` the control panel will start with the node. Example: `false` - `RATE_DENY_LIST`: Blocked list of IPs and peer IDs. Example: `"{ \"peers\": [\"16Uiu2HAkuYfgjXoGcSSLSpRPD6XtUgV71t5RqmTmcqdbmrWY9MJo\"], \"ips\": [\"127.0.0.1\"] }"` -- `MAX_REQ_PER_SECOND`: Number of requests per second allowed by the same client. Example: `3` +- `MAX_REQ_PER_MINUTE`: Number of requests per minute allowed by the same client (IP or Peer id). Example: `30` +- `MAX_CONNECTIONS_PER_MINUTE`: Max number of requests allowed per minute (all clients). Example: `120` - `MAX_CHECKSUM_LENGTH`: Define the maximum length for a file if checksum is required (Mb). Example: `10` +- `IS_BOOTSTRAP`: Is this node to be used as bootstrap node or not. Default is `false`. +- `AUTHORIZED_PUBLISHERS`: Authorized list of publishers. If present, Node will only index assets published by the accounts in the list. Example: `"[\"0x967da4048cD07aB37855c090aAF366e4ce1b9F48\",\"0x388C818CA8B9251b393131C08a736A67ccB19297\"]"` +- `AUTHORIZED_PUBLISHERS_LIST`: AccessList contract addresses (per chain). If present, Node will only index assets published by the accounts present on the given access lists. Example: `"{ \"8996\": [\"0x967da4048cD07aB37855c090aAF366e4ce1b9F48\",\"0x388C818CA8B9251b393131C08a736A67ccB19297\"] }"` +- `VALIDATE_UNSIGNED_DDO`: If set to `false`, the node will not validate unsigned DDOs and will request a signed message with the publisher address, nonce and signature. Default is `true`. Example: `false` +- `JWT_SECRET`: Secret used to sign JWT tokens. Default is `ocean-node-secret`. Example: `"my-secret-jwt-token"` + +## Database + +- `DB_URL`: URL for connecting to the database. Required for running a database with the node. Example: `"http://localhost:8108/?apiKey=xyz"` +- `DB_USERNAME`: Username for database authentication. Optional if not using authentication. Example: `"elastic"` +- `DB_PASSWORD`: Password for database authentication. Optional if not using authentication. Example: `"password123"` +- `ELASTICSEARCH_REQUEST_TIMEOUT`: Request timeout in milliseconds for Elasticsearch operations. Default is `60000`. Example: `60000` +- `ELASTICSEARCH_PING_TIMEOUT`: Ping timeout in milliseconds for Elasticsearch health checks. Default is `5000`. Example: `5000` +- `ELASTICSEARCH_RESURRECT_STRATEGY`: Strategy for bringing failed Elasticsearch nodes back online. Options are 'ping', 'optimistic', or 'none'. Default is `ping`. Example: `"ping"` +- `ELASTICSEARCH_MAX_RETRIES`: Maximum number of retry attempts for failed Elasticsearch operations. Default is `5`. Example: `5` +- `ELASTICSEARCH_SNIFF_ON_START`: Enable cluster node discovery on Elasticsearch client startup. Default is `true`. Example: `true` +- `ELASTICSEARCH_SNIFF_INTERVAL`: Interval in milliseconds for periodic cluster health monitoring and node discovery. Set to 'false' to disable. Default is `30000`. Example: `30000` +- `ELASTICSEARCH_SNIFF_ON_CONNECTION_FAULT`: Enable automatic cluster node discovery when connection faults occur. Default is `true`. Example: `true` +- `ELASTICSEARCH_HEALTH_CHECK_INTERVAL`: Interval in milliseconds for proactive connection health monitoring. Default is `60000`. Example: `60000` + +## Payments + +- `ESCROW_CLAIM_TIMEOUT`: Amount of time reserved to claim a escrow payment, in seconds. Defaults to `3600`. Example: `3600` ## Logs @@ -37,6 +65,8 @@ Environmental variables are also tracked in `ENVIRONMENT_VARIABLES` within `src/ ## HTTP - `HTTP_API_PORT`: Port number for the HTTP API. Example: `8000` +- `HTTP_CERT_PATH`: Absolute path to the TLS certificate file. If provided along with `HTTP_KEY_PATH`, the node will start an HTTPS server. Example: `"/etc/letsencrypt/live/example.com/fullchain.pem"` +- `HTTP_KEY_PATH`: Absolute path to the TLS private key file. If provided along with `HTTP_CERT_PATH`, the node will start an HTTPS server. Example: `"/etc/letsencrypt/live/example.com/privkey.pem"` ## P2P @@ -49,11 +79,16 @@ Environmental variables are also tracked in `ENVIRONMENT_VARIABLES` within `src/ - `P2P_ipV6BindTcpPort`: Port used on IPv6 TCP connections. Defaults to `0` (Use whatever port is free. When running as docker, please set it explicitly). Example: `0` - `P2P_ipV6BindWsPort`: Port used on IPv6 WS connections. Defaults to `0` (Use whatever port is free. When running as docker, please set it explicitly). Example: `0` - `P2P_ANNOUNCE_ADDRESSES`: List of addresses to announce to the network. Example: `"[\"/ip4/1.2.3.4/tcp/8000\"]"` + + To enable SNI (Server Name Indication) with autoTLS, include `/tls/ws` or `/tls/wss` addresses: + - `"["/ip4//tcp/9001/tls/ws"]"` - TLS WebSocket + - `"["/ip4//tcp/9005/tls/wss"]"` - TLS WebSocket Secure + - `P2P_ANNOUNCE_PRIVATE`: Announce private IPs. Default: `True` - `P2P_pubsubPeerDiscoveryInterval`: Interval (in ms) for discovery using pubsub. Defaults to `10000` (three seconds). Example: `10000` - `P2P_dhtMaxInboundStreams`: Maximum number of DHT inbound streams. Defaults to `500`. Example: `500` - `P2P_dhtMaxOutboundStreams`: Maximum number of DHT outbound streams. Defaults to `500`. Example: `500` -- `P2P_ENABLE_DHT_SERVER`: Enable DHT server mode. This should be enabled for bootstrapers & well established nodes. Default: `false` +- `P2P_DHT_FILTER`: Filter address in DHT. 0 = (Default) No filter 1. Filter private ddresses. 2. Filter public addresses - `P2P_mDNSInterval`: Interval (in ms) for discovery using mDNS. Defaults to `20000` (20 seconds). Example: `20000` - `P2P_connectionsMaxParallelDials`: Maximum number of parallel dials. Defaults to `150`. Example: `150` - `P2P_connectionsDialTimeout`: Timeout for dial commands. Defaults to `10000` (10 seconds). Example: `10000` @@ -83,3 +118,111 @@ Environmental variables are also tracked in `ENVIRONMENT_VARIABLES` within `src/ - `NODE1_PRIVATE_KEY`: Used on test environments, specifically CI, represents the private key for node 1. Example: `"0xfd5c1ccea015b6d663618850824154a3b3fb2882c46cefb05b9a93fea8c3d215"` - `NODE2_PRIVATE_KEY`: Used on test environments, specifically CI, represents the private key for node 2. Example: `"0x1263dc73bef43a9da06149c7e598f52025bf4027f1d6c13896b71e81bb9233fb"` + +## Cron Jobs + +- `CRON_DELETE_DB_LOGS`: Delete old logs from database Cron expression. Example: `0 0 * * *` (runs every day at midnight) +- `CRON_CLEANUP_C2D_STORAGE`: Clear c2d expired resources/storage and delete old jobs. Example: `*/5 * * * *` (runs every 5 minutes) + +## Compute + +The `DOCKER_COMPUTE_ENVIRONMENTS` environment variable is used to configure Docker-based compute environments in Ocean Node. This guide will walk you through the options available for defining `DOCKER_COMPUTE_ENVIRONMENTS` and how to set it up correctly. For configuring compute environments and setting prices for each resource (including pricing units and examples), see [Compute pricing](compute-pricing.md). + +Example Configuration +The `DOCKER_COMPUTE_ENVIRONMENTS` environment variable should be a JSON array of objects, where each object represents a Docker compute environment configuration. Below is an example configuration: + +`Disk` and `Ram` resources are always expressed in GB. + +```json +[ + { + "socketPath": "/var/run/docker.sock", + "imageRetentionDays": 7, + "imageCleanupInterval": 86400, + "resources": [ + { + "id": "disk", + "total": 10 + } + ], + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "access": { + "addresses": ["0x123", "0x456"], + "accessLists": [] + }, + "fees": { + "1": [ + { + "feeToken": "0x123", + "prices": [ + { + "id": "cpu", + "price": 1 + } + ] + } + ] + }, + "free": { + "maxJobDuration": 60, + "minJobDuration": 10, + "maxJobs": 3, + "access": { + "addresses": [], + "accessLists": ["0x789"] + }, + "resources": [ + { + "id": "cpu", + "max": 1 + }, + { + "id": "ram", + "max": 1 + }, + { + "id": "disk", + "max": 1 + } + ] + } + } +] +``` + +#### Configuration Options + +- **socketPath**: Path to the Docker socket (e.g., docker.sock). +- **imageRetentionDays** - how long docker images are kept, in days. Default: 7 +- **imageCleanupInterval** - how often to run cleanup for docker images, in seconds. Min: 3600 (1hour), Default: 86400 (24 hours) +- **storageExpiry**: Amount of seconds for storage expiry.(Mandatory) +- **maxJobDuration**: Maximum duration in seconds for a job.(Mandatory) +- **minJobDuration**: Minimum duration in seconds for a job.(Mandatory) +- **access**: Access control configuration for paid compute jobs. If both `addresses` and `accessLists` are empty, all addresses are allowed. + - **addresses**: Array of Ethereum addresses allowed to run compute jobs. If empty and no access lists are configured, all addresses are allowed. + - **accessLists**: Array of AccessList contract addresses. Users holding NFTs from these contracts can run compute jobs. Checked across all supported networks. +- **fees**: Fee structure for the compute environment. + - **feeToken**: Token address for the fee. + - **prices**: Array of resource pricing information. + - **id**: Resource type (e.g., `cpu`, `ram`, `disk`). + - **price**: Price per unit of the resource. +- **resources**: Array of resources available in the compute environment. + - **id**: Resource type (e.g., `cpu`, `ram`, `disk`). + - **total**: Total number of the resource available. + - **min**: Minimum number of the resource needed for a job. + - **max**: Maximum number of the resource for a job. +- **free**: Optional configuration for free jobs. + - **storageExpiry**: Amount of seconds for storage expiry for free jobs. + - **maxJobDuration**: Maximum duration in seconds for a free job. + - **minJobDuration**: Minimum duration in seconds for a free job. + - **maxJobs**: Maximum number of simultaneous free jobs. + - **access**: Access control configuration for free compute jobs. Works the same as the main `access` field. + - **addresses**: Array of Ethereum addresses allowed to run free compute jobs. + - **accessLists**: Array of AccessList contract addresses for free compute access control. + - **resources**: Array of resources available for free jobs. + - **id**: Resource type (e.g., `cpu`, `ram`, `disk`). + - **total**: Total number of the resource available. + - **min**: Minimum number of the resource needed for a job. + - **max**: Maximum number of the resource for a job. diff --git a/docs/imgs/C2Dv2_message_flow_for_docker_module.png b/docs/imgs/C2Dv2_message_flow_for_docker_module.png deleted file mode 100644 index 889088aa0..000000000 Binary files a/docs/imgs/C2Dv2_message_flow_for_docker_module.png and /dev/null differ diff --git a/docs/imgs/c2dv2-modules.png b/docs/imgs/c2dv2-modules.png deleted file mode 100644 index 1bb7e2da6..000000000 Binary files a/docs/imgs/c2dv2-modules.png and /dev/null differ diff --git a/docs/networking.md b/docs/networking.md index 547770e51..542cfcd5c 100644 --- a/docs/networking.md +++ b/docs/networking.md @@ -15,6 +15,45 @@ To quickly start your node, you can keep all of the default values,but most like - if you have a private ip and you can forward external ports from your gateway, use P2P_ANNOUNCE_ADDRESSES and let other nodes know your external IP/port. - if you cannot forward ports on your gateway, the only choice is to use a circuit relay server (then all traffic will go through that node and it will proxy) +## TLS and SNI (Server Name Indication) + +AutoTLS is used to provision TLS certificates for your node in order to allow P2P node-to-browser communication. +To enable SNI with Ocean Node's autoTLS feature, include `/tls/ws` or `/tls/wss` addresses in `P2P_ANNOUNCE_ADDRESSES`: + +Add to .env file + +```bash +export P2P_ANNOUNCE_ADDRESSES='[ + "/ip4//tcp/9000", + "/ip4//tcp/9001/tls/ws", + "/ip4//tcp/9005/tls/wss", +]' +``` + +Or in config.json file: + +```json +{ + "p2pConfig": { + "announceAddresses": [ + "/ip4//tcp/9000", + "/ip4//tcp/9001/tls/ws", + "/ip4//tcp/9005/tls/wss" + ] + } +} +``` + +When TLS certificates are provisioned, you should see logs like: + +``` +----- A TLS certificate was provisioned ----- +----- TLS addresses: ----- +/ip4//tcp/9001/sni/... +/ip4//tcp/9005/sni/... +----- End of TLS addresses ----- +``` + In order to check connectivity, you can do the following: ### On your node, check and observe how your node sees itself: diff --git a/elasticsearch-compose.yml b/elasticsearch-compose.yml new file mode 100644 index 000000000..504eb2cf1 --- /dev/null +++ b/elasticsearch-compose.yml @@ -0,0 +1,17 @@ +services: + elasticsearch: + image: elasticsearch:8.5.1 + ports: + - 9200:9200 + - 9300:9300 + volumes: + - esdata:/usr/share/elasticsearch/data + environment: + ES_JAVA_OPTS: "-Xms512m -Xmx512m" + MAX_MAP_COUNT: "64000" + discovery.type: "single-node" + ELASTIC_PASSWORD: "changeme" + xpack.security.enabled: "false" + xpack.security.http.ssl.enabled: "false" +volumes: + esdata: diff --git a/package-lock.json b/package-lock.json index 7c66c68ba..a3adc8fa5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,96 +1,85 @@ { "name": "ocean-node", - "version": "0.2.0", + "version": "0.2.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ocean-node", - "version": "0.2.0", + "version": "0.2.3", + "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-s3": "^3.554.0", - "@chainsafe/libp2p-gossipsub": "^13.1.0", - "@chainsafe/libp2p-noise": "^15.1.0", - "@chainsafe/libp2p-yamux": "^6.0.2", + "@chainsafe/libp2p-noise": "^17.0.0", + "@chainsafe/libp2p-yamux": "^8.0.1", "@elastic/elasticsearch": "^8.14.0", - "@libp2p/autonat": "^1.1.1", - "@libp2p/bootstrap": "^10.1.1", - "@libp2p/circuit-relay-v2": "^1.1.1", - "@libp2p/crypto": "^4.1.5", - "@libp2p/dcutr": "^1.1.1", - "@libp2p/floodsub": "^9.1.1", - "@libp2p/identify": "^2.1.1", - "@libp2p/interface": "^1.6.0", - "@libp2p/interface-address-manager": "^3.0.1", - "@libp2p/kad-dht": "^12.1.1", - "@libp2p/mdns": "^10.1.1", - "@libp2p/peer-id": "^4.1.4", - "@libp2p/peer-id-factory": "^4.1.4", - "@libp2p/ping": "^1.1.1", - "@libp2p/pubsub": "^9.0.22", - "@libp2p/pubsub-peer-discovery": "^10.0.2", - "@libp2p/tcp": "^9.1.1", - "@libp2p/upnp-nat": "^1.2.1", - "@libp2p/websockets": "^8.1.1", - "@multiformats/multiaddr": "^10.2.0", - "@oceanprotocol/contracts": "^2.2.0", - "@rdfjs/dataset": "^2.0.1", - "@rdfjs/types": "^1.1.0", - "@types/lodash.clonedeep": "^4.5.7", - "@types/n3": "^1.16.4", - "@types/rdf-ext": "^2.2.5", - "@types/rdf-utils-fs": "^2.1.5", - "@types/rdfjs__data-model": "^2.0.7", - "@types/rdfjs__dataset": "^2.0.7", - "@types/rdfjs__parser-jsonld": "^2.1.6", - "@types/rdfjs__to-ntriples": "^2.0.6", - "@zazuko/env-node": "^2.1.3", - "aegir": "^37.3.0", - "aws-sdk": "^2.1591.0", - "axios": "^1.7.4", + "@ipshipyard/libp2p-auto-tls": "^2.0.1", + "@libp2p/autonat": "^3.0.9", + "@libp2p/bootstrap": "^12.0.10", + "@libp2p/circuit-relay-v2": "^4.1.2", + "@libp2p/crypto": "^5.1.13", + "@libp2p/dcutr": "^3.0.9", + "@libp2p/identify": "^4.0.9", + "@libp2p/kad-dht": "^16.1.2", + "@libp2p/keychain": "^6.0.9", + "@libp2p/mdns": "^12.0.10", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/peer-id-factory": "^4.2.4", + "@libp2p/ping": "^3.0.9", + "@libp2p/pubsub": "^10.1.18", + "@libp2p/pubsub-peer-discovery": "^12.0.0", + "@libp2p/tcp": "^11.0.9", + "@libp2p/tls": "^3.0.10", + "@libp2p/upnp-nat": "^4.0.9", + "@libp2p/websockets": "^10.1.2", + "@multiformats/multiaddr": "^12.2.3", + "@oceanprotocol/contracts": "^2.5.0", + "@oceanprotocol/ddo-js": "^0.2.0", + "aws-sdk": "^2.1693.0", + "axios": "^1.12.0", "base58-js": "^2.0.0", "cors": "^2.8.5", + "datastore-level": "^12.0.2", "delay": "^5.0.0", + "dockerode": "^4.0.5", "dotenv": "^16.3.1", "eciesjs": "^0.4.5", "eth-crypto": "^2.6.0", "ethers": "^6.8.1", "express": "^4.21.1", + "humanhash": "^1.0.4", "hyperdiff": "^2.0.16", - "ip": "^2.0.1", + "ipaddr.js": "^2.3.0", "it-pipe": "^3.0.1", - "libp2p": "^1.8.0", - "lodash.clonedeep": "^4.5.0", + "jsonwebtoken": "^9.0.2", + "libp2p": "^3.1.2", + "lodash": "^4.17.23", "lzma-purejs-requirejs": "^1.0.0", - "n3": "^1.17.2", "node-cron": "^3.0.3", - "private-ip": "^3.0.2", - "rdf-utils-fs": "^3.0.0", - "rdf-validate-shacl": "^0.5.5", - "rdflib": "^2.2.33", - "shacl-engine": "^0.1.2", - "sinon": "^17.0.1", "sqlite3": "^5.1.7", "stream-concat": "^1.0.0", - "ts-node": "^10.9.1", - "tsoa": "^5.1.1", + "tar": "^7.5.7", "uint8arrays": "^4.0.6", "url-join": "^5.0.0", "winston": "^3.11.0", "winston-daily-rotate-file": "^4.7.1", - "winston-transport": "^4.6.0" + "winston-transport": "^4.6.0", + "zod": "^3.25.76" }, "devDependencies": { "@types/chai": "^4.3.10", "@types/cors": "^2.8.17", + "@types/dockerode": "^3.3.31", "@types/express": "^4.17.17", "@types/ip": "^1.1.3", - "@types/lzma-native": "^4.0.4", - "@types/mocha": "^10.0.4", - "@types/node": "^20.14.2", + "@types/jsonwebtoken": "^9.0.9", + "@types/lodash": "^4.17.21", + "@types/mocha": "^10.0.10", + "@types/node": "^25.0.3", "@types/node-cron": "^3.0.11", - "@types/rdfjs__formats-common": "^3.1.5", + "@types/sinon": "^17.0.4", + "@types/tar-stream": "^3.1.4", "@typescript-eslint/eslint-plugin": "^6.8.0", "@typescript-eslint/parser": "^6.8.0", "auto-changelog": "^2.4.0", @@ -101,35 +90,57 @@ "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-promise": "^6.1.1", - "mocha": "^10.2.0", - "prettier": "^3.0.3", - "release-it": "^17.6.0", - "tsx": "^3.12.8" + "mocha": "^11.1.0", + "nyc": "^17.1.0", + "prettier": "^3.7.4", + "release-it": "^19.0.6", + "sinon": "^19.0.2", + "tsx": "^4.19.3", + "typescript": "^5.9.3" + } + }, + "node_modules/@achingbrain/http-parser-js": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@achingbrain/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-nPuMf2zVzBAGRigH/1jFpb/6HmJsps+15f4BPlGDp3vsjYB2ZgruAErUpKpcFiVRz3DHLXcGNmuwmqZx/sVI7A==", + "license": "MIT", + "dependencies": { + "uint8arrays": "^5.1.0" + } + }, + "node_modules/@achingbrain/http-parser-js/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, "node_modules/@achingbrain/nat-port-mapper": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@achingbrain/nat-port-mapper/-/nat-port-mapper-1.0.13.tgz", - "integrity": "sha512-B5GL6ILDek72OjoEyFGEuuNYaEOYxO06Ulhcaf/5iQ4EO8uaZWS+OkolYST7L+ecJrkjfaSNmSAsWRRuh+1Z5A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@achingbrain/nat-port-mapper/-/nat-port-mapper-4.0.5.tgz", + "integrity": "sha512-YAA4MW6jO6W7pmJaFzQ0AOLpu8iQClUkdT2HbfKLmtFjrpoZugnFj9wH8EONV9LxnIW+0W1J98ri+oApKyAKLQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@achingbrain/ssdp": "^4.0.1", - "@libp2p/logger": "^4.0.1", - "default-gateway": "^7.2.2", + "@achingbrain/ssdp": "^4.1.0", + "@chainsafe/is-ip": "^2.0.2", + "@libp2p/logger": "^6.0.5", + "abort-error": "^1.0.0", "err-code": "^3.0.1", - "it-first": "^3.0.1", + "netmask": "^2.0.2", "p-defer": "^4.0.0", - "p-timeout": "^6.1.1", + "race-signal": "^2.0.0", "xml2js": "^0.6.0" } }, "node_modules/@achingbrain/ssdp": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@achingbrain/ssdp/-/ssdp-4.0.6.tgz", - "integrity": "sha512-Y4JE2L9150i50V6lg/Y8+ilhxRpUZKKv+PKo68Aj7MjPfaUAar6ZHilF9h4/Zb3q0fqGMXNc9o11cQLNI8J8bA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@achingbrain/ssdp/-/ssdp-4.2.4.tgz", + "integrity": "sha512-1dZIV7dwYJRS1sTA0qIDzsMdwZAnPa7DGb2YuPqMq4PjEjvzBBuz2WIsXnrkRFCNY00JuqLiMby9GecnGsOgaQ==", "license": "Apache-2.0 OR MIT", "dependencies": { - "event-iterator": "^2.0.0", + "abort-error": "^1.0.0", "freeport-promise": "^2.0.0", "merge-options": "^3.0.4", "xml2js": "^0.6.2" @@ -141,28 +152,6 @@ "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", "license": "MIT" }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@arr/every": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.1.tgz", - "integrity": "sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", @@ -366,678 +355,668 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.629.0.tgz", - "integrity": "sha512-Q0YXKdUA7NboPl94JOKD4clHHuERG1Kwy0JPbU+3Hvmz/UuwUGBmlfaRAqd9y4LXsTv/2xKtFPW9R+nBfy9mwA==", + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.982.0.tgz", + "integrity": "sha512-k0ANYAtPiON9BwLXcDgJXkmmCAGEuSk2pZOvrMej2kNhs3xTXoPshIUR5UMCD9apYiWtXJJfXMZSgaME+iWNaQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.629.0", - "@aws-sdk/client-sts": "3.629.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.629.0", - "@aws-sdk/middleware-bucket-endpoint": "3.620.0", - "@aws-sdk/middleware-expect-continue": "3.620.0", - "@aws-sdk/middleware-flexible-checksums": "3.620.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-location-constraint": "3.609.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-sdk-s3": "3.629.0", - "@aws-sdk/middleware-ssec": "3.609.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/signature-v4-multi-region": "3.629.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@aws-sdk/xml-builder": "3.609.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/eventstream-serde-browser": "^3.0.6", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.5", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-blob-browser": "^3.1.2", - "@smithy/hash-node": "^3.0.3", - "@smithy/hash-stream-node": "^3.1.2", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/md5-js": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/middleware-bucket-endpoint": "^3.972.3", + "@aws-sdk/middleware-expect-continue": "^3.972.3", + "@aws-sdk/middleware-flexible-checksums": "^3.972.4", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-location-constraint": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-sdk-s3": "^3.972.6", + "@aws-sdk/middleware-ssec": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/signature-v4-multi-region": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.982.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/eventstream-serde-browser": "^4.2.8", + "@smithy/eventstream-serde-config-resolver": "^4.3.8", + "@smithy/eventstream-serde-node": "^4.2.8", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-blob-browser": "^4.2.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/hash-stream-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/md5-js": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.629.0.tgz", - "integrity": "sha512-2w8xU4O0Grca5HmT2dXZ5fF0g39RxODtmoqHJDsK5DSt750LqDG4w3ktmBvQs3+SrpkkJOjlX5v/hb2PCxVbww==", + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.982.0.tgz", + "integrity": "sha512-qJrIiivmvujdGqJ0ldSUvhN3k3N7GtPesoOI1BSt0fNXovVnMz4C/JmnkhZihU7hJhDvxJaBROLYTU+lpild4w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.982.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.629.0.tgz", - "integrity": "sha512-3if0LauNJPqubGYf8vnlkp+B3yAeKRuRNxfNbHlE6l510xWGcKK/ZsEmiFmfePzKKSRrDh/cxMFMScgOrXptNg==", + "node_modules/@aws-sdk/core": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.6.tgz", + "integrity": "sha512-pz4ZOw3BLG0NdF25HoB9ymSYyPbMiIjwQJ2aROXRhAzt+b+EOxStfFv8s5iZyP6Kiw7aYhyWxj5G3NhmkoOTKw==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.629.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/xml-builder": "^3.972.4", + "@smithy/core": "^3.22.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.629.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.629.0.tgz", - "integrity": "sha512-RjOs371YwnSVGxhPjuluJKaxl4gcPYTAky0nPjwBime0i9/iS9nI8R8l5j7k7ec9tpFWjBPvNnThCU07pvjdzw==", + "node_modules/@aws-sdk/crc64-nvme": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.0.tgz", + "integrity": "sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.629.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.629.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/core": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.629.0.tgz", - "integrity": "sha512-+/ShPU/tyIBM3oY1cnjgNA/tFyHtlWq+wXF9xEKRv19NOpYbWQ+xzNwVjGq8vR07cCRqy/sDQLWPhxjtuV/FiQ==", + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.4.tgz", + "integrity": "sha512-/8dnc7+XNMmViEom2xsNdArQxQPSgy4Z/lm6qaFPTrMFesT1bV3PsBhb19n09nmxHdrtQskYmViddUIjUQElXg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.6.tgz", + "integrity": "sha512-5ERWqRljiZv44AIdvIRQ3k+EAV0Sq2WeJHvXuK7gL7bovSxOf8Al7MLH7Eh3rdovH4KHFnlIty7J71mzvQBl5Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/types": "^3.973.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", - "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.4.tgz", + "integrity": "sha512-eRUg+3HaUKuXWn/lEMirdiA5HOKmEl8hEHVuszIDt2MMBUKgVX5XNGmb3XmbgU17h6DZ+RtjbxQpjhz3SbTjZg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-env": "^3.972.4", + "@aws-sdk/credential-provider-http": "^3.972.6", + "@aws-sdk/credential-provider-login": "^3.972.4", + "@aws-sdk/credential-provider-process": "^3.972.4", + "@aws-sdk/credential-provider-sso": "^3.972.4", + "@aws-sdk/credential-provider-web-identity": "^3.972.4", + "@aws-sdk/nested-clients": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.629.0.tgz", - "integrity": "sha512-r9fI7BABARvVDp77DBUImQzYdvarAIdhbvpCEZib0rlpvfWu3zxE9KZcapCAAi0MPjxeDfb7RMehFQIkAP7mYw==", + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.4.tgz", + "integrity": "sha512-nLGjXuvWWDlQAp505xIONI7Gam0vw2p7Qu3P6on/W2q7rjJXtYjtpHbcsaOjJ/pAju3eTvEQuSuRedcRHVQIAQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.629.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/nested-clients": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.629.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.629.0.tgz", - "integrity": "sha512-868hnVOLlXOBHk91Rl0jZIRgr/M4WJCa0nOrW9A9yidsQxuZp9P0vshDmm4hMvNZadmPIfo0Rra2MpA4RELoCw==", + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.5.tgz", + "integrity": "sha512-VWXKgSISQCI2GKN3zakTNHSiZ0+mux7v6YHmmbLQp/o3fvYUQJmKGcLZZzg2GFA+tGGBStplra9VFNf/WwxpYg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.629.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.629.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/credential-provider-env": "^3.972.4", + "@aws-sdk/credential-provider-http": "^3.972.6", + "@aws-sdk/credential-provider-ini": "^3.972.4", + "@aws-sdk/credential-provider-process": "^3.972.4", + "@aws-sdk/credential-provider-sso": "^3.972.4", + "@aws-sdk/credential-provider-web-identity": "^3.972.4", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.4.tgz", + "integrity": "sha512-TCZpWUnBQN1YPk6grvd5x419OfXjHvhj5Oj44GYb84dOVChpg/+2VoEj+YVA4F4E/6huQPNnX7UYbTtxJqgihw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.629.0.tgz", - "integrity": "sha512-Lf4XOuj6jamxgGZGrVojERh5S+NS2t2S4CUOnAu6tJ5U0GPlpjhINUKlcVxJBpsIXudMGW1nkumAd3+kazCPig==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.4.tgz", + "integrity": "sha512-wzsGwv9mKlwJ3vHLyembBvGE/5nPUIwRR2I51B1cBV4Cb4ql9nIIfpmHzm050XYTY5fqTOKJQnhLj7zj89VG8g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.629.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/client-sso": "3.982.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/token-providers": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.4.tgz", + "integrity": "sha512-hIzw2XzrG8jzsUSEatehmpkd5rWzASg5IHUfA+m01k/RtvfAML7ZJVVohuKdhAYx+wV2AThLiQJVzqn7F0khrw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/nested-clients": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.620.0.tgz", - "integrity": "sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.3.tgz", + "integrity": "sha512-fmbgWYirF67YF1GfD7cg5N6HHQ96EyRNx/rDIrTF277/zTWVuPI2qS/ZHgofwR1NZPe/NWvoppflQY01LrbVLg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-arn-parser": "3.568.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-arn-parser": "^3.972.2", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.620.0.tgz", - "integrity": "sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.3.tgz", + "integrity": "sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.620.0.tgz", - "integrity": "sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.972.4.tgz", + "integrity": "sha512-xOxsUkF3O3BtIe3tf54OpPo94eZepjFm3z0Dd2TZKbsPxMiRTFXurC04wJ58o/wPW9YHVO9VqZik3MfoPfrKlw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", - "@aws-sdk/types": "3.609.0", - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/crc64-nvme": "3.972.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.3.tgz", + "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.609.0.tgz", - "integrity": "sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.3.tgz", + "integrity": "sha512-nIg64CVrsXp67vbK0U1/Is8rik3huS3QkRHn2DRDx4NldrEFMgdkZGI/+cZMKD9k4YOS110Dfu21KZLHrFA/1g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.3.tgz", + "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.3.tgz", + "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "^3.973.1", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.629.0.tgz", - "integrity": "sha512-FRXLcnPWXBoq/T9mnGnrpqhrSKNSm22rqJ0L7P14KESmbGuwhF/7ELYYxXIpgnIpb/CIUVmIU5EE8lsW1VTe8A==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.6.tgz", + "integrity": "sha512-Xq7wM6kbgJN1UO++8dvH/efPb1nTwWqFCpZCR7RCLOETP7xAUAhVo7JmsCnML5Di/iC4Oo5VrJ4QmkYcMZniLw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.629.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-arn-parser": "3.568.0", - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-arn-parser": "^3.972.2", + "@smithy/core": "^3.22.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.609.0.tgz", - "integrity": "sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.3.tgz", + "integrity": "sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", - "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.6.tgz", + "integrity": "sha512-TehLN8W/kivl0U9HcS+keryElEWORROpghDXZBLfnb40DXM7hx/i+7OOjkogXQOF3QtUraJVRkHQ07bPhrWKlw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.982.0", + "@smithy/core": "^3.22.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.982.0.tgz", + "integrity": "sha512-VVkaH27digrJfdVrT64rjkllvOp4oRiZuuJvrylLXAKl18ujToJR7AqpDldL/LS63RVne3QWIpkygIymxFtliQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.982.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", + "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@aws-sdk/types": "^3.973.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.629.0.tgz", - "integrity": "sha512-GPX6dnmuLGDFp7CsGqGCzleEoNyr9ekgOzSBtcL5nKX++NruxO7f1QzJAbcYvz0gdKvz958UO0EKsGM6hnkTSg==", + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.982.0.tgz", + "integrity": "sha512-AWqjMAH848aNwnLCtIKM3WO00eHuUoYVfQMP4ccrUHhnEduGOusVgdHQ5mLNQZZNZzREuBwnPPhIP55cy0gFSg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.629.0", - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/middleware-sdk-s3": "^3.972.6", + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.982.0.tgz", + "integrity": "sha512-v3M0KYp2TVHYHNBT7jHD9lLTWAdS9CaWJ2jboRKt0WAB65bA7iUEpR+k4VqKYtpQN4+8kKSc4w+K6kUNZkHKQw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/nested-clients": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz", - "integrity": "sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==", + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.2.tgz", + "integrity": "sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", - "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.982.0.tgz", + "integrity": "sha512-M27u8FJP7O0Of9hMWX5dipp//8iglmV9jr7R8SR8RveU+Z50/8TqH68Tu6wUWBGMfXjzbVwn1INIAO5lZrlxXQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", + "version": "3.965.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.4.tgz", + "integrity": "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.3.tgz", + "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.4.tgz", + "integrity": "sha512-3WFCBLiM8QiHDfosQq3Py+lIMgWlFWwFQliUHUqwEiRqLnKyhgbU3AKa7AWJF7lW2Oc/2kFNY4MlAYVnVc0i8A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/types": "^3.973.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -1049,56 +1028,70 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.609.0.tgz", - "integrity": "sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.4.tgz", + "integrity": "sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.12.0", + "fast-xml-parser": "5.3.4", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", + "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1117,66 +1110,36 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, "license": "MIT" }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz", + "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -1188,146 +1151,53 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, "license": "ISC" }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", - "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1336,14555 +1206,1148 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.29.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/@balena/dockerignore": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", + "license": "Apache-2.0" }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@bergos/jsonparse": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@bergos/jsonparse/-/jsonparse-1.4.2.tgz", + "integrity": "sha512-qUt0QNJjvg4s1zk+AuLM6s/zcsQ8MvGn7+1f0vPuxvpCYa08YtTryuDInngbEyW5fNGGYe2znKt61RMGd5HnXg==", + "engines": [ + "node >= 0.2.0" + ], "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "buffer": "^6.0.3" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@bergos/jsonparse/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/@bergos/jsonparse/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/@chainsafe/as-chacha20poly1305": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@chainsafe/as-chacha20poly1305/-/as-chacha20poly1305-0.1.0.tgz", + "integrity": "sha512-BpNcL8/lji/GM3+vZ/bgRWqJ1q5kwvTFmGPk7pxm/QQZDbaMI98waOHjEymTjq2JmdD/INdNBFOVSyJofXg7ew==", + "license": "Apache-2.0" + }, + "node_modules/@chainsafe/as-sha256": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-1.2.0.tgz", + "integrity": "sha512-H2BNHQ5C3RS+H0ZvOdovK6GjFAyq5T6LClad8ivwj9Oaiy28uvdsGVS7gNJKuZmg0FGHAI+n7F0Qju6U0QkKDA==", + "license": "Apache-2.0" + }, + "node_modules/@chainsafe/is-ip": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.1.0.tgz", + "integrity": "sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==", "license": "MIT" }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" + "node_modules/@chainsafe/libp2p-noise": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-noise/-/libp2p-noise-17.0.0.tgz", + "integrity": "sha512-vwrmY2Y+L1xYhIDiEpl61KHxwrLCZoXzTpwhyk34u+3+6zCAZPL3GxH3i2cs+u5IYNoyLptORdH17RKFXy7upA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/as-chacha20poly1305": "^0.1.0", + "@chainsafe/as-sha256": "^1.2.0", + "@libp2p/crypto": "^5.1.9", + "@libp2p/interface": "^3.0.0", + "@libp2p/peer-id": "^6.0.0", + "@libp2p/utils": "^7.0.0", + "@noble/ciphers": "^2.0.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1", + "protons-runtime": "^5.6.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0", + "wherearewe": "^2.0.1" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" + "node_modules/@chainsafe/libp2p-noise/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", + "node_modules/@chainsafe/libp2p-yamux": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-yamux/-/libp2p-yamux-8.0.1.tgz", + "integrity": "sha512-pJsqmUg1cZRJZn/luAtQaq0uLcVfExo51Rg7iRtAEceNYtsKUi/exfegnvTBzTnF1CGmTzVEV3MCLsRhqiNyoA==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "@libp2p/interface": "^3.0.0", + "@libp2p/utils": "^7.0.0", + "race-signal": "^2.0.0", + "uint8arraylist": "^2.4.8" } }, - "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "node_modules/@chainsafe/netmask": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", + "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.2" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" + "@chainsafe/is-ip": "^2.0.1" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.1.90" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz", - "integrity": "sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw==", - "license": "MIT", + "node_modules/@digitalbazaar/http-client": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.3.0.tgz", + "integrity": "sha512-6lMpxpt9BOmqHKGs9Xm6DP4LlZTBFer/ZjHvP3FcW3IaUWYIWC7dw5RFZnvw4fP57kAVcm1dp3IF+Y50qhBvAw==", + "license": "BSD-3-Clause", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7" + "ky": "^1.14.2", + "undici": "^6.23.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "node_modules/@dnsquery/dns-packet": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@dnsquery/dns-packet/-/dns-packet-6.1.1.tgz", + "integrity": "sha512-WXTuFvL3G+74SchFAtz3FgIYVOe196ycvGsMgvSH/8Goptb1qpIQtIuM4SOK9G9lhMWYpHxnXyy544ZhluFOew==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@leichtgewicht/ip-codec": "^2.0.4", + "utf8-codec": "^1.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", - "license": "MIT", + "node_modules/@elastic/elasticsearch": { + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.19.1.tgz", + "integrity": "sha512-+1j9NnQVOX+lbWB8LhCM7IkUmjU05Y4+BmSLfusq0msCsQb1Va+OUKFCoOXjCJqQrcgdRdQCjYYyolQ/npQALQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@elastic/transport": "^8.9.6", + "apache-arrow": "18.x - 21.x", + "tslib": "^2.4.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", - "license": "MIT", + "node_modules/@elastic/transport": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.10.1.tgz", + "integrity": "sha512-xo2lPBAJEt81fQRAKa9T/gUq1SPGBHpSnVUXhoSpL996fPZRAfQwFA4BZtEUQL1p8Dezodd3ZN8Wwno+mYyKuw==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@opentelemetry/api": "1.x", + "@opentelemetry/core": "2.x", + "debug": "^4.4.1", + "hpagent": "^1.2.0", + "ms": "^2.1.3", + "secure-json-parse": "^3.0.1", + "tslib": "^2.8.1", + "undici": "^6.21.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz", - "integrity": "sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw==", + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", - "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", - "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.0", - "globals": "^11.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", - "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-flow": "^7.24.7" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" - }, + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-object-assign": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.24.7.tgz", - "integrity": "sha512-DOzAi77P9jSyPijHS7Z8vH0wLRcZH6wWxuIZgLAiy8FWOkcKMJmnyHjy2JM94k6A0QxlA/hlLh+R9T3GEryjNQ==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", - "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", - "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.25.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", - "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "node_modules/@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "license": "MIT", + "node_modules/@ethereumjs/tx": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "license": "MPL-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", - "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", + "node_modules/@ethersproject/abi": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", + "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "node_modules/@ethersproject/abstract-provider": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", + "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "license": "MIT" - }, - "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "node_modules/@ethersproject/abstract-signer": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", + "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0" } }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "node_modules/@ethersproject/address": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", + "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/rlp": "^5.8.0" } }, - "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "node_modules/@ethersproject/base64": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", + "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/bytes": "^5.8.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@ethersproject/basex": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz", + "integrity": "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/properties": "^5.8.0" } }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "node_modules/@ethersproject/bignumber": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", + "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "bn.js": "^5.2.1" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "node_modules/@ethersproject/bignumber/node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", "license": "MIT" }, - "node_modules/@bergos/jsonparse": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@bergos/jsonparse/-/jsonparse-1.4.1.tgz", - "integrity": "sha512-vXIT0nzZGX/+yMD5bx2VhTzc92H55tPoehh1BW/FZHOndWGFddrH3MAfdx39FRc7irABirW6EQaGxIJYV6CGuA==", - "engines": [ - "node >= 0.2.0" + "node_modules/@ethersproject/bytes": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", + "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } ], "license": "MIT", "dependencies": { - "buffer": "^6.0.3" + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainsafe/as-chacha20poly1305": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@chainsafe/as-chacha20poly1305/-/as-chacha20poly1305-0.1.0.tgz", - "integrity": "sha512-BpNcL8/lji/GM3+vZ/bgRWqJ1q5kwvTFmGPk7pxm/QQZDbaMI98waOHjEymTjq2JmdD/INdNBFOVSyJofXg7ew==", - "license": "Apache-2.0" - }, - "node_modules/@chainsafe/as-sha256": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.4.2.tgz", - "integrity": "sha512-HJ8GZBRjLeWtRsAXf3EbNsNzmTGpzTFjfpSf4yHkLYC+E52DhT6hwz+7qpj6I/EmFzSUm5tYYvT9K8GZokLQCQ==", - "license": "Apache-2.0" - }, - "node_modules/@chainsafe/is-ip": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.0.2.tgz", - "integrity": "sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA==", - "license": "MIT" - }, - "node_modules/@chainsafe/libp2p-gossipsub": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-gossipsub/-/libp2p-gossipsub-13.1.1.tgz", - "integrity": "sha512-4/9M6N6kUy4Ek/mynRp251fIJdhM0PTKZzUDH4DvSJsmciGenEOUgXQkyYh9Ui1dbuI6dmU/vVLKqmIkaRCtqg==", - "license": "Apache-2.0", + "node_modules/@ethersproject/constants": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", + "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", "dependencies": { - "@libp2p/crypto": "^4.0.1", - "@libp2p/interface": "^1.5.0", - "@libp2p/interface-internal": "^1.0.7", - "@libp2p/peer-id": "^4.0.5", - "@libp2p/pubsub": "^9.0.8", - "@multiformats/multiaddr": "^12.1.14", - "denque": "^2.1.0", - "it-length-prefixed": "^9.0.4", - "it-pipe": "^3.0.1", - "it-pushable": "^3.2.3", - "multiformats": "^13.0.1", - "protons-runtime": "5.4.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.0.1" - }, - "engines": { - "npm": ">=8.7.0" + "@ethersproject/bignumber": "^5.8.0" } }, - "node_modules/@chainsafe/libp2p-gossipsub/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", + "node_modules/@ethersproject/contracts": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz", + "integrity": "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "@ethersproject/abi": "^5.8.0", + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0" } }, - "node_modules/@chainsafe/libp2p-gossipsub/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", + "node_modules/@ethersproject/hash": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", + "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", "dependencies": { - "multiformats": "^13.0.0" + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainsafe/libp2p-noise": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-noise/-/libp2p-noise-15.1.1.tgz", - "integrity": "sha512-66EPS8gFTkb1jVCiJoY3+ulG/ZTef7kiNZZZvUOUzsLIZYQTi+7pIDBpgmolzSXdsFb8I2hl5mZsvcbzVZB5gg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/as-chacha20poly1305": "^0.1.0", - "@chainsafe/as-sha256": "^0.4.1", - "@libp2p/crypto": "^4.0.0", - "@libp2p/interface": "^1.5.0", - "@libp2p/peer-id": "^4.0.0", - "@noble/ciphers": "^0.6.0", - "@noble/curves": "^1.1.0", - "@noble/hashes": "^1.3.1", - "it-length-prefixed": "^9.0.1", - "it-length-prefixed-stream": "^1.0.0", - "it-pair": "^2.0.6", - "it-pipe": "^3.0.1", - "it-stream-types": "^2.0.1", - "protons-runtime": "^5.0.0", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^5.0.0", - "wherearewe": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@chainsafe/libp2p-noise/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@chainsafe/libp2p-yamux": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-yamux/-/libp2p-yamux-6.0.2.tgz", - "integrity": "sha512-S5OkLHqYhEVMQQ4BTgnRANEIbGTQhaC23glCgBwGdeoTRtMpIozwDiPfljFLCm0RYWdCRJw9oFztO95KUHjptA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.1.3", - "@libp2p/utils": "^5.2.5", - "get-iterator": "^2.0.1", - "it-foreach": "^2.0.6", - "it-pipe": "^3.0.1", - "it-pushable": "^3.2.3", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@chainsafe/netmask": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", - "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", - "license": "MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "license": "MIT", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@digitalbazaar/http-client": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz", - "integrity": "sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==", - "license": "BSD-3-Clause", - "dependencies": { - "ky": "^0.33.3", - "ky-universal": "^0.11.0", - "undici": "^5.21.2" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/@elastic/elasticsearch": { - "version": "8.16.1", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.16.1.tgz", - "integrity": "sha512-ddBaY9ITag4egeYNY+uGWi7QZSX2x+SWTEum1bvfspbEU/G5Q3g6sdlBAkg29NWIpINH6FEnaanGeO7XjNvSHQ==", - "license": "Apache-2.0", - "dependencies": { - "@elastic/transport": "^8.9.1", - "apache-arrow": "^18.0.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@elastic/transport": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.9.1.tgz", - "integrity": "sha512-jasKNQeOb1vNf9aEYg+8zXmetaFjApDTSCC4QTl6aTixvyiRiSLcCiB8P6Q0lY9JIII/BhqNl8WbpFnsKitntw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "1.x", - "debug": "^4.3.4", - "hpagent": "^1.0.0", - "ms": "^2.1.3", - "secure-json-parse": "^2.4.0", - "tslib": "^2.4.0", - "undici": "^6.12.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@elastic/transport/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@elastic/transport/node_modules/undici": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", - "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/get/node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@electron/get/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@electron/get/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.10.8.tgz", - "integrity": "sha512-3P1JiGL4xaR9PoTKUHa2N/LKwa2/eUdRqGwijMWWgBqbFEqJUVpmaOi2TcjcemrsRMgFLBzQCK4ToPhrSVDiFQ==", - "license": "MIT", - "dependencies": { - "comment-parser": "1.2.4", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "1.1.1" - }, - "engines": { - "node": "^12 || ^14 || ^16" - } - }, - "node_modules/@es-joy/jsdoccomment/node_modules/jsdoc-type-pratt-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz", - "integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", - "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "license": "MPL-2.0", - "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bignumber/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "license": "MIT" - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "license": "MIT" - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT" - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "license": "MIT" - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/@frogcat/ttl2jsonld": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@frogcat/ttl2jsonld/-/ttl2jsonld-0.0.9.tgz", - "integrity": "sha512-oT3Abc9sEnwcCx9cTgRCTbz+Y/9fvbqfW22A5V4ChoQ8/P++2eAvlWgUghFoNm2V9U3/CCDSP9HTGJ51D+n1Uw==", - "license": "MIT", - "bin": { - "ttl2jsonld": "bin/cli.js" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "license": "MIT", - "optional": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "license": "BSD-3-Clause" - }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true, - "license": "ISC" - }, - "node_modules/@inquirer/figures": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jclem/logfmt2": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@jclem/logfmt2/-/logfmt2-2.4.3.tgz", - "integrity": "sha512-d7zluLlx+JRtVICF0+ghcrVdXBdE3eXrpIuFdcCcWxA3ABOyemkTySG4ha2AdsWFwAnh8tkB1vtyeZsWAbLumg==", - "license": "MIT", - "engines": { - "node": ">= 14.x", - "npm": ">= 7.x" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kikobeats/time-span": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@kikobeats/time-span/-/time-span-1.0.5.tgz", - "integrity": "sha512-txRAdmi35N1wnsLS1AO5mTlbY5Cv5/61WXqek2y3L9Q7u4mgdUVq819so5xe753hL5gYeLzlWoJ/VJfXg9nx8g==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" - }, - "node_modules/@libp2p/autonat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/autonat/-/autonat-1.1.4.tgz", - "integrity": "sha512-yt/sUisqBLZPM/0lvpRo0enIEIbdyuSraIu4xRlGkdqqAXSo9T6CJppXxNi9VKTmlmD39WYYNP41Ilt3SvQhRQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/interface-internal": "^1.3.3", - "@libp2p/peer-id": "^4.2.3", - "@libp2p/utils": "^5.4.8", - "@multiformats/multiaddr": "^12.2.3", - "it-first": "^3.0.6", - "it-length-prefixed": "^9.0.4", - "it-map": "^3.1.0", - "it-parallel": "^3.0.7", - "it-pipe": "^3.0.1", - "protons-runtime": "^5.4.0", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@libp2p/autonat/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/autonat/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/bootstrap": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/bootstrap/-/bootstrap-10.1.4.tgz", - "integrity": "sha512-bt4Tz/DMKnlvZhF4d9Nkv/K7qgnoDBM/N0zwjA/aQg1vSq54/Szc2K3cIDAv9/r9dM4ckDRmIZZENr/bwcIIKw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/peer-id": "^4.2.3", - "@multiformats/mafmt": "^12.1.6", - "@multiformats/multiaddr": "^12.2.3" - } - }, - "node_modules/@libp2p/bootstrap/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/bootstrap/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/circuit-relay-v2": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/circuit-relay-v2/-/circuit-relay-v2-1.1.4.tgz", - "integrity": "sha512-WLiisIvRWVSJLzb4MO1aqDOD2A7s99OgpfeKKt9nxSaq34WeQS9aGN9YxSczYkum9hBTdnLJZZDQrd6SId6NbQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/interface-internal": "^1.3.3", - "@libp2p/peer-collections": "^5.2.8", - "@libp2p/peer-id": "^4.2.3", - "@libp2p/peer-record": "^7.0.24", - "@libp2p/utils": "^5.4.8", - "@multiformats/mafmt": "^12.1.6", - "@multiformats/multiaddr": "^12.2.3", - "any-signal": "^4.1.1", - "it-protobuf-stream": "^1.1.3", - "it-stream-types": "^2.0.1", - "multiformats": "^13.1.0", - "p-defer": "^4.0.1", - "progress-events": "^1.0.0", - "protons-runtime": "^5.4.0", - "race-signal": "^1.0.2", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/circuit-relay-v2/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/circuit-relay-v2/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/crypto": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-4.1.8.tgz", - "integrity": "sha512-j8d1gOS6ypt6CSYgBTJKSTGsht3SFPkhfOkGND6sUCl1w9pRslDlvFnU9UrNHLMiaNmVHaeS9B2IKzKMbLX92Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0", - "asn1js": "^3.0.5", - "multiformats": "^13.1.0", - "protons-runtime": "^5.4.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/crypto/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/dcutr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/dcutr/-/dcutr-1.1.4.tgz", - "integrity": "sha512-NjIiAoi5q2Y2q0eON+VCdm8ec2Be1Q9q1vcL6z7RyBWwIkk6PPy8RvBaI6GcGKjk251jLrN6vz2yoL7vWRht2A==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/interface-internal": "^1.3.3", - "@libp2p/utils": "^5.4.8", - "@multiformats/multiaddr": "^12.2.3", - "@multiformats/multiaddr-matcher": "^1.2.1", - "delay": "^6.0.0", - "it-protobuf-stream": "^1.1.3", - "protons-runtime": "^5.4.0", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@libp2p/dcutr/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/dcutr/node_modules/delay": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz", - "integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@libp2p/dcutr/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/floodsub": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/floodsub/-/floodsub-9.1.4.tgz", - "integrity": "sha512-epH/OUYkKzQv3o1PX7mveWQMLAy/ImQ5ep823wwuRhIDFKUsNBSROIBHjEbBO6F7twDs59nDxTfNOhKJzcTzAQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/pubsub": "^9.0.25", - "protons-runtime": "^5.4.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/floodsub/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/identify": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/identify/-/identify-2.1.4.tgz", - "integrity": "sha512-w2JkmoZkXT3OJnTuyBPlEBicj1J1n90pcusZbs+YIiJ+mhsOvNKnQhJgCG8Q6wnTimcBjinqhRRp0hiaHqX7VQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/interface-internal": "^1.3.3", - "@libp2p/peer-id": "^4.2.3", - "@libp2p/peer-record": "^7.0.24", - "@multiformats/multiaddr": "^12.2.3", - "@multiformats/multiaddr-matcher": "^1.2.1", - "it-drain": "^3.0.7", - "it-parallel": "^3.0.7", - "it-protobuf-stream": "^1.1.3", - "protons-runtime": "^5.4.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0", - "wherearewe": "^2.0.1" - } - }, - "node_modules/@libp2p/identify/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/identify/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/interface": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-1.6.3.tgz", - "integrity": "sha512-Tm8W5Q2FsjcSdeA5BvP/GTUq/lp3SjeW6GPmWbbIasBJdv67UGHahu8YDFTME90IxTijnikkfGNkOPsd/4UuvA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@multiformats/multiaddr": "^12.2.3", - "it-pushable": "^3.2.3", - "it-stream-types": "^2.0.1", - "multiformats": "^13.1.0", - "progress-events": "^1.0.0", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@libp2p/interface-address-manager": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/interface-address-manager/-/interface-address-manager-3.0.1.tgz", - "integrity": "sha512-8N1nfOtZ/CnZ/cL0Bnj59fhcSs7orI4evmNVsv2DM1VaNHXqc9tPy8JmQE2HRjrUXeUPwtzzG2eoP7l0ZYdC0g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@multiformats/multiaddr": "^12.0.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@libp2p/interface-address-manager/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/interface-address-manager/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/interface-internal": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@libp2p/interface-internal/-/interface-internal-1.3.3.tgz", - "integrity": "sha512-xng1cBGDhSZmCu0kUEv3363oSgpoPmvpDr11wumhKNEgGOwBVbEr0v7serYcrlORxFmyUBW8y98CkPRJxskPLA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/peer-collections": "^5.2.8", - "@multiformats/multiaddr": "^12.2.3", - "progress-events": "^1.0.0", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@libp2p/interface-internal/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/interface-internal/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/interface/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/interface/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/kad-dht": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/kad-dht/-/kad-dht-12.1.4.tgz", - "integrity": "sha512-TWg3WB/Ghqz2vVOBxZz3PD0gDw1j24GlcQiJw5AieXMY1va8ZxkYyJtpHluhPpjLnlI4zxNLbE30A05Tp6XD4w==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/crypto": "^4.1.8", - "@libp2p/interface": "^1.6.3", - "@libp2p/interface-internal": "^1.3.3", - "@libp2p/peer-collections": "^5.2.8", - "@libp2p/peer-id": "^4.2.3", - "@libp2p/record": "^4.0.4", - "@libp2p/utils": "^5.4.8", - "@multiformats/multiaddr": "^12.2.3", - "any-signal": "^4.1.1", - "hashlru": "^2.3.0", - "interface-datastore": "^8.2.11", - "it-drain": "^3.0.7", - "it-length": "^3.0.6", - "it-length-prefixed": "^9.0.4", - "it-map": "^3.1.0", - "it-merge": "^3.0.5", - "it-parallel": "^3.0.7", - "it-pipe": "^3.0.1", - "it-protobuf-stream": "^1.1.3", - "it-take": "^3.0.5", - "multiformats": "^13.1.0", - "p-defer": "^4.0.1", - "p-event": "^6.0.1", - "p-queue": "^8.0.1", - "progress-events": "^1.0.0", - "protons-runtime": "^5.4.0", - "race-signal": "^1.0.2", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/kad-dht/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/kad-dht/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/logger": { - "version": "4.0.19", - "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-4.0.19.tgz", - "integrity": "sha512-VKpIMbjzs60AaTezh55iEDPJ0W2icbkJkBXSlAMycCT4C+RYxOTRgevasw3mDB6+Lj9etM0nfa4vutoG4fsYCw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@multiformats/multiaddr": "^12.2.3", - "interface-datastore": "^8.2.11", - "multiformats": "^13.1.0", - "weald": "^1.0.2" - } - }, - "node_modules/@libp2p/logger/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/logger/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/mdns": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/mdns/-/mdns-10.1.4.tgz", - "integrity": "sha512-OlvfOGdNw9jPpTwgS9TYskNNn8kiqVDAIT42XOL9aLIXlX6Uqx1LlKphoWUxL01TsSIBUX5asKdnbGPpV/qqLA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/interface-internal": "^1.3.3", - "@libp2p/peer-id": "^4.2.3", - "@libp2p/utils": "^5.4.8", - "@multiformats/multiaddr": "^12.2.3", - "@types/multicast-dns": "^7.2.4", - "dns-packet": "^5.6.1", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/@libp2p/mdns/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/mdns/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/multistream-select": { - "version": "5.1.16", - "resolved": "https://registry.npmjs.org/@libp2p/multistream-select/-/multistream-select-5.1.16.tgz", - "integrity": "sha512-0IUecYYu++gimGRzG324A6+NE9Vk/6Wvmp2xegfLjUZRegpFbHup3UvFEGxTkpHmsoswJMMTPHQyCNJFga+Z7Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "it-length-prefixed": "^9.0.4", - "it-length-prefixed-stream": "^1.1.7", - "it-stream-types": "^2.0.1", - "p-defer": "^4.0.1", - "race-signal": "^1.0.2", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/multistream-select/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/peer-collections": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-5.2.8.tgz", - "integrity": "sha512-dIakIFms3GgFYg4lVgl9afAm+OAxGTofz4KdFnVrlNW1z6VFhTbnRtvTweR6woSr2es1+Fu6WutmZ+62Fn0iOQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/peer-id": "^4.2.3", - "@libp2p/utils": "^5.4.8" - } - }, - "node_modules/@libp2p/peer-id": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-4.2.3.tgz", - "integrity": "sha512-hRqPzcYOz/5q6QvHYdmPMGeFZCjC/9qxQ/+jstSDMnY1DuKEXCre2+tCpG9OeRAFyPBbs5isfaqbY3zNZV2pqA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "multiformats": "^13.1.0", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/peer-id-factory": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@libp2p/peer-id-factory/-/peer-id-factory-4.2.3.tgz", - "integrity": "sha512-4ryh3M4UH+nwlM1o3y3iCpW2jTxjj+Hgb6UNI1nFxZGLA6MI+En8kKiroa970xiVvsA+Xmas8B9gWeMFrZKBKg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/crypto": "^4.1.8", - "@libp2p/interface": "^1.6.3", - "@libp2p/peer-id": "^4.2.3", - "protons-runtime": "^5.4.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/peer-id-factory/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/peer-id/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/peer-record": { - "version": "7.0.24", - "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-7.0.24.tgz", - "integrity": "sha512-2LYvLqr3XDjA5u2LGD/3IvdgdrwOYdMzQnzr612/Q+yVS+36CN0dAIqU74OEWx+XeeUJSBQnQ0ryBQq/arbXuA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/crypto": "^4.1.8", - "@libp2p/interface": "^1.6.3", - "@libp2p/peer-id": "^4.2.3", - "@libp2p/utils": "^5.4.8", - "@multiformats/multiaddr": "^12.2.3", - "protons-runtime": "^5.4.0", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/peer-record/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/peer-record/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/peer-store": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/peer-store/-/peer-store-10.1.4.tgz", - "integrity": "sha512-D/lqEaWZV8xEBQ7b0ZEFYtaa6+LjXjs+PRrFpmnvyuz86o9KQedVoJPufT4g0nKIeQZUtdRfkzWNnwD+fru64g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/peer-collections": "^5.2.8", - "@libp2p/peer-id": "^4.2.3", - "@libp2p/peer-record": "^7.0.24", - "@multiformats/multiaddr": "^12.2.3", - "interface-datastore": "^8.2.11", - "it-all": "^3.0.6", - "mortice": "^3.0.4", - "multiformats": "^13.1.0", - "protons-runtime": "^5.4.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/peer-store/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/peer-store/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/ping": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/ping/-/ping-1.1.4.tgz", - "integrity": "sha512-biwYtLaEHky2hsLzVZnPzrwME2WwaMu2MG+poKepxS36Ib9EM7XPGVUjpoafCQBM+Z67AMiFpKVtk3k9Kb24Gw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/crypto": "^4.1.8", - "@libp2p/interface": "^1.6.3", - "@libp2p/interface-internal": "^1.3.3", - "@multiformats/multiaddr": "^12.2.3", - "it-first": "^3.0.6", - "it-pipe": "^3.0.1", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/ping/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/ping/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/pubsub": { - "version": "9.0.25", - "resolved": "https://registry.npmjs.org/@libp2p/pubsub/-/pubsub-9.0.25.tgz", - "integrity": "sha512-IpAN2O/Xcqk0hXDv37zLGvzyQtR4o0xiZl3IC/P7QFikFf+mrmh80Zz447LhmHdRI/BpAwES0NYYCfjBDHu5+Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/crypto": "^4.1.8", - "@libp2p/interface": "^1.6.3", - "@libp2p/interface-internal": "^1.3.3", - "@libp2p/peer-collections": "^5.2.8", - "@libp2p/peer-id": "^4.2.3", - "@libp2p/utils": "^5.4.8", - "it-length-prefixed": "^9.0.4", - "it-pipe": "^3.0.1", - "it-pushable": "^3.2.3", - "multiformats": "^13.1.0", - "p-queue": "^8.0.1", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/pubsub-peer-discovery": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@libp2p/pubsub-peer-discovery/-/pubsub-peer-discovery-10.0.2.tgz", - "integrity": "sha512-7DLasMSo443nxPJ+X95tXazXgO96K2/TafoexDxi4QVWIKgkmK+HyoFRcmwog2pjhA1/KQUsPu8S8wH6Ns9Oow==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.0.1", - "@libp2p/interface-internal": "^1.0.1", - "@libp2p/peer-id": "^4.0.1", - "@multiformats/multiaddr": "^12.0.0", - "protons-runtime": "^5.0.0", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^4.0.9" - } - }, - "node_modules/@libp2p/pubsub-peer-discovery/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/pubsub-peer-discovery/node_modules/@multiformats/multiaddr/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/pubsub/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/record": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@libp2p/record/-/record-4.0.4.tgz", - "integrity": "sha512-wEEeHXGNIcc8HtGbgGMuSHbboUWMxKG7OxALFwkE+KACgfRJZTESOp6XIdZnyC0r9lfEFsjF01pFKBTzoBmWEQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "protons-runtime": "^5.4.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/record/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/tcp": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/tcp/-/tcp-9.1.4.tgz", - "integrity": "sha512-0j/aYdMFLhLWUodtyuBt5+smzkmXCiczOxNOwKyTVUuoMMcAPCLxACqCy8213qiwpJ3qP5ZTTTs/JJMgWRC7ag==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/utils": "^5.4.8", - "@multiformats/mafmt": "^12.1.6", - "@multiformats/multiaddr": "^12.2.3", - "@types/sinon": "^17.0.3", - "progress-events": "^1.0.0", - "stream-to-it": "^1.0.1" - } - }, - "node_modules/@libp2p/tcp/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/tcp/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/upnp-nat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@libp2p/upnp-nat/-/upnp-nat-1.2.4.tgz", - "integrity": "sha512-oI0yAg7GKpiPy4u2u/34wYPJ/CLBraIA5dUh21ZGy3TH88eaTOYfyHSfGw9AI0IT/012xxkpqbA+h5+V+qDoBQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@achingbrain/nat-port-mapper": "^1.0.13", - "@libp2p/interface": "^1.6.3", - "@libp2p/interface-internal": "^1.3.3", - "@libp2p/utils": "^5.4.8", - "@multiformats/multiaddr": "^12.2.3", - "wherearewe": "^2.0.1" - } - }, - "node_modules/@libp2p/upnp-nat/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/upnp-nat/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/utils": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-5.4.8.tgz", - "integrity": "sha512-3ysAjrheDvcrUd8RWOCwa6Hm+5FMsYOlPq9IPllfD0jOyHO2RHc/huvAmjBg/PWrTdUyx1nWQf9wmdQFgTDUDQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.2", - "@libp2p/crypto": "^4.1.8", - "@libp2p/interface": "^1.6.3", - "@libp2p/logger": "^4.0.19", - "@multiformats/multiaddr": "^12.2.3", - "@multiformats/multiaddr-matcher": "^1.2.1", - "@sindresorhus/fnv1a": "^3.1.0", - "@types/murmurhash3js-revisited": "^3.0.3", - "any-signal": "^4.1.1", - "delay": "^6.0.0", - "get-iterator": "^2.0.1", - "is-loopback-addr": "^2.0.2", - "it-pushable": "^3.2.3", - "it-stream-types": "^2.0.1", - "murmurhash3js-revisited": "^3.0.0", - "netmask": "^2.0.2", - "p-defer": "^4.0.1", - "race-event": "^1.3.0", - "race-signal": "^1.0.2", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/utils/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/utils/node_modules/delay": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz", - "integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@libp2p/utils/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@libp2p/websockets": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/@libp2p/websockets/-/websockets-8.1.4.tgz", - "integrity": "sha512-VWVgIo8t4VTzTI+orfGQxeHSXNWQL6dF//nH2p3nI5Z0saR6lrv5pNTsXbIhrZukGRFGgSwqGsd8bGhEohKNrQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^1.6.3", - "@libp2p/utils": "^5.4.8", - "@multiformats/mafmt": "^12.1.6", - "@multiformats/multiaddr": "^12.2.3", - "@multiformats/multiaddr-to-uri": "^10.0.1", - "@types/ws": "^8.5.10", - "it-ws": "^6.1.1", - "p-defer": "^4.0.1", - "progress-events": "^1.0.0", - "race-signal": "^1.0.2", - "wherearewe": "^2.0.1", - "ws": "^8.17.0" - } - }, - "node_modules/@libp2p/websockets/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@libp2p/websockets/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@ljharb/resumer": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.1.3.tgz", - "integrity": "sha512-d+tsDgfkj9X5QTriqM4lKesCkMMJC3IrbPKHvayP00ELx2axdXvDfWkqjxrLXIzGcQzmj7VAUT1wopqARTvafw==", - "license": "MIT", - "dependencies": { - "@ljharb/through": "^2.3.13", - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@ljharb/through": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", - "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@multiformats/dns": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.6.tgz", - "integrity": "sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@types/dns-packet": "^5.6.5", - "buffer": "^6.0.3", - "dns-packet": "^5.6.1", - "hashlru": "^2.3.0", - "p-queue": "^8.0.1", - "progress-events": "^1.0.0", - "uint8arrays": "^5.0.2" - } - }, - "node_modules/@multiformats/dns/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@multiformats/mafmt": { - "version": "12.1.6", - "resolved": "https://registry.npmjs.org/@multiformats/mafmt/-/mafmt-12.1.6.tgz", - "integrity": "sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@multiformats/multiaddr": "^12.0.0" - } - }, - "node_modules/@multiformats/mafmt/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@multiformats/mafmt/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@multiformats/multiaddr": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-10.5.0.tgz", - "integrity": "sha512-u4qHMyv25iAqCb9twJROoN1M8UDm8bureOCIzwz03fVhwJzV6DpgH1eFz9UAzDn7CpSShQ9SLS5MiC4hJjTfig==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "dns-over-http-resolver": "^2.1.0", - "err-code": "^3.0.1", - "is-ip": "^5.0.0", - "multiformats": "^9.4.5", - "uint8arrays": "^3.0.0", - "varint": "^6.0.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@multiformats/multiaddr-matcher": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-matcher/-/multiaddr-matcher-1.2.4.tgz", - "integrity": "sha512-GgpqzQFL4Mj8t7cLNHC5nuYUuSm0kTtSUyYswiyWwTSUY3XwRAMx0UiFWQg+ETk0u+/IvFaHxfnyEoH3tasvwg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@multiformats/multiaddr": "^12.0.0", - "multiformats": "^13.0.0" - } - }, - "node_modules/@multiformats/multiaddr-matcher/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@multiformats/multiaddr-matcher/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@multiformats/multiaddr-to-uri": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-10.1.0.tgz", - "integrity": "sha512-ZNwSAx3ssBWwd4y0LKrOsq9xG7LBHboQxnUdSduNc2fTh/NS1UjA2slgUy6KHxH5k9S2DSus0iU2CoyJyN0/pg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@multiformats/multiaddr": "^12.3.0" - } - }, - "node_modules/@multiformats/multiaddr-to-uri/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@multiformats/multiaddr-to-uri/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/@multiformats/multiaddr/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, - "node_modules/@multiformats/multiaddr/node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "license": "MIT", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/@noble/ciphers": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.6.0.tgz", - "integrity": "sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.5.0.tgz", - "integrity": "sha512-J5EKamIHnKPyClwVrzmaf5wSdQXgdHcPZIZLu3bwnbeCx8/7NPK5q2ZBWF+5FvYGByjiQQsJYX6jfgB2wDPn3A==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "license": "MIT", - "optional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@oceanprotocol/contracts": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@oceanprotocol/contracts/-/contracts-2.2.1.tgz", - "integrity": "sha512-ub+CuN61seLtUvdTm/iFCyF6+wG5iCovhLaDQywKJw3RuM4gzSnxeOkBf0n0sf1ZJOGuhVcPZXHOfybtUPqVjA==", - "license": "Apache-2.0" - }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, - "node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.40.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "license": "MIT", - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz", - "integrity": "sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3", - "bottleneck": "^2.15.3" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-3.7.0.tgz", - "integrity": "sha512-qrKT1Yl/KuwGSC6/oHpLBot3ooC9rq0/ryDYBCpkRtoj+R8T47xTMDT6Tk2CxWopFota/8Pi/2SqArqwC0JPow==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.1", - "bottleneck": "^2.15.3" - }, - "peerDependencies": { - "@octokit/core": "^3.5.0" - } - }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "node_modules/@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", - "license": "MIT" - }, - "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@phenomnomnominal/tsquery": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-4.2.0.tgz", - "integrity": "sha512-hR2U3uVcrrdkuG30ItQ+uFDs4ncZAybxWG0OjTE8ptPzVoU7GVeXpy+vMU8zX9EbmjGeITPw/su5HjYQyAH8bA==", - "license": "MIT", - "dependencies": { - "esquery": "^1.0.1" - }, - "peerDependencies": { - "typescript": "^3 || ^4" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/send-type": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@polka/send-type/-/send-type-0.5.2.tgz", - "integrity": "sha512-jGXalKihnhGQmMQ+xxfxrRfI2cWs38TIZuwgYpnbQDD4r9TkOiU3ocjAS+6CqqMNQNAu9Ul2iHU5YFRDODak2w==", - "license": "MIT" - }, - "node_modules/@polka/url": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", - "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==", - "license": "MIT" - }, - "node_modules/@rdfjs/data-model": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-2.0.2.tgz", - "integrity": "sha512-v5LRNkLRJazMCGU7VtEzhz5wKwz/IrOdJEKapCtd35HuFbQfeGpoJP6QOXGyFHhWwKmtG+UMlZzYFyNDVE1m6g==", - "license": "MIT", - "bin": { - "rdfjs-data-model-test": "bin/test.js" - } - }, - "node_modules/@rdfjs/dataset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@rdfjs/dataset/-/dataset-2.0.2.tgz", - "integrity": "sha512-6YJx+5n5Uxzq9dd9I0GGcIo6eopZOPfcsAfxSGX5d+YBzDgVa1cbtEBFnaPyPKiQsOm4+Cr3nwypjpg02YKPlA==", - "license": "MIT", - "bin": { - "rdfjs-dataset-test": "bin/test.js" - } - }, - "node_modules/@rdfjs/environment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rdfjs/environment/-/environment-1.0.0.tgz", - "integrity": "sha512-+S5YjSvfoQR5r7YQCRCCVHvIEyrWia7FJv2gqM3s5EDfotoAQmFeBagApa9c/eQFi5EiNhmBECE5nB8LIxTaHg==", - "license": "MIT" - }, - "node_modules/@rdfjs/fetch-lite": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@rdfjs/fetch-lite/-/fetch-lite-3.2.3.tgz", - "integrity": "sha512-CZfUsBekFIDYCoXBW59ehgYctIluqatWB0YqCJoA8scENuo5IHPXdPMiLt1YVqUnxQ4STwEBOUoIiaCVxwfOFg==", - "license": "MIT", - "dependencies": { - "is-stream": "^4.0.1", - "nodeify-fetch": "^3.1.0", - "readable-stream": "^4.5.2" - } - }, - "node_modules/@rdfjs/formats": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@rdfjs/formats/-/formats-4.0.0.tgz", - "integrity": "sha512-9e0DX+iWi8d958Px6Ggb1otl/EhfyvlfWcop+lS0aZlsGV2YK9Phl5lzCUYTfTefSyyQk8tJd5XN52hhDLb5Wg==", - "license": "MIT", - "dependencies": { - "@rdfjs/parser-jsonld": "^2.1.0", - "@rdfjs/parser-n3": "^2.0.1", - "@rdfjs/serializer-jsonld": "^2.0.0", - "@rdfjs/serializer-jsonld-ext": "^4.0.0", - "@rdfjs/serializer-ntriples": "^2.0.0", - "@rdfjs/serializer-turtle": "^1.1.1", - "@rdfjs/sink-map": "^2.0.0", - "rdfxml-streaming-parser": "^2.3.0" - } - }, - "node_modules/@rdfjs/formats-common": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rdfjs/formats-common/-/formats-common-3.1.0.tgz", - "integrity": "sha512-wgz5za/Uls+pttLdLl/aH0m0LQNgjqpWwk9exNs2Smmb2CosynRo4S0+CxeNOVZh4zeUm7oAlr1CK/tyg4Ff6g==", - "license": "MIT", - "dependencies": { - "@rdfjs/parser-jsonld": "^2.0.0", - "@rdfjs/parser-n3": "^2.0.0", - "@rdfjs/serializer-jsonld": "^2.0.0", - "@rdfjs/serializer-ntriples": "^2.0.0", - "@rdfjs/sink-map": "^2.0.0", - "rdfxml-streaming-parser": "^2.2.0" - } - }, - "node_modules/@rdfjs/namespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rdfjs/namespace/-/namespace-2.0.1.tgz", - "integrity": "sha512-U85NWVGnL3gWvOZ4eXwUcv3/bom7PAcutSBQqmVWvOaslPy+kDzAJCH1WYBLpdQd4yMmJ+bpJcDl9rcHtXeixg==", - "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^2.0.1" - } - }, - "node_modules/@rdfjs/parser-jsonld": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@rdfjs/parser-jsonld/-/parser-jsonld-2.1.1.tgz", - "integrity": "sha512-bddq04r/p7booWk+5IqcTlWpDljy8Sv1cdFynpzawNruZTD99n3eSj7LCHPBUzqnpXc1Dnt8tgXiqB02WSYtiw==", - "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^2.0.2", - "@rdfjs/sink": "^2.0.1", - "duplex-to": "^2.0.0", - "jsonld-streaming-parser": "^3.3.0", - "readable-stream": "^4.5.2" - } - }, - "node_modules/@rdfjs/parser-n3": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@rdfjs/parser-n3/-/parser-n3-2.0.2.tgz", - "integrity": "sha512-rrrvyh+kkj9ndwep2h6nYmugIfggDOC9uGpmDAHn/I/z52K7dHxi7xOkPPrezTsIbgNvFhV3zS7mzyObRxcLWA==", - "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^2.0.2", - "@rdfjs/sink": "^2.0.1", - "duplex-to": "^2.0.0", - "n3": "^1.17.2", - "readable-stream": "^4.5.2" - } - }, - "node_modules/@rdfjs/prefix-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@rdfjs/prefix-map/-/prefix-map-0.1.2.tgz", - "integrity": "sha512-qapFYVPYyYepg0sFy7T512667iZsN9a3RNcyNBTBV+O8wrU3v/URQZOipCTNrEm1BXzZ7KCK1Yi8HrE1y+uRuQ==", - "license": "MIT", - "dependencies": { - "readable-stream": "^4.3.0" - } - }, - "node_modules/@rdfjs/serializer-jsonld": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rdfjs/serializer-jsonld/-/serializer-jsonld-2.0.1.tgz", - "integrity": "sha512-O8WzdY7THsse/nMsrMLd2e51ADHO2SIUrkiZ9Va/8W3lXeeeiwDRPMppWy/i9yL4q6EM8iMW1riV7E0mK3fsBQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/sink": "^2.0.1", - "readable-stream": "^4.5.2" - } - }, - "node_modules/@rdfjs/serializer-jsonld-ext": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@rdfjs/serializer-jsonld-ext/-/serializer-jsonld-ext-4.0.0.tgz", - "integrity": "sha512-HP5DCmhyfVuQuk58AO5vzNY+dIFVHe2oHY8NX2K+3XmrTmu/yzrFzPbDeU9Cwr71XC4RifEMoksIg+8jnhxmfQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/sink": "^2.0.0", - "jsonld": "^8.1.0", - "readable-stream": "^4.3.0", - "stream-chunks": "^1.0.0" - } - }, - "node_modules/@rdfjs/serializer-ntriples": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rdfjs/serializer-ntriples/-/serializer-ntriples-2.0.1.tgz", - "integrity": "sha512-G1ZI0qaN/MUHxeCwr59JscO2LdyIb6MNQdXOv7NFBZuodyHsxxhJRFmMVn+3SEXeNJbVeEEbWBrLglCUgJ8XjQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/sink": "^2.0.1", - "@rdfjs/to-ntriples": "^3.0.1", - "duplex-to": "^2.0.0", - "readable-stream": "^4.5.2" - } - }, - "node_modules/@rdfjs/serializer-turtle": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rdfjs/serializer-turtle/-/serializer-turtle-1.1.4.tgz", - "integrity": "sha512-fw58pfAuIZblNzf8Gwl6mxfNkPH+/4Q1GwF0GFaSHg9yT0sQ1S+EzaqEVXl0MLPquEKTAMJFBs1fkdwUNq8Qww==", - "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^2.0.1", - "@rdfjs/namespace": "^2.0.0", - "@rdfjs/prefix-map": "^0.1.1", - "@rdfjs/sink": "^2.0.0", - "@rdfjs/term-map": "^2.0.0", - "@rdfjs/to-ntriples": "^3.0.1", - "@rdfjs/tree": "^0.2.1", - "readable-stream": "^4.3.0", - "stream-chunks": "^1.0.0" - } - }, - "node_modules/@rdfjs/sink": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rdfjs/sink/-/sink-2.0.1.tgz", - "integrity": "sha512-smzIFGF6EH1sLAJR9F3p2wMNrN44JjPeYAoITTJLqtuNC319K7IXaJ+qNLBGTtapZ/jvpx2Tks0TjcH9KrAvEA==", - "license": "MIT" - }, - "node_modules/@rdfjs/sink-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rdfjs/sink-map/-/sink-map-2.0.1.tgz", - "integrity": "sha512-BwCTTsMN/tfQl6QzD2oHn9A08e4af+hlzAz/d5XXrlOkYMEDUAqFuh2Odj9EbayhAEeN4wA743Mj2yC0/s69rg==", - "license": "MIT" - }, - "node_modules/@rdfjs/term-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@rdfjs/term-map/-/term-map-2.0.2.tgz", - "integrity": "sha512-EJ2FmmdEUsSR/tU1nrizRLWzH24YzhuvesrbUWxC3Fs0ilYNdtTbg0RaFJDUnJF3HkbNBQe8Zrt/uvU/hcKnHg==", - "license": "MIT", - "dependencies": { - "@rdfjs/to-ntriples": "^3.0.1" - } - }, - "node_modules/@rdfjs/term-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rdfjs/term-set/-/term-set-2.0.3.tgz", - "integrity": "sha512-DyXrKWEx+mtAFUZVU7bc3Va6/KZ8PsIp0RVdyWT9jfDgI/HCvNisZaBtAcm+SYTC45o+7WLkbudkk1bfaKVB0A==", - "license": "MIT", - "dependencies": { - "@rdfjs/to-ntriples": "^3.0.1" - } - }, - "node_modules/@rdfjs/to-ntriples": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@rdfjs/to-ntriples/-/to-ntriples-3.0.1.tgz", - "integrity": "sha512-gjoPAvh4j7AbGMjcDn/8R4cW+d/FPtbfbMM0uQXkyfBFtNUW2iVgrqsgJ65roLc54Y9A2TTFaeeTGSvY9a0HCQ==", - "license": "MIT" - }, - "node_modules/@rdfjs/traverser": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@rdfjs/traverser/-/traverser-0.1.4.tgz", - "integrity": "sha512-53QYlxiQIxH8k4jutjet1EjdZfyKCDSsfqnj2YejAJ1X8mLDMSOsneMM5savBwBR0ROfAhKVtZVb+pego+JLiw==", - "license": "MIT", - "dependencies": { - "@rdfjs/to-ntriples": "^3.0.1" - } - }, - "node_modules/@rdfjs/tree": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@rdfjs/tree/-/tree-0.2.1.tgz", - "integrity": "sha512-J70CQ7R8Ivfs1FFUxtFN7ADb5wTMgbhn0O558NXSXQHItmSavT6cXmQlIokbmboU+grhu56iR/8Bl9do8LCq+w==", - "license": "MIT", - "dependencies": { - "@rdfjs/namespace": "^2.0.0", - "@rdfjs/term-map": "^2.0.0", - "@rdfjs/term-set": "^2.0.1" - } - }, - "node_modules/@rdfjs/types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.1.0.tgz", - "integrity": "sha512-5zm8bN2/CC634dTcn/0AhTRLaQRjXDZs3QfcAsQKNturHT7XVWcKy/8p3P5gXl+YkZTAmy7T5M/LyiT/jbkENw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@rubensworks/saxes": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@rubensworks/saxes/-/saxes-6.0.1.tgz", - "integrity": "sha512-UW4OTIsOtJ5KSXo2Tchi4lhZqu+tlHrOAs4nNti7CrtB53kAZl3/hyrTi6HkMihxdbDM6m2Zc3swc/ZewEe1xw==", - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.12" - } - }, - "node_modules/@samverschueren/stream-to-observable": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", - "license": "MIT", - "dependencies": { - "any-observable": "^0.3.0" - }, - "engines": { - "node": ">=6" - }, - "peerDependenciesMeta": { - "rxjs": { - "optional": true - }, - "zen-observable": { - "optional": true - } - } - }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "license": "MIT" - }, - "node_modules/@semantic-release/changelog": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", - "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", - "license": "MIT", - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.4" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "license": "MIT", - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@semantic-release/git": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", - "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", - "license": "MIT", - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/git/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@semantic-release/git/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/git/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@semantic-release/git/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/git/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@semantic-release/git/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/git/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/git/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@semantic-release/github": { - "name": "@achingbrain/semantic-release-github", - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@achingbrain/semantic-release-github/-/semantic-release-github-0.0.0.tgz", - "integrity": "sha512-HES6WrXTaPpIvsABCn3aM12AjqgV6aEPDMw8oaXGD702T6ZqQ98dQGlq1wt3IzX2yBQbNcFrwK8eVC0M1nz4uw==", - "license": "MIT", - "dependencies": { - "@octokit/plugin-retry": "^3.0.9", - "@octokit/plugin-throttling": "^3.6.2", - "@octokit/rest": "^18.0.0", - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^10.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/github/node_modules/@semantic-release/error": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", - "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", - "license": "MIT" - }, - "node_modules/@semantic-release/github/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/github/node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "license": "MIT" - }, - "node_modules/@semantic-release/npm": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", - "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", - "license": "MIT", - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^1.0.0" - }, - "engines": { - "node": ">=16 || ^14.17" - }, - "peerDependencies": { - "semantic-release": ">=19.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/npm/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@semantic-release/npm/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/npm/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@semantic-release/npm/node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "license": "MIT", - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sindresorhus/fnv1a": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/fnv1a/-/fnv1a-3.1.0.tgz", - "integrity": "sha512-KV321z5m/0nuAg83W1dPLy85HpHDk7Sdi4fJbwvacWsEhAh+rZUW4ZfGcXmUIvjZg4ss2bcwNlRhJ7GBEUG08w==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/commons/node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/samsam/node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "license": "(Unlicense OR Apache-2.0)" - }, - "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-3.0.0.tgz", - "integrity": "sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.0.tgz", - "integrity": "sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", - "integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz", - "integrity": "sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.6.tgz", - "integrity": "sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.5", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz", - "integrity": "sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.5.tgz", - "integrity": "sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.5", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.5.tgz", - "integrity": "sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-codec": "^3.1.2", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-blob-browser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.2.tgz", - "integrity": "sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/chunked-blob-reader": "^3.0.0", - "@smithy/chunked-blob-reader-native": "^3.0.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/hash-stream-node": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.2.tgz", - "integrity": "sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/md5-js": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.3.tgz", - "integrity": "sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", - "integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", - "integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", - "integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", - "integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", - "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tpluscode/rdf-ns-builders": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tpluscode/rdf-ns-builders/-/rdf-ns-builders-4.3.0.tgz", - "integrity": "sha512-x3uh9mYwAU+PrALaDKhVjml1TCCWWduo6J8rybd9SMEEAoooXq1MYb13MRputjRT/kYaFyCND7LMobzhxZ/+bg==", - "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^2", - "@rdfjs/namespace": "^2", - "@rdfjs/types": "*", - "@types/rdfjs__namespace": "^2.0.2", - "@zazuko/prefixes": "^2.0.1" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "license": "MIT" - }, - "node_modules/@tsoa/cli": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@tsoa/cli/-/cli-5.1.1.tgz", - "integrity": "sha512-krvp6Qr2yPUfj6bJRs0vwQhLANeINzyusNnzgSoerDfBBBnjZ+VhvR4rWguAcLc1kgP/kFAJz5kIp4iqLFmILQ==", - "license": "MIT", - "dependencies": { - "@tsoa/runtime": "^5.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^10.1.0", - "glob": "^8.0.3", - "handlebars": "^4.7.7", - "merge": "^2.1.1", - "minimatch": "^5.1.0", - "typescript": "^4.9.5", - "validator": "^13.7.0", - "yamljs": "^0.3.0", - "yargs": "^17.5.1" - }, - "bin": { - "tsoa": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "yarn": ">=1.9.4" - } - }, - "node_modules/@tsoa/cli/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@tsoa/cli/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tsoa/runtime": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@tsoa/runtime/-/runtime-5.0.0.tgz", - "integrity": "sha512-DY0x7ZhNRF9FcwCZXQQbQhVj3bfZe0LScNyqp0c8PhDTj0gRMjY4ESVpihopRzhQtamReJoDRg3FhEu4BlSVtA==", - "license": "MIT", - "dependencies": { - "@types/multer": "^1.4.7", - "promise.any": "^2.0.5", - "reflect-metadata": "^0.1.13", - "validator": "^13.7.0" - }, - "engines": { - "node": ">=12.0.0", - "yarn": ">=1.9.4" - } - }, - "node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/chai": { - "version": "4.3.17", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.17.tgz", - "integrity": "sha512-zmZ21EWzR71B4Sscphjief5djsLre50M6lI622OSySTmn9DB3j+C3kWroHfBQWXbOBwbgg/M8CG/hUxDLIloow==", - "license": "MIT" - }, - "node_modules/@types/chai-as-promised": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", - "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", - "license": "MIT", - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/chai-string": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@types/chai-string/-/chai-string-1.4.5.tgz", - "integrity": "sha512-IecXRMSnpUvRnTztdpSdjcmcW7EdNme65bfDCQMi7XrSEPGmyDYYTEfc5fcactWDA6ioSm8o7NUqg9QxjBCCEw==", - "license": "MIT", - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/chai-subset": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.5.tgz", - "integrity": "sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==", - "license": "MIT", - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/clownface": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/clownface/-/clownface-2.0.8.tgz", - "integrity": "sha512-vomfitsRIuvw9zp/Xph8/AHPRBQ+7Ji/OnQUC3TOem+KzG/z2rCeEjpZH23wP7t0gjXZHPiZU1syFkf/oP3v8w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@rdfjs/types": ">=1.0.0", - "@types/rdfjs__environment": "*" - } - }, - "node_modules/@types/command-line-args": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", - "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", - "license": "MIT" - }, - "node_modules/@types/command-line-usage": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", - "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", - "license": "MIT" - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/dns-packet": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", - "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/extend": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/extend/-/extend-3.0.4.tgz", - "integrity": "sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA==", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "license": "MIT" - }, - "node_modules/@types/http-link-header": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/http-link-header/-/http-link-header-1.0.7.tgz", - "integrity": "sha512-snm5oLckop0K3cTDAiBnZDy6ncx9DJ3mCRDvs42C884MbVYPP74Tiq2hFsSDRTyjK6RyDYDIulPiW23ge+g5Lw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ip": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/ip/-/ip-1.1.3.tgz", - "integrity": "sha512-64waoJgkXFTYnCYDUWgSATJ/dXEBanVkaP5d4Sbk7P6U7cTTMhxVyROTckc6JKdwCrgnAjZMn0k3177aQxtDEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "license": "MIT" - }, - "node_modules/@types/jsonld": { - "version": "1.5.15", - "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.15.tgz", - "integrity": "sha512-PlAFPZjL+AuGYmwlqwKEL0IMP8M8RexH0NIPGfCVWSQ041H2rR/8OlyZSD7KsCVoN8vCfWdtWDBxX8yBVP+xow==", - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", - "license": "MIT" - }, - "node_modules/@types/lodash.clonedeep": { - "version": "4.5.9", - "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.9.tgz", - "integrity": "sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==", - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/lzma-native": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/lzma-native/-/lzma-native-4.0.4.tgz", - "integrity": "sha512-9nwec86WAT3wUhjx9iV0AQ06xyDyiN/D9CAk3ZzNLb8zFjjo4EDBliN2uo7CFcBDJ64oXfX4sa+p6fpGpzy/4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "license": "MIT" - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "license": "MIT" - }, - "node_modules/@types/mocha": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", - "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "license": "MIT" - }, - "node_modules/@types/multer": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz", - "integrity": "sha512-svK240gr6LVWvv3YGyhLlA+6LRRWA4mnGIU7RcNmgjBYFl6665wcXrRfxGp5tEPVHUNm5FMcmq7too9bxCwX/w==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/multicast-dns": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/@types/multicast-dns/-/multicast-dns-7.2.4.tgz", - "integrity": "sha512-ib5K4cIDR4Ro5SR3Sx/LROkMDa0BHz0OPaCBL/OSPDsAXEGZ3/KQeS6poBKYVN7BfjXDL9lWNwzyHVgt/wkyCw==", - "license": "MIT", - "dependencies": { - "@types/dns-packet": "*", - "@types/node": "*" - } - }, - "node_modules/@types/murmurhash3js-revisited": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.3.tgz", - "integrity": "sha512-QvlqvYtGBYIDeO8dFdY4djkRubcrc+yTJtBc7n8VZPlJDUS/00A+PssbvERM8f9bYRmcaSEHPZgZojeQj7kzAA==", - "license": "MIT" - }, - "node_modules/@types/n3": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/@types/n3/-/n3-1.16.4.tgz", - "integrity": "sha512-6PmHRYCCdjbbBV2UVC/HjtL6/5Orx9ku2CQjuojucuHvNvPmnm6+02B18YGhHfvU25qmX2jPXyYPHsMNkn+w2w==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "^1.1.0", - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.14.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", - "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-cron": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.11.tgz", - "integrity": "sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/rdf-dataset-ext": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/rdf-dataset-ext/-/rdf-dataset-ext-1.0.8.tgz", - "integrity": "sha512-ngMGOzAm+yvrfTzFhlmPNa9lfWO72IkdqYRR+HNIPX3x+RPLf6qRpAi8GAZCg0rkpGt2JJqDQF3FgVxE6ykr/w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@rdfjs/types": ">=1.0.0", - "@types/readable-stream": "*" - } - }, - "node_modules/@types/rdf-ext": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@types/rdf-ext/-/rdf-ext-2.5.0.tgz", - "integrity": "sha512-d+O6WnpKTHULLYZ/EeHfCnpt38J+w5QmAQ3Bsijdk0p+RIbEhoVh9XvXzs/H6Os3rxltiQOUm2Bg/+JqLmQcEg==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*", - "@types/rdfjs__data-model": "*", - "@types/rdfjs__dataset": "*", - "@types/rdfjs__environment": "*", - "@types/rdfjs__fetch-lite": "*", - "@types/rdfjs__formats": "*", - "@types/rdfjs__namespace": "*", - "@types/rdfjs__prefix-map": "*", - "@types/rdfjs__score": "*", - "@types/rdfjs__term-map": "*", - "@types/rdfjs__term-set": "*", - "@types/rdfjs__traverser": "*" - } - }, - "node_modules/@types/rdf-utils-fs": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/rdf-utils-fs/-/rdf-utils-fs-2.1.5.tgz", - "integrity": "sha512-JE4GrR0whgLZWYQakjxGxWwHgxNmRO1hI7TgDs6Ry4tMM7CDlAexaAF6zcrz7RGjKXmNsZjXWs430AVtuESfRQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0" - } - }, - "node_modules/@types/rdfjs__data-model": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/rdfjs__data-model/-/rdfjs__data-model-2.0.8.tgz", - "integrity": "sha512-7OVjhmA8QPEdRReHFieKuqn2mbYx3ndEIEmh/6FkeJC8QCMJGVeSuRKEUVXbZGwP0rDKZuhQGozaRv3O1z1gPQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "^1.0.1" - } - }, - "node_modules/@types/rdfjs__dataset": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/rdfjs__dataset/-/rdfjs__dataset-2.0.7.tgz", - "integrity": "sha512-+GaYIL9C7N1N0HyH+obU4IXuL7DX+fXuf827aUQ2Vx2UghO47+OTxo2v3seEQj/1YHoHBfQFk5Y4P6Q7Ht4Hqw==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*" - } - }, - "node_modules/@types/rdfjs__environment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/rdfjs__environment/-/rdfjs__environment-1.0.0.tgz", - "integrity": "sha512-MDcnv3qfJvbHoEpUQXj5muT8g3e+xz1D8sGevrq3+Q4TzeEvQf5ijGX5l8485XFYrN/OBApgzXkHMZC04/kd5w==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*", - "@types/node": "*" - } - }, - "node_modules/@types/rdfjs__fetch-lite": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/rdfjs__fetch-lite/-/rdfjs__fetch-lite-3.0.10.tgz", - "integrity": "sha512-5EokVEj3eJGBknxM3pFV8y6w/ZVMAqZkmHKFLz6zgLxonCmC/bHHXeCTZGE1+5Heji/4vc84vinZMaQ1+n7t6Q==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*", - "@types/node": "*", - "@types/rdfjs__formats": "*" - } - }, - "node_modules/@types/rdfjs__formats": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/rdfjs__formats/-/rdfjs__formats-4.0.1.tgz", - "integrity": "sha512-Zj7hQEn5HeCj+pJCWshY2gqBcdBdwyc2j20Ht3PH91pkdRuG2AlGDD3N9PQ1oZ3+J6Q96rAlhxUbjQUp9+s3FQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0", - "@types/node": "*", - "@types/rdfjs__parser-jsonld": "*", - "@types/rdfjs__parser-n3": "*", - "@types/rdfjs__serializer-jsonld": "*", - "@types/rdfjs__serializer-jsonld-ext": "*", - "@types/rdfjs__serializer-ntriples": "*", - "@types/rdfjs__serializer-turtle": "*", - "@types/rdfjs__sink-map": "*", - "rdfxml-streaming-parser": ">=2" - } - }, - "node_modules/@types/rdfjs__formats-common": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@types/rdfjs__formats-common/-/rdfjs__formats-common-3.1.5.tgz", - "integrity": "sha512-Zt74nSd9NemOq90/2cMrBVwnHJIXHFFDS7tkY4Slei1eRoQJpws059Lx9O+mqaFspkD3r81Enu/5CiNfQg9V7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0", - "@types/node": "*", - "@types/rdfjs__parser-jsonld": "*", - "@types/rdfjs__parser-n3": "*", - "@types/rdfjs__serializer-jsonld": "*", - "@types/rdfjs__serializer-ntriples": "*", - "@types/rdfjs__sink-map": "*", - "rdfxml-streaming-parser": ">=2" - } - }, - "node_modules/@types/rdfjs__namespace": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/rdfjs__namespace/-/rdfjs__namespace-2.0.10.tgz", - "integrity": "sha512-xoVzEIOxcpyteEmzaj94MSBbrBFs+vqv05joMhzLEiPRwsBBDnhkdBCaaDxR1Tf7wOW0kB2R1IYe4C3vEBFPgA==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*" - } - }, - "node_modules/@types/rdfjs__parser-jsonld": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@types/rdfjs__parser-jsonld/-/rdfjs__parser-jsonld-2.1.7.tgz", - "integrity": "sha512-n35K+c1Y95580N202Jxly6xjFE953FF+Y2mwxok6zLfMo4rgIfgMBElnNwpja0IeYXTuzGm1tEz7va3lItGrTg==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0", - "@types/jsonld": "*" - } - }, - "node_modules/@types/rdfjs__parser-n3": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/rdfjs__parser-n3/-/rdfjs__parser-n3-2.0.6.tgz", - "integrity": "sha512-VHfdq7BDV6iMCtHkzTFSOuUWnqGlMUmEF0UZyK4+g9SzLWvc6TMcU5TYwQPQIz/e0s7dZ+xomxx6mVtIzsRQ/A==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0" - } - }, - "node_modules/@types/rdfjs__prefix-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@types/rdfjs__prefix-map/-/rdfjs__prefix-map-0.1.5.tgz", - "integrity": "sha512-RAwyS/2dT9X79QwM0F8KLweTfuBoe6xtiAlU7wKPB+/t/sfk6A50LYtAWaDVP5qBjcu50UkKkZT+VR47CiLkfg==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*" - } - }, - "node_modules/@types/rdfjs__score": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@types/rdfjs__score/-/rdfjs__score-0.1.6.tgz", - "integrity": "sha512-TZZaI0PntOUnfA6vKsVlgeYuyiGvtlMygu0ycmmFn5quldbDWzIIxadciTIaBQBcPXmJHcnXiS8/mbZ9FkX4hQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*" - } - }, - "node_modules/@types/rdfjs__serializer-jsonld": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/rdfjs__serializer-jsonld/-/rdfjs__serializer-jsonld-2.0.5.tgz", - "integrity": "sha512-ubdLD9QgZzAt+65NSPzh2qWCPWcGYlHEWgkP6uRwfm7JC48Xh/QjzwOTG13MTomOkQqcN4R7PIG0j3Ca8iyNWQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0" - } - }, - "node_modules/@types/rdfjs__serializer-jsonld-ext": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/rdfjs__serializer-jsonld-ext/-/rdfjs__serializer-jsonld-ext-4.0.1.tgz", - "integrity": "sha512-jgbQ/1kV7nESKG7SY8FJED6K4OFznr6Sz3ybF1ncpBR7TUBTuy3InpZOVRK4Wjpy2zi84iIAzJ1CIIo9NZh2Xw==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0", - "@types/jsonld": "*", - "@types/node": "*" - } - }, - "node_modules/@types/rdfjs__serializer-ntriples": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/rdfjs__serializer-ntriples/-/rdfjs__serializer-ntriples-2.0.6.tgz", - "integrity": "sha512-Nn3e3eyuymLvbI5MFzI7ODD/X6ZGpbB9fLaWOB00RtFHd2vttk3wQL2fzzsZZQPJ/ihC/xlFE4cNQkO6SoHa7w==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0" - } - }, - "node_modules/@types/rdfjs__serializer-turtle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/rdfjs__serializer-turtle/-/rdfjs__serializer-turtle-1.1.0.tgz", - "integrity": "sha512-NGHnbz5985UwS/YS6WL/FkS94B+QiVTdsfvJCqPwLmY3E7UeClw91c2KbiphZUR/uh7uwLwxeKKhV2T1gYgT5Q==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0", - "@types/node": "*", - "@types/rdfjs__prefix-map": "*" - } - }, - "node_modules/@types/rdfjs__sink-map": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/rdfjs__sink-map/-/rdfjs__sink-map-2.0.5.tgz", - "integrity": "sha512-ycUBlOMbp9YpjrBrMwGv3uiqulOWgodess06cinYLxomOTc2ET9rEQklgM5rJqnu5WMsVP8SFG3fFw36/5hADQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*" - } - }, - "node_modules/@types/rdfjs__term-map": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/rdfjs__term-map/-/rdfjs__term-map-2.0.10.tgz", - "integrity": "sha512-YlpYkya+Xq9fmcw+BMi1SCh+w2sBu7G0/qd2+ZhB4QIK3V1xq2o3EOAZnlahyQdwrW9t5+Ihw8IVVvZsJvDOTA==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*" - } - }, - "node_modules/@types/rdfjs__term-set": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/rdfjs__term-set/-/rdfjs__term-set-2.0.9.tgz", - "integrity": "sha512-RRXs5DwFGanZyT705f7KLSiN68gUVUtGWTp508CXJhLfD7AWmilqc1BLgLUoac48h3pnh9w5lRhwFm6fj1ZE5Q==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*" - } - }, - "node_modules/@types/rdfjs__to-ntriples": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/rdfjs__to-ntriples/-/rdfjs__to-ntriples-2.0.6.tgz", - "integrity": "sha512-6Y7iNDU93ORX5vNqnEM/CefOsxl2di8ZyaHw3Q0U1nqtCijmubUzXAqd4AIHIGiWQfi1v+bi9bNk5ztVeMAyLg==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0" - } - }, - "node_modules/@types/rdfjs__traverser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@types/rdfjs__traverser/-/rdfjs__traverser-0.1.5.tgz", - "integrity": "sha512-tTpiM6lAddw+bGRDjhzwdpo1EQK73m8gYgMVNfO4OsevnuLZvQJeCJBckpuDC4H5HVAEwCapI0UlH9dVnZ9u5g==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*" - } - }, - "node_modules/@types/readable-stream": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.15.tgz", - "integrity": "sha512-oAZ3kw+kJFkEqyh7xORZOku1YAKvsFTogRY8kVl4vHpEKiDkfnSA/My8haRE7fvmix5Zyy+1pwzOi7yycGLBJw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", - "license": "MIT" - }, - "node_modules/@types/secp256k1": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sinon": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", - "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", - "license": "MIT", - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", - "license": "MIT" - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "license": "MIT", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "license": "ISC" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "license": "ISC" - }, - "node_modules/@vocabulary/sh": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@vocabulary/sh/-/sh-1.1.5.tgz", - "integrity": "sha512-8R4uxHLpwmp6l6szZdCtfQx0wRy64OHuOsYTDfhCsbJ773Uv6nCM2bYBtjjirZHN+2m3uHQWgtWOdvuu1jwmOA==", - "license": "MIT", - "peerDependencies": { - "@rdfjs/types": "^1.0.0" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "license": "BSD-2-Clause" - }, - "node_modules/@zazuko/env": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@zazuko/env/-/env-2.2.1.tgz", - "integrity": "sha512-GqM/461f50Px1a8Sx3tfViZkACY9gZGe3iOizF9pIeRd7Ilx+xH+VNk9rmMlKPnk600m1LixrxGuirT28zQxVQ==", - "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^2.0.1", - "@rdfjs/dataset": "^2.0.1", - "@rdfjs/formats": "^4.0.0", - "@rdfjs/namespace": "^2.0.0", - "@rdfjs/term-map": "^2.0.0", - "@rdfjs/term-set": "^2.0.1", - "@rdfjs/traverser": "^0.1.2", - "@tpluscode/rdf-ns-builders": "^4.1.0", - "@zazuko/env-core": "^1.1.2", - "@zazuko/prefixes": "^2.1.0", - "clownface": "^2.0.2", - "get-stream": "^9.0.1", - "rdf-dataset-ext": "^1.1.0" - }, - "peerDependencies": { - "@rdfjs/types": "^1.1.0", - "@types/clownface": "^2.0.0", - "@types/rdf-dataset-ext": "^1", - "@types/rdfjs__data-model": "^2.0.7", - "@types/rdfjs__dataset": "^2.0.7", - "@types/rdfjs__environment": "^1.0.0", - "@types/rdfjs__formats": "^4.0.0", - "@types/rdfjs__namespace": "^2.0.10", - "@types/rdfjs__term-map": "^2.0.9", - "@types/rdfjs__term-set": "^2.0.8", - "@types/rdfjs__traverser": "^0.1.3" - } - }, - "node_modules/@zazuko/env-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@zazuko/env-core/-/env-core-1.1.2.tgz", - "integrity": "sha512-mnLG40utuT7jPBPLs6fJ0puhfagnXSj+S8t9+zUGs3YlrOq/7b2zr64Hi3p3etwDdApaQ0VgQuNIY9doaruS1Q==", - "dependencies": { - "@rdfjs/environment": "^1.0.0" - }, - "peerDependencies": { - "@types/rdfjs__environment": "^1.0.0" - } - }, - "node_modules/@zazuko/env-node": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@zazuko/env-node/-/env-node-2.1.3.tgz", - "integrity": "sha512-vaYbkMe0DsvpWEWBQpWPJ0mEYiFhwDGw8Caso1MmASUbHY/gH2tAA6BDv4LsCK/BrU4gWftUWz6uEsRP3FmdHA==", - "license": "MIT", - "dependencies": { - "@rdfjs/fetch-lite": "^3.2.2", - "@rdfjs/formats": "^4.0.0", - "@zazuko/env": "^2.1.1", - "@zazuko/rdf-utils-fs": "^3.3.0" - }, - "peerDependencies": { - "@types/rdfjs__fetch-lite": "^3.0.6" - } - }, - "node_modules/@zazuko/prefixes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@zazuko/prefixes/-/prefixes-2.2.0.tgz", - "integrity": "sha512-mmRS+urGVMcAP5edzFq0V+B2PbbpEklP7BZGVF0+82ClczTwgpIL1tZy2mRfudwRYoAe+WkyWXDnlArPpdzLIg==", - "license": "MIT" - }, - "node_modules/@zazuko/rdf-utils-fs": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@zazuko/rdf-utils-fs/-/rdf-utils-fs-3.3.1.tgz", - "integrity": "sha512-4HjTbJUwiCFanMMcaaZkLIkWUdVjXSQstAyxnfzsUOmh8Q43iVBL+mYAl17zoi47III0POL6hitRsN1JJ5tUFg==", - "license": "MIT", - "dependencies": { - "readable-stream": ">=3.6.0" - }, - "peerDependencies": { - "@rdfjs/types": "*", - "@types/rdfjs__environment": "0 - 1", - "@types/rdfjs__formats": "^4" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC", - "optional": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aegir": { - "version": "37.12.1", - "resolved": "https://registry.npmjs.org/aegir/-/aegir-37.12.1.tgz", - "integrity": "sha512-ZvINVE3tBeKkgoWw2kXYfCP728MY1N13DP+qap13opXs59SJpxPYKE4P1WJ5y3+acqVftK+1FhpJTVVJb/FhcQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@polka/send-type": "^0.5.2", - "@semantic-release/changelog": "^6.0.1", - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "https://registry.npmjs.org/@achingbrain/semantic-release-github/-/semantic-release-github-0.0.0.tgz", - "@semantic-release/npm": "^9.0.1", - "@semantic-release/release-notes-generator": "^10.0.3", - "@types/chai": "^4.2.16", - "@types/chai-as-promised": "^7.1.3", - "@types/chai-string": "^1.4.2", - "@types/chai-subset": "^1.3.3", - "@types/mocha": "^10.0.0", - "@types/node": "^18.11.15", - "@types/sinon": "^10.0.0", - "@typescript-eslint/eslint-plugin": "^5.18.0", - "buffer": "^6.0.3", - "bytes": "^3.1.0", - "c8": "^7.7.0", - "chai": "^4.3.4", - "chai-as-promised": "^7.1.1", - "chai-bites": "^0.1.2", - "chai-parentheses": "^0.0.2", - "chai-string": "^1.5.0", - "chai-subset": "^1.6.0", - "conventional-changelog-conventionalcommits": "^5.0.0", - "cors": "^2.8.5", - "dependency-check": "^5.0.0-2", - "detective-cjs": "^4.0.0", - "detective-es6": "^3.0.0", - "diff": "^5.1.0", - "electron-mocha-main": "^11.0.3", - "env-paths": "^3.0.0", - "esbuild": "^0.16.1", - "eslint": "^7.32.0", - "eslint-config-ipfs": "^2.1.0", - "eslint-plugin-etc": "^1.1.7", - "eslint-plugin-import": "^2.18.0", - "eslint-plugin-jsdoc": "^36.0.8", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.1.0", - "execa": "^6.1.0", - "extract-zip": "^2.0.1", - "fs-extra": "^11.1.0", - "gh-pages": "^4.0.0", - "globby": "^13.1.1", - "it-glob": "^1.0.1", - "kleur": "^4.1.4", - "lilconfig": "^2.0.5", - "listr": "~0.14.2", - "mdast-util-from-markdown": "^1.2.0", - "mdast-util-gfm": "^2.0.1", - "mdast-util-gfm-footnote": "^1.0.1", - "mdast-util-gfm-strikethrough": "^1.0.1", - "mdast-util-gfm-table": "^1.0.4", - "mdast-util-gfm-task-list-item": "^1.0.1", - "mdast-util-to-markdown": "^1.3.0", - "mdast-util-toc": "^6.1.0", - "merge-options": "^3.0.4", - "micromark-extension-gfm": "^2.0.1", - "micromark-extension-gfm-footnote": "^1.0.4", - "micromark-extension-gfm-strikethrough": "^1.0.4", - "micromark-extension-gfm-table": "^1.0.5", - "micromark-extension-gfm-task-list-item": "^1.0.3", - "mocha": "^10.0.0", - "npm-package-json-lint": "^6.3.0", - "nyc": "^15.1.0", - "p-map": "^5.3.0", - "p-retry": "^5.1.2", - "pascalcase": "^2.0.0", - "path": "^0.12.7", - "playwright-test": "^8.1.0", - "polka": "^0.5.2", - "premove": "^4.0.0", - "prompt": "^1.2.2", - "proper-lockfile": "^4.1.2", - "react-native-test-runner": "^5.0.0", - "read-pkg-up": "^9.1.0", - "rimraf": "^3.0.2", - "semantic-release": "^19.0.2", - "semantic-release-monorepo": "^7.0.5", - "semver": "^7.3.8", - "source-map-support": "^0.5.20", - "strip-bom": "^5.0.0", - "strip-json-comments": "^5.0.0", - "tempy": "^2.0.0", - "typedoc": "^0.23.21", - "typedoc-plugin-mdn-links": "^2.0.0", - "typedoc-plugin-missing-exports": "^1.0.0", - "typescript": "^4.6.3", - "uint8arrays": "^4.0.2", - "undici": "^5.0.0", - "update-notifier": "^6.0.2", - "wherearewe": "^2.0.1", - "yargs": "^17.1.1", - "yargs-parser": "^21.1.1" - }, - "bin": { - "aegir": "src/index.js" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/aegir/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/aegir/node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/aegir/node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/aegir/node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/aegir/node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "deprecated": "Use @eslint/config-array instead", - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/aegir/node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "deprecated": "Use @eslint/object-schema instead", - "license": "BSD-3-Clause" - }, - "node_modules/aegir/node_modules/@types/node": { - "version": "18.19.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.44.tgz", - "integrity": "sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/aegir/node_modules/@types/sinon": { - "version": "10.0.20", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.20.tgz", - "integrity": "sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==", - "license": "MIT", - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/aegir/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/aegir/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/aegir/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/aegir/node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/aegir/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/aegir/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/aegir/node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/aegir/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/aegir/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/aegir/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aegir/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aegir/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/aegir/node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/aegir/node_modules/eslint-etc": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/eslint-etc/-/eslint-etc-4.2.6.tgz", - "integrity": "sha512-/gg8U0SgBz6OQ2QKsvhmSF1WTL53nSD5qYHx/reNPnaKAUfH6qR0AIZQ7NNCRRSICRFagqf1nO8A7WmRFwcAJQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/experimental-utils": "^4.0.0", - "tsutils": "^3.17.1", - "tsutils-etc": "^1.3.4" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0", - "typescript": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/aegir/node_modules/eslint-plugin-etc": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-etc/-/eslint-plugin-etc-1.5.4.tgz", - "integrity": "sha512-FXpRHz5CGpT11pLln73JME4zHtopYKB7rlpvv5mcjEIJQJZazwswVF5WuGQxkm4cvlOpnFkfpatHICTRqTUkeA==", - "license": "MIT", - "dependencies": { - "@phenomnomnominal/tsquery": "^4.0.0", - "@typescript-eslint/experimental-utils": "^4.0.0", - "eslint-etc": "^4.0.4", - "requireindex": "~1.2.0", - "tslib": "^2.0.0", - "tsutils": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^ 7.0.0", - "typescript": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/aegir/node_modules/eslint-plugin-jsdoc": { - "version": "36.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.1.1.tgz", - "integrity": "sha512-nuLDvH1EJaKx0PCa9oeQIxH6pACIhZd1gkalTUxZbaxxwokjs7TplqY0Q8Ew3CoZaf5aowm0g/Z3JGHCatt+gQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@es-joy/jsdoccomment": "0.10.8", - "comment-parser": "1.2.4", - "debug": "^4.3.2", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "^1.1.1", - "lodash": "^4.17.21", - "regextras": "^0.8.0", - "semver": "^7.3.5", - "spdx-expression-parse": "^3.0.1" - }, - "engines": { - "node": "^12 || ^14 || ^16" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/aegir/node_modules/eslint-plugin-promise": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", - "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", - "license": "ISC", - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0" - } - }, - "node_modules/aegir/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/aegir/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/aegir/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/aegir/node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/aegir/node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/aegir/node_modules/eslint/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/aegir/node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/aegir/node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/aegir/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/aegir/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/aegir/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/aegir/node_modules/globby/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/aegir/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/aegir/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/aegir/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "license": "MIT" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "license": "MIT", - "optional": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "license": "MIT", - "peerDependencies": { - "ajv": ">=5.0.0" - } - }, - "node_modules/amdefine": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.1.tgz", - "integrity": "sha512-cE/769sItEDt5sSdqmrWMsat+XaA5FJiEou+ZwlY7ef/Jf/517k6nYyUIRPR2o/QbpBg4FiYXj9GyRGNg5f/bg==", - "license": "BSD-3-Clause AND MIT", - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "license": "MIT" - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "license": "MIT" - }, - "node_modules/any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/any-signal": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-4.1.1.tgz", - "integrity": "sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/apache-arrow": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-18.0.0.tgz", - "integrity": "sha512-gFlPaqN9osetbB83zC29AbbZqGiCuFH1vyyPseJ+B7SIbfBtESV62mMT/CkiIt77W6ykC/nTWFzTXFs0Uldg4g==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.11", - "@types/command-line-args": "^5.2.3", - "@types/command-line-usage": "^5.0.4", - "@types/node": "^20.13.0", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.1", - "flatbuffers": "^24.3.25", - "json-bignum": "^0.0.3", - "tslib": "^2.6.2" - }, - "bin": { - "arrow2csv": "bin/arrow2csv.js" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "license": "MIT", - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "license": "ISC", - "optional": true - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "license": "MIT" - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "license": "MIT" - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "license": "MIT" - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.every": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.6.tgz", - "integrity": "sha512-gNEqZD97w6bfQRNmHkFv7rNnGM+VWyHZT+h/rf9C+22owcXuENr66Lfo0phItpU5KoXW6Owb34q2+8MnSIZ57w==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.map": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.7.tgz", - "integrity": "sha512-XpcFfLoBEAhezrrNw1V+yLXkE7M6uR7xJEsxbG6c/V9v043qurwVJB9r9UTnoSioFDoz1i1VOydpWGmJpfVZbg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-array-method-boxes-properly": "^1.0.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1js": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", - "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.2", - "pvutils": "^1.1.3", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/ast-module-types": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-4.0.0.tgz", - "integrity": "sha512-Kd0o8r6CDazJGCRzs8Ivpn0xj19oNKrULhoJFzhGjRsLpekF2zyZs9Ukz+JvZhWD6smszfepakTFhAaYpsI12g==", - "license": "MIT", - "engines": { - "node": ">=12.0" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/auto-changelog": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.4.0.tgz", - "integrity": "sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^7.2.0", - "handlebars": "^4.7.7", - "node-fetch": "^2.6.1", - "parse-github-url": "^1.0.2", - "semver": "^7.3.5" - }, - "bin": { - "auto-changelog": "src/index.js" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/auto-changelog/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sdk": { - "version": "2.1675.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1675.0.tgz", - "integrity": "sha512-gkqNAP0m3gDpnZCKL2OLdwAG+SjYT9MURGfTkixAWHIPDYD4OQf3sCcZNBTTTeOvOXus/tJIpgafKHD9DCIOCQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.16.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "util": "^0.12.4", - "uuid": "8.0.0", - "xml2js": "0.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aws-sdk/node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/aws-sdk/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/aws-sdk/node_modules/uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-transform-inline-environment-variables": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-environment-variables/-/babel-plugin-transform-inline-environment-variables-0.4.4.tgz", - "integrity": "sha512-bJILBtn5a11SmtR2j/3mBOjX4K3weC6cq+NNZ7hG22wCAqpc3qtj/iN7dSe9HDiS46lgp1nHsQgeYrea/RUe+g==", - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base58-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base58-js/-/base58-js-2.0.0.tgz", - "integrity": "sha512-nAV5d32QXuGcGptSApkKpC1gGakWBnfJMNjKrYTBh4tb0szfZF+ooueFLy8T4VrY+o4SrE/TyrtUnRZcwZchaA==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "license": "Apache-2.0" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "license": "MIT" - }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "license": "MIT", - "optional": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "license": "MIT" - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "license": "MIT" - }, - "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "license": "ISC" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "license": "MIT", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "license": "MIT" - }, - "node_modules/buffer/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/builtins": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/c8": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", - "license": "ISC", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/c8/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/c8/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/c8/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/c8/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/c8/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/c8/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cacache/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "license": "MIT", - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "license": "MIT", - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/canonicalize": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", - "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", - "license": "Apache-2.0" - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "license": "MIT", - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", - "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", - "license": "WTFPL", - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 6" - } - }, - "node_modules/chai-bites": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/chai-bites/-/chai-bites-0.1.2.tgz", - "integrity": "sha512-eZVKGTywFkRuMle/UkiT9OXU4y4WeNy0yKe2t5iclIW3Yn9X3l7iWZoSeTjTpeQ1SIMn3In0rctjVCaRuKCmng==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "chai": ">=2 <5" - } - }, - "node_modules/chai-parentheses": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/chai-parentheses/-/chai-parentheses-0.0.2.tgz", - "integrity": "sha512-pdBOsH31vzWKYHr8JYTlsP+TFx7RTTm/2hQYbpxFd1WQ/X58ryrLBINRL2C1OWje8bi42NQqNZl2RooFPrsBqA==", - "license": "MIT" - }, - "node_modules/chai-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.5.0.tgz", - "integrity": "sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw==", - "license": "MIT", - "peerDependencies": { - "chai": "^4.1.2" - } - }, - "node_modules/chai-subset": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.6.0.tgz", - "integrity": "sha512-K3d+KmqdS5XKW5DWPd5sgNffL3uxdDe+6GdnJh3AYPhwnBGRY5urfvfcbRtWIvvpz+KxkL9FeBB6MZewLUNwug==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT" - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", - "license": "MIT", - "dependencies": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-regexp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz", - "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==", - "license": "MIT", - "dependencies": { - "is-regexp": "^3.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clownface": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clownface/-/clownface-2.0.2.tgz", - "integrity": "sha512-HjTYqVXiCrw4FmoAWF46aQ3c2OmdVLoqZrAGkowdWWUoBBIcBht55pOxkyvoVe2BsPE/HqMzfnu51JpgqM4KEg==", - "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^2.0.1", - "@rdfjs/environment": "0 - 1", - "@rdfjs/namespace": "^2.0.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "optional": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "license": "MIT", - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", - "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", - "license": "MIT", - "dependencies": { - "array-back": "^6.2.2", - "chalk-template": "^0.4.0", - "table-layout": "^4.1.0", - "typical": "^7.1.1" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", - "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/comment-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.4.tgz", - "integrity": "sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw==", - "license": "MIT", - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "license": "MIT" - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "license": "MIT", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/configstore/node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/configstore/node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC", - "optional": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", - "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "license": "MIT", - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "license": "MIT", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "license": "MIT", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-hrtime": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", - "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/core-js-compat": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz", - "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cp-file": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz", - "integrity": "sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "nested-error-stacks": "^2.0.0", - "p-event": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cp-file/node_modules/p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "license": "MIT", - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cp-file/node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cpy": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-9.0.1.tgz", - "integrity": "sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg==", - "license": "MIT", - "dependencies": { - "arrify": "^3.0.0", - "cp-file": "^9.1.0", - "globby": "^13.1.1", - "junk": "^4.0.0", - "micromatch": "^4.0.4", - "nested-error-stacks": "^2.1.0", - "p-filter": "^3.0.0", - "p-map": "^5.3.0" - }, - "engines": { - "node": "^12.20.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cpy/node_modules/arrify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", - "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cpy/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cpy/node_modules/p-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", - "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", - "license": "MIT", - "dependencies": { - "p-map": "^5.1.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cpy/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "license": "MIT" - }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/datastore-core": { - "version": "9.2.9", - "resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-9.2.9.tgz", - "integrity": "sha512-wraWTPsbtdE7FFaVo3pwPuTB/zXsgwGGAm8BgBYwYAuzZCTS0MfXmd/HH1vR9s0/NFFjOVmBkGiWCvKxZ+QjVw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/logger": "^4.0.6", - "err-code": "^3.0.1", - "interface-datastore": "^8.0.0", - "interface-store": "^5.0.0", - "it-drain": "^3.0.5", - "it-filter": "^3.0.4", - "it-map": "^3.0.5", - "it-merge": "^3.0.3", - "it-pipe": "^3.0.1", - "it-pushable": "^3.2.3", - "it-sort": "^3.0.4", - "it-take": "^3.0.4" - } - }, - "node_modules/datastore-core/node_modules/interface-store": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.8.tgz", - "integrity": "sha512-7na81Uxkl0vqk0CBPO5PvyTkdaJBaezwUJGsMOz7riPOq0rJt+7W31iaopaMICWea/iykUsvNlPx/Tc+MxC3/w==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/debug-fabulous": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-2.0.2.tgz", - "integrity": "sha512-XfAbX8/owqC+pjIg0/+3V1gp8TugJT7StX/TE1TYedjrRf7h7SgUAL/+gKoAQGPCLbSU5L5LPvDg4/cGn1E/WA==", - "license": "MIT", - "dependencies": { - "debug": "^4", - "memoizee": "0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug-logfmt": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/debug-logfmt/-/debug-logfmt-1.2.2.tgz", - "integrity": "sha512-MAPU+m9lzLMkxI8k6/kJ/MGLGNtHOsW8RHriLkRxe/jFFW2iXmiGGUG9aYTRIWo5ejOFqLB10HqZ6+TN4toQFQ==", - "license": "MIT", - "dependencies": { - "@jclem/logfmt2": "~2.4.3", - "@kikobeats/time-span": "~1.0.2", - "debug-fabulous": "~2.0.2", - "pretty-ms": "~7.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "license": "MIT", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-7.2.2.tgz", - "integrity": "sha512-AD7TrdNNPXRZIGw63dw+lnGmT4v7ggZC5NHNJgAYWm5njrwoze1q5JSAW9YuLy2tjnoLUG/r8FEB93MCh9QJPg==", - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^7.1.1" - }, - "engines": { - "node": ">= 16" - } - }, - "node_modules/default-gateway/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/default-gateway/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "license": "MIT", - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-require-extensions/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "license": "MIT", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT", - "optional": true - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dependency-check": { - "version": "5.0.0-7", - "resolved": "https://registry.npmjs.org/dependency-check/-/dependency-check-5.0.0-7.tgz", - "integrity": "sha512-OZhz4TDlDUYiEnP1/3Q7hFlA2ViUCXNV7h9D7MrApSfmZj27MNZFdmBfYCQ1hldheILriZ+pbg/QW8wIlV1ahg==", - "deprecated": "dependency-check has been deprecated in favor of the knip module", - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.3.1", - "globby": "^12.0.2", - "is-relative": "^1.0.0", - "meow": "^10.1.3", - "picomatch": "^2.3.1", - "pkg-up": "^4.0.0", - "pony-cause": "^2.0.0", - "precinct": "^8.2.0", - "read-pkg": "^7.0.0", - "resolve": "^1.19.0" - }, - "bin": { - "dependency-check": "cli.cjs" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - } - }, - "node_modules/dependency-check/node_modules/array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "license": "MIT", - "dependencies": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/globby": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", - "license": "MIT", - "dependencies": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/read-pkg-up/node_modules/read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/read-pkg/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "license": "MIT", - "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-check/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "license": "ISC" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT", - "optional": true - }, - "node_modules/detective-amd": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-3.1.2.tgz", - "integrity": "sha512-jffU26dyqJ37JHR/o44La6CxtrDf3Rt9tvd2IbImJYxWKTMdBjctp37qoZ6ZcY80RHg+kzWz4bXn39e4P7cctQ==", - "license": "MIT", - "dependencies": { - "ast-module-types": "^3.0.0", - "escodegen": "^2.0.0", - "get-amd-module-type": "^3.0.0", - "node-source-walk": "^4.2.0" - }, - "bin": { - "detective-amd": "bin/cli.js" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/detective-amd/node_modules/ast-module-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", - "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/detective-amd/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/detective-cjs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-4.1.0.tgz", - "integrity": "sha512-QxzMwt5MfPLwS7mG30zvnmOvHLx5vyVvjsAV6gQOyuMoBR5G1DhS1eJZ4P10AlH+HSnk93mTcrg3l39+24XCtg==", - "license": "MIT", - "dependencies": { - "ast-module-types": "^4.0.0", - "node-source-walk": "^5.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/detective-es6": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-3.0.1.tgz", - "integrity": "sha512-evPeYIEdK1jK3Oji5p0hX4sPV/1vK+o4ihcWZkMQE6voypSW/cIBiynOLxQk5KOOQbdP8oOAsYqouMTYO5l1sw==", - "license": "MIT", - "dependencies": { - "node-source-walk": "^5.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/detective-less": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/detective-less/-/detective-less-1.0.2.tgz", - "integrity": "sha512-Rps1xDkEEBSq3kLdsdnHZL1x2S4NGDcbrjmd4q+PykK5aJwDdP5MBgrJw1Xo+kyUHuv3JEzPqxr+Dj9ryeDRTA==", - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "gonzales-pe": "^4.2.3", - "node-source-walk": "^4.0.0" - }, - "engines": { - "node": ">= 6.0" - } - }, - "node_modules/detective-less/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/detective-postcss": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-4.0.0.tgz", - "integrity": "sha512-Fwc/g9VcrowODIAeKRWZfVA/EufxYL7XfuqJQFroBKGikKX83d2G7NFw6kDlSYGG3LNQIyVa+eWv1mqre+v4+A==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.1", - "is-url": "^1.2.4", - "postcss": "^8.1.7", - "postcss-values-parser": "^2.0.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/detective-sass": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-3.0.2.tgz", - "integrity": "sha512-DNVYbaSlmti/eztFGSfBw4nZvwsTaVXEQ4NsT/uFckxhJrNRFUh24d76KzoCC3aarvpZP9m8sC2L1XbLej4F7g==", - "license": "MIT", - "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^4.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/detective-sass/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/detective-scss": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-2.0.2.tgz", - "integrity": "sha512-hDWnWh/l0tht/7JQltumpVea/inmkBaanJUcXRB9kEEXVwVUMuZd6z7eusQ6GcBFrfifu3pX/XPyD7StjbAiBg==", - "license": "MIT", - "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^4.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/detective-scss/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/detective-stylus": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-1.0.3.tgz", - "integrity": "sha512-4/bfIU5kqjwugymoxLXXLltzQNeQfxGoLm2eIaqtnkWxqbhap9puDVpJPVDx96hnptdERzS5Cy6p9N8/08A69Q==", - "license": "MIT" - }, - "node_modules/detective-typescript": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-7.0.2.tgz", - "integrity": "sha512-unqovnhxzvkCz3m1/W4QW4qGsvXCU06aU2BAm8tkza+xLnp9SOFnob2QsTxUv5PdnQKfDvWcv9YeOeFckWejwA==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "^4.33.0", - "ast-module-types": "^2.7.1", - "node-source-walk": "^4.2.0", - "typescript": "^3.9.10" - }, - "engines": { - "node": "^10.13 || >=12.0.0" - } - }, - "node_modules/detective-typescript/node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "license": "MIT", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/detective-typescript/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/detective-typescript/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/detective-typescript/node_modules/ast-module-types": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-2.7.1.tgz", - "integrity": "sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw==", - "license": "MIT" - }, - "node_modules/detective-typescript/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/detective-typescript/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/detective-typescript/node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-over-http-resolver": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-2.1.3.tgz", - "integrity": "sha512-zjRYFhq+CsxPAouQWzOsxNMvEN+SHisjzhX8EMxd2Y0EG3thvn6wXQgMJLnTDImkhe4jhLbOQpXtL10nALBOSA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "debug": "^4.3.1", - "native-fetch": "^4.0.2", - "receptacle": "^1.3.2", - "undici": "^5.12.0" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.4" - }, - "bin": { - "ignored": "bin/ignored" - } - }, - "node_modules/dotignore/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/dotignore/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==", - "license": "MIT", - "optional": true, - "dependencies": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplex-to": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/duplex-to/-/duplex-to-2.0.0.tgz", - "integrity": "sha512-f2nMnk11mwDptEFBTv2mcWHpF4ENAbuQ63yTiSy/99rG4Exsxsf0GJhJYq/AHF2cdMYswSx23LPuoijBflpquQ==", - "license": "MIT" - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/eccrypto": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.6.tgz", - "integrity": "sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==", - "hasInstallScript": true, - "license": "CC0-1.0", - "dependencies": { - "acorn": "7.1.1", - "elliptic": "6.5.4", - "es6-promise": "4.2.8", - "nan": "2.14.0" - }, - "optionalDependencies": { - "secp256k1": "3.7.1" - } - }, - "node_modules/eccrypto/node_modules/acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/eccrypto/node_modules/secp256k1": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", - "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.4.1", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eciesjs": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.7.tgz", - "integrity": "sha512-4JQahOkBdDy27jjW4q3FJQigHlcwZXx28sCtBQkBamF2XUdcNXrInpgrr8h205MtVIS0CMHufyIKGVjtjxQ2ZA==", - "license": "MIT", - "dependencies": { - "@noble/ciphers": "^0.5.3", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/eciesjs/node_modules/@noble/ciphers": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.5.3.tgz", - "integrity": "sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-mocha-main": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/electron-mocha-main/-/electron-mocha-main-11.0.3.tgz", - "integrity": "sha512-F9tfE9cvTpyXYGH/8g2ZtrhNjZdF2amnM9u7CIJ59Lcs0uHjlaVFrlIKNegS05ZwkajPAWkiB2KkpHco8GhD9g==", - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "electron-window": "^0.8.0", - "fs-extra": "^10.0.0", - "mocha": "^9.1.1", - "wherearewe": "^1.0.0", - "which": "^2.0.2", - "yargs": "^16.2.0" - }, - "bin": { - "electron-mocha": "bin/electron-mocha" - }, - "engines": { - "node": ">= 7.0.0" - } - }, - "node_modules/electron-mocha-main/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/electron-mocha-main/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/electron-mocha-main/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/electron-mocha-main/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/electron-mocha-main/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/electron-mocha-main/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/electron-mocha-main/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-mocha-main/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/electron-mocha-main/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/electron-mocha-main/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/electron-mocha-main/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-mocha-main/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-mocha-main/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-mocha-main/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-mocha-main/node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "license": "MIT", - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/electron-mocha-main/node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/electron-mocha-main/node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/electron-mocha-main/node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/electron-mocha-main/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-mocha-main/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-mocha-main/node_modules/wherearewe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-1.0.2.tgz", - "integrity": "sha512-HyLZ7n1Yox+w1qWaFEgP/sMs5D7ka2UXmoVNaY0XzbEHLGljo4ScBchYm6cWRYNO33tmFX3Mgg4BiZkDOjihyw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "is-electron": "^2.2.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/electron-mocha-main/node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "license": "Apache-2.0" - }, - "node_modules/electron-mocha-main/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/electron-mocha-main/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-mocha-main/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.7.tgz", - "integrity": "sha512-6FTNWIWMxMy/ZY6799nBlPtF1DFDQ6VQJ7yyDP27SJNt5lwtQ5ufqVvHylb3fdQefvRcgA3fKcFMJi9OLwBRNw==", - "license": "ISC" - }, - "node_modules/electron-window": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/electron-window/-/electron-window-0.8.1.tgz", - "integrity": "sha512-W1i9LfnZJozk3MXE8VgsL2E5wOUHSgyCvcg1H2vQQjj+gqhO9lVudgY3z3SF7LJAmi+0vy3CJkbMqsynWB49EA==", - "license": "MIT", - "dependencies": { - "is-electron-renderer": "^2.0.0" - } - }, - "node_modules/elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/email-addresses": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", - "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/env-ci": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", - "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" - }, - "engines": { - "node": ">=10.17" - } - }, - "node_modules/env-ci/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/env-ci/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/env-ci/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/env-ci/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/env-ci/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-aggregate-error": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.13.tgz", - "integrity": "sha512-KkzhUUuD2CUMqEc8JEqsXEMDHzDPE8RCjZeUBitsnB1eNcAJWQPiciKsMXe3Yytj4Flw1XLl46Qcf9OxvZha7A==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "license": "MIT" - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "license": "MIT" - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "license": "ISC", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/esbuild": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", - "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.16.17", - "@esbuild/android-arm64": "0.16.17", - "@esbuild/android-x64": "0.16.17", - "@esbuild/darwin-arm64": "0.16.17", - "@esbuild/darwin-x64": "0.16.17", - "@esbuild/freebsd-arm64": "0.16.17", - "@esbuild/freebsd-x64": "0.16.17", - "@esbuild/linux-arm": "0.16.17", - "@esbuild/linux-arm64": "0.16.17", - "@esbuild/linux-ia32": "0.16.17", - "@esbuild/linux-loong64": "0.16.17", - "@esbuild/linux-mips64el": "0.16.17", - "@esbuild/linux-ppc64": "0.16.17", - "@esbuild/linux-riscv64": "0.16.17", - "@esbuild/linux-s390x": "0.16.17", - "@esbuild/linux-x64": "0.16.17", - "@esbuild/netbsd-x64": "0.16.17", - "@esbuild/openbsd-x64": "0.16.17", - "@esbuild/sunos-x64": "0.16.17", - "@esbuild/win32-arm64": "0.16.17", - "@esbuild/win32-ia32": "0.16.17", - "@esbuild/win32-x64": "0.16.17" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-ipfs": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-ipfs/-/eslint-config-ipfs-2.2.1.tgz", - "integrity": "sha512-47yZHjrcLC34OKfPlxzdTAkBNHBnPIIi2RYII6Q9H7YPi0nakpXJQvOBCUAi3xRcrtnVFXDdSxnofbyPOck6hg==", - "license": "(Apache-2.0 AND MIT)", - "dependencies": { - "@typescript-eslint/eslint-plugin": "^4.1.0", - "@typescript-eslint/parser": "^4.1.0", - "eslint-config-standard": "^16.0.2", - "eslint-config-standard-with-typescript": "^21.0.1", - "eslint-plugin-etc": "^1.1.7", - "eslint-plugin-import": "^2.18.0", - "eslint-plugin-jsdoc": "^36.0.8", - "eslint-plugin-no-only-tests": "^2.4.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-ipfs/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/eslint-config-ipfs/node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint-config-ipfs/node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "deprecated": "Use @eslint/config-array instead", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "deprecated": "Use @eslint/object-schema instead", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/eslint-config-ipfs/node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-ipfs/node_modules/@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-ipfs/node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-config-ipfs/node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "license": "MIT", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-config-ipfs/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-ipfs/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-config-ipfs/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eslint-config-ipfs/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peerDependencies": { - "eslint": "^7.12.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1 || ^5.0.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint-config-standard-with-typescript": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-21.0.1.tgz", - "integrity": "sha512-FeiMHljEJ346Y0I/HpAymNKdrgKEpHpcg/D93FvPHWfCzbT4QyUJba/0FwntZeGLXfUiWDSeKmdJD597d9wwiw==", - "deprecated": "Please use eslint-config-love, instead.", - "license": "MIT", - "dependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint-config-standard": "^16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.1", - "eslint": "^7.12.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1 || ^5.0.0", - "typescript": "^3.9 || ^4.0.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint-etc": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/eslint-etc/-/eslint-etc-4.2.6.tgz", - "integrity": "sha512-/gg8U0SgBz6OQ2QKsvhmSF1WTL53nSD5qYHx/reNPnaKAUfH6qR0AIZQ7NNCRRSICRFagqf1nO8A7WmRFwcAJQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/experimental-utils": "^4.0.0", - "tsutils": "^3.17.1", - "tsutils-etc": "^1.3.4" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0", - "typescript": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint-plugin-etc": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-etc/-/eslint-plugin-etc-1.5.4.tgz", - "integrity": "sha512-FXpRHz5CGpT11pLln73JME4zHtopYKB7rlpvv5mcjEIJQJZazwswVF5WuGQxkm4cvlOpnFkfpatHICTRqTUkeA==", - "license": "MIT", - "dependencies": { - "@phenomnomnominal/tsquery": "^4.0.0", - "@typescript-eslint/experimental-utils": "^4.0.0", - "eslint-etc": "^4.0.4", - "requireindex": "~1.2.0", - "tslib": "^2.0.0", - "tsutils": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^ 7.0.0", - "typescript": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint-plugin-jsdoc": { - "version": "36.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.1.1.tgz", - "integrity": "sha512-nuLDvH1EJaKx0PCa9oeQIxH6pACIhZd1gkalTUxZbaxxwokjs7TplqY0Q8Ew3CoZaf5aowm0g/Z3JGHCatt+gQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@es-joy/jsdoccomment": "0.10.8", - "comment-parser": "1.2.4", - "debug": "^4.3.2", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "^1.1.1", - "lodash": "^4.17.21", - "regextras": "^0.8.0", - "semver": "^7.3.5", - "spdx-expression-parse": "^3.0.1" - }, - "engines": { - "node": "^12 || ^14 || ^16" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint-plugin-promise": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", - "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", - "license": "ISC", - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "license": "MIT", - "peer": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-config-ipfs/node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint-config-ipfs/node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-config-ipfs/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-config-ipfs/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "peer": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/eslint-config-ipfs/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint-config-ipfs/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-config-ipfs/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/eslint-config-ipfs/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-config-oceanprotocol": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-oceanprotocol/-/eslint-config-oceanprotocol-2.0.4.tgz", - "integrity": "sha512-VdCtlvjTHzlhErmy8BYCGj3r4/iSJDxseeQTISe5DSyrWaPJpMv728KxBvu+WsCWfuI2WzErAX1HDE/HjmcI6w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "eslint": "^8.23.1", - "eslint-config-prettier": "^8.5.0", - "eslint-config-standard": "^17.0.0", - "eslint-config-standard-react": "^11.0.1", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-n": "^15.3.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-promise": "^6.0.1", - "eslint-plugin-react": "^7.31.8", - "eslint-plugin-security": "^1.5.0" - } - }, - "node_modules/eslint-config-oceanprotocol/node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-config-oceanprotocol/node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/eslint-config-standard-jsx": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", - "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peerDependencies": { - "eslint": "^8.8.0", - "eslint-plugin-react": "^7.28.0" - } - }, - "node_modules/eslint-config-standard-react": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard-react/-/eslint-config-standard-react-11.0.1.tgz", - "integrity": "sha512-4WlBynOqBZJRaX81CBcIGDHqUiqxvw4j/DbEIICz8QkMs3xEncoPgAoysiqCSsg71X92uhaBc8sgqB96smaMmg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peerDependencies": { - "eslint": "^7.12.1", - "eslint-plugin-react": "^7.21.5" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "license": "MIT", - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", - "license": "MIT", - "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "license": "MIT", - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "license": "MIT", - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-node/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-node/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-promise": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", - "license": "ISC", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", - "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-security": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", - "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-regex": "^2.1.1" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eth-crypto": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eth-crypto/-/eth-crypto-2.6.0.tgz", - "integrity": "sha512-GCX4ffFYRUGgnuWR5qxcZIRQJ1KEqPFiyXU9yVy7s6dtXIMlUXZQ2h+5ID6rFaOHWbpJbjfkC6YdhwtwRYCnug==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "7.20.13", - "@ethereumjs/tx": "3.5.2", - "@types/bn.js": "5.1.1", - "eccrypto": "1.1.6", - "ethereumjs-util": "7.1.5", - "ethers": "5.7.2", - "secp256k1": "5.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/pubkey" - } - }, - "node_modules/eth-crypto/node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/eth-crypto/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/eth-crypto/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" - }, - "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethereum-cryptography/node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "license": "MPL-2.0", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ethereumjs-util/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "license": "MIT" - }, - "node_modules/ethers": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.2.tgz", - "integrity": "sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==", + "node_modules/@ethersproject/hdnode": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz", + "integrity": "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==", "funding": [ { "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { "type": "individual", @@ -15893,2494 +2356,2765 @@ ], "license": "MIT", "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.17.1" - }, - "engines": { - "node": ">=14.0.0" + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" } }, - "node_modules/ethers/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "node_modules/@ethersproject/json-wallets": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz", + "integrity": "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ethers/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" } }, - "node_modules/ethers/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", "license": "MIT" }, - "node_modules/ethers/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "license": "0BSD" - }, - "node_modules/ethers/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true + "node_modules/@ethersproject/keccak256": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", + "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, - "utf-8-validate": { - "optional": true + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + ], "license": "MIT", "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/event-iterator": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", - "integrity": "sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ==", - "license": "MIT" - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" + "@ethersproject/bytes": "^5.8.0", + "js-sha3": "0.8.0" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "node_modules/@ethersproject/logger": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", + "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT" }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "node_modules/@ethersproject/networks": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", + "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "node_modules/@ethersproject/pbkdf2": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", + "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/sha2": "^5.8.0" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@ethersproject/properties": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", + "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/@ethersproject/providers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", + "integrity": "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT" - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "license": "ISC", + "license": "MIT", "dependencies": { - "type": "^2.7.2" + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0", + "bech32": "1.1.4", + "ws": "8.18.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, "engines": { - "node": ">=4" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" + "node": ">=10.0.0" }, - "engines": { - "node": ">= 10.17.0" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/@ethersproject/random": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz", + "integrity": "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", - "engines": { - "node": "> 0.1.90" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/@ethersproject/rlp": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", + "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", + "node_modules/@ethersproject/sha2": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", + "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "hash.js": "1.1.7" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "node_modules/@ethersproject/signing-key": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", + "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], "license": "MIT", "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "bn.js": "^5.2.1", + "elliptic": "6.6.1", + "hash.js": "1.1.7" } }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } + "node_modules/@ethersproject/signing-key/node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "license": "MIT" }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/@ethersproject/solidity": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz", + "integrity": "sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "pend": "~1.2.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "node_modules/@ethersproject/strings": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", + "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], "license": "MIT", "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "node_modules/@ethersproject/transactions": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", + "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0" } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@ethersproject/units": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", + "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", - "engines": { - "node": ">=0.8.0" + "dependencies": { + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/@ethersproject/wallet": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz", + "integrity": "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/json-wallets": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" } }, - "node_modules/file-stream-rotator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", - "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "node_modules/@ethersproject/web": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", + "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "moment": "^2.29.1" + "@ethersproject/base64": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT" - }, - "node_modules/file-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", - "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", + "node_modules/@ethersproject/wordlists": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz", + "integrity": "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "license": "MIT", + "optional": true + }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", + "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, "engines": { - "node": ">=4" + "node": ">=12.10.0" } }, - "node_modules/filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "license": "MIT", + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "license": "Apache-2.0", "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" }, - "engines": { - "node": ">=8" + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "license": "Apache-2.0", "dependencies": { - "to-regex-range": "^5.0.1" + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">= 0.8" + "node": ">=10.10.0" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "license": "MIT", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, "license": "MIT", - "dependencies": { - "array-back": "^3.0.1" - }, "engines": { - "node": ">=4.0.0" + "node": ">=18" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/find-versions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, "license": "MIT", "dependencies": { - "semver-regex": "^3.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "license": "Apache-2.0", + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", "dependencies": { - "micromatch": "^4.0.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" } }, - "node_modules/flatbuffers": { - "version": "24.3.25", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.3.25.tgz", - "integrity": "sha512-3HDgPbgiwWMI9zVB7VYBHaMrbOO7Gm0v+yD2FV/sCKj+9NDeVL7BOBYUuhWAQGKWOzBo8S9WdMvV0eixO233XQ==", - "license": "Apache-2.0" - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "license": "ISC" - }, - "node_modules/flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", - "license": "MIT" - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, "engines": { - "node": ">=4.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" }, "peerDependenciesMeta": { - "debug": { + "@types/node": { "optional": true } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "license": "ISC", + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 14.17" + "node": ">=18" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, "license": "MIT", "dependencies": { - "fetch-blob": "^3.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=12.20.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/freeport-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/freeport-promise/-/freeport-promise-2.0.0.tgz", - "integrity": "sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/from2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true } - ], - "license": "MIT" - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" + } }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { - "node": ">=14.14" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" + "node_modules/@ipshipyard/libp2p-auto-tls": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@ipshipyard/libp2p-auto-tls/-/libp2p-auto-tls-2.0.1.tgz", + "integrity": "sha512-zpDXVMY1ZgB6o30zFocXUzrD9+tz1bbEdgewFoBf4olDh5/CwjDi/k9v2RrJqujWKYWyRuHRg6Q+VRpvtGrpuw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.2", + "@libp2p/crypto": "^5.0.9", + "@libp2p/http": "^2.0.0", + "@libp2p/interface": "^3.0.2", + "@libp2p/interface-internal": "^3.0.4", + "@libp2p/keychain": "^6.0.4", + "@libp2p/utils": "^7.0.4", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-matcher": "^3.0.1", + "@peculiar/x509": "^1.12.3", + "acme-client": "^5.4.0", + "any-signal": "^4.1.1", + "delay": "^6.0.0", + "interface-datastore": "^9.0.2", + "multiformats": "^13.3.1", + "uint8arrays": "^5.1.0" + } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/@ipshipyard/libp2p-auto-tls/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/function-timeout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz", - "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==", + "node_modules/@ipshipyard/libp2p-auto-tls/node_modules/delay": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz", + "integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==", "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "license": "MIT", + "node_modules/@ipshipyard/libp2p-auto-tls/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "license": "MIT" - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "license": "ISC", - "optional": true, "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "minipass": "^7.0.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "optional": true, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6.9.0" + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/get-amd-module-type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-3.0.2.tgz", - "integrity": "sha512-PcuKwB8ouJnKuAPn6Hk3UtdfKoUV3zXRqVEvj8XGIXqjWfgd1j7QGdXy5Z9OdQfzVt1Sk29HVe/P+X74ccOuqw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "license": "MIT", "dependencies": { - "ast-module-types": "^3.0.0", - "node-source-walk": "^4.2.2" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=6.0" + "node": ">=8" } }, - "node_modules/get-amd-module-type/node_modules/ast-module-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", - "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=6.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-amd-module-type/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6.0" + "node": ">=8" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=8" } }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, "license": "MIT", - "engines": { - "node": "*" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.0.0" } }, - "node_modules/get-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-2.0.1.tgz", - "integrity": "sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, "license": "MIT" }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8.0.0" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", "license": "MIT", - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "node_modules/@kikobeats/time-span": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@kikobeats/time-span/-/time-span-1.0.11.tgz", + "integrity": "sha512-S+msolgD9aPVoJ+ZomVD0WSKm+qJBKvJimzwq8dMvlGKbIPsAyEWhHHdSRuQT3g2VpDIctvbi9nU++kN/VPZaw==", "license": "MIT", - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 18" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@libp2p/autonat": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/autonat/-/autonat-3.0.10.tgz", + "integrity": "sha512-JGU2+sKU/6J4lxjNePjfcpus7fw1zf9STFr1MFHp0K8suyb3y3wvMPULNOPEVL4HlQqTkEH7J0PD3LWRnedtOQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/interface": "^3.1.0", + "@libp2p/interface-internal": "^3.0.10", + "@libp2p/peer-collections": "^7.0.10", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/utils": "^7.0.10", + "@multiformats/multiaddr": "^13.0.1", + "any-signal": "^4.1.1", + "main-event": "^1.0.1", + "multiformats": "^13.4.0", + "protons-runtime": "^5.6.0", + "uint8arraylist": "^2.4.8" } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "license": "MIT", + "node_modules/@libp2p/autonat/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/get-tsconfig": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", - "dev": true, - "license": "MIT", + "node_modules/@libp2p/autonat/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "multiformats": "^13.0.0" } }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", - "dev": true, - "license": "MIT", + "node_modules/@libp2p/bootstrap": { + "version": "12.0.11", + "resolved": "https://registry.npmjs.org/@libp2p/bootstrap/-/bootstrap-12.0.11.tgz", + "integrity": "sha512-ZIG8QKS+4w7ugK7a1ftdopjIA+NvOPKUq7JY1OsRxaiLdCdxgghPTiNIbinYsVv5iHULBnFZe4o5l+5L7+Hssw==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" - }, - "engines": { - "node": ">= 14" + "@libp2p/interface": "^3.1.0", + "@libp2p/interface-internal": "^3.0.10", + "@libp2p/peer-id": "^6.0.4", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-matcher": "^3.0.1", + "main-event": "^1.0.1" } }, - "node_modules/gh-pages": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-4.0.0.tgz", - "integrity": "sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==", - "license": "MIT", + "node_modules/@libp2p/bootstrap/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "async": "^2.6.1", - "commander": "^2.18.0", - "email-addresses": "^3.0.1", - "filenamify": "^4.3.0", - "find-cache-dir": "^3.3.1", - "fs-extra": "^8.1.0", - "globby": "^6.1.0" - }, - "bin": { - "gh-pages": "bin/gh-pages.js", - "gh-pages-clean": "bin/gh-pages-clean.js" - }, - "engines": { - "node": ">=10" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/gh-pages/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "license": "MIT", + "node_modules/@libp2p/bootstrap/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "multiformats": "^13.0.0" } }, - "node_modules/gh-pages/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", + "node_modules/@libp2p/circuit-relay-v2": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@libp2p/circuit-relay-v2/-/circuit-relay-v2-4.1.3.tgz", + "integrity": "sha512-XDgzXu/zMjwHyRSh8xiWlsQk3vGDVSdlukFxb0Eg1VXB2c0ytWgIF5JoynyrNpwXa6Pe0SgGEcUMt9wMaF6/HQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "@libp2p/interface-internal": "^3.0.10", + "@libp2p/peer-collections": "^7.0.10", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/peer-record": "^9.0.5", + "@libp2p/utils": "^7.0.10", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-matcher": "^3.0.1", + "any-signal": "^4.1.1", + "main-event": "^1.0.1", + "multiformats": "^13.4.0", + "nanoid": "^5.1.5", + "progress-events": "^1.0.1", + "protons-runtime": "^5.6.0", + "retimeable-signal": "^1.0.1", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/gh-pages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "license": "MIT", + "node_modules/@libp2p/circuit-relay-v2/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/gh-pages/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", + "node_modules/@libp2p/circuit-relay-v2/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "multiformats": "^13.0.0" } }, - "node_modules/gh-pages/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "license": "MIT", + "node_modules/@libp2p/crypto": { + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.1.13.tgz", + "integrity": "sha512-8NN9cQP3jDn+p9+QE9ByiEoZ2lemDFf/unTgiKmS3JF93ph240EUVdbCyyEgOMfykzb0okTM4gzvwfx9osJebQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@libp2p/interface": "^3.1.0", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1", + "multiformats": "^13.4.0", + "protons-runtime": "^5.6.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/gh-pages/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@libp2p/crypto/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/gh-pages/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "node_modules/@libp2p/dcutr": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/dcutr/-/dcutr-3.0.10.tgz", + "integrity": "sha512-rMBstMznxLgIGNvHFlEHo9Lvx0/+wD2RXB+H7VU58ov1CRQNwlSix38BaQ6PI94LOmVzDPHKl8x3mG6YKp5GEw==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "@libp2p/interface": "^3.1.0", + "@libp2p/interface-internal": "^3.0.10", + "@libp2p/utils": "^7.0.10", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-matcher": "^3.0.1", + "delay": "^7.0.0", + "protons-runtime": "^5.6.0", + "uint8arraylist": "^2.4.8" } }, - "node_modules/gh-pages/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/@libp2p/dcutr/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/gh-pages/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/@libp2p/dcutr/node_modules/delay": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-7.0.0.tgz", + "integrity": "sha512-C3vaGs818qzZjCvVJ98GQUMVyWeg7dr5w2Nwwb2t5K8G98jOyyVO2ti2bKYk5yoYElqH3F2yA53ykuEnwD6MCg==", "license": "MIT", + "dependencies": { + "random-int": "^3.1.0", + "unlimited-timeout": "^0.1.0" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-log-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", - "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", - "license": "MIT", + "node_modules/@libp2p/dcutr/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "0.6.8" + "multiformats": "^13.0.0" } }, - "node_modules/git-log-parser/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/git-log-parser/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", + "node_modules/@libp2p/http": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/http/-/http-2.0.1.tgz", + "integrity": "sha512-NjTvXdpwlGNvPsjiumRWJ3jm+9euQkKLXzdHnE+cPCEjPWo6cyGGB541161Jgi8CZ5tNTudddlriwkZRb8Z6KQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@libp2p/http-fetch": "^4.0.0", + "@libp2p/http-peer-id-auth": "^2.0.0", + "@libp2p/http-utils": "^2.0.0", + "@libp2p/http-websocket": "^2.0.0", + "@libp2p/interface": "^3.0.2", + "@libp2p/interface-internal": "^3.0.4", + "@multiformats/multiaddr": "^13.0.1", + "cookie": "^1.0.2", + "undici": "^7.16.0" } }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "license": "ISC", + "node_modules/@libp2p/http-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/http-fetch/-/http-fetch-4.0.1.tgz", + "integrity": "sha512-7vtJVOfyGol6CWrNm9HhjlYOmCsJVLKWYdhpmjdpS6pGWtpkTMrHJLznSJ7PYkMq7OnhzhXNFq0FhWygP6mmPQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "through2": "~2.0.0" + "@achingbrain/http-parser-js": "^0.5.9", + "@libp2p/http-utils": "^2.0.0", + "@libp2p/interface": "^3.0.2", + "uint8arrays": "^5.1.0" } }, - "node_modules/git-log-parser/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", + "node_modules/@libp2p/http-fetch/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "multiformats": "^13.0.0" } }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "license": "MIT", + "node_modules/@libp2p/http-peer-id-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/http-peer-id-auth/-/http-peer-id-auth-2.0.0.tgz", + "integrity": "sha512-GKs0DXK/JVKKH57IGQDiWsC6hYsLY+cwKNRMuX1FY6FZo09zc1QPwvgr0FNtIB2c5WJFf/vja4M4QekLsWU+xw==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "@libp2p/crypto": "^5.1.12", + "@libp2p/interface": "^3.0.2", + "@libp2p/peer-id": "^6.0.3", + "uint8-varint": "^2.0.4", + "uint8arrays": "^5.1.0" } }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "license": "MIT", + "node_modules/@libp2p/http-peer-id-auth/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" + "multiformats": "^13.0.0" } }, - "node_modules/git-url-parse": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", - "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", - "dev": true, - "license": "MIT", + "node_modules/@libp2p/http-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/http-utils/-/http-utils-2.0.1.tgz", + "integrity": "sha512-dJFRV2gAzPkF5NOnGMdWXXO3PFK0cMSn5uDbW55n5Usnrx6hHQmDCRfKh3ClQUzjG66pFjXM3zFXLKORyasl3A==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "git-up": "^7.0.0" + "@achingbrain/http-parser-js": "^0.5.9", + "@libp2p/interface": "^3.0.2", + "@libp2p/peer-id": "^6.0.3", + "@libp2p/utils": "^7.0.4", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-to-uri": "^12.0.0", + "@multiformats/uri-to-multiaddr": "^10.0.0", + "it-to-browser-readablestream": "^2.0.12", + "multiformats": "^13.4.1", + "race-event": "^1.6.1", + "readable-stream": "^4.7.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "license": "ISC" + "node_modules/@libp2p/http-utils/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", + "node_modules/@libp2p/http-utils/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "multiformats": "^13.0.0" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", + "node_modules/@libp2p/http-websocket": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/http-websocket/-/http-websocket-2.0.1.tgz", + "integrity": "sha512-hMMWVKAK3P3oAmatUB8SQ4mUMhkkLdERAjgZUoKdohIPumPGQ6ADFSJMYsSWv9ZwyBiXMHBbwluYEBZUw85GCw==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "@achingbrain/http-parser-js": "^0.5.9", + "@libp2p/http-utils": "^2.0.0", + "@libp2p/interface": "^3.0.2", + "@libp2p/interface-internal": "^3.0.4", + "@libp2p/utils": "^7.0.4", + "@multiformats/multiaddr": "^13.0.1", + "multiformats": "^13.4.1", + "race-event": "^1.6.1", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", + "node_modules/@libp2p/http-websocket/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "license": "BSD-3-Clause", - "optional": true, + "node_modules/@libp2p/http-websocket/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" + "multiformats": "^13.0.0" } }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dev": true, - "license": "MIT", + "node_modules/@libp2p/http/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/global-directory/node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node_modules/@libp2p/http/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "node_modules/@libp2p/http/node_modules/undici": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.20.0.tgz", + "integrity": "sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==", "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20.18.1" } }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "license": "ISC", - "engines": { - "node": ">=10" + "node_modules/@libp2p/identify": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/identify/-/identify-4.0.10.tgz", + "integrity": "sha512-DROyV+bZIlz9czCCHJdeVtm1+hEOKUigJHyTzzA/cuwwyvtm8Dco8F+VRYcrwpafuVtjv7yN7CskN4oIys56jw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "@libp2p/interface-internal": "^3.0.10", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/peer-record": "^9.0.5", + "@libp2p/utils": "^7.0.10", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-matcher": "^3.0.1", + "it-drain": "^3.0.10", + "it-parallel": "^3.0.13", + "main-event": "^1.0.1", + "protons-runtime": "^5.6.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "license": "MIT", + "node_modules/@libp2p/identify/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", + "node_modules/@libp2p/identify/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "multiformats": "^13.0.0" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", + "node_modules/@libp2p/interface": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-3.1.0.tgz", + "integrity": "sha512-RE7/XyvC47fQBe1cHxhMvepYKa5bFCUyFrrpj8PuM0E7JtzxU7F+Du5j4VXbg2yLDcToe0+j8mB7jvwE2AThYw==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@multiformats/dns": "^1.0.6", + "@multiformats/multiaddr": "^13.0.1", + "main-event": "^1.0.1", + "multiformats": "^13.4.0", + "progress-events": "^1.0.1", + "uint8arraylist": "^2.4.8" } }, - "node_modules/gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", - "license": "MIT", + "node_modules/@libp2p/interface-internal": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/interface-internal/-/interface-internal-3.0.10.tgz", + "integrity": "sha512-Gd/eQAoAlXqeCRJ6wOwcnTQ/SDe95bQow8osY8zq0nbfFBu26aChQHjAd+CjcCADJRh+Sd+7+dYG7BrhpxGt1A==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "gonzales": "bin/gonzales.js" - }, - "engines": { - "node": ">=0.6.0" + "@libp2p/interface": "^3.1.0", + "@libp2p/peer-collections": "^7.0.10", + "@multiformats/multiaddr": "^13.0.1", + "progress-events": "^1.0.1" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", + "node_modules/@libp2p/interface-internal/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "license": "MIT", + "node_modules/@libp2p/interface-internal/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "multiformats": "^13.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" + "node_modules/@libp2p/interface/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "license": "MIT" + "node_modules/@libp2p/interface/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } }, - "node_modules/grapoi": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/grapoi/-/grapoi-1.1.2.tgz", - "integrity": "sha512-FknMk4EPaVroumWDURlAScwr+cYE/e9dVmnTkuhhoghq9PWx2ap+A4+iS37dGoT6mhJbV0O+xgex6lI4c64plQ==", - "license": "MIT", + "node_modules/@libp2p/kad-dht": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/@libp2p/kad-dht/-/kad-dht-16.1.3.tgz", + "integrity": "sha512-yM9UumHkN8Dd+nFUllOio3/0uuzzpPgc/+PouDAABWs2ut36VfizhWVWAiqlLpzkpCquIzPUd0doRu0GKztdXA==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "@rdfjs/namespace": "^2.0.0", - "@rdfjs/term-set": "^2.0.0" + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "@libp2p/interface-internal": "^3.0.10", + "@libp2p/peer-collections": "^7.0.10", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/ping": "^3.0.10", + "@libp2p/record": "^4.0.9", + "@libp2p/utils": "^7.0.10", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-matcher": "^3.0.1", + "any-signal": "^4.1.1", + "interface-datastore": "^9.0.1", + "it-all": "^3.0.9", + "it-drain": "^3.0.10", + "it-length": "^3.0.9", + "it-map": "^3.1.4", + "it-merge": "^3.0.12", + "it-parallel": "^3.0.13", + "it-pipe": "^3.0.1", + "it-pushable": "^3.2.3", + "it-take": "^3.0.9", + "main-event": "^1.0.1", + "multiformats": "^13.4.0", + "p-defer": "^4.0.1", + "p-event": "^7.0.0", + "progress-events": "^1.0.1", + "protons-runtime": "^5.6.0", + "race-signal": "^2.0.0", + "uint8-varint": "^2.0.4", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "license": "MIT", - "engines": { - "node": ">=4.x" + "node_modules/@libp2p/kad-dht/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", + "node_modules/@libp2p/kad-dht/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "multiformats": "^13.0.0" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "license": "MIT", - "engines": { - "node": ">=6" + "node_modules/@libp2p/keychain": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/keychain/-/keychain-6.0.10.tgz", + "integrity": "sha512-f80yJSzKb3Vh8KtdNCxiPUu8qjyT6b+nQlS+jSmSDnMGXI8z49wdtfKuigQsKft64qt2mKMNq/9OBWyhUMYPFQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "@noble/hashes": "^2.0.1", + "asn1js": "^3.0.6", + "interface-datastore": "^9.0.1", + "multiformats": "^13.4.0", + "sanitize-filename": "^1.6.3", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/@libp2p/keychain/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "license": "MIT", + "node_modules/@libp2p/logger": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-6.2.2.tgz", + "integrity": "sha512-XtanXDT+TuMuZoCK760HGV1AmJsZbwAw5AiRUxWDbsZPwAroYq64nb41AHRu9Gyc0TK9YD+p72+5+FIxbw0hzw==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@libp2p/interface": "^3.1.0", + "@multiformats/multiaddr": "^13.0.1", + "interface-datastore": "^9.0.1", + "multiformats": "^13.4.0", + "weald": "^1.1.0" } }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/@libp2p/logger/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/@libp2p/logger/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/has-dynamic-import": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.1.0.tgz", - "integrity": "sha512-su0anMkNEnJKZ/rB99jn3y6lV/J8Ro96hBJ28YAeVzj5rWxH+YL/AdCyiYYA1HDLV9YhmvqpWSJJj2KLo1MX6g==", - "license": "MIT", + "node_modules/@libp2p/mdns": { + "version": "12.0.11", + "resolved": "https://registry.npmjs.org/@libp2p/mdns/-/mdns-12.0.11.tgz", + "integrity": "sha512-OB6am5A21Yc5c7KBZONQhTao4BHRDc3MurZ1qHzqU4FQidi719cNRw4ac6TVk4dcdtOYx+1ef8pvvLX+57hXAQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@libp2p/interface": "^3.1.0", + "@libp2p/interface-internal": "^3.0.10", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/utils": "^7.0.10", + "@multiformats/multiaddr": "^13.0.1", + "@types/multicast-dns": "^7.2.4", + "dns-packet": "^5.6.1", + "main-event": "^1.0.1", + "multicast-dns": "^7.2.5" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@libp2p/mdns/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", + "node_modules/@libp2p/mdns/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "multiformats": "^13.0.0" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/@libp2p/multistream-select": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/multistream-select/-/multistream-select-7.0.10.tgz", + "integrity": "sha512-6RAFctqWzwQ/qPaN3CxoueSs1b7pBVMZ+0n6G0kcsqVBj0wc4eB+dcJyUNrTV1NGgMCAl6tVAGztZaE8XZc9lw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/interface": "^3.1.0", + "@libp2p/utils": "^7.0.10", + "it-length-prefixed": "^10.0.1", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/@libp2p/multistream-select/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", + "node_modules/@libp2p/peer-collections": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-7.0.10.tgz", + "integrity": "sha512-OvlSY5N3J6q8U+EbTrQGbW8zdyOa3y7nz9Y3IbuE55tIiMd7pwm1U3Lknfb6IPkOWkHNfQDfCGGfGVQcMRodvQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@libp2p/interface": "^3.1.0", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/utils": "^7.0.10", + "multiformats": "^13.4.0" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC", - "optional": true - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@libp2p/peer-id": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-6.0.4.tgz", + "integrity": "sha512-Z3xK0lwwKn4bPg3ozEpPr1HxsRi2CxZdghOL+MXoFah/8uhJJHxHFA8A/jxtKn4BB8xkk6F8R5vKNIS05yaCYw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "multiformats": "^13.4.0", + "uint8arrays": "^5.1.0" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "license": "MIT", + "node_modules/@libp2p/peer-id-factory": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id-factory/-/peer-id-factory-4.2.4.tgz", + "integrity": "sha512-NDQ/qIWpcAG/6xQjyut6xCkrYYAoCaI/33Z+7yzo5qFODwLfNonLzSTasnA6jhuvHn33aHnD1qhdpFkmstxtNQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" + "@libp2p/crypto": "^4.1.9", + "@libp2p/interface": "^1.7.0", + "@libp2p/peer-id": "^4.2.4", + "protons-runtime": "^5.4.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", + "node_modules/@libp2p/peer-id-factory/node_modules/@libp2p/crypto": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-4.1.9.tgz", + "integrity": "sha512-8Cf2VKh0uC/rQLvTLSloIOMqUvf4jsSTHXgjWQRf47lDNJlNNI0wSv2S6gakT72GZsRV/jCjYwKPqRlsa5S0iA==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "@libp2p/interface": "^1.7.0", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0", + "asn1js": "^3.0.5", + "multiformats": "^13.1.0", + "protons-runtime": "^5.4.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "node_modules/@libp2p/peer-id-factory/node_modules/@libp2p/interface": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-1.7.0.tgz", + "integrity": "sha512-/zFyaIaIGW0aihhsH7/93vQdpWInUzFocxF11RO/029Y6h0SVjs24HHbils+DqaFDTqN+L7oNlBx2rM2MnmTjA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@multiformats/multiaddr": "^12.2.3", + "it-pushable": "^3.2.3", + "it-stream-types": "^2.0.1", + "multiformats": "^13.1.0", + "progress-events": "^1.0.0", + "uint8arraylist": "^2.4.8" + } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "license": "MIT", + "node_modules/@libp2p/peer-id-factory/node_modules/@libp2p/peer-id": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-4.2.4.tgz", + "integrity": "sha512-mvvsVxt4HkF14BrTNKbqr14VObW+KBJBWu1Oe6BFCoDttGMQLaI+PdduE1r6Tquntv5IONBqoITgD7ow5dQ+vQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "@libp2p/interface": "^1.7.0", + "multiformats": "^13.1.0", + "uint8arrays": "^5.1.0" } }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "node_modules/@libp2p/peer-id-factory/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" + "@noble/hashes": "1.8.0" }, "engines": { - "node": ">=8" + "node": "^14.21.3 || >=16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/hasha/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/@libp2p/peer-id-factory/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "engines": { - "node": ">=8" + "node": "^14.21.3 || >=16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" + "node_modules/@libp2p/peer-id-factory/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/hashlru": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", - "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==", - "license": "MIT" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", + "node_modules/@libp2p/peer-id/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" + "multiformats": "^13.0.0" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" + "node_modules/@libp2p/peer-record": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-9.0.5.tgz", + "integrity": "sha512-disk23OO00yD52O4VmItbDkjJZ/YZJsKbMsqNgVhr+D3PcM+KRpu9VVbiCnN5Tzn9XvFEHhrMJY7BPE+rvT5MQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "@libp2p/peer-id": "^6.0.4", + "@multiformats/multiaddr": "^13.0.1", + "multiformats": "^13.4.0", + "protons-runtime": "^5.6.0", + "uint8-varint": "^2.0.4", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", + "node_modules/@libp2p/peer-record/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@libp2p/peer-record/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "license": "ISC", + "node_modules/@libp2p/peer-store": { + "version": "12.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/peer-store/-/peer-store-12.0.10.tgz", + "integrity": "sha512-fe/6m0vXny9pvCyaSjg2GisdSVgxtHYZtp6op1WNm8dBvYqRXLuqSYi0QGEbLtSDSL4SeE8BKZyadyk/tYAqfg==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "@libp2p/peer-collections": "^7.0.10", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/peer-record": "^9.0.5", + "@multiformats/multiaddr": "^13.0.1", + "interface-datastore": "^9.0.1", + "it-all": "^3.0.9", + "main-event": "^1.0.1", + "mortice": "^3.3.1", + "multiformats": "^13.4.0", + "protons-runtime": "^5.6.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/hpagent": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", - "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", - "license": "MIT", - "engines": { - "node": ">=14" + "node_modules/@libp2p/peer-store/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "license": "MIT" + "node_modules/@libp2p/peer-store/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "license": "BSD-2-Clause" + "node_modules/@libp2p/ping": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/ping/-/ping-3.0.10.tgz", + "integrity": "sha512-XkwQOOrmIa1/9t2xq0+Zm3rWkyO+Q0SavlM3t6WkDjxC4F3h0MaYep2CX5BBWD2mZWyy8YdeQTF3N9YhRr4irg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "@libp2p/interface-internal": "^3.0.10", + "@multiformats/multiaddr": "^13.0.1", + "p-event": "^7.0.0", + "race-signal": "^2.0.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" + } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", + "node_modules/@libp2p/ping/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/http-link-header": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz", - "integrity": "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" + "node_modules/@libp2p/ping/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", + "node_modules/@libp2p/pubsub": { + "version": "10.1.18", + "resolved": "https://registry.npmjs.org/@libp2p/pubsub/-/pubsub-10.1.18.tgz", + "integrity": "sha512-Bxa0cwkaQvadyJNlJlzH0m1eo7m03G2nCpuKbcv+i0qNbyyTOydBcuoslG/UWFYhRBB9Js9R6zNIsaIgpo+iGw==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "@libp2p/crypto": "^5.1.8", + "@libp2p/interface": "^2.11.0", + "@libp2p/interface-internal": "^2.3.19", + "@libp2p/peer-collections": "^6.0.35", + "@libp2p/peer-id": "^5.1.9", + "@libp2p/utils": "^6.7.2", + "it-length-prefixed": "^10.0.1", + "it-pipe": "^3.0.1", + "it-pushable": "^3.2.3", + "main-event": "^1.0.1", + "multiformats": "^13.3.6", + "p-queue": "^8.1.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "license": "MIT", + "node_modules/@libp2p/pubsub-peer-discovery": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/pubsub-peer-discovery/-/pubsub-peer-discovery-12.0.0.tgz", + "integrity": "sha512-72sZwTDBH/iowRumycPLjSlaUd3cwQcjSN2xUagdzNtMt9ryWt7dL4fDGM+VsktSdYmzzOHhL9ZftNfUk7XG7A==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" + "@libp2p/crypto": "^5.0.0", + "@libp2p/interface": "^3.0.0", + "@libp2p/interface-internal": "^3.0.1", + "@libp2p/peer-id": "^6.0.1", + "@multiformats/multiaddr": "^13.0.1", + "protons-runtime": "^5.0.0", + "uint8arraylist": "^2.4.3", + "uint8arrays": "^5.0.2" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", + "node_modules/@libp2p/pubsub-peer-discovery/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=12.20.0" + "node_modules/@libp2p/pubsub-peer-discovery/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "optional": true, + "node_modules/@libp2p/pubsub/node_modules/@libp2p/interface": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-2.11.0.tgz", + "integrity": "sha512-0MUFKoXWHTQW3oWIgSHApmYMUKWO/Y02+7Hpyp+n3z+geD4Xo2Rku2gYWmxcq+Pyjkz6Q9YjDWz3Yb2SoV2E8Q==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "ms": "^2.0.0" + "@multiformats/dns": "^1.0.6", + "@multiformats/multiaddr": "^12.4.4", + "it-pushable": "^3.2.3", + "it-stream-types": "^2.0.2", + "main-event": "^1.0.1", + "multiformats": "^13.3.6", + "progress-events": "^1.0.1", + "uint8arraylist": "^2.4.8" } }, - "node_modules/hyperdiff": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/hyperdiff/-/hyperdiff-2.0.18.tgz", - "integrity": "sha512-heYv0VkEDZct8c2naho35oJku0IZRV8z2kEcrYyOAgmfI97KysvRbN4cazCJycKL72E7JEpydwiNPRZwuEOfIg==", - "license": "MIT", + "node_modules/@libp2p/pubsub/node_modules/@libp2p/interface-internal": { + "version": "2.3.19", + "resolved": "https://registry.npmjs.org/@libp2p/interface-internal/-/interface-internal-2.3.19.tgz", + "integrity": "sha512-v335EB0i5CaNF+0SqT01CTBp0VyjJizpy46KprcshFFjX16UQ8+/QzoTZqmot9WiAmAzwR0b87oKmlAE9cpxzQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "debug-logfmt": "~1.2.0", - "lodash": "~4.17.21" - }, - "engines": { - "node": ">= 8" + "@libp2p/interface": "^2.11.0", + "@libp2p/peer-collections": "^6.0.35", + "@multiformats/multiaddr": "^12.4.4", + "progress-events": "^1.0.1" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", + "node_modules/@libp2p/pubsub/node_modules/@libp2p/logger": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-5.2.0.tgz", + "integrity": "sha512-OEFS529CnIKfbWEHmuCNESw9q0D0hL8cQ8klQfjIVPur15RcgAEgc1buQ7Y6l0B6tCYg120bp55+e9tGvn8c0g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" + "@libp2p/interface": "^2.11.0", + "@multiformats/multiaddr": "^12.4.4", + "interface-datastore": "^8.3.1", + "multiformats": "^13.3.6", + "weald": "^1.0.4" } }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "license": "BSD-3-Clause" + "node_modules/@libp2p/pubsub/node_modules/@libp2p/peer-collections": { + "version": "6.0.35", + "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-6.0.35.tgz", + "integrity": "sha512-QiloK3T7DXW7R2cpL38dBnALCHf5pMzs/TyFzlEK33WezA2YFVoj7CtOJKqbn29bmV9uspWOxMgfmLUXf8ALvA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/interface": "^2.11.0", + "@libp2p/peer-id": "^5.1.9", + "@libp2p/utils": "^6.7.2", + "multiformats": "^13.3.6" + } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" + "node_modules/@libp2p/pubsub/node_modules/@libp2p/peer-id": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-5.1.9.tgz", + "integrity": "sha512-cVDp7lX187Epmi/zr0Qq2RsEMmueswP9eIxYSFoMcHL/qcvRFhsxOfUGB8361E26s2WJvC9sXZ0oJS9XVueJhQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/crypto": "^5.1.8", + "@libp2p/interface": "^2.11.0", + "multiformats": "^13.3.6", + "uint8arrays": "^5.1.0" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "license": "MIT", + "node_modules/@libp2p/pubsub/node_modules/@libp2p/utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-yglVPcYErb4al3MMTdedVLLsdUvr5KaqrrxohxTl/FXMFBvBs0o3w8lo29nfnTUpnNSHFhWZ9at0ZGNnpT/C/w==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@chainsafe/is-ip": "^2.1.0", + "@chainsafe/netmask": "^2.0.0", + "@libp2p/crypto": "^5.1.8", + "@libp2p/interface": "^2.11.0", + "@libp2p/logger": "^5.2.0", + "@multiformats/multiaddr": "^12.4.4", + "@sindresorhus/fnv1a": "^3.1.0", + "any-signal": "^4.1.1", + "delay": "^6.0.0", + "get-iterator": "^2.0.1", + "is-loopback-addr": "^2.0.2", + "is-plain-obj": "^4.1.0", + "it-foreach": "^2.1.3", + "it-pipe": "^3.0.1", + "it-pushable": "^3.2.3", + "it-stream-types": "^2.0.2", + "main-event": "^1.0.1", + "netmask": "^2.0.2", + "p-defer": "^4.0.1", + "race-event": "^1.3.0", + "race-signal": "^1.1.3", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "node_modules/@libp2p/pubsub/node_modules/delay": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz", + "integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==", "license": "MIT", "engines": { - "node": ">=12.2" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" + "node_modules/@libp2p/pubsub/node_modules/interface-datastore": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.3.2.tgz", + "integrity": "sha512-R3NLts7pRbJKc3qFdQf+u40hK8XWc0w4Qkx3OFEstC80VoaDUABY/dXA2EJPhtNC+bsrf41Ehvqb6+pnIclyRA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "interface-store": "^6.0.0", + "uint8arrays": "^5.1.0" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/@libp2p/pubsub/node_modules/interface-store": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-6.0.3.tgz", + "integrity": "sha512-+WvfEZnFUhRwFxgz+QCQi7UC6o9AM0EHM9bpIe2Nhqb100NHCsTvNAn4eJgvgV2/tmLo1MP9nGxQKEcZTAueLA==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/@libp2p/pubsub/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", - "license": "MIT" + "node_modules/@libp2p/pubsub/node_modules/race-signal": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/race-signal/-/race-signal-1.1.3.tgz", + "integrity": "sha512-Mt2NznMgepLfORijhQMncE26IhkmjEphig+/1fKC0OtaKwys/gpvpmswSjoN01SS+VO951mj0L4VIDXdXsjnfA==", + "license": "Apache-2.0 OR MIT" }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "license": "ISC", - "optional": true + "node_modules/@libp2p/pubsub/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", + "node_modules/@libp2p/record": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@libp2p/record/-/record-4.0.9.tgz", + "integrity": "sha512-ITxntqQ2GDK/yA1NhzEQc2dXpxgox96xZ1cqO507choY5z5Czhz2BxfyElVO/XYjOXvylu1XN66uh3VuGHrfkQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "protons-runtime": "^5.6.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "node_modules/@libp2p/record/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "node_modules/@libp2p/tcp": { + "version": "11.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/tcp/-/tcp-11.0.10.tgz", + "integrity": "sha512-vp1XvbRUU6JyVZMDfrr8UX+xs1sybT2r3PFoN5m07r3GSrMMPOKpWN2HkhT2pCBZWJG6ADQOy5+K0tBRE782oA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/interface": "^3.1.0", + "@libp2p/utils": "^7.0.10", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-matcher": "^3.0.1", + "@types/sinon": "^20.0.0", + "main-event": "^1.0.1", + "p-event": "^7.0.0", + "progress-events": "^1.0.1", + "uint8arraylist": "^2.4.8" + } }, - "node_modules/inquirer": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.2.tgz", - "integrity": "sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw==", - "dev": true, - "license": "MIT", + "node_modules/@libp2p/tcp/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "@inquirer/figures": "^1.0.3", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.1" - }, - "engines": { - "node": ">=18" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/inquirer/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, + "node_modules/@libp2p/tcp/node_modules/@types/sinon": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-20.0.0.tgz", + "integrity": "sha512-etYGUC6IEevDGSWvR9WrECRA01ucR2/Oi9XMBUAdV0g4bLkNf4HlZWGiGlDOq5lgwXRwcV+PSeKgFcW4QzzYOg==", "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/sinonjs__fake-timers": "*" } }, - "node_modules/inquirer/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", + "node_modules/@libp2p/tcp/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "multiformats": "^13.0.0" } }, - "node_modules/inquirer/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", + "node_modules/@libp2p/tls": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/tls/-/tls-3.0.10.tgz", + "integrity": "sha512-O/e/kEzXZPgHb1asyN1P4hCcECQnFEiGAQCgjkKU/nTjHYCvWG0CAU5uJuJkj9RXLpDFPVZ38FMN3dSzx0Ny7Q==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/utils": "^7.0.10", + "@peculiar/asn1-schema": "^2.4.0", + "@peculiar/asn1-x509": "^2.4.0", + "@peculiar/webcrypto": "^1.5.0", + "@peculiar/x509": "^1.13.0", + "asn1js": "^3.0.6", + "p-event": "^7.0.0", + "protons-runtime": "^5.6.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" } }, - "node_modules/inquirer/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", + "node_modules/@libp2p/tls/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" + "multiformats": "^13.0.0" } }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@libp2p/upnp-nat": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/upnp-nat/-/upnp-nat-4.0.10.tgz", + "integrity": "sha512-pEVLzDI7hY37vxjQyPvY6naWavUB5icTTLUtu/mHLvlb79jYX/NspIhUlbPcYFGH5dTD4NBaqHn6k3otOHssiw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@achingbrain/nat-port-mapper": "^4.0.4", + "@chainsafe/is-ip": "^2.1.0", + "@libp2p/interface": "^3.1.0", + "@libp2p/interface-internal": "^3.0.10", + "@libp2p/utils": "^7.0.10", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-matcher": "^3.0.1", + "main-event": "^1.0.1", + "p-defer": "^4.0.1", + "race-signal": "^2.0.0" } }, - "node_modules/inquirer/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@libp2p/upnp-nat/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/inquirer/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@libp2p/upnp-nat/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/inquirer/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, + "node_modules/@libp2p/utils": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-7.0.10.tgz", + "integrity": "sha512-+mzD+7yLMoZ8+34y/iS9d1CnwHjJJ/qEsao9FckHf9T9tnVXEyLLu9TpzBCcGRm4fUK/QCSHK2AcZH50kkAFkw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.1.0", + "@chainsafe/netmask": "^2.0.0", + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "@libp2p/logger": "^6.2.2", + "@multiformats/multiaddr": "^13.0.1", + "@sindresorhus/fnv1a": "^3.1.0", + "any-signal": "^4.1.1", + "cborg": "^4.2.14", + "delay": "^7.0.0", + "is-loopback-addr": "^2.0.2", + "it-length-prefixed": "^10.0.1", + "it-pipe": "^3.0.1", + "it-pushable": "^3.2.3", + "it-stream-types": "^2.0.2", + "main-event": "^1.0.1", + "netmask": "^2.0.2", + "p-defer": "^4.0.1", + "p-event": "^7.0.0", + "race-signal": "^2.0.0", + "uint8-varint": "^2.0.4", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/@libp2p/utils/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/@libp2p/utils/node_modules/delay": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-7.0.0.tgz", + "integrity": "sha512-C3vaGs818qzZjCvVJ98GQUMVyWeg7dr5w2Nwwb2t5K8G98jOyyVO2ti2bKYk5yoYElqH3F2yA53ykuEnwD6MCg==", "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "random-int": "^3.1.0", + "unlimited-timeout": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "node_modules/@libp2p/utils/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/@libp2p/websockets": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/@libp2p/websockets/-/websockets-10.1.3.tgz", + "integrity": "sha512-TzH7ja1Ay7zIXif5eYSRUAupqtRotUyNegumRPFV+DjiqOYK2DiZd8Z6QTG1iVUsUXMXrWihbFkR96zyQ9eajw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/interface": "^3.1.0", + "@libp2p/utils": "^7.0.10", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-matcher": "^3.0.1", + "@multiformats/multiaddr-to-uri": "^12.0.0", + "main-event": "^1.0.1", + "p-event": "^7.0.0", + "progress-events": "^1.0.1", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0", + "ws": "^8.18.3" + } + }, + "node_modules/@libp2p/websockets/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/@libp2p/websockets/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/inquirer/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node_modules/@multiformats/dns": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.13.tgz", + "integrity": "sha512-yr4bxtA3MbvJ+2461kYIYMsiiZj/FIqKI64hE4SdvWJUdWF9EtZLar38juf20Sf5tguXKFUruluswAO6JsjS2w==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@dnsquery/dns-packet": "^6.1.1", + "@libp2p/interface": "^3.1.0", + "hashlru": "^2.3.0", + "p-queue": "^9.0.0", + "progress-events": "^1.0.0", + "uint8arrays": "^5.0.2" } }, - "node_modules/inquirer/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, + "node_modules/@multiformats/dns/node_modules/p-queue": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", + "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "eventemitter3": "^5.0.1", + "p-timeout": "^7.0.0" }, "engines": { - "node": ">=6" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", + "node_modules/@multiformats/dns/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "multiformats": "^13.0.0" } }, - "node_modules/inquirer/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", + "node_modules/@multiformats/multiaddr": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz", + "integrity": "sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "@chainsafe/is-ip": "^2.0.1", + "@chainsafe/netmask": "^2.0.0", + "@multiformats/dns": "^1.0.3", + "abort-error": "^1.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/inquirer/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", + "node_modules/@multiformats/multiaddr-matcher": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-matcher/-/multiaddr-matcher-3.0.1.tgz", + "integrity": "sha512-jvjwzCPysVTQ53F4KqwmcqZw73BqHMk0UUZrMP9P4OtJ/YHrfs122ikTqhVA2upe0P/Qz9l8HVlhEifVYB2q9A==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" + "@multiformats/multiaddr": "^13.0.0" } }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", + "node_modules/@multiformats/multiaddr-matcher/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/inquirer/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@multiformats/multiaddr-matcher/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", + "node_modules/@multiformats/multiaddr-to-uri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-12.0.0.tgz", + "integrity": "sha512-3uIEBCiy8tfzxYYBl81x1tISiNBQ7mHU4pGjippbJRoQYHzy/ZdZM/7JvTldr8pc/dzpkaNJxnsuxxlhsPOJsA==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "@multiformats/multiaddr": "^13.0.0" } }, - "node_modules/interface-datastore": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.3.0.tgz", - "integrity": "sha512-RM/rTSmRcnoCwGZIHrPm+nlGYVoT4R0lcFvNnDyhdFT4R6BuHHhfFP47UldVEjs98SfxLuMhaNMsyjI918saHw==", + "node_modules/@multiformats/multiaddr-to-uri/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", "license": "Apache-2.0 OR MIT", "dependencies": { - "interface-store": "6.0.0", - "uint8arrays": "^5.0.2" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/interface-datastore/node_modules/uint8arrays": { + "node_modules/@multiformats/multiaddr-to-uri/node_modules/uint8arrays": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", @@ -18389,4053 +5123,4355 @@ "multiformats": "^13.0.0" } }, - "node_modules/interface-store": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-6.0.0.tgz", - "integrity": "sha512-HkjsDPsjA7SKkCr+TH1elUQApAAM3X3JPwrz3vFzaf614wI+ZD6GVvwKGZCHYcbSRqeZP/uzVPqezzeISeo5kA==", - "license": "Apache-2.0 OR MIT" + "node_modules/@multiformats/multiaddr/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "license": "MIT", + "node_modules/@multiformats/uri-to-multiaddr": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@multiformats/uri-to-multiaddr/-/uri-to-multiaddr-10.0.0.tgz", + "integrity": "sha512-QsmwLmY6iB1wDU1e1wyctqF0eP/2KD1QPLQ+APISuqETbCTSpaq159S/K/ssmWlBpSEkhH0SUfBUgGi014Ttfw==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" + "@multiformats/multiaddr": "^13.0.0", + "is-ip": "^5.0.0" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, + "node_modules/@multiformats/uri-to-multiaddr/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/@multiformats/uri-to-multiaddr/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/@noble/ciphers": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.1.1.tgz", + "integrity": "sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==", "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "node_modules/@noble/curves": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", + "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", "license": "MIT", "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" + "@noble/hashes": "2.0.1" }, "engines": { - "node": ">=10" + "node": ">= 20.19.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/ip": { + "node_modules/@noble/hashes": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", + "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "devOptional": true, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "license": "MIT", "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">= 12" + "node": ">= 8" } }, - "node_modules/ip-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", - "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, "engines": { - "node": ">= 10" + "node": ">= 8" } }, - "node_modules/irregular-plurals": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", - "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@nodeutils/defaults-deep": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@nodeutils/defaults-deep/-/defaults-deep-1.1.0.tgz", + "integrity": "sha512-gG44cwQovaOFdSR02jR9IhVRpnDP64VN6JdjYJTfNz4J4fWn7TQnmrf22nSjRqlwlxPcW8PL/L3KbJg3tdwvpg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lodash": "^4.15.0" } }, - "node_modules/is-arguments": { + "node_modules/@npmcli/fs": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", "license": "MIT", + "optional": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" + } + }, + "node_modules/@oceanprotocol/contracts": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@oceanprotocol/contracts/-/contracts-2.5.0.tgz", + "integrity": "sha512-w7YwpmqvQRBmdY/4LMLmsFDFPt+dpNZGmqxfhq9mOHSSFKg0G9cYoVZ+GV6yyp8tdUNHs9IteQooPO2kg3HCXA==", + "license": "Apache-2.0" + }, + "node_modules/@oceanprotocol/ddo-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@oceanprotocol/ddo-js/-/ddo-js-0.2.0.tgz", + "integrity": "sha512-Qy6mRY72KBf7k8u/sbbvm7TT+0d686Pn4ICg6VskzMfPnfFg9ObBCf0ejon6yyx1gMwQ+h5/8NYX51NdYPcEVw==", + "license": "Apache-2.0", + "dependencies": { + "@rdfjs/formats-common": "^3.1.0", + "@types/rdfjs__formats-common": "^3.1.5", + "@zazuko/env-node": "^2.1.4", + "chai": "^5.1.2", + "ethers": "^6.15.0", + "rdf-literal": "^2.0.0", + "rdf-validate-shacl": "^0.5.6" } }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "node_modules/@oceanprotocol/ddo-js/node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "node_modules/@oceanprotocol/ddo-js/node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/@oceanprotocol/ddo-js/node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 16" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/@oceanprotocol/ddo-js/node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/@oceanprotocol/ddo-js/node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "license": "MIT" + }, + "node_modules/@oceanprotocol/ddo-js/node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 14.16" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 20" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "node_modules/@octokit/core": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "dev": true, "license": "MIT", "dependencies": { - "ci-info": "^2.0.0" + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": ">= 20" } }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "node_modules/@octokit/endpoint": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", + "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", + "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 20" } }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "node_modules/@octokit/graphql": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "dev": true, "license": "MIT", "dependencies": { - "is-typed-array": "^1.1.13" + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 20" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", + "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 20" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@octokit/core": ">=6" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/@octokit/plugin-request-log": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz", + "integrity": "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==", + "dev": true, "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, "engines": { - "node": ">=8" + "node": ">= 20" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-electron": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", - "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", - "license": "MIT" - }, - "node_modules/is-electron-renderer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-electron-renderer/-/is-electron-renderer-2.0.1.tgz", - "integrity": "sha512-pRlQnpaCFhDVPtkXkP+g9Ybv/CjbiQDjnKFQTEjpBfDKeV6dRDBczuFRDpM6DVfk2EjpMS8t5kwE5jPnqYl3zA==", - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@octokit/core": ">=6" } }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", + "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "@octokit/types": "^16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" } }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "node_modules/@octokit/request": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", + "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", + "dev": true, "license": "MIT", "dependencies": { - "number-is-nan": "^1.0.0" + "@octokit/endpoint": "^11.0.2", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "fast-content-type-parse": "^3.0.0", + "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 20" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "node_modules/@octokit/request-error": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 20" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/@octokit/rest": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.1.tgz", + "integrity": "sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==", + "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "@octokit/core": "^7.0.6", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-request-log": "^6.0.0", + "@octokit/plugin-rest-endpoint-methods": "^17.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 20" } }, - "node_modules/is-in-ci": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-0.1.0.tgz", - "integrity": "sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==", + "node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", "dev": true, "license": "MIT", - "bin": { - "is-in-ci": "cli.js" - }, + "dependencies": { + "@octokit/openapi-types": "^27.0.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.0.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.0.tgz", + "integrity": "sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==", + "license": "Apache-2.0", "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=14.16" + "node": "^18.19.0 || >=20.6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", + "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", + "license": "Apache-2.0", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", + "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", "license": "MIT", "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509-attr": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", + "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" } }, - "node_modules/is-ip": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", - "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", + "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", "license": "MIT", "dependencies": { - "ip-regex": "^5.0.0", - "super-regex": "^0.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", + "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", "license": "MIT", - "optional": true + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } }, - "node_modules/is-loopback-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-loopback-addr/-/is-loopback-addr-2.0.2.tgz", - "integrity": "sha512-26POf2KRCno/KTNL5Q0b/9TYnL00xEsSaLfiFRmjM7m7Lw7ZMmFybzzuX4CcsLAluZGd+niLUiMRxEooVE3aqg==", - "license": "MIT" + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", + "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", + "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-pfx": "^2.6.0", + "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509-attr": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", + "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", + "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" } }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", + "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", + "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", "license": "MIT", - "engines": { - "node": ">=0.12.0" + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "tslib": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/@peculiar/webcrypto": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", + "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2", + "webcrypto-core": "^1.8.0" + }, "engines": { - "node": ">=8" + "node": ">=10.12.0" } }, - "node_modules/is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", "license": "MIT", "dependencies": { - "symbol-observable": "^1.1.0" + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" }, "engines": { - "node": ">=4" + "node": ">=20.0.0" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "node_modules/@phun-ky/typeof": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@phun-ky/typeof/-/typeof-2.0.3.tgz", + "integrity": "sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": "^20.9.0 || >=22.0.0", + "npm": ">=10.8.2" + }, + "funding": { + "url": "https://github.com/phun-ky/typeof?sponsor=1" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": ">=8" + "node": ">=14" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@rdfjs/data-model": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-2.1.1.tgz", + "integrity": "sha512-6mcOI4DjIPS6MOZw23H8oAdujHCk5gippVNQ7mKwliYTvTNh+uqRM91B9OLqhoAoNcQ3t49Dx2ooIMRG9/6ooA==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "rdfjs-data-model-test": "bin/test.js" } }, - "node_modules/is-regexp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", - "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "node_modules/@rdfjs/dataset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rdfjs/dataset/-/dataset-2.0.2.tgz", + "integrity": "sha512-6YJx+5n5Uxzq9dd9I0GGcIo6eopZOPfcsAfxSGX5d+YBzDgVa1cbtEBFnaPyPKiQsOm4+Cr3nwypjpg02YKPlA==", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "rdfjs-dataset-test": "bin/test.js" } }, - "node_modules/is-relative": { + "node_modules/@rdfjs/environment": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "resolved": "https://registry.npmjs.org/@rdfjs/environment/-/environment-1.0.0.tgz", + "integrity": "sha512-+S5YjSvfoQR5r7YQCRCCVHvIEyrWia7FJv2gqM3s5EDfotoAQmFeBagApa9c/eQFi5EiNhmBECE5nB8LIxTaHg==", + "license": "MIT" + }, + "node_modules/@rdfjs/fetch-lite": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@rdfjs/fetch-lite/-/fetch-lite-3.3.0.tgz", + "integrity": "sha512-K3hZC4+Ch0UmYA1w0Xv/8cCVPD5ulKwRa6A/iTn3BFbZpVAb5KoBfOfnOhe6VJEa50raUvTHR1gp1YdvUnYt9g==", "license": "MIT", "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "is-stream": "^4.0.1", + "nodeify-fetch": "^3.1.0", + "readable-stream": "^4.5.2" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "node_modules/@rdfjs/formats": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/formats/-/formats-4.0.1.tgz", + "integrity": "sha512-Rg53vP+x1bnGAqJNKgEzJEUPDhj+tCpzb6wdmfLoVFq4XoZ589+cg2ScFDUMMyAVsgKXvSWjDhQ9f9ab254ZxA==", "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@rdfjs/parser-jsonld": "^2.1.0", + "@rdfjs/parser-n3": "^2.0.1", + "@rdfjs/serializer-jsonld": "^2.0.0", + "@rdfjs/serializer-jsonld-ext": "^4.0.0", + "@rdfjs/serializer-ntriples": "^2.0.0", + "@rdfjs/serializer-turtle": "^1.1.1", + "@rdfjs/sink-map": "^2.0.0", + "rdfxml-streaming-parser": "^3.0.1" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "node_modules/@rdfjs/formats-common": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rdfjs/formats-common/-/formats-common-3.1.0.tgz", + "integrity": "sha512-wgz5za/Uls+pttLdLl/aH0m0LQNgjqpWwk9exNs2Smmb2CosynRo4S0+CxeNOVZh4zeUm7oAlr1CK/tyg4Ff6g==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@rdfjs/parser-jsonld": "^2.0.0", + "@rdfjs/parser-n3": "^2.0.0", + "@rdfjs/serializer-jsonld": "^2.0.0", + "@rdfjs/serializer-ntriples": "^2.0.0", + "@rdfjs/sink-map": "^2.0.0", + "rdfxml-streaming-parser": "^2.2.0" } }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, + "node_modules/@rdfjs/formats/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "protocols": "^2.0.1" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "node_modules/@rdfjs/formats/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/@rdfjs/formats/node_modules/rdfxml-streaming-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rdfxml-streaming-parser/-/rdfxml-streaming-parser-3.2.0.tgz", + "integrity": "sha512-SgQGK0EkbXd0jQ1PZk7dEpfDxf4CZpezkO6cTuGWesa9twdWaaW5elMoNBcbMT+2tOZC1EYZjs0JaXx0HnifcQ==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "@rubensworks/saxes": "^6.0.1", + "@types/readable-stream": "^4.0.18", + "buffer": "^6.0.3", + "rdf-data-factory": "^2.0.2", + "readable-stream": "^4.4.2", + "relative-to-absolute-iri": "^1.0.0", + "validate-iri": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "individual", + "url": "https://github.com/sponsors/rubensworks/" + } + }, + "node_modules/@rdfjs/namespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/namespace/-/namespace-2.0.1.tgz", + "integrity": "sha512-U85NWVGnL3gWvOZ4eXwUcv3/bom7PAcutSBQqmVWvOaslPy+kDzAJCH1WYBLpdQd4yMmJ+bpJcDl9rcHtXeixg==", + "license": "MIT", + "dependencies": { + "@rdfjs/data-model": "^2.0.1" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/@rdfjs/parser-jsonld": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@rdfjs/parser-jsonld/-/parser-jsonld-2.1.3.tgz", + "integrity": "sha512-VYnPEwVdqFAPTo9F8XIN4UpGPdNzhBaCFv5b5OT74pA7H8so4aTno3Yd6M5I9bhTrUoCQjpjgr+ugYlvWxdBIA==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@rdfjs/data-model": "^2.0.2", + "@rdfjs/sink": "^2.0.1", + "duplex-to": "^2.0.0", + "jsonld-streaming-parser": "^5.0.0", + "readable-stream": "^4.5.2" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/@rdfjs/parser-n3": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@rdfjs/parser-n3/-/parser-n3-2.1.0.tgz", + "integrity": "sha512-/DiosB+0vPzgAs1WXcCB8MbA5hqq0fIh9VhMg7fBmoJ/I8Xl6Op/AOxVu9x1XZCHSNwO/VsJT/HYKEctZVRKSQ==", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@rdfjs/data-model": "^2.0.2", + "@rdfjs/sink": "^2.0.1", + "duplex-to": "^2.0.0", + "n3": "^1.17.2", + "readable-stream": "^4.5.2" } }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "node_modules/@rdfjs/prefix-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@rdfjs/prefix-map/-/prefix-map-0.1.2.tgz", + "integrity": "sha512-qapFYVPYyYepg0sFy7T512667iZsN9a3RNcyNBTBV+O8wrU3v/URQZOipCTNrEm1BXzZ7KCK1Yi8HrE1y+uRuQ==", "license": "MIT", "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "readable-stream": "^4.3.0" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "node_modules/@rdfjs/serializer-jsonld": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/serializer-jsonld/-/serializer-jsonld-2.0.1.tgz", + "integrity": "sha512-O8WzdY7THsse/nMsrMLd2e51ADHO2SIUrkiZ9Va/8W3lXeeeiwDRPMppWy/i9yL4q6EM8iMW1riV7E0mK3fsBQ==", "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@rdfjs/sink": "^2.0.1", + "readable-stream": "^4.5.2" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" + "node_modules/@rdfjs/serializer-jsonld-ext": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rdfjs/serializer-jsonld-ext/-/serializer-jsonld-ext-4.0.2.tgz", + "integrity": "sha512-l/A6gQgKWYYGOPbcVZWnaamqWPtShL4FDrEqh5F85Fw0PdSca7q0YOBpB8ihxKmiGmfXa+SB4M8l9iyEegcp7Q==", + "license": "MIT", + "dependencies": { + "@rdfjs/sink": "^2.0.1", + "jsonld": "^9.0.0", + "readable-stream": "^4.7.0", + "stream-chunks": "^1.0.0" + } }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "node_modules/@rdfjs/serializer-ntriples": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/serializer-ntriples/-/serializer-ntriples-2.0.1.tgz", + "integrity": "sha512-G1ZI0qaN/MUHxeCwr59JscO2LdyIb6MNQdXOv7NFBZuodyHsxxhJRFmMVn+3SEXeNJbVeEEbWBrLglCUgJ8XjQ==", "license": "MIT", "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" + "@rdfjs/sink": "^2.0.1", + "@rdfjs/to-ntriples": "^3.0.1", + "duplex-to": "^2.0.0", + "readable-stream": "^4.5.2" } }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/@rdfjs/serializer-turtle": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rdfjs/serializer-turtle/-/serializer-turtle-1.1.5.tgz", + "integrity": "sha512-uvIFUOuMuk8JrJnng/tWKIQ+8XI6YLEms75YdvZ49LtIyyfbDqKz76EybgnD/zZYfMhVVkguKtheBC9h08g1PQ==", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@rdfjs/data-model": "^2.0.1", + "@rdfjs/namespace": "^2.0.0", + "@rdfjs/prefix-map": "^0.1.1", + "@rdfjs/sink": "^2.0.0", + "@rdfjs/term-map": "^2.0.0", + "@rdfjs/to-ntriples": "^3.0.1", + "@rdfjs/tree": "^0.2.1", + "readable-stream": "^4.3.0", + "stream-chunks": "^1.0.0" } }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "node_modules/@rdfjs/sink": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/sink/-/sink-2.0.1.tgz", + "integrity": "sha512-smzIFGF6EH1sLAJR9F3p2wMNrN44JjPeYAoITTJLqtuNC319K7IXaJ+qNLBGTtapZ/jvpx2Tks0TjcH9KrAvEA==", "license": "MIT" }, - "node_modules/is-uuid": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-uuid/-/is-uuid-1.0.2.tgz", - "integrity": "sha512-tCByphFcJgf2qmiMo5hMCgNAquNSagOetVetDvBXswGkNfoyEMvGH1yDlF8cbZbKnbVBr4Y5/rlpMz9umxyBkQ==", + "node_modules/@rdfjs/sink-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/sink-map/-/sink-map-2.0.1.tgz", + "integrity": "sha512-BwCTTsMN/tfQl6QzD2oHn9A08e4af+hlzAz/d5XXrlOkYMEDUAqFuh2Odj9EbayhAEeN4wA743Mj2yC0/s69rg==", "license": "MIT" }, - "node_modules/is-weakmap": { + "node_modules/@rdfjs/term-map": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "resolved": "https://registry.npmjs.org/@rdfjs/term-map/-/term-map-2.0.2.tgz", + "integrity": "sha512-EJ2FmmdEUsSR/tU1nrizRLWzH24YzhuvesrbUWxC3Fs0ilYNdtTbg0RaFJDUnJF3HkbNBQe8Zrt/uvU/hcKnHg==", "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@rdfjs/to-ntriples": "^3.0.1" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/@rdfjs/term-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@rdfjs/term-set/-/term-set-2.0.3.tgz", + "integrity": "sha512-DyXrKWEx+mtAFUZVU7bc3Va6/KZ8PsIp0RVdyWT9jfDgI/HCvNisZaBtAcm+SYTC45o+7WLkbudkk1bfaKVB0A==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@rdfjs/to-ntriples": "^3.0.1" } }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "node_modules/@rdfjs/to-ntriples": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/to-ntriples/-/to-ntriples-3.0.1.tgz", + "integrity": "sha512-gjoPAvh4j7AbGMjcDn/8R4cW+d/FPtbfbMM0uQXkyfBFtNUW2iVgrqsgJ65roLc54Y9A2TTFaeeTGSvY9a0HCQ==", + "license": "MIT" + }, + "node_modules/@rdfjs/traverser": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@rdfjs/traverser/-/traverser-0.1.4.tgz", + "integrity": "sha512-53QYlxiQIxH8k4jutjet1EjdZfyKCDSsfqnj2YejAJ1X8mLDMSOsneMM5savBwBR0ROfAhKVtZVb+pego+JLiw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@rdfjs/to-ntriples": "^3.0.1" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/@rdfjs/tree": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@rdfjs/tree/-/tree-0.2.1.tgz", + "integrity": "sha512-J70CQ7R8Ivfs1FFUxtFN7ADb5wTMgbhn0O558NXSXQHItmSavT6cXmQlIokbmboU+grhu56iR/8Bl9do8LCq+w==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@rdfjs/namespace": "^2.0.0", + "@rdfjs/term-map": "^2.0.0", + "@rdfjs/term-set": "^2.0.1" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/@rdfjs/types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-2.0.1.tgz", + "integrity": "sha512-uyAzpugX7KekAXAHq26m3JlUIZJOC0uSBhpnefGV5i15bevDyyejoB7I+9MKeUrzXD8OOUI3+4FeV1wwQr5ihA==", "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "@types/node": "*" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rubensworks/saxes": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@rubensworks/saxes/-/saxes-6.0.1.tgz", + "integrity": "sha512-UW4OTIsOtJ5KSXo2Tchi4lhZqu+tlHrOAs4nNti7CrtB53kAZl3/hyrTi6HkMihxdbDM6m2Zc3swc/ZewEe1xw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" }, "engines": { - "node": ">=8" + "node": ">=v12.22.12" } }, - "node_modules/is-yarn-global": { + "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, + "node_modules/@sindresorhus/fnv1a": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/fnv1a/-/fnv1a-3.1.0.tgz", + "integrity": "sha512-KV321z5m/0nuAg83W1dPLy85HpHDk7Sdi4fJbwvacWsEhAh+rZUW4ZfGcXmUIvjZg4ss2bcwNlRhJ7GBEUG08w==", "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT" + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "node_modules/@sinonjs/commons/node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, "license": "MIT", - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, "engines": { - "node": ">=10.13" + "node": ">=4" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, "license": "BSD-3-Clause", - "engines": { - "node": ">=8" + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", + "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "type-detect": "^4.1.0" } }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "license": "BSD-3-Clause", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", + "license": "Apache-2.0", "dependencies": { - "append-transform": "^2.0.0" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "license": "BSD-3-Clause", + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", + "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=18.0.0" } }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "license": "ISC", + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", + "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", + "license": "Apache-2.0", "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "license": "MIT", + "node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", + "license": "Apache-2.0", "dependencies": { - "aggregate-error": "^3.0.0" + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/@smithy/core": { + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.22.1.tgz", + "integrity": "sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.11", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "license": "BSD-3-Clause", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", + "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", + "license": "Apache-2.0", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" + "node": ">=18.0.0" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "license": "MIT", + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz", + "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", + "license": "Apache-2.0", "dependencies": { - "semver": "^7.5.3" + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18.0.0" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz", + "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", + "license": "Apache-2.0", "dependencies": { - "has-flag": "^4.0.0" + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "license": "BSD-3-Clause", + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz", + "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", + "license": "Apache-2.0", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" + "node": ">=18.0.0" } }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "license": "BSD-3-Clause", + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz", + "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", + "license": "Apache-2.0", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/it-all": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.6.tgz", - "integrity": "sha512-HXZWbxCgQZJfrv5rXvaVeaayXED8nTKx9tj9fpBhmcUJcedVZshMMMqTj0RG2+scGypb9Ut1zd1ifbf3lA8L+Q==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-byte-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/it-byte-stream/-/it-byte-stream-1.1.0.tgz", - "integrity": "sha512-WWponBWdKEa6o2U3NX+wGMY8X1EkWXcQvpC+3CUqKb4ZzK30q3EPqiTjFxLf9tNVgdF/MNAtx/XclpVfgaz9KQ==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz", + "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", + "license": "Apache-2.0", "dependencies": { - "it-queueless-pushable": "^1.0.0", - "it-stream-types": "^2.0.1", - "uint8arraylist": "^2.4.8" + "@smithy/eventstream-codec": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-drain": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-3.0.7.tgz", - "integrity": "sha512-vy6S1JKjjHSIFHgBpLpD1zhkCRl3z1zYWUxE14+kAYf+BL9ssWSFImJfhl361IIcwr0ofw8etzg11VqqB+ntUA==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-filter": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.1.1.tgz", - "integrity": "sha512-TOXmVuaSkxlLp2hXKoMTra0WMZMKVFxE3vSsbIA+PbADNCBAHhjJ/lM31vBOUTddHMO34Ku++vU8T9PLlBxQtg==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "license": "Apache-2.0", "dependencies": { - "it-peekable": "^3.0.0" + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-first": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.6.tgz", - "integrity": "sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-foreach": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/it-foreach/-/it-foreach-2.1.1.tgz", - "integrity": "sha512-ID4Gxnavk/LVQLQESAQ9hR6dR63Ih6X+8VdxEktX8rpz2dCGAbZpey/eljTNbMfV2UKXHiu6UsneoNBZuac97g==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.9.tgz", + "integrity": "sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==", + "license": "Apache-2.0", "dependencies": { - "it-peekable": "^3.0.0" + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-glob": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-1.0.2.tgz", - "integrity": "sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==", - "license": "ISC", + "node_modules/@smithy/hash-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", + "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", + "license": "Apache-2.0", "dependencies": { - "@types/minimatch": "^3.0.4", - "minimatch": "^3.0.4" + "@smithy/types": "^4.12.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.8.tgz", + "integrity": "sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==", + "license": "Apache-2.0", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@smithy/types": "^4.12.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", + "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^1.1.7" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": "*" + "node": ">=18.0.0" } }, - "node_modules/it-length": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/it-length/-/it-length-3.0.6.tgz", - "integrity": "sha512-R7bxHAzpRzYz7vghc2DDH7x4KXvEkeLfN/h316++jzbkEHIRXbEPLbE20p5yrqqBdOeK6/FRUDuHlTJ0H1hysw==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-length-prefixed": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-9.1.0.tgz", - "integrity": "sha512-kx2UTJuy7/lsT3QUzf50NjfxU1Z4P4wlvYp6YnR5Nc61P8XKfy+QtiJi1VLojA+Kea7vMbB4002rIij1Ol9hcw==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", "dependencies": { - "it-reader": "^6.0.1", - "it-stream-types": "^2.0.1", - "uint8-varint": "^2.0.1", - "uint8arraylist": "^2.0.0", - "uint8arrays": "^5.0.1" + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=18.0.0" } }, - "node_modules/it-length-prefixed-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/it-length-prefixed-stream/-/it-length-prefixed-stream-1.2.0.tgz", - "integrity": "sha512-vX7dzSl/2UMYYsAr0FQdPNVR5xYEETaeboZ+eXxNBjgARuvxnWA6OedW8lC5/J3ebMTC98JhA3eH76eTijUOsA==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/md5-js": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.8.tgz", + "integrity": "sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==", + "license": "Apache-2.0", "dependencies": { - "it-byte-stream": "^1.0.0", - "it-stream-types": "^2.0.1", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8" + "@smithy/types": "^4.12.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-length-prefixed/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", + "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", + "license": "Apache-2.0", "dependencies": { - "multiformats": "^13.0.0" + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-map": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.1.1.tgz", - "integrity": "sha512-9bCSwKD1yN1wCOgJ9UOl+46NQtdatosPWzxxUk2NdTLwRPXLh+L7iwCC9QKsbgM60RQxT/nH8bKMqm3H/o8IHQ==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/middleware-endpoint": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.13.tgz", + "integrity": "sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==", + "license": "Apache-2.0", "dependencies": { - "it-peekable": "^3.0.0" + "@smithy/core": "^3.22.1", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-merge": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.5.tgz", - "integrity": "sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/middleware-retry": { + "version": "4.4.30", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.30.tgz", + "integrity": "sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==", + "license": "Apache-2.0", "dependencies": { - "it-pushable": "^3.2.3" + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/service-error-classification": "^4.2.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-pair": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/it-pair/-/it-pair-2.0.6.tgz", - "integrity": "sha512-5M0t5RAcYEQYNG5BV7d7cqbdwbCAp5yLdzvkxsZmkuZsLbTdZzah6MQySYfaAQjNDCq6PUnDt0hqBZ4NwMfW6g==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "license": "Apache-2.0", "dependencies": { - "it-stream-types": "^2.0.1", - "p-defer": "^4.0.0" + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=18.0.0" } }, - "node_modules/it-parallel": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.8.tgz", - "integrity": "sha512-URLhs6eG4Hdr4OdvgBBPDzOjBeSSmI+Kqex2rv/aAyYClME26RYHirLVhZsZP5M+ZP6M34iRlXk8Wlqtezuqpg==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "license": "Apache-2.0", "dependencies": { - "p-defer": "^4.0.1" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-peekable": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.5.tgz", - "integrity": "sha512-JWQOGMt6rKiPcY30zUVMR4g6YxkpueTwHVE7CMs/aGqCf4OydM6w+7ZM3PvmO1e0TocjuR4aL8xyZWR46cTqCQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-pipe": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", - "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "license": "Apache-2.0", "dependencies": { - "it-merge": "^3.0.0", - "it-pushable": "^3.1.2", - "it-stream-types": "^2.0.1" + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=18.0.0" } }, - "node_modules/it-protobuf-stream": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/it-protobuf-stream/-/it-protobuf-stream-1.1.5.tgz", - "integrity": "sha512-H70idW45As3cEbU4uSoZ9IYHUIV3YM69/2mmXYR7gOlPabWjuyNi3/abK11geiiq3la27Sos/mXr68JljjKtEQ==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/node-http-handler": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.9.tgz", + "integrity": "sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==", + "license": "Apache-2.0", "dependencies": { - "it-length-prefixed-stream": "^1.0.0", - "it-stream-types": "^2.0.1", - "uint8arraylist": "^2.4.8" + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-pushable": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", - "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "license": "Apache-2.0", "dependencies": { - "p-defer": "^4.0.0" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-queueless-pushable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/it-queueless-pushable/-/it-queueless-pushable-1.0.0.tgz", - "integrity": "sha512-HbcAbcuQj7a9EBxiRCZ+77FxWutgs/pY5ZvEyQnylWPGNFojCLAUwhcZjf5OuEQ9+y+vSa7w1GQBe8xJdmIn5A==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "license": "Apache-2.0", "dependencies": { - "p-defer": "^4.0.1", - "race-signal": "^1.0.2" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-reader": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.4.tgz", - "integrity": "sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "license": "Apache-2.0", "dependencies": { - "it-stream-types": "^2.0.1", - "uint8arraylist": "^2.0.0" + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=18.0.0" } }, - "node_modules/it-sort": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/it-sort/-/it-sort-3.0.6.tgz", - "integrity": "sha512-aNrlZAXB8vWBd42tCpaXGL6CJVJNDW3OLczmdt6g0k/s9Z6evkTdgU2LjwW5SNNeX41sF+C8MjV+OcVf93PsPw==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "license": "Apache-2.0", "dependencies": { - "it-all": "^3.0.0" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/it-stream-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", - "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/service-error-classification": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", + "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0" + }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=18.0.0" } }, - "node_modules/it-take": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/it-take/-/it-take-3.0.6.tgz", - "integrity": "sha512-uqw3MRzf9to1SOLxaureGa73lK8k8ZB/asOApTAkvrzUqCznGtKNgPFH7uYIWlt4UuWq/hU6I+U4Fm5xpjN8Vg==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-ws": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/it-ws/-/it-ws-6.1.5.tgz", - "integrity": "sha512-uWjMtpy5HqhSd/LlrlP3fhYrr7rUfJFFMABv0F5d6n13Q+0glhZthwUKpEAVhDrXY95Tb1RB5lLqqef+QbVNaw==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "license": "Apache-2.0", "dependencies": { - "@types/ws": "^8.2.2", - "event-iterator": "^2.0.0", - "it-stream-types": "^2.0.1", - "uint8arrays": "^5.0.0", - "ws": "^8.4.0" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=18.0.0" } }, - "node_modules/it-ws/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", + "node_modules/@smithy/signature-v4": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", + "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", + "license": "Apache-2.0", "dependencies": { - "multiformats": "^13.0.0" + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/@smithy/smithy-client": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.2.tgz", + "integrity": "sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.22.1", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.11", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "license": "MIT", + "node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "license": "MIT", + "node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "license": "Apache-2.0", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "license": "MIT", + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 0.6.0" + "node": ">=18.0.0" } }, - "node_modules/jmespath": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 0.6.0" + "node": ">=18.0.0" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", "dependencies": { - "argparse": "^2.0.1" + "tslib": "^2.6.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz", - "integrity": "sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg==", - "license": "MIT", + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" }, "engines": { - "node": ">=4" + "node": ">=18.0.0" } }, - "node_modules/json-bignum": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", - "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.29.tgz", + "integrity": "sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.8" + "node": ">=18.0.0" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.32", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.32.tgz", + "integrity": "sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.6", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6" + "node": ">=18.0.0" } }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", + "node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", + "license": "Apache-2.0", "dependencies": { - "universalify": "^2.0.0" + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/jsonld": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.3.2.tgz", - "integrity": "sha512-MwBbq95szLwt8eVQ1Bcfwmgju/Y5P2GdtlHE2ncyfuYjIdEhluUVyj1eudacf1mOkWIoS9GpDBTECqhmq7EOaA==", - "license": "BSD-3-Clause", + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", "dependencies": { - "@digitalbazaar/http-client": "^3.4.1", - "canonicalize": "^1.0.1", - "lru-cache": "^6.0.0", - "rdf-canonize": "^3.4.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" + "node": ">=18.0.0" } }, - "node_modules/jsonld-context-parser": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonld-context-parser/-/jsonld-context-parser-2.4.0.tgz", - "integrity": "sha512-ZYOfvh525SdPd9ReYY58dxB3E2RUEU4DJ6ZibO8AitcowPeBH4L5rCAitE2om5G1P+HMEgYEYEr4EZKbVN4tpA==", - "license": "MIT", + "node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "license": "Apache-2.0", "dependencies": { - "@types/http-link-header": "^1.0.1", - "@types/node": "^18.0.0", - "cross-fetch": "^3.0.6", - "http-link-header": "^1.0.2", - "relative-to-absolute-iri": "^1.0.5" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "bin": { - "jsonld-context-parse": "bin/jsonld-context-parse.js" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/jsonld-context-parser/node_modules/@types/node": { - "version": "18.19.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.44.tgz", - "integrity": "sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==", - "license": "MIT", + "node_modules/@smithy/util-retry": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", + "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", + "license": "Apache-2.0", "dependencies": { - "undici-types": "~5.26.4" + "@smithy/service-error-classification": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/jsonld-streaming-parser": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jsonld-streaming-parser/-/jsonld-streaming-parser-3.4.0.tgz", - "integrity": "sha512-897CloyQgQidfkB04dLM5XaAXVX/cN9A2hvgHJo4y4jRhIpvg3KLMBBfcrswepV2N3T8c/Rp2JeFdWfVsbVZ7g==", - "license": "MIT", + "node_modules/@smithy/util-stream": { + "version": "4.5.11", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.11.tgz", + "integrity": "sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==", + "license": "Apache-2.0", "dependencies": { - "@bergos/jsonparse": "^1.4.0", - "@rdfjs/types": "*", - "@types/http-link-header": "^1.0.1", - "@types/readable-stream": "^2.3.13", - "buffer": "^6.0.3", - "canonicalize": "^1.0.1", - "http-link-header": "^1.0.2", - "jsonld-context-parser": "^2.4.0", - "rdf-data-factory": "^1.1.0", - "readable-stream": "^4.0.0" + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.9", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/jsonld-streaming-parser/node_modules/@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "license": "MIT", + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "license": "(MIT OR Apache-2.0)", + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" }, - "bin": { - "JSONStream": "bin.js" + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.8.tgz", + "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": "*" + "node": ">=18.0.0" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "license": "MIT", + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "license": "Apache-2.0", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" + "tslib": "^2.6.2" }, "engines": { - "node": ">=4.0" + "node": ">=18.0.0" } }, - "node_modules/junk": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", - "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "license": "MIT", + "optional": true, "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/just-extend": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", - "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, "license": "MIT" }, - "node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", - "hasInstallScript": true, + "node_modules/@tpluscode/rdf-ns-builders": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tpluscode/rdf-ns-builders/-/rdf-ns-builders-4.3.0.tgz", + "integrity": "sha512-x3uh9mYwAU+PrALaDKhVjml1TCCWWduo6J8rybd9SMEEAoooXq1MYb13MRputjRT/kYaFyCND7LMobzhxZ/+bg==", "license": "MIT", "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" + "@rdfjs/data-model": "^2", + "@rdfjs/namespace": "^2", + "@rdfjs/types": "*", + "@types/rdfjs__namespace": "^2.0.2", + "@zazuko/prefixes": "^2.0.1" } }, - "node_modules/keccak/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/@types/bn.js": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.6.tgz", + "integrity": "sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "@types/node": "*" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/@types/chai": { + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/clownface": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/clownface/-/clownface-2.0.10.tgz", + "integrity": "sha512-Vz48oQux0YArQ66wfRp54NlxvEmpyTqbFIH435AsgN7C+p4MXao/rjXUisULL6436bxjFk4VluZr7J2HQkBHmQ==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "peer": true, + "dependencies": { + "@rdfjs/types": ">=1", + "@types/rdfjs__environment": "*" } }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "node_modules/@types/command-line-args": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", + "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", + "license": "MIT" + }, + "node_modules/@types/command-line-usage": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", + "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", + "license": "MIT" + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.11" + "@types/node": "*" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@types/node": "*" } }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" + "node_modules/@types/dns-packet": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", + "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, - "node_modules/ky": { - "version": "0.33.3", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", - "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", + "node_modules/@types/docker-modem": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz", + "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" + "dependencies": { + "@types/node": "*", + "@types/ssh2": "*" } }, - "node_modules/ky-universal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.11.0.tgz", - "integrity": "sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==", + "node_modules/@types/dockerode": { + "version": "3.3.47", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.47.tgz", + "integrity": "sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw==", + "dev": true, "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "node-fetch": "^3.2.10" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky-universal?sponsor=1" - }, - "peerDependencies": { - "ky": ">=0.31.4", - "web-streams-polyfill": ">=3.2.1" - }, - "peerDependenciesMeta": { - "web-streams-polyfill": { - "optional": true - } + "@types/docker-modem": "*", + "@types/node": "*", + "@types/ssh2": "*" } }, - "node_modules/ky-universal/node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 12" + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" } }, - "node_modules/ky-universal/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "dev": true, "license": "MIT", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-link-header": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/http-link-header/-/http-link-header-1.0.7.tgz", + "integrity": "sha512-snm5oLckop0K3cTDAiBnZDy6ncx9DJ3mCRDvs42C884MbVYPP74Tiq2hFsSDRTyjK6RyDYDIulPiW23ge+g5Lw==", "license": "MIT", "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/@types/ip": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/ip/-/ip-1.1.3.tgz", + "integrity": "sha512-64waoJgkXFTYnCYDUWgSATJ/dXEBanVkaP5d4Sbk7P6U7cTTMhxVyROTckc6JKdwCrgnAjZMn0k3177aQxtDEA==", + "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "@types/node": "*" } }, - "node_modules/libp2p": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/libp2p/-/libp2p-1.8.3.tgz", - "integrity": "sha512-IpHKhR/gjiRcm3UqaHC3bEFsnBS62hTwXy60L8Uie8NZvvliVL6skmIBAODfma0+C7zvJhNKA8453SOmTeVTwQ==", - "license": "Apache-2.0 OR MIT", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonld": { + "version": "1.5.15", + "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.15.tgz", + "integrity": "sha512-PlAFPZjL+AuGYmwlqwKEL0IMP8M8RexH0NIPGfCVWSQ041H2rR/8OlyZSD7KsCVoN8vCfWdtWDBxX8yBVP+xow==", + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "license": "MIT", "dependencies": { - "@libp2p/crypto": "^4.1.8", - "@libp2p/interface": "^1.6.3", - "@libp2p/interface-internal": "^1.3.3", - "@libp2p/logger": "^4.0.19", - "@libp2p/multistream-select": "^5.1.16", - "@libp2p/peer-collections": "^5.2.8", - "@libp2p/peer-id": "^4.2.3", - "@libp2p/peer-id-factory": "^4.2.3", - "@libp2p/peer-store": "^10.1.4", - "@libp2p/utils": "^5.4.8", - "@multiformats/dns": "^1.0.6", - "@multiformats/multiaddr": "^12.2.3", - "@multiformats/multiaddr-matcher": "^1.2.1", - "any-signal": "^4.1.1", - "datastore-core": "^9.2.9", - "interface-datastore": "^8.2.11", - "it-merge": "^3.0.5", - "it-parallel": "^3.0.7", - "merge-options": "^3.0.4", - "multiformats": "^13.1.0", - "p-defer": "^4.0.1", - "progress-events": "^1.0.0", - "race-event": "^1.3.0", - "race-signal": "^1.0.2", - "uint8arrays": "^5.1.0" + "@types/ms": "*", + "@types/node": "*" } }, - "node_modules/libp2p/node_modules/@multiformats/multiaddr": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.0.tgz", - "integrity": "sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==", - "license": "Apache-2.0 OR MIT", + "node_modules/@types/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/multicast-dns": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@types/multicast-dns/-/multicast-dns-7.2.4.tgz", + "integrity": "sha512-ib5K4cIDR4Ro5SR3Sx/LROkMDa0BHz0OPaCBL/OSPDsAXEGZ3/KQeS6poBKYVN7BfjXDL9lWNwzyHVgt/wkyCw==", + "license": "MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/interface": "^1.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" + "@types/dns-packet": "*", + "@types/node": "*" } }, - "node_modules/libp2p/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", + "node_modules/@types/node": { + "version": "25.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz", + "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==", + "license": "MIT", "dependencies": { - "multiformats": "^13.0.0" + "undici-types": "~7.16.0" } }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "node_modules/@types/node-cron": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.11.tgz", + "integrity": "sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-path": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz", + "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "@types/node": "*" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, "license": "MIT" }, - "node_modules/listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "node_modules/@types/rdf-dataset-ext": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/rdf-dataset-ext/-/rdf-dataset-ext-1.0.8.tgz", + "integrity": "sha512-ngMGOzAm+yvrfTzFhlmPNa9lfWO72IkdqYRR+HNIPX3x+RPLf6qRpAi8GAZCg0rkpGt2JJqDQF3FgVxE6ykr/w==", "license": "MIT", + "peer": true, "dependencies": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - }, - "engines": { - "node": ">=6" + "@rdfjs/types": ">=1.0.0", + "@types/readable-stream": "*" } }, - "node_modules/listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", + "node_modules/@types/rdfjs__data-model": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@types/rdfjs__data-model/-/rdfjs__data-model-2.0.9.tgz", + "integrity": "sha512-rgQSlM9jr7XMZdC0xUIr0zsxf5FvdB4cxxzv+MlHm6uJGip5qi0q+BluNhakAzaM2I56nKLDqSE3I/XuOaHGnA==", "license": "MIT", - "engines": { - "node": ">=4" + "peer": true, + "dependencies": { + "@rdfjs/types": "*" } }, - "node_modules/listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "node_modules/@types/rdfjs__dataset": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/rdfjs__dataset/-/rdfjs__dataset-2.0.7.tgz", + "integrity": "sha512-+GaYIL9C7N1N0HyH+obU4IXuL7DX+fXuf827aUQ2Vx2UghO47+OTxo2v3seEQj/1YHoHBfQFk5Y4P6Q7Ht4Hqw==", "license": "MIT", + "peer": true, "dependencies": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "listr": "^0.14.2" + "@rdfjs/types": "*" } }, - "node_modules/listr-update-renderer/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "node_modules/@types/rdfjs__environment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/rdfjs__environment/-/rdfjs__environment-1.0.0.tgz", + "integrity": "sha512-MDcnv3qfJvbHoEpUQXj5muT8g3e+xz1D8sGevrq3+Q4TzeEvQf5ijGX5l8485XFYrN/OBApgzXkHMZC04/kd5w==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "peer": true, + "dependencies": { + "@rdfjs/types": "*", + "@types/node": "*" } }, - "node_modules/listr-update-renderer/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "node_modules/@types/rdfjs__fetch-lite": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/rdfjs__fetch-lite/-/rdfjs__fetch-lite-3.0.11.tgz", + "integrity": "sha512-1bHxBn62bmTPq/HY9Jr+iKCdBp8RTEJ4WA0ycihghRF8zWQfw6T7E5CqdPi4nncmgF70LOz7jF/4jeLGdb6H2A==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "peer": true, + "dependencies": { + "@rdfjs/types": "*", + "@types/node": "*", + "@types/rdfjs__formats": "*" } }, - "node_modules/listr-update-renderer/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "node_modules/@types/rdfjs__formats": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/rdfjs__formats/-/rdfjs__formats-4.0.1.tgz", + "integrity": "sha512-Zj7hQEn5HeCj+pJCWshY2gqBcdBdwyc2j20Ht3PH91pkdRuG2AlGDD3N9PQ1oZ3+J6Q96rAlhxUbjQUp9+s3FQ==", "license": "MIT", + "peer": true, "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@rdfjs/types": ">=1.0.0", + "@types/node": "*", + "@types/rdfjs__parser-jsonld": "*", + "@types/rdfjs__parser-n3": "*", + "@types/rdfjs__serializer-jsonld": "*", + "@types/rdfjs__serializer-jsonld-ext": "*", + "@types/rdfjs__serializer-ntriples": "*", + "@types/rdfjs__serializer-turtle": "*", + "@types/rdfjs__sink-map": "*", + "rdfxml-streaming-parser": ">=2" } }, - "node_modules/listr-update-renderer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@types/rdfjs__formats-common": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/rdfjs__formats-common/-/rdfjs__formats-common-3.1.5.tgz", + "integrity": "sha512-Zt74nSd9NemOq90/2cMrBVwnHJIXHFFDS7tkY4Slei1eRoQJpws059Lx9O+mqaFspkD3r81Enu/5CiNfQg9V7g==", "license": "MIT", - "engines": { - "node": ">=0.8.0" + "dependencies": { + "@rdfjs/types": ">=1.0.0", + "@types/node": "*", + "@types/rdfjs__parser-jsonld": "*", + "@types/rdfjs__parser-n3": "*", + "@types/rdfjs__serializer-jsonld": "*", + "@types/rdfjs__serializer-ntriples": "*", + "@types/rdfjs__sink-map": "*", + "rdfxml-streaming-parser": ">=2" } }, - "node_modules/listr-update-renderer/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "node_modules/@types/rdfjs__namespace": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/rdfjs__namespace/-/rdfjs__namespace-2.0.10.tgz", + "integrity": "sha512-xoVzEIOxcpyteEmzaj94MSBbrBFs+vqv05joMhzLEiPRwsBBDnhkdBCaaDxR1Tf7wOW0kB2R1IYe4C3vEBFPgA==", "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@rdfjs/types": "*" } }, - "node_modules/listr-update-renderer/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "node_modules/@types/rdfjs__parser-jsonld": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/rdfjs__parser-jsonld/-/rdfjs__parser-jsonld-2.1.7.tgz", + "integrity": "sha512-n35K+c1Y95580N202Jxly6xjFE953FF+Y2mwxok6zLfMo4rgIfgMBElnNwpja0IeYXTuzGm1tEz7va3lItGrTg==", "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@rdfjs/types": ">=1.0.0", + "@types/jsonld": "*" } }, - "node_modules/listr-update-renderer/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "node_modules/@types/rdfjs__parser-n3": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/rdfjs__parser-n3/-/rdfjs__parser-n3-2.0.6.tgz", + "integrity": "sha512-VHfdq7BDV6iMCtHkzTFSOuUWnqGlMUmEF0UZyK4+g9SzLWvc6TMcU5TYwQPQIz/e0s7dZ+xomxx6mVtIzsRQ/A==", "license": "MIT", - "engines": { - "node": ">=0.8.0" + "dependencies": { + "@rdfjs/types": ">=1.0.0" } }, - "node_modules/listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "node_modules/@types/rdfjs__prefix-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/rdfjs__prefix-map/-/rdfjs__prefix-map-0.1.5.tgz", + "integrity": "sha512-RAwyS/2dT9X79QwM0F8KLweTfuBoe6xtiAlU7wKPB+/t/sfk6A50LYtAWaDVP5qBjcu50UkKkZT+VR47CiLkfg==", "license": "MIT", + "peer": true, "dependencies": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - }, - "engines": { - "node": ">=4" + "@rdfjs/types": "*" } }, - "node_modules/listr-verbose-renderer/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@types/rdfjs__serializer-jsonld": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/rdfjs__serializer-jsonld/-/rdfjs__serializer-jsonld-2.0.5.tgz", + "integrity": "sha512-ubdLD9QgZzAt+65NSPzh2qWCPWcGYlHEWgkP6uRwfm7JC48Xh/QjzwOTG13MTomOkQqcN4R7PIG0j3Ca8iyNWQ==", "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "@rdfjs/types": ">=1.0.0" } }, - "node_modules/listr-verbose-renderer/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@types/rdfjs__serializer-jsonld-ext": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/rdfjs__serializer-jsonld-ext/-/rdfjs__serializer-jsonld-ext-4.0.1.tgz", + "integrity": "sha512-jgbQ/1kV7nESKG7SY8FJED6K4OFznr6Sz3ybF1ncpBR7TUBTuy3InpZOVRK4Wjpy2zi84iIAzJ1CIIo9NZh2Xw==", "license": "MIT", + "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "@rdfjs/types": ">=1.0.0", + "@types/jsonld": "*", + "@types/node": "*" } }, - "node_modules/listr-verbose-renderer/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@types/rdfjs__serializer-ntriples": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/rdfjs__serializer-ntriples/-/rdfjs__serializer-ntriples-2.0.6.tgz", + "integrity": "sha512-Nn3e3eyuymLvbI5MFzI7ODD/X6ZGpbB9fLaWOB00RtFHd2vttk3wQL2fzzsZZQPJ/ihC/xlFE4cNQkO6SoHa7w==", "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@rdfjs/types": ">=1.0.0" } }, - "node_modules/listr-verbose-renderer/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/listr-verbose-renderer/node_modules/date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "license": "MIT" - }, - "node_modules/listr-verbose-renderer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@types/rdfjs__serializer-turtle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/rdfjs__serializer-turtle/-/rdfjs__serializer-turtle-1.1.0.tgz", + "integrity": "sha512-NGHnbz5985UwS/YS6WL/FkS94B+QiVTdsfvJCqPwLmY3E7UeClw91c2KbiphZUR/uh7uwLwxeKKhV2T1gYgT5Q==", "license": "MIT", - "engines": { - "node": ">=0.8.0" + "peer": true, + "dependencies": { + "@rdfjs/types": ">=1.0.0", + "@types/node": "*", + "@types/rdfjs__prefix-map": "*" } }, - "node_modules/listr-verbose-renderer/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "node_modules/@types/rdfjs__sink-map": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/rdfjs__sink-map/-/rdfjs__sink-map-2.0.5.tgz", + "integrity": "sha512-ycUBlOMbp9YpjrBrMwGv3uiqulOWgodess06cinYLxomOTc2ET9rEQklgM5rJqnu5WMsVP8SFG3fFw36/5hADQ==", "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" + "@rdfjs/types": "*" } }, - "node_modules/listr-verbose-renderer/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@types/rdfjs__term-map": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/rdfjs__term-map/-/rdfjs__term-map-2.0.10.tgz", + "integrity": "sha512-YlpYkya+Xq9fmcw+BMi1SCh+w2sBu7G0/qd2+ZhB4QIK3V1xq2o3EOAZnlahyQdwrW9t5+Ihw8IVVvZsJvDOTA==", "license": "MIT", - "engines": { - "node": ">=4" + "peer": true, + "dependencies": { + "@rdfjs/types": "*" } }, - "node_modules/listr-verbose-renderer/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@types/rdfjs__term-set": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@types/rdfjs__term-set/-/rdfjs__term-set-2.0.9.tgz", + "integrity": "sha512-RRXs5DwFGanZyT705f7KLSiN68gUVUtGWTp508CXJhLfD7AWmilqc1BLgLUoac48h3pnh9w5lRhwFm6fj1ZE5Q==", "license": "MIT", + "peer": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "@rdfjs/types": "*" } }, - "node_modules/listr/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "node_modules/@types/rdfjs__traverser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/rdfjs__traverser/-/rdfjs__traverser-0.1.5.tgz", + "integrity": "sha512-tTpiM6lAddw+bGRDjhzwdpo1EQK73m8gYgMVNfO4OsevnuLZvQJeCJBckpuDC4H5HVAEwCapI0UlH9dVnZ9u5g==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "peer": true, + "dependencies": { + "@rdfjs/types": "*" } }, - "node_modules/listr/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "node_modules/@types/readable-stream": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.23.tgz", + "integrity": "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@types/node": "*" } }, - "node_modules/listr/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "license": "Apache-2.0", + "node_modules/@types/secp256k1": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.7.tgz", + "integrity": "sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==", + "license": "MIT", "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" + "@types/node": "*" } }, - "node_modules/listr/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" + "@types/node": "*" } }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, "license": "MIT", "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" } }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/@types/sinon": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.4.tgz", + "integrity": "sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew==", + "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/sinonjs__fake-timers": "*" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "license": "MIT" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "license": "MIT" - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "node_modules/@types/sinonjs__fake-timers": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-15.0.1.tgz", + "integrity": "sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==", "license": "MIT" }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" + "node_modules/@types/ssh2": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", + "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18" + } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "node_modules/@types/ssh2/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, "license": "MIT" }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "node_modules/@types/tar-stream": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-3.1.4.tgz", + "integrity": "sha512-921gW0+g29mCJX0fRvqeHzBlE/XclDaAG0Ousy1LCghsOhvaKacDeRGEVzQP9IPfKn8Vysy7FEXAIxycpc/CMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", "license": "MIT" }, - "node_modules/log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, "license": "MIT", "dependencies": { - "chalk": "^1.0.0" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/log-symbols/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "license": "MIT", + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=0.10.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/log-symbols/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/log-symbols/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "license": "MIT", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "ansi-regex": "^2.0.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=4" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/logform": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", - "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, "license": "MIT", "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">= 12.0.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/logform/node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vocabulary/sh": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@vocabulary/sh/-/sh-1.1.6.tgz", + "integrity": "sha512-8IfAQoKh57THz8LA2+n1jaY/VC2XaqMNSsJgzBKSSrj20y5PSMAawb6dMsxoLxqDIPBDs1TFRl/9CijUnwbBUA==", "license": "MIT", - "engines": { - "node": ">=0.1.90" + "peerDependencies": { + "@rdfjs/types": "^2.0.0" } }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "node_modules/@zazuko/env": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@zazuko/env/-/env-2.5.3.tgz", + "integrity": "sha512-kivvYoXGFjva1CuXeK/jaaWMy9eXhhFmuSfSJGVW2wH7XbcZehJObjPXEVlZ3kKLCFhuv96j8Ot3SkbYaOtuLA==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "@rdfjs/data-model": "^2.0.1", + "@rdfjs/dataset": "^2.0.1", + "@rdfjs/formats": "^4.0.0", + "@rdfjs/namespace": "^2.0.0", + "@rdfjs/term-map": "^2.0.0", + "@rdfjs/term-set": "^2.0.1", + "@rdfjs/traverser": "^0.1.2", + "@tpluscode/rdf-ns-builders": "^4.1.0", + "@zazuko/env-core": "^1.1.2", + "@zazuko/prefixes": "^2.1.0", + "clownface": "^2.0.2", + "get-stream": "^9.0.1", + "rdf-dataset-ext": "^1.1.0" + }, + "peerDependencies": { + "@rdfjs/types": "^2", + "@types/clownface": "^2.0.0", + "@types/rdf-dataset-ext": "^1.0.8", + "@types/rdfjs__data-model": "^2.0.9", + "@types/rdfjs__dataset": "^2.0.7", + "@types/rdfjs__environment": "^1.0.0", + "@types/rdfjs__formats": "^4.0.1", + "@types/rdfjs__namespace": "^2.0.10", + "@types/rdfjs__term-map": "^2.0.10", + "@types/rdfjs__term-set": "^2.0.9", + "@types/rdfjs__traverser": "^0.1.5" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/@zazuko/env-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@zazuko/env-core/-/env-core-1.1.2.tgz", + "integrity": "sha512-mnLG40utuT7jPBPLs6fJ0puhfagnXSj+S8t9+zUGs3YlrOq/7b2zr64Hi3p3etwDdApaQ0VgQuNIY9doaruS1Q==", + "dependencies": { + "@rdfjs/environment": "^1.0.0" + }, + "peerDependencies": { + "@types/rdfjs__environment": "^1.0.0" + } + }, + "node_modules/@zazuko/env-node": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@zazuko/env-node/-/env-node-2.1.5.tgz", + "integrity": "sha512-qYrePSWiz9XOB5R0NfvuaogmPP8gLcMsl18G7sYW1h6RB4l3aiofAr4YAKTK+bpJgGjeivDDi64lsQjF2F6p0g==", "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@rdfjs/fetch-lite": "^3.2.2", + "@rdfjs/formats": "^4.0.0", + "@zazuko/env": "^2.5.3", + "@zazuko/rdf-utils-fs": "^3.3.0" }, - "bin": { - "loose-envify": "cli.js" + "peerDependencies": { + "@types/rdfjs__fetch-lite": "^3.0.11", + "@types/rdfjs__formats": "^4.0.1" } }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "node_modules/@zazuko/prefixes": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@zazuko/prefixes/-/prefixes-2.6.1.tgz", + "integrity": "sha512-fbOadP7twxt0ZYT9mgIC+xQMk6f3pYYLI5a/2UJ/mc/ygqb/NoVv2ryK3lTtoi74xwkdpUeDwIuFQSosowzUgg==", + "license": "MIT" + }, + "node_modules/@zazuko/rdf-utils-fs": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@zazuko/rdf-utils-fs/-/rdf-utils-fs-3.3.1.tgz", + "integrity": "sha512-4HjTbJUwiCFanMMcaaZkLIkWUdVjXSQstAyxnfzsUOmh8Q43iVBL+mYAl17zoi47III0POL6hitRsN1JJ5tUFg==", "license": "MIT", "dependencies": { - "get-func-name": "^2.0.1" + "readable-stream": ">=3.6.0" + }, + "peerDependencies": { + "@rdfjs/types": "*", + "@types/rdfjs__environment": "0 - 1", + "@types/rdfjs__formats": "^4" } }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC", + "optional": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6.5" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", + "node_modules/abort-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/abort-error/-/abort-error-1.0.1.tgz", + "integrity": "sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/abstract-level": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-3.1.1.tgz", + "integrity": "sha512-CW2gKbJFTuX1feMvOrvsVMmijAOgI9kg2Ie9Dq3gOcMt/dVVoVmqNlLcEUCT13NxHFMEajcUcVBIplbyDroDiw==", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "buffer": "^6.0.3", + "is-buffer": "^2.0.5", + "level-supports": "^6.2.0", + "level-transcoder": "^1.0.1", + "maybe-combine-errors": "^1.0.0", + "module-error": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "node_modules/abstract-level/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "es5-ext": "~0.10.2" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "license": "MIT" + "node_modules/abstract-level/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/lzma-purejs-requirejs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lzma-purejs-requirejs/-/lzma-purejs-requirejs-1.0.0.tgz", - "integrity": "sha512-nQgC+oDmBKPdWoC//X51scWTN5D3zdIL7oN+plbKjhZ+u5LAZsF0/yIiYTNtj+TjB1o6mp9R4Ey5DW6elBEu8w==", - "license": "BSD", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { - "amdefine": "~0.1.0", - "commander": "~2.2.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, - "bin": { - "lzmajs": "bin/lzmajs" - } - }, - "node_modules/lzma-purejs-requirejs/node_modules/commander": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.2.0.tgz", - "integrity": "sha512-U6hBkeIsoeE81B+yas9uVF4YYVcVoBCwb1e314VPyvVQubFwvnTAuc1oUQ6VuMPYUS4Rf1gzr0wTVLvs4sb5Pw==", "engines": { - "node": ">= 0.6.x" + "node": ">= 0.6" } }, - "node_modules/macos-release": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.3.0.tgz", - "integrity": "sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==", - "dev": true, + "node_modules/acme-client": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/acme-client/-/acme-client-5.4.0.tgz", + "integrity": "sha512-mORqg60S8iML6XSmVjqjGHJkINrCGLMj2QvDmFzI9vIlv1RGlyjmw3nrzaINJjkNsYXC41XhhD5pfy7CtuGcbA==", "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "dependencies": { + "@peculiar/x509": "^1.11.0", + "asn1js": "^3.0.5", + "axios": "^1.7.2", + "debug": "^4.3.5", + "node-forge": "^1.3.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 16" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, "license": "MIT", - "dependencies": { - "semver": "^6.0.0" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.4.0" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "license": "ISC" - }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "license": "ISC", - "optional": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" }, - "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">= 6" + "node": ">= 14" } }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "license": "MIT", "optional": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "humanize-ms": "^1.2.1" }, "engines": { - "node": ">= 6" + "node": ">= 8.0.0" } }, - "node_modules/make-fetch-happen/node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/amdefine": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.1.tgz", + "integrity": "sha512-cE/769sItEDt5sSdqmrWMsat+XaA5FJiEou+ZwlY7ef/Jf/517k6nYyUIRPR2o/QbpBg4FiYXj9GyRGNg5f/bg==", + "license": "BSD-3-Clause AND MIT", + "engines": { + "node": ">=0.4.2" } }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, "engines": { - "node": ">= 12" + "node": ">=8" } }, - "node_modules/marked-terminal": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", - "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.3.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14.13.1 || >=16.0.0" + "node": ">=8" }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", - "license": "MIT", + "node_modules/any-signal": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-4.2.0.tgz", + "integrity": "sha512-LndMvYuAPf4rC195lk7oSFuHOYFpOszIYrNYv0gHAvz+aEhE9qPZLhmrIz5pXP2BSsPOXvsuHDXEGaiQhIh9wA==", + "license": "Apache-2.0 OR MIT", "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node_modules/apache-arrow": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-21.1.0.tgz", + "integrity": "sha512-kQrYLxhC+NTVVZ4CCzGF6L/uPVOzJmD1T3XgbiUnP7oTeVFOFgEUu6IKNwCDkpFoBVqDKQivlX4RUFqqnWFlEA==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/command-line-args": "^5.2.3", + "@types/command-line-usage": "^5.0.4", + "@types/node": "^24.0.3", + "command-line-args": "^6.0.1", + "command-line-usage": "^7.0.1", + "flatbuffers": "^25.1.24", + "json-bignum": "^0.0.3", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "bin": { + "arrow2csv": "bin/arrow2csv.js" } }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "node_modules/apache-arrow/node_modules/@types/node": { + "version": "24.10.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.10.tgz", + "integrity": "sha512-+0/4J266CBGPUq/ELg7QUHhN25WYjE0wYTPSQJn1xeu8DOlIOPxXxrNGiLmfAWl7HMMgWFWXpt9IDjMWrF5Iow==", "license": "MIT", - "optional": true, "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" + "undici-types": "~7.16.0" } }, - "node_modules/matchit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/matchit/-/matchit-1.1.0.tgz", - "integrity": "sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==", + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, "license": "MIT", "dependencies": { - "@arr/every": "^1.0.0" + "default-require-extensions": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC", + "optional": true }, - "node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", - "license": "MIT", + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, "dependencies": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "optional": true, "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 6" } }, - "node_modules/mdast-util-gfm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=12.17" } }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mdast-util-gfm-footnote": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8" } }, - "node_modules/mdast-util-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" } }, - "node_modules/mdast-util-toc": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-6.1.1.tgz", - "integrity": "sha512-Er21728Kow8hehecK2GZtb7Ny3omcoPUVrmObiSUwmoRYVZaXLR751QROEFjR8W/vAQdHMLj49Lz20J55XaNpw==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/extend": "^3.0.0", - "@types/mdast": "^3.0.0", - "extend": "^3.0.0", - "github-slugger": "^2.0.0", - "mdast-util-to-string": "^3.1.0", - "unist-util-is": "^5.0.0", - "unist-util-visit": "^4.0.0" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "safer-buffer": "~2.1.0" } }, - "node_modules/memoizee": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", - "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", - "license": "ISC", + "node_modules/asn1js": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", + "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", + "license": "BSD-3-Clause", "dependencies": { - "d": "^1.0.2", - "es5-ext": "^0.10.64", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" }, "engines": { - "node": ">=0.12" + "node": ">=12.0.0" } }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "tslib": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "retry": "0.13.1" } }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/auto-changelog": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.5.0.tgz", + "integrity": "sha512-UTnLjT7I9U2U/xkCUH5buDlp8C7g0SGChfib+iDrJkamcj5kaMqNKHNfbKJw1kthJUq8sUo3i3q2S6FzO/l/wA==", + "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "commander": "^7.2.0", + "handlebars": "^4.7.7", + "import-cwd": "^3.0.0", + "node-fetch": "^2.6.1", + "parse-github-url": "^1.0.3", + "semver": "^7.3.5" + }, + "bin": { + "auto-changelog": "src/index.js" }, "engines": { - "node": ">=8" + "node": ">=8.3" } }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "node_modules/aws-sdk": { + "version": "2.1693.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1693.0.tgz", + "integrity": "sha512-cJmb8xEnVLT+R6fBS5sn/EFJiX7tUnDaPtOPZ1vFbOJtd0fnZn/Ky2XGgsvvoeliWeH7mL3TWSX5zXXGSQV6gQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.6.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", "engines": { - "node": ">=10" - } - }, - "node_modules/merge": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", - "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", - "license": "MIT" - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10.0.0" } }, - "node_modules/merge-options": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", - "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "node_modules/axios": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", "license": "MIT", "dependencies": { - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "devOptional": true, "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", "license": "MIT", - "engines": { - "node": ">= 8" + "dependencies": { + "safe-buffer": "^5.0.1" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/base58-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base58-js/-/base58-js-2.0.0.tgz", + "integrity": "sha512-nAV5d32QXuGcGptSApkKpC1gGakWBnfJMNjKrYTBh4tb0szfZF+ooueFLy8T4VrY+o4SrE/TyrtUnRZcwZchaA==", "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/metro-react-native-babel-preset": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz", - "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-assign": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "react-refresh": "^0.4.0" - }, - "peerDependencies": { - "@babel/core": "*" + "node": ">= 8" } }, - "node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "consulting", + "url": "https://feross.org/support" } ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", - "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "license": "MIT" }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", - "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", - "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "node_modules/basic-ftp": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", + "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", + "dev": true, "license": "MIT", - "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", - "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", - "license": "MIT", + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "tweetnacl": "^0.14.3" } }, - "node_modules/micromark-extension-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", - "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "license": "MIT" }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", - "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "license": "MIT", "dependencies": { - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "file-uri-to-path": "1.0.0" } }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", - "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "consulting", + "url": "https://feross.org/support" } ], "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "ms": "2.0.0" } }, - "node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bowser": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", + "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "balanced-match": "^1.0.0" } }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/micromark-util-chunked": { + "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, + "node_modules/browser-level": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-3.0.0.tgz", + "integrity": "sha512-kGXtLh29jMwqKaskz5xeDLtCtN1KBz/DbQSqmvH7QdJiyGRC7RAM8PPg6gvUiNMa+wVnaxS9eSmEtP/f5ajOVw==", "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "abstract-level": "^3.1.0" } }, - "node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "base-x": "^3.0.2" } }, - "node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "license": "MIT", "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, - "node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } }, - "node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "license": "MIT" }, - "node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/buildcheck": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.7.tgz", + "integrity": "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/builtins": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" + "engines": { + "node": ">= 0.8" } }, - "node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/c12": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.3.tgz", + "integrity": "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==", + "dev": true, "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "chokidar": "^5.0.0", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^17.2.3", + "exsolve": "^1.0.8", + "giget": "^2.0.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.0.0", + "pkg-types": "^2.3.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "*" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } } }, - "node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/c12/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, "license": "MIT", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "node_modules/c12/node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "node_modules/c12/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "license": "ISC", + "optional": true, "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" }, "engines": { - "node": ">=8.6" + "node": ">= 10" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "node_modules/cacache/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", - "bin": { - "mime": "cli.js" + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=10.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", + "node_modules/cacache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">= 0.6" + "node": "*" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", + "node_modules/cacache/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, "dependencies": { - "mime-db": "1.52.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/mimic-fn": { + "node_modules/cacache/node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "license": "MIT", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "license": "MIT", + "node_modules/cacache/node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "license": "MIT", + "node_modules/cacache/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "optional": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.4" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node_modules/caniuse-lite": { + "version": "1.0.30001767", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001767.tgz", + "integrity": "sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/canonicalize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.1.0.tgz", + "integrity": "sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==", + "license": "Apache-2.0", + "bin": { + "canonicalize": "bin/canonicalize.js" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "node_modules/cborg": { + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.5.8.tgz", + "integrity": "sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==", + "license": "Apache-2.0", + "bin": { + "cborg": "lib/bin.js" } }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" }, "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" + "node": ">=4" } }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "license": "ISC", - "optional": true, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "license": "ISC", - "optional": true, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "chalk": "^4.1.2" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, - "node_modules/minipass-sized": { + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "license": "ISC", - "optional": true, + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "get-func-name": "^2.0.2" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", "engines": { "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/mocha": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", - "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" }, "engines": { - "node": ">= 14.0.0" + "node": ">= 0.10" } }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "consola": "^3.2.3" } }, - "node_modules/mocha/node_modules/is-fullwidth-code-point": { + "node_modules/classic-level": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-3.0.0.tgz", + "integrity": "sha512-yGy8j8LjPbN0Bh3+ygmyYvrmskVita92pD/zCoalfcC9XxZj6iDtZTAnz+ot7GG8p9KLTG+MZ84tSA4AhkgVZQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "abstract-level": "^3.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "devOptional": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/mocha/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, "engines": { - "node": ">=10" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/mocha/node_modules/string-width": { + "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -22449,19 +9485,7 @@ "node": ">=8" } }, - "node_modules/mocha/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/wrap-ansi": { + "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", @@ -22478,632 +9502,579 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/mock-property": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.1.0.tgz", - "integrity": "sha512-1/JjbLoGwv87xVsutkX0XJc0M0W4kb40cZl/K41xtTViBOD9JuFPKfyMNTrLJ/ivYAd0aPqu/vduamXO0emTFQ==", + "node_modules/clone-regexp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz", + "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==", "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "functions-have-names": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "hasown": "^2.0.2", - "isarray": "^2.0.5", - "object-inspect": "^1.13.2" + "is-regexp": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "node_modules/clownface": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/clownface/-/clownface-2.0.3.tgz", + "integrity": "sha512-E76TBJ7CgU9+/5paSAvuNdMO+fzFThnvRVtidosktYppYkXM8V7tid8Ezzo8S1OmoWxKUam3yfkZlfCid4OiJQ==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@rdfjs/data-model": "^2.0.1", + "@rdfjs/environment": "0 - 1", + "@rdfjs/namespace": "^2.0.0" } }, - "node_modules/module-definition": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-3.4.0.tgz", - "integrity": "sha512-XxJ88R1v458pifaSkPNLUTdSPNVGMP2SXVncVmApGO+gAfrLANiYe6JofymCzVceGOMwQE2xogxBSc8uB7XegA==", + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", "dependencies": { - "ast-module-types": "^3.0.0", - "node-source-walk": "^4.0.0" - }, - "bin": { - "module-definition": "bin/cli.js" + "color-convert": "^3.1.3", + "color-string": "^2.1.3" }, "engines": { - "node": ">=6.0" + "node": ">=18" } }, - "node_modules/module-definition/node_modules/ast-module-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", - "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6.0" + "node": ">=7.0.0" } }, - "node_modules/module-definition/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.0.0" + "color-name": "^2.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=18" } }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", "engines": { - "node": "*" + "node": ">=12.20" } }, - "node_modules/mortice": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/mortice/-/mortice-3.0.4.tgz", - "integrity": "sha512-MUHRCAztSl4v/dAmK8vbYi5u1n9NZtQu4H3FsqS7qgMFQIAFw9lTpHiErd9kJpapqmvEdD1L3dUmiikifAvLsQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "observable-webworkers": "^2.0.1", - "p-queue": "^8.0.1", - "p-timeout": "^6.0.0" + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "optional": true, + "bin": { + "color-support": "bin.js" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=14.6" } }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "node_modules/color/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" + "delayed-stream": "~1.0.0" }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/multiformats": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.2.2.tgz", - "integrity": "sha512-RWI+nyf0q64vyOxL8LbKtjJMki0sogRL/8axvklNtiTM0iFCVtHwME9w6+0P1/v4dQvsIg8A45oT3ka1t/M/+A==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/murmurhash3js-revisited": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", - "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", - "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">= 0.8" } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "license": "ISC" - }, - "node_modules/n3": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/n3/-/n3-1.20.4.tgz", - "integrity": "sha512-tHeX1Q3/+ET38qYMOfErglmr5F2tzb+WCt82sZhCokzSZHe95CkHzyuzCMqcRB8hTpW+zn7HqamGXCWW/xXCHg==", + "node_modules/command-line-args": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.1.tgz", + "integrity": "sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg==", "license": "MIT", "dependencies": { - "buffer": "^6.0.3", - "queue-microtask": "^1.1.2", - "readable-stream": "^4.0.0" + "array-back": "^6.2.2", + "find-replace": "^5.0.2", + "lodash.camelcase": "^4.3.0", + "typical": "^7.2.0" }, "engines": { - "node": ">=12.0" + "node": ">=12.20" + }, + "peerDependencies": { + "@75lb/nature": "latest" + }, + "peerDependenciesMeta": { + "@75lb/nature": { + "optional": true + } } }, - "node_modules/nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", - "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/command-line-usage": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.0", + "typical": "^7.1.1" }, "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "license": "MIT" - }, - "node_modules/native-fetch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", - "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==", - "license": "MIT", - "peerDependencies": { - "undici": "*" + "node": ">=12.20.0" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "license": "MIT" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, "license": "MIT" }, - "node_modules/nested-error-stacks": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", - "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true, "license": "MIT" }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/new-github-release-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", - "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^2.5.1" + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^14.13.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/new-github-release-url/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=12.20" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "license": "ISC" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "license": "MIT" - }, - "node_modules/nise": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", - "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/text-encoding": "^0.7.2", - "just-extend": "^6.2.0", - "path-to-regexp": "^6.2.1" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, "license": "MIT" }, - "node_modules/node-abi": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", - "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, "engines": { - "node": ">=10" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "license": "MIT" - }, - "node_modules/node-cron": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz", - "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==", + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "license": "ISC", + "optional": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { - "uuid": "8.3.2" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.6" } }, - "node_modules/node-cron/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">= 0.6" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", "license": "MIT", "engines": { - "node": ">=10.5.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", - "dependencies": { - "lodash": "^4.17.21" + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": ">= 0.10" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "license": "MIT", + "node_modules/cpu-features": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", + "hasInstallScript": true, "optional": true, "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" + "buildcheck": "~0.0.6", + "nan": "^2.19.0" }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/cpu-features/node_modules/nan": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz", + "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==", + "license": "MIT", + "optional": true + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", "bin": { - "node-gyp": "bin/node-gyp.js" + "crc32": "bin/crc32.njs" }, "engines": { - "node": ">= 10.12.0" + "node": ">=0.8" } }, - "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/node-gyp/node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=6" + "node": ">= 14" } }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "optional": true, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, "license": "MIT", "dependencies": { - "process-on-spawn": "^1.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "license": "MIT" - }, - "node_modules/node-source-walk": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-5.0.2.tgz", - "integrity": "sha512-Y4jr/8SRS5hzEdZ7SGuvZGwfORvNsSsNRwDXx5WisiqzsVfeftDvRgfeqWNgZvWSJbgubTRVRYBzK6UO+ErqjA==", + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.21.4" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nodeify-fetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nodeify-fetch/-/nodeify-fetch-3.1.0.tgz", - "integrity": "sha512-ZV81vM//sEgTgXwVZlOONzcOCdTGQ53mV65FVSNXgPQHa8oCwRLtLbnGxL/1S/Yw90bcXUDKMz00jEnaeazo+A==", - "license": "MIT", + "node_modules/datastore-core": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-11.0.2.tgz", + "integrity": "sha512-0pN4hMcaCWcnUBo5OL/8j14Lt1l/p1v2VvzryRYeJAKRLqnFrzy2FhAQ7y0yTA63ki760ImQHfm2XlZrfIdFpQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "lodash": "^4.17.21", - "node-fetch": "^3.2.10", - "readable-stream": "^4.2.0", - "stream-chunks": "^1.0.0" + "@libp2p/logger": "^6.0.0", + "interface-datastore": "^9.0.0", + "interface-store": "^7.0.0", + "it-drain": "^3.0.9", + "it-filter": "^3.1.3", + "it-map": "^3.1.3", + "it-merge": "^3.0.11", + "it-pipe": "^3.0.1", + "it-sort": "^3.0.8", + "it-take": "^3.0.8" } }, - "node_modules/nodeify-fetch/node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", - "engines": { - "node": ">= 12" + "node_modules/datastore-level": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/datastore-level/-/datastore-level-12.0.2.tgz", + "integrity": "sha512-BMXRvFhDfx7CxlUj7XBAtPt6V2D9CWnKwRGTvZ3KQ4BBTJoXL66UDTxi52rzYLKfd2QppwaO2S+ZhLWhF5PbQQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "datastore-core": "^11.0.0", + "interface-datastore": "^9.0.0", + "interface-store": "^7.0.0", + "it-filter": "^3.1.3", + "it-map": "^3.1.3", + "it-sort": "^3.0.8", + "it-take": "^3.0.8", + "level": "^10.0.0", + "race-signal": "^2.0.0" } }, - "node_modules/nodeify-fetch/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, "license": "MIT", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "@babel/runtime": "^7.21.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=0.11" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "url": "https://opencollective.com/date-fns" } }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "optional": true, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "ms": "^2.1.3" }, "engines": { - "node": ">=6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "license": "BSD-2-Clause", + "node_modules/debug-logfmt": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/debug-logfmt/-/debug-logfmt-1.4.7.tgz", + "integrity": "sha512-NzGmPp2Fru8KerWcg4zfiPCC1rspLUPqfH5Duz/ZF49CqO97odSx7eFjBNiOQzNQYfvpEEPrxNjyA436lITQkQ==", + "license": "MIT", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "@kikobeats/time-span": "~1.0.5", + "null-prototype-object": "~1.2.2", + "pretty-ms": "~7.0.1" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, "engines": { "node": ">=10" }, @@ -23111,2302 +10082,2488 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm": { - "version": "8.19.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", - "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "license": "Artistic-2.0", - "workspaces": [ - "docs", - "smoke-tests", - "workspaces/*" - ], + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.2.1", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.14", - "libnpmfund": "^3.0.5", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "^5.1.0", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" + "type-detect": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/npm-package-json-lint": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-6.4.0.tgz", - "integrity": "sha512-cuXAJJB1Rdqz0UO6w524matlBqDBjcNt7Ru+RDIu4y6RI1gVqiWBnylrK8sPRk81gGBA0X8hJbDXolVOoTc+sA==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", - "dependencies": { - "ajv": "^6.12.6", - "ajv-errors": "^1.0.1", - "chalk": "^4.1.2", - "cosmiconfig": "^8.0.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "ignore": "^5.2.0", - "is-plain-obj": "^3.0.0", - "jsonc-parser": "^3.2.0", - "log-symbols": "^4.1.0", - "meow": "^9.0.0", - "plur": "^4.0.0", - "semver": "^7.3.8", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1", - "type-fest": "^3.2.0", - "validate-npm-package-name": "^5.0.0" - }, - "bin": { - "npmPkgJsonLint": "dist/cli.js" - }, "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" + "node": ">=4.0.0" } }, - "node_modules/npm-package-json-lint/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/npm-package-json-lint/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", - "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-package-json-lint/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-package-json-lint/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "strip-bom": "^4.0.0" }, "engines": { "node": ">=8" - } - }, - "node_modules/npm-package-json-lint/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-package-json-lint/node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "license": "MIT", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-package-json-lint/node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "license": "(MIT OR CC0-1.0)", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-package-json-lint/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-package-json-lint/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/npm-package-json-lint/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-package-json-lint/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/npm-package-json-lint/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT", + "optional": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/npm-package-json-lint/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "license": "(MIT OR CC0-1.0)", + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/npm-package-json-lint/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "path-type": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=6" + } + }, + "node_modules/docker-modem": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz", + "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.1", + "readable-stream": "^3.5.0", + "split-ca": "^1.0.1", + "ssh2": "^1.15.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 8.0" } }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "inBundle": true, + "node_modules/docker-modem/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=0.1.90" + "node": ">= 6" } }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.6.3", - "inBundle": true, - "license": "ISC", + "node_modules/dockerode": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.9.tgz", + "integrity": "sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q==", + "license": "Apache-2.0", "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^5.2.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" + "@balena/dockerignore": "^1.0.2", + "@grpc/grpc-js": "^1.11.1", + "@grpc/proto-loader": "^0.7.13", + "docker-modem": "^5.0.6", + "protobufjs": "^7.3.2", + "tar-fs": "^2.1.4", + "uuid": "^10.0.0" }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/dockerode/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "bin": { - "arborist": "bin/index.js" + "uuid": "dist/bin/uuid" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6.0.0" } }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", - "inBundle": true, - "license": "ISC", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "node_modules/duplex-to": { "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/duplex-to/-/duplex-to-2.0.0.tgz", + "integrity": "sha512-f2nMnk11mwDptEFBTv2mcWHpF4ENAbuQ63yTiSy/99rG4Exsxsf0GJhJYq/AHF2cdMYswSx23LPuoijBflpquQ==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eccrypto": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.6.tgz", + "integrity": "sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==", + "hasInstallScript": true, + "license": "CC0-1.0", "dependencies": { - "ansi-styles": "^4.3.0" + "acorn": "7.1.1", + "elliptic": "6.5.4", + "es6-promise": "4.2.8", + "nan": "2.14.0" + }, + "optionalDependencies": { + "secp256k1": "3.7.1" + } + }, + "node_modules/eccrypto/node_modules/acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.4.0" } }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "2.1.2", - "inBundle": true, - "license": "ISC", + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "safe-buffer": "^5.0.1" } }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/eciesjs": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.17.tgz", + "integrity": "sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w==", + "license": "MIT", "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" + "@ecies/ciphers": "^0.2.5", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.7", + "@noble/hashes": "^1.8.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "bun": ">=1", + "deno": ">=2", + "node": ">=16" } }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, + "node_modules/eciesjs/node_modules/@ecies/ciphers": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.5.tgz", + "integrity": "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==", + "license": "MIT", "engines": { - "node": ">= 10" + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + }, + "peerDependencies": { + "@noble/ciphers": "^1.0.0" } }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "1.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" + "node_modules/eciesjs/node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/eciesjs/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" + "@noble/hashes": "1.8.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - }, + "node_modules/eciesjs/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "inBundle": true, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "license": "MIT", "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { + "node_modules/encodeurl": { "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "iconv-lite": "^0.6.2" } }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, "dependencies": { - "infer-owner": "^1.0.4" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC", + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", "dependencies": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" - }, + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "optional": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.2.1", - "inBundle": true, - "license": "ISC", + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", + "license": "MIT" + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "inBundle": true, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "inBundle": true, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "inBundle": true, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "inBundle": true, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "es-errors": "^1.3.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "inBundle": true, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, "license": "MIT" }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "license": "MIT" }, - "node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "inBundle": true, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "inBundle": true, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "license": "MIT", - "dependencies": { - "semver": "^7.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/cacache": { - "version": "16.1.3", - "inBundle": true, - "license": "ISC", + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "inBundle": true, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" + "url": "https://opencollective.com/eslint" } }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/eslint-config-oceanprotocol": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-oceanprotocol/-/eslint-config-oceanprotocol-2.0.4.tgz", + "integrity": "sha512-VdCtlvjTHzlhErmy8BYCGj3r4/iSJDxseeQTISe5DSyrWaPJpMv728KxBvu+WsCWfuI2WzErAX1HDE/HjmcI6w==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" + "eslint": "^8.23.1", + "eslint-config-prettier": "^8.5.0", + "eslint-config-standard": "^17.0.0", + "eslint-config-standard-react": "^11.0.1", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.3.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-promise": "^6.0.1", + "eslint-plugin-react": "^7.31.8", + "eslint-plugin-security": "^1.5.0" } }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "inBundle": true, + "node_modules/eslint-config-oceanprotocol/node_modules/eslint-config-prettier": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz", + "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "inBundle": true, + "node_modules/eslint-config-oceanprotocol/node_modules/eslint-plugin-prettier": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.5.tgz", + "integrity": "sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==", + "dev": true, "license": "MIT", "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "prettier-linter-helpers": "^1.0.0" }, "engines": { - "node": ">= 10" + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "inBundle": true, + "node_modules/eslint-config-prettier": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", + "dev": true, "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "engines": { - "node": ">=0.8" + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" } }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node_modules/eslint-config-standard-react": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard-react/-/eslint-config-standard-react-11.0.1.tgz", + "integrity": "sha512-4WlBynOqBZJRaX81CBcIGDHqUiqxvw4j/DbEIICz8QkMs3xEncoPgAoysiqCSsg71X92uhaBc8sgqB96smaMmg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peerDependencies": { + "eslint": "^7.12.1", + "eslint-plugin-react": "^7.21.5" } }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "inBundle": true, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "license": "MIT", "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" + "ms": "^2.1.1" } }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "inBundle": true, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "debug": "^3.2.7" }, "engines": { - "node": ">=6.0" + "node": ">=4" }, "peerDependenciesMeta": { - "supports-color": { + "eslint": { "optional": true } } }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "inBundle": true, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "license": "MIT", "dependencies": { - "clone": "^1.0.2" + "ms": "^2.1.1" } }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "inBundle": true, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC", "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "inBundle": true, - "license": "BSD-3-Clause", + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", + "eslint-visitor-keys": "^1.1.0" + }, "engines": { "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/glob": { - "version": "8.0.3", - "inBundle": true, - "license": "ISC", + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">=12" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "inBundle": true, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "inBundle": true, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "5.2.1", - "inBundle": true, - "license": "ISC", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "lru-cache": "^7.5.1" + "esutils": "^2.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 6" + "node": "*" } }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "inBundle": true, + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "inBundle": true, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "optional": true, + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "license": "MIT", "dependencies": { - "minimatch": "^5.0.1" + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" } }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, + "node_modules/eslint-plugin-node/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.19" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "inBundle": true, + "node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "inBundle": true, - "license": "ISC", + "node_modules/eslint-plugin-node/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", - "inBundle": true, + "node_modules/eslint-plugin-node/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "inBundle": true, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "inBundle": true, - "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "^3.1.1" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" }, "engines": { - "node": ">=10" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" + "node_modules/eslint-plugin-promise": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "5.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.4.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.5", - "inBundle": true, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.14", - "inBundle": true, - "license": "ISC", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.5", - "inBundle": true, - "license": "ISC", + "node_modules/eslint-plugin-security": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", + "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@npmcli/arborist": "^5.6.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "safe-regex": "^2.1.1" } }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "license": "MIT", "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", "dependencies": { - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.4", - "inBundle": true, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.7", - "inBundle": true, - "license": "ISC", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", - "inBundle": true, - "license": "ISC", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", - "inBundle": true, - "license": "ISC", + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10" } }, - "node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", - "inBundle": true, - "license": "ISC", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "brace-expansion": "^2.0.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": ">=4.0" } }, - "node_modules/npm/node_modules/minipass": { - "version": "3.3.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", - "inBundle": true, + "node_modules/eta": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-4.5.0.tgz", + "integrity": "sha512-qifAYjuW5AM1eEEIsFnOwB+TGqu6ynU3OKj9WbUTOtUBHFPZqL03XUW34kbp3zm19Ald+U8dEyRXaVsUck+Y1g==", + "dev": true, "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=20" }, - "optionalDependencies": { - "encoding": "^0.1.13" + "funding": { + "url": "https://github.com/bgub/eta?sponsor=1" } }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">= 0.6" } }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, + "node_modules/eth-crypto": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eth-crypto/-/eth-crypto-2.8.0.tgz", + "integrity": "sha512-QtVmfLZK+N0k4+RA65ORbVCBM2ndzPM0Q/VFhkYYrGY16+4OAwuxG+eyFlWyDO3HBFMlPnMLa69OZCKOoQkcdQ==", "license": "MIT", "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" + "@babel/runtime": "7.27.0", + "@ethereumjs/tx": "3.5.2", + "@types/bn.js": "5.1.6", + "eccrypto": "1.1.6", + "ethereumjs-util": "7.1.5", + "ethers": "5.8.0", + "secp256k1": "5.0.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/pubkey" } }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", + "node_modules/eth-crypto/node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "regenerator-runtime": "^0.14.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "inBundle": true, + "node_modules/eth-crypto/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" } }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "inBundle": true, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "license": "MPL-2.0", "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">=10" + "node": ">=10.0.0" } }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, + "node_modules/ethereumjs-util/node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", "license": "MIT" }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", - "inBundle": true, + "node_modules/ethers": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", + "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": ">=14.0.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, + "node_modules/ethers/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", "engines": { - "node": "*" + "node": ">= 16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "undici-types": "~6.19.2" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" + "node_modules/ethers/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" }, - "bin": { - "nopt": "bin/nopt.js" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/npm/node_modules/nopt": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.4.x" } }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.1", - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "license": "MIT", "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^2.0.0" - }, + "node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", "dependencies": { - "semver": "^7.1.1" + "mimic-fn": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", - "inBundle": true, - "license": "ISC", + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/express/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.6" } }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "ms": "2.0.0" } }, - "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { + "node_modules/express/node_modules/ms": { "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/npm/node_modules/npm-profile": { - "version": "6.2.1", - "inBundle": true, - "license": "ISC", + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", "dependencies": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8.6.0" } }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.3.1", - "inBundle": true, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "license": "ISC", "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "inBundle": true, - "license": "BSD-2-Clause" + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" }, - "node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.4.tgz", + "integrity": "sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" + "strnum": "^2.1.0" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "inBundle": true, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, "license": "ISC", "dependencies": { - "wrappy": "1" + "reusify": "^1.0.4" } }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "inBundle": true, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.20 || >= 14.13" } }, - "node_modules/npm/node_modules/pacote": { - "version": "13.6.2", - "inBundle": true, - "license": "ISC", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" + "flat-cache": "^3.0.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "license": "MIT", "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "moment": "^2.29.1" } }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "inBundle": true, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "inBundle": true, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" + "node_modules/find-replace": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz", + "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@75lb/nature": "latest" + }, + "peerDependenciesMeta": { + "@75lb/nature": { + "optional": true + } + } }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "license": "MIT", "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" + "flat": "cli.js" } }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", "dependencies": { - "mute-stream": "~0.0.4" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=0.8" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/flatbuffers": { + "version": "25.9.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", + "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", + "license": "Apache-2.0" + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/npm/node_modules/read-package-json": { - "version": "5.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" + "is-callable": "^1.2.7" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "inBundle": true, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "fetch-blob": "^3.1.2" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=12.20.0" } }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/freeport-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/freeport-promise/-/freeport-promise-2.0.0.tgz", + "integrity": "sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==", + "license": "Apache-2.0 OR MIT", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { - "node": "*" + "node": ">= 0.6" } }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, "funding": [ { "type": "github", @@ -25421,136 +12578,153 @@ "url": "https://feross.org/support" } ], - "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.7", - "inBundle": true, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "inBundle": true, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true, "license": "ISC" }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.0", - "inBundle": true, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "inBundle": true, + "node_modules/function-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz", + "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==", "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "inBundle": true, - "license": "CC0-1.0" + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/npm/node_modules/ssri": { - "version": "9.0.1", - "inBundle": true, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "license": "ISC", + "optional": true, "dependencies": { - "minipass": "^3.1.1" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "optional": true + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC", + "optional": true }, - "node_modules/npm/node_modules/string-width": { + "node_modules/gauge/node_modules/string-width": { "version": "4.2.3", - "inBundle": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "optional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -25560,476 +12734,412 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "inBundle": true, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", - "inBundle": true, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, "engines": { - "node": ">= 10" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/unique-filename": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/npm/node_modules/unique-slug": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, + "node_modules/get-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-2.0.1.tgz", + "integrity": "sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg==", "license": "MIT" }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8.0.0" } }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { + "node_modules/get-proto": { "version": "1.0.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "node_modules/get-tsconfig": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.1.tgz", + "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "license": "ISC", "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" + "resolve-pkg-maps": "^1.0.0" }, - "bin": { - "nyc": "bin/nyc.js" + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" }, "engines": { - "node": ">=8.9" + "node": ">= 14" } }, - "node_modules/nyc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" } }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "license": "ISC", + "node_modules/git-up": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", + "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "is-ssh": "^1.4.0", + "parse-url": "^9.2.0" } }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/git-url-parse": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", + "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", + "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "git-up": "^8.1.0" } }, - "node_modules/nyc/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/nyc/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", "dependencies": { - "p-locate": "^4.1.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, - "node_modules/nyc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nyc/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "devOptional": true, "license": "ISC" }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, "license": "MIT", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": ">=6" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" + "dunder-proto": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -26038,25 +13148,25 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -26065,2041 +13175,2029 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC", + "optional": true + }, + "node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.8" } }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "node_modules/hash-base/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "node_modules/hash-base/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" + "safe-buffer": "~5.1.0" } }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "node_modules/hash-base/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/observable-webworkers": { + "node_modules/hasha/node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/observable-webworkers/-/observable-webworkers-2.0.1.tgz", - "integrity": "sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==", - "license": "Apache-2.0 OR MIT", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/hashlru": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", + "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==", + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" } }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "license": "MIT", "dependencies": { - "fn.name": "1.x.x" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/http-link-header": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz", + "integrity": "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 14" } }, - "node_modules/ora": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", - "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "license": "MIT", "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=16.17.0" } }, - "node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node_modules/humanhash": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/humanhash/-/humanhash-1.0.4.tgz", + "integrity": "sha512-fxOhEl/Ezv7PobYOTomDmQKWaSC0hk0mzl5et5McPtr+6LRBP7LYoeFLPjKW6xOSGmMNLj50BufrrgX+M5EvEA==", + "license": "Unlicense", + "dependencies": { + "uuid": "^3.3.2" } }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "node_modules/humanhash/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "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.", "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/ora/node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "license": "MIT", + "optional": true, "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "ms": "^2.0.0" } }, - "node_modules/ora/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/hyperdiff": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/hyperdiff/-/hyperdiff-2.0.23.tgz", + "integrity": "sha512-C6MU5mCx0wHqcOG5tB0hH1XMEYj00/TlhTYROigua6bY3+qhDuNIxBfJAtuMTKygjX0Q/eexyLH8HcYo9qXF8g==", "license": "MIT", + "dependencies": { + "debug-logfmt": "~1.4.0", + "lodash": "~4.17.21" + }, "engines": { - "node": ">=6" + "node": ">= 8" } }, - "node_modules/ora/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "import-from": "^3.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, - "node_modules/os-name": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", - "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { - "macos-release": "^3.1.0", - "windows-release": "^5.0.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "node_modules/import-from/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/p-defer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", - "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "devOptional": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.19" } }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-event": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", - "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", - "license": "MIT", + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "license": "ISC", + "optional": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "devOptional": true, + "license": "ISC", "dependencies": { - "p-timeout": "^6.1.2" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.11.1.tgz", + "integrity": "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==", + "dev": true, "license": "MIT", "dependencies": { - "p-map": "^2.0.0" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/prompts": "^7.10.1", + "@inquirer/type": "^3.0.10", + "mute-stream": "^2.0.0", + "run-async": "^4.0.6", + "rxjs": "^7.8.2" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/p-filter/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "license": "MIT", - "engines": { - "node": ">=6" + "node_modules/interface-datastore": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-9.0.2.tgz", + "integrity": "sha512-jebn+GV/5LTDDoyicNIB4D9O0QszpPqT09Z/MpEWvf3RekjVKpXJCDguM5Au2fwIFxFDAQMZe5bSla0jMamCNg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "interface-store": "^7.0.0", + "uint8arrays": "^5.1.0" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "engines": { - "node": ">=4" + "node_modules/interface-datastore/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" } }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "node_modules/interface-store": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-7.0.1.tgz", + "integrity": "sha512-OPRRUO3Cs6Jr/t98BrJLQp1jUTPgrRH0PqFfuNoPAqd+J7ABN1tjFVjQdaOBiybYJTS/AyBSZnZVWLPvp3dW3w==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "devOptional": true, "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 12" } }, - "node_modules/p-locate": { + "node_modules/ip-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", + "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "node_modules/ipaddr.js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", "license": "MIT", - "dependencies": { - "aggregate-error": "^4.0.0" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/p-map/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", "license": "MIT", "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-map/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "5.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-map/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-queue": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", - "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, "license": "MIT", "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" + "has-bigints": "^1.0.2" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-retry": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-5.1.2.tgz", - "integrity": "sha512-couX95waDu98NfNZV+i/iLt+fdVxmI7CbrrdC2uDWfPdUAApyxT4wmDlyOtR5KtTDmkDO0zDScDjDou9YHhd9g==", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, "license": "MIT", "dependencies": { - "@types/retry": "0.12.1", - "retry": "^0.13.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-tap": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-tap/-/p-tap-3.1.0.tgz", - "integrity": "sha512-xJSaeByOOQu5GnHEcnrxMkNi8O3Ez5X1wz8RT6wiL3mJFd4oXcSOvcKq+1CFUtuVYTSTWL/8rlkaCJRoR+L+NA==", + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-wait-for": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-5.0.2.tgz", - "integrity": "sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, "license": "MIT", "dependencies": { - "p-timeout": "^6.0.0" + "hasown": "^2.0.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pac-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", - "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.5", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.4" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">= 14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.4" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">= 14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "node_modules/is-electron": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", + "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, "engines": { - "node": ">= 14" + "node": ">=0.10.0" } }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" + "call-bound": "^1.0.3" }, "engines": { - "node": ">= 14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "license": "MIT", "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/package-json/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { - "defer-to-connect": "^2.0.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=14.16" - } - }, - "node_modules/package-json/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "license": "MIT", - "engines": { - "node": ">=14.16" + "node": ">=0.10.0" } }, - "node_modules/package-json/node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" }, "engines": { "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json/node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "node_modules/is-ip": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", + "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", "license": "MIT", "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "ip-regex": "^5.0.0", + "super-regex": "^0.2.0" }, "engines": { "node": ">=14.16" }, "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json/node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } + "optional": true }, - "node_modules/package-json/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "node_modules/is-loopback-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-loopback-addr/-/is-loopback-addr-2.0.2.tgz", + "integrity": "sha512-26POf2KRCno/KTNL5Q0b/9TYnL00xEsSaLfiFRmjM7m7Lw7ZMmFybzzuX4CcsLAluZGd+niLUiMRxEooVE3aqg==", + "license": "MIT" + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/package-json/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/package-json/node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=0.12.0" } }, - "node_modules/package-json/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, "license": "MIT", "dependencies": { - "lowercase-keys": "^3.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/parse-github-url": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.3.tgz", - "integrity": "sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==", - "dev": true, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "license": "MIT", - "bin": { - "parse-github-url": "cli.js" - }, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", - "dependencies": { - "protocols": "^2.0.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", + "call-bound": "^1.0.3" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pascalcase": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-2.0.0.tgz", - "integrity": "sha512-DHpENy5Qm/FaX+x3iBLoMLG/XHNCTgL+yErm1TwuVaj6u4fiOSkYkf60vGtITk7hrKHOO4uCl9vRrD4hqjNKjg==", + "node_modules/is-ssh": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "dev": true, "license": "MIT", "dependencies": { - "camelcase": "^6.2.1" - }, - "engines": { - "node": ">=14" + "protocols": "^2.0.1" } }, - "node_modules/pascalcase/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, "license": "MIT", "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "bin": { - "patch-package": "index.js" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=10", - "npm": ">5" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/patch-package/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/patch-package/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "license": "MIT", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "which-typed-array": "^1.1.16" }, "engines": { - "node": ">=4.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/patch-package/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/patch-package/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "call-bound": "^1.0.3" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/patch-package/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/patch-package/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/patch-package/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "is-inside-container": "^1.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/patch-package/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, - "node_modules/patch-package/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/issue-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", + "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" }, "engines": { - "node": ">=0.10.0" + "node": "^18.17 || >=20.6.1" } }, - "node_modules/patch-package/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "license": "MIT", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/patch-package/node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "license": "MIT", + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/patch-package/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "isexe": "^2.0.0" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=10" } }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", - "license": "MIT", + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "license": "ISC", "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "license": "MIT" - }, - "node_modules/path-type": { + "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" - }, - "node_modules/path/node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "license": "MIT", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "license": "MIT", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "license": "MIT", + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/pico-signals": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pico-signals/-/pico-signals-1.0.0.tgz", - "integrity": "sha512-Av5eg3cMtXbQVxVoIpP+dzHMBisRZuZy3htFWyaGGScT94AdfeT0On/QVhFNQhIMiY7aLi21W4pD+5KdWbEBUw==", - "license": "MIT" + "node_modules/it-all": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.9.tgz", + "integrity": "sha512-fz1oJJ36ciGnu2LntAlE6SA97bFZpW7Rnt0uEc1yazzR2nKokZLr8lIRtgnpex4NsmaBcvHF+Z9krljWFy/mmg==", + "license": "Apache-2.0 OR MIT" }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "license": "ISC" + "node_modules/it-drain": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-3.0.10.tgz", + "integrity": "sha512-0w/bXzudlyKIyD1+rl0xUKTI7k4cshcS43LTlBiGFxI8K1eyLydNPxGcsVLsFVtKh1/ieS8AnVWt6KwmozxyEA==", + "license": "Apache-2.0 OR MIT" }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node_modules/it-filter": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.1.4.tgz", + "integrity": "sha512-80kWEKgiFEa4fEYD3mwf2uygo1dTQ5Y5midKtL89iXyjinruA/sNXl6iFkTcdNedydjvIsFhWLiqRPQP4fAwWQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-peekable": "^3.0.0" } }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "license": "MIT", - "engines": { - "node": ">=4" + "node_modules/it-foreach": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/it-foreach/-/it-foreach-2.1.5.tgz", + "integrity": "sha512-9tIp+NFVODmGV/49JUKVxW3+8RrPkYrmUaXUM4W6lMC5POM/1gegckNjBmDe5xgBa7+RE9HKBmRTAdY5V+bWSQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-peekable": "^3.0.0" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "node_modules/it-length": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/it-length/-/it-length-3.0.9.tgz", + "integrity": "sha512-cPhRPzyulYqyL7x4sX4MOjG/xu3vvEIFAhJ1aCrtrnbfxloCOtejOONib5oC3Bz8tLL6b6ke6+YHu4Bm6HCG7A==", + "license": "Apache-2.0 OR MIT" }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "license": "MIT", + "node_modules/it-length-prefixed": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-10.0.1.tgz", + "integrity": "sha512-BhyluvGps26u9a7eQIpOI1YN7mFgi8lFwmiPi07whewbBARKAG9LE09Odc8s1Wtbt2MB6rNUrl7j9vvfXTJwdQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "pinkie": "^2.0.0" + "it-reader": "^6.0.1", + "it-stream-types": "^2.0.1", + "uint8-varint": "^2.0.1", + "uint8arraylist": "^2.0.0", + "uint8arrays": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "license": "MIT", + "node_modules/it-length-prefixed/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" + "multiformats": "^13.0.0" } }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "license": "MIT", + "node_modules/it-map": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.1.4.tgz", + "integrity": "sha512-QB9PYQdE9fUfpVFYfSxBIyvKynUCgblb143c+ktTK6ZuKSKkp7iH58uYFzagqcJ5HcqIfn1xbfaralHWam+3fg==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" + "it-peekable": "^3.0.0" } }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "license": "MIT", + "node_modules/it-merge": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.12.tgz", + "integrity": "sha512-nnnFSUxKlkZVZD7c0jYw6rDxCcAQYcMsFj27thf7KkDhpj0EA0g9KHPxbFzHuDoc6US2EPS/MtplkNj8sbCx4Q==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" + "it-queueless-pushable": "^2.0.0" } }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "license": "MIT", + "node_modules/it-parallel": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.13.tgz", + "integrity": "sha512-85PPJ/O8q97Vj9wmDTSBBXEkattwfQGruXitIzrh0RLPso6RHfiVqkuTqBNufYYtB1x6PSkh0cwvjmMIkFEPHA==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" + "p-defer": "^4.0.1" } }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "license": "MIT", + "node_modules/it-peekable": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.8.tgz", + "integrity": "sha512-7IDBQKSp/dtBxXV3Fj0v3qM1jftJ9y9XrWLRIuU1X6RdKqWiN60syNwP0fiDxZD97b8SYM58dD3uklIk1TTQAw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-pipe": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", + "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "p-limit": "^1.1.0" + "it-merge": "^3.0.0", + "it-pushable": "^3.1.2", + "it-stream-types": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "license": "MIT", - "engines": { - "node": ">=4" + "node_modules/it-pushable": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", + "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "p-defer": "^4.0.0" } }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" + "node_modules/it-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/it-queue/-/it-queue-1.1.1.tgz", + "integrity": "sha512-yeYCV22WF1QDyb3ylw+g3TGEdkmnoHUH2mc12QoGOQuxW4XP1V7Zd3BfsEF1iq2IFBwIK7wCPUcRLTAQVeZ3SQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "abort-error": "^1.0.1", + "it-pushable": "^3.2.3", + "main-event": "^1.0.0", + "race-event": "^1.3.0", + "race-signal": "^2.0.0" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", + "node_modules/it-queueless-pushable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/it-queueless-pushable/-/it-queueless-pushable-2.0.3.tgz", + "integrity": "sha512-USa5EzTvmQswOcVE7+o6qsj2o2G+6KHCxSogPOs23sGYkDWFidhqVO7dAvv6ve/Z+Q+nvxpEa9rrRo6VEK7w4Q==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" + "abort-error": "^1.0.1", + "p-defer": "^4.0.1", + "race-signal": "^2.0.0" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", + "node_modules/it-reader": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.4.tgz", + "integrity": "sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "it-stream-types": "^2.0.1", + "uint8arraylist": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", + "node_modules/it-sort": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/it-sort/-/it-sort-3.0.9.tgz", + "integrity": "sha512-jsM6alGaPiQbcAJdzMsuMh00uJcI+kD9TBoScB8TR75zUFOmHvhSsPi+Dmh2zfVkcoca+14EbfeIZZXTUGH63w==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "it-all": "^3.0.0" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/it-stream-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", + "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-take": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/it-take/-/it-take-3.0.9.tgz", + "integrity": "sha512-XMeUbnjOcgrhFXPUqa7H0VIjYSV/BvyxxjCp76QHVAFDJw2LmR1SHxUFiqyGeobgzJr7P2ZwSRRJQGn4D2BVlA==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-to-browser-readablestream": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/it-to-browser-readablestream/-/it-to-browser-readablestream-2.0.12.tgz", + "integrity": "sha512-9pcVGxY8jrfMUgCqPrxjVN0bl6fQXCK1NEbUq5Bi+APlr3q0s2AsQINBPcWYgJbMnSHAfoRDthsi4GHqtkvHgw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "get-iterator": "^2.0.1" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">= 0.6.0" } }, - "node_modules/pkg-up": { + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, + "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-4.0.0.tgz", - "integrity": "sha512-N4zdA4sfOe6yCv+ulPCmpnIBQ5I60xfhDr1otdBBhKte9QtEf3bhfrfkW7dTb+IQ0iEx4ZDzas0kc1o5rdWpYg==", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, "license": "MIT", "dependencies": { - "find-up": "^6.2.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/json-bignum": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", + "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "license": "MIT", + "node_modules/jsonld": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-9.0.0.tgz", + "integrity": "sha512-pjMIdkXfC1T2wrX9B9i2uXhGdyCmgec3qgMht+TDj+S0qX3bjWMQUfL7NeqEhuRTi8G5ESzmL9uGlST7nzSEWg==", + "license": "BSD-3-Clause", "dependencies": { - "yocto-queue": "^1.0.0" + "@digitalbazaar/http-client": "^4.2.0", + "canonicalize": "^2.1.0", + "lru-cache": "^6.0.0", + "rdf-canonize": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/jsonld-context-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonld-context-parser/-/jsonld-context-parser-3.1.0.tgz", + "integrity": "sha512-BfgNJ/t9jjK7Lun9XRCJM6YeNqDk8B6/lg+KS8rzhXAOtS0FvoClSmtLvF24V1M2CDYRy2LcEBt0ilxqSX93WA==", "license": "MIT", "dependencies": { - "p-limit": "^4.0.0" + "@types/http-link-header": "^1.0.1", + "@types/node": "^18.0.0", + "http-link-header": "^1.0.2", + "relative-to-absolute-iri": "^1.0.5" }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "bin": { + "jsonld-context-parse": "bin/jsonld-context-parse.js" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "type": "individual", + "url": "https://github.com/sponsors/rubensworks/" } }, - "node_modules/pkg-up/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "node_modules/jsonld-context-parser/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/playwright-core": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.33.0.tgz", - "integrity": "sha512-aizyPE1Cj62vAECdph1iaMILpT0WUDCq3E6rW6I+dleSbBoGbktvJtzS6VHkZ4DKNEOG9qJpiom/ZxO+S15LAw==", - "license": "Apache-2.0", - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } + "node_modules/jsonld-context-parser/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" }, - "node_modules/playwright-test": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/playwright-test/-/playwright-test-8.4.0.tgz", - "integrity": "sha512-rRhdetA58SE/iplR3404mkYV0uqJaPF8QRcYO2RM2Tyd756D+SYbQwu+nEJiBILi4AiPTCBHZYS+10WOenPhJQ==", + "node_modules/jsonld-streaming-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonld-streaming-parser/-/jsonld-streaming-parser-5.0.1.tgz", + "integrity": "sha512-Rf230DRAWe5p1H4e7phk1vo4FHEMOmC5xVcIywKJBBcwy6zaJWFcAvPcwngufNTdJs7dpTMbKQDjp4TYDpMKUQ==", "license": "MIT", "dependencies": { + "@bergos/jsonparse": "^1.4.0", + "@types/http-link-header": "^1.0.1", + "@types/readable-stream": "^4.0.0", "buffer": "^6.0.3", - "camelcase": "^7.0.1", - "chokidar": "^3.5.3", - "cpy": "^9.0.1", - "esbuild": "0.17.18", - "events": "^3.3.0", - "globby": "^13.1.4", - "kleur": "^4.1.5", - "lilconfig": "^2.1.0", - "lodash": "^4.17.21", - "merge-options": "^3.0.4", - "nanoid": "^4.0.2", - "ora": "^6.3.0", - "p-wait-for": "5.0.2", - "path-browserify": "^1.0.1", - "playwright-core": "1.33.0", - "polka": "^0.5.2", - "premove": "^4.0.0", - "process": "^0.11.10", - "sade": "^1.8.1", - "sirv": "^2.0.3", - "source-map": "0.6.1", - "stream-browserify": "^3.0.0", - "strip-ansi": "^7.0.1", - "tape": "^5.6.3", - "tempy": "^3.0.0", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.1.0" - }, - "bin": { - "playwright-test": "cli.js", - "pw-test": "cli.js" + "canonicalize": "^1.0.1", + "http-link-header": "^1.0.2", + "jsonld-context-parser": "^3.1.0", + "rdf-data-factory": "^2.0.0", + "readable-stream": "^4.0.0" }, - "engines": { - "node": ">=16.0.0" + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/rubensworks/" } }, - "node_modules/playwright-test/node_modules/@esbuild/win32-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", - "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", - "cpu": [ - "x64" + "node_modules/jsonld-streaming-parser/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ], "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/playwright-test/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } + "node_modules/jsonld-streaming-parser/node_modules/canonicalize": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", + "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", + "license": "Apache-2.0" }, - "node_modules/playwright-test/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/jsonld-streaming-parser/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/playwright-test/node_modules/esbuild": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", - "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", - "hasInstallScript": true, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.18", - "@esbuild/android-arm64": "0.17.18", - "@esbuild/android-x64": "0.17.18", - "@esbuild/darwin-arm64": "0.17.18", - "@esbuild/darwin-x64": "0.17.18", - "@esbuild/freebsd-arm64": "0.17.18", - "@esbuild/freebsd-x64": "0.17.18", - "@esbuild/linux-arm": "0.17.18", - "@esbuild/linux-arm64": "0.17.18", - "@esbuild/linux-ia32": "0.17.18", - "@esbuild/linux-loong64": "0.17.18", - "@esbuild/linux-mips64el": "0.17.18", - "@esbuild/linux-ppc64": "0.17.18", - "@esbuild/linux-riscv64": "0.17.18", - "@esbuild/linux-s390x": "0.17.18", - "@esbuild/linux-x64": "0.17.18", - "@esbuild/netbsd-x64": "0.17.18", - "@esbuild/openbsd-x64": "0.17.18", - "@esbuild/sunos-x64": "0.17.18", - "@esbuild/win32-arm64": "0.17.18", - "@esbuild/win32-ia32": "0.17.18", - "@esbuild/win32-x64": "0.17.18" - } - }, - "node_modules/playwright-test/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", "engines": { - "node": ">=0.8.x" + "node": ">=12", + "npm": ">=6" } }, - "node_modules/playwright-test/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, "license": "MIT", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/playwright-test/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "node_modules/playwright-test/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/playwright-test/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "hasInstallScript": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=10.0.0" } }, - "node_modules/playwright-test/node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "node_modules/keccak/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=14.16" + "node": ">= 6" } }, - "node_modules/playwright-test/node_modules/tempy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", - "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "license": "MIT", "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^3.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "json-buffer": "3.0.1" } }, - "node_modules/playwright-test/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/ky": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz", + "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==", + "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "node_modules/plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "node_modules/level": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-10.0.0.tgz", + "integrity": "sha512-aZJvdfRr/f0VBbSRF5C81FHON47ZsC2TkGxbBezXpGGXAUEL/s6+GP73nnhAYRSCIqUNsmJjfeOF4lzRDKbUig==", "license": "MIT", "dependencies": { - "irregular-plurals": "^3.2.0" + "abstract-level": "^3.1.0", + "browser-level": "^3.0.0", + "classic-level": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/level" } }, - "node_modules/polka": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/polka/-/polka-0.5.2.tgz", - "integrity": "sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==", + "node_modules/level-supports": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-6.2.0.tgz", + "integrity": "sha512-QNxVXP0IRnBmMsJIh+sb2kwNCYcKciQZJEt+L1hPCHrKNELllXhvrlClVHXBYZVT+a7aTSM6StgNXdAldoab3w==", "license": "MIT", - "dependencies": { - "@polka/url": "^0.5.0", - "trouter": "^2.0.1" - } - }, - "node_modules/pony-cause": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", - "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", - "license": "0BSD", "engines": { - "node": ">=12.0.0" + "node": ">=16" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "node_modules/level-transcoder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "license": "MIT", - "dependencies": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=6.14.4" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "node_modules/level-transcoder/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } + "license": "BSD-3-Clause" }, - "node_modules/precinct": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.1.tgz", - "integrity": "sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "license": "MIT", "dependencies": { - "commander": "^2.20.3", - "debug": "^4.3.3", - "detective-amd": "^3.1.0", - "detective-cjs": "^3.1.1", - "detective-es6": "^2.2.1", - "detective-less": "^1.0.2", - "detective-postcss": "^4.0.0", - "detective-sass": "^3.0.1", - "detective-scss": "^2.0.1", - "detective-stylus": "^1.0.0", - "detective-typescript": "^7.0.0", - "module-definition": "^3.3.1", - "node-source-walk": "^4.2.0" - }, - "bin": { - "precinct": "bin/cli.js" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": "^10.13 || ^12 || >=14" - } - }, - "node_modules/precinct/node_modules/ast-module-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", - "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", - "license": "MIT", - "engines": { - "node": ">=6.0" + "node": ">= 0.8.0" } }, - "node_modules/precinct/node_modules/detective-cjs": { + "node_modules/libp2p": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-3.1.3.tgz", - "integrity": "sha512-ljs7P0Yj9MK64B7G0eNl0ThWSYjhAaSYy+fQcpzaKalYl/UoQBOzOeLCSFEY1qEBhziZ3w7l46KG/nH+s+L7BQ==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/libp2p/-/libp2p-3.1.3.tgz", + "integrity": "sha512-Jgl6Km1PfFTKR7krDNDxuuxQ6ya3D6VHFOi/XYJA539F62PmbxOQLd+nqbqozwB9BgJVTxaXRVmGTKo7dyrdQw==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "ast-module-types": "^3.0.0", - "node-source-walk": "^4.0.0" - }, - "engines": { - "node": ">=6.0" + "@chainsafe/is-ip": "^2.1.0", + "@chainsafe/netmask": "^2.0.0", + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "@libp2p/interface-internal": "^3.0.10", + "@libp2p/logger": "^6.2.2", + "@libp2p/multistream-select": "^7.0.10", + "@libp2p/peer-collections": "^7.0.10", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/peer-store": "^12.0.10", + "@libp2p/utils": "^7.0.10", + "@multiformats/dns": "^1.0.6", + "@multiformats/multiaddr": "^13.0.1", + "@multiformats/multiaddr-matcher": "^3.0.1", + "any-signal": "^4.1.1", + "datastore-core": "^11.0.1", + "interface-datastore": "^9.0.1", + "it-merge": "^3.0.12", + "it-parallel": "^3.0.13", + "main-event": "^1.0.1", + "multiformats": "^13.4.0", + "p-defer": "^4.0.1", + "p-event": "^7.0.0", + "p-retry": "^7.0.0", + "progress-events": "^1.0.1", + "race-signal": "^2.0.0", + "uint8arrays": "^5.1.0" } }, - "node_modules/precinct/node_modules/detective-es6": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-2.2.2.tgz", - "integrity": "sha512-eZUKCUsbHm8xoeoCM0z6JFwvDfJ5Ww5HANo+jPR7AzkFpW9Mun3t/TqIF2jjeWa2TFbAiGaWESykf2OQp3oeMw==", - "license": "MIT", + "node_modules/libp2p/node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "node-source-walk": "^4.0.0" - }, - "engines": { - "node": ">=6.0" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/precinct/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", - "license": "MIT", + "node_modules/libp2p/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "@babel/parser": "^7.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/premove": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/premove/-/premove-4.0.0.tgz", - "integrity": "sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==", - "license": "MIT", - "bin": { - "premove": "bin.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "multiformats": "^13.0.0" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "license": "MIT", - "dependencies": { - "parse-ms": "^2.1.0" + "p-locate": "^5.0.0" }, "engines": { "node": ">=10" @@ -28108,1077 +15206,984 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/private-ip": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/private-ip/-/private-ip-3.0.2.tgz", - "integrity": "sha512-2pkOVPGYD/4QyAg95c6E/4bLYXPthT5Xw4ocXYzIIsMBhskOMn6IwkWXmg6ZiA6K58+O6VD/n02r1hDhk7vDPw==", - "license": "MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "ip-regex": "^5.0.0", - "ipaddr.js": "^2.1.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">=14.16" - } + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true, "license": "MIT" }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "license": "MIT", - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" }, - "node_modules/progress-events": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", - "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", - "license": "Apache-2.0 OR MIT" + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "license": "ISC", - "optional": true + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "license": "MIT", - "optional": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" }, - "node_modules/promise-retry/node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "license": "MIT", - "optional": true + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" }, - "node_modules/promise-retry/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4" - } + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true, + "license": "MIT" }, - "node_modules/promise.any": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/promise.any/-/promise.any-2.0.6.tgz", - "integrity": "sha512-Ew/MrPtTjiHnnki0AA2hS2o65JaZ5n+5pp08JSyWWUdeOGF4F41P+Dn+rdqnaOV/FTxhR6eBDX412luwn3th9g==", + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, "license": "MIT", "dependencies": { - "array.prototype.map": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-aggregate-error": "^1.0.10", - "get-intrinsic": "^1.2.1", - "iterate-value": "^1.0.2" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prompt": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.3.0.tgz", - "integrity": "sha512-ZkaRWtaLBZl7KKAKndKYUL8WqNT+cQHKRZnT4RYYms48jQkFw3rrBL+/N5K/KtdEveHkxs982MX2BkDKub2ZMg==", + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", "dependencies": { - "@colors/colors": "1.5.0", - "async": "3.2.3", - "read": "1.0.x", - "revalidator": "0.1.x", - "winston": "2.x" + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 12.0.0" } }, - "node_modules/prompt/node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "license": "MIT" + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" }, - "node_modules/prompt/node_modules/winston": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.7.tgz", - "integrity": "sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "license": "MIT", "dependencies": { - "async": "^2.6.4", - "colors": "1.0.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "stack-trace": "0.0.x" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/prompt/node_modules/winston/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "get-func-name": "^2.0.1" } }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "license": "MIT", + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/proper-lockfile/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", + "yallist": "^4.0.0" + }, "engines": { - "node": ">= 4" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "license": "ISC" - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/protons-runtime": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.4.0.tgz", - "integrity": "sha512-XfA++W/WlQOSyjUyuF5lgYBfXZUEMP01Oh1C2dSwZAlF2e/ZrMRPfWonXj6BGM+o8Xciv7w0tsRMKYwYEuQvaw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "uint8-varint": "^2.0.2", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^5.0.1" - } - }, - "node_modules/protons-runtime/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" + "node": ">=10" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", + "node_modules/lzma-purejs-requirejs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lzma-purejs-requirejs/-/lzma-purejs-requirejs-1.0.0.tgz", + "integrity": "sha512-nQgC+oDmBKPdWoC//X51scWTN5D3zdIL7oN+plbKjhZ+u5LAZsF0/yIiYTNtj+TjB1o6mp9R4Ey5DW6elBEu8w==", + "license": "BSD", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "amdefine": "~0.1.0", + "commander": "~2.2.0" }, - "engines": { - "node": ">= 0.10" + "bin": { + "lzmajs": "bin/lzmajs" } }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", + "node_modules/lzma-purejs-requirejs/node_modules/commander": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.2.0.tgz", + "integrity": "sha512-U6hBkeIsoeE81B+yas9uVF4YYVcVoBCwb1e314VPyvVQubFwvnTAuc1oUQ6VuMPYUS4Rf1gzr0wTVLvs4sb5Pw==", "engines": { - "node": ">= 0.10" + "node": ">= 0.6.x" } }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "node_modules/macos-release": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.4.0.tgz", + "integrity": "sha512-wpGPwyg/xrSp4H4Db4xYSeAr6+cFQGHfspHzDUdYxswDnUW0L5Ov63UuJiSr8NMSpyaChO4u1n0MXUvVPtrN6A==", "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, "engines": { - "node": ">= 14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/main-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/main-event/-/main-event-1.0.1.tgz", + "integrity": "sha512-NWtdGrAca/69fm6DIVd8T9rtfDII4Q8NQbIbsKQq2VzS9eqOGYs8uaNQjcuaCq/d9H/o625aOTJX2Qoxzqw0Pw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.4" + "semver": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "license": "ISC", + "optional": true, "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 10" } }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", + "optional": true, "dependencies": { - "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" + "node": ">= 6.0.0" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "license": "ISC" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "license": "MIT", + "optional": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", + "optional": true, "dependencies": { - "escape-goat": "^4.0.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/pvtsutils": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.5.tgz", - "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", - "license": "MIT", + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, "dependencies": { - "tslib": "^2.6.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", - "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", - "license": "MIT", + "yallist": "^4.0.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "node_modules/make-fetch-happen/node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", + "optional": true, "dependencies": { - "side-channel": "^1.0.6" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { - "node": ">=0.4.x" + "node": ">= 0.4" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/maybe-combine-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/maybe-combine-errors/-/maybe-combine-errors-1.0.0.tgz", + "integrity": "sha512-eefp6IduNPT6fVdwPp+1NgD0PML1NU5P6j1Mj5nz1nidX8/sWY7119WL8vTAHgqfsY74TzW0w1XPgdYEKkGZ5A==", "license": "MIT", "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/race-event": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/race-event/-/race-event-1.3.0.tgz", - "integrity": "sha512-kaLm7axfOnahIqD3jQ4l1e471FIFcEGebXEnhxyLscuUzV8C94xVHtWEqDDXxll7+yu/6lW0w1Ff4HbtvHvOHg==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/race-signal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/race-signal/-/race-signal-1.1.0.tgz", - "integrity": "sha512-VqsW1uzCXfKBd2DhA3K3NhQlqQr04+5WQ7+kHpf1HzT01Q+ePSFWZdQHXKZPuLmm2eXTZM1XLO76cq15ZRAaEA==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rdf-canonize": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", - "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", - "license": "BSD-3-Clause", "dependencies": { - "setimmediate": "^1.0.5" + "is-plain-obj": "^2.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/rdf-data-factory": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-1.1.2.tgz", - "integrity": "sha512-TfQD63Lokabd09ES1jAtKK8AA6rkr9rwyUBGo6olOt1CE0Um36CUQIqytyf0am2ouBPR0l7SaHxCiMcPGHkt1A==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "license": "MIT", - "dependencies": { - "@rdfjs/types": "*" + "engines": { + "node": ">= 8" } }, - "node_modules/rdf-dataset-ext": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/rdf-dataset-ext/-/rdf-dataset-ext-1.1.0.tgz", - "integrity": "sha512-CH85RfRKN9aSlbju8T7aM8hgCSWMBsh2eh/tGxUUtWMN+waxi6iFDt8/r4PAEmKaEA82guimZJ4ISbmJ2rvWQg==", - "deprecated": "rdf-dataset-ext is deprecated. Switching to rdf-ext is recommended.", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "dependencies": { - "rdf-canonize": "^3.0.0", - "readable-stream": "3 - 4" + "engines": { + "node": ">= 0.6" } }, - "node_modules/rdf-literal": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-1.3.2.tgz", - "integrity": "sha512-79Stlu3sXy0kq9/decHFLf3xNPuY6sfhFPhd/diWErgaFr0Ekyg38Vh9bnVcqDYu48CFRi0t+hrFii49n92Hbw==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { - "@rdfjs/types": "*", - "rdf-data-factory": "^1.1.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/rdf-utils-fs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rdf-utils-fs/-/rdf-utils-fs-3.0.0.tgz", - "integrity": "sha512-TdP7WZyGVmKFeAotPj5nzZn2XIAd0yaH/qfLBSvUA6Sc6ZNB8jL+iHb45KMCsaNTqKbYZSkrw/fsIQNFM6XZCA==", + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", - "dependencies": { - "@rdfjs/formats-common": "^3.1.0", - "readable-stream": "^4.4.2" + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/rdf-validate-datatype": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rdf-validate-datatype/-/rdf-validate-datatype-0.2.1.tgz", - "integrity": "sha512-DpREnmoWDxC80KyslZeBPLQb3ztyeiOolT4uCl58tCju2KHJu4j5vonmVVdEJh2Mpad5UY57v6sSM/hfSTFGKQ==", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", - "dependencies": { - "@rdfjs/term-map": "^2.0.0", - "@tpluscode/rdf-ns-builders": "3 - 4" + "engines": { + "node": ">= 0.6" } }, - "node_modules/rdf-validate-shacl": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/rdf-validate-shacl/-/rdf-validate-shacl-0.5.6.tgz", - "integrity": "sha512-B23lccAy1uIYU9XVoXxK2DFGMV+xBbpvzTpfBJXLKoURjdEOfu/MCih1AHiGJh9PInvl667GvkVD9TmAE2b3Sg==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { - "@rdfjs/data-model": "^2", - "@rdfjs/dataset": "^2", - "@rdfjs/environment": "^1", - "@rdfjs/namespace": "^2.0.0", - "@rdfjs/term-set": "^2.0.1", - "@vocabulary/sh": "^1.0.1", - "clownface": "^2.0.0", - "debug": "^4.3.2", - "rdf-literal": "^1.3.0", - "rdf-validate-datatype": "^0.2.0" + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/rdf-validation": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/rdf-validation/-/rdf-validation-0.1.1.tgz", - "integrity": "sha512-z2RbRcsKOM+CWa7qoI4LWCQQTji64eoBNLvbP3++0ZE4pO4EP1xkV5asSH4TULeLfDEuMhzyDXRnAjA+8R2l4w==", + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^2.0.1", - "@rdfjs/namespace": "^2.0.0", - "@rdfjs/term-map": "^2.0.0", - "@rdfjs/to-ntriples": "^3.0.1" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rdflib": { - "version": "2.2.35", - "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-2.2.35.tgz", - "integrity": "sha512-PudSzYz0cVy5iuKmxaNfl0WPuPq4h9LAWbyJSn36gwTMtWbBgcqUDobdcDK3P6mxeOui/cosDXu0A9oVicVfyA==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.4", - "@frogcat/ttl2jsonld": "^0.0.9", - "@xmldom/xmldom": "^0.8.10", - "cross-fetch": "^3.1.8", - "jsonld": "^8.3.2", - "n3": "^1.17.3", - "solid-namespace": "^0.5.3" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rdfxml-streaming-parser": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/rdfxml-streaming-parser/-/rdfxml-streaming-parser-2.4.0.tgz", - "integrity": "sha512-f+tdI1wxOiPzMbFWRtOwinwPsqac0WIN80668yFKcVdFCSTGOWTM70ucQGUSdDZZo7pce/UvZgV0C3LDj0P7tg==", + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "license": "MIT", - "dependencies": { - "@rdfjs/types": "*", - "@rubensworks/saxes": "^6.0.1", - "@types/readable-stream": "^2.3.13", - "buffer": "^6.0.3", - "rdf-data-factory": "^1.1.0", - "readable-stream": "^4.4.2", - "relative-to-absolute-iri": "^1.0.0", - "validate-iri": "^1.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rdfxml-streaming-parser/node_modules/@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "license": "MIT" }, - "node_modules/react-native-test-runner": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-native-test-runner/-/react-native-test-runner-5.0.0.tgz", - "integrity": "sha512-/ztZUqRqV98/lLbGN781egGXjkR8i7MhfAm7nGtKe1DoDuITkvQk/4fF/nXfDyZEtaae9NYuv2MocUR/qcN1bQ==", - "license": "MIT", + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/plugin-proposal-async-generator-functions": "^7.12.12", - "babel-plugin-transform-inline-environment-variables": "^0.4.3", - "chai": "^4.2.0", - "execa": "^4.1.0", - "find-up": "^5.0.0", - "fs-extra": "^9.0.1", - "globby": "^11.0.1", - "is-ci": "^2.0.0", - "is-uuid": "^1.0.2", - "lilconfig": "^2.0.2", - "meow": "^8.0.0", - "merge-options": "^3.0.4", - "metro-react-native-babel-preset": "^0.64.0", - "ora": "^5.1.0", - "p-retry": "^4.2.0", - "p-tap": "^3.1.0", - "patch-package": "^6.2.2", - "pico-signals": "^1.0.0", - "read-pkg": "^5.2.0", - "semver": "^7.3.4", - "tempy": "^1.0.0", - "yn": "^4.0.0" - }, - "bin": { - "rn-test": "cli/index.js" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=14" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/react-native-test-runner/node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" - }, - "node_modules/react-native-test-runner/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "license": "ISC", + "optional": true, "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/react-native-test-runner/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/react-native-test-runner/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", "license": "MIT", + "optional": true, "dependencies": { - "restore-cursor": "^3.1.0" + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" }, "engines": { "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" } }, - "node_modules/react-native-test-runner/node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/react-native-test-runner/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "license": "MIT", + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", + "optional": true, "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/react-native-test-runner/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "optional": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/react-native-test-runner/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, "dependencies": { - "pump": "^3.0.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-native-test-runner/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" } }, - "node_modules/react-native-test-runner/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/react-native-test-runner/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-native-test-runner/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 8" } }, - "node_modules/react-native-test-runner/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/react-native-test-runner/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/react-native-test-runner/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/mocha": { + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/react-native-test-runner/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", + "node_modules/mocha/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", "dependencies": { - "mimic-fn": "^2.1.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/react-native-test-runner/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/react-native-test-runner/node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/react-native-test-runner/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, "engines": { - "node": ">= 6" + "node": "*" } }, - "node_modules/react-native-test-runner/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/mortice": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/mortice/-/mortice-3.3.1.tgz", + "integrity": "sha512-t3oESfijIPGsmsdLEKjF+grHfrbnKSXflJtgb1wY14cjxZpS6GnhHRXTxxzCAoCCnq1YYfpEPwY3gjiCPhOufQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "abort-error": "^1.0.0", + "it-queue": "^1.1.0", + "main-event": "^1.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" }, - "engines": { - "node": ">=8" + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/react-native-test-runner/node_modules/strip-final-newline": { + "node_modules/multiformats": { + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/mute-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", "engines": { - "node": ">=6" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/react-native-test-runner/node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "node_modules/n3": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/n3/-/n3-1.26.0.tgz", + "integrity": "sha512-SQknS0ua90rN+3RHuk8BeIqeYyqIH/+ecViZxX08jR4j6MugqWRjtONl3uANG/crWXnOM2WIqBJtjIhVYFha+w==", "license": "MIT", "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" + "buffer": "^6.0.3", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.0" } }, - "node_modules/react-native-test-runner/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/n3/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/react-native-test-runner/node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "node_modules/n3/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" + "bin": { + "nanoid": "bin/nanoid.js" }, "engines": { - "node": ">=8" + "node": "^18 || >=20" } }, - "node_modules/react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", - "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.4.0" } }, - "node_modules/read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "node_modules/new-github-release-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "dev": true, "license": "MIT", "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" + "type-fest": "^2.5.1" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -29187,380 +16192,348 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, + "node_modules/new-github-release-url/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "license": "MIT", + "node_modules/nise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", + "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.1", + "@sinonjs/text-encoding": "^0.7.3", + "just-extend": "^6.2.0", + "path-to-regexp": "^8.1.0" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/nise/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", "license": "MIT", "dependencies": { - "p-limit": "^4.0.0" + "semver": "^7.3.5" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "license": "MIT" }, - "node_modules/read-pkg-up/node_modules/read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "license": "MIT", + "node_modules/node-cron": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz", + "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==", + "license": "ISC", "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - }, - "engines": { - "node": ">=12.20" + "uuid": "8.3.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.0.0" } }, - "node_modules/read-pkg-up/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "node_modules/node-cron/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", "bin": { - "semver": "bin/semver" + "uuid": "dist/bin/uuid" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10.5.0" } }, - "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/readable-stream/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-forge": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { - "node": ">=0.8.x" + "node": ">= 6.13.0" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "license": "MIT", + "optional": true, "dependencies": { - "picomatch": "^2.2.1" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">=8.10.0" + "node": ">= 10.12.0" } }, - "node_modules/receptacle": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/receptacle/-/receptacle-1.3.2.tgz", - "integrity": "sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==", + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", + "optional": true, "dependencies": { - "ms": "^2.1.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, "dependencies": { - "resolve": "^1.1.6" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 0.10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "license": "MIT", + "node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "optional": true, "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "license": "MIT", - "dependencies": { - "esprima": "~4.0.0" + "node_modules/node-gyp/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=8" } }, - "node_modules/reflect-metadata": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", - "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", - "license": "Apache-2.0" - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "license": "MIT", + "node_modules/node-gyp/node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "process-on-spawn": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, "license": "MIT" }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "node_modules/nodeify-fetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodeify-fetch/-/nodeify-fetch-3.1.0.tgz", + "integrity": "sha512-ZV81vM//sEgTgXwVZlOONzcOCdTGQ53mV65FVSNXgPQHa8oCwRLtLbnGxL/1S/Yw90bcXUDKMz00jEnaeazo+A==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.8.4" + "lodash": "^4.17.21", + "node-fetch": "^3.2.10", + "readable-stream": "^4.2.0", + "stream-chunks": "^1.0.0" } }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", - "dev": true, + "node_modules/nodeify-fetch/node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "license": "MIT", - "bin": { - "regexp-tree": "bin/regexp-tree" + "engines": { + "node": ">= 12" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "node_modules/nodeify-fetch/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "license": "MIT", + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "optional": true, "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=4" - } - }, - "node_modules/regextras": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", - "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", - "license": "MIT", - "engines": { - "node": ">=0.1.14" + "node": ">=6" } }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, "license": "MIT", "dependencies": { - "@pnpm/npm-conf": "^2.1.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, "engines": { "node": ">=12" }, @@ -29568,573 +16541,486 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relative-to-absolute-iri": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/relative-to-absolute-iri/-/relative-to-absolute-iri-1.0.7.tgz", - "integrity": "sha512-Xjyl4HmIzg2jzK/Un2gELqbcE8Fxy85A/aLSHE6PE/3+OGsFwmKVA1vRyGaz6vLWSqLDMHA+5rjD/xbibSQN1Q==", - "license": "MIT" - }, - "node_modules/release-it": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-17.6.0.tgz", - "integrity": "sha512-EE34dtRPL7BHpYQC7E+zAU8kjkyxFHxLk5Iqnmn/5nGcjgOQu34Au29M2V9YvxiP3tZbIlEn4gItEzu7vAPRbw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/webpro" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/webpro" - } - ], - "license": "MIT", + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, "dependencies": { - "@iarna/toml": "2.2.5", - "@octokit/rest": "20.1.1", - "async-retry": "1.3.3", - "chalk": "5.3.0", - "cosmiconfig": "9.0.0", - "execa": "8.0.1", - "git-url-parse": "14.0.0", - "globby": "14.0.2", - "got": "13.0.0", - "inquirer": "9.3.2", - "is-ci": "3.0.1", - "issue-parser": "7.0.1", - "lodash": "4.17.21", - "mime-types": "2.1.35", - "new-github-release-url": "2.0.0", - "node-fetch": "3.3.2", - "open": "10.1.0", - "ora": "8.0.1", - "os-name": "5.1.0", - "proxy-agent": "6.4.0", - "semver": "7.6.2", - "shelljs": "0.8.5", - "update-notifier": "7.1.0", - "url-join": "5.0.0", - "wildcard-match": "5.1.3", - "yargs-parser": "21.1.1" - }, - "bin": { - "release-it": "bin/release-it.js" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || ^22.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/release-it/node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", - "dev": true, + "node_modules/null-prototype-object": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/null-prototype-object/-/null-prototype-object-1.2.5.tgz", + "integrity": "sha512-YAPMPwBVlXXmIx/eIHx/KwIL1Bsd8I+YHQdFpW0Ydvez6vu5Bx2CaP4GrEnH5c1huVWZD9MqEuFwAJoBMm5LJQ==", "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, - "node_modules/release-it/node_modules/@octokit/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", - "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", + "node_modules/nyc": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.1.0", - "@octokit/request": "^8.3.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^3.3.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" }, "engines": { - "node": ">= 18" + "node": ">=18" } }, - "node_modules/release-it/node_modules/@octokit/endpoint": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", - "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", + "node_modules/nyc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/release-it/node_modules/@octokit/graphql": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", - "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@octokit/request": "^8.3.0", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/release-it/node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", + "node_modules/nyc/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, - "node_modules/release-it/node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", - "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^13.5.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" + "node": ">=8" } }, - "node_modules/release-it/node_modules/@octokit/plugin-request-log": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", - "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", + "node_modules/nyc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">= 18" + "node": "*" }, - "peerDependencies": { - "@octokit/core": "5" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/release-it/node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", - "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^13.5.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "^5" + "node": ">=8" } }, - "node_modules/release-it/node_modules/@octokit/request": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", - "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", + "node_modules/nyc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@octokit/endpoint": "^9.0.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 18" + "node": "*" } }, - "node_modules/release-it/node_modules/@octokit/request-error": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", - "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^13.1.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 18" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/@octokit/rest": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", - "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/core": "^5.0.2", - "@octokit/plugin-paginate-rest": "11.3.1", - "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "13.2.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 18" + "node": ">=8" } }, - "node_modules/release-it/node_modules/@octokit/types": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^22.2.0" + "engines": { + "node": ">=8" } }, - "node_modules/release-it/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "node_modules/nyc/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } + "license": "ISC" }, - "node_modules/release-it/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/nyc/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "defer-to-connect": "^2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=14.16" + "node": ">=8" } }, - "node_modules/release-it/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/release-it/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - } + "license": "ISC" }, - "node_modules/release-it/node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": ">=14.16" + "node": ">=8" } }, - "node_modules/release-it/node_modules/cacheable-request/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, - "node_modules/release-it/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/nypm": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.4.tgz", + "integrity": "sha512-1TvCKjZyyklN+JJj2TS3P4uSQEInrM/HkkuSXsEzm1ApPgBffOn8gFguNnZf07r/1X6vlryfIqMUkJKQMzlZiw==", "dev": true, "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "dependencies": { + "citty": "^0.2.0", + "pathe": "^2.0.3", + "tinyexec": "^1.0.2" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" } }, - "node_modules/release-it/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/nypm/node_modules/citty": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.0.tgz", + "integrity": "sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/release-it/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/release-it/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/release-it/node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/release-it/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true, - "license": "MIT" - }, - "node_modules/release-it/node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/release-it/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=16.17" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/release-it/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=16" + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.4" } }, - "node_modules/release-it/node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/release-it/node_modules/got": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/release-it/node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/release-it/node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=10.19.0" + "node": ">= 0.8" } }, - "node_modules/release-it/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" } }, - "node_modules/release-it/node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" + "fn.name": "1.x.x" } }, - "node_modules/release-it/node_modules/is-installed-globally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", - "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { - "global-directory": "^4.0.1", - "is-path-inside": "^4.0.0" + "mimic-function": "^5.0.0" }, "engines": { "node": ">=18" @@ -30143,99 +17029,115 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/release-it/node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "node_modules/ora": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", "dev": true, "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" + }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, "engines": { - "node": ">=16" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/release-it/node_modules/issue-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", - "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "node_modules/ora/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, "engines": { - "node": "^18.17 || >=20.6.1" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/release-it/node_modules/ky": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-1.6.0.tgz", - "integrity": "sha512-MG7hlH26oShC4Lysk5TYzXshHLfEY52IJ0ofOeCsifquqTymbXCSTx+g4rXO30XYxoM6Y1ed5pNnpULe9Rx19A==", + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/latest-version": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-9.0.0.tgz", - "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", + "node_modules/ora/node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "dev": true, "license": "MIT", "dependencies": { - "package-json": "^10.0.0" + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" }, "engines": { "node": ">=18" @@ -30244,168 +17146,154 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "node_modules/ora/node_modules/string-width": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz", + "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/release-it/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "node_modules/os-name": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-6.1.0.tgz", + "integrity": "sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg==", "dev": true, "license": "MIT", + "dependencies": { + "macos-release": "^3.3.0", + "windows-release": "^6.1.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/release-it/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, + "node_modules/p-defer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", + "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, + "node_modules/p-event": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-7.1.0.tgz", + "integrity": "sha512-/lkPs5W1aC3cp6vqZefpdosOn65J571sWodyfOQiF0+tmDCpU+H8Atwpu0vQROCVUlZuToDN5eyTLsMLLc54mg==", "license": "MIT", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "p-timeout": "^7.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/release-it/node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/ora": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", - "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/p-cancelable": { + "node_modules/p-map": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, "engines": { - "node": ">=12.20" + "node": ">=8" } }, - "node_modules/release-it/node_modules/package-json": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz", - "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", - "dev": true, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", "license": "MIT", "dependencies": { - "ky": "^1.2.0", - "registry-auth-token": "^5.0.2", - "registry-url": "^6.0.1", - "semver": "^7.6.0" + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" }, "engines": { "node": ">=18" @@ -30413,29 +17301,12 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/release-it/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, + }, + "node_modules/p-queue/node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, "engines": { "node": ">=14.16" }, @@ -30443,1598 +17314,1776 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, + "node_modules/p-retry": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz", + "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "is-network-error": "^1.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, + "node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, "engines": { - "node": ">=6" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/release-it/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" }, "engines": { - "node": ">=10" + "node": ">= 14" } }, - "node_modules/release-it/node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.3.5" + "degenerator": "^5.0.0", + "netmask": "^2.0.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, - "node_modules/release-it/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "license": "ISC", - "engines": { - "node": ">=14" + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=8" } }, - "node_modules/release-it/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "BlueOak-1.0.0" }, - "node_modules/release-it/node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "callsites": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, - "node_modules/release-it/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/parse-github-url": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.3.tgz", + "integrity": "sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "bin": { + "parse-github-url": "cli.js" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/release-it/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=6" } }, - "node_modules/release-it/node_modules/update-notifier": { + "node_modules/parse-path": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.1.0.tgz", - "integrity": "sha512-8SV3rIqVY6EFC1WxH6L0j55s0MO79MFBS1pivmInRJg3pCEDgWHBj1Q6XByTtCLOZIFA0f6zoG9ZWf2Ks9lvTA==", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "boxen": "^7.1.1", - "chalk": "^5.3.0", - "configstore": "^6.0.0", - "import-lazy": "^4.0.0", - "is-in-ci": "^0.1.0", - "is-installed-globally": "^1.0.0", - "is-npm": "^6.0.0", - "latest-version": "^9.0.0", - "pupa": "^3.1.0", - "semver": "^7.6.2", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" + "protocols": "^2.0.0" } }, - "node_modules/release-it/node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "node_modules/parse-url": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", + "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@types/parse-path": "^7.0.0", + "parse-path": "^7.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=14.13.0" } }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "license": "ISC", - "dependencies": { - "es6-error": "^4.0.1" - }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "license": "ISC" - }, - "node_modules/requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.5" + "node": ">=8" } }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "license": "MIT", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, - "node_modules/resolve-from": { + "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", + "license": "MIT", + "dependencies": { + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "ripemd160": "^2.0.3", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", + "engines": { + "node": ">=8.6" + }, "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "license": "MIT", "dependencies": { - "lowercase-keys": "^2.0.0" + "find-up": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "license": "MIT", "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^1.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" } }, - "node_modules/revalidator": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==", - "license": "Apache 2.0", + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" }, "bin": { - "rimraf": "bin.js" + "prebuild-install": "bin.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=10" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": "*" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "fast-diff": "^1.1.2" }, "engines": { - "node": "*" + "node": ">=6.0.0" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", "license": "MIT", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/rlp/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "license": "MIT" - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" + "parse-ms": "^2.1.0" }, "engines": { - "node": ">=8.0" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">= 0.6.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "node_modules/progress-events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", + "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "license": "ISC", + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "license": "MIT", + "optional": true, "dependencies": { - "mri": "^1.1.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "node_modules/promise-retry/node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, + "optional": true + }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "optional": true, "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "license": "MIT", "dependencies": { - "regexp-tree": "~0.1.1" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "license": "MIT", + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" + "@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": ">=13.7.0", + "long": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.0.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/protocols": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "dev": true, "license": "MIT" }, - "node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", - "license": "ISC" + "node_modules/protons-runtime": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.6.0.tgz", + "integrity": "sha512-/Kde+sB9DsMFrddJT/UZWe6XqvL7SL5dbag/DBCElFKhkwDj7XKt53S+mzLyaDP5OqS0wXjV5SA572uWDaT0Hg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8-varint": "^2.0.2", + "uint8arraylist": "^2.4.3", + "uint8arrays": "^5.0.1" + } }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "license": "MIT" + "node_modules/protons-runtime/node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } }, - "node_modules/secp256k1": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz", - "integrity": "sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==", - "hasInstallScript": true, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^5.0.0", - "node-gyp-build": "^4.2.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.10" } }, - "node_modules/secp256k1/node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "license": "MIT" - }, - "node_modules/secure-json-parse": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", - "license": "BSD-3-Clause" - }, - "node_modules/semantic-release": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", - "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", - "license": "MIT", - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^4.0.10", - "marked-terminal": "^5.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^16.2.0" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { - "node": ">=16 || ^14.17" + "node": ">= 0.10" } }, - "node_modules/semantic-release-monorepo": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/semantic-release-monorepo/-/semantic-release-monorepo-7.0.8.tgz", - "integrity": "sha512-L2n7FZEYvjxXop6C7svk8xZH1/2N58CV1dN+veeAGZ8363FG+AKNKLN1r4wAL86e5xIu1HiOOASm10X+rN6XWg==", + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, "license": "MIT", "dependencies": { - "debug": "^3.1.0", - "execa": "^0.8.0", - "file-url": "^3.0.0", - "fs-extra": "^10.0.1", - "get-stream": "^6.0.1", - "git-log-parser": "^1.2.0", - "p-each-series": "^2.1.0", - "p-limit": "^1.2.0", - "pkg-up": "^2.0.0", - "ramda": "^0.25.0", - "read-pkg": "^5.0.0", - "semantic-release-plugin-decorators": "^3.0.0", - "tempy": "1.0.1" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" }, - "peerDependencies": { - "semantic-release": ">=15.11.x < 20" + "engines": { + "node": ">= 14" } }, - "node_modules/semantic-release-monorepo/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "license": "MIT", "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/semantic-release-monorepo/node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/semantic-release-monorepo/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "tslib": "^2.8.1" } }, - "node_modules/semantic-release-monorepo/node_modules/execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", "license": "MIT", - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/semantic-release-monorepo/node_modules/execa/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "license": "MIT", + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, "engines": { - "node": ">=4" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release-monorepo/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "engines": { - "node": ">=4" + "node": ">=0.4.x" } }, - "node_modules/semantic-release-monorepo/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/race-event": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/race-event/-/race-event-1.6.1.tgz", + "integrity": "sha512-vi7WH5g5KoTFpu2mme/HqZiWH14XSOtg5rfp6raBskBHl7wnmy3F/biAIyY5MsK+BHWhoPhxtZ1Y2R7OHHaWyQ==", + "license": "Apache-2.0 OR MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" + "abort-error": "^1.0.1" } }, - "node_modules/semantic-release-monorepo/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/race-signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/race-signal/-/race-signal-2.0.0.tgz", + "integrity": "sha512-P31bLhE4ByBX/70QDXMutxnqgwrF1WUXea1O8DXuviAgkdbQ1iQMQotNgzJIBC9yUSn08u/acZrMUhgw7w6GpA==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/random-int": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/random-int/-/random-int-3.1.0.tgz", + "integrity": "sha512-h8CRz8cpvzj0hC/iH/1Gapgcl2TQ6xtnCpyOI5WvWfXf/yrDx2DOU+tD9rX23j36IF11xg1KqB9W11Z18JPMdw==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release-monorepo/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/semantic-release-monorepo/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/semantic-release-monorepo/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "license": "ISC", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "node_modules/semantic-release-monorepo/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "license": "MIT", - "dependencies": { - "path-key": "^2.0.0" - }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/semantic-release-monorepo/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "dev": true, "license": "MIT", "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" + "defu": "^6.1.4", + "destr": "^2.0.3" } }, - "node_modules/semantic-release-monorepo/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "license": "MIT", + "node_modules/rdf-canonize": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-5.0.0.tgz", + "integrity": "sha512-g8OUrgMXAR9ys/ZuJVfBr05sPPoMA7nHIVs8VEvg9QwM5W4GR2qSFEEHjsyHF1eWlBaf8Ev40WNjQFQ+nJTO3w==", + "license": "BSD-3-Clause", "dependencies": { - "p-limit": "^1.1.0" + "setimmediate": "^1.0.5" }, "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/semantic-release-monorepo/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/rdf-data-factory": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-2.0.2.tgz", + "integrity": "sha512-WzPoYHwQYWvIP9k+7IBLY1b4nIDitzAK4mA37WumAF/Cjvu/KOtYJH9IPZnUTWNSd5K2+pq4vrcE9WZC4sRHhg==", "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@rdfjs/types": "^2.0.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/rubensworks/" } }, - "node_modules/semantic-release-monorepo/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/rdf-dataset-ext": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rdf-dataset-ext/-/rdf-dataset-ext-1.1.0.tgz", + "integrity": "sha512-CH85RfRKN9aSlbju8T7aM8hgCSWMBsh2eh/tGxUUtWMN+waxi6iFDt8/r4PAEmKaEA82guimZJ4ISbmJ2rvWQg==", + "deprecated": "rdf-dataset-ext is deprecated. Switching to rdf-ext is recommended.", "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "rdf-canonize": "^3.0.0", + "readable-stream": "3 - 4" } }, - "node_modules/semantic-release-monorepo/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "license": "MIT", + "node_modules/rdf-dataset-ext/node_modules/rdf-canonize": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", + "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", + "license": "BSD-3-Clause", + "dependencies": { + "setimmediate": "^1.0.5" + }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/semantic-release-monorepo/node_modules/pkg-up": { + "node_modules/rdf-literal": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", + "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-2.0.0.tgz", + "integrity": "sha512-jlQ+h7EvnXmncmk8OzOYR8T3gNfd4g0LQXbflHkEkancic8dh0Tdt5RiRq8vUFndjIeNHt1RWeA5TAj6rgrtng==", "license": "MIT", "dependencies": { - "find-up": "^2.1.0" + "rdf-data-factory": "^2.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/rubensworks/" } }, - "node_modules/semantic-release-monorepo/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "node_modules/rdf-validate-datatype": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/rdf-validate-datatype/-/rdf-validate-datatype-0.2.2.tgz", + "integrity": "sha512-mH9qL8i0WBbZ6HJCA26BB6V+WV2MraKvitez3SV0QegBWVQ4wYO49CgfFBzoAYg6tlnhFXl9MkrOAQ07X2N1FA==", "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@rdfjs/term-map": "^2.0.0", + "@tpluscode/rdf-ns-builders": "3 - 5" } }, - "node_modules/semantic-release-monorepo/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/rdf-validate-shacl": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/rdf-validate-shacl/-/rdf-validate-shacl-0.5.10.tgz", + "integrity": "sha512-I+TRVGeKn5eG/kTzVGRGGNThCSkgX/v7EUSOUEsIcHubyyShQYzRbQqyU45zKzNjLWdqp9abFHw1ULUPzWyo1A==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@rdfjs/data-model": "^2", + "@rdfjs/dataset": "^2", + "@rdfjs/environment": "^1", + "@rdfjs/namespace": "^2.0.0", + "@rdfjs/term-set": "^2.0.1", + "@rdfjs/types": "^1.1.0", + "@vocabulary/sh": "^1.1.5", + "clownface": "^2.0.0", + "debug": "^4.3.2", + "rdf-literal": "^1.3.2", + "rdf-validate-datatype": "^0.2.0" } }, - "node_modules/semantic-release-monorepo/node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "node_modules/rdf-validate-shacl/node_modules/@rdfjs/types": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.1.2.tgz", + "integrity": "sha512-wqpOJK1QCbmsGNtyzYnojPU8gRDPid2JO0Q0kMtb4j65xhCK880cnKAfEOwC+dX85VJcCByQx5zOwyyfCjDJsg==", "license": "MIT", "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/semantic-release-monorepo/node_modules/tempy/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/rdf-validate-shacl/node_modules/rdf-data-factory": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-1.1.3.tgz", + "integrity": "sha512-ny6CI7m2bq4lfQQmDYvcb2l1F9KtGwz9chipX4oWu2aAtVoXjb7k3d8J1EsgAsEbMXnBipB/iuRen5H2fwRWWQ==", "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@rdfjs/types": "^1.0.0" } }, - "node_modules/semantic-release-monorepo/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/rdf-validate-shacl/node_modules/rdf-literal": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-1.3.2.tgz", + "integrity": "sha512-79Stlu3sXy0kq9/decHFLf3xNPuY6sfhFPhd/diWErgaFr0Ekyg38Vh9bnVcqDYu48CFRi0t+hrFii49n92Hbw==", + "license": "MIT", + "dependencies": { + "@rdfjs/types": "*", + "rdf-data-factory": "^1.1.0" } }, - "node_modules/semantic-release-monorepo/node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "node_modules/rdfxml-streaming-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/rdfxml-streaming-parser/-/rdfxml-streaming-parser-2.4.0.tgz", + "integrity": "sha512-f+tdI1wxOiPzMbFWRtOwinwPsqac0WIN80668yFKcVdFCSTGOWTM70ucQGUSdDZZo7pce/UvZgV0C3LDj0P7tg==", "license": "MIT", "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" + "@rdfjs/types": "*", + "@rubensworks/saxes": "^6.0.1", + "@types/readable-stream": "^2.3.13", + "buffer": "^6.0.3", + "rdf-data-factory": "^1.1.0", + "readable-stream": "^4.4.2", + "relative-to-absolute-iri": "^1.0.0", + "validate-iri": "^1.0.0" } }, - "node_modules/semantic-release-monorepo/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", + "node_modules/rdfxml-streaming-parser/node_modules/@rdfjs/types": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.1.2.tgz", + "integrity": "sha512-wqpOJK1QCbmsGNtyzYnojPU8gRDPid2JO0Q0kMtb4j65xhCK880cnKAfEOwC+dX85VJcCByQx5zOwyyfCjDJsg==", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "@types/node": "*" } }, - "node_modules/semantic-release-monorepo/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "license": "ISC" + "node_modules/rdfxml-streaming-parser/node_modules/@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } }, - "node_modules/semantic-release-plugin-decorators": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/semantic-release-plugin-decorators/-/semantic-release-plugin-decorators-3.0.3.tgz", - "integrity": "sha512-YTB2z64yyqEzABJ3yFesV9s5izZ4oKdbYDTu/2whVdlGQYCwsWkw9XYRCnvXzPdWPSWYmCPdJwMJ5w433rncig==", + "node_modules/rdfxml-streaming-parser/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "peerDependencies": { - "semantic-release": ">=11 < 20" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/semantic-release/node_modules/@octokit/auth-token": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", - "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "node_modules/rdfxml-streaming-parser/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/rdfxml-streaming-parser/node_modules/rdf-data-factory": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-1.1.3.tgz", + "integrity": "sha512-ny6CI7m2bq4lfQQmDYvcb2l1F9KtGwz9chipX4oWu2aAtVoXjb7k3d8J1EsgAsEbMXnBipB/iuRen5H2fwRWWQ==", "license": "MIT", - "engines": { - "node": ">= 14" + "dependencies": { + "@rdfjs/types": "^1.0.0" } }, - "node_modules/semantic-release/node_modules/@octokit/core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", - "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "node_modules/rdfxml-streaming-parser/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "license": "MIT", "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/semantic-release/node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/semantic-release/node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "node_modules/readable-stream/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, "engines": { - "node": ">= 14" + "node": ">=0.8.x" } }, - "node_modules/semantic-release/node_modules/@octokit/openapi-types": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", - "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", - "license": "MIT" + "node_modules/readable-stream/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/semantic-release/node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, "license": "MIT", - "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" - }, "engines": { - "node": ">= 14" + "node": ">= 14.18.0" }, - "peerDependencies": { - "@octokit/core": ">=4" + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/semantic-release/node_modules/@octokit/plugin-retry": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", - "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" }, - "node_modules/semantic-release/node_modules/@octokit/plugin-throttling": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", - "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { - "node": ">= 14" + "node": ">= 0.4" }, - "peerDependencies": { - "@octokit/core": "^4.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" }, - "node_modules/semantic-release/node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, "license": "MIT", - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" + "bin": { + "regexp-tree": "bin/regexp-tree" } }, - "node_modules/semantic-release/node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/semantic-release/node_modules/@semantic-release/github": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", - "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-retry": "^4.1.3", - "@octokit/plugin-throttling": "^5.2.3", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "url-join": "^4.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": ">=14.17" + "node": ">= 0.4" }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, "engines": { - "node": ">= 14" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/semantic-release/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } + "node_modules/relative-to-absolute-iri": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/relative-to-absolute-iri/-/relative-to-absolute-iri-1.0.7.tgz", + "integrity": "sha512-Xjyl4HmIzg2jzK/Un2gELqbcE8Fxy85A/aLSHE6PE/3+OGsFwmKVA1vRyGaz6vLWSqLDMHA+5rjD/xbibSQN1Q==", + "license": "MIT" }, - "node_modules/semantic-release/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/release-it": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-19.2.4.tgz", + "integrity": "sha512-BwaJwQYUIIAKuDYvpqQTSoy0U7zIy6cHyEjih/aNaFICphGahia4cjDANuFXb7gVZ51hIK9W0io6fjNQWXqICg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/webpro" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/webpro" + } + ], "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "@nodeutils/defaults-deep": "1.1.0", + "@octokit/rest": "22.0.1", + "@phun-ky/typeof": "2.0.3", + "async-retry": "1.3.3", + "c12": "3.3.3", + "ci-info": "^4.3.1", + "eta": "4.5.0", + "git-url-parse": "16.1.0", + "inquirer": "12.11.1", + "issue-parser": "7.0.1", + "lodash.merge": "4.6.2", + "mime-types": "3.0.2", + "new-github-release-url": "2.0.0", + "open": "10.2.0", + "ora": "9.0.0", + "os-name": "6.1.0", + "proxy-agent": "6.5.0", + "semver": "7.7.3", + "tinyglobby": "0.2.15", + "undici": "6.23.0", + "url-join": "5.0.0", + "wildcard-match": "5.1.4", + "yargs-parser": "21.1.1" + }, + "bin": { + "release-it": "bin/release-it.js" }, "engines": { - "node": ">=10" + "node": "^20.12.0 || >=22.0.0" } }, - "node_modules/semantic-release/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/release-it/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">= 0.6" } }, - "node_modules/semantic-release/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/release-it/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/semantic-release/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "license": "MIT", + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", "dependencies": { - "escape-string-regexp": "^1.0.5" + "es6-error": "^4.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/semantic-release/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/semantic-release/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" }, - "node_modules/semantic-release/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/semantic-release/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/semantic-release/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/semantic-release/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/retimeable-signal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/retimeable-signal/-/retimeable-signal-1.0.1.tgz", + "integrity": "sha512-Cy26CYfbWnYu8HMoJeDhaMpW/EYFIbne3vMf6G9RSrOyWYXbPehja/BEdzpqmM84uy2bfBD7NPZhoQ4GZEtgvg==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/semantic-release/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/semantic-release/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "devOptional": true, + "license": "ISC", "dependencies": { - "path-key": "^3.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/semantic-release/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "devOptional": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "devOptional": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/semantic-release/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "license": "ISC", "dependencies": { - "p-try": "^2.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/semantic-release/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "hash-base": "^3.1.2", + "inherits": "^2.0.4" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/semantic-release/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "license": "MIT", + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "license": "MPL-2.0", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "bn.js": "^5.2.0" }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/rlp/node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/run-async": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", + "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.12.0" } }, - "node_modules/semantic-release/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "queue-microtask": "^1.2.2" } }, - "node_modules/semantic-release/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "node_modules/semantic-release/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, "engines": { - "node": ">=8" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, "license": "MIT" }, - "node_modules/semantic-release/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp-tree": "~0.1.1" } }, - "node_modules/semantic-release/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", "engines": { "node": ">=10" } }, - "node_modules/semantic-release/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "license": "MIT", - "optional": true + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "license": "ISC" }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "license": "MIT" + }, + "node_modules/secp256k1": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.1.tgz", + "integrity": "sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==", + "hasInstallScript": true, "license": "MIT", "dependencies": { - "semver": "^6.3.0" + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/secp256k1/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, + "node_modules/secure-json-parse": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-3.0.2.tgz", + "integrity": "sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" - } - }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "license": "MIT", - "engines": { - "node": ">=8" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -32055,81 +19104,26 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -32139,6 +19133,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "devOptional": true, "license": "ISC" }, "node_modules/set-function-length": { @@ -32162,6 +19157,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -32173,6 +19169,21 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -32186,44 +19197,30 @@ "license": "ISC" }, "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" }, "bin": { "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shacl-engine": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/shacl-engine/-/shacl-engine-0.1.5.tgz", - "integrity": "sha512-M/1ZaIvrgFyTQKtCgeZCk6IXqpStEd3dj192a5KD/JCksEWw7Gs4BrMgpoH8lR3MbHW7YOH+qABzr5Lo1MFnJg==", - "license": "MIT", - "dependencies": { - "@rdfjs/namespace": "^2.0.0", - "@rdfjs/term-map": "^2.0.0", - "@rdfjs/term-set": "^2.0.1", - "@rdfjs/to-ntriples": "^2.0.0", - "grapoi": "^1.1.1", - "lodash": "^4.17.21", - "rdf-literal": "^1.3.1", - "rdf-validation": "^0.1.0" - } - }, - "node_modules/shacl-engine/node_modules/@rdfjs/to-ntriples": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@rdfjs/to-ntriples/-/to-ntriples-2.0.0.tgz", - "integrity": "sha512-nDhpfhx6W6HKsy4HjyLp3H1nbrX1CiUCWhWQwKcYZX1s9GOjcoQTwY7GUUbVec0hzdJDQBR6gnjxtENBDt482Q==", - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -32236,108 +19233,18 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shelljs/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/shelljs/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/shelljs/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/shiki": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", - "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", - "license": "MIT", - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, "engines": { "node": ">= 0.4" }, @@ -32345,107 +19252,89 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "license": "MIT", - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/signale/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/signale/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signale/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signale/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/simple-concat": { @@ -32493,32 +19382,18 @@ "simple-concat": "^1.0.0" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, "node_modules/sinon": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", - "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.5.tgz", + "integrity": "sha512-r15s9/s+ub/d4bxNXqIUmwp6imVSdTorIRaxoecYjqTVLZ8RuoXr/4EDGwIBo6Waxn7f2gnURX9zuhAfCwaF6Q==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/samsam": "^8.0.0", - "diff": "^5.1.0", - "nise": "^5.1.5", + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.5", + "@sinonjs/samsam": "^8.0.1", + "diff": "^7.0.0", + "nise": "^6.1.1", "supports-color": "^7.2.0" }, "funding": { @@ -32526,56 +19401,16 @@ "url": "https://opencollective.com/sinon" } }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sirv/node_modules/@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", - "license": "MIT" - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -32588,13 +19423,13 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "devOptional": true, "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -32603,13 +19438,13 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.1", + "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" }, @@ -32617,72 +19452,27 @@ "node": ">= 14" } }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/solid-namespace": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/solid-namespace/-/solid-namespace-0.5.3.tgz", - "integrity": "sha512-b2u2qkrRa0yrcc/jh6Nv0/mkwMyL4fMSNZtKG4dv3IxQtZOEUB8O6Xe7GrkoQaRoGrbUxRzbve9GHJD0w7p+KA==", - "license": "MIT", - "dependencies": { - "standard": "^17.0.0" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/spawn-command": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", "dev": true }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "license": "MIT" - }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^2.0.0", @@ -32696,78 +19486,38 @@ "node": ">=8" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "license": "CC0-1.0" - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "license": "MIT", + "node_modules/spawn-wrap/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "license": "ISC", "dependencies": { - "through": "2" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": "*" + "node": ">=8.0.0" } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "license": "ISC", - "dependencies": { - "readable-stream": "^3.0.0" - } + "node_modules/spawn-wrap/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } + "node_modules/split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", + "license": "ISC" }, "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "devOptional": true, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/sqlite3": { @@ -32794,290 +19544,134 @@ } } }, - "node_modules/sqlite3/node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "node_modules/sqlite3/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.0.tgz", - "integrity": "sha512-jaDqlNSzLtWYW4lvQmU0EnxWMUGQiwHasZl5ZEIwx3S/ijZDjZOzs1y1QqKwKs5vqnFpGtizo4NOYX2s0Voq/g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "eslint": "^8.41.0", - "eslint-config-standard": "17.1.0", - "eslint-config-standard-jsx": "^11.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.32.2", - "standard-engine": "^15.0.0", - "version-guard": "^1.1.1" - }, - "bin": { - "standard": "bin/cmd.cjs" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/standard-engine": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", - "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "get-stdin": "^8.0.0", - "minimist": "^1.2.6", - "pkg-conf": "^3.1.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/standard-engine/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/standard-engine/node_modules/load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/sqlite3/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" }, - "node_modules/standard-engine/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", + "node_modules/sqlite3/node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/standard-engine/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", + "node_modules/ssh2": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz", + "integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==", + "hasInstallScript": true, "dependencies": { - "p-try": "^2.0.0" + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" }, "engines": { - "node": ">=6" + "node": ">=10.16.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "cpu-features": "~0.0.10", + "nan": "^2.23.0" } }, - "node_modules/standard-engine/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/ssh2/node_modules/nan": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz", + "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==", "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } + "optional": true }, - "node_modules/standard-engine/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "license": "MIT", + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "license": "ISC", + "optional": true, "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "minipass": "^3.1.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/standard-engine/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-engine/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "engines": { - "node": ">=6" + "node": ">= 8" } }, - "node_modules/standard-engine/node_modules/pkg-conf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", - "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", - "license": "MIT", + "node_modules/ssri/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, "dependencies": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/standard-engine/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/standard-engine/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=6" + "node": "*" } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, "license": "MIT", - "dependencies": { - "bl": "^5.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, "license": "MIT", "dependencies": { - "internal-slot": "^1.0.4" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/stream-chunks": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-chunks/-/stream-chunks-1.0.0.tgz", @@ -33088,45 +19682,49 @@ "string_decoder": "^1.3.0" } }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "license": "MIT", - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-combiner2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/stream-combiner2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/stream-chunks/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/stream-combiner2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } + "node_modules/stream-chunks/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" }, "node_modules/stream-concat": { "version": "1.0.0", @@ -33137,15 +19735,6 @@ "node": ">=12" } }, - "node_modules/stream-to-it": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-1.0.1.tgz", - "integrity": "sha512-AqHYAYPHcmvMrcLNgncE/q0Aj/ajP6A4qGhxP6EVn7K3YTNs0bJpJyk57wc2Heb7MUL64jurvmnmui8D9kjZgA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "it-stream-types": "^2.0.1" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -33155,79 +19744,96 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "license": "MIT", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -33240,6 +19846,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, "license": "MIT", "dependencies": { "define-properties": "^1.1.3", @@ -33247,15 +19854,19 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -33265,15 +19876,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -33282,6 +19898,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -33307,31 +19924,35 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-5.0.0.tgz", - "integrity": "sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -33340,69 +19961,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-outer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT" }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, "node_modules/super-regex": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz", @@ -33421,34 +20004,6 @@ } }, "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -33464,6 +20019,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -33472,46 +20028,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@pkgr/core": "^0.2.9" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" + "url": "https://opencollective.com/synckit" } }, "node_modules/table-layout": { @@ -33527,194 +20057,26 @@ "node": ">=12.17" } }, - "node_modules/table-layout/node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tape": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.8.1.tgz", - "integrity": "sha512-pUzADXBVYm5Jkneh9hfXnirADrzQrDA3vddKbPOc/ZLORj4dFQ6GR1KdGWX0/NvOLDcYkVgeMdw78Uf6BzO3KA==", - "license": "MIT", - "dependencies": { - "@ljharb/resumer": "^0.1.3", - "@ljharb/through": "^2.3.13", - "array.prototype.every": "^1.1.6", - "call-bind": "^1.0.7", - "deep-equal": "^2.2.3", - "defined": "^1.0.1", - "dotignore": "^0.1.2", - "for-each": "^0.3.3", - "get-package-type": "^0.1.0", - "glob": "^7.2.3", - "has-dynamic-import": "^2.1.0", - "hasown": "^2.0.2", - "inherits": "^2.0.4", - "is-regex": "^1.1.4", - "minimist": "^1.2.8", - "mock-property": "^1.0.3", - "object-inspect": "^1.13.1", - "object-is": "^1.1.6", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "resolve": "^2.0.0-next.5", - "string.prototype.trim": "^1.2.9" - }, - "bin": { - "tape": "bin/tape" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tape/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/tape/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tape/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tape/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "license": "MIT", "dependencies": { "chownr": "^1.1.1", @@ -33745,41 +20107,6 @@ "node": ">=6" } }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/tar-stream/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -33794,71 +20121,41 @@ "node": ">= 6" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "license": "MIT", + "node_modules/tar/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/tempy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-2.0.0.tgz", - "integrity": "sha512-m+QReZVhpa0Y56fmfoLFRZN4aDFdd3qVd8a9k3RfyTw/1utVYNg+Ar4BY6l4/TlkhYCCJFfhYWt9uy0127buJg==", + "node_modules/tar/node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "license": "MIT", "dependencies": { - "del": "^6.0.0", - "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^2.0.0", - "unique-string": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "minipass": "^7.1.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 18" } }, - "node_modules/tempy/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", @@ -33870,9 +20167,10 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -33883,7 +20181,8 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -33904,6 +20203,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -33912,15 +20212,6 @@ "node": "*" } }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -33931,37 +20222,9 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, "license": "MIT" }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -33983,44 +20246,89 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/timers-ext": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", - "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", - "license": "ISC", + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", "dependencies": { - "es5-ext": "^0.10.64", - "next-tick": "^1.1.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=0.12" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.6.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -34038,33 +20346,13 @@ "node": ">=0.6" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, "license": "MIT" }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -34075,36 +20363,6 @@ "tree-kill": "cli.js" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/triple-beam": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", @@ -34114,22 +20372,19 @@ "node": ">= 14.0.0" } }, - "node_modules/trouter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/trouter/-/trouter-2.0.1.tgz", - "integrity": "sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==", - "license": "MIT", + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "license": "WTFPL", "dependencies": { - "matchit": "^1.0.0" - }, - "engines": { - "node": ">=6" + "utf8-byte-length": "^1.0.1" } }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, "license": "MIT", "engines": { @@ -34139,71 +20394,11 @@ "typescript": ">=4.2.0" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/ts-node/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", @@ -34216,6 +20411,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, "license": "MIT", "dependencies": { "minimist": "^1.2.0" @@ -34227,147 +20423,57 @@ "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsoa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tsoa/-/tsoa-5.1.1.tgz", - "integrity": "sha512-U6+5CyD3+u9Dtza0fBnv4+lgmbZEskYljzRpKf3edGCAGtMKD2rfjtDw9jUdTfWb1FEDvsnR3pRvsSGBXaOdsA==", - "license": "MIT", - "dependencies": { - "@tsoa/cli": "^5.1.1", - "@tsoa/runtime": "^5.0.0" - }, - "bin": { - "tsoa": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "yarn": ">=1.9.4" - } - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils-etc": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/tsutils-etc/-/tsutils-etc-1.4.2.tgz", - "integrity": "sha512-2Dn5SxTDOu6YWDNKcx1xu2YUy6PUeKrWZB/x2cQ8vY2+iz3JRembKn/iZ0JLT1ZudGNwQQvtFX9AwvRHbXuPUg==", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "license": "MIT", - "dependencies": { - "@types/yargs": "^17.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "ts-flags": "bin/ts-flags", - "ts-kind": "bin/ts-kind" - }, - "peerDependencies": { - "tsutils": "^3.0.0", - "typescript": ">=4.0.0" + "engines": { + "node": ">=4" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tsx": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz", - "integrity": "sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "~0.18.20", - "get-tsconfig": "^4.7.2", - "source-map-support": "^0.5.21" + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" }, "bin": { "tsx": "dist/cli.mjs" }, + "engines": { + "node": ">=18.0.0" + }, "optionalDependencies": { "fsevents": "~2.3.3" } }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "tslib": "^1.9.3" }, "engines": { - "node": ">=12" - }, - "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" + "node": ">= 6.0.0" } }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -34380,16 +20486,17 @@ "node": "*" } }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "license": "ISC" + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -34402,6 +20509,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -34411,6 +20519,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -34433,30 +20542,31 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -34466,17 +20576,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -34486,17 +20598,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -34509,91 +20622,40 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, - "node_modules/typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "license": "Apache-2.0", - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" - } - }, - "node_modules/typedoc-plugin-mdn-links": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/typedoc-plugin-mdn-links/-/typedoc-plugin-mdn-links-2.0.2.tgz", - "integrity": "sha512-Fzjvfsj3rxvmZNqWRvq9JTGBkOkrPp0kBtvJCJ4U5Jm14OF1KoRErtmwgVQcPLA5Xs8h5I/W4uZBaL8SDHsgxQ==", - "license": "MIT", - "peerDependencies": { - "typedoc": "0.22.x || 0.23.x" - } - }, - "node_modules/typedoc-plugin-missing-exports": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-1.0.0.tgz", - "integrity": "sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA==", - "license": "MIT", - "peerDependencies": { - "typedoc": "0.22.x || 0.23.x" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.17" } }, "node_modules/uglify-js": { - "version": "3.19.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.2.tgz", - "integrity": "sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, "license": "BSD-2-Clause", "optional": true, "bin": { @@ -34660,104 +20722,37 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, "engines": { - "node": ">=14.0" + "node": ">=18.17" } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "license": "MIT" }, "node_modules/unique-filename": { @@ -34780,89 +20775,23 @@ "imurmurhash": "^0.1.4" } }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "dev": true, "license": "ISC" }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/unlimited-timeout": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unlimited-timeout/-/unlimited-timeout-0.1.0.tgz", + "integrity": "sha512-D4g+mxFeQGQHzCfnvij+R35ukJ0658Zzudw7j16p4tBBbNasKkKM4SocYxqhwT5xA7a9JYWDzKkEFyMlRi5sng==", "license": "MIT", "engines": { - "node": ">= 10.0.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/unpipe": { @@ -34875,9 +20804,10 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, "funding": [ { "type": "opencollective", @@ -34889,119 +20819,26 @@ }, { "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "license": "MIT", "dependencies": { - "ci-info": "^3.2.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/update-notifier/node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "license": "MIT", - "engines": { - "node": ">=12" + "update-browserslist-db": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -35032,6 +20869,18 @@ "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "license": "MIT" }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/utf8-codec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utf8-codec/-/utf8-codec-1.0.0.tgz", + "integrity": "sha512-S/QSLezp3qvG4ld5PUfXiH7mCFxLKjSVZRFkB3DOjgwHuJPFDkInAXc/anf7BAbHt/D38ozDzL+QMZ6/7gsI6w==", + "license": "MIT" + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -35061,108 +20910,20 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, "node_modules/validate-iri": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/validate-iri/-/validate-iri-1.0.1.tgz", "integrity": "sha512-gLXi7351CoyVVQw8XE5sgpYawRKatxE7kj/xmCxXOZS1kMdtcqC0ILIqLuVEVnAUQSL/evOGG3eQ+8VgbdnstA==", "license": "MIT" }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/validator": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", - "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "license": "MIT" - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -35172,62 +20933,32 @@ "node": ">= 0.8" } }, - "node_modules/version-guard": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.2.tgz", - "integrity": "sha512-D8d+YxCUpoqtCnQzDxm6SF7DLU3gr2535T4khAtMq4osBahsQnmSxuwXFdrbAdDGG8Uokzfis/jvyeFPdmlc7w==", - "license": "0BSD", - "engines": { - "node": ">=0.10.48" - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "license": "MIT" - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "license": "MIT" - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/weald": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/weald/-/weald-1.0.2.tgz", - "integrity": "sha512-iG5cIuBwsPe1ZcoGGd4X6QYlepU1vLr4l4oWpzQWqeJPSo9B8bxxyE6xlnj3TCmThtha7gyVL+uuZgUFkPyfDg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/weald/-/weald-1.1.1.tgz", + "integrity": "sha512-PaEQShzMCz8J/AD2N3dJMc1hTZWkJeLKS2NMeiVkV5KDHwgZe7qXLEzyodsT/SODxWDdXJJqocuwf3kHzcXhSQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "ms": "^3.0.0-canary.1", - "supports-color": "^9.4.0" + "supports-color": "^10.0.0" } }, "node_modules/weald/node_modules/ms": { - "version": "3.0.0-canary.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.1.tgz", - "integrity": "sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==", + "version": "3.0.0-canary.202508261828", + "resolved": "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.202508261828.tgz", + "integrity": "sha512-NotsCoUCIUkojWCzQff4ttdCfIPoA1UGZsyQbi7KmqkNRfKCrvga8JJi2PknHymHOuor0cJSn/ylj52Cbt2IrQ==", "license": "MIT", "engines": { - "node": ">=12.13" + "node": ">=18" } }, "node_modules/weald/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" @@ -35242,16 +20973,31 @@ "node": ">= 8" } }, + "node_modules/webcrypto-core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz", + "integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.13", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.5", + "tslib": "^2.7.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -35275,6 +21021,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "devOptional": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -35287,39 +21034,45 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -35328,10 +21081,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, "license": "MIT", "dependencies": { "is-map": "^2.0.3", @@ -35350,18 +21111,21 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, "license": "ISC" }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -35377,224 +21141,72 @@ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "license": "ISC", "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wildcard-match": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.3.tgz", - "integrity": "sha512-a95hPUk+BNzSGLntNXYxsjz2Hooi5oL7xOfJR6CKwSsSALh7vUNuTlzsrZowtYy38JNduYFRVhFv19ocqNOZlg==", - "dev": true, - "license": "ISC" - }, - "node_modules/windows-release": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.1.1.tgz", - "integrity": "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.1.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/windows-release/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/windows-release/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT", - "engines": { - "node": ">=6" - } + "optional": true }, - "node_modules/windows-release/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "optional": true, "dependencies": { - "path-key": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/windows-release/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/wildcard-match": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.4.tgz", + "integrity": "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==", + "dev": true, + "license": "ISC" + }, + "node_modules/windows-release": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-6.1.0.tgz", + "integrity": "sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "execa": "^8.0.1" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/windows-release/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/winston": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.14.2.tgz", - "integrity": "sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg==", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", + "@dabh/diagnostics": "^2.0.8", "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.6.0", + "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.7.0" + "winston-transport": "^4.9.0" }, "engines": { "node": ">= 12.0.0" @@ -35619,12 +21231,12 @@ } }, "node_modules/winston-transport": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.1.tgz", - "integrity": "sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", "dependencies": { - "logform": "^2.6.1", + "logform": "^2.7.0", "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" }, @@ -35646,21 +21258,6 @@ "node": ">= 6" } }, - "node_modules/winston/node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/winston/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "license": "MIT" - }, "node_modules/winston/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -35691,6 +21288,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -35700,77 +21298,124 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, "license": "MIT" }, "node_modules/wordwrapjs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", - "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", + "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", "license": "MIT", "engines": { "node": ">=12.17" } }, "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", + "dev": true, "license": "Apache-2.0" }, "node_modules/wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "license": "MIT", "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/wrappy": { @@ -35783,6 +21428,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -35791,10 +21437,17 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -35812,19 +21465,26 @@ } } }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "license": "MIT", "dependencies": { "sax": ">=0.6.0", @@ -35849,15 +21509,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "license": "MIT" }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -35873,87 +21524,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yamljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", - "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "glob": "^7.0.5" - }, - "bin": { - "json2yaml": "bin/json2yaml", - "yaml2json": "bin/yaml2json" - } - }, - "node_modules/yamljs/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/yamljs/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/yamljs/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/yamljs/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/yamljs/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -35985,6 +21555,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, "license": "MIT", "dependencies": { "camelcase": "^6.0.0", @@ -36000,6 +21571,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -36012,6 +21584,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -36020,14 +21593,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", @@ -36043,29 +21613,11 @@ "node": ">=8" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-4.0.0.tgz", - "integrity": "sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -36074,10 +21626,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoctocolors-cjs": { + "node_modules/yoctocolors": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", "dev": true, "license": "MIT", "engines": { @@ -36087,14 +21639,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/colinhacks" } } } diff --git a/package.json b/package.json index 31a95506f..8c053f6e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocean-node", - "version": "0.2.0", + "version": "0.2.3", "description": "Ocean Node is used to run all core services in the Ocean stack", "author": "Ocean Protocol Foundation", "license": "Apache-2.0", @@ -10,16 +10,14 @@ "url": "https://github.com/oceanprotocol/ocean-node/issues" }, "scripts": { - "build": "npm run clean && npm run check-changes && npm run build:tsc", - "build:no-dashboard": "npm run clean && npm run build:tsc", + "build": "npm run clean && npm run build:tsc", "build:tsc": "tsc --sourceMap", + "build:controlpanel": "cd controlpanel && npm install --maxsockets 1 && NODE_ENV=production npx next build", "quickstart": "bash scripts/ocean-node-quickstart.sh", "setupEnv": "bash -c './src/helpers/scripts/setupNodeEnv.sh && source .env'", - "build-tests:tsc": "tsc --sourceMap --sourceRoot ./src/test && cp ./src/test/.env.test ./dist/test", - "build:dashboard": "cd dashboard && npm install --maxsockets 1 && NODE_ENV=production npx next build", - "check-changes": "node scripts/dashboardChanges.js", + "build-tests:tsc": "tsc --sourceMap --sourceRoot ./src/test && cp ./src/test/.env.test ./dist/test && cp ./src/test/.env.test2 ./dist/test && cp ./src/test/config.json $HOME/config.json", "client": "mkdir -p ./dist/helpers/scripts/output && node dist/helpers/scripts/clientExample.js", - "clean": "if [ -d ./dist ]; then find ./dist -mindepth 1 -not -path './dist/dashboard*' -delete; fi", + "clean": "if [ -d ./dist ]; then find ./dist -mindepth 1 -not -path './dist/controlpanel*' -delete; fi", "clean:all": "rm -rf ./dist/ ./doc/ ./.nyc_output", "build-tests": "rm -rf ./dist/test && npm run build-tests:tsc", "start": "node --max-old-space-size=28784 --trace-warnings --experimental-specifier-resolution=node dist/index.js", @@ -33,6 +31,8 @@ "test": "npm run lint && npm run test:unit:cover && npm run test:integration:cover", "test:unit": "npm run build-tests && npm run mocha \"./dist/test/unit/**/*.test.js\"", "test:integration": "npm run build-tests && npm run mocha \"./dist/test/integration/**/*.test.js\"", + "test:computeunit": "npm run build-tests && npm run mocha \"./dist/test/unit/compute.test.js\"", + "test:computeintegration": "npm run build-tests && npm run mocha \"./dist/test/integration/compute.test.js\"", "test:indexer": "npm run build-tests && npm run mocha \"./dist/test/integration/indexer.test.js\"", "test:integration:light": "npm run build-tests && npm run mocha-light \"./dist/test/integration/**/*.test.js\"", "test:unit:cover": "nyc --report-dir coverage/unit npm run test:unit", @@ -45,91 +45,80 @@ "test:stress": "npm run test:k6-common k6 run -e TEST_TYPE=stress \"./dist/test/performance/perf_test.js\"", "test:request:rate": "npm run test:k6-common && k6 run -e RATE=true \"./dist/test/performance/perf_test.js\"", "release": "release-it --non-interactive", - "changelog": "auto-changelog -p" + "changelog": "auto-changelog -p", + "postinstall": "node scripts/fix-libp2p-http-utils.js" }, "dependencies": { "@aws-sdk/client-s3": "^3.554.0", - "@chainsafe/libp2p-gossipsub": "^13.1.0", - "@chainsafe/libp2p-noise": "^15.1.0", - "@chainsafe/libp2p-yamux": "^6.0.2", + "@chainsafe/libp2p-noise": "^17.0.0", + "@chainsafe/libp2p-yamux": "^8.0.1", "@elastic/elasticsearch": "^8.14.0", - "@libp2p/autonat": "^1.1.1", - "@libp2p/bootstrap": "^10.1.1", - "@libp2p/circuit-relay-v2": "^1.1.1", - "@libp2p/crypto": "^4.1.5", - "@libp2p/dcutr": "^1.1.1", - "@libp2p/floodsub": "^9.1.1", - "@libp2p/identify": "^2.1.1", - "@libp2p/interface": "^1.6.0", - "@libp2p/interface-address-manager": "^3.0.1", - "@libp2p/kad-dht": "^12.1.1", - "@libp2p/mdns": "^10.1.1", - "@libp2p/peer-id": "^4.1.4", - "@libp2p/peer-id-factory": "^4.1.4", - "@libp2p/ping": "^1.1.1", - "@libp2p/pubsub": "^9.0.22", - "@libp2p/pubsub-peer-discovery": "^10.0.2", - "@libp2p/tcp": "^9.1.1", - "@libp2p/upnp-nat": "^1.2.1", - "@libp2p/websockets": "^8.1.1", - "@multiformats/multiaddr": "^10.2.0", - "@oceanprotocol/contracts": "^2.2.0", - "@rdfjs/dataset": "^2.0.1", - "@rdfjs/types": "^1.1.0", - "@types/lodash.clonedeep": "^4.5.7", - "@types/n3": "^1.16.4", - "@types/rdf-ext": "^2.2.5", - "@types/rdf-utils-fs": "^2.1.5", - "@types/rdfjs__data-model": "^2.0.7", - "@types/rdfjs__dataset": "^2.0.7", - "@types/rdfjs__parser-jsonld": "^2.1.6", - "@types/rdfjs__to-ntriples": "^2.0.6", - "@zazuko/env-node": "^2.1.3", - "aegir": "^37.3.0", - "aws-sdk": "^2.1591.0", - "axios": "^1.7.4", + "@ipshipyard/libp2p-auto-tls": "^2.0.1", + "@libp2p/autonat": "^3.0.9", + "@libp2p/bootstrap": "^12.0.10", + "@libp2p/circuit-relay-v2": "^4.1.2", + "@libp2p/crypto": "^5.1.13", + "@libp2p/dcutr": "^3.0.9", + "@libp2p/identify": "^4.0.9", + "@libp2p/kad-dht": "^16.1.2", + "@libp2p/keychain": "^6.0.9", + "@libp2p/mdns": "^12.0.10", + "@libp2p/peer-id": "^6.0.4", + "@libp2p/peer-id-factory": "^4.2.4", + "@libp2p/ping": "^3.0.9", + "@libp2p/pubsub": "^10.1.18", + "@libp2p/pubsub-peer-discovery": "^12.0.0", + "@libp2p/tcp": "^11.0.9", + "@libp2p/tls": "^3.0.10", + "@libp2p/upnp-nat": "^4.0.9", + "@libp2p/websockets": "^10.1.2", + "@multiformats/multiaddr": "^12.2.3", + "@oceanprotocol/contracts": "^2.5.0", + "@oceanprotocol/ddo-js": "^0.2.0", + "aws-sdk": "^2.1693.0", + "axios": "^1.12.0", "base58-js": "^2.0.0", "cors": "^2.8.5", + "datastore-level": "^12.0.2", "delay": "^5.0.0", + "dockerode": "^4.0.5", "dotenv": "^16.3.1", "eciesjs": "^0.4.5", "eth-crypto": "^2.6.0", "ethers": "^6.8.1", "express": "^4.21.1", + "humanhash": "^1.0.4", "hyperdiff": "^2.0.16", - "ip": "^2.0.1", + "ipaddr.js": "^2.3.0", "it-pipe": "^3.0.1", - "libp2p": "^1.8.0", - "lodash.clonedeep": "^4.5.0", + "jsonwebtoken": "^9.0.2", + "libp2p": "^3.1.2", + "lodash": "^4.17.23", "lzma-purejs-requirejs": "^1.0.0", - "n3": "^1.17.2", "node-cron": "^3.0.3", - "private-ip": "^3.0.2", - "rdf-utils-fs": "^3.0.0", - "rdf-validate-shacl": "^0.5.5", - "rdflib": "^2.2.33", - "shacl-engine": "^0.1.2", - "sinon": "^17.0.1", "sqlite3": "^5.1.7", "stream-concat": "^1.0.0", - "ts-node": "^10.9.1", - "tsoa": "^5.1.1", + "tar": "^7.5.7", "uint8arrays": "^4.0.6", "url-join": "^5.0.0", "winston": "^3.11.0", "winston-daily-rotate-file": "^4.7.1", - "winston-transport": "^4.6.0" + "winston-transport": "^4.6.0", + "zod": "^3.25.76" }, "devDependencies": { "@types/chai": "^4.3.10", "@types/cors": "^2.8.17", + "@types/dockerode": "^3.3.31", "@types/express": "^4.17.17", "@types/ip": "^1.1.3", - "@types/lzma-native": "^4.0.4", - "@types/mocha": "^10.0.4", - "@types/node": "^20.14.2", + "@types/jsonwebtoken": "^9.0.9", + "@types/lodash": "^4.17.21", + "@types/mocha": "^10.0.10", + "@types/node": "^25.0.3", "@types/node-cron": "^3.0.11", - "@types/rdfjs__formats-common": "^3.1.5", + "@types/sinon": "^17.0.4", + "@types/tar-stream": "^3.1.4", "@typescript-eslint/eslint-plugin": "^6.8.0", "@typescript-eslint/parser": "^6.8.0", "auto-changelog": "^2.4.0", @@ -140,10 +129,27 @@ "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-promise": "^6.1.1", - "mocha": "^10.2.0", - "prettier": "^3.0.3", - "release-it": "^17.6.0", - "tsx": "^3.12.8" + "mocha": "^11.1.0", + "nyc": "^17.1.0", + "prettier": "^3.7.4", + "release-it": "^19.0.6", + "sinon": "^19.0.2", + "tsx": "^4.19.3", + "typescript": "^5.9.3" + }, + "overrides": { + "elliptic": "^6.6.1", + "tough-cookie": "^4.1.3", + "xml2js": "^0.5.0", + "semver": "^7.5.2", + "tmp": "^0.2.3", + "base64url": "^3.0.1", + "eth-crypto": { + "secp256k1": "^5.0.0" + }, + "eccrypto": { + "secp256k1": "^5.0.0" + } }, "release-it": { "hooks": { diff --git a/schemas/4.1.0.ttl b/schemas/4.1.0.ttl deleted file mode 100644 index 3ec5662a1..000000000 --- a/schemas/4.1.0.ttl +++ /dev/null @@ -1,395 +0,0 @@ -@prefix dash: . -@prefix rdf: . -@prefix rdfs: . -@prefix schema: . -@prefix sh: . -@prefix xsd: . - -schema:DDOShape - sh:targetClass schema:DDO ; - sh:property [ - sh:path schema:id ; - sh:datatype xsd:string ; - sh:pattern "^did\\:op\\:(.*)$" ; - sh:minCount 1 ; - sh:maxCount 1 ; - ] ; - sh:property [ - sh:path schema:version ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1 ; - sh:maxCount 1 ; - ] ; - sh:property [ - sh:path schema:chainId; - sh:datatype xsd:integer ; - sh:minCount 1 ; - sh:maxCount 1 ; - ] ; - sh:property [ - sh:path schema:nftAddress; - sh:datatype xsd:string ; - sh:minCount 1 ; - sh:maxCount 1 ; - ] ; - sh:property [ - sh:path schema:metadata ; - sh:node schema:MetadataShape ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:services ; - sh:node schema:ServiceShape ; - sh:minCount 1; - ] ; - sh:property [ - sh:path schema:credentials; - sh:node schema:CredentialsShape ; - ] ; . - - -schema:MetadataShape - sh:targetClass schema:Metadata ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:copyrightHolder; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:name ; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:type; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:author; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:license; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:links; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - ] ; - sh:property [ - sh:path schema:tags; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - ] ; - sh:property [ - sh:path schema:categories; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - ] ; - sh:property [ - sh:path schema:contentLanguage; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:additionalInformation; - ] ; - sh:property [ - sh:path schema:created; - sh:datatype xsd:string; -# sh:pattern "^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])(\.[0-9]{3})?Z$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:updated; - sh:datatype xsd:string; -# sh:pattern "^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])(\.[0-9]{3})?Z$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:algorithm; - sh:node schema:AlgorithmShape ; - sh:maxCount 1; - ] ;. - - -schema:AlgorithmShape - sh:targetClass schema:Algorithm ; - sh:property [ - sh:path schema:version ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:language ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:container ; - sh:node schema:ContainerShape ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:consumerParameters; - sh:node schema:ConsumerParametersShape ; - ] ;. - - -schema:ConsumerParametersShape - sh:targetClass schema:ConsumerParameter ; - sh:property [ - sh:path schema:name; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:type; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:label; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:required ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:default; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:options; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - ] ;. - - -schema:ContainerShape - sh:targetClass schema:Container ; - sh:property [ - sh:path schema:entrypoint ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:image ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:tag ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:checksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ;. - - -schema:ServiceShape - sh:targetClass schema:Service ; - sh:property [ - sh:path schema:id ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:type ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:name ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:datatokenAddress ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:serviceEndpoint ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:files; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:timeout ; - sh:datatype xsd:integer ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:compute; - sh:node schema:ComputeShape ; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:additionalInformation ; - ] ; - sh:property [ - sh:path schema:consumerParameters; - sh:node schema:ConsumerParametersShape ; - ] ;. - - -schema:ComputeShape - sh:targetClass schema:Compute ; - sh:property [ - sh:path schema:allowRawAlgorithm ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:allowNetworkAccess ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:publisherTrustedAlgorithmPublishers ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - ] ; - sh:property [ - sh:path schema:publisherTrustedAlgorithms; - sh:node schema:TrustedAlgoShape ; - ] ; . - - -schema:TrustedAlgoShape - sh:targetClass schema:TrustedAlgo; - sh:property [ - sh:path schema:did ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:filesChecksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:containerSectionChecksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; . - - -schema:CredentialsShape - sh:targetClass schema:Credentials; - sh:property [ - sh:path schema:deny ; - sh:node schema:CredentialsItemShape; - ] ; - sh:property [ - sh:path schema:allow; - sh:node schema:CredentialsItemShape; - ] ; . - - -schema:CredentialsItemShape - sh:targetClass schema:CredentialsItem; - sh:property [ - sh:path schema:type ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:values ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - ] ; . \ No newline at end of file diff --git a/schemas/4.3.0.ttl b/schemas/4.3.0.ttl deleted file mode 100644 index 5c67a3653..000000000 --- a/schemas/4.3.0.ttl +++ /dev/null @@ -1,446 +0,0 @@ -@prefix dash: . -@prefix rdf: . -@prefix rdfs: . -@prefix schema: . -@prefix sh: . -@prefix xsd: . - -schema:DDOShape - sh:targetClass schema:DDO ; - sh:property [ - sh:path schema:id ; - sh:datatype xsd:string ; - sh:pattern "^did\\:op\\:(.*)$" ; - sh:minCount 1 ; - sh:maxCount 1 ; - sh:maxLength 71; - sh:minLength 71; - ] ; - sh:property [ - sh:path schema:version ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1 ; - sh:maxCount 1 ; - sh:maxLength 16; - ] ; - sh:property [ - sh:path schema:chainId; - sh:datatype xsd:integer ; - sh:minCount 1 ; - sh:maxCount 1 ; - ] ; - sh:property [ - sh:path schema:nftAddress; - sh:datatype xsd:string ; - sh:minCount 1 ; - sh:maxCount 1 ; - sh:minLength 42; - sh:maxLength 42; - ] ; - sh:property [ - sh:path schema:metadata ; - sh:node schema:MetadataShape ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:services ; - sh:node schema:ServiceShape ; - sh:minCount 1; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:credentials; - sh:node schema:CredentialsShape ; - sh:maxCount 64; - ] ; . - - -schema:MetadataShape - sh:targetClass schema:Metadata ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 7000; - ] ; - sh:property [ - sh:path schema:copyrightHolder; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxCount 1; - sh:maxLength 512; - ] ; - sh:property [ - sh:path schema:name ; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 512; - ] ; - sh:property [ - sh:path schema:type; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:author; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:license; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:links; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxLength 512; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:tags; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxLength 256; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:categories; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxLength 256; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:contentLanguage; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:additionalInformation; - ] ; - sh:property [ - sh:path schema:created; - sh:datatype xsd:string; -# sh:pattern "^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])(\.[0-9]{3})?Z$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:updated; - sh:datatype xsd:string; -# sh:pattern "^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])(\.[0-9]{3})?Z$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:algorithm; - sh:node schema:AlgorithmShape ; - sh:maxCount 1; - ] ;. - - -schema:AlgorithmShape - sh:targetClass schema:Algorithm ; - sh:property [ - sh:path schema:version ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:language ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:container ; - sh:node schema:ContainerShape ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:consumerParameters; - sh:node schema:ConsumerParametersShape ; - sh:maxCount 64; - ] ;. - - -schema:ConsumerParametersShape - sh:targetClass schema:ConsumerParameter ; - sh:property [ - sh:path schema:name; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:type; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:label; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:required ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 7000; - ] ; - sh:property [ - sh:path schema:default; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:options; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxLength 256; - ] ;. - - -schema:ContainerShape - sh:targetClass schema:Container ; - sh:property [ - sh:path schema:entrypoint ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:image ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:tag ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:checksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxLength 512; - sh:minLength 7; - sh:minCount 1; - sh:maxCount 1; - ] ;. - - -schema:ServiceShape - sh:targetClass schema:Service ; - sh:property [ - sh:path schema:id ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:type ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:name ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - sh:minLength 4; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:maxCount 1; - sh:minLength 10; - sh:maxLength 7000; - ] ; - sh:property [ - sh:path schema:datatokenAddress ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 42; - sh:maxLength 42; - ] ; - sh:property [ - sh:path schema:serviceEndpoint ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 10; - sh:maxLength 2048; - ] ; - sh:property [ - sh:path schema:files; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 8192; - ] ; - sh:property [ - sh:path schema:timeout ; - sh:datatype xsd:integer ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:compute; - sh:node schema:ComputeShape ; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:additionalInformation ; - ] ; - sh:property [ - sh:path schema:consumerParameters; - sh:node schema:ConsumerParametersShape ; - ] ;. - - -schema:ComputeShape - sh:targetClass schema:Compute ; - sh:property [ - sh:path schema:allowRawAlgorithm ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:allowNetworkAccess ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:publisherTrustedAlgorithmPublishers ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:publisherTrustedAlgorithms; - sh:node schema:TrustedAlgoShape ; - ] ; . - - -schema:TrustedAlgoShape - sh:targetClass schema:TrustedAlgo; - sh:property [ - sh:path schema:did ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:filesChecksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 1024; - ] ; - sh:property [ - sh:path schema:containerSectionChecksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 1024; - ] ; . - - -schema:CredentialsShape - sh:targetClass schema:Credentials; - sh:property [ - sh:path schema:deny ; - sh:node schema:CredentialsItemShape; - ] ; - sh:property [ - sh:path schema:allow; - sh:node schema:CredentialsItemShape; - ] ; . - - -schema:CredentialsItemShape - sh:targetClass schema:CredentialsItem; - sh:property [ - sh:path schema:type ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:values ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxLength 1024; - ] ; . \ No newline at end of file diff --git a/schemas/4.5.0.ttl b/schemas/4.5.0.ttl deleted file mode 100644 index bb17c9566..000000000 --- a/schemas/4.5.0.ttl +++ /dev/null @@ -1,451 +0,0 @@ -@prefix dash: . -@prefix rdf: . -@prefix rdfs: . -@prefix schema: . -@prefix sh: . -@prefix xsd: . - -schema:DDOShape - sh:targetClass schema:DDO ; - sh:property [ - sh:path schema:id ; - sh:datatype xsd:string ; - sh:pattern "^did\\:op\\:(.*)$" ; - sh:minCount 1 ; - sh:maxCount 1 ; - sh:maxLength 71; - sh:minLength 71; - ] ; - sh:property [ - sh:path schema:version ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1 ; - sh:maxCount 1 ; - sh:maxLength 16; - ] ; - sh:property [ - sh:path schema:chainId; - sh:datatype xsd:integer ; - sh:minCount 1 ; - sh:maxCount 1 ; - ] ; - sh:property [ - sh:path schema:nftAddress; - sh:datatype xsd:string ; - sh:minCount 1 ; - sh:maxCount 1 ; - sh:minLength 42; - sh:maxLength 42; - ] ; - sh:property [ - sh:path schema:metadata ; - sh:node schema:MetadataShape ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:services ; - sh:node schema:ServiceShape ; - sh:minCount 0; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:credentials; - sh:node schema:CredentialsShape ; - sh:maxCount 64; - ] ; . - - -schema:MetadataShape - sh:targetClass schema:Metadata ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 7000; - sh:minLength 10; - ] ; - sh:property [ - sh:path schema:copyrightHolder; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxCount 1; - sh:maxLength 512; - ] ; - sh:property [ - sh:path schema:name ; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 512; - sh:minLength 4; - ] ; - sh:property [ - sh:path schema:type; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:author; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:license; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:links; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxLength 512; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:tags; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxLength 256; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:categories; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxLength 256; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:contentLanguage; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:additionalInformation; - ] ; - sh:property [ - sh:path schema:created; - sh:datatype xsd:string; -# sh:pattern "^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])(\.[0-9]{3})?Z$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:updated; - sh:datatype xsd:string; -# sh:pattern "^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])(\.[0-9]{3})?Z$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:algorithm; - sh:node schema:AlgorithmShape ; - sh:maxCount 1; - ] ;. - - -schema:AlgorithmShape - sh:targetClass schema:Algorithm ; - sh:property [ - sh:path schema:version ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:language ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:container ; - sh:node schema:ContainerShape ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:consumerParameters; - sh:node schema:ConsumerParametersShape ; - sh:maxCount 64; - ] ;. - - -schema:ConsumerParametersShape - sh:targetClass schema:ConsumerParameter ; - sh:property [ - sh:path schema:name; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:type; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:label; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:required ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 7000; - ] ; - sh:property [ - sh:path schema:default; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:options; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxLength 256; - ] ;. - - -schema:ContainerShape - sh:targetClass schema:Container ; - sh:property [ - sh:path schema:entrypoint ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 3; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:image ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:tag ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:checksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxLength 512; - sh:minLength 7; - sh:minCount 1; - sh:maxCount 1; - ] ;. - - -schema:ServiceShape - sh:targetClass schema:Service ; - sh:property [ - sh:path schema:id ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:type ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:name ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - sh:minLength 4; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:maxCount 1; - sh:minLength 10; - sh:maxLength 7000; - ] ; - sh:property [ - sh:path schema:datatokenAddress ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 42; - sh:maxLength 42; - ] ; - sh:property [ - sh:path schema:serviceEndpoint ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 10; - sh:maxLength 2048; - ] ; - sh:property [ - sh:path schema:files; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 8192; - ] ; - sh:property [ - sh:path schema:timeout ; - sh:datatype xsd:integer ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:compute; - sh:node schema:ComputeShape ; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:additionalInformation ; - ] ; - sh:property [ - sh:path schema:consumerParameters; - sh:node schema:ConsumerParametersShape ; - ] ;. - - -schema:ComputeShape - sh:targetClass schema:Compute ; - sh:property [ - sh:path schema:allowRawAlgorithm ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:allowNetworkAccess ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:publisherTrustedAlgorithmPublishers ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:publisherTrustedAlgorithms; - sh:node schema:TrustedAlgoShape ; - ] ; . - - -schema:TrustedAlgoShape - sh:targetClass schema:TrustedAlgo; - sh:property [ - sh:path schema:did ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:filesChecksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 1024; - ] ; - sh:property [ - sh:path schema:containerSectionChecksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 1024; - ] ; . - - -schema:CredentialsShape - sh:targetClass schema:Credentials; - sh:property [ - sh:path schema:deny ; - sh:node schema:CredentialsItemShape; - ] ; - sh:property [ - sh:path schema:allow; - sh:node schema:CredentialsItemShape; - ] ; . - - -schema:CredentialsItemShape - sh:targetClass schema:CredentialsItem; - sh:property [ - sh:path schema:type ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:values ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxLength 1024; - ] ; . \ No newline at end of file diff --git a/schemas/4.7.0.ttl b/schemas/4.7.0.ttl deleted file mode 100644 index 52d7b494a..000000000 --- a/schemas/4.7.0.ttl +++ /dev/null @@ -1,456 +0,0 @@ -@prefix dash: . -@prefix rdf: . -@prefix rdfs: . -@prefix schema: . -@prefix sh: . -@prefix xsd: . - -schema:DDOShape - sh:targetClass schema:DDO ; - sh:property [ - sh:path schema:id ; - sh:datatype xsd:string ; - sh:pattern "^did\\:op\\:(.*)$" ; - sh:minCount 1 ; - sh:maxCount 1 ; - sh:maxLength 71; - sh:minLength 71; - ] ; - sh:property [ - sh:path schema:version ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1 ; - sh:maxCount 1 ; - sh:maxLength 16; - ] ; - sh:property [ - sh:path schema:chainId; - sh:datatype xsd:integer ; - sh:minCount 1 ; - sh:maxCount 1 ; - ] ; - sh:property [ - sh:path schema:nftAddress; - sh:datatype xsd:string ; - sh:minCount 1 ; - sh:maxCount 1 ; - sh:minLength 42; - sh:maxLength 42; - ] ; - sh:property [ - sh:path schema:metadata ; - sh:node schema:MetadataShape ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:services ; - sh:node schema:ServiceShape ; - sh:minCount 0; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:credentials; - sh:node schema:CredentialsShape ; - sh:maxCount 64; - ] ; . - - -schema:MetadataShape - sh:targetClass schema:Metadata ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 7000; - sh:minLength 10; - ] ; - sh:property [ - sh:path schema:copyrightHolder; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxCount 1; - sh:maxLength 512; - ] ; - sh:property [ - sh:path schema:name ; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 512; - sh:minLength 4; - ] ; - sh:property [ - sh:path schema:type; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:author; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:license; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:links; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxLength 512; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:tags; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxLength 256; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:categories; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxLength 256; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:contentLanguage; - sh:datatype xsd:string ; - sh:pattern "^(.|\\s)*$" ; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:additionalInformation; - ] ; - sh:property [ - sh:path schema:created; - sh:datatype xsd:string; -# sh:pattern "^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])(\.[0-9]{3})?Z$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:updated; - sh:datatype xsd:string; -# sh:pattern "^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])(\.[0-9]{3})?Z$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:algorithm; - sh:node schema:AlgorithmShape ; - sh:maxCount 1; - ] ;. - - -schema:AlgorithmShape - sh:targetClass schema:Algorithm ; - sh:property [ - sh:path schema:version ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:language ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:container ; - sh:node schema:ContainerShape ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:consumerParameters; - sh:node schema:ConsumerParametersShape ; - sh:maxCount 64; - ] ;. - - -schema:ConsumerParametersShape - sh:targetClass schema:ConsumerParameter ; - sh:property [ - sh:path schema:name; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:type; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:label; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:required ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 7000; - ] ; - sh:property [ - sh:path schema:default; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:options; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxLength 256; - ] ;. - - -schema:ContainerShape - sh:targetClass schema:Container ; - sh:property [ - sh:path schema:entrypoint ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 3; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:image ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:tag ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:checksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxLength 512; - sh:minLength 7; - sh:minCount 1; - sh:maxCount 1; - ] ;. - - -schema:ServiceShape - sh:targetClass schema:Service ; - sh:property [ - sh:path schema:id ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:type ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:name ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxCount 1; - sh:minLength 4; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:description ; - sh:datatype xsd:string ; - sh:pattern "^((.|\n)*)$" ; - sh:maxCount 1; - sh:minLength 10; - sh:maxLength 7000; - ] ; - sh:property [ - sh:path schema:datatokenAddress ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 42; - sh:maxLength 42; - ] ; - sh:property [ - sh:path schema:serviceEndpoint ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:minLength 10; - sh:maxLength 2048; - ] ; - sh:property [ - sh:path schema:files; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 8192; - ] ; - sh:property [ - sh:path schema:timeout ; - sh:datatype xsd:integer ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:compute; - sh:node schema:ComputeShape ; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:credentials; - sh:node schema:CredentialsShape ; - sh:maxCount 64; - ] ; - sh:property [ - sh:path schema:additionalInformation ; - ] ; - sh:property [ - sh:path schema:consumerParameters; - sh:node schema:ConsumerParametersShape ; - ] ;. - - -schema:ComputeShape - sh:targetClass schema:Compute ; - sh:property [ - sh:path schema:allowRawAlgorithm ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:allowNetworkAccess ; - sh:datatype xsd:boolean ; - sh:minCount 1; - sh:maxCount 1; - ] ; - sh:property [ - sh:path schema:publisherTrustedAlgorithmPublishers ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:publisherTrustedAlgorithms; - sh:node schema:TrustedAlgoShape ; - ] ; . - - -schema:TrustedAlgoShape - sh:targetClass schema:TrustedAlgo; - sh:property [ - sh:path schema:did ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:filesChecksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 1024; - ] ; - sh:property [ - sh:path schema:containerSectionChecksum ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 1024; - ] ; . - - -schema:CredentialsShape - sh:targetClass schema:Credentials; - sh:property [ - sh:path schema:deny ; - sh:node schema:CredentialsItemShape; - ] ; - sh:property [ - sh:path schema:allow; - sh:node schema:CredentialsItemShape; - ] ; . - - -schema:CredentialsItemShape - sh:targetClass schema:CredentialsItem; - sh:property [ - sh:path schema:type ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxCount 1; - sh:maxLength 256; - ] ; - sh:property [ - sh:path schema:values ; - sh:datatype xsd:string ; - sh:pattern "^(.*)$" ; - sh:minCount 1; - sh:maxLength 1024; - ] ; . \ No newline at end of file diff --git a/schemas/op_ddo_v1.json b/schemas/op_ddo_v1.json index 11793cdae..165087918 100644 --- a/schemas/op_ddo_v1.json +++ b/schemas/op_ddo_v1.json @@ -1,7 +1,5 @@ { "name": "op_ddo_v4.1.0", "enable_nested_fields": true, - "fields": [ - { "name": ".*", "type": "auto", "optional": true } - ] + "fields": [{ "name": ".*", "type": "auto", "optional": true }] } diff --git a/schemas/op_ddo_v3.json b/schemas/op_ddo_v3.json index fea679698..ba4c552c4 100644 --- a/schemas/op_ddo_v3.json +++ b/schemas/op_ddo_v3.json @@ -1,7 +1,5 @@ { "name": "op_ddo_v4.3.0", "enable_nested_fields": true, - "fields": [ - { "name": ".*", "type": "auto", "optional": true } - ] + "fields": [{ "name": ".*", "type": "auto", "optional": true }] } diff --git a/schemas/op_ddo_v5.json b/schemas/op_ddo_v5.json index 89b5b6bb8..b61df3c4e 100644 --- a/schemas/op_ddo_v5.json +++ b/schemas/op_ddo_v5.json @@ -1,7 +1,5 @@ { "name": "op_ddo_v4.5.0", "enable_nested_fields": true, - "fields": [ - { "name": ".*", "type": "auto", "optional": true } - ] + "fields": [{ "name": ".*", "type": "auto", "optional": true }] } diff --git a/schemas/op_ddo_v5_0_0.json b/schemas/op_ddo_v5_0_0.json new file mode 100644 index 000000000..6d055cd1b --- /dev/null +++ b/schemas/op_ddo_v5_0_0.json @@ -0,0 +1,5 @@ +{ + "name": "op_ddo_v5.0.0", + "enable_nested_fields": true, + "fields": [{ "name": ".*", "type": "auto", "optional": true }] +} diff --git a/schemas/short.ttl b/schemas/short.ttl deleted file mode 100644 index daca4873c..000000000 --- a/schemas/short.ttl +++ /dev/null @@ -1,28 +0,0 @@ -@prefix dash: . -@prefix rdf: . -@prefix rdfs: . -@prefix schema: . -@prefix sh: . -@prefix xsd: . - -schema:DDOShape - sh:targetClass schema:DDO ; - sh:property [ - sh:path schema:id ; - sh:datatype xsd:string ; - sh:pattern "^did\\:op\\:(.*)$" ; - sh:minCount 1 ; - sh:maxCount 1 ; - ] ; - sh:property [ - sh:path schema:nftAddress; - sh:datatype xsd:string ; - sh:minCount 1 ; - sh:maxCount 1 ; - ] ; - sh:property [ - sh:path schema:chainId; - sh:datatype xsd:integer ; - sh:minCount 1 ; - sh:maxCount 1 ; - ] ; \ No newline at end of file diff --git a/scripts/dashboard.hash b/scripts/dashboard.hash deleted file mode 100644 index 798ea7264..000000000 --- a/scripts/dashboard.hash +++ /dev/null @@ -1 +0,0 @@ -b567946811627eaca026072c8912bf187541d0401138b68e4c29bd5f1a2057f3 \ No newline at end of file diff --git a/scripts/dashboardChanges.js b/scripts/dashboardChanges.js deleted file mode 100644 index 046148968..000000000 --- a/scripts/dashboardChanges.js +++ /dev/null @@ -1,93 +0,0 @@ -import { execSync } from 'child_process' -import { - existsSync, - readFileSync, - writeFileSync, - readdirSync, - statSync, - rmSync -} from 'fs' -import { createHash } from 'crypto' -import { join, dirname } from 'path' -import { fileURLToPath } from 'url' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename) - -// Directory to check for changes -const dashboardDir = join(__dirname, '../dashboard') -const distDir = join(__dirname, '../dist') -const hashFile = join(__dirname, 'dashboard.hash') - -// Directories to exclude from the hash calculation -const excludeDirs = ['.next', 'node_modules'] - -// Function to calculate hash of a directory recursively -function calculateHash(directory) { - const hash = createHash('sha256') - const files = getAllFiles(directory) - files.forEach((file) => { - hash.update(readFileSync(file)) - }) - return hash.digest('hex') -} - -// Function to get all files in a directory recursively -function getAllFiles(directory) { - const filesInDirectory = readdirSync(directory) - let allFiles = [] - filesInDirectory.forEach((file) => { - const absolute = join(directory, file) - if (excludeDirs.includes(file)) { - return - } - if (statSync(absolute).isDirectory()) { - allFiles = allFiles.concat(getAllFiles(absolute)) - } else { - allFiles.push(absolute) - } - }) - return allFiles -} - -// Function to check if there are changes in the directory -function hasChanges() { - const currentHash = calculateHash(dashboardDir) - if (existsSync(hashFile)) { - const previousHash = readFileSync(hashFile, 'utf-8') - if (previousHash === currentHash) { - return false - } - } - writeFileSync(hashFile, currentHash) - return true -} - -// Function to clean the dist directory except the dashboard folder -function cleanDistDirectory() { - if (!existsSync(distDir)) { - return - } - - const files = readdirSync(distDir) - files.forEach((file) => { - const filePath = join(distDir, file) - if (filePath !== join(distDir, 'dashboard')) { - if (statSync(filePath).isDirectory()) { - rmSync(filePath, { recursive: true, force: true }) - } else { - rmSync(filePath) - } - } - }) -} - -if (hasChanges()) { - console.log( - 'Changes detected in the dashboard. Cleaning old build and running Next.js build...' - ) - cleanDistDirectory() - execSync('cd dashboard && npm install && npx next build', { stdio: 'inherit' }) -} else { - console.log('No changes detected in the dashboard. Skipping Next.js build.') -} diff --git a/scripts/fix-libp2p-http-utils.js b/scripts/fix-libp2p-http-utils.js new file mode 100755 index 000000000..972b92a3e --- /dev/null +++ b/scripts/fix-libp2p-http-utils.js @@ -0,0 +1,34 @@ +#!/usr/bin/env node +import { readFileSync, writeFileSync } from 'fs' +import { join, dirname } from 'path' +import { fileURLToPath } from 'url' + +const file = join( + dirname(fileURLToPath(import.meta.url)), + '..', + 'node_modules/@libp2p/http-utils/dist/src/index.js' +) + +try { + let content = readFileSync(file, 'utf8') + + if (content.includes("addresses.port === '' ?")) { + console.log('✅ Already patched') + process.exit(0) + } + + content = content.replace( + 'port = parseInt(addresses.port, 10);', + "port = parseInt(addresses.port === '' ? (addresses.protocol === 'https:' ? '443' : '80') : addresses.port, 10);" + ) + + writeFileSync(file, content, 'utf8') + console.log('✅ Patched @libp2p/http-utils') +} catch (error) { + if (error.code === 'ENOENT') { + console.log('⚠️ Package not found, skipping') + process.exit(0) + } + console.error('❌ Error:', error.message) + process.exit(1) +} diff --git a/scripts/list_gpus.sh b/scripts/list_gpus.sh new file mode 100755 index 000000000..dc3fdf1e1 --- /dev/null +++ b/scripts/list_gpus.sh @@ -0,0 +1,254 @@ +#!/usr/bin/env bash + +# Function to check for NVIDIA GPUs +get_nvidia_gpus() { + if command -v nvidia-smi &> /dev/null; then + # Query nvidia-smi for GPU count, names, and UUIDs + # We use csv format for easier parsing + nvidia-smi --query-gpu=name,uuid --format=csv,noheader | while IFS=, read -r name uuid; do + # Trim leading/trailing whitespace + name=$(echo "$name" | xargs) + uuid=$(echo "$uuid" | xargs) + + # Create a JSON object for this GPU + # Note: We use the UUID as the ID locally, but it will be aggregated later + jq -c -n \ + --arg name "$name" \ + --arg uuid "$uuid" \ + '{ + description: $name, + init: { + deviceRequests: { + Driver: "nvidia", + Devices: [$uuid] + } + } + }' + done + fi +} + +# Declare the associative array (hashmap) globally +declare -A gpu_map + +map_pci_to_primary() { + # Iterate over all card nodes in /sys/class/drm + # We filter for 'card*' to ignore 'renderD*' nodes for the primary map + for card_path in /sys/class/drm/card*; do + + # logical check to ensure the glob matched a file + [ -e "$card_path" ] || continue + + # Resolve the symlink to the actual PCI device directory + # Example result: /sys/devices/pci0000:00/.../0000:03:00.0 + real_device_path=$(readlink -f "$card_path/device") + + # The last part of that path is the PCI ID (e.g., 0000:03:00.0) + pci_id=$(basename "$real_device_path") + + # The last part of the card_path is the card name (e.g., card0) + card_name=$(basename "$card_path") + + # Store in the hashmap + # Key: PCI ID, Value: /dev/dri/cardX + gpu_map["$pci_id"]="/dev/dri/$card_name" + done +} + + + +# Function to check for other GPUs (AMD, Intel, etc.) via lspci +get_generic_gpus() { + # Check if lspci is available + if ! command -v lspci &> /dev/null; then + return + fi + + map_pci_to_primary + # Iterate over VGA and 3D controllers + lspci -mm -n -d ::0300 | while read -r line; do process_pci_line "$line"; done + lspci -mm -n -d ::0302 | while read -r line; do process_pci_line "$line"; done +} + +process_pci_line() { + line="$1" + + slot=$(echo "$line" | awk '{print $1}') + vendor_id_hex=$(echo "$line" | awk '{print $3}' | tr -d '"') + + # We want to exclude NVIDIA here if we already handled them via nvidia-smi. + if [[ "$vendor_id_hex" == "10de" ]] && command -v nvidia-smi &> /dev/null; then + return + fi + + # Get human readable name + full_info=$(lspci -s "$slot" -vmm) + vendor_name=$(echo "$full_info" | grep "^Vendor:" | cut -f2-) + device_name=$(echo "$full_info" | grep "^Device:" | cut -f2-) + + description="$vendor_name $device_name" + pci_id="0000:$slot" + + # Determine driver + driver="" + if [[ "$vendor_id_hex" == "1002" ]]; then # AMD + driver="amdgpu" + elif [[ "$vendor_id_hex" = "8086" ]]; then # Intel + driver="intel" + fi + + device_id="" + card_path="" + if [ -n "${gpu_map[$pci_id]}" ]; then + # Get device id from /sys/class/drm map + device_id="${gpu_map[$pci_id]}" # e.g. /dev/dri/card0 + # Reconstruct sysfs card path from the device path + # device_id is /dev/dri/cardX, we want /sys/class/drm/cardX + card_name=$(basename "$device_id") + card_path="/sys/class/drm/$card_name" + else + # If it can't be found, default to pci id + device_id="${pci_id}" + fi + + local devices=() + local binds=() + local cap_add=() + local group_add=() + local ipc_mode="null" + local shm_size="null" + local security_opt="null" + + # Only perform detailed checks if we found the card path + if [ -n "$card_path" ] && [ -e "$card_path" ]; then + + # Resolve real device path for getting sibling render node + local real_device_path=$(readlink -f "$card_path/device") + local render_name="" + if [ -d "$real_device_path/drm" ]; then + render_name=$(ls "$real_device_path/drm" | grep "^renderD" | head -n 1) + fi + + case "$vendor_id_hex" in + "1002") # AMD (0x1002) + # Devices + if [ -e "/dev/dxg" ]; then + devices+=("/dev/dxg") + else + devices+=("/dev/kfd") + fi + [ -n "$render_name" ] && devices+=("/dev/dri/$render_name") + devices+=("$device_id") # /dev/dri/cardX + + # Binds + [ -e "/opt/rocm/lib/libhsa-runtime64.so.1" ] && \ + binds+=("/opt/rocm/lib/libhsa-runtime64.so.1:/opt/rocm/lib/libhsa-runtime64.so.1") + + # Configs + cap_add+=("SYS_PTRACE") + ipc_mode="\"host\"" + shm_size="8589934592" + # SecurityOpt is a JSON object + security_opt='{"seccomp": "unconfined"}' + ;; + + "8086") # Intel (0x8086) + # Devices + [ -n "$render_name" ] && devices+=("/dev/dri/$render_name") + devices+=("$device_id") + + # Configs + group_add+=("video" "render") + cap_add+=("SYS_ADMIN") + ;; + esac + else + # Fallback if we don't have the card path mapped, but still want to add the primary device if applicable + # This preserves behavior for devices that might not map correctly but are enumerated + if [[ "$vendor_id_hex" == "1002" ]] || [[ "$vendor_id_hex" == "8086" ]]; then + if [[ "$device_id" == /dev/* ]]; then + devices+=("$device_id") + fi + fi + fi + + + # --- Construct JSON --- + + # Helper to convert bash arrays using jq + # (re-using the logic, but localized vars) + json_devices=$(printf '%s\n' "${devices[@]}" | jq -R . | jq -s . | jq 'map(select(length > 0))') + json_binds=$(printf '%s\n' "${binds[@]}" | jq -R . | jq -s . | jq 'map(select(length > 0))') + json_cap=$(printf '%s\n' "${cap_add[@]}" | jq -R . | jq -s . | jq 'map(select(length > 0))') + json_group=$(printf '%s\n' "${group_add[@]}" | jq -R . | jq -s . | jq 'map(select(length > 0))') + + # If Devices array is empty, ensure at least the ID we found is there (unless it was already added) + # Using 'index' to check if device_id is present is tricky with jq on the fly, + # but standardizing on what we found is safer. + # If the detailed logic above didn't populate devices (e.g. unknown vendor), we fall back to just the ID. + if [ "$(echo "$json_devices" | jq length)" -eq 0 ]; then + json_devices="[\"$device_id\"]" + fi + + + jq -c -n \ + --arg desc "$description" \ + --arg driver "$driver" \ + --arg device_id "$device_id" \ + --argjson dev "$json_devices" \ + --argjson bind "$json_binds" \ + --argjson cap "$json_cap" \ + --argjson group "$json_group" \ + --argjson sec "$security_opt" \ + --argjson shm "$shm_size" \ + --argjson ipc "$ipc_mode" \ + '{ + description: $desc, + init: { + deviceRequests: { + Driver: (if $driver != "" then $driver else null end), + Devices: $dev, + Capabilities: [["gpu"]] + }, + Binds: $bind, + CapAdd: $cap, + GroupAdd: $group, + SecurityOpt: $sec, + ShmSize: $shm, + IpcMode: $ipc + } + } | del(.. | select(. == null)) | del(.. | select(. == []))' +} + +# Function to get all GPUs in JSON array format +get_all_gpus_json() { + ( + get_nvidia_gpus + get_generic_gpus + ) | jq -s ' + group_by(.description) | map({ + id: (.[0].description | ascii_downcase | gsub("[^a-z0-9]"; "-") | gsub("-+"; "-") | sub("^-"; "") | sub("-$"; "")), + description: .[0].description, + type: "gpu", + total: length, + init: { + deviceRequests: { + Driver: .[0].init.deviceRequests.Driver, + (if .[0].init.deviceRequests.Driver == "nvidia" then "DeviceIDs" else "Devices" end): (map(.init.deviceRequests.Devices[]?) | unique), + Capabilities: [["gpu"]] + }, + Binds: (map(.init.Binds[]?) | unique), + CapAdd: (map(.init.CapAdd[]?) | unique), + GroupAdd: (map(.init.GroupAdd[]?) | unique), + SecurityOpt: .[0].init.SecurityOpt, + ShmSize: .[0].init.ShmSize, + IpcMode: .[0].init.IpcMode + } | del(.. | select(. == null)) | del(.. | select(. == [])) + }) | map(if .init.deviceRequests.Driver == null then del(.init.deviceRequests.Driver) else . end) + ' +} + +# Main execution only if script is not sourced +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + get_all_gpus_json +fi diff --git a/scripts/ocean-node-quickstart.sh b/scripts/ocean-node-quickstart.sh index 4c3085338..d565cc371 100755 --- a/scripts/ocean-node-quickstart.sh +++ b/scripts/ocean-node-quickstart.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # -# Copyright (c) 2024 Ocean Protocol contributors +# Copyright (c) 2026 Ocean Protocol contributors # SPDX-License-Identifier: Apache-2.0 # @@ -52,6 +52,69 @@ validate_ip_or_fqdn() { return 0 } +ensure_jq() { + + if command -v jq >/dev/null 2>&1; then + echo "jq is already installed." + return 0 + fi + + echo "jq not found. Attempting to install..." + + if [ "$(id -u)" -ne 0 ]; then + SUDO="sudo" + else + SUDO="" + fi + + if [ -f /etc/os-release ]; then + . /etc/os-release + case "$ID" in + debian|ubuntu|linuxmint|pop|kali) + $SUDO apt-get update && $SUDO apt-get install -y jq + ;; + fedora) + $SUDO dnf install -y jq + ;; + centos|rhel|almalinux|rocky) + if command -v dnf >/dev/null; then + $SUDO dnf install -y epel-release + $SUDO dnf install -y jq + else + $SUDO yum install -y epel-release + $SUDO yum install -y jq + fi + ;; + alpine) + $SUDO apk add jq + ;; + arch|manjaro) + $SUDO pacman -Sy --noconfirm jq + ;; + opensuse*|sles) + $SUDO zypper install -y jq + ;; + *) + echo "Error: Unsupported distribution '$ID'. Please install jq manually." + return 1 + ;; + esac + else + echo "Error: Cannot detect OS distribution. Please install jq manually." + return 1 + fi + + if command -v jq >/dev/null 2>&1; then + echo "jq installed successfully." + return 0 + else + echo "Error: Failed to install jq." + return 1 + fi +} + +echo "Checking prerequisites (jq) are installed.." +ensure_jq read -p "Do you have your private key for running the Ocean Node [ y/n ]: " has_key @@ -68,6 +131,7 @@ else echo "Generating Private Key, please wait..." output=$(head -c 32 /dev/urandom | xxd -p | tr -d '\n' | awk '{print "0x" $0}') PRIVATE_KEY=$(echo "$output") + echo -e "Generated Private Key: \e[1;31m$PRIVATE_KEY\e[0m" validate_hex "$PRIVATE_KEY" fi @@ -100,6 +164,13 @@ read P2P_ipV6BindWsPort P2P_ipV6BindWsPort=${P2P_ipV6BindWsPort:-9003} validate_port "$P2P_ipV6BindWsPort" +P2P_ENABLE_UPNP='false' +read -p "Enable UPnP (useful in case you can no set up port forwarding)? [ y/n ]: " enable_upnp +if [ "$enable_upnp" == "y" ]; then + P2P_ENABLE_UPNP='true' +fi + + read -p "Provide the public IPv4 address or FQDN where this node will be accessible: " P2P_ANNOUNCE_ADDRESS if [ -n "$P2P_ANNOUNCE_ADDRESS" ]; then @@ -121,6 +192,114 @@ else echo "No input provided, the Ocean Node might not be accessible from other nodes." fi +read -p "Do you want to run docker C2D jobs on your Ocean Node [ y/n ]: " run_c2d_jobs + +if [ "$run_c2d_jobs" == "y" ]; then + echo "########################################################" + echo "### Docker Engine Compute Environments Configuration ###" + echo "########################################################" + echo "Check 'ComputeEnvironment' definition for more details on the format" + echo "_____________________________________________________" + echo "" + read -p "Do you want to add a specific docker environment configuration? + (Hint: You can enter multiple in JSON format) [ y/n ]: " c2d_env + if [ "$c2d_env" == "y" ]; then + read -p "Enter the array of docker environment(s): " DOCKER_COMPUTE_ENVIRONMENTS + fi +else + echo "Running node without docker C2D capabilities!" +fi + +read -p "Do you want to enable TLS (HTTPS) for your Ocean Node [ y/n ]: " enable_tls +if [ "$enable_tls" == "y" ]; then + read -p "Enter the absolute path to your TLS certificate file: " HTTP_CERT_PATH + read -p "Enter the absolute path to your TLS private key file: " HTTP_KEY_PATH + + if [ -z "$HTTP_CERT_PATH" ] || [ -z "$HTTP_KEY_PATH" ]; then + echo "Certificate and key paths are mandatory for TLS. Disabling TLS." + enable_tls="n" + fi +fi + +# Set default compute environments if not already defined +if [ -z "$DOCKER_COMPUTE_ENVIRONMENTS" ]; then + echo "Setting default DOCKER_COMPUTE_ENVIRONMENTS configuration" + export DOCKER_COMPUTE_ENVIRONMENTS='[ + { + "socketPath": "/var/run/docker.sock", + "resources": [ + { + "id": "disk", + "total": 10 + } + ], + "storageExpiry": 604800, + "maxJobDuration": 36000, + "minJobDuration": 60, + "fees": { + "1": [ + { + "feeToken": "0x123", + "prices": [ + { + "id": "cpu", + "price": 1 + } + ] + } + ] + }, + "free": { + "maxJobDuration": 360000, + "minJobDuration": 60, + "maxJobs": 3, + "resources": [ + { + "id": "cpu", + "max": 1 + }, + { + "id": "ram", + "max": 1 + }, + { + "id": "disk", + "max": 1 + } + ] + } + } + ]' +fi + +# GPU Detection and Integration +LIST_GPUS_SCRIPT="$(dirname "$0")/list_gpus.sh" +if [ -f "$LIST_GPUS_SCRIPT" ] && command -v jq &> /dev/null; then + echo "Checking for GPUs..." + source "$LIST_GPUS_SCRIPT" + DETECTED_GPUS=$(get_all_gpus_json) + + # Check if we got any GPUs (array not empty) + GPU_COUNT=$(echo "$DETECTED_GPUS" | jq 'length') + + if [ "$GPU_COUNT" -gt 0 ]; then + echo "Detected $GPU_COUNT GPU type(s). Updating configuration..." + + # Merge detected GPUs into the resources array of the first environment + # We use jq to append the detected GPU objects to existing resources + DOCKER_COMPUTE_ENVIRONMENTS=$(echo "$DOCKER_COMPUTE_ENVIRONMENTS" | jq --argjson gpus "$DETECTED_GPUS" '.[0].resources += $gpus') + + # Also update free resources to include GPUs if desired, or at least the pricing? + # For now, let's just ensure they are in the available resources list. + echo "GPUs added to Compute Environment resources." + else + echo "No GPUs detected." + fi +else + echo "Skipping GPU detection (script not found or jq missing)." +fi + +echo $DOCKER_COMPUTE_ENVIRONMENTS cat < docker-compose.yml services: @@ -147,15 +326,22 @@ services: # ADDRESS_FILE: '' # NODE_ENV: '' # AUTHORIZED_DECRYPTERS: '' +# AUTHORIZED_DECRYPTERS_LIST: '' # OPERATOR_SERVICE_URL: '' +# POLICY_SERVER_URL: '' INTERFACES: '["HTTP","P2P"]' # ALLOWED_VALIDATORS: '' +# ALLOWED_VALIDATORS_LIST: '' +# AUTHORIZED_PUBLISHERS: '' +# AUTHORIZED_PUBLISHERS_LIST: '' # INDEXER_NETWORKS: '[]' ALLOWED_ADMINS: '["$ALLOWED_ADMINS"]' +# ALLOWED_ADMINS_LIST: '' # INDEXER_INTERVAL: '' - DASHBOARD: 'true' + CONTROL_PANEL: 'true' # RATE_DENY_LIST: '' -# MAX_REQ_PER_SECOND: '' +# MAX_REQ_PER_MINUTE: '' +# MAX_CONNECTIONS_PER_MINUTE: '' # MAX_CHECKSUM_LENGTH: '' # LOG_LEVEL: '' HTTP_API_PORT: '$HTTP_API_PORT' @@ -175,14 +361,31 @@ services: # P2P_mDNSInterval: '' # P2P_connectionsMaxParallelDials: '' # P2P_connectionsDialTimeout: '' -# P2P_ENABLE_UPNP: '' + P2P_ENABLE_UPNP: '$P2P_ENABLE_UPNP' # P2P_ENABLE_AUTONAT: '' # P2P_ENABLE_CIRCUIT_RELAY_SERVER: '' # P2P_ENABLE_CIRCUIT_RELAY_CLIENT: '' # P2P_BOOTSTRAP_NODES: '' # P2P_FILTER_ANNOUNCED_ADDRESSES: '' + DOCKER_COMPUTE_ENVIRONMENTS: '$DOCKER_COMPUTE_ENVIRONMENTS' +$( + if [ "$enable_tls" == "y" ]; then + echo " HTTP_CERT_PATH: '/usr/src/app/certs/cert.pem'" + echo " HTTP_KEY_PATH: '/usr/src/app/certs/key.pem'" + fi +) + networks: - ocean_network + volumes: + - node-sqlite:/usr/src/app/databases + - /var/run/docker.sock:/var/run/docker.sock +$( + if [ "$enable_tls" == "y" ]; then + echo " - $HTTP_CERT_PATH:/usr/src/app/certs/cert.pem:ro" + echo " - $HTTP_KEY_PATH:/usr/src/app/certs/key.pem:ro" + fi +) depends_on: - typesense @@ -200,6 +403,8 @@ services: volumes: typesense-data: driver: local + node-sqlite: + driver: local networks: ocean_network: @@ -223,3 +428,5 @@ echo -e "\e[1;32mP2P IPv4 TCP Port: $P2P_ipV4BindTcpPort\e[0m" echo -e "\e[1;32mP2P IPv4 WebSocket Port: $P2P_ipV4BindWsPort\e[0m" echo -e "\e[1;32mP2P IPv6 TCP Port: $P2P_ipV6BindTcpPort\e[0m" echo -e "\e[1;32mP2P IPv6 WebSocket Port: $P2P_ipV6BindWsPort\e[0m" +echo "" +echo -e "\e[1;32m4)\e[0m If using SSL/TLS with a custom domain name, make sure to listen on host port 443 for the HTTP API, or use a reverse proxy with TLS offloading" diff --git a/scripts/ocean-node-update.sh b/scripts/ocean-node-update.sh new file mode 100755 index 000000000..4ae71fb76 --- /dev/null +++ b/scripts/ocean-node-update.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +DEFAULT_DOCKER_ENVIRONMENTS='[{"socketPath":"/var/run/docker.sock","resources":[{"id":"disk","total":10}],"storageExpiry":604800,"maxJobDuration":36000,"minJobDuration":60,"fees":{"1":[{"feeToken":"0x123","prices":[{"id":"cpu","price":1}]}]},"free":{"maxJobDuration":360000,"minJobDuration":60,"maxJobs":3,"resources":[{"id":"cpu","max":1},{"id":"ram","max":1},{"id":"disk","max":1}]}}]' + +check_prerequisites() { + if [ ! -f "docker-compose.yml" ]; then + echo "Error: docker-compose.yml not found in current directory" + exit 1 + fi +} + +configure_c2d() { + if grep -q "DOCKER_COMPUTE_ENVIRONMENTS:" docker-compose.yml; then + echo "DOCKER_COMPUTE_ENVIRONMENTS: configuration already exists" + else + echo "Adding Docker Compute Environment configuration..." + read -p "Do you want to run docker C2D jobs on your Ocean Node [ y/n ]: " run_c2d_jobs + + if [ "$run_c2d_jobs" == "y" ]; then + add_c2d_configuration + else + echo "Skipping C2D configuration" + fi + fi +} + +add_c2d_configuration() { + echo "########################################################" + echo "### Docker Engine Compute Environments Configuration ###" + echo "########################################################" + echo "Check 'ComputeEnvironment' definition for more details on the format" + echo "_____________________________________________________" + echo "" + + local docker_environments="$DEFAULT_DOCKER_ENVIRONMENTS" + read -p "Do you want to add a specific docker environment configuration? (Hint: You can enter multiple in JSON format) [ y/n ]: " c2d_env + + if [ "$c2d_env" == "y" ]; then + read -p "Enter the array of docker environment(s): " user_input + if [ ! -z "$user_input" ]; then + docker_environments="$user_input" + fi + else + echo "Setting default DOCKER_COMPUTE_ENVIRONMENTS configuration" + fi + + update_docker_compose "$docker_environments" +} + +update_docker_compose() { + local docker_environments="$1" + sed -i '/environment:/,/^[^ ]/ { + /^[^ ]/i\ DOCKER_COMPUTE_ENVIRONMENTS: '"'$docker_environments'"' + }' docker-compose.yml + + if ! grep -q "/var/run/docker.sock:/var/run/docker.sock" docker-compose.yml; then + sed -i '/restart: on-failure/a\ volumes:\n - /var/run/docker.sock:/var/run/docker.sock' docker-compose.yml + fi + + echo "Added C2D configuration and Docker socket mount to docker-compose.yml" +} + +show_completion_message() { + echo -e "\n\e[1;32mUpdate completed successfully!\e[0m" + echo "Your docker-compose.yml has been updated with new configurations" + echo -e "To apply the changes, run: \e[1;32mdocker-compose up -d\e[0m" +} + +main() { + check_prerequisites + configure_c2d +} + +main \ No newline at end of file diff --git a/src/@types/Asset.ts b/src/@types/Asset.ts index 8ac434849..a41c666cf 100644 --- a/src/@types/Asset.ts +++ b/src/@types/Asset.ts @@ -1,176 +1,3 @@ -import { DDO } from './DDO/DDO' - -export interface AssetNft { - /** - * Contract address of the deployed ERC721 NFT contract. - * @type {string} - */ - address: string - - /** - * Name of NFT set in contract. - * @type {string} - */ - name: string - - /** - * Symbol of NFT set in contract. - * @type {string} - */ - symbol: string - - /** - * ETH account address of the NFT owner. - * @type {string} - */ - owner: string - - /** - * State of the asset reflecting the NFT contract value. - * 0 Active. - * 1 End-of-life. - * 2 Deprecated (by another asset). - * 3 Revoked by publisher. - * 4 Ordering is temporary disabled. - * 5 Unlisted in markets. - * @type {number} - */ - state: 0 | 1 | 2 | 3 | 4 | 5 - - /** - * Contains the date of NFT creation. - * @type {string} - */ - created: string - - /** - * NFT token URI. - * @type {string} - */ - tokenURI: string -} - -export interface Purgatory { - /** - * If `true`, asset is in purgatory. - * @type {boolean} - */ - state: boolean - - /** - * If asset is in purgatory, contains the reason for being there as defined in `list-purgatory`. - * @type {string} - */ - reason: string -} - -export interface AssetDatatoken { - /** - * Contract address of the deployed Datatoken contract. - * @type {string} - */ - address: string - - /** - * Name of NFT set in contract. - * @type {string} - */ - name: string - - /** - * Symbol of NFT set in contract. - * @type {string} - */ - symbol: string - - /** - * ID of the service the datatoken is attached to. - * @type {string} - */ - serviceId: string -} - -export interface AssetPrice { - /** - * The price of the asset expressed as a number. If 0 then the price is FREE. - * @type {number} - */ - value: number - - /** - * The symbol that the price of the asset is expressed in. - * @type {string} - */ - tokenSymbol?: string - - /** - * The address of the token that the price needs to be paid in. - * @type {string} - */ - tokenAddress?: string -} -export interface Stats { - /** - * How often an asset was consumed, meaning how often it was either downloaded or used as part of a compute job. - * @type {number} - */ - orders: number - - /** - * Contains information about the price of this asset. - * @type {AssetPrice} - */ - price: AssetPrice - - /** - * Total amount of veOCEAN allocated on this asset. - * @type {number} - */ - allocated?: number -} - -export interface AssetLastEvent { - tx: string - block: number - from: string - contract: string - datetime: string -} - -export interface Asset extends DDO { - /** - * Contains information about the ERC721 NFT contract which represents the intellectual property of the publisher. - * @type {string} - */ - nft: AssetNft - - /** - * Contains information about the ERC20 Datatokens attached to asset services. - * @type {string} - */ - datatokens: AssetDatatoken[] - - /** - * Contains information about the last transaction that created or updated the DDO. - * @type {string} - */ - event: AssetLastEvent - - /** - * The stats section contains different statistics fields. This section is added by Aquarius - * @type {Stats} - */ - stats: Stats - - /** - * Contains information about an asset's purgatory status defined in - * [`list-purgatory`](https://github.com/oceanprotocol/list-purgatory). - * Marketplace interfaces are encouraged to prevent certain user actions like downloading on assets in purgatory. - * @type {Purgatory} - */ - purgatory: Purgatory -} - export interface OrdableAssetResponse { isOrdable: boolean reason?: string diff --git a/src/@types/C2D.ts b/src/@types/C2D.ts deleted file mode 100644 index f1297ca22..000000000 --- a/src/@types/C2D.ts +++ /dev/null @@ -1,199 +0,0 @@ -import type { MetadataAlgorithm } from './DDO/Metadata.js' - -export enum C2DClusterType { - // eslint-disable-next-line no-unused-vars - OPF_K8 = 0, - // eslint-disable-next-line no-unused-vars - NODE_LOCAL = 1 -} - -export interface C2DClusterInfo { - /** Type of cluster: K8, Node local, etc */ - type: C2DClusterType - /** Hash of cluster. hash(url) for remote, hash(nodeId) for local */ - hash: string - /** Connection URI */ - connection?: string -} - -export interface ComputeEnvironment { - id: string - cpuNumber: number - cpuType: string - gpuNumber: number - gpuType: string - ramGB: number - diskGB: number - priceMin: number - desc: string - currentJobs: number - maxJobs: number - consumerAddress: string - storageExpiry: number - maxJobDuration: number - lastSeen: number - chainId?: number - feeToken: string -} - -export interface ComputeEnvByChain { - [chainId: number]: ComputeEnvironment[] -} - -export type ComputeResultType = - | 'algorithmLog' - | 'output' - | 'configrationLog' - | 'publishLog' - -export interface ComputeResult { - filename: string - filesize: number - type: ComputeResultType - index?: number -} - -export interface ComputeJob { - owner: string - did?: string - jobId: string - dateCreated: string - dateFinished: string - status: number - statusText: string - results: ComputeResult[] - inputDID?: string[] - algoDID?: string - agreementId?: string - expireTimestamp: number -} - -export interface ComputeOutput { - publishAlgorithmLog?: boolean - publishOutput?: boolean - providerAddress?: string - providerUri?: string - metadataUri?: string - nodeUri?: string - owner?: string - secretStoreUri?: string - whitelist?: string[] -} - -export interface ComputeAsset { - url?: string - documentId: string - serviceId: string - transferTxId?: string - userdata?: { [key: string]: any } -} - -export interface ComputeAlgorithm { - documentId?: string - serviceId?: string - url?: string - meta?: MetadataAlgorithm - transferTxId?: string - algocustomdata?: { [key: string]: any } - userdata?: { [key: string]: any } -} - -/* The following are specific to OPF_k8 compute engine */ -export interface OPFK8ComputeStageInput { - index: number - id?: string - remote?: any - url?: string[] -} -export interface OPFK8ComputeStageAlgorithm { - id?: string - url?: string - remote?: any - rawcode?: string - container?: { - /** - * The command to execute, or script to run inside the Docker image. - * @type {string} - */ - entrypoint: string - - /** - * Name of the Docker image. - * @type {string} - */ - image: string - - /** - * Tag of the Docker image. - * @type {string} - */ - tag: string - } -} - -export interface OPFK8ComputeOutput { - // this is a copy of ComputeOutput, but they could diverge in the future - publishAlgorithmLog?: boolean - publishOutput?: boolean - providerAddress?: string - providerUri?: string - metadataUri?: string - nodeUri?: string - owner?: string - secretStoreUri?: string - whitelist?: string[] -} -export interface OPFK8ComputeStage { - index: number - input: OPFK8ComputeStageInput[] - algorithm: OPFK8ComputeStageAlgorithm - compute?: {} - output: OPFK8ComputeOutput -} - -export interface OPFK8ComputeWorkflow { - stages: OPFK8ComputeStage[] -} -export interface OPFK8ComputeStart { - workflow: OPFK8ComputeWorkflow - owner: string - agreementId: string - providerSignature: string - providerAddress: string - environment: string - validUntil: number - nonce: number - chainId: number -} - -export interface OPFK8ComputeStop { - jobId: string - owner: string - agreementId?: string - providerSignature: string // message=owner+jobId - providerAddress: string - nonce: number -} - -export interface OPFK8ComputeGetStatus { - agreementId?: string - jobId?: string - owner?: string - providerSignature: string // message=owner+jobId(if any) - providerAddress: string - nonce: number -} - -export interface OPFK8ComputeGetResult { - jobId: string - owner: string - index: number - providerSignature: string // message=owner+jobId - providerAddress: string - nonce: number -} - -export interface AlgoChecksums { - files: string - container: string -} diff --git a/src/@types/C2D/C2D.ts b/src/@types/C2D/C2D.ts new file mode 100644 index 000000000..6a6213a2e --- /dev/null +++ b/src/@types/C2D/C2D.ts @@ -0,0 +1,361 @@ +import { MetadataAlgorithm, ConsumerParameter } from '@oceanprotocol/ddo-js' +import type { BaseFileObject } from '../fileObject.js' +export enum C2DClusterType { + // eslint-disable-next-line no-unused-vars + OPF_K8 = 0, + // eslint-disable-next-line no-unused-vars + NODE_LOCAL = 1, + // eslint-disable-next-line no-unused-vars + DOCKER = 2 +} + +export interface C2DClusterInfo { + /** Type of cluster: K8, Node local, etc */ + type: C2DClusterType + /** Hash of cluster. hash(url) for remote, hash(nodeId) for local */ + hash: string + /** Connection URI */ + connection?: any + /** Folder for storing data */ + tempFolder?: string +} + +export type ComputeResourceType = 'cpu' | 'ram' | 'disk' | any + +export interface ComputeResourcesPricingInfo { + id: ComputeResourceType + price: number // price per unit per minute +} + +export interface ArgumentValues { + [key: string]: string | number | boolean | any[] // Supports multiple value types +} + +export interface dockerDeviceRequest { + Driver: string + Count?: number + DeviceIDs: string[] + Capabilities?: any + Options?: any +} + +// docker hw can be defined with either deviceRequests (simpler, if you have a driver), or in advanced way +// advanced way means you have to defined different params like devices, cggroups, caps, etc +export interface dockerHwInit { + deviceRequests?: dockerDeviceRequest + advanced?: ArgumentValues + runtime?: string +} + +export interface ComputeResource { + id: ComputeResourceType + description?: string + type?: string + kind?: string // discreet, named, etc + total: number // total number of specific resource + min: number // min number of resource needed for a job + max: number // max number of resource for a job + inUse?: number // for display purposes + init?: dockerHwInit +} +export interface ComputeResourceRequest { + id: string + amount: number +} + +export interface ComputeResourceRequestWithPrice extends ComputeResourceRequest { + price?: number // price per unit per minute +} + +export interface ComputeEnvFees { + feeToken: string + prices: ComputeResourcesPricingInfo[] +} +export interface ComputeEnvFeesStructure { + [chainId: string]: ComputeEnvFees[] +} + +export interface RunningPlatform { + architecture: string + os?: string +} + +export interface ComputeAccessList { + addresses: string[] + accessLists: { [chainId: string]: string[] } +} + +export interface ComputeEnvironmentFreeOptions { + // only if a compute env exposes free jobs + storageExpiry?: number + maxJobDuration?: number + minJobDuration?: number + maxJobs?: number // maximum number of simultaneous free jobs + resources?: ComputeResource[] + access: ComputeAccessList +} +export interface ComputeEnvironmentBaseConfig { + description?: string // v1 + storageExpiry?: number // amount of seconds for storage + minJobDuration?: number // min billable seconds for a paid job + maxJobDuration?: number // max duration in seconds for a paid job + maxJobs?: number // maximum number of simultaneous paid jobs + fees: ComputeEnvFeesStructure + resources?: ComputeResource[] + access: ComputeAccessList + free?: ComputeEnvironmentFreeOptions + platform: RunningPlatform +} + +export interface ComputeRuntimes { + [key: string]: { + path?: string + runtimeArgs?: string[] // Optional runtime arguments + } +} +export interface ComputeEnvironment extends ComputeEnvironmentBaseConfig { + id: string // v1 + runningJobs: number + runningfreeJobs?: number + consumerAddress: string // v1 + queuedJobs: number + queuedFreeJobs: number + queMaxWaitTime: number + queMaxWaitTimeFree: number + runMaxWaitTime: number + runMaxWaitTimeFree: number +} + +export interface C2DDockerConfig { + socketPath: string + protocol: string + host: string + port: number + caPath: string + certPath: string + keyPath: string + storageExpiry?: number + maxJobDuration?: number + minJobDuration?: number + maxJobs?: number + fees: ComputeEnvFeesStructure + resources?: ComputeResource[] // optional, owner can overwrite + free?: ComputeEnvironmentFreeOptions + access: ComputeAccessList + imageRetentionDays?: number // Default: 7 days + imageCleanupInterval?: number // Default: 86400 seconds (24 hours) +} + +export type ComputeResultType = + | 'imageLog' + | 'algorithmLog' + | 'output' + | 'configurationLog' + | 'publishLog' + +export interface ComputeResult { + filename: string + filesize: number + type: ComputeResultType + index?: number +} + +export type DBComputeJobMetadata = { + [key: string]: string | number | boolean +} + +export interface ComputeJobTerminationDetails { + OOMKilled: boolean + exitCode: number +} +export interface ComputeJob { + owner: string + did?: string + jobId: string + dateCreated: string + dateFinished: string + status: number + statusText: string + results: ComputeResult[] + inputDID?: string[] + algoDID?: string + maxJobDuration?: number + agreementId?: string + environment?: string + metadata?: DBComputeJobMetadata + terminationDetails?: ComputeJobTerminationDetails + queueMaxWaitTime: number // max time in seconds a job can wait in the queue before being started +} + +export interface ComputeOutput { + publishAlgorithmLog?: boolean + publishOutput?: boolean + providerAddress?: string + providerUri?: string + metadataUri?: string + nodeUri?: string + owner?: string + secretStoreUri?: string + whitelist?: string[] +} + +export interface ComputeAsset { + fileObject?: BaseFileObject + documentId?: string + serviceId?: string + transferTxId?: string + userdata?: { [key: string]: any } +} +export interface ExtendedMetadataAlgorithm extends MetadataAlgorithm { + container: { + // retain existing properties + entrypoint: string + image: string + tag: string + checksum: string + dockerfile?: string // optional + additionalDockerFiles?: { [key: string]: any } + consumerParameters?: ConsumerParameter[] + } +} +export interface ComputeAlgorithm { + documentId?: string + serviceId?: string + fileObject?: BaseFileObject + meta?: ExtendedMetadataAlgorithm + transferTxId?: string + algocustomdata?: { [key: string]: any } + userdata?: { [key: string]: any } + envs?: { [key: string]: any } +} + +export interface AlgoChecksums { + files: string + container: string + serviceId?: string +} + +export interface DBComputeJobPayment { + chainId: number + token: string + lockTx: string + claimTx: string + cost: number +} + +// this is the internal structure +export interface DBComputeJob extends ComputeJob { + clusterHash: string + configlogURL: string + publishlogURL: string + algologURL: string + outputsURL: string + stopRequested: boolean + algorithm: ComputeAlgorithm + assets: ComputeAsset[] + isRunning: boolean + isStarted: boolean + containerImage: string + isFree: boolean + algoStartTimestamp: string + algoStopTimestamp: string + resources: ComputeResourceRequestWithPrice[] + payment?: DBComputeJobPayment + metadata?: DBComputeJobMetadata + additionalViewers?: string[] // addresses of additional addresses that can get results + algoDuration: number // duration of the job in seconds +} + +// make sure we keep them both in sync +export enum C2DStatusNumber { + // eslint-disable-next-line no-unused-vars + JobStarted = 0, + // eslint-disable-next-line no-unused-vars + JobQueued = 1, + // eslint-disable-next-line no-unused-vars + JobQueuedExpired = 2, + // eslint-disable-next-line no-unused-vars + PullImage = 10, + // eslint-disable-next-line no-unused-vars + PullImageFailed = 11, + // eslint-disable-next-line no-unused-vars + BuildImage = 12, + // eslint-disable-next-line no-unused-vars + BuildImageFailed = 13, + // eslint-disable-next-line no-unused-vars + ConfiguringVolumes = 20, + // eslint-disable-next-line no-unused-vars + VolumeCreationFailed = 21, + // eslint-disable-next-line no-unused-vars + ContainerCreationFailed = 22, + // eslint-disable-next-line no-unused-vars + Provisioning = 30, + // eslint-disable-next-line no-unused-vars + DataProvisioningFailed = 31, + // eslint-disable-next-line no-unused-vars + AlgorithmProvisioningFailed = 32, + // eslint-disable-next-line no-unused-vars + DataUploadFailed = 33, + // eslint-disable-next-line no-unused-vars + RunningAlgorithm = 40, + // eslint-disable-next-line no-unused-vars + AlgorithmFailed = 41, + // eslint-disable-next-line no-unused-vars + DiskQuotaExceeded = 42, + // eslint-disable-next-line no-unused-vars + FilteringResults = 50, + // eslint-disable-next-line no-unused-vars + PublishingResults = 60, + // eslint-disable-next-line no-unused-vars + ResultsFetchFailed = 61, + // eslint-disable-next-line no-unused-vars + ResultsUploadFailed = 62, + // eslint-disable-next-line no-unused-vars + JobFinished = 70 +} +export enum C2DStatusText { + // eslint-disable-next-line no-unused-vars + JobStarted = 'Job started', + // eslint-disable-next-line no-unused-vars + JobQueued = 'Job queued', + // eslint-disable-next-line no-unused-vars + JobQueuedExpired = 'Job expired in queue', + // eslint-disable-next-line no-unused-vars + PullImage = 'Pulling algorithm image', + // eslint-disable-next-line no-unused-vars + PullImageFailed = 'Pulling algorithm image failed', + // eslint-disable-next-line no-unused-vars + BuildImage = 'Building algorithm image', + // eslint-disable-next-line no-unused-vars + BuildImageFailed = 'Building algorithm image failed', + // eslint-disable-next-line no-unused-vars + ConfiguringVolumes = 'Configuring volumes', + // eslint-disable-next-line no-unused-vars + VolumeCreationFailed = 'Volume creation failed', + // eslint-disable-next-line no-unused-vars + ContainerCreationFailed = 'Container creation failed', + // eslint-disable-next-line no-unused-vars + Provisioning = 'Provisioning data', + // eslint-disable-next-line no-unused-vars + DataProvisioningFailed = 'Data provisioning failed', + // eslint-disable-next-line no-unused-vars + AlgorithmProvisioningFailed = 'Algorithm provisioning failed', + // eslint-disable-next-line no-unused-vars + DataUploadFailed = 'Data upload to container failed', + // eslint-disable-next-line no-unused-vars + RunningAlgorithm = 'Running algorithm ', + // eslint-disable-next-line no-unused-vars + AlgorithmFailed = 'Failed to run algorithm', + // eslint-disable-next-line no-unused-vars + DiskQuotaExceeded = 'Error: disk quota exceeded', + // eslint-disable-next-line no-unused-vars + FilteringResults = 'Filtering results', + // eslint-disable-next-line no-unused-vars + PublishingResults = 'Publishing results', + // eslint-disable-next-line no-unused-vars + ResultsFetchFailed = 'Failed to get outputs folder from container', + // eslint-disable-next-line no-unused-vars + ResultsUploadFailed = 'Failed to upload results to storage', + // eslint-disable-next-line no-unused-vars + JobFinished = 'Job finished' +} diff --git a/src/@types/C2D/C2D_OPFK8.ts b/src/@types/C2D/C2D_OPFK8.ts new file mode 100644 index 000000000..9c894bd38 --- /dev/null +++ b/src/@types/C2D/C2D_OPFK8.ts @@ -0,0 +1,94 @@ +/* The following are specific to OPF_k8 compute engine */ +export interface OPFK8ComputeStageInput { + index: number + id?: string + remote?: any + url?: string[] +} +export interface OPFK8ComputeStageAlgorithm { + id?: string + url?: string + remote?: any + rawcode?: string + container?: { + /** + * The command to execute, or script to run inside the Docker image. + * @type {string} + */ + entrypoint: string + + /** + * Name of the Docker image. + * @type {string} + */ + image: string + + /** + * Tag of the Docker image. + * @type {string} + */ + tag: string + } +} + +export interface OPFK8ComputeOutput { + // this is a copy of ComputeOutput, but they could diverge in the future + publishAlgorithmLog?: boolean + publishOutput?: boolean + providerAddress?: string + providerUri?: string + metadataUri?: string + nodeUri?: string + owner?: string + secretStoreUri?: string + whitelist?: string[] +} +export interface OPFK8ComputeStage { + index: number + input: OPFK8ComputeStageInput[] + algorithm: OPFK8ComputeStageAlgorithm + compute?: {} + output: OPFK8ComputeOutput +} + +export interface OPFK8ComputeWorkflow { + stages: OPFK8ComputeStage[] +} +export interface OPFK8ComputeStart { + workflow: OPFK8ComputeWorkflow + owner: string + agreementId: string + providerSignature: string + providerAddress: string + environment: string + validUntil: number + nonce: number + chainId: number +} + +export interface OPFK8ComputeStop { + jobId: string + owner: string + agreementId?: string + providerSignature: string // message=owner+jobId + providerAddress: string + nonce: number +} + +export interface OPFK8ComputeGetStatus { + agreementId?: string + jobId?: string + owner?: string + providerSignature: string // message=owner+jobId(if any) + providerAddress: string + nonce: number +} + +export interface OPFK8ComputeGetResult { + jobId: string + owner: string + index: number + providerSignature: string // message=owner+jobId + providerAddress: string + nonce: number +} diff --git a/src/@types/DDO/Credentials.ts b/src/@types/DDO/Credentials.ts index b7bd2df1b..5044541ec 100644 --- a/src/@types/DDO/Credentials.ts +++ b/src/@types/DDO/Credentials.ts @@ -1,9 +1,5 @@ -export interface Credential { - type?: string - values?: string[] -} - -export interface Credentials { - allow?: Credential[] - deny?: Credential[] +// Supported credential types enum-like object for easier use in code +export const CREDENTIALS_TYPES = { + ADDRESS: 'address' as const, + ACCESS_LIST: 'accessList' as const } diff --git a/src/@types/DDO/DDO.ts b/src/@types/DDO/DDO.ts deleted file mode 100644 index 5ca15a406..000000000 --- a/src/@types/DDO/DDO.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Service } from './Service' -import { Metadata } from './Metadata' -import { Credentials } from './Credentials' -import { Event } from './Event' -import { Nft } from './Nft' - -/** - * DID Descriptor Object. - * Contains metadata about the asset, and define access in at least one service. - */ -export interface DDO { - /** - * Contexts used for validation. - * @type {string[]} - */ - '@context': string[] - - /** - * DID, descentralized ID. - * Computed as sha256(address of NFT contract + chainId) - * @type {string} - */ - id: string - - /** - * Version information in SemVer notation - * referring to the DDO spec version - * @type {string} - */ - version: string - - /** - * NFT contract address - * @type {string} - */ - nftAddress: string - - /** - * ChainId of the network the DDO was published to. - * @type {number} - */ - chainId: number - - /** - * Stores an object describing the asset. - * @type {Metadata} - */ - metadata: Metadata - - /** - * Stores an array of services defining access to the asset. - * @type {Service[]} - */ - services: Service[] - - /** - * Describes the credentials needed to access a dataset - * in addition to the services definition. - * @type {Credentials} - */ - credentials?: Credentials - - /** - * Describes the event of last metadata event - * @type {Event} - */ - event?: Event - - nft?: Nft -} diff --git a/src/@types/DDO/Event.ts b/src/@types/DDO/Event.ts deleted file mode 100644 index 84e75fc4f..000000000 --- a/src/@types/DDO/Event.ts +++ /dev/null @@ -1,31 +0,0 @@ -export interface Event { - /** - * TX id of the last create/update - * @type {string} - */ - txid?: string - - /** - * Block of txid - * @type {number} - */ - block?: number - - /** - * Sender of tx - * @type {String} - */ - from?: string - - /** - * Contract - * @type {String} - */ - contract?: string - - /** - * datetime of tx - * @type {String} - */ - datetime?: string -} diff --git a/src/@types/DDO/Metadata.ts b/src/@types/DDO/Metadata.ts deleted file mode 100644 index e830f4294..000000000 --- a/src/@types/DDO/Metadata.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { ConsumerParameter } from './ConsumerParameter' - -export interface MetadataAlgorithm { - /** - * Programming language used to implement the software. - * @type {string} - */ - language?: string - - /** - * Version of the software preferably in SemVer notation. - * @type {string} - */ - version?: string - - /** - * Rawcode - * @type {string} - */ - rawcode?: string - - /** - * Format - * @type {string} - */ - format?: string - - /** - * Object describing the Docker container image. - * @type {Object} - */ - container?: { - /** - * The command to execute, or script to run inside the Docker image. - * @type {string} - */ - entrypoint: string - - /** - * Name of the Docker image. - * @type {string} - */ - image: string - - /** - * Tag of the Docker image. - * @type {string} - */ - tag: string - - /** - * Checksum of the Docker image. - * @type {string} - */ - checksum: string - - /** - * Array of objects describing the consumer parameters - * @type {ConsumerParameter[]} - */ - consumerParameters?: ConsumerParameter[] - } - - /** - * Array of objects describing the consumer parameters - * @type {ConsumerParameter[]} - */ - consumerParameters?: ConsumerParameter[] -} - -export interface Metadata { - /** - * Contains the date of publishing in ISO Date Time - * @type {string} - */ - created: string - - /** - * Contains the the date of last update in ISO Date Time - * @type {string} - */ - updated: string - - /** - * Descriptive name or title of the asset. - * @type {string} - */ - name: string - - /** - * Details of what the resource is. - * @type {string} - */ - description: string - - /** - * Asset type. Includes "dataset" (e.g. csv file), "algorithm" (e.g. Python script). - * Each type needs a different subset of metadata attributes. - * @type {'dataset' | 'algorithm'} - */ - type: 'dataset' | 'algorithm' - - /** - * Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). - * @type {string} - */ - author: string - - /** - * Short name referencing the license of the asset. - * If it’s not specified, the following value will be added: “No License Specified”. - * @type {string} - */ - license: string - - /** - * Mapping of URL strings for data samples, or links to find out more information. - * Links may be to either a URL or another asset. - * @type {string[]} - */ - links?: string[] - - /** - * Array of keywords or tags used to describe this content. Empty by default. - * @type {string[]} - */ - tags?: string[] - - /** - * Array of categories associated to the asset. Note: recommended to use tags instead of this. - * @type {string[]} - */ - categories?: string[] - - /** - * The party holding the legal copyright. Empty by default. - * @type {string} - */ - copyrightHolder?: string - - /** - *The language of the content. Use one of the language codes from the IETF BCP 47 standard - * @type {string} - */ - contentLanguage?: string - - /** - * Information about asset of type algorithm. Required for algorithm assets. - * @type {MetadataAlgorithm} - */ - algorithm?: MetadataAlgorithm - - /** - * Stores additional information, this is customizable by publisher - * @type {any} - */ - additionalInformation?: any -} - -export interface MetadataProof { - validatorAddress?: string - r?: string - s?: string - v?: number -} -export interface ValidateMetadata { - valid: Boolean - errors?: Object - hash?: string - proof?: MetadataProof -} diff --git a/src/@types/DDO/Nft.ts b/src/@types/DDO/Nft.ts deleted file mode 100644 index 307756fce..000000000 --- a/src/@types/DDO/Nft.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface Nft { - state: number - address: string - name?: string - symbol?: string - tokenURI?: string - owner?: string - created?: string -} diff --git a/src/@types/DDO/Service.ts b/src/@types/DDO/Service.ts deleted file mode 100644 index 8ba3c30e1..000000000 --- a/src/@types/DDO/Service.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { ConsumerParameter } from './ConsumerParameter' -import { Credentials } from './Credentials' - -export interface PublisherTrustedAlgorithm { - /** - * The DID of the algorithm which is trusted by the publisher. - * @type {string} - */ - did: string - - /** - * Hash of algorithm’s files section. - * @type {string} - */ - filesChecksum: string - - /** - * Hash of algorithm’s metadata.algorithm.container section. - * @type {string} - */ - containerSectionChecksum: string -} - -export interface ServiceComputeOptions { - /** - * If true, any passed raw text will be allowed to run. - * Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. - * Should be false by default in all implementations. - * @type {boolean} - */ - allowRawAlgorithm: boolean - - /** - * If true, the algorithm job will have network access. - * @type {boolean} - */ - allowNetworkAccess: boolean - - /** - * If empty, then any published algorithm is allowed. - * Otherwise, only published algorithms by some publishers are allowed - * @type {string[]} - */ - publisherTrustedAlgorithmPublishers: string[] - - /** - * If empty, then any published algorithm is allowed. (see below) - * @type {PublisherTrustedAlgorithm[]} - */ - publisherTrustedAlgorithms: PublisherTrustedAlgorithm[] -} - -export interface Service { - /** - * Unique ID - * @type {string} - */ - id: string - - /** - * Type of service (access, compute, wss. - * @type {string} - */ - type: 'access' | 'compute' | string - - /** - * Encrypted file URLs. - * @type {string} - */ - files: string - - /** - * Datatoken address - * @type {string} - */ - datatokenAddress: string - - /** - * Provider URL (schema + host). - * @type {string} - */ - serviceEndpoint: string - - /** - * Describes the credentials needed to access a service - * @type {Credentials} - */ - credentials?: Credentials - - /** - * Describing how long the service can be used after consumption is initiated. - * @type {number} - */ - timeout: number - - /** - * Service friendly name - * @type {string} - */ - name?: string - - /** - * Service description - * @type {string} - */ - description?: string - - /** - * Service lifecycle state. - * Values have the same meaning as on nft level https://docs.oceanprotocol.com/developers/ddo-specification#state - * undefined state is considered active - * @type {number} - */ - state?: number - - /** - * If service is of type compute, holds information about the compute-related privacy settings & resources. - * @type {ServiceComputeOptions} - */ - compute?: ServiceComputeOptions - - /** - * Array of objects describing the consumer parameters - * @type {ConsumerParameter[]} - */ - consumerParameters?: ConsumerParameter[] - - /** - * Stores service specific additional information, this is customizable by publisher - * @type {any} - */ - additionalInformation?: any -} diff --git a/src/@types/Escrow.ts b/src/@types/Escrow.ts new file mode 100644 index 000000000..9e9aa6b16 --- /dev/null +++ b/src/@types/Escrow.ts @@ -0,0 +1,17 @@ +export interface EscrowAuthorization { + address: string + maxLockedAmount: BigInt + currentLockedAmount: BigInt + maxLockSeconds: BigInt + maxLockCounts: BigInt + currentLocks: BigInt +} + +export interface EscrowLock { + jobId: BigInt + payer: string + payee: string + amount: BigInt + expiry: BigInt + token: string +} diff --git a/src/@types/Fees.ts b/src/@types/Fees.ts index b399abcb8..0759cbe05 100644 --- a/src/@types/Fees.ts +++ b/src/@types/Fees.ts @@ -28,7 +28,6 @@ export interface ProviderFeeData { export interface ProviderFeeValidation { isValid: boolean // true if valid provider fee for download - isComputeValid: boolean // true is valid for compute message: any validUntil: number } @@ -57,7 +56,16 @@ export interface ProviderComputeInitialize { providerFee?: ProviderFees } +export interface ProviderComputeInitializePayment { + escrowAddress: string + payee: string + chainId: number + minLockSeconds: number + token: string + amount: string +} export interface ProviderComputeInitializeResults { algorithm?: ProviderComputeInitialize datasets?: ProviderComputeInitialize[] + payment: ProviderComputeInitializePayment } diff --git a/src/@types/IndexedMetadata.ts b/src/@types/IndexedMetadata.ts new file mode 100644 index 000000000..607c98e4a --- /dev/null +++ b/src/@types/IndexedMetadata.ts @@ -0,0 +1,18 @@ +export type PriceType = 'fixedrate' | 'dispenser' + +export interface ServicePrice { + type: PriceType + price: string + contract: string + token?: string + exchangeId?: string +} + +export interface ServiceStats { + datatokenAddress: string + name: string + symbol: string + serviceId: string + orders?: number + prices?: ServicePrice[] +} diff --git a/src/@types/KeyManager.ts b/src/@types/KeyManager.ts new file mode 100644 index 000000000..f117ea02f --- /dev/null +++ b/src/@types/KeyManager.ts @@ -0,0 +1,94 @@ +import type { PeerId } from '@libp2p/interface' +import { Wallet } from 'ethers' +import { EncryptMethod } from './fileObject.js' +import { Readable } from 'stream' +/** + * Key provider types supported by KeyManager + */ + +export type KeyProviderType = 'raw' | 'gcp-kms' // 'aws-kms' in future +/** + * Base interface for key providers. + * Each key provider implementation must implement this interface. + * Initialization happens in the constructor. + */ +export interface IKeyProvider { + /** + * Get the type of this key provider + */ + getType(): string + + /** + * Get the libp2p PeerId + */ + getPeerId(): PeerId + + /** + * Get the libp2p private key + */ + getLibp2pPrivateKey(): any // libp2p PrivateKey type + + /** + * Get the libp2p public key as Uint8Array + */ + getPublicKey(): Uint8Array + + /** + * Get the Ethereum address derived from the private key + */ + getEthAddress(): string + /** + * Get the Ethereum Wallet derived from the private key + */ + getEthWallet(): Wallet + + /** + * Get the raw private key bytes for EVM signer creation. + * This is used to create ethers Wallet instances. + */ + getRawPrivateKeyBytes(): Uint8Array + + /** + * Encrypts data according to a given algorithm + * @param data data to encrypt + * @param algorithm encryption algorithm AES or ECIES + */ + encrypt(data: Uint8Array, algorithm: EncryptMethod): Promise + + /** + * Decrypts data according to a given algorithm using node keys + * @param data data to decrypt + * @param algorithm decryption algorithm AES or ECIES + */ + decrypt(data: Uint8Array, algorithm: EncryptMethod): Promise + /** + * Encrypts a stream according to a given algorithm using node keys + * @param inputStream - Readable stream to encrypt + * @param algorithm - Encryption algorithm AES or ECIES + * @returns Readable stream with encrypted data + */ + encryptStream(inputStream: Readable, algorithm: EncryptMethod): Readable + /** + * Decrypts a stream according to a given algorithm using node keys + * @param inputStream - Readable stream to decrypt + * @param algorithm - Decryption algorithm AES or ECIES + * @returns Readable stream with decrypted data + */ + decryptStream(inputStream: Readable, algorithm: EncryptMethod): Readable + /** + * Decrypts using ethCrypto.decryptWithPrivateKey + * @param encryptedObject + * @returns Decrypted data + */ + ethCryptoDecryptWithPrivateKey(encryptedObject: any): Promise + /** + * Signs message using ethers wallet.signMessage + * @param message - Message to sign + * @returns Signature + */ + signMessage(message: string): Promise + /** + * Cleanup resources if needed (e.g., close connections) + */ + cleanup?(): Promise +} diff --git a/src/@types/OceanNode.ts b/src/@types/OceanNode.ts index bc0f9d535..9cda85acb 100644 --- a/src/@types/OceanNode.ts +++ b/src/@types/OceanNode.ts @@ -1,8 +1,9 @@ import { Stream } from 'stream' import { RPCS } from './blockchain' -import { C2DClusterInfo } from './C2D' +import { C2DClusterInfo, C2DDockerConfig } from './C2D/C2D' import { FeeStrategy } from './Fees' import { Schema } from '../components/database' +import { KeyProviderType } from './KeyManager' export interface OceanNodeDBConfig { url: string | null @@ -22,8 +23,23 @@ export interface OceanNodeKeys { publicKey: any privateKey: any ethAddress: string + type?: KeyProviderType + // Raw private key config (when type is 'raw') + // GCP KMS config (when type is 'gcp-kms') + gcpKmsConfig?: { + projectId: string + location: string + keyRing: string + keyName: string + keyVersion?: string + } +} +/* eslint-disable no-unused-vars */ +export enum dhtFilterMethod { + filterPrivate = 'filterPrivate', // default, remove all private addresses from DHT + filterPublic = 'filterPublic', // remove all public addresses from DHT + filterNone = 'filterNone' // do not remove all any addresses from DHT } - export interface OceanNodeP2PConfig { bootstrapNodes: string[] bootstrapTimeout: number @@ -35,13 +51,14 @@ export interface OceanNodeP2PConfig { ipV4BindAddress: string | null ipV4BindTcpPort: number | null ipV4BindWsPort: number | null + ipV4BindWssPort: number | null ipV6BindAddress: string | null ipV6BindTcpPort: number | null ipV6BindWsPort: number | null pubsubPeerDiscoveryInterval: number dhtMaxInboundStreams: number dhtMaxOutboundStreams: number - enableDHTServer: boolean + dhtFilter: dhtFilterMethod mDNSInterval: number connectionsMaxParallelDials: number connectionsDialTimeout: number @@ -59,6 +76,7 @@ export interface OceanNodeP2PConfig { autoDialConcurrency: number maxPeerAddrsToDial: number autoDialInterval: number + enableNetworkStats: boolean } export interface OceanNodeDockerConfig { @@ -70,30 +88,48 @@ export interface OceanNodeDockerConfig { certPath?: string keyPath?: string } + +export interface AccessListContract { + [chainId: string]: string[] +} + export interface OceanNodeConfig { + dockerComputeEnvironments: C2DDockerConfig[] authorizedDecrypters: string[] + authorizedDecryptersList: AccessListContract | null allowedValidators: string[] + allowedValidatorsList: AccessListContract | null + authorizedPublishers: string[] + authorizedPublishersList: AccessListContract | null keys: OceanNodeKeys hasP2P: boolean p2pConfig: OceanNodeP2PConfig | null hasIndexer: boolean hasHttp: boolean - hasDashboard: boolean + hasControlPanel: boolean dbConfig?: OceanNodeDBConfig httpPort: number feeStrategy: FeeStrategy + ipfsGateway?: string | null + arweaveGateway?: string | null supportedNetworks?: RPCS + claimDurationTimeout: number indexingNetworks?: RPCS c2dClusters: C2DClusterInfo[] - c2dNodeUri: string - dockerConfig?: OceanNodeDockerConfig - accountPurgatoryUrl: string - assetPurgatoryUrl: string + accountPurgatoryUrl: string | null + assetPurgatoryUrl: string | null allowedAdmins?: string[] + allowedAdminsList?: AccessListContract | null codeHash?: string - rateLimit?: number + rateLimit?: number // per request ip or peer + maxConnections?: number // global, regardless of client address(es) denyList?: DenyList unsafeURLs?: string[] + isBootstrap?: boolean + validateUnsignedDDO?: boolean + jwtSecret?: string + httpCertPath?: string + httpKeyPath?: string } export interface P2PStatusResponse { @@ -126,6 +162,7 @@ export interface StorageTypes { export interface OceanNodeStatus { id: string publicKey: string + friendlyName: string address: string version: string http: boolean @@ -136,9 +173,9 @@ export interface OceanNodeStatus { platform: any uptime?: number // seconds since start codeHash?: string - allowedAdmins?: string[] + allowedAdmins?: { addresses: string[]; accessLists: AccessListContract } // detailed information - c2dClusters?: C2DClusterInfo[] + c2dClusters?: any[] supportedSchemas?: Schema[] } diff --git a/src/@types/Typesense.ts b/src/@types/Typesense.ts index 7e3a69d09..4939374eb 100644 --- a/src/@types/Typesense.ts +++ b/src/@types/Typesense.ts @@ -70,8 +70,9 @@ export interface TypesenseCollectionDropFieldSchema { drop: true } -export interface TypesenseCollectionUpdateSchema - extends Partial> { +export interface TypesenseCollectionUpdateSchema extends Partial< + Omit +> { fields?: (TypesenseCollectionFieldSchema | TypesenseCollectionDropFieldSchema)[] } diff --git a/src/@types/commands.ts b/src/@types/commands.ts index 763e636a4..4fbe633cc 100644 --- a/src/@types/commands.ts +++ b/src/@types/commands.ts @@ -1,7 +1,13 @@ import { ValidateParams } from '../components/httpRoutes/validateCommands.js' -import { DDO } from './DDO/DDO' import { P2PCommandResponse } from './OceanNode' -import type { ComputeAsset, ComputeAlgorithm, ComputeOutput } from './C2D' +import { DDO } from '@oceanprotocol/ddo-js' +import type { + ComputeAsset, + ComputeAlgorithm, + ComputeOutput, + ComputeResourceRequest, + DBComputeJobMetadata +} from './C2D/C2D.js' import { ArweaveFileObject, FileObjectType, @@ -14,11 +20,25 @@ import { export interface Command { command: string // command name node?: string // if not present it means current node + authorization?: string + caller?: string | string[] // added by our node for rate limiting } +export interface GetP2PPeerCommand extends Command { + peerId: string +} +export interface FindPeerCommand extends Command { + peerId: string + timeout?: string +} + +export interface GetP2PPeersCommand extends Command {} +export interface GetP2PNetworkStatsCommand extends Command {} + export interface AdminCommand extends Command { expiryTimestamp: number signature: string + address?: string } export interface AdminCollectFeesHandlerResponse { @@ -41,6 +61,7 @@ export interface DownloadCommand extends Command { signature: string aes_encrypted_key?: string // if not present it means download without encryption policyServer?: any // object to pass to policy server + userData?: Record } export interface FileInfoCommand extends Command { @@ -63,9 +84,15 @@ export interface FindDDOCommand extends DDOCommand { // https://github.com/oceanprotocol/ocean-node/issues/47 export interface ValidateDDOCommand extends Command { ddo: DDO + publisherAddress?: string + nonce?: string + signature?: string + message?: string } -export interface StatusCommand extends Command {} +export interface StatusCommand extends Command { + detailed?: boolean +} export interface DetailedStatusCommand extends StatusCommand {} export interface EchoCommand extends Command {} @@ -93,16 +120,23 @@ export interface DecryptDDOCommand extends Command { } export interface EncryptCommand extends Command { + nonce: string + consumerAddress: string + signature: string blob: string encoding?: string encryptionType?: EncryptMethod.AES | EncryptMethod.ECIES + policyServer?: any // object to pass to policy server } export interface EncryptFileCommand extends Command { + nonce: string + consumerAddress: string + signature: string encryptionType?: EncryptMethod.AES | EncryptMethod.ECIES files?: BaseFileObject rawData?: Buffer - // UrlFileObject | ArweaveFileObject | IpfsFileObject + policyServer?: any // object to pass to policy server } export interface NonceCommand extends Command { @@ -135,35 +169,63 @@ export interface AdminReindexChainCommand extends AdminCommand { block?: number } +export interface AdminFetchConfigCommand extends AdminCommand {} + +export interface AdminPushConfigCommand extends AdminCommand { + config: Record +} + export interface ICommandHandler { handle(command: Command): Promise + verifyParamsAndRateLimits(task: Command): Promise +} + +export interface IValidateCommandHandler extends ICommandHandler { validate(command: Command): ValidateParams } +export interface IValidateAdminCommandHandler extends ICommandHandler { + validate(command: AdminCommand): Promise +} + export interface ComputeGetEnvironmentsCommand extends Command { chainId?: number } -export interface ComputeDetails { - env: string // with hash - validUntil: number +export interface ComputePayment { + chainId: number + token: string + resources?: ComputeResourceRequest[] // only used in initializeCompute } export interface ComputeInitializeCommand extends Command { - datasets: [ComputeAsset] + datasets: ComputeAsset[] algorithm: ComputeAlgorithm - compute: ComputeDetails + environment: string + payment: ComputePayment consumerAddress: string + signature?: string + maxJobDuration: number + policyServer?: any // object to pass to policy server + queueMaxWaitTime?: number // max time in seconds a job can wait in the queue before being started } -export interface ComputeStartCommand extends Command { +export interface FreeComputeStartCommand extends Command { consumerAddress: string signature: string nonce: string environment: string algorithm: ComputeAlgorithm - dataset: ComputeAsset - additionalDatasets?: ComputeAsset[] + datasets?: ComputeAsset[] output?: ComputeOutput + resources?: ComputeResourceRequest[] + maxJobDuration?: number + policyServer?: any // object to pass to policy server + metadata?: DBComputeJobMetadata + additionalViewers?: string[] // addresses of additional addresses that can get results + queueMaxWaitTime?: number // max time in seconds a job can wait in the queue before being started +} +export interface PaidComputeStartCommand extends FreeComputeStartCommand { + payment: ComputePayment } export interface ComputeStopCommand extends Command { @@ -181,6 +243,12 @@ export interface ComputeGetResultCommand extends Command { jobId: string index: number } +export interface ComputeGetStreamableLogsCommand extends Command { + consumerAddress: string + signature: string + nonce: string + jobId: string +} export interface ComputeGetStatusCommand extends Command { consumerAddress?: string @@ -218,3 +286,22 @@ export interface StartStopIndexingCommand extends AdminCommand { export interface PolicyServerPassthroughCommand extends Command { policyServerPassthrough?: any } + +export interface PolicyServerInitializeCommand extends Command { + documentId?: string + serviceId?: string + consumerAddress?: string + policyServer?: any +} + +export interface CreateAuthTokenCommand extends Command { + address: string + signature: string + validUntil?: number | null +} + +export interface GetJobsCommand extends Command { + environments?: string[] + fromTimestamp?: string + consumerAddrs?: string[] +} diff --git a/src/@types/fileObject.ts b/src/@types/fileObject.ts index a662b51ec..15e3485cf 100644 --- a/src/@types/fileObject.ts +++ b/src/@types/fileObject.ts @@ -19,7 +19,7 @@ export interface BaseFileObject { export interface UrlFileObject extends BaseFileObject { url: string method: string - headers?: [HeadersObject] + headers?: HeadersObject } export interface IpfsFileObject extends BaseFileObject { diff --git a/src/@types/humanhash.d.ts b/src/@types/humanhash.d.ts new file mode 100644 index 000000000..3d305eb40 --- /dev/null +++ b/src/@types/humanhash.d.ts @@ -0,0 +1,13 @@ +declare module 'humanhash' { + class HumanHasher { + constructor(wordlist?: string[]) + humanize(hexdigest: string, words?: number, separator?: string): string + uuid( + words?: number, + separator?: string, + version?: number + ): { humanhash: string; uuid: string } + } + + export = HumanHasher +} diff --git a/src/@types/index.ts b/src/@types/index.ts index 8a5d367bc..8ac35eeb1 100644 --- a/src/@types/index.ts +++ b/src/@types/index.ts @@ -1,3 +1,3 @@ export * from './OceanNode' -export * from './C2D' +export * from './C2D/C2D' export * from './Typesense' diff --git a/src/@types/policyServer.ts b/src/@types/policyServer.ts index b0b42537c..51704e41e 100644 --- a/src/@types/policyServer.ts +++ b/src/@types/policyServer.ts @@ -3,3 +3,11 @@ export interface PolicyServerResult { message?: string // error message, if any httpStatus?: number // status returned by server } + +export interface PolicyServerTask { + sessionId?: string + successRedirectUri?: string + errorRedirectUri?: string + responseRedirectUri?: string + presentationDefinitionUri?: string +} diff --git a/src/OceanNode.ts b/src/OceanNode.ts index ba40feac9..f32cf7d87 100644 --- a/src/OceanNode.ts +++ b/src/OceanNode.ts @@ -3,14 +3,27 @@ import { OceanProvider } from './components/Provider/index.js' import { OceanIndexer } from './components/Indexer/index.js' import { OceanNodeConfig, P2PCommandResponse } from './@types/OceanNode.js' import { Database } from './components/database/index.js' +import { Escrow } from './components/core/utils/escrow.js' import { CoreHandlersRegistry } from './components/core/handler/coreHandlersRegistry.js' import { OCEAN_NODE_LOGGER } from './utils/logging/common.js' -import { ReadableString } from './components/P2P/handleProtocolCommands.js' -import StreamConcat from 'stream-concat' -import { pipe } from 'it-pipe' import { GENERIC_EMOJIS, LOG_LEVELS_STR } from './utils/logging/Logger.js' -import { Handler } from './components/core/handler/handler.js' +import { BaseHandler } from './components/core/handler/handler.js' import { C2DEngines } from './components/c2d/compute_engines.js' +import { Auth } from './components/Auth/index.js' +import { KeyManager } from './components/KeyManager/index.js' +import { BlockchainRegistry } from './components/BlockchainRegistry/index.js' +import { Blockchain } from './utils/blockchain.js' + +export interface RequestLimiter { + requester: string | string[] // IP address or peer ID + lastRequestTime: number // time of the last request done (in miliseconds) + numRequests: number // number of requests done in the specific time period +} + +export interface RequestDataCheck { + valid: boolean + updatedRequestData: RequestLimiter +} export class OceanNode { // eslint-disable-next-line no-use-before-define private static instance: OceanNode @@ -18,31 +31,80 @@ export class OceanNode { private coreHandlers: CoreHandlersRegistry // compute engines private c2dEngines: C2DEngines + // escrow + public escrow: Escrow // requester private remoteCaller: string | string[] + private requestMap: Map + private auth: Auth + // eslint-disable-next-line no-useless-constructor private constructor( + private config: OceanNodeConfig, private db?: Database, private node?: OceanP2P, private provider?: OceanProvider, - private indexer?: OceanIndexer + private indexer?: OceanIndexer, + public keyManager?: KeyManager, + public blockchainRegistry?: BlockchainRegistry ) { + if (keyManager) { + this.keyManager = keyManager + } else { + this.keyManager = new KeyManager(config) + } + if (blockchainRegistry) { + this.blockchainRegistry = blockchainRegistry + } else { + this.blockchainRegistry = new BlockchainRegistry(this.keyManager, config) + } this.coreHandlers = CoreHandlersRegistry.getInstance(this) + this.requestMap = new Map() + this.config = config + if (this.db && this.db?.authToken) { + this.auth = new Auth(this.db.authToken) + } if (node) { node.setCoreHandlers(this.coreHandlers) } + if (this.config) { + this.escrow = new Escrow( + this.config.supportedNetworks, + this.config.claimDurationTimeout, + this.blockchainRegistry + ) + } } // Singleton instance public static getInstance( + config?: OceanNodeConfig, db?: Database, node?: OceanP2P, provider?: OceanProvider, - indexer?: OceanIndexer + indexer?: OceanIndexer, + keyManager?: KeyManager, + blockchainRegistry?: BlockchainRegistry, + newInstance: boolean = false ): OceanNode { - if (!OceanNode.instance) { + if (!OceanNode.instance || newInstance) { + if (!keyManager || !blockchainRegistry) { + if (!config) { + throw new Error('KeyManager and BlockchainRegistry are required') + } + keyManager = new KeyManager(config) + blockchainRegistry = new BlockchainRegistry(keyManager, config) + } // prepare compute engines - this.instance = new OceanNode(db, node, provider, indexer) + this.instance = new OceanNode( + config, + db, + node, + provider, + indexer, + keyManager, + blockchainRegistry + ) } return this.instance } @@ -56,11 +118,23 @@ export class OceanNode { this.indexer = _indexer } - public async addC2DEngines(_config: OceanNodeConfig) { + public async addC2DEngines() { if (this.c2dEngines) { await this.c2dEngines.stopAllEngines() } - if (_config && _config.c2dClusters) this.c2dEngines = new C2DEngines(_config) + if (this.config && this.config.c2dClusters) { + if (!this.db || !this.db.c2d) { + OCEAN_NODE_LOGGER.error('C2DDatabase is mandatory for compute engines!') + return + } + this.c2dEngines = new C2DEngines( + this.config, + this.db.c2d, + this.escrow, + this.keyManager + ) + await this.c2dEngines.startAllEngines() + } } public getP2PNode(): OceanP2P | undefined { @@ -87,66 +161,70 @@ export class OceanNode { return this.coreHandlers } - public setRemoteCaller(client: string | string[]) { - this.remoteCaller = client + public getRequestMapSize(): number { + return this.requestMap.size + } + + public getRequestMap(): Map { + return this.requestMap + } + + public getAuth(): Auth { + return this.auth + } + + public getKeyManager(): KeyManager { + return this.keyManager } - public getRemoteCaller(): string | string[] { - return this.remoteCaller + public getBlockchainRegistry(): BlockchainRegistry { + return this.blockchainRegistry } /** - * Use this method to direct calls to the node as node cannot dial into itself - * @param message command message - * @param sink transform function + * Get a Blockchain instance for the given chainId. + * Delegates to BlockchainRegistry. */ - async handleDirectProtocolCommand( - message: string, - sink: any - ): Promise { - OCEAN_NODE_LOGGER.logMessage('Incoming direct command for ocean peer', true) - let status = null - // let statusStream - let sendStream = null - let response: P2PCommandResponse = null + public getBlockchain(chainId: number): Blockchain | null { + return this.blockchainRegistry.getBlockchain(chainId) + } + + public setConfig(config: OceanNodeConfig) { + this.config = config + if (this.config) { + this.escrow = new Escrow( + this.config.supportedNetworks, + this.config.claimDurationTimeout, + this.blockchainRegistry + ) + } + } + /** + * v3: Direct protocol command handler - no P2P, just call handler directly + * Returns {status, stream} without buffering + * @param message - JSON command string + */ + async handleDirectProtocolCommand(message: string): Promise { + OCEAN_NODE_LOGGER.logMessage('Incoming direct command for ocean peer', true) OCEAN_NODE_LOGGER.logMessage('Performing task: ' + message, true) try { const task = JSON.parse(message) - const handler: Handler = this.coreHandlers.getHandler(task.command) - if (handler === null) { - status = { - httpStatus: 501, - error: 'Unknown command or unexisting handler for command: ' + task.command + const handler: BaseHandler = this.coreHandlers.getHandler(task.command) + + if (!handler) { + return { + stream: null, + status: { + httpStatus: 501, + error: 'Unknown command or missing handler for: ' + task.command + } } - } else { - response = await handler.handle(task) - } - - if (response) { - // eslint-disable-next-line prefer-destructuring - status = response.status - sendStream = response.stream } - const statusStream = new ReadableString(JSON.stringify(status)) - if (sendStream == null) { - pipe(statusStream, sink) - } else { - const combinedStream = new StreamConcat([statusStream, sendStream], { - highWaterMark: JSON.stringify(status).length - // the size of the buffer is important! - }) - pipe(combinedStream, sink) - } - - return ( - response || { - status, - stream: null - } - ) + // Return response directly without buffering + return await handler.handle(task) } catch (err) { OCEAN_NODE_LOGGER.logMessageWithEmoji( 'handleDirectProtocolCommands Error: ' + err.message, @@ -156,8 +234,8 @@ export class OceanNode { ) return { - status: { httpStatus: 500, error: err.message }, - stream: null + stream: null, + status: { httpStatus: 500, error: err.message } } } } diff --git a/src/components/Auth/index.ts b/src/components/Auth/index.ts new file mode 100644 index 000000000..879c52625 --- /dev/null +++ b/src/components/Auth/index.ts @@ -0,0 +1,122 @@ +import { AuthToken, AuthTokenDatabase } from '../database/AuthTokenDatabase.js' +import jwt from 'jsonwebtoken' +import { checkNonce, NonceResponse } from '../core/utils/nonceHandler.js' +import { OceanNode } from '../../OceanNode.js' +import { getConfiguration } from '../../utils/index.js' +import { CommonValidation } from '../../utils/validators.js' + +export interface AuthValidation { + token?: string + address?: string + nonce?: string + signature?: string + message?: string + chainId?: string | null +} + +export class Auth { + private authTokenDatabase: AuthTokenDatabase + + public constructor(authTokenDatabase: AuthTokenDatabase) { + this.authTokenDatabase = authTokenDatabase + } + + public async getJwtSecret(): Promise { + const config = await getConfiguration() + return config.jwtSecret + } + + async getJWTToken(address: string, nonce: string, createdAt: number): Promise { + const jwtToken = jwt.sign( + { + address, + nonce, + createdAt + }, + await this.getJwtSecret() + ) + + return jwtToken + } + + async insertToken( + address: string, + jwtToken: string, + validUntil: number, + createdAt: number, + chainId?: string | null + ): Promise { + await this.authTokenDatabase.createToken( + jwtToken, + address, + validUntil, + createdAt, + chainId + ) + } + + async invalidateToken(jwtToken: string): Promise { + await this.authTokenDatabase.invalidateToken(jwtToken) + } + + async validateToken(token: string): Promise { + const tokenEntry = await this.authTokenDatabase.validateToken(token) + if (!tokenEntry) { + return null + } + return tokenEntry + } + + /** + * Validates the authentication or token + * You need to provider either a token or an address, signature and message + * @param {string} token - The token to validate + * @param {string} address - The address to validate + * @param {string} signature - The signature to validate + * @param {string} message - The message to validate + * @returns The validation result + */ + async validateAuthenticationOrToken( + authValidation: AuthValidation + ): Promise { + const { token, address, nonce, signature, message, chainId } = authValidation + try { + if (signature && address && nonce) { + const oceanNode = OceanNode.getInstance() + const nonceCheckResult: NonceResponse = await checkNonce( + oceanNode.getDatabase().nonce, + address, + parseInt(nonce), + signature, + message, + chainId + ) + + if (!nonceCheckResult.valid) { + return { valid: false, error: nonceCheckResult.error } + } + + if (nonceCheckResult.valid) { + return { valid: true, error: '' } + } + } + + if (token) { + const authToken = await this.validateToken(token) + if (authToken) { + return { valid: true, error: '' } + } + + return { valid: false, error: 'Invalid token' } + } + + return { + valid: false, + error: + 'Invalid authentication, you need to provide either a token or an address, signature, message and nonce' + } + } catch (e) { + return { valid: false, error: `Error during authentication validation: ${e}` } + } + } +} diff --git a/src/components/BlockchainRegistry/index.ts b/src/components/BlockchainRegistry/index.ts new file mode 100644 index 000000000..c95f2ecba --- /dev/null +++ b/src/components/BlockchainRegistry/index.ts @@ -0,0 +1,89 @@ +import { Blockchain } from '../../utils/blockchain.js' +import { KeyManager } from '../KeyManager/index.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { RPCS } from '../../@types/blockchain.js' + +/** + * BlockchainRegistry manages Blockchain instances per chainId. + * Provides lazy initialization and centralized access to blockchain connections. + */ +export class BlockchainRegistry { + private blockchains: Map + private keyManager: KeyManager + private config: OceanNodeConfig + + constructor(keyManager: KeyManager, config: OceanNodeConfig) { + this.keyManager = keyManager + this.config = config + this.blockchains = new Map() + } + + /** + * Get or create a Blockchain instance for the given chainId. + * Returns null if the chainId is not supported. + * + * @param chainId - The chain ID to get a Blockchain instance for + * @returns Blockchain instance or null if not supported + */ + getBlockchain(chainId: number): Blockchain | null { + // Check if already initialized + if (this.blockchains.has(chainId)) { + return this.blockchains.get(chainId) + } + + // Check if chainId is supported + const supportedNetworks = this.config.supportedNetworks as RPCS + if (!supportedNetworks || !supportedNetworks[chainId.toString()]) { + return null + } + + // Get network configuration + const networkConfig = supportedNetworks[chainId.toString()] + const { rpc } = networkConfig + const { fallbackRPCs } = networkConfig + + // Create Blockchain instance with new constructor + const blockchain = new Blockchain(this.keyManager, rpc, chainId, fallbackRPCs) + + // Cache the instance + this.blockchains.set(chainId, blockchain) + + return blockchain + } + + /** + * Get all initialized Blockchain instances + * + * @returns Array of all Blockchain instances + */ + getAllBlockchains(): Blockchain[] { + return Array.from(this.blockchains.values()) + } + + /** + * Remove a Blockchain instance from the registry. + * Useful for cleanup or when a network is no longer supported. + * + * @param chainId - The chain ID to remove + */ + removeBlockchain(chainId: number): void { + if (this.blockchains.has(chainId)) { + this.blockchains.delete(chainId) + } + } + + /** + * Clear all Blockchain instances from the registry. + * Useful for cleanup or testing. + */ + clear(): void { + this.blockchains.clear() + } + + /** + * Get the number of initialized Blockchain instances + */ + getBlockchainCount(): number { + return this.blockchains.size + } +} diff --git a/src/components/Indexer/ChainIndexer.ts b/src/components/Indexer/ChainIndexer.ts new file mode 100644 index 000000000..66da722cb --- /dev/null +++ b/src/components/Indexer/ChainIndexer.ts @@ -0,0 +1,498 @@ +import EventEmitter from 'node:events' +import { FallbackProvider, Log, Signer } from 'ethers' +import { SupportedNetwork } from '../../@types/blockchain.js' +import { LOG_LEVELS_STR } from '../../utils/logging/Logger.js' +import { isDefined, sleep } from '../../utils/util.js' +import { EVENTS, INDEXER_CRAWLING_EVENTS } from '../../utils/index.js' +import { INDEXER_LOGGER } from '../../utils/logging/common.js' +import { getDatabase } from '../../utils/database.js' +import { DEVELOPMENT_CHAIN_ID } from '../../utils/address.js' +import { processBlocks, processChunkLogs } from './processor.js' +import { Blockchain } from '../../utils/blockchain.js' +import { + getCrawlingInterval, + getDeployedContractBlock, + getNetworkHeight, + retrieveChunkEvents +} from './utils.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' + +export interface ReindexTask { + txId: string + chainId: number + eventIndex?: number +} + +/** + * ChainIndexer - Handles blockchain indexing for a single chain + * Runs in the main thread using async/await for non-blocking concurrent execution + */ +export class ChainIndexer { + private config: OceanNodeConfig + private rpcDetails: SupportedNetwork + private stopSignal: boolean = false + private isRunning: boolean = false + private reindexBlock: number | null = null + private reindexQueue: ReindexTask[] = [] + private eventEmitter: EventEmitter + private blockchain: Blockchain + + constructor( + blockchain: Blockchain, + rpcDetails: SupportedNetwork, + eventEmitter: EventEmitter + ) { + this.blockchain = blockchain + this.eventEmitter = eventEmitter + this.rpcDetails = rpcDetails + } + + /** + * Start indexing - returns immediately, runs in background + */ + // eslint-disable-next-line require-await + async start(): Promise { + if (this.isRunning) { + INDEXER_LOGGER.warn( + `Chain ${this.blockchain.getSupportedChain()} is already running` + ) + return + } + + this.stopSignal = false + this.isRunning = true + + // Start crawling but DON'T await - let it run in background + this.indexLoop().catch((err) => { + INDEXER_LOGGER.error( + `Indexer error for chain ${this.blockchain.getSupportedChain()}: ${err?.message ?? err}` + ) + this.isRunning = false + }) + } + + /** + * Stop indexing gracefully + */ + async stop(): Promise { + this.stopSignal = true + INDEXER_LOGGER.warn( + `Stopping indexer for chain ${this.blockchain.getSupportedChain()}, waiting for graceful shutdown...` + ) + + // Wait for graceful shutdown + while (this.isRunning) { + await sleep(100) + } + + INDEXER_LOGGER.logMessage( + `Chain ${this.blockchain.getSupportedChain()} indexer stopped` + ) + } + + /** + * Check if the indexer is currently running + */ + isIndexing(): boolean { + return this.isRunning + } + + /** + * Add a reindex task for a specific transaction + */ + addReindexTask(task: ReindexTask): void { + this.reindexQueue.push(task) + INDEXER_LOGGER.logMessage( + `Added reindex task for tx ${task.txId} on chain ${task.chainId}` + ) + } + + /** + * Trigger a full chain reindex from a specific block + */ + triggerReindexChain(blockNumber?: number): void { + const deployBlock = getDeployedContractBlock(this.blockchain.getSupportedChain()) + let targetBlock = + this.rpcDetails.startBlock && this.rpcDetails.startBlock >= deployBlock + ? this.rpcDetails.startBlock + : deployBlock + + // Use specific block if provided and valid + if (blockNumber && !isNaN(blockNumber) && blockNumber > deployBlock) { + targetBlock = blockNumber + } + + this.reindexBlock = targetBlock + INDEXER_LOGGER.logMessage( + `Triggered reindex for chain ${this.blockchain.getSupportedChain()} from block ${targetBlock}` + ) + } + + /** + * Main indexing loop - runs continuously until stopped + */ + private async indexLoop(): Promise { + let contractDeploymentBlock = getDeployedContractBlock( + this.blockchain.getSupportedChain() + ) + const isLocalChain = this.blockchain.getSupportedChain() === DEVELOPMENT_CHAIN_ID + + if (isLocalChain && !isDefined(contractDeploymentBlock)) { + this.rpcDetails.startBlock = contractDeploymentBlock = 0 + INDEXER_LOGGER.warn( + 'Cannot get block info for local network, starting from block 0' + ) + } else if ( + !isLocalChain && + !isDefined(contractDeploymentBlock) && + !isDefined(await this.getLastIndexedBlock()) + ) { + INDEXER_LOGGER.error( + `Chain ${this.blockchain.getSupportedChain()}: Both deployed block and last indexed block are null/undefined. Cannot proceed.` + ) + this.isRunning = false + return + } + + const crawlingStartBlock = + this.rpcDetails.startBlock && this.rpcDetails.startBlock > contractDeploymentBlock + ? this.rpcDetails.startBlock + : contractDeploymentBlock + + INDEXER_LOGGER.info( + `Initial details for chain ${this.blockchain.getSupportedChain()}: RPCS start block: ${this.rpcDetails.startBlock}, Contract deployment block: ${contractDeploymentBlock}, Crawling start block: ${crawlingStartBlock}` + ) + + const provider = await this.blockchain.getProvider() + const signer = await this.blockchain.getSigner() + const interval = getCrawlingInterval() + let chunkSize = this.rpcDetails.chunkSize || 1 + let successfulRetrievalCount = 0 + let lockProcessing = false + let startedCrawling = false + let currentBlock: number + + while (!this.stopSignal) { + if (!lockProcessing) { + lockProcessing = true + + try { + const lastIndexedBlock = await this.getLastIndexedBlock() + const networkHeight = await getNetworkHeight(provider) + const startBlock = + lastIndexedBlock && lastIndexedBlock > crawlingStartBlock + ? lastIndexedBlock + : crawlingStartBlock + + INDEXER_LOGGER.info( + `Indexing network '${this.rpcDetails.network}', Last indexed block: ${lastIndexedBlock}, Start block: ${startBlock}, Network height: ${networkHeight}` + ) + + if (networkHeight > startBlock) { + // Emit one-shot event when crawling actually starts + if (!startedCrawling) { + startedCrawling = true + this.eventEmitter.emit(INDEXER_CRAWLING_EVENTS.CRAWLING_STARTED, { + chainId: this.blockchain.getSupportedChain(), + startBlock, + networkHeight, + contractDeploymentBlock + }) + } + + const remainingBlocks = networkHeight - startBlock + const blocksToProcess = Math.min(chunkSize, remainingBlocks) + INDEXER_LOGGER.logMessage( + `network: ${this.rpcDetails.network} processing ${blocksToProcess} blocks ...` + ) + + let chunkEvents: Log[] = [] + try { + chunkEvents = await retrieveChunkEvents( + signer, + provider, + this.blockchain.getSupportedChain(), + startBlock, + blocksToProcess + ) + successfulRetrievalCount++ + } catch (error) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_WARN, + `Get events for network: ${this.rpcDetails.network} failure: ${error.message} \n\nConsider that there may be an issue with your RPC provider. We recommend using private RPCs from reliable providers such as Infura or Alchemy.`, + true + ) + chunkSize = Math.floor(chunkSize / 2) < 1 ? 1 : Math.floor(chunkSize / 2) + successfulRetrievalCount = 0 + INDEXER_LOGGER.logMessage( + `network: ${this.rpcDetails.network} Reducing chunk size to ${chunkSize}`, + true + ) + } + + try { + const processedBlocks = await processBlocks( + chunkEvents, + signer, + provider, + this.blockchain.getSupportedChain(), + startBlock, + blocksToProcess + ) + + INDEXER_LOGGER.debug( + `Processed ${processedBlocks.foundEvents.length} events from ${chunkEvents.length} logs` + ) + + currentBlock = await this.updateLastIndexedBlockNumber( + processedBlocks.lastBlock, + lastIndexedBlock + ) + + // Can't update currentBlock to processedBlocks.lastBlock if DB action failed + if (currentBlock < 0 && lastIndexedBlock !== null) { + currentBlock = lastIndexedBlock + } + + this.emitNewlyIndexedAssets(processedBlocks.foundEvents) + + // Revert to original chunk size after 3 successful retrievals + if ( + successfulRetrievalCount >= 3 && + chunkSize < (this.rpcDetails.chunkSize || 1) + ) { + chunkSize = this.rpcDetails.chunkSize || 1 + successfulRetrievalCount = 0 + INDEXER_LOGGER.logMessage( + `network: ${this.rpcDetails.network} Reverting chunk size back to original ${chunkSize} after 3 successful calls`, + true + ) + } + } catch (error) { + INDEXER_LOGGER.error( + `Processing event from network failed, network: ${this.rpcDetails.network} Error: ${error.message}` + ) + successfulRetrievalCount = 0 + // Since something went wrong, we will not update the last indexed block + // so we will try to process the same chunk again after some sleep + await sleep(interval) + } + } else { + await sleep(interval) + } + + // Process reindex queue + await this.processReindexQueue(provider, signer) + + // Handle chain reindex command + if (this.reindexBlock !== null && !lockProcessing) { + const networkHeight = await getNetworkHeight(provider) + const result = await this.reindexChain(currentBlock, networkHeight) + + this.eventEmitter.emit(INDEXER_CRAWLING_EVENTS.REINDEX_CHAIN, { + result, + chainId: this.blockchain.getSupportedChain() + }) + } + } catch (error) { + INDEXER_LOGGER.error( + `Error in indexing loop for chain ${this.blockchain.getSupportedChain()}: ${error.message}` + ) + await sleep(interval) + } finally { + lockProcessing = false + } + } else { + INDEXER_LOGGER.logMessage( + `Processing already in progress for network ${this.rpcDetails.network}, waiting...` + ) + await sleep(1000) + } + } + + this.isRunning = false + INDEXER_LOGGER.logMessage( + `Exiting indexer loop for chain ${this.blockchain.getSupportedChain()}` + ) + } + + /** + * Get the last indexed block from database + */ + private async getLastIndexedBlock(): Promise { + const { indexer } = await getDatabase() + try { + const networkDetails = await indexer.retrieve(this.blockchain.getSupportedChain()) + if (networkDetails && networkDetails.lastIndexedBlock) { + return networkDetails.lastIndexedBlock + } + INDEXER_LOGGER.error( + `Unable to get last indexed block from DB for chain ${this.blockchain.getSupportedChain()}` + ) + } catch (err) { + INDEXER_LOGGER.error( + `Error retrieving last indexed block for chain ${this.blockchain.getSupportedChain()}: ${err}` + ) + } + return null + } + + /** + * Update the last indexed block in database + */ + private async updateLastIndexedBlockNumber( + block: number, + lastKnownBlock?: number + ): Promise { + try { + if (isDefined(lastKnownBlock) && lastKnownBlock > block) { + INDEXER_LOGGER.error( + `Chain ${this.blockchain.getSupportedChain()}: Newest block number is lower than last known block, something is wrong` + ) + return -1 + } + + const { indexer } = await getDatabase() + const updatedIndex = await indexer.update( + this.blockchain.getSupportedChain(), + block + ) + + if (updatedIndex) { + INDEXER_LOGGER.logMessage( + `Chain ${this.blockchain.getSupportedChain()} - New last indexed block: ${updatedIndex.lastIndexedBlock}`, + true + ) + return updatedIndex.lastIndexedBlock + } else { + INDEXER_LOGGER.error( + `Unable to update last indexed block to ${block} for chain ${this.blockchain.getSupportedChain()}` + ) + } + } catch (err) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Error updating last indexed block for chain ${this.blockchain.getSupportedChain()}: ${err.message}`, + true + ) + } + return -1 + } + + /** + * Delete all assets from this chain + */ + private async deleteAllAssetsFromChain(): Promise { + const { ddo } = await getDatabase() + try { + const numDeleted = await ddo.deleteAllAssetsFromChain( + this.blockchain.getSupportedChain() + ) + INDEXER_LOGGER.logMessage( + `${numDeleted} assets were successfully deleted from chain ${this.blockchain.getSupportedChain()}` + ) + return numDeleted + } catch (err) { + INDEXER_LOGGER.error( + `Error deleting all assets from chain ${this.blockchain.getSupportedChain()}: ${err}` + ) + return -1 + } + } + + /** + * Perform a full chain reindex + */ + private async reindexChain( + currentBlock: number, + networkHeight: number + ): Promise { + if (this.reindexBlock > networkHeight) { + INDEXER_LOGGER.error( + `Invalid reindex block! ${this.reindexBlock} is bigger than network height: ${networkHeight}. Continue indexing normally...` + ) + this.reindexBlock = null + return false + } + + const block = await this.updateLastIndexedBlockNumber(this.reindexBlock) + if (block !== -1) { + this.reindexBlock = null + const res = await this.deleteAllAssetsFromChain() + if (res === -1) { + await this.updateLastIndexedBlockNumber(currentBlock) + } + return true + } else { + INDEXER_LOGGER.error(`Block could not be reset. Continue indexing normally...`) + this.reindexBlock = null + return false + } + } + + /** + * Process the reindex queue for specific transactions + * Uses FIFO (First-In, First-Out) order via shift() + */ + private async processReindexQueue( + provider: FallbackProvider, + signer: Signer + ): Promise { + while (this.reindexQueue.length > 0) { + const reindexTask = this.reindexQueue.shift() + try { + const receipt = await provider.getTransactionReceipt(reindexTask.txId) + if (receipt) { + const log = receipt.logs[reindexTask.eventIndex] + const logs = log ? [log] : receipt.logs + await processChunkLogs( + logs, + signer, + provider, + this.blockchain.getSupportedChain() + ) + + // Emit event to clear from parent queue + this.eventEmitter.emit(INDEXER_CRAWLING_EVENTS.REINDEX_QUEUE_POP, { + txId: reindexTask.txId, + chainId: reindexTask.chainId + }) + } + } catch (error) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `REINDEX Error for tx ${reindexTask.txId}: ${error.message}`, + true + ) + } + } + } + + /** + * Emit events for newly indexed assets + */ + private emitNewlyIndexedAssets(events: any): void { + const eventKeys = Object.keys(events) + eventKeys.forEach((eventType) => { + if ( + [ + EVENTS.METADATA_CREATED, + EVENTS.METADATA_UPDATED, + EVENTS.METADATA_STATE, + EVENTS.ORDER_STARTED, + EVENTS.ORDER_REUSED, + EVENTS.DISPENSER_ACTIVATED, + EVENTS.DISPENSER_DEACTIVATED, + EVENTS.EXCHANGE_ACTIVATED, + EVENTS.EXCHANGE_DEACTIVATED, + EVENTS.EXCHANGE_RATE_CHANGED + ].includes(eventType) + ) { + this.eventEmitter.emit(eventType, { + chainId: this.blockchain.getSupportedChain(), + data: events[eventType] + }) + } + }) + } +} diff --git a/src/components/Indexer/crawlerThread.ts b/src/components/Indexer/crawlerThread.ts deleted file mode 100644 index 2b8e09e3e..000000000 --- a/src/components/Indexer/crawlerThread.ts +++ /dev/null @@ -1,365 +0,0 @@ -import { parentPort, workerData } from 'worker_threads' -import { - getCrawlingInterval, - getDeployedContractBlock, - getNetworkHeight, - processBlocks, - processChunkLogs, - retrieveChunkEvents -} from './utils.js' -import { Blockchain } from '../../utils/blockchain.js' -import { BlocksEvents, SupportedNetwork } from '../../@types/blockchain.js' -import { LOG_LEVELS_STR } from '../../utils/logging/Logger.js' -import { isDefined, sleep } from '../../utils/util.js' -import { EVENTS, INDEXER_CRAWLING_EVENTS, INDEXER_MESSAGES } from '../../utils/index.js' -import { INDEXER_LOGGER } from '../../utils/logging/common.js' -import { getDatabase } from '../../utils/database.js' -import { JsonRpcApiProvider, Log, Signer } from 'ethers' -import { DEVELOPMENT_CHAIN_ID } from '../../utils/address.js' - -export interface ReindexTask { - txId: string - chainId: number - eventIndex?: number -} - -let REINDEX_BLOCK: number = null -const REINDEX_QUEUE: ReindexTask[] = [] - -let stoppedCrawling: boolean = false -let startedCrawling: boolean = false -interface ThreadData { - rpcDetails: SupportedNetwork -} - -const { rpcDetails } = workerData as ThreadData - -export async function updateLastIndexedBlockNumber( - block: number, - lastKnownBlock?: number -): Promise { - try { - if (isDefined(lastKnownBlock) && lastKnownBlock > block) { - INDEXER_LOGGER.error( - 'Newest block number is lower than last known block, something is wrong' - ) - return -1 - } - const { indexer } = await getDatabase() - const updatedIndex = await indexer.update(rpcDetails.chainId, block) - if (updatedIndex) { - INDEXER_LOGGER.logMessage( - `New last indexed block : ${updatedIndex.lastIndexedBlock}`, - true - ) - return updatedIndex.lastIndexedBlock - } else { - INDEXER_LOGGER.error('Unable to update last indexed block to ' + block) - } - } catch (err) { - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `Error updating last indexed block ${err.message}`, - true - ) - } - return -1 -} - -async function getLastIndexedBlock(): Promise { - const { indexer } = await getDatabase() - try { - const networkDetails = await indexer.retrieve(rpcDetails.chainId) - if (networkDetails && networkDetails.lastIndexedBlock) { - return networkDetails.lastIndexedBlock - } - INDEXER_LOGGER.error('Unable to get last indexed block from DB') - } catch (err) { - INDEXER_LOGGER.error(`Error retrieving last indexed block: ${err}`) - } - return null -} - -async function deleteAllAssetsFromChain(): Promise { - const { ddo } = await getDatabase() - try { - const numDeleted = await ddo.deleteAllAssetsFromChain(rpcDetails.chainId) - INDEXER_LOGGER.logMessage(`${numDeleted} Assets were successfully deleted.`) - return numDeleted - } catch (err) { - INDEXER_LOGGER.error(`Error deleting all assets: ${err}`) - return -1 - } -} - -export async function processNetworkData( - provider: JsonRpcApiProvider, - signer: Signer -): Promise { - stoppedCrawling = startedCrawling = false - let contractDeploymentBlock = getDeployedContractBlock(rpcDetails.chainId) - if (!isDefined(contractDeploymentBlock) && !isDefined(await getLastIndexedBlock())) { - if (rpcDetails.chainId === DEVELOPMENT_CHAIN_ID) { - rpcDetails.startBlock = contractDeploymentBlock = 0 - INDEXER_LOGGER.warn( - 'Cannot get block info for local network, starting from block 0' - ) - } else { - INDEXER_LOGGER.logMessage( - `chain: ${rpcDetails.chainId} Both deployed block and last indexed block are null/undefined. Cannot proceed further on this chain`, - true - ) - - return null - } - } - // if we defined a valid startBlock use it, oterwise start from deployed one - - const crawlingStartBlock = - rpcDetails.startBlock && rpcDetails.startBlock > contractDeploymentBlock - ? rpcDetails.startBlock - : contractDeploymentBlock - - INDEXER_LOGGER.info( - `Initial details: RPCS start block: ${rpcDetails.startBlock}, Contract deployment block: ${contractDeploymentBlock}, Crawling start block: ${crawlingStartBlock}` - ) - - // we can override the default value of 30 secs, by setting process.env.INDEXER_INTERVAL - const interval = getCrawlingInterval() - let { chunkSize } = rpcDetails - let lockProccessing = false - - while (true) { - let currentBlock - if (!lockProccessing) { - lockProccessing = true - const lastIndexedBlock = await getLastIndexedBlock() - const networkHeight = await getNetworkHeight(provider) - const startBlock = - lastIndexedBlock && lastIndexedBlock > crawlingStartBlock - ? lastIndexedBlock - : crawlingStartBlock - - INDEXER_LOGGER.info( - `Indexing network '${rpcDetails.network}', Last indexed block: ${lastIndexedBlock}, Start block: ${startBlock}, Network height: ${networkHeight}` - ) - if (networkHeight > startBlock) { - // emit an one shot event when we actually start the crawling process - if (!startedCrawling) { - startedCrawling = true - parentPort.postMessage({ - method: INDEXER_CRAWLING_EVENTS.CRAWLING_STARTED, - data: { startBlock, networkHeight, contractDeploymentBlock } - }) - } - const remainingBlocks = networkHeight - startBlock - const blocksToProcess = Math.min(chunkSize, remainingBlocks) - INDEXER_LOGGER.logMessage( - `network: ${rpcDetails.network} processing ${blocksToProcess} blocks ...` - ) - let chunkEvents: Log[] = [] - try { - chunkEvents = await retrieveChunkEvents( - signer, - provider, - rpcDetails.chainId, - startBlock, - blocksToProcess - ) - } catch (error) { - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_WARN, - `Get events for network: ${rpcDetails.network} failure: ${error.message} \n\nConsider that there may be an issue with your RPC provider. We recommend using private RPCs from reliable providers such as Infura or Alchemy.`, - true - ) - chunkSize = Math.floor(chunkSize / 2) < 1 ? 1 : Math.floor(chunkSize / 2) - INDEXER_LOGGER.logMessage( - `network: ${rpcDetails.network} Reducing chunk size ${chunkSize} `, - true - ) - } - try { - const processedBlocks = await processBlocks( - chunkEvents, - signer, - provider, - rpcDetails.chainId, - startBlock, - blocksToProcess - ) - currentBlock = await updateLastIndexedBlockNumber( - processedBlocks.lastBlock, - lastIndexedBlock - ) - // we can't just update currentBlock to processedBlocks.lastBlock if the DB action failed - if (currentBlock < 0 && lastIndexedBlock !== null) { - currentBlock = lastIndexedBlock - } - checkNewlyIndexedAssets(processedBlocks.foundEvents) - chunkSize = chunkSize !== 1 ? chunkSize : rpcDetails.chunkSize - } catch (error) { - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `Processing event from network failed network: ${rpcDetails.network} Error: ${error.message} `, - true - ) - await updateLastIndexedBlockNumber( - startBlock + blocksToProcess, - lastIndexedBlock - ) - } - } - await processReindex(provider, signer, rpcDetails.chainId) - lockProccessing = false - } else { - INDEXER_LOGGER.logMessage( - `Processing already in progress for network ${rpcDetails.network}, waiting until finishing the current processing ...`, - true - ) - } - await sleep(interval) - // reindex chain command called - if (REINDEX_BLOCK && !lockProccessing) { - const networkHeight = await getNetworkHeight(provider) - // either "true" for success or "false" otherwise - const result = await reindexChain(currentBlock, networkHeight) - // get all reindex commands - // TODO (check that we do not receive multiple commands for same reindex before previous finishes) - parentPort.postMessage({ - method: INDEXER_CRAWLING_EVENTS.REINDEX_CHAIN, - data: { result, chainId: rpcDetails.chainId } - }) - } - - if (stoppedCrawling) { - INDEXER_LOGGER.logMessage('Exiting thread...') - startedCrawling = false - break - } - } -} - -async function reindexChain( - currentBlock: number, - networkHeight: number -): Promise { - if (REINDEX_BLOCK > networkHeight) { - INDEXER_LOGGER.error( - `Invalid reindex block! ${REINDEX_BLOCK} is bigger than network height: ${networkHeight}. Continue indexing normally...` - ) - REINDEX_BLOCK = null - return false - } - // for reindex command we don't care about last known/saved block - const block = await updateLastIndexedBlockNumber(REINDEX_BLOCK) - if (block !== -1) { - REINDEX_BLOCK = null - const res = await deleteAllAssetsFromChain() - if (res === -1) { - await updateLastIndexedBlockNumber(currentBlock) - } - return true - } else { - // Set the reindex block to null -> force admin to trigger again the command until - // we have a notification from worker thread to parent thread #414. - INDEXER_LOGGER.error(`Block could not be reset. Continue indexing normally...`) - REINDEX_BLOCK = null - return false - } -} - -async function processReindex( - provider: JsonRpcApiProvider, - signer: Signer, - chainId: number -): Promise { - while (REINDEX_QUEUE.length > 0) { - const reindexTask = REINDEX_QUEUE.pop() - try { - const receipt = await provider.getTransactionReceipt(reindexTask.txId) - if (receipt) { - const log = receipt.logs[reindexTask.eventIndex] - const logs = log ? [log] : receipt.logs - await processChunkLogs(logs, signer, provider, chainId) - // send message to clear from the 'top' queue - parentPort.postMessage({ - method: INDEXER_CRAWLING_EVENTS.REINDEX_QUEUE_POP, - data: { reindexTask } - }) - } else { - // put it back as it failed - REINDEX_QUEUE.push(reindexTask) - } - } catch (error) { - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `REINDEX Error: ${error.message} `, - true - ) - } - } -} - -export function checkNewlyIndexedAssets(events: BlocksEvents): void { - const eventKeys = Object.keys(events) - eventKeys.forEach((eventType) => { - // will emit messages for all these events - if ( - [ - EVENTS.METADATA_CREATED, - EVENTS.METADATA_UPDATED, - EVENTS.METADATA_STATE, - EVENTS.ORDER_STARTED, - EVENTS.ORDER_REUSED - ].includes(eventType) - ) { - parentPort.postMessage({ - method: eventType, - network: rpcDetails.chainId, - data: events[eventType] - }) - } - }) -} - -parentPort.on('message', (message) => { - if (message.method === INDEXER_MESSAGES.START_CRAWLING) { - // start indexing the chain - const blockchain = new Blockchain( - rpcDetails.rpc, - rpcDetails.network, - rpcDetails.chainId, - rpcDetails.fallbackRPCs - ) - // return retryCrawlerWithDelay(blockchain) - processNetworkData(blockchain.getProvider(), blockchain.getSigner()) - } else if (message.method === INDEXER_MESSAGES.REINDEX_TX) { - // reindex a specific transaction - - REINDEX_QUEUE.push(message.data.reindexTask) - } else if (message.method === INDEXER_MESSAGES.REINDEX_CHAIN) { - // reindex a specific chain - - // get the deploy block number - const deployBlock = getDeployedContractBlock(rpcDetails.chainId) - // first option - let possibleBlock = - rpcDetails.startBlock && rpcDetails.startBlock >= deployBlock - ? rpcDetails.startBlock - : deployBlock - - // do we have a specific block number? - const { block } = message.data - if (block && !isNaN(block)) { - // we still need to check network height - if (block > deployBlock) { - possibleBlock = block - } - } - REINDEX_BLOCK = possibleBlock - } else if (message.method === INDEXER_MESSAGES.STOP_CRAWLING) { - // stop indexing the chain - stoppedCrawling = true - INDEXER_LOGGER.warn('Stopping crawler thread once current run finishes...') - } -}) diff --git a/src/components/Indexer/index.ts b/src/components/Indexer/index.ts index 6e83595e4..e261bb453 100644 --- a/src/components/Indexer/index.ts +++ b/src/components/Indexer/index.ts @@ -1,25 +1,54 @@ +/** + * Ocean Node Indexer - Main Module + * + * This module implements a multi-chain blockchain event indexer using a + * single-threaded, non-blocking architecture optimized for I/O-bound operations. + * + * Architecture: + * - Uses ChainIndexer instances (one per blockchain) that run concurrently + * - All operations are async/await, leveraging Node.js event loop for concurrency + * - No worker threads - optimal for I/O-bound workloads (RPC calls, DB queries) + * - Event-driven communication via EventEmitter + * + * Key Components: + * - OceanIndexer: Main orchestrator managing multiple ChainIndexer instances + * - ChainIndexer: Per-chain indexer running async indexing loop + * - Event Processors: Handle specific blockchain event types + * + * @module Indexer + * @see {@link docs/indexer.md} for detailed documentation + */ + import EventEmitter from 'node:events' -import { Worker } from 'node:worker_threads' import { Database } from '../database/index.js' import { RPCS, SupportedNetwork } from '../../@types/blockchain.js' -import { ReindexTask } from './crawlerThread.js' +import { ChainIndexer, ReindexTask } from './ChainIndexer.js' import { LOG_LEVELS_STR } from '../../utils/logging/Logger.js' import { INDEXER_LOGGER } from '../../utils/logging/common.js' import { Blockchain, EVENTS, INDEXER_CRAWLING_EVENTS, - INDEXER_MESSAGES, PROTOCOL_COMMANDS } from '../../utils/index.js' +import { BlockchainRegistry } from '../BlockchainRegistry/index.js' import { CommandStatus, JobStatus } from '../../@types/commands.js' -import { buildJobIdentifier } from './utils.js' +import { buildJobIdentifier, getDeployedContractBlock } from './utils.js' import { create256Hash } from '../../utils/crypt.js' import { isReachableConnection } from '../../utils/database.js' import { sleep } from '../../utils/util.js' +import { isReindexingNeeded } from './version.js' -// emmit events for node +/** + * Event emitter for DDO (Data Descriptor Object) events + * External components subscribe to this for asset lifecycle events + */ export const INDEXER_DDO_EVENT_EMITTER = new EventEmitter() + +/** + * Event emitter for internal indexer events + * Used for communication between ChainIndexer instances and OceanIndexer + */ export const INDEXER_CRAWLING_EVENT_EMITTER = new EventEmitter() let INDEXING_QUEUE: ReindexTask[] = [] @@ -29,19 +58,42 @@ const JOBS_QUEUE: JobStatus[] = [] const MAX_CRAWL_RETRIES = 10 let numCrawlAttempts = 0 -const runningThreads: Map = new Map() +/** + * OceanIndexer - Multi-chain blockchain event indexer + * + * Manages indexing across multiple blockchain networks using a single-threaded, + * non-blocking architecture. Each chain is monitored by a ChainIndexer instance + * that runs concurrently via Node.js event loop. + * + * Features: + * - Concurrent multi-chain indexing without worker threads + * - Event-driven communication via EventEmitter + * - Automatic version-based reindexing + * - Admin commands for chain management + * - Graceful shutdown support + * + * @see ChainIndexer for per-chain indexing implementation + * @see docs/indexer.md for detailed architecture documentation + */ export class OceanIndexer { private db: Database private networks: RPCS + private blockchainRegistry?: BlockchainRegistry private supportedChains: string[] - private workers: Record = {} + private indexers: Map = new Map() + private MIN_REQUIRED_VERSION = '0.2.2' - constructor(db: Database, supportedNetworks: RPCS) { + constructor( + db: Database, + supportedNetworks: RPCS, + blockchainRegistry: BlockchainRegistry + ) { this.db = db this.networks = supportedNetworks + this.blockchainRegistry = blockchainRegistry this.supportedChains = Object.keys(supportedNetworks) INDEXING_QUEUE = [] - this.startThreads() + this.startAllChainIndexers() } public getSupportedNetworks(): RPCS { @@ -70,39 +122,35 @@ export class OceanIndexer { return network } - // stops all worker threads - public stopAllThreads(): boolean { - let count = 0 + // stops all indexers + public async stopAllChainIndexers(): Promise { + const stopPromises: Promise[] = [] for (const chainID of this.supportedChains) { - if (this.stopThread(Number(chainID))) { - count++ + const promise = this.stopChainIndexer(Number(chainID)) + if (promise) { + stopPromises.push(promise) } } - return count === this.supportedChains.length + await Promise.allSettled(stopPromises) + return stopPromises.length === this.supportedChains.length } - // stops crawling for a specific chain - public stopThread(chainID: number): boolean { - const worker = this.workers[chainID] - if (worker) { - worker.postMessage({ method: 'stop-crawling' }) - runningThreads.set(chainID, false) - return true + // stops indexing for a specific chain + public async stopChainIndexer(chainID: number): Promise { + const indexer = this.indexers.get(chainID) + if (indexer) { + await indexer.stop() + this.indexers.delete(chainID) + INDEXER_LOGGER.logMessage(`Stopped indexer for chain ${chainID}`) + } else { + INDEXER_LOGGER.error('Unable to find running indexer for chain ' + chainID) } - INDEXER_LOGGER.error('Unable to find running worker thread for chain ' + chainID) - return false } // it does not start crawling until the network connectin is ready async startCrawler(blockchain: Blockchain): Promise { if ((await blockchain.isNetworkReady()).ready) { return true - } else { - // try other RPCS if any available (otherwise will just retry the same RPC) - const connectionStatus = await blockchain.tryFallbackRPCs() - if (connectionStatus.ready || (await blockchain.isNetworkReady()).ready) { - return true - } } return false } @@ -149,155 +197,187 @@ export class OceanIndexer { } } - // starts crawling for a specific chain - public async startThread(chainID: number): Promise { + // starts indexing for a specific chain + public async startChainIndexer(chainID: number): Promise { + // If an indexer is already running, stop it first + const existingIndexer = this.indexers.get(chainID) + if (existingIndexer && existingIndexer.isIndexing()) { + INDEXER_LOGGER.logMessage( + `Stopping existing indexer for chain ${chainID} before starting new one...` + ) + await existingIndexer.stop() + this.indexers.delete(chainID) + await sleep(1000) // Give the indexer time to stop + } + const rpcDetails: SupportedNetwork = this.getSupportedNetwork(chainID) if (!rpcDetails) { INDEXER_LOGGER.error( - 'Unable to start (unsupported network) a worker thread for chain: ' + chainID + 'Unable to start (unsupported network) indexer for chain: ' + chainID ) return null } - // check the network before starting crawling - // having this code inside the thread itself is problematic because - // the worker thread can exit and we keep processing code inside, leading to segfaults - const blockchain = new Blockchain( - rpcDetails.rpc, - rpcDetails.network, - rpcDetails.chainId, - rpcDetails.fallbackRPCs - ) - const canStartWorker = await this.retryCrawlerWithDelay(blockchain) - if (!canStartWorker) { - INDEXER_LOGGER.error(`Cannot start worker thread. Check DB and RPC connections!`) + // Use BlockchainRegistry if available, otherwise fall back to old pattern + const blockchain: Blockchain = this.blockchainRegistry.getBlockchain(chainID) + if (!blockchain) { + INDEXER_LOGGER.error(`Unable to get Blockchain instance for chain: ${chainID}`) return null } - const workerData = { rpcDetails } - // see if it exists already, otherwise create a new one - let worker = this.workers[chainID] - if (!worker) { - worker = new Worker('./dist/components/Indexer/crawlerThread.js', { - workerData - }) + const canStartIndexer = await this.retryCrawlerWithDelay(blockchain) + if (!canStartIndexer) { + INDEXER_LOGGER.error(`Cannot start indexer. Check DB and RPC connections!`) + return null } - worker.postMessage({ method: 'start-crawling' }) + // Create new ChainIndexer instance + const indexer = new ChainIndexer( + blockchain, + rpcDetails, + INDEXER_CRAWLING_EVENT_EMITTER + ) + INDEXER_LOGGER.log( LOG_LEVELS_STR.LEVEL_INFO, - `Starting worker for network ${rpcDetails.network} with ${JSON.stringify( - workerData - )}`, + `Starting indexer for network ${rpcDetails.network} (chainId: ${chainID})`, true ) - runningThreads.set(chainID, true) - return worker + + // Start indexing (runs in background, doesn't block) + await indexer.start() + + this.indexers.set(chainID, indexer) + return indexer } - // eslint-disable-next-line require-await - public async startThreads(): Promise { + // Start all chain indexers + public async startAllChainIndexers(): Promise { + await this.checkAndTriggerReindexing() + + // Setup event listeners for all chains (they all use the same event emitter) + this.setupEventListeners() + + // Start all indexers - they will run concurrently via async/await let count = 0 for (const network of this.supportedChains) { const chainId = parseInt(network) - const worker = await this.startThread(chainId) - if (worker) { - // track if we were able to start them all + const indexer = await this.startChainIndexer(chainId) + if (indexer) { count++ - this.workers[chainId] = worker - this.setupEventListeners(worker, chainId) } } + return count === this.supportedChains.length } - private setupEventListeners(worker: Worker, chainId: number) { - worker.on('message', (event: any) => { - if (event.data) { - if ( - [ - EVENTS.METADATA_CREATED, - EVENTS.METADATA_UPDATED, - EVENTS.METADATA_STATE, - EVENTS.ORDER_STARTED, - EVENTS.ORDER_REUSED - ].includes(event.method) - ) { - // will emit the metadata created/updated event and advertise it to the other peers (on create only) + private setupEventListeners() { + // Listen to metadata events from any chain indexer + const metadataEvents = [ + EVENTS.METADATA_CREATED, + EVENTS.METADATA_UPDATED, + EVENTS.METADATA_STATE, + EVENTS.ORDER_STARTED, + EVENTS.ORDER_REUSED, + EVENTS.DISPENSER_ACTIVATED, + EVENTS.DISPENSER_DEACTIVATED, + EVENTS.EXCHANGE_ACTIVATED, + EVENTS.EXCHANGE_DEACTIVATED, + EVENTS.EXCHANGE_RATE_CHANGED + ] + + metadataEvents.forEach((eventType) => { + INDEXER_CRAWLING_EVENT_EMITTER.on(eventType, async (event: any) => { + try { + if (!event.data) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Missing event data (ddo) for ${eventType}. Something is wrong!`, + true + ) + return + } + INDEXER_LOGGER.logMessage( - `Emiting "${event.method}" for DDO : ${event.data.id} from network: ${chainId} ` + `Emitting "${eventType}" for DDO: ${event.data.id} from network: ${event.chainId}` ) - INDEXER_DDO_EVENT_EMITTER.emit(event.method, event.data.id) - // remove from indexing list - } else if (event.method === INDEXER_CRAWLING_EVENTS.REINDEX_QUEUE_POP) { - // remove this one from the queue (means we processed the reindex for this tx) - INDEXING_QUEUE = INDEXING_QUEUE.filter( - (task) => task.txId !== event.data.txId && task.chainId !== event.data.chainId + await Promise.resolve(INDEXER_DDO_EVENT_EMITTER.emit(eventType, event.data.id)) + } catch (err) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Event handler failed for ${eventType}: ${err?.message ?? err}`, + true ) - // reindex tx successfully done - INDEXER_CRAWLING_EVENT_EMITTER.emit( - INDEXER_CRAWLING_EVENTS.REINDEX_TX, // explicitly set constant value for readability - event.data + } + }) + }) + + // Listen to reindex queue pop events + INDEXER_CRAWLING_EVENT_EMITTER.on( + INDEXER_CRAWLING_EVENTS.REINDEX_QUEUE_POP, + (event: any) => { + try { + INDEXING_QUEUE = INDEXING_QUEUE.filter( + (task) => task.txId !== event.txId && task.chainId !== event.chainId ) this.updateJobStatus( PROTOCOL_COMMANDS.REINDEX_TX, - create256Hash([event.data.chainId, event.data.txId].join('')), + create256Hash([event.chainId, event.txId].join('')), CommandStatus.SUCCESS ) - } else if (event.method === INDEXER_CRAWLING_EVENTS.REINDEX_CHAIN) { - // we should listen to this on the dashboard for instance - INDEXER_CRAWLING_EVENT_EMITTER.emit( - INDEXER_CRAWLING_EVENTS.REINDEX_CHAIN, - event.data + } catch (err) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Reindex queue pop handler failed: ${err?.message ?? err}`, + true ) + } + } + ) + + // Listen to reindex chain events + INDEXER_CRAWLING_EVENT_EMITTER.on( + INDEXER_CRAWLING_EVENTS.REINDEX_CHAIN, + (event: any) => { + try { this.updateJobStatus( PROTOCOL_COMMANDS.REINDEX_CHAIN, - create256Hash([event.data.chainId].join('')), - event.data.result ? CommandStatus.SUCCESS : CommandStatus.FAILURE + create256Hash([event.chainId].join('')), + event.result ? CommandStatus.SUCCESS : CommandStatus.FAILURE + ) + } catch (err) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Reindex chain handler failed: ${err?.message ?? err}`, + true ) - } else if (event.method === INDEXER_CRAWLING_EVENTS.CRAWLING_STARTED) { - INDEXER_CRAWLING_EVENT_EMITTER.emit(event.method, event.data) } - } else { - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - 'Missing event data (ddo) on postMessage. Something is wrong!', - true - ) } - }) - - worker.on('error', (err: Error) => { - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `Error in worker for network ${chainId}: ${err.message}`, - true - ) - }) + ) - worker.on('exit', (code: number) => { - INDEXER_LOGGER.logMessage( - `Worker for network ${chainId} exited with code: ${code}`, - true - ) - runningThreads.set(chainId, false) - }) + // Listen to crawling started events + INDEXER_CRAWLING_EVENT_EMITTER.on( + INDEXER_CRAWLING_EVENTS.CRAWLING_STARTED, + (event: any) => { + INDEXER_LOGGER.logMessage( + `Crawling started for chain ${event.chainId} from block ${event.startBlock}` + ) + } + ) } public addReindexTask(reindexTask: ReindexTask): JobStatus | null { - const worker = this.workers[reindexTask.chainId] - if (worker) { + const indexer = this.indexers.get(reindexTask.chainId) + if (indexer) { const job = buildJobIdentifier(PROTOCOL_COMMANDS.REINDEX_TX, [ reindexTask.chainId.toString(), reindexTask.txId ]) - worker.postMessage({ - method: INDEXER_MESSAGES.REINDEX_TX, - data: { reindexTask, msgId: job.jobId } - }) + indexer.addReindexTask(reindexTask) INDEXING_QUEUE.push(reindexTask) this.addJob(job) return job } + INDEXER_LOGGER.error(`No indexer found for chain ${reindexTask.chainId}`) return null } @@ -305,36 +385,29 @@ export class OceanIndexer { chainId: number, blockNumber?: number ): Promise { - const isRunning = runningThreads.get(chainId) - // not running, but still on the array - if (!isRunning && this.workers[chainId]) { + let indexer = this.indexers.get(chainId) + + // If not running or not found, start it first + if (!indexer || !indexer.isIndexing()) { INDEXER_LOGGER.warn( - 'Thread for chain: ' + chainId + ' is not running, restarting first...' + 'Indexer for chain: ' + chainId + ' is not running, starting first...' ) - delete this.workers[chainId] - const worker = await this.startThread(chainId) - if (!worker) { - INDEXER_LOGGER.error('Could not restart worker thread, aborting...') + indexer = await this.startChainIndexer(chainId) + if (!indexer) { + INDEXER_LOGGER.error('Could not start indexer, aborting...') return null } - this.workers[chainId] = worker - this.setupEventListeners(worker, chainId) } - const worker = this.workers[chainId] - if (worker) { + + if (indexer) { const job = buildJobIdentifier(PROTOCOL_COMMANDS.REINDEX_CHAIN, [ chainId.toString() ]) - worker.postMessage({ - method: INDEXER_MESSAGES.REINDEX_CHAIN, - data: { msgId: job.jobId, block: blockNumber } - }) + indexer.triggerReindexChain(blockNumber) this.addJob(job) return job } else { - INDEXER_LOGGER.error( - `Could not find a worker thread for chain ${chainId}, aborting...` - ) + INDEXER_LOGGER.error(`Could not find indexer for chain ${chainId}, aborting...`) } return null } @@ -400,4 +473,70 @@ export class OceanIndexer { } } } + + /** + * Checks if reindexing is needed and triggers it for all chains + */ + public async checkAndTriggerReindexing(): Promise { + const currentVersion = process.env.npm_package_version + const dbActive = this.getDatabase() + if (!dbActive || !(await isReachableConnection(dbActive.getConfig().url))) { + INDEXER_LOGGER.error(`Giving up reindexing. DB is not online!`) + return + } + const dbVersion = await dbActive.sqliteConfig?.retrieveValue() + INDEXER_LOGGER.info( + `Node version check: Current=${currentVersion}, DB=${ + dbVersion || 'not set' + }, Min Required=${this.MIN_REQUIRED_VERSION}` + ) + + if (isReindexingNeeded(currentVersion, dbVersion.value, this.MIN_REQUIRED_VERSION)) { + INDEXER_LOGGER.info( + `Reindexing needed: DB version ${ + dbVersion.value || 'not set' + } is older than minimum required ${this.MIN_REQUIRED_VERSION}` + ) + + // Reindex all chains by directly setting last indexed block to deployment block + for (const chainID of this.supportedChains) { + const chainIdNum = Number(chainID) + + INDEXER_LOGGER.info( + `Triggering reindexing for chain ${chainIdNum} by resetting to block null` + ) + + try { + // First delete all assets from this chain + const numDeleted = await dbActive.ddo.deleteAllAssetsFromChain(chainIdNum) + INDEXER_LOGGER.info(`Deleted ${numDeleted} assets from chain ${chainIdNum}`) + + // Update database directly by resetting last indexed block + const contractDeploymentBlock = getDeployedContractBlock(chainIdNum) + const result = await dbActive.indexer.update( + chainIdNum, + contractDeploymentBlock + ) + + if (!result) { + INDEXER_LOGGER.error( + `Reindex chain job for ${chainIdNum} failed. Please retry reindexChain command manually for this chain.` + ) + } else { + INDEXER_LOGGER.info( + `Successfully reset indexing for chain ${chainIdNum} to block null` + ) + } + } catch (error) { + INDEXER_LOGGER.error( + `Error resetting index for chain ${chainIdNum}: ${error.message}. Please retry reindexChain command manually.` + ) + } + } + await dbActive.sqliteConfig?.createOrUpdateConfig('version', currentVersion) + INDEXER_LOGGER.info(`Updated node version in database to ${currentVersion}`) + } else { + INDEXER_LOGGER.info('No reindexing needed based on version check') + } + } } diff --git a/src/components/Indexer/processor.ts b/src/components/Indexer/processor.ts index c887a9025..7518ed2a6 100644 --- a/src/components/Indexer/processor.ts +++ b/src/components/Indexer/processor.ts @@ -1,783 +1,203 @@ -import { - Interface, - JsonRpcApiProvider, - Signer, - ethers, - getAddress, - getBytes, - hexlify, - toUtf8Bytes, - toUtf8String -} from 'ethers' -import { createHash } from 'crypto' -import { Readable } from 'node:stream' -import axios from 'axios' -import { toString as uint8ArrayToString } from 'uint8arrays/to-string' -import { LOG_LEVELS_STR } from '../../utils/logging/Logger.js' -import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' } -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' assert { type: 'json' } -import { getDatabase } from '../../utils/database.js' -import { PROTOCOL_COMMANDS, EVENTS, MetadataStates } from '../../utils/constants.js' -import { getDtContract, wasNFTDeployedByOurFactory } from './utils.js' +import { ethers, Signer, FallbackProvider, Interface, getAddress } from 'ethers' +import { BlocksEvents, ProcessingEvents } from '../../@types/blockchain.js' +import { EVENTS } from '../../utils/constants.js' +import { getConfiguration } from '../../utils/config.js' import { INDEXER_LOGGER } from '../../utils/logging/common.js' -import { Storage } from '../../components/storage/index.js' -import { Purgatory } from './purgatory.js' -import { getConfiguration, timestampToDateTime } from '../../utils/index.js' -import { OceanNode } from '../../OceanNode.js' -import { asyncCallWithTimeout, streamToString } from '../../utils/util.js' -import { DecryptDDOCommand } from '../../@types/commands.js' -import { isRemoteDDO, makeDid } from '../core/utils/validateDdoHandler.js' -import { create256Hash } from '../../utils/crypt.js' -import { URLUtils } from '../../utils/url.js' -import { PolicyServer } from '../policyServer/index.js' -class BaseEventProcessor { - protected networkId: number - - constructor(chainId: number) { - this.networkId = chainId - } - - protected getTokenInfo(services: any[]): any[] { - const datatokens: any[] = [] - services.forEach((service) => { - datatokens.push({ - address: service.datatokenAddress, - name: 'Datatoken', - symbol: 'DT1', - serviceId: service.id - }) - }) - return datatokens - } - - protected async getEventData( - provider: JsonRpcApiProvider, - transactionHash: string, - abi: any - ): Promise { - const iface = new Interface(abi) - const receipt = await provider.getTransactionReceipt(transactionHash) - const eventObj = { - topics: receipt.logs[0].topics as string[], - data: receipt.logs[0].data - } - return iface.parseLog(eventObj) - } - - protected async getNFTInfo( - nftAddress: string, - signer: Signer, - owner: string, - timestamp: number - ): Promise { - const nftContract = new ethers.Contract(nftAddress, ERC721Template.abi, signer) - const state = parseInt((await nftContract.getMetaData())[2]) - const id = parseInt(await nftContract.getId()) - const tokenURI = await nftContract.tokenURI(id) - return { - state, - address: nftAddress, - name: await nftContract.name(), - symbol: await nftContract.symbol(), - owner, - created: timestampToDateTime(timestamp), - tokenURI - } - } - - protected async createOrUpdateDDO(ddo: any, method: string): Promise { - try { - const { ddo: ddoDatabase, ddoState } = await getDatabase() - const saveDDO = await ddoDatabase.update({ ...ddo }) - await ddoState.update( - this.networkId, - saveDDO.id, - saveDDO.nftAddress, - saveDDO.event?.tx, - true - ) - INDEXER_LOGGER.logMessage( - `Saved or updated DDO : ${saveDDO.id} from network: ${this.networkId} triggered by: ${method}` - ) - return saveDDO - } catch (err) { - const { ddoState } = await getDatabase() - await ddoState.update( - this.networkId, - ddo.id, - ddo.nftAddress, - ddo.event?.tx, - true, - err.message - ) - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `Error found on ${this.networkId} triggered by: ${method} while creating or updating DDO: ${err}`, - true - ) - } - } - - protected checkDdoHash(decryptedDocument: any, documentHashFromContract: any): boolean { - const utf8Bytes = toUtf8Bytes(JSON.stringify(decryptedDocument)) - const expectedMetadata = hexlify(utf8Bytes) - const expectedMetadataHash = create256Hash(expectedMetadata.toString()) - if (expectedMetadataHash !== documentHashFromContract) { - INDEXER_LOGGER.error( - `DDO checksum does not match. Expected: ${documentHashFromContract} Received: ${expectedMetadata}` - ) - return false - } - return true - } - - protected async decryptDDO( - decryptorURL: string, - flag: string, - eventCreator: string, - contractAddress: string, - chainId: number, - txId: string, - metadataHash: string, - metadata: any - ): Promise { - let ddo - if (parseInt(flag) === 2) { - INDEXER_LOGGER.logMessage( - `Decrypting DDO from network: ${this.networkId} created by: ${eventCreator} encrypted by: ${decryptorURL}` - ) - const nonce = Math.floor(Date.now() / 1000).toString() - const { keys } = await getConfiguration() - const nodeId = keys.peerId.toString() - - const wallet: ethers.Wallet = new ethers.Wallet(process.env.PRIVATE_KEY as string) - - const message = String( - txId + contractAddress + keys.ethAddress + chainId.toString() + nonce - ) - const consumerMessage = ethers.solidityPackedKeccak256( - ['bytes'], - [ethers.hexlify(ethers.toUtf8Bytes(message))] - ) - const signature = await wallet.signMessage(consumerMessage) - - if (URLUtils.isValidUrl(decryptorURL)) { - try { - const payload = { - transactionId: txId, - chainId, - decrypterAddress: keys.ethAddress, - dataNftAddress: contractAddress, - signature, - nonce - } - const response = await axios({ - method: 'post', - url: `${decryptorURL}/api/services/decrypt`, - data: payload - }) - if (response.status !== 200) { - const message = `bProvider exception on decrypt DDO. Status: ${response.status}, ${response.statusText}` - INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, message) - throw new Error(message) - } - - let responseHash - if (response.data instanceof Object) { - responseHash = create256Hash(JSON.stringify(response.data)) - ddo = response.data - } else { - ddo = JSON.parse(response.data) - responseHash = create256Hash(ddo) - } - if (responseHash !== metadataHash) { - const msg = `Hash check failed: response=${ddo}, decrypted ddo hash=${responseHash}\n metadata hash=${metadataHash}` - INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, msg) - throw new Error(msg) - } - } catch (err) { - const message = `Provider exception on decrypt DDO. Status: ${err.message}` - INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, message) - throw new Error(message) - } - } else { - const node = OceanNode.getInstance(await getDatabase()) - if (nodeId === decryptorURL) { - const decryptDDOTask: DecryptDDOCommand = { - command: PROTOCOL_COMMANDS.DECRYPT_DDO, - transactionId: txId, - decrypterAddress: keys.ethAddress, - chainId, - encryptedDocument: metadata, - documentHash: metadataHash, - dataNftAddress: contractAddress, - signature, - nonce - } - try { - const response = await node - .getCoreHandlers() - .getHandler(PROTOCOL_COMMANDS.DECRYPT_DDO) - .handle(decryptDDOTask) - ddo = JSON.parse(await streamToString(response.stream as Readable)) - } catch (error) { - const message = `Node exception on decrypt DDO. Status: ${error.message}` - INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, message) - throw new Error(message) - } - } else { - try { - const p2pNode = await node.getP2PNode() - let isBinaryContent = false - const sink = async function (source: any) { - let first = true - for await (const chunk of source) { - if (first) { - first = false - try { - const str = uint8ArrayToString(chunk.subarray()) // Obs: we need to specify the length of the subarrays - const decoded = JSON.parse(str) - if ('headers' in decoded) { - if (str?.toLowerCase().includes('application/octet-stream')) { - isBinaryContent = true - } - } - if (decoded.httpStatus !== 200) { - INDEXER_LOGGER.logMessage( - `Error in sink method : ${decoded.httpStatus} errro: ${decoded.error}` - ) - throw new Error('Error in sink method', decoded.error) - } - } catch (e) { - INDEXER_LOGGER.logMessage( - `Error in sink method } error: ${e.message}` - ) - throw new Error(`Error in sink method ${e.message}`) - } - } else { - if (isBinaryContent) { - return chunk.subarray() - } else { - const str = uint8ArrayToString(chunk.subarray()) - return str - } - } - } - } - const message = { - command: PROTOCOL_COMMANDS.DECRYPT_DDO, - transactionId: txId, - decrypterAddress: keys.ethAddress, - chainId, - encryptedDocument: metadata, - documentHash: metadataHash, - dataNftAddress: contractAddress, - signature, - nonce - } - const response = await p2pNode.sendTo( - decryptorURL, - JSON.stringify(message), - sink - ) - ddo = JSON.parse(await streamToString(response.stream as Readable)) - } catch (error) { - const message = `Node exception on decrypt DDO. Status: ${error.message}` - INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, message) - throw new Error(message) - } - } - } - } else { - INDEXER_LOGGER.logMessage( - `Decompressing DDO from network: ${this.networkId} created by: ${eventCreator} ecnrypted by: ${decryptorURL}` - ) - const byteArray = getBytes(metadata) - const utf8String = toUtf8String(byteArray) - ddo = JSON.parse(utf8String) - } - - return ddo - } +import { LOG_LEVELS_STR } from '../../utils/logging/Logger.js' +import { fetchEventFromTransaction } from '../../utils/util.js' +import { + BaseEventProcessor, + MetadataEventProcessor, + MetadataStateEventProcessor, + OrderStartedEventProcessor, + OrderReusedEventProcessor, + DispenserCreatedEventProcessor, + DispenserActivatedEventProcessor, + DispenserDeactivatedEventProcessor, + ExchangeCreatedEventProcessor, + ExchangeActivatedEventProcessor, + ExchangeDeactivatedEventProcessor, + ExchangeRateChangedEventProcessor, + ProcessorConstructor +} from './processors/index.js' +import { findEventByKey } from './utils.js' +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } +import AccessListContract from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessList.sol/AccessList.json' with { type: 'json' } + +const EVENT_PROCESSOR_MAP: Record = { + [EVENTS.METADATA_CREATED]: MetadataEventProcessor, + [EVENTS.METADATA_UPDATED]: MetadataEventProcessor, + [EVENTS.METADATA_STATE]: MetadataStateEventProcessor, + [EVENTS.ORDER_STARTED]: OrderStartedEventProcessor, + [EVENTS.ORDER_REUSED]: OrderReusedEventProcessor, + [EVENTS.DISPENSER_CREATED]: DispenserCreatedEventProcessor, + [EVENTS.DISPENSER_ACTIVATED]: DispenserActivatedEventProcessor, + [EVENTS.DISPENSER_DEACTIVATED]: DispenserDeactivatedEventProcessor, + [EVENTS.EXCHANGE_CREATED]: ExchangeCreatedEventProcessor, + [EVENTS.EXCHANGE_ACTIVATED]: ExchangeActivatedEventProcessor, + [EVENTS.EXCHANGE_DEACTIVATED]: ExchangeDeactivatedEventProcessor, + [EVENTS.EXCHANGE_RATE_CHANGED]: ExchangeRateChangedEventProcessor } -export class MetadataEventProcessor extends BaseEventProcessor { - async processEvent( - event: ethers.Log, - chainId: number, - signer: Signer, - provider: JsonRpcApiProvider, - eventName: string - ): Promise { - let did = 'did:op' - try { - const { ddo: ddoDatabase, ddoState } = await getDatabase() - const wasDeployedByUs = await wasNFTDeployedByOurFactory( - chainId, - signer, - getAddress(event.address) - ) - - if (!wasDeployedByUs) { - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `NFT not deployed by OPF factory`, - true - ) - return - } - const decodedEventData = await this.getEventData( - provider, - event.transactionHash, - ERC721Template.abi - ) - const metadata = decodedEventData.args[4] - const metadataHash = decodedEventData.args[5] - const flag = decodedEventData.args[3] - const owner = decodedEventData.args[0] - const decryptedDDO = await this.decryptDDO( - decodedEventData.args[2], - flag, - owner, - event.address, - chainId, - event.transactionHash, - metadataHash, - metadata - ) - const ddo = await this.processDDO(decryptedDDO) - if (ddo.id !== makeDid(event.address, chainId.toString(10))) { - INDEXER_LOGGER.error( - `Decrypted DDO ID is not matching the generated hash for DID.` - ) - return - } - // for unencrypted DDOs - console.log(ddo.id) - console.log(metadataHash) - if (parseInt(flag) !== 2 && !this.checkDdoHash(ddo, metadataHash)) { - return - } - did = ddo.id - // stuff that we overwrite - ddo.chainId = chainId - ddo.nftAddress = event.address - ddo.datatokens = this.getTokenInfo(ddo.services) - ddo.nft = await this.getNFTInfo( - ddo.nftAddress, - signer, - owner, - parseInt(decodedEventData.args[6]) - ) - - INDEXER_LOGGER.logMessage( - `Processed new DDO data ${ddo.id} with txHash ${event.transactionHash} from block ${event.blockNumber}`, - true - ) - - const previousDdo = await ddoDatabase.retrieve(ddo.id) - if (eventName === EVENTS.METADATA_CREATED) { - if (previousDdo && previousDdo.nft.state === MetadataStates.ACTIVE) { - INDEXER_LOGGER.logMessage(`DDO ${ddo.id} is already registered as active`, true) - await ddoState.update( - this.networkId, - did, - event.address, - event.transactionHash, - false, - `DDO ${ddo.id} is already registered as active` - ) - return - } - } - - if (eventName === EVENTS.METADATA_UPDATED) { - if (!previousDdo) { - INDEXER_LOGGER.logMessage( - `Previous DDO with did ${ddo.id} was not found the database. Maybe it was deleted/hidden to some violation issues`, - true - ) - await ddoState.update( - this.networkId, - did, - event.address, - event.transactionHash, - false, - `Previous DDO with did ${ddo.id} was not found the database. Maybe it was deleted/hidden to some violation issues` - ) - return - } - const [isUpdateable, error] = this.isUpdateable( - previousDdo, - event.transactionHash, - event.blockNumber - ) - if (!isUpdateable) { - INDEXER_LOGGER.error( - `Error encountered when checking if the asset is eligiable for update: ${error}` - ) - await ddoState.update( - this.networkId, - did, - event.address, - event.transactionHash, - false, - error - ) - return - } - } - const from = decodedEventData.args[0] - - // we need to store the event data (either metadata created or update and is updatable) - if ([EVENTS.METADATA_CREATED, EVENTS.METADATA_UPDATED].includes(eventName)) { - if (!ddo.event) { - ddo.event = {} - } - ddo.event.tx = event.transactionHash - ddo.event.from = from - ddo.event.contract = event.address - if (event.blockNumber) { - ddo.event.block = event.blockNumber - // try get block & timestamp from block (only wait 2.5 secs maximum) - const promiseFn = provider.getBlock(event.blockNumber) - const result = await asyncCallWithTimeout(promiseFn, 2500) - if (result.data !== null && !result.timeout) { - ddo.event.datetime = new Date(result.data.timestamp * 1000).toJSON() - } - } else { - ddo.event.block = -1 - } +const processorInstances = new Map() - // policyServer check - const policyServer = new PolicyServer() - let policyStatus - if (eventName === EVENTS.METADATA_UPDATED) - policyStatus = await policyServer.checkUpdateDDO( - ddo, - this.networkId, - event.transactionHash, - event - ) - else - policyStatus = await policyServer.checknewDDO( - ddo, - this.networkId, - event.transactionHash, - event - ) - if (!policyStatus.success) { - await ddoState.update( - this.networkId, - did, - event.address, - event.transactionHash, - false, - policyStatus.message - ) - return - } - } - // always call, but only create instance once - const purgatory = await Purgatory.getInstance() - // if purgatory is disabled just return false - const updatedDDO = await this.updatePurgatoryStateDdo(ddo, from, purgatory) - if (updatedDDO.purgatory.state === false) { - // TODO: insert in a different collection for purgatory DDOs - const saveDDO = this.createOrUpdateDDO(ddo, eventName) - return saveDDO - } - } catch (error) { - const { ddoState } = await getDatabase() - await ddoState.update( - this.networkId, - did, - event.address, - event.transactionHash, - false, - error.message - ) - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `Error processMetadataEvents: ${error}`, - true - ) - } - } - - async processDDO(ddo: any) { - if (isRemoteDDO(ddo)) { - INDEXER_LOGGER.logMessage('DDO is remote', true) - - const storage = Storage.getStorageClass(ddo.remote, await getConfiguration()) - const result = await storage.getReadableStream() - const streamToStringDDO = await streamToString(result.stream as Readable) - - return JSON.parse(streamToStringDDO) - } - - return ddo - } +function getEventProcessor(eventType: string, chainId: number): BaseEventProcessor { + const cacheKey = `${eventType}-${chainId}` - async updatePurgatoryStateDdo( - ddo: any, - owner: string, - purgatory: Purgatory - ): Promise { - if (purgatory.isEnabled()) { - const state: boolean = - (await purgatory.isBannedAsset(ddo.id)) || - (await purgatory.isBannedAccount(owner)) - ddo.purgatory = { - state - } - } else { - ddo.purgatory = { - state: false - } + if (!processorInstances.has(cacheKey)) { + const ProcessorClass = EVENT_PROCESSOR_MAP[eventType] + if (!ProcessorClass) { + throw new Error(`No processor found for event type: ${eventType}`) } - return ddo + processorInstances.set(cacheKey, new ProcessorClass(chainId)) } - isUpdateable(previousDdo: any, txHash: string, block: number): [boolean, string] { - let errorMsg: string - const ddoTxId = previousDdo.event.tx - // do not update if we have the same txid - if (txHash === ddoTxId) { - errorMsg = `Previous DDO has the same tx id, no need to update: event-txid=${txHash} <> asset-event-txid=${ddoTxId}` - INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_DEBUG, errorMsg, true) - return [false, errorMsg] - } - const ddoBlock = previousDdo.event.block - // do not update if we have the same block - if (block === ddoBlock) { - errorMsg = `Asset was updated later (block: ${ddoBlock}) vs transaction block: ${block}` - INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_DEBUG, errorMsg, true) - return [false, errorMsg] - } - - return [true, ''] - } + return processorInstances.get(cacheKey) } -export class MetadataStateEventProcessor extends BaseEventProcessor { - async processEvent( - event: ethers.Log, - chainId: number, - provider: JsonRpcApiProvider - ): Promise { - INDEXER_LOGGER.logMessage(`Processing metadata state event...`, true) - const decodedEventData = await this.getEventData( - provider, - event.transactionHash, - ERC721Template.abi - ) - const metadataState = parseInt(decodedEventData.args[1].toString()) - INDEXER_LOGGER.logMessage(`Processed new metadata state ${metadataState} `, true) - INDEXER_LOGGER.logMessage( - `NFT address in processing MetadataState: ${event.address} `, - true - ) - const did = - 'did:op:' + - createHash('sha256') - .update(getAddress(event.address) + chainId.toString(10)) - .digest('hex') - try { - const { ddo: ddoDatabase } = await getDatabase() - let ddo = await ddoDatabase.retrieve(did) - if (!ddo) { +export const processChunkLogs = async ( + logs: readonly ethers.Log[], + signer: Signer, + provider: FallbackProvider, + chainId: number +): Promise => { + const storeEvents: BlocksEvents = {} + if (logs.length > 0) { + const { allowedValidators, allowedValidatorsList } = await getConfiguration() // getAllowedValidators() + const checkMetadataValidated = + allowedValidators.length > 0 || + (allowedValidatorsList && Object.keys(allowedValidatorsList).length > 0) + for (const log of logs) { + const event = findEventByKey(log.topics[0]) + if (event && Object.values(EVENTS).includes(event.type)) { + // only log & process the ones we support INDEXER_LOGGER.logMessage( - `Detected MetadataState changed for ${did}, but it does not exists.` + `-- ${event.type} -- triggered for ${log.transactionHash}`, + true ) - return - } - INDEXER_LOGGER.logMessage(`Found did ${did} on network ${chainId}`) - - if ('nft' in ddo && ddo.nft.state !== metadataState) { - let shortVersion = null - if ( - ddo.nft.state === MetadataStates.ACTIVE && - [MetadataStates.REVOKED, MetadataStates.DEPRECATED].includes(metadataState) + event.type === EVENTS.METADATA_CREATED || + event.type === EVENTS.METADATA_UPDATED || + event.type === EVENTS.METADATA_STATE ) { - INDEXER_LOGGER.logMessage( - `DDO became non-visible from ${ddo.nft.state} to ${metadataState}` - ) - shortVersion = { - id: ddo.id, - chainId, - nftAddress: ddo.nftAddress, - nft: { - state: metadataState + // ref: https://github.com/oceanprotocol/ocean-node/issues/257 + if (checkMetadataValidated) { + const txReceipt = await provider.getTransactionReceipt(log.transactionHash) + const metadataProofs = fetchEventFromTransaction( + txReceipt, + 'MetadataValidated', + new Interface(ERC20Template.abi) + ) + if (!metadataProofs) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Metadata Proof validator not allowed`, + true + ) + continue + // do not process this one } - } - } - - // We should keep it here, because in further development we'll store - // the previous structure of the non-visible DDOs (full version) - // in case their state changes back to active. - ddo.nft.state = metadataState - if (shortVersion) { - ddo = shortVersion + const validators: string[] = metadataProofs.map((metadataProof) => + getAddress(metadataProof.args[0].toString()) + ) + // ALLOWED_VALIDATORS CHECK + const allowed = allowedValidators.filter( + (allowedValidator) => validators.indexOf(allowedValidator) !== -1 + ) + if (!allowed.length) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Metadata Proof validators list is empty. Block/event for tx ${log.transactionHash} was NOT processed due to no allowed validators.`, + true + ) + continue + // do not process this one + } + // ALLOWED_VALIDATORS_LIST + // by default it is OK + let isAllowed = true + if (allowedValidatorsList && validators.length > 0) { + // need to check then + isAllowed = false + // check accessList + const chainsListed = Object.keys(allowedValidatorsList) + const chain = String(chainId) + // check the access lists for this chain + if (chainsListed.length > 0 && chainsListed.includes(chain)) { + for (const accessListAddress of allowedValidatorsList[chain]) { + // instantiate contract and check balanceOf + const accessListContract = new ethers.Contract( + accessListAddress, + AccessListContract.abi, + signer + ) + for (const metaproofValidator of validators) { + // if has at least 1 token than it is authorized + // its enough one validator on the list + const balance = await accessListContract.balanceOf(metaproofValidator) + if (Number(balance) <= 0) { + INDEXER_LOGGER.error( + `Metadata validator: ${metaproofValidator} is NOT part of the access list group: ${accessListAddress}.` + ) + } else { + isAllowed = true + break + } + } + } + } else { + isAllowed = true // no rules for this specific chain, so ignore this + } + // move on to the next (do not process this event) + if (isAllowed === false) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Block/event for tx ${log.transactionHash} was NOT processed because none of the metadata validators are part of the access list group(s) for chain ${chainId}.`, + true + ) + continue + } + } // end if (allowedValidatorsList) { + } // end if if (checkMetadataValidated) { } - } else { - // Still update until we validate and polish schemas for DDO. - // But it should update ONLY if the first condition is met. - // Check https://github.com/oceanprotocol/aquarius/blob/84a560ea972485e46dd3c2cfc3cdb298b65d18fa/aquarius/events/processors.py#L663 - ddo.nft = { - state: metadataState + if (event.type === EVENTS.TOKEN_URI_UPDATE) { + storeEvents[event.type] = 'TOKEN_URI_UPDATE' + } else { + const processor = getEventProcessor(event.type, chainId) + storeEvents[event.type] = await processor.processEvent( + log, + chainId, + signer, + provider, + event.type + ) } } - INDEXER_LOGGER.logMessage( - `Found did ${did} for state updating on network ${chainId}` - ) - const savedDDO = this.createOrUpdateDDO(ddo, EVENTS.METADATA_STATE) - return savedDDO - } catch (err) { - INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) } + return storeEvents } -} -export class OrderStartedEventProcessor extends BaseEventProcessor { - async processEvent( - event: ethers.Log, - chainId: number, - signer: Signer, - provider: JsonRpcApiProvider - ): Promise { - const decodedEventData = await this.getEventData( - provider, - event.transactionHash, - ERC20Template.abi - ) - const serviceIndex = parseInt(decodedEventData.args[3].toString()) - const timestamp = parseInt(decodedEventData.args[4].toString()) - const consumer = decodedEventData.args[0].toString() - const payer = decodedEventData.args[1].toString() - INDEXER_LOGGER.logMessage( - `Processed new order for service index ${serviceIndex} at ${timestamp}`, - true - ) - const datatokenContract = getDtContract(signer, event.address) - - const nftAddress = await datatokenContract.getERC721Address() - const did = - 'did:op:' + - createHash('sha256') - .update(getAddress(nftAddress) + chainId.toString(10)) - .digest('hex') - try { - const { ddo: ddoDatabase, order: orderDatabase } = await getDatabase() - const ddo = await ddoDatabase.retrieve(did) - if (!ddo) { - INDEXER_LOGGER.logMessage( - `Detected OrderStarted changed for ${did}, but it does not exists.` - ) - return - } - if ( - 'stats' in ddo && - ddo.services[serviceIndex].datatokenAddress?.toLowerCase() === - event.address?.toLowerCase() - ) { - ddo.stats.orders += 1 - } else { - // Still update until we validate and polish schemas for DDO. - // But it should update ONLY if first condition is met. - ddo.stats = { - orders: 1 - } - } - await orderDatabase.create( - event.transactionHash, - 'startOrder', - timestamp, - consumer, - payer, - ddo.services[serviceIndex].datatokenAddress, - nftAddress, - did - ) - INDEXER_LOGGER.logMessage( - `Found did ${did} for order starting on network ${chainId}` - ) - const savedDDO = this.createOrUpdateDDO(ddo, EVENTS.ORDER_STARTED) - return savedDDO - } catch (err) { - INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) - } - } + return {} } -export class OrderReusedEventProcessor extends BaseEventProcessor { - async processEvent( - event: ethers.Log, - chainId: number, - signer: Signer, - provider: JsonRpcApiProvider - ): Promise { - const decodedEventData = await this.getEventData( - provider, - event.transactionHash, - ERC20Template.abi - ) - const startOrderId = decodedEventData.args[0].toString() - const timestamp = parseInt(decodedEventData.args[2].toString()) - const payer = decodedEventData.args[1].toString() - INDEXER_LOGGER.logMessage(`Processed reused order at ${timestamp}`, true) - - const datatokenContract = getDtContract(signer, event.address) - - const nftAddress = await datatokenContract.getERC721Address() - const did = - 'did:op:' + - createHash('sha256') - .update(getAddress(nftAddress) + chainId.toString(10)) - .digest('hex') - try { - const { ddo: ddoDatabase, order: orderDatabase } = await getDatabase() - const ddo = await ddoDatabase.retrieve(did) - if (!ddo) { - INDEXER_LOGGER.logMessage( - `Detected OrderReused changed for ${did}, but it does not exists.` - ) - return - } - ddo.stats.orders += 1 - - try { - const startOrder = await orderDatabase.retrieve(startOrderId) - if (!startOrder) { - INDEXER_LOGGER.logMessage( - `Detected OrderReused changed for order ${startOrderId}, but it does not exists.` - ) - return - } - await orderDatabase.create( - event.transactionHash, - 'reuseOrder', - timestamp, - startOrder.consumer, - payer, - ddo.services[0].datatokenAddress, - nftAddress, - did, - startOrderId - ) - } catch (error) { - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `Error retrieving startOrder for reuseOrder: ${error}`, - true - ) - } - - const savedDDO = this.createOrUpdateDDO(ddo, EVENTS.ORDER_REUSED) - return savedDDO - } catch (err) { - INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) +export const processBlocks = async ( + blockLogs: ethers.Log[], + signer: Signer, + provider: FallbackProvider, + network: number, + lastIndexedBlock: number, + count: number +): Promise => { + try { + const events: any[] | BlocksEvents = + blockLogs && blockLogs.length > 0 + ? await processChunkLogs(blockLogs, signer, provider, network) + : [] + return { + lastBlock: lastIndexedBlock + count, + foundEvents: events } + } catch (error) { + throw new Error(`Error processing chunk of blocks events ${error.message}`) } } diff --git a/src/components/Indexer/processors/BaseProcessor.ts b/src/components/Indexer/processors/BaseProcessor.ts new file mode 100644 index 000000000..82e224c52 --- /dev/null +++ b/src/components/Indexer/processors/BaseProcessor.ts @@ -0,0 +1,557 @@ +import { VersionedDDO, DeprecatedDDO } from '@oceanprotocol/ddo-js' +import axios from 'axios' +import { + ZeroAddress, + Signer, + ethers, + Interface, + toUtf8Bytes, + hexlify, + getBytes, + toUtf8String, + FallbackProvider, + getAddress +} from 'ethers' +import { Readable } from 'winston-transport' +import { DecryptDDOCommand, NonceCommand } from '../../../@types/commands.js' +import { OceanNode } from '../../../OceanNode.js' +import { EVENT_HASHES, PROTOCOL_COMMANDS } from '../../../utils/constants.js' +import { timestampToDateTime } from '../../../utils/conversions.js' +import { create256Hash } from '../../../utils/crypt.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { URLUtils } from '../../../utils/url.js' +import { streamToString, streamToUint8Array } from '../../../utils/util.js' +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } +import { toString as uint8ArrayToString } from 'uint8arrays/to-string' +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } +import { fetchTransactionReceipt } from '../../core/utils/validateOrders.js' +import { withRetrial } from '../utils.js' +import { createHash } from 'crypto' +import { AbstractDdoDatabase } from '../../database/BaseDatabase.js' + +export abstract class BaseEventProcessor { + protected networkId: number + + constructor(chainId: number) { + this.networkId = chainId + } + + protected isValidDtAddressFromServices(services: any[]): boolean { + for (const service of services) { + if ( + service.datatokenAddress === '0x0' || + service.datatokenAddress === ZeroAddress + ) { + return false + } + } + return true + } + + protected async getTokenInfo(services: any[], signer: Signer): Promise { + const datatokens: any[] = [] + + for (const service of services) { + const datatoken = new ethers.Contract( + service.datatokenAddress, + ERC20Template.abi, + signer + ) + let name: string + let symbol: string + if ( + service.datatokenAddress === '0x0' || + service.datatokenAddress === ZeroAddress + ) { + name = `Datatoken${services.indexOf(service)}` + symbol = `DT${services.indexOf(service)}` + } else { + name = await datatoken.name() + INDEXER_LOGGER.logMessage(`name.datatoken: ${name}`) + symbol = await datatoken.symbol() + INDEXER_LOGGER.logMessage(`symbol.datatoken: ${symbol}`) + } + + datatokens.push({ + address: service.datatokenAddress, + name, + symbol, + serviceId: service.id + }) + } + + return datatokens + } + + protected async getEventData( + provider: FallbackProvider, + transactionHash: string, + abi: any, + eventType: string + ): Promise { + const iface = new Interface(abi) + let receipt: ethers.TransactionReceipt + try { + receipt = await fetchTransactionReceipt(transactionHash, provider) + } catch (e) { + INDEXER_LOGGER.error(`Error retrieving receipt: ${e.message}`) + } + if (receipt) { + let eventHash: string + for (const [key, value] of Object.entries(EVENT_HASHES)) { + if (value.type === eventType) { + eventHash = key + break + } + } + if (eventHash === '') { + INDEXER_LOGGER.error(`Event hash couldn't be found!`) + return null + } + + let eventObj: any + for (const log of receipt.logs) { + if (log.topics[0] === eventHash) { + eventObj = { + topics: log.topics, + data: log.data + } + break + } + } + + if (!eventObj) { + INDEXER_LOGGER.error( + `Event object couldn't be retrieved! Event hash not present in logs topics` + ) + return null + } + + return iface.parseLog(eventObj) + } else { + INDEXER_LOGGER.error('Receipt could not be fetched') + } + } + + protected async getNFTInfo( + nftAddress: string, + signer: Signer, + owner: string, + timestamp: number + ): Promise { + const nftContract = new ethers.Contract(nftAddress, ERC721Template.abi, signer) + const state = parseInt((await nftContract.getMetaData())[2]) + const id = parseInt(await nftContract.getId()) + const tokenURI = await nftContract.tokenURI(id) + return { + state, + address: nftAddress, + name: await nftContract.name(), + symbol: await nftContract.symbol(), + owner, + created: timestampToDateTime(timestamp), + tokenURI + } + } + + protected async createOrUpdateDDO(ddo: VersionedDDO, method: string): Promise { + try { + const { ddo: ddoDatabase, ddoState } = await getDatabase() + if (ddo instanceof DeprecatedDDO) { + const { id, nftAddress } = ddo.getDDOFields() + await Promise.all([ddoDatabase.delete(id), ddoState.delete(id)]) + const saveDDO = await ddoDatabase.create(ddo.getDDOData()) + await ddoState.create(this.networkId, saveDDO.id, nftAddress, undefined, true) + + return saveDDO + } + + const saveDDO = await ddoDatabase.update({ ...ddo.getDDOData() }) + await ddoState.update( + this.networkId, + saveDDO.id, + saveDDO.nftAddress, + saveDDO.indexedMetadata?.event?.tx, + true + ) + INDEXER_LOGGER.logMessage( + `Saved or updated DDO : ${saveDDO.id} from network: ${this.networkId} triggered by: ${method}` + ) + return saveDDO + } catch (err) { + const { ddoState } = await getDatabase() + const { id, nftAddress } = ddo.getDDOFields() + const tx = + ddo instanceof DeprecatedDDO + ? undefined + : ddo.getAssetFields().indexedMetadata?.event?.txid + + await ddoState.update(this.networkId, id, nftAddress, tx, true, err.message) + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Error found on ${this.networkId} triggered by: ${method} while creating or updating DDO: ${err}`, + true + ) + } + } + + protected checkDdoHash(decryptedDocument: any, documentHashFromContract: any): boolean { + const utf8Bytes = toUtf8Bytes(JSON.stringify(decryptedDocument)) + const expectedMetadata = hexlify(utf8Bytes) + if (create256Hash(expectedMetadata.toString()) !== documentHashFromContract) { + INDEXER_LOGGER.error(`DDO checksum does not match.`) + return false + } + return true + } + + protected async getDDO( + ddoDatabase: AbstractDdoDatabase, + nftAddress: string, + chainId: number + ): Promise { + const did = + 'did:op:' + + createHash('sha256') + .update(getAddress(nftAddress) + chainId.toString(10)) + .digest('hex') + const didOpe = + 'did:ope:' + + createHash('sha256') + .update(getAddress(nftAddress) + chainId.toString(10)) + .digest('hex') + + let ddo = await ddoDatabase.retrieve(did) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected OrderStarted changed for ${did}, but it does not exists, try with ddo:ope.` + ) + ddo = await ddoDatabase.retrieve(didOpe) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected OrderStarted changed for ${didOpe}, but it does not exists.` + ) + } + } + return ddo + } + + private async getNonce(decryptorURL: string, address: string) { + try { + if (URLUtils.isValidUrl(decryptorURL)) { + INDEXER_LOGGER.logMessage( + `decryptDDO: Making HTTP request for nonce. DecryptorURL: ${decryptorURL}` + ) + const nonceResponse = await axios.get( + `${decryptorURL}/api/services/nonce?userAddress=${address}`, + { timeout: 20000 } + ) + return nonceResponse.status === 200 && nonceResponse.data + ? String(parseInt(nonceResponse.data.nonce) + 1) + : Date.now().toString() + } else { + return Date.now().toString() + } + } catch (err) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `decryptDDO: Error getting nonce, using timestamp: ${err.message}` + ) + return Date.now().toString() + } + } + + protected async decryptDDO( + decryptorURL: string, + flag: string, + eventCreator: string, + contractAddress: string, + chainId: number, + txId: string, + metadataHash: string, + metadata: any + ): Promise { + let ddo + // Log the flag value + INDEXER_LOGGER.logMessage(`decryptDDO: flag=${flag}`) + if ((parseInt(flag) & 2) !== 0) { + INDEXER_LOGGER.logMessage( + `Decrypting DDO from network: ${this.networkId} created by: ${eventCreator} encrypted by: ${decryptorURL}` + ) + + const oceanNode = OceanNode.getInstance() + const keyManager = oceanNode.getKeyManager() + const nodeId = keyManager.getPeerId().toString() + const wallet = keyManager.getEthWallet() + const ethAddress = wallet.address + + const useTxIdOrContractAddress = txId || contractAddress + + if (URLUtils.isValidUrl(decryptorURL)) { + try { + const response = await withRetrial(async () => { + const nonce: string = await this.getNonce(decryptorURL, ethAddress) + INDEXER_LOGGER.logMessage( + `decryptDDO: Fetched fresh nonce ${nonce} for decrypt attempt` + ) + + const message = String( + useTxIdOrContractAddress + ethAddress + chainId.toString() + nonce + ) + const signature = await keyManager.signMessage(message) + + const payload = { + transactionId: txId, + chainId, + decrypterAddress: ethAddress, + dataNftAddress: contractAddress, + signature, + nonce + } + try { + const res = await axios({ + method: 'post', + url: `${decryptorURL}/api/services/decrypt`, + data: payload, + timeout: 30000, + validateStatus: (status) => { + return ( + (status >= 200 && status < 300) || status === 400 || status === 403 + ) + } + }) + + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_INFO, + `Decrypt request successful. Status: ${res.status}, ${res.statusText}` + ) + + if (res.status === 400 || res.status === 403) { + // Return error response, to avoid retry for unnecessary errors + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `bProvider exception on decrypt DDO. Status: ${res.status}, ${res.statusText}` + ) + return res + } + + if (res.status !== 200 && res.status !== 201) { + const message = `bProvider exception on decrypt DDO. Status: ${res.status}, ${res.statusText}` + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, message) + throw new Error(message) // Retry 5XX errors + } + return res + } catch (err: any) { + // Retry ONLY on ECONNREFUSED + if ( + err.code === 'ECONNREFUSED' || + (err.message && err.message.includes('ECONNREFUSED')) + ) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Decrypt request failed with ECONNREFUSED, retrying...`, + true + ) + throw err + } + + throw err + } + }) + + if (response.status === 400 || response.status === 403) { + throw new Error(`Provider validation failed: ${response.statusText}`) + } + + let responseHash + if (response.data instanceof Object) { + responseHash = create256Hash(JSON.stringify(response.data)) + ddo = response.data + } else { + ddo = JSON.parse(response.data) + responseHash = create256Hash(ddo) + } + if (responseHash !== metadataHash) { + const msg = `Hash check failed: response=${ddo}, decrypted ddo hash=${responseHash}\n metadata hash=${metadataHash}` + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, msg) + throw new Error(msg) + } + } catch (err) { + const message = `Provider exception on decrypt DDO. Status: ${err.message}` + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, message) + throw new Error(message) + } + } else { + if (nodeId === decryptorURL) { + // Fetch nonce and signature from local node + let nonceP2p: string + const getNonceTask: NonceCommand = { + address: ethAddress, + command: PROTOCOL_COMMANDS.NONCE + } + try { + const response = await oceanNode + .getCoreHandlers() + .getHandler(PROTOCOL_COMMANDS.NONCE) + .handle(getNonceTask) + nonceP2p = await streamToString(response.stream as Readable) + } catch (error) { + const message = `Node exception on getting nonce from local nodeId ${nodeId}. Status: ${error.message}` + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, message) + throw new Error(message) + } + INDEXER_LOGGER.debug( + `decryptDDO: Fetched fresh nonce ${nonceP2p} for decrypt attempt from local nodeId ${nodeId}` + ) + + const message = String( + useTxIdOrContractAddress + ethAddress + chainId.toString() + nonceP2p + ) + const signature = await keyManager.signMessage(message) + + const decryptDDOTask: DecryptDDOCommand = { + command: PROTOCOL_COMMANDS.DECRYPT_DDO, + transactionId: txId, + decrypterAddress: ethAddress, + chainId, + encryptedDocument: metadata, + documentHash: metadataHash, + dataNftAddress: contractAddress, + signature, + nonce: nonceP2p + } + try { + const response = await oceanNode + .getCoreHandlers() + .getHandler(PROTOCOL_COMMANDS.DECRYPT_DDO) + .handle(decryptDDOTask) + ddo = JSON.parse(await streamToString(response.stream as Readable)) + } catch (error) { + const message = `Node exception on decrypt DDO from local nodeId ${nodeId}. Status: ${error.message}` + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, message) + throw new Error(message) + } + } else { + // it's a remote node + try { + const p2pNode = await oceanNode.getP2PNode() + const getNonceTask: NonceCommand = { + address: ethAddress, + command: PROTOCOL_COMMANDS.NONCE + } + let response = await p2pNode.sendTo( + decryptorURL, + JSON.stringify(getNonceTask) + ) + + if (response.status.httpStatus !== 200) { + const logMessage = `Node exception on get nonce from remote nodeId ${nodeId}. Status: ${response.status.httpStatus} ${response.status.error}` + INDEXER_LOGGER.warn(logMessage) + throw new Error(logMessage) + } + + if (!response.stream) { + const logMessage = `No stream for get nonce from remote nodeId ${nodeId}. Status: ${response.status.httpStatus} ${response.status.error}` + INDEXER_LOGGER.warn(logMessage) + throw new Error(logMessage) + } + + // Convert stream to Uint8Array + const remoteNonce = await streamToString(response.stream as Readable) + INDEXER_LOGGER.debug( + `decryptDDO: Fetched fresh nonce ${remoteNonce} from remote node ${decryptorURL} for decrypt attempt` + ) + + const messageToSign = String( + useTxIdOrContractAddress + ethAddress + chainId.toString() + remoteNonce + ) + const signature = await keyManager.signMessage(messageToSign) + + const message = { + command: PROTOCOL_COMMANDS.DECRYPT_DDO, + transactionId: txId, + decrypterAddress: ethAddress, + chainId, + encryptedDocument: metadata, + documentHash: metadataHash, + dataNftAddress: contractAddress, + signature, + nonce: remoteNonce + } + + response = await p2pNode.sendTo(decryptorURL, JSON.stringify(message)) + + if (response.status.httpStatus !== 200) { + const logMessage = `Node exception on decryptDDO from remote nodeId ${nodeId}. Status: ${response.status.httpStatus} ${response.status.error}` + INDEXER_LOGGER.warn(logMessage) + throw new Error(logMessage) + } + + if (!response.stream) { + const logMessage = `No stream for decryptDDO from remote nodeId ${nodeId}. Status: ${response.status.httpStatus} ${response.status.error}` + INDEXER_LOGGER.warn(logMessage) + throw new Error(logMessage) + } + + // Convert stream to Uint8Array + const data = await streamToUint8Array(response.stream as Readable) + ddo = JSON.parse(uint8ArrayToString(data)) + } catch (error) { + const message = `Exception from remote nodeId ${nodeId}. Status: ${error.message}` + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, message) + throw new Error(message) + } + } + } + } else { + INDEXER_LOGGER.debug( + `Decompressing DDO from network: ${this.networkId} created by: ${eventCreator} ecnrypted by: ${decryptorURL}` + ) + const byteArray = getBytes(metadata) + const utf8String = toUtf8String(byteArray) + ddo = JSON.parse(utf8String) + } + + return ddo + } + + protected decryptDDOIPFS( + decryptorURL: string, + eventCreator: string, + metadata: any + ): Promise { + INDEXER_LOGGER.logMessage( + `Decompressing DDO from network: ${this.networkId} created by: ${eventCreator} ecnrypted by: ${decryptorURL}` + ) + const byteArray = getBytes(metadata) + const utf8String = toUtf8String(byteArray) + const proof = JSON.parse(utf8String) + return proof + } + + protected getDataFromProof( + proof: any + ): { header: any; ddoObj: Record; signature: string } | null { + INDEXER_LOGGER.logMessage(`Decompressing JWT`) + const data = proof.split('.') + if (data.length > 2) { + const header = JSON.parse(Buffer.from(data[0], 'base64').toString('utf-8')) + let ddoObj = JSON.parse(Buffer.from(data[1], 'base64').toString('utf-8')) + if (ddoObj.vc) ddoObj = ddoObj.vc + const signature = data[2] + + return { header, ddoObj, signature } + } + return null + } + + public abstract processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider, + eventName?: string + ): Promise +} diff --git a/src/components/Indexer/processors/DispenserActivatedEventProcessor.ts b/src/components/Indexer/processors/DispenserActivatedEventProcessor.ts new file mode 100644 index 000000000..2ade38b8c --- /dev/null +++ b/src/components/Indexer/processors/DispenserActivatedEventProcessor.ts @@ -0,0 +1,119 @@ +import { DDOManager } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider, ZeroAddress } from 'ethers' +import { EVENTS } from '../../../utils/constants.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { + getDtContract, + getDid, + doesDispenserAlreadyExist, + findServiceIdByDatatoken, + getPricesByDt, + isValidDispenserContract +} from '../utils.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import Dispenser from '@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json' with { type: 'json' } + +export class DispenserActivatedEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider + ): Promise { + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + Dispenser.abi, + EVENTS.DISPENSER_ACTIVATED + ) + const datatokenAddress = decodedEventData.args[0].toString() + if (!datatokenAddress) { + INDEXER_LOGGER.error( + `Datatoken address is not found in decoded event. Decoded event: ${JSON.stringify( + decodedEventData + )}` + ) + return null + } + if (datatokenAddress === ZeroAddress) { + INDEXER_LOGGER.error( + `Datatoken address is ZERO ADDRESS. Cannot find DDO by ZERO ADDRESS contract.` + ) + return null + } + const datatokenContract = getDtContract(signer, datatokenAddress) + + const nftAddress = await datatokenContract.getERC721Address() + const did = getDid(nftAddress, chainId) + try { + const { ddo: ddoDatabase } = await getDatabase() + const ddo = await this.getDDO(ddoDatabase, nftAddress, chainId) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected DispenserActivated changed for ${did}, but it does not exists.` + ) + return + } + if (!(await isValidDispenserContract(event.address, chainId, signer))) { + INDEXER_LOGGER.warn( + `Dispenser contract ${event.address} is not approved by Router. + Abort updating DDO pricing! Returning the existing DDO...` + ) + return ddo + } + const ddoInstance = DDOManager.getDDOClass(ddo) + if (!ddoInstance.getAssetFields().indexedMetadata) { + ddoInstance.updateFields({ indexedMetadata: {} }) + } + + if (!Array.isArray(ddoInstance.getAssetFields().indexedMetadata.stats)) { + ddoInstance.updateFields({ indexedMetadata: { stats: [] } }) + } + + if (ddoInstance.getAssetFields().indexedMetadata.stats.length !== 0) { + for (const stat of ddoInstance.getAssetFields().indexedMetadata.stats) { + if ( + stat.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase() && + !doesDispenserAlreadyExist(event.address, stat.prices)[0] + ) { + stat.prices.push({ + type: 'dispenser', + price: '0', + contract: event.address, + token: datatokenAddress + }) + break + } else if (doesDispenserAlreadyExist(event.address, stat.prices)[0]) { + break + } + } + } else { + INDEXER_LOGGER.logMessage(`[DispenserActivated] - No stats were found on the ddo`) + const serviceIdToFind = findServiceIdByDatatoken(ddoInstance, datatokenAddress) + if (!serviceIdToFind) { + INDEXER_LOGGER.logMessage( + `[DispenserActivated] - This datatoken does not contain this service. Invalid service id!` + ) + return + } + ddo.indexedMetadata.stats.push({ + datatokenAddress, + name: await datatokenContract.name(), + serviceId: serviceIdToFind, + orders: 0, + prices: await getPricesByDt(datatokenContract, signer) + }) + } + + const savedDDO = await this.createOrUpdateDDO( + ddoInstance, + EVENTS.DISPENSER_ACTIVATED + ) + return savedDDO + } catch (err) { + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) + } + } +} diff --git a/src/components/Indexer/processors/DispenserCreatedEventProcessor.ts b/src/components/Indexer/processors/DispenserCreatedEventProcessor.ts new file mode 100644 index 000000000..a44123ef1 --- /dev/null +++ b/src/components/Indexer/processors/DispenserCreatedEventProcessor.ts @@ -0,0 +1,121 @@ +import { DDOManager, PriceType } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider, ZeroAddress } from 'ethers' +import { EVENTS } from '../../../utils/constants.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { + getDtContract, + getDid, + doesDispenserAlreadyExist, + findServiceIdByDatatoken, + getPricesByDt, + isValidDispenserContract +} from '../utils.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import Dispenser from '@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json' with { type: 'json' } + +export class DispenserCreatedEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider + ): Promise { + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + Dispenser.abi, + EVENTS.DISPENSER_CREATED + ) + const datatokenAddress = decodedEventData.args[0].toString() + if (!datatokenAddress) { + INDEXER_LOGGER.error( + `Datatoken address is not found in decoded event. Decoded event: ${JSON.stringify( + decodedEventData + )}` + ) + return null + } + if (datatokenAddress === ZeroAddress) { + INDEXER_LOGGER.error( + `Datatoken address is ZERO ADDRESS. Cannot find DDO by ZERO ADDRESS contract.` + ) + return null + } + const datatokenContract = getDtContract(signer, datatokenAddress) + + const nftAddress = await datatokenContract.getERC721Address() + const did = getDid(nftAddress, chainId) + try { + const { ddo: ddoDatabase } = await getDatabase() + const ddo = await this.getDDO(ddoDatabase, nftAddress, chainId) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected DispenserCreated changed for ${did}, but it does not exists.` + ) + return + } + if (!(await isValidDispenserContract(event.address, chainId, signer))) { + INDEXER_LOGGER.warn( + `Dispenser contract ${event.address} is not approved by Router. + Abort updating DDO pricing! Returning the existing DDO...` + ) + return ddo + } + const ddoInstance = DDOManager.getDDOClass(ddo) + if (!ddoInstance.getAssetFields().indexedMetadata) { + ddoInstance.updateFields({ indexedMetadata: {} }) + } + + if (!Array.isArray(ddoInstance.getAssetFields().indexedMetadata.stats)) { + ddoInstance.updateFields({ indexedMetadata: { stats: [] } }) + } + + if (ddoInstance.getAssetFields().indexedMetadata.stats.length !== 0) { + for (const stat of ddoInstance.getAssetFields().indexedMetadata.stats) { + if ( + stat.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase() && + !doesDispenserAlreadyExist(event.address, stat.prices)[0] + ) { + const price = { + type: 'dispenser' as PriceType, + price: '0', + contract: event.address, + token: datatokenAddress + } + stat.prices.push(price) + break + } else if (doesDispenserAlreadyExist(event.address, stat.prices)[0]) { + break + } + } + } else { + INDEXER_LOGGER.logMessage(`[DispenserCreated] - No stats were found on the ddo`) + const serviceIdToFind = findServiceIdByDatatoken(ddoInstance, datatokenAddress) + if (!serviceIdToFind) { + INDEXER_LOGGER.logMessage( + `[DispenserCreated] - This datatoken does not contain this service. Invalid service id!` + ) + return + } + const { stats } = ddoInstance.getAssetFields().indexedMetadata + stats.push({ + datatokenAddress, + name: await datatokenContract.name(), + symbol: await datatokenContract.symbol(), + serviceId: serviceIdToFind, + orders: 0, + prices: await getPricesByDt(datatokenContract, signer) + }) + + ddoInstance.updateFields({ indexedMetadata: { stats } }) + } + + const savedDDO = await this.createOrUpdateDDO(ddoInstance, EVENTS.DISPENSER_CREATED) + return savedDDO + } catch (err) { + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) + } + } +} diff --git a/src/components/Indexer/processors/DispenserDeactivatedEventProcessor.ts b/src/components/Indexer/processors/DispenserDeactivatedEventProcessor.ts new file mode 100644 index 000000000..38e056edb --- /dev/null +++ b/src/components/Indexer/processors/DispenserDeactivatedEventProcessor.ts @@ -0,0 +1,128 @@ +import { DDOManager } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider, ZeroAddress } from 'ethers' +import { EVENTS } from '../../../utils/constants.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { + getDtContract, + getDid, + doesDispenserAlreadyExist, + findServiceIdByDatatoken, + getPricesByDt, + isValidDispenserContract +} from '../utils.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import Dispenser from '@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json' with { type: 'json' } + +export class DispenserDeactivatedEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider + ): Promise { + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + Dispenser.abi, + EVENTS.DISPENSER_DEACTIVATED + ) + const datatokenAddress = decodedEventData.args[0].toString() + if (!datatokenAddress) { + INDEXER_LOGGER.error( + `Datatoken address is not found in decoded event. Decoded event: ${JSON.stringify( + decodedEventData + )}` + ) + return null + } + if (datatokenAddress === ZeroAddress) { + INDEXER_LOGGER.error( + `Datatoken address is ZERO ADDRESS. Cannot find DDO by ZERO ADDRESS contract.` + ) + return null + } + const datatokenContract = getDtContract(signer, datatokenAddress) + + const nftAddress = await datatokenContract.getERC721Address() + const did = getDid(nftAddress, chainId) + try { + const { ddo: ddoDatabase } = await getDatabase() + const ddo = await this.getDDO(ddoDatabase, nftAddress, chainId) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected DispenserDeactivated changed for ${did}, but it does not exists.` + ) + return + } + if (!(await isValidDispenserContract(event.address, chainId, signer))) { + INDEXER_LOGGER.warn( + `Dispenser contract ${event.address} is not approved by Router. + Abort updating DDO pricing! Returning the existing DDO...` + ) + return ddo + } + const ddoInstance = DDOManager.getDDOClass(ddo) + if (!ddoInstance.getAssetFields().indexedMetadata) { + ddoInstance.updateFields({ indexedMetadata: {} }) + } + + if (!Array.isArray(ddoInstance.getAssetFields().indexedMetadata.stats)) { + ddoInstance.updateFields({ indexedMetadata: { stats: [] } }) + } + + if (ddoInstance.getAssetFields().indexedMetadata.stats.length !== 0) { + for (const stat of ddoInstance.getAssetFields().indexedMetadata.stats) { + if ( + stat.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase() && + doesDispenserAlreadyExist(event.address, stat.prices)[0] + ) { + const price = doesDispenserAlreadyExist(event.address, stat.prices)[1] + const index = stat.prices.indexOf(price) + stat.prices.splice(index, 1) + break + } else if ( + stat.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase() && + !doesDispenserAlreadyExist(event.address, stat.prices)[0] + ) { + INDEXER_LOGGER.logMessage( + `Detected DispenserDeactivated changed for ${event.address}, but dispenser does not exist in the DDO pricing.` + ) + break + } + } + } else { + INDEXER_LOGGER.logMessage( + `[DispenserDeactivated] - No stats were found on the ddo` + ) + const serviceIdToFind = findServiceIdByDatatoken(ddoInstance, datatokenAddress) + if (!serviceIdToFind) { + INDEXER_LOGGER.logMessage( + `[DispenserDeactivated] - This datatoken does not contain this service. Invalid service id!` + ) + return + } + const { stats } = ddoInstance.getAssetFields().indexedMetadata + stats.push({ + datatokenAddress, + name: await datatokenContract.name(), + symbol: await datatokenContract.symbol(), + serviceId: serviceIdToFind, + orders: 0, + prices: await getPricesByDt(datatokenContract, signer) + }) + + ddoInstance.updateFields({ indexedMetadata: { stats } }) + } + + const savedDDO = await this.createOrUpdateDDO( + ddoInstance, + EVENTS.DISPENSER_DEACTIVATED + ) + return savedDDO + } catch (err) { + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) + } + } +} diff --git a/src/components/Indexer/processors/ExchangeActivatedEventProcessor.ts b/src/components/Indexer/processors/ExchangeActivatedEventProcessor.ts new file mode 100644 index 000000000..f036caf65 --- /dev/null +++ b/src/components/Indexer/processors/ExchangeActivatedEventProcessor.ts @@ -0,0 +1,127 @@ +import { DDOManager } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider, ZeroAddress } from 'ethers' +import { EVENTS } from '../../../utils/constants.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { + getDtContract, + getDid, + doesFreAlreadyExist, + findServiceIdByDatatoken, + getPricesByDt, + isValidFreContract +} from '../utils.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import FixedRateExchange from '@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json' with { type: 'json' } + +export class ExchangeActivatedEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider + ): Promise { + try { + if (!(await isValidFreContract(event.address, chainId, signer))) { + INDEXER_LOGGER.error( + `Fixed Rate Exhange contract ${event.address} is not approved by Router. Abort updating DDO pricing!` + ) + return null + } + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + FixedRateExchange.abi, + EVENTS.EXCHANGE_ACTIVATED + ) + INDEXER_LOGGER.logMessage(`event: ${JSON.stringify(event)}`) + INDEXER_LOGGER.logMessage( + `decodedEventData in exchange activated: ${JSON.stringify(decodedEventData)}` + ) + const exchangeId = decodedEventData.args[0].toString() + const freContract = new ethers.Contract( + event.address, + FixedRateExchange.abi, + signer + ) + const exchange = await freContract.getExchange(exchangeId) + + const datatokenAddress = exchange[1] + if (datatokenAddress === ZeroAddress) { + INDEXER_LOGGER.error( + `Datatoken address is ZERO ADDRESS. Cannot find DDO by ZERO ADDRESS contract.` + ) + return null + } + const datatokenContract = getDtContract(signer, datatokenAddress) + const nftAddress = await datatokenContract.getERC721Address() + const did = getDid(nftAddress, chainId) + + const { ddo: ddoDatabase } = await getDatabase() + const ddo = await this.getDDO(ddoDatabase, nftAddress, chainId) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected ExchangeActivated changed for ${did}, but it does not exists.` + ) + return null + } + + const ddoInstance = DDOManager.getDDOClass(ddo) + if (!ddoInstance.getAssetFields().indexedMetadata) { + ddoInstance.updateFields({ indexedMetadata: {} }) + } + + if (!Array.isArray(ddoInstance.getAssetFields().indexedMetadata.stats)) { + ddoInstance.updateFields({ indexedMetadata: { stats: [] } }) + } + if (ddoInstance.getAssetFields().indexedMetadata.stats.length !== 0) { + for (const stat of ddoInstance.getAssetFields().indexedMetadata.stats) { + if ( + stat.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase() && + !doesFreAlreadyExist(exchangeId, stat.prices)[0] + ) { + stat.prices.push({ + type: 'fixedrate', + price: ethers.formatEther(exchange[5]), + contract: event.address, + token: exchange[3], + exchangeId + }) + break + } else if (doesFreAlreadyExist(event.address, stat.prices)[0]) { + break + } + } + } else { + INDEXER_LOGGER.logMessage(`[ExchangeActivated] - No stats were found on the ddo`) + const serviceIdToFind = findServiceIdByDatatoken(ddoInstance, datatokenAddress) + if (!serviceIdToFind) { + INDEXER_LOGGER.logMessage( + `[ExchangeActivated] - This datatoken does not contain this service. Invalid service id!` + ) + return null + } + const { stats } = ddoInstance.getAssetFields().indexedMetadata + stats.push({ + datatokenAddress, + name: await datatokenContract.name(), + symbol: await datatokenContract.symbol(), + serviceId: serviceIdToFind, + orders: 0, + prices: await getPricesByDt(datatokenContract, signer) + }) + + ddoInstance.updateFields({ indexedMetadata: { stats } }) + } + + const savedDDO = await this.createOrUpdateDDO( + ddoInstance, + EVENTS.EXCHANGE_ACTIVATED + ) + return savedDDO + } catch (err) { + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) + } + } +} diff --git a/src/components/Indexer/processors/ExchangeCreatedEventProcessor.ts b/src/components/Indexer/processors/ExchangeCreatedEventProcessor.ts new file mode 100644 index 000000000..9200ca897 --- /dev/null +++ b/src/components/Indexer/processors/ExchangeCreatedEventProcessor.ts @@ -0,0 +1,122 @@ +import { DDOManager } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider, ZeroAddress } from 'ethers' +import { EVENTS } from '../../../utils/constants.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { + getDtContract, + getDid, + doesFreAlreadyExist, + findServiceIdByDatatoken, + getPricesByDt, + isValidFreContract +} from '../utils.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import FixedRateExchange from '@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json' with { type: 'json' } + +export class ExchangeCreatedEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider + ): Promise { + try { + if (!(await isValidFreContract(event.address, chainId, signer))) { + INDEXER_LOGGER.error( + `Fixed Rate Exhange contract ${event.address} is not approved by Router. Abort updating DDO pricing!` + ) + return null + } + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + FixedRateExchange.abi, + EVENTS.EXCHANGE_CREATED + ) + const exchangeId = decodedEventData.args[0].toString() + const freContract = new ethers.Contract( + event.address, + FixedRateExchange.abi, + signer + ) + const exchange = await freContract.getExchange(exchangeId) + + const datatokenAddress = exchange[1] + if (datatokenAddress === ZeroAddress) { + INDEXER_LOGGER.error( + `Datatoken address is ZERO ADDRESS. Cannot find DDO by ZERO ADDRESS contract.` + ) + return null + } + const datatokenContract = getDtContract(signer, datatokenAddress) + const nftAddress = await datatokenContract.getERC721Address() + const did = getDid(nftAddress, chainId) + + const { ddo: ddoDatabase } = await getDatabase() + const ddo = await this.getDDO(ddoDatabase, nftAddress, chainId) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected ExchangeCreated changed for ${did}, but it does not exists.` + ) + return null + } + + const ddoInstance = DDOManager.getDDOClass(ddo) + if (!ddoInstance.getAssetFields().indexedMetadata) { + ddoInstance.updateFields({ indexedMetadata: {} }) + } + + if (!Array.isArray(ddoInstance.getAssetFields().indexedMetadata.stats)) { + ddoInstance.updateFields({ indexedMetadata: { stats: [] } }) + } + + if (ddoInstance.getAssetFields().indexedMetadata.stats.length !== 0) { + for (const stat of ddoInstance.getAssetFields().indexedMetadata.stats) { + if ( + stat.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase() && + !doesFreAlreadyExist(exchangeId, stat.prices)[0] + ) { + stat.prices.push({ + type: 'fixedrate', + price: ethers.formatEther(exchange[5]), + contract: event.address, + token: exchange[3], + exchangeId + }) + break + } else if (doesFreAlreadyExist(event.address, stat.prices)[0]) { + break + } + } + } else { + INDEXER_LOGGER.logMessage(`[ExchangeCreated] - No stats were found on the ddo`) + const serviceIdToFind = findServiceIdByDatatoken(ddoInstance, datatokenAddress) + if (!serviceIdToFind) { + INDEXER_LOGGER.logMessage( + `[ExchangeCreated] - This datatoken does not contain this service. Invalid service id!` + ) + return null + } + + const { stats } = ddoInstance.getAssetFields().indexedMetadata + stats.push({ + datatokenAddress, + name: await datatokenContract.name(), + symbol: await datatokenContract.symbol(), + serviceId: serviceIdToFind, + orders: 0, + prices: await getPricesByDt(datatokenContract, signer) + }) + + ddoInstance.updateFields({ indexedMetadata: { stats } }) + } + + const savedDDO = await this.createOrUpdateDDO(ddoInstance, EVENTS.EXCHANGE_CREATED) + return savedDDO + } catch (err) { + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) + } + } +} diff --git a/src/components/Indexer/processors/ExchangeDeactivatedEventProcessor.ts b/src/components/Indexer/processors/ExchangeDeactivatedEventProcessor.ts new file mode 100644 index 000000000..d5f02c15c --- /dev/null +++ b/src/components/Indexer/processors/ExchangeDeactivatedEventProcessor.ts @@ -0,0 +1,132 @@ +import { DDOManager } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider, ZeroAddress } from 'ethers' +import { EVENTS } from '../../../utils/constants.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { + getDtContract, + getDid, + doesFreAlreadyExist, + findServiceIdByDatatoken, + getPricesByDt, + isValidFreContract +} from '../utils.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import FixedRateExchange from '@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json' with { type: 'json' } + +export class ExchangeDeactivatedEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider + ): Promise { + if (!(await isValidFreContract(event.address, chainId, signer))) { + INDEXER_LOGGER.error( + `Fixed Rate Exhange contract ${event.address} is not approved by Router. Abort updating DDO pricing!` + ) + return null + } + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + FixedRateExchange.abi, + EVENTS.EXCHANGE_DEACTIVATED + ) + const exchangeId = decodedEventData.args[0].toString() + const freContract = new ethers.Contract(event.address, FixedRateExchange.abi, signer) + let exchange + try { + exchange = await freContract.getExchange(exchangeId) + } catch (e) { + INDEXER_LOGGER.error(`Could not fetch exchange details: ${e.message}`) + } + if (!exchange) { + INDEXER_LOGGER.error( + `Exchange not found...Aborting processing exchange created event` + ) + return null + } + const datatokenAddress = exchange[1] + if (datatokenAddress === ZeroAddress) { + INDEXER_LOGGER.error( + `Datatoken address is ZERO ADDRESS. Cannot find DDO by ZERO ADDRESS contract.` + ) + return null + } + const datatokenContract = getDtContract(signer, datatokenAddress) + const nftAddress = await datatokenContract.getERC721Address() + const did = getDid(nftAddress, chainId) + try { + const { ddo: ddoDatabase } = await getDatabase() + const ddo = await ddoDatabase.retrieve(did) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected ExchangeDeactivated changed for ${did}, but it does not exists.` + ) + return null + } + + const ddoInstance = DDOManager.getDDOClass(ddo) + if (!ddoInstance.getAssetFields().indexedMetadata) { + ddoInstance.updateFields({ indexedMetadata: {} }) + } + + if (!Array.isArray(ddoInstance.getAssetFields().indexedMetadata.stats)) { + ddoInstance.updateFields({ indexedMetadata: { stats: [] } }) + } + if (ddoInstance.getAssetFields().indexedMetadata.stats.length !== 0) { + for (const stat of ddoInstance.getAssetFields().indexedMetadata.stats) { + if ( + stat.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase() && + doesFreAlreadyExist(exchangeId, stat.prices)[0] + ) { + const price = doesFreAlreadyExist(exchangeId, stat.prices)[1] + const index = stat.prices.indexOf(price) + stat.prices.splice(index, 1) + break + } else if ( + stat.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase() && + !doesFreAlreadyExist(exchangeId, stat.prices)[0] + ) { + INDEXER_LOGGER.logMessage( + `Detected ExchangeDeactivated changed for ${event.address}, but exchange ${exchangeId} does not exist in the DDO pricing.` + ) + break + } + } + } else { + INDEXER_LOGGER.logMessage( + `[ExchangeDeactivated] - No stats were found on the ddo` + ) + const serviceIdToFind = findServiceIdByDatatoken(ddoInstance, datatokenAddress) + if (!serviceIdToFind) { + INDEXER_LOGGER.logMessage( + `[ExchangeDeactivated] - This datatoken does not contain this service. Invalid service id!` + ) + return null + } + const { stats } = ddoInstance.getAssetFields().indexedMetadata + stats.push({ + datatokenAddress, + name: await datatokenContract.name(), + symbol: await datatokenContract.symbol(), + serviceId: serviceIdToFind, + orders: 0, + prices: await getPricesByDt(datatokenContract, signer) + }) + + ddoInstance.updateFields({ indexedMetadata: { stats } }) + } + + const savedDDO = await this.createOrUpdateDDO( + ddoInstance, + EVENTS.EXCHANGE_DEACTIVATED + ) + return savedDDO + } catch (err) { + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) + } + } +} diff --git a/src/components/Indexer/processors/ExchangeRateChangedEventProcessor.ts b/src/components/Indexer/processors/ExchangeRateChangedEventProcessor.ts new file mode 100644 index 000000000..975fb6561 --- /dev/null +++ b/src/components/Indexer/processors/ExchangeRateChangedEventProcessor.ts @@ -0,0 +1,130 @@ +import { DDOManager } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider, ZeroAddress } from 'ethers' +import { EVENTS } from '../../../utils/constants.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { + getDtContract, + getDid, + doesFreAlreadyExist, + findServiceIdByDatatoken, + getPricesByDt, + isValidFreContract +} from '../utils.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import FixedRateExchange from '@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json' with { type: 'json' } + +export class ExchangeRateChangedEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider + ): Promise { + try { + if (!(await isValidFreContract(event.address, chainId, signer))) { + INDEXER_LOGGER.error( + `Fixed Rate Exhange contract ${event.address} is not approved by Router. Abort updating DDO pricing!` + ) + return null + } + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + FixedRateExchange.abi, + EVENTS.EXCHANGE_RATE_CHANGED + ) + const exchangeId = ethers.toUtf8Bytes(decodedEventData.args[0].toString()) + const newRate = decodedEventData.args[2].toString() + const freContract = new ethers.Contract( + event.address, + FixedRateExchange.abi, + signer + ) + const exchange = await freContract.getExchange(exchangeId) + const datatokenAddress = exchange[1] + if (datatokenAddress === ZeroAddress) { + INDEXER_LOGGER.error( + `Datatoken address is ZERO ADDRESS. Cannot find DDO by ZERO ADDRESS contract.` + ) + return null + } + const datatokenContract = getDtContract(signer, datatokenAddress) + const nftAddress = await datatokenContract.getERC721Address() + const did = getDid(nftAddress, chainId) + + const { ddo: ddoDatabase } = await getDatabase() + const ddo = await this.getDDO(ddoDatabase, nftAddress, chainId) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected ExchangeRateChanged changed for ${did}, but it does not exists.` + ) + return + } + + const ddoInstance = DDOManager.getDDOClass(ddo) + if (!ddoInstance.getAssetFields().indexedMetadata) { + ddoInstance.updateFields({ indexedMetadata: {} }) + } + + if (!Array.isArray(ddoInstance.getAssetFields().indexedMetadata.stats)) { + ddoInstance.updateFields({ indexedMetadata: { stats: [] } }) + } + if (ddoInstance.getAssetFields().indexedMetadata.stats.length !== 0) { + for (const stat of ddoInstance.getAssetFields().indexedMetadata.stats) { + if ( + stat.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase() && + doesFreAlreadyExist(exchangeId, stat.prices)[0] + ) { + const price = doesFreAlreadyExist(exchangeId, stat.prices)[1] + price.price = newRate + break + } else if ( + stat.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase() && + !doesFreAlreadyExist(exchangeId, stat.prices)[0] + ) { + INDEXER_LOGGER.logMessage( + `[ExchangeRateChanged] - Could not find the exchange in DDO ${did} prices` + ) + return + } + } + } else { + INDEXER_LOGGER.logMessage( + `[ExchangeRateChanged] - No stats were found on the ddo` + ) + const serviceIdToFind = findServiceIdByDatatoken(ddoInstance, datatokenAddress) + if (!serviceIdToFind) { + INDEXER_LOGGER.logMessage( + `[ExchangeRateChanged] - This datatoken does not contain this service. Invalid service id!` + ) + return + } + const { stats } = ddoInstance.getAssetFields().indexedMetadata + stats.push({ + datatokenAddress, + name: await datatokenContract.name(), + symbol: await datatokenContract.symbol(), + serviceId: serviceIdToFind, + orders: 0, + prices: await getPricesByDt(datatokenContract, signer) + }) + + ddoInstance.updateFields({ indexedMetadata: { stats } }) + } + + const savedDDO = await this.createOrUpdateDDO( + ddoInstance, + EVENTS.EXCHANGE_RATE_CHANGED + ) + return savedDDO + } catch (err) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Error processing ExchangeRateChangedEvent: ${err}`, + true + ) + } + } +} diff --git a/src/components/Indexer/processors/MetadataEventProcessor.ts b/src/components/Indexer/processors/MetadataEventProcessor.ts new file mode 100644 index 000000000..38ef9c334 --- /dev/null +++ b/src/components/Indexer/processors/MetadataEventProcessor.ts @@ -0,0 +1,494 @@ +import { DDOManager, DDO, VersionedDDO } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider, getAddress } from 'ethers' +import { + ENVIRONMENT_VARIABLES, + EVENTS, + MetadataStates +} from '../../../utils/constants.js' +import { deleteIndexedMetadataIfExists } from '../../../utils/asset.js' +import { getConfiguration } from '../../../utils/config.js' +import { checkCredentialOnAccessList } from '../../../utils/credentials.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { asyncCallWithTimeout, streamToString } from '../../../utils/util.js' +import { PolicyServer } from '../../policyServer/index.js' +import { wasNFTDeployedByOurFactory, getPricingStatsForDddo, getDid } from '../utils.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } +import { Purgatory } from '../purgatory.js' +import { isRemoteDDO } from '../../core/utils/validateDdoHandler.js' +import { Storage } from '../../storage/index.js' +import { Readable } from 'stream' + +export class MetadataEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider, + eventName: string + ): Promise { + let did = 'did:op' + try { + const { ddo: ddoDatabase, ddoState } = await getDatabase() + const wasDeployedByUs = await wasNFTDeployedByOurFactory( + chainId, + signer, + getAddress(event.address) + ) + + if (!wasDeployedByUs) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `NFT not deployed by OPF factory`, + true + ) + return + } + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + ERC721Template.abi, + eventName + ) + + const metadata = decodedEventData.args[4] + const metadataHash = decodedEventData.args[5] + const flag = decodedEventData.args[3] + const owner = decodedEventData.args[0] + + const dataNftAddress = ethers.getAddress(event.address) + + did = getDid(event.address, chainId) + + const templateContract = new ethers.Contract( + dataNftAddress, + ERC721Template.abi, + signer + ) + const metaData = await templateContract.getMetaData() + const metadataState = Number(metaData[2]) + + if ([MetadataStates.DEPRECATED, MetadataStates.REVOKED].includes(metadataState)) { + INDEXER_LOGGER.logMessage( + `Delete DDO because Metadata state is ${metadataState}`, + true + ) + const { ddo: ddoDatabase } = await getDatabase() + const ddo = await ddoDatabase.retrieve(did) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected MetadataState changed for ${did}, but it does not exists.` + ) + return + } + + const ddoInstance = DDOManager.getDDOClass(ddo) + + INDEXER_LOGGER.logMessage( + `DDO became non-visible from ${ + ddoInstance.getAssetFields().indexedMetadata.nft.state + } to ${metadataState}` + ) + + const shortDdoInstance = DDOManager.getDDOClass({ + id: ddo.id, + version: 'deprecated', + chainId, + nftAddress: ddo.nftAddress, + indexedMetadata: { + nft: { + state: metadataState + } + } + }) + + const savedDDO = await this.createOrUpdateDDO( + shortDdoInstance, + EVENTS.METADATA_STATE + ) + return savedDDO + } + + const decryptedDDO = await this.decryptDDO( + decodedEventData.args[2], + flag, + owner, + event.address, + chainId, + event.transactionHash, + metadataHash, + metadata + ) + let ddo = await this.processDDO(decryptedDDO) + if ( + !isRemoteDDO(decryptedDDO) && + parseInt(flag) !== 2 && + !this.checkDdoHash(ddo, metadataHash) + ) { + return + } + if (ddo.encryptedData) { + const proof = await this.decryptDDOIPFS( + decodedEventData.args[2], + owner, + ddo.encryptedData + ) + const data = this.getDataFromProof(proof) + const ddoInstance = DDOManager.getDDOClass(data.ddoObj) + ddo = ddoInstance.updateFields({ + proof: { signature: data.signature, header: data.header } + }) + } + const clonedDdo = structuredClone(ddo) + const updatedDdo = deleteIndexedMetadataIfExists(clonedDdo) + const ddoInstance = DDOManager.getDDOClass(updatedDdo) + if (updatedDdo.id !== ddoInstance.makeDid(event.address, chainId.toString(10))) { + INDEXER_LOGGER.error( + `Decrypted DDO ID is not matching the generated hash for DID.` + ) + await ddoState.update( + this.networkId, + did, + event.address, + event.transactionHash, + false, + 'Decrypted DDO ID does not match generated DID.' + ) + return + } + // for unencrypted DDOs + if ((parseInt(flag) & 2) === 0 && !this.checkDdoHash(updatedDdo, metadataHash)) { + INDEXER_LOGGER.error('Unencrypted DDO hash does not match metadata hash.') + await ddoState.update( + this.networkId, + did, + event.address, + event.transactionHash, + false, + 'Unencrypted DDO hash does not match metadata hash.' + ) + return + } + + // check authorized publishers + const { authorizedPublishers, authorizedPublishersList } = await getConfiguration() + if (authorizedPublishers.length > 0) { + // if is not there, do not index + const authorized: string[] = authorizedPublishers.filter((address) => + // do a case insensitive search + address.toLowerCase().includes(owner.toLowerCase()) + ) + if (!authorized.length) { + INDEXER_LOGGER.error( + `DDO owner ${owner} is NOT part of the ${ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS.name} group.` + ) + await ddoState.update( + this.networkId, + did, + event.address, + event.transactionHash, + false, + `DDO owner ${owner} is NOT part of the ${ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS.name} group.` + ) + return + } + } + if (authorizedPublishersList) { + // check accessList + const isAuthorized = await checkCredentialOnAccessList( + authorizedPublishersList, + String(chainId), + owner, + signer + ) + if (!isAuthorized) { + INDEXER_LOGGER.error( + `DDO owner ${owner} is NOT part of the ${ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS_LIST.name} access group.` + ) + await ddoState.update( + this.networkId, + did, + event.address, + event.transactionHash, + false, + `DDO owner ${owner} is NOT part of the ${ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS_LIST.name} access group.` + ) + return + } + } + + // stuff that we overwrite + did = ddoInstance.getDid() + const { services } = ddoInstance.getDDOFields() + ddoInstance.updateFields({ + chainId, + nftAddress: event.address, + datatokens: await this.getTokenInfo(services, signer) + }) + + INDEXER_LOGGER.logMessage( + `Processed new DDO data ${ddoInstance.getDid()} with txHash ${ + event.transactionHash + } from block ${event.blockNumber}`, + true + ) + + let previousDdoInstance + const previousDdo = await ddoDatabase.retrieve(ddoInstance.getDid()) + if (previousDdo) { + previousDdoInstance = DDOManager.getDDOClass(previousDdo) + } + if (eventName === EVENTS.METADATA_CREATED) { + if ( + previousDdoInstance && + previousDdoInstance.getAssetFields().indexedMetadata.nft.state === + MetadataStates.ACTIVE + ) { + const previousTxId = + previousDdoInstance.getAssetFields().indexedMetadata?.event?.txid + // If it's the same transaction being reprocessed, just skip (idempotent) + if (previousTxId === event.transactionHash) { + INDEXER_LOGGER.logMessage( + `DDO ${ddoInstance.getDid()} already indexed from same transaction ${ + event.transactionHash + }. Skipping reprocessing.`, + true + ) + await ddoState.update( + this.networkId, + did, + event.address, + event.transactionHash, + true, + ' ' + ) + return + } + INDEXER_LOGGER.logMessage( + `DDO ${ddoInstance.getDid()} is already registered as active from different transaction ${previousTxId}`, + true + ) + await ddoState.update( + this.networkId, + did, + event.address, + event.transactionHash, + false, + `DDO ${ddoInstance.getDid()} is already registered as active from transaction ${previousTxId}` + ) + return + } + } + + if (eventName === EVENTS.METADATA_UPDATED) { + if (!previousDdoInstance) { + INDEXER_LOGGER.logMessage( + `Previous DDO with did ${ddoInstance.getDid()} was not found the database`, + true + ) + return + } + const [isUpdateable, error] = this.isUpdateable( + previousDdoInstance, + event.transactionHash, + event.blockNumber + ) + if (!isUpdateable) { + INDEXER_LOGGER.error( + `Error encountered when checking if the asset is eligiable for update: ${error}` + ) + await ddoState.update( + this.networkId, + did, + event.address, + event.transactionHash, + false, + error + ) + return + } + } + const from = decodedEventData.args[0].toString() + let ddoUpdatedWithPricing + // we need to store the event data (either metadata created or update and is updatable) + if ( + [EVENTS.METADATA_CREATED, EVENTS.METADATA_UPDATED].includes(eventName) && + this.isValidDtAddressFromServices(ddoInstance.getDDOFields().services) + ) { + const ddoWithPricing = await getPricingStatsForDddo(ddoInstance, signer) + const nft = await this.getNFTInfo( + ddoWithPricing.getDDOFields().nftAddress, + signer, + owner, + parseInt(decodedEventData.args[6]) + ) + + let block + let datetime + if (event.blockNumber) { + block = event.blockNumber + // try get block & timestamp from block (only wait 2.5 secs maximum) + const promiseFn = provider.getBlock(event.blockNumber) + const result = await asyncCallWithTimeout(promiseFn, 2500) + if (result.data !== null && !result.timeout) { + datetime = new Date(result.data.timestamp * 1000).toJSON() + } + } + + const fieldsToUpdate = { + indexedMetadata: { + nft, + event: { + txid: event.transactionHash, + from, + contract: event.address, + block, + datetime + } + } + } + ddoWithPricing.updateFields(fieldsToUpdate) + + // policyServer check + const policyServer = new PolicyServer() + let policyStatus + if (eventName === EVENTS.METADATA_UPDATED) + policyStatus = await policyServer.checkUpdateDDO( + ddoWithPricing.getDDOData() as DDO, + this.networkId, + event.transactionHash, + event + ) + else + policyStatus = await policyServer.checknewDDO( + ddoWithPricing.getDDOData() as DDO, + this.networkId, + event.transactionHash, + event + ) + if (!policyStatus.success) { + await ddoState.update( + this.networkId, + did, + event.address, + event.transactionHash, + false, + policyStatus.message + ) + return + } + ddoUpdatedWithPricing = ddoWithPricing + } + // always call, but only create instance once + const purgatory = await Purgatory.getInstance() + // if purgatory is disabled just return false + const state = await this.getPurgatoryState(ddo, from, purgatory) + + ddoUpdatedWithPricing.updateFields({ + indexedMetadata: { purgatory: { state } } + }) + if (state === false) { + // TODO: insert in a different collection for purgatory DDOs + const saveDDO = await this.createOrUpdateDDO(ddoUpdatedWithPricing, eventName) + INDEXER_LOGGER.logMessage(`saved DDO: ${JSON.stringify(saveDDO)}`) + return saveDDO + } + } catch (error) { + const { ddoState } = await getDatabase() + await ddoState.update( + this.networkId, + did, + event.address, + event.transactionHash, + false, + error.message + ) + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Error processMetadataEvents for did: ${did} and txHash: ${event.transactionHash} and error: ${error}`, + true + ) + } + } + + async getPurgatoryState( + ddo: any, + owner: string, + purgatory: Purgatory + ): Promise { + if (purgatory.isEnabled()) { + const state: boolean = + (await purgatory.isBannedAsset(ddo.id)) || + (await purgatory.isBannedAccount(owner)) + return state + } + return false + } + + async updatePurgatoryStateDdo( + ddo: VersionedDDO, + owner: string, + purgatory: Purgatory + ): Promise> { + if (!purgatory.isEnabled()) { + return ddo.updateFields({ + indexedMetadata: { + purgatory: { + state: false + } + } + }) + } + + const state: boolean = + (await purgatory.isBannedAsset(ddo.getDid())) || + (await purgatory.isBannedAccount(owner)) + return ddo.updateFields({ + indexedMetadata: { + purgatory: { + state + } + } + }) + } + + isUpdateable( + previousDdo: VersionedDDO, + txHash: string, + block: number + ): [boolean, string] { + let errorMsg: string + const ddoTxId = previousDdo.getAssetFields().indexedMetadata?.event?.txid + // do not update if we have the same txid + if (txHash === ddoTxId) { + errorMsg = `Previous DDO has the same tx id, no need to update: event-txid=${txHash} <> asset-event-txid=${ddoTxId}` + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_DEBUG, errorMsg, true) + return [false, errorMsg] + } + const ddoBlock = previousDdo.getAssetFields().indexedMetadata?.event?.block + // do not update if we have the same block + if (block === ddoBlock) { + errorMsg = `Asset was updated later (block: ${ddoBlock}) vs transaction block: ${block}` + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_DEBUG, errorMsg, true) + return [false, errorMsg] + } + + return [true, ''] + } + + async processDDO(ddo: any) { + if (isRemoteDDO(ddo)) { + INDEXER_LOGGER.logMessage('DDO is remote', true) + + const storage = Storage.getStorageClass(ddo.remote, await getConfiguration()) + const result = await storage.getReadableStream() + const streamToStringDDO = await streamToString(result.stream as Readable) + + return JSON.parse(streamToStringDDO) + } + + return ddo + } +} diff --git a/src/components/Indexer/processors/MetadataStateEventProcessor.ts b/src/components/Indexer/processors/MetadataStateEventProcessor.ts new file mode 100644 index 000000000..70b27d929 --- /dev/null +++ b/src/components/Indexer/processors/MetadataStateEventProcessor.ts @@ -0,0 +1,99 @@ +import { DDOManager } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider } from 'ethers' +import { EVENTS, MetadataStates } from '../../../utils/constants.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } +import { getDid } from '../utils.js' + +export class MetadataStateEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + _signer: Signer, + provider: FallbackProvider + ): Promise { + INDEXER_LOGGER.logMessage(`Processing metadata state event...`, true) + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + ERC721Template.abi, + EVENTS.METADATA_STATE + ) + const metadataState = parseInt(decodedEventData.args[1].toString()) + INDEXER_LOGGER.logMessage(`Processed new metadata state ${metadataState} `, true) + INDEXER_LOGGER.logMessage( + `NFT address in processing MetadataState: ${event.address} `, + true + ) + const did = getDid(event.address, chainId) + + try { + const { ddo: ddoDatabase } = await getDatabase() + const ddo = await this.getDDO(ddoDatabase, event.address, chainId) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected MetadataState changed for ${did}, but it does not exists.` + ) + return + } + + const ddoInstance = DDOManager.getDDOClass(ddo) + INDEXER_LOGGER.logMessage(`Found did ${did} on network ${chainId}`) + + if ( + 'nft' in ddoInstance.getAssetFields().indexedMetadata && + ddoInstance.getAssetFields().indexedMetadata.nft.state !== metadataState + ) { + if ( + ddoInstance.getAssetFields().indexedMetadata.nft.state === + MetadataStates.ACTIVE && + [MetadataStates.REVOKED, MetadataStates.DEPRECATED].includes(metadataState) + ) { + INDEXER_LOGGER.logMessage( + `DDO became non-visible from ${ + ddoInstance.getAssetFields().indexedMetadata.nft.state + } to ${metadataState}` + ) + + // We should keep it here, because in further development we'll store + // the previous structure of the non-visible DDOs (full version) + // in case their state changes back to active. + const shortDdoInstance = DDOManager.getDDOClass({ + id: ddo.id, + version: 'deprecated', + chainId, + nftAddress: ddo.nftAddress, + indexedMetadata: { + nft: { + state: metadataState + } + } + }) + + const savedDDO = await this.createOrUpdateDDO( + shortDdoInstance, + EVENTS.METADATA_STATE + ) + return savedDDO + } + } + + // Still update until we validate and polish schemas for DDO. + // But it should update ONLY if the first condition is met. + // Check https://github.com/oceanprotocol/aquarius/blob/84a560ea972485e46dd3c2cfc3cdb298b65d18fa/aquarius/events/processors.py#L663 + ddoInstance.getDDOData().indexedMetadata.nft = { + state: metadataState + } + INDEXER_LOGGER.logMessage( + `Found did ${did} for state updating on network ${chainId}` + ) + const savedDDO = await this.createOrUpdateDDO(ddoInstance, EVENTS.METADATA_STATE) + return savedDDO + } catch (err) { + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) + } + } +} diff --git a/src/components/Indexer/processors/OrderReusedEventProcessor.ts b/src/components/Indexer/processors/OrderReusedEventProcessor.ts new file mode 100644 index 000000000..9087cd54e --- /dev/null +++ b/src/components/Indexer/processors/OrderReusedEventProcessor.ts @@ -0,0 +1,122 @@ +import { DDOManager } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider } from 'ethers' +import { EVENTS } from '../../../utils/constants.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { + getDtContract, + getDid, + findServiceIdByDatatoken, + getPricesByDt +} from '../utils.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } + +export class OrderReusedEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider + ): Promise { + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + ERC20Template.abi, + EVENTS.ORDER_REUSED + ) + const startOrderId = decodedEventData.args[0].toString() + const timestamp = parseInt(decodedEventData.args[2].toString()) + const payer = decodedEventData.args[1].toString() + INDEXER_LOGGER.logMessage(`Processed reused order at ${timestamp}`, true) + + const datatokenContract = getDtContract(signer, event.address) + + const nftAddress = await datatokenContract.getERC721Address() + const did = getDid(nftAddress, chainId) + try { + const { ddo: ddoDatabase, order: orderDatabase } = await getDatabase() + const ddo = await this.getDDO(ddoDatabase, nftAddress, chainId) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected OrderReused changed for ${did}, but it does not exists.` + ) + return + } + const ddoInstance = DDOManager.getDDOClass(ddo) + if (!ddoInstance.getAssetFields().indexedMetadata) { + ddoInstance.updateFields({ indexedMetadata: {} }) + } + + if (!Array.isArray(ddoInstance.getAssetFields().indexedMetadata.stats)) { + ddoInstance.updateFields({ indexedMetadata: { stats: [] } }) + } + + if (ddoInstance.getAssetFields().indexedMetadata.stats.length !== 0) { + for (const stat of ddoInstance.getAssetFields().indexedMetadata.stats) { + if (stat.datatokenAddress.toLowerCase() === event.address?.toLowerCase()) { + stat.orders += 1 + break + } + } + } else { + INDEXER_LOGGER.logMessage(`[OrderReused] - No stats were found on the ddo`) + const serviceIdToFind = findServiceIdByDatatoken(ddoInstance, event.address) + if (!serviceIdToFind) { + INDEXER_LOGGER.logMessage( + `[OrderReused] - This datatoken does not contain this service. Invalid service id!` + ) + return + } + const existingStats = ddoInstance.getAssetFields().indexedMetadata.stats + existingStats.push({ + datatokenAddress: event.address, + name: await datatokenContract.name(), + symbol: await datatokenContract.symbol(), + serviceId: serviceIdToFind, + orders: 1, + prices: await getPricesByDt(datatokenContract, signer) + }) + + ddoInstance.updateFields({ + indexedMetadata: { + stats: existingStats + } + }) + } + + try { + const startOrder = await orderDatabase.retrieve(startOrderId) + if (!startOrder) { + INDEXER_LOGGER.logMessage( + `Detected OrderReused changed for order ${startOrderId}, but it does not exists.` + ) + return + } + await orderDatabase.create( + event.transactionHash, + 'reuseOrder', + timestamp, + startOrder.consumer, + payer, + event.address, + nftAddress, + did, + startOrderId + ) + } catch (error) { + INDEXER_LOGGER.log( + LOG_LEVELS_STR.LEVEL_ERROR, + `Error retrieving startOrder for reuseOrder: ${error}`, + true + ) + } + + const savedDDO = await this.createOrUpdateDDO(ddoInstance, EVENTS.ORDER_REUSED) + return savedDDO + } catch (err) { + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) + } + } +} diff --git a/src/components/Indexer/processors/OrderStartedEventProcessor.ts b/src/components/Indexer/processors/OrderStartedEventProcessor.ts new file mode 100644 index 000000000..110b3cbac --- /dev/null +++ b/src/components/Indexer/processors/OrderStartedEventProcessor.ts @@ -0,0 +1,97 @@ +import { DDOManager } from '@oceanprotocol/ddo-js' +import { ethers, Signer, FallbackProvider } from 'ethers' +import { EVENTS } from '../../../utils/constants.js' +import { getDatabase } from '../../../utils/database.js' +import { INDEXER_LOGGER } from '../../../utils/logging/common.js' +import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' +import { getDtContract, getDid, getPricesByDt } from '../utils.js' +import { BaseEventProcessor } from './BaseProcessor.js' +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } + +export class OrderStartedEventProcessor extends BaseEventProcessor { + async processEvent( + event: ethers.Log, + chainId: number, + signer: Signer, + provider: FallbackProvider + ): Promise { + const decodedEventData = await this.getEventData( + provider, + event.transactionHash, + ERC20Template.abi, + EVENTS.ORDER_STARTED + ) + const serviceIndex = parseInt(decodedEventData.args[3].toString()) + const timestamp = parseInt(decodedEventData.args[4].toString()) + const consumer = decodedEventData.args[0].toString() + const payer = decodedEventData.args[1].toString() + INDEXER_LOGGER.logMessage( + `Processed new order for service index ${serviceIndex} at ${timestamp}`, + true + ) + const datatokenContract = getDtContract(signer, event.address) + + const nftAddress = await datatokenContract.getERC721Address() + const did = getDid(nftAddress, chainId) + try { + const { ddo: ddoDatabase, order: orderDatabase } = await getDatabase() + const ddo = await this.getDDO(ddoDatabase, nftAddress, chainId) + if (!ddo) { + INDEXER_LOGGER.logMessage( + `Detected OrderStarted changed for ${did}, but it does not exists.` + ) + return + } + const ddoInstance = DDOManager.getDDOClass(ddo) + if (!ddoInstance.getDDOData().indexedMetadata) { + ddoInstance.updateFields({ indexedMetadata: {} }) + } + if (!Array.isArray(ddoInstance.getDDOData().indexedMetadata.stats)) { + ddoInstance.updateFields({ indexedMetadata: { stats: [] } }) + } + if ( + ddoInstance.getDDOData().indexedMetadata.stats.length !== 0 && + ddoInstance + .getDDOFields() + .services[serviceIndex].datatokenAddress?.toLowerCase() === + event.address?.toLowerCase() + ) { + for (const stat of ddoInstance.getDDOData().indexedMetadata.stats) { + if (stat.datatokenAddress.toLowerCase() === event.address?.toLowerCase()) { + stat.orders += 1 + break + } + } + } else if (ddoInstance.getDDOData().indexedMetadata.stats.length === 0) { + const existingStats = ddoInstance.getDDOData().indexedMetadata.stats + existingStats.push({ + datatokenAddress: event.address, + name: await datatokenContract.name(), + symbol: await datatokenContract.symbol(), + serviceId: ddoInstance.getDDOFields().services[serviceIndex].id, + orders: 1, + prices: await getPricesByDt(datatokenContract, signer) + }) + + ddoInstance.updateFields({ indexedMetadata: { stats: existingStats } }) + } + await orderDatabase.create( + event.transactionHash, + 'startOrder', + timestamp, + consumer, + payer, + ddoInstance.getDDOFields().services[serviceIndex].datatokenAddress, + nftAddress, + did + ) + INDEXER_LOGGER.logMessage( + `Found did ${did} for order starting on network ${chainId}` + ) + const savedDDO = await this.createOrUpdateDDO(ddoInstance, EVENTS.ORDER_STARTED) + return savedDDO + } catch (err) { + INDEXER_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error retrieving DDO: ${err}`, true) + } + } +} diff --git a/src/components/Indexer/processors/index.ts b/src/components/Indexer/processors/index.ts new file mode 100644 index 000000000..dc6501a82 --- /dev/null +++ b/src/components/Indexer/processors/index.ts @@ -0,0 +1,16 @@ +import { BaseEventProcessor } from './BaseProcessor' + +export * from './DispenserActivatedEventProcessor.js' +export * from './DispenserCreatedEventProcessor.js' +export * from './DispenserDeactivatedEventProcessor.js' +export * from './ExchangeActivatedEventProcessor.js' +export * from './ExchangeCreatedEventProcessor.js' +export * from './ExchangeDeactivatedEventProcessor.js' +export * from './ExchangeRateChangedEventProcessor.js' +export * from './MetadataEventProcessor.js' +export * from './MetadataStateEventProcessor.js' +export * from './OrderReusedEventProcessor.js' +export * from './OrderStartedEventProcessor.js' +export * from './BaseProcessor.js' + +export type ProcessorConstructor = new (chainId: number) => BaseEventProcessor diff --git a/src/components/Indexer/utils.ts b/src/components/Indexer/utils.ts index b50daefc8..4fa1e33e1 100644 --- a/src/components/Indexer/utils.ts +++ b/src/components/Indexer/utils.ts @@ -1,67 +1,54 @@ -import { JsonRpcApiProvider, Signer, ethers, getAddress, Interface } from 'ethers' -import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' assert { type: 'json' } -import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' } -import { - ENVIRONMENT_VARIABLES, - EVENTS, - EVENT_HASHES, - existsEnvironmentVariable, - getAllowedValidators -} from '../../utils/index.js' -import { BlocksEvents, NetworkEvent, ProcessingEvents } from '../../@types/blockchain.js' -import { - MetadataEventProcessor, - MetadataStateEventProcessor, - OrderReusedEventProcessor, - OrderStartedEventProcessor -} from './processor.js' +import { Signer, ethers, getAddress, FallbackProvider } from 'ethers' +import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' with { type: 'json' } +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } +import { EVENT_HASHES, isDefined } from '../../utils/index.js' +import { NetworkEvent } from '../../@types/blockchain.js' import { INDEXER_LOGGER } from '../../utils/logging/common.js' -import { fetchEventFromTransaction } from '../../utils/util.js' -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' assert { type: 'json' } -import { LOG_LEVELS_STR } from '../../utils/logging/Logger.js' +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } import { getOceanArtifactsAdressesByChainId } from '../../utils/address.js' import { CommandStatus, JobStatus } from '../../@types/commands.js' import { create256Hash } from '../../utils/crypt.js' +import Dispenser from '@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json' with { type: 'json' } +import FixedRateExchange from '@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json' with { type: 'json' } +import { createHash } from 'crypto' +import { ServicePrice } from '../../@types/IndexedMetadata.js' +import { VersionedDDO } from '@oceanprotocol/ddo-js' +import FactoryRouter from '@oceanprotocol/contracts/artifacts/contracts/pools/FactoryRouter.sol/FactoryRouter.json' with { type: 'json' } -let metadataEventProccessor: MetadataEventProcessor -let metadataStateEventProcessor: MetadataStateEventProcessor -let orderReusedEventProcessor: OrderReusedEventProcessor -let orderStartedEventProcessor: OrderStartedEventProcessor - -function getMetadataEventProcessor(chainId: number): MetadataEventProcessor { - if (!metadataEventProccessor) { - metadataEventProccessor = new MetadataEventProcessor(chainId) - } - return metadataEventProccessor -} - -function getMetadataStateEventProcessor(chainId: number): MetadataStateEventProcessor { - if (!metadataStateEventProcessor) { - metadataStateEventProcessor = new MetadataStateEventProcessor(chainId) - } - return metadataStateEventProcessor -} - -function getOrderReusedEventProcessor(chainId: number): OrderReusedEventProcessor { - if (!orderReusedEventProcessor) { - orderReusedEventProcessor = new OrderReusedEventProcessor(chainId) +export const getContractAddress = (chainId: number, contractName: string): string => { + const addressFile = getOceanArtifactsAdressesByChainId(chainId) + if (addressFile && contractName in addressFile) { + return getAddress(addressFile[contractName]) } - return orderReusedEventProcessor + return '' } -function getOrderStartedEventProcessor(chainId: number): OrderStartedEventProcessor { - if (!orderStartedEventProcessor) { - orderStartedEventProcessor = new OrderStartedEventProcessor(chainId) +export const isValidFreContract = async ( + address: string, + chainId: number, + signer: Signer +) => { + const router = getContractAddress(chainId, 'Router') + const routerContract = new ethers.Contract(router, FactoryRouter.abi, signer) + try { + return await routerContract.isFixedRateContract(address) + } catch (e) { + INDEXER_LOGGER.error(`Could not fetch FRE contract status: ${e.message}`) } - return orderStartedEventProcessor } -export const getContractAddress = (chainId: number, contractName: string): string => { - const addressFile = getOceanArtifactsAdressesByChainId(chainId) - if (addressFile && contractName in addressFile) { - return getAddress(addressFile[contractName]) +export const isValidDispenserContract = async ( + address: string, + chainId: number, + signer: Signer +) => { + const router = getContractAddress(chainId, 'Router') + const routerContract = new ethers.Contract(router, FactoryRouter.abi, signer) + try { + return await routerContract.isDispenserContract(address) + } catch (e) { + INDEXER_LOGGER.error(`Could not fetch dispenser contract status: ${e.message}`) } - return '' } export const getDeployedContractBlock = (network: number) => { @@ -74,7 +61,7 @@ export const getDeployedContractBlock = (network: number) => { return deployedBlock } -export const getNetworkHeight = async (provider: JsonRpcApiProvider) => { +export const getNetworkHeight = async (provider: FallbackProvider) => { const networkHeight = await provider.getBlockNumber() return networkHeight @@ -82,7 +69,7 @@ export const getNetworkHeight = async (provider: JsonRpcApiProvider) => { export const retrieveChunkEvents = async ( signer: Signer, - provider: JsonRpcApiProvider, + provider: FallbackProvider, network: number, lastIndexedBlock: number, count: number @@ -90,36 +77,23 @@ export const retrieveChunkEvents = async ( try { const eventHashes = Object.keys(EVENT_HASHES) const startIndex = lastIndexedBlock + 1 - const blockLogs = await provider.getLogs({ + const details = { fromBlock: startIndex, toBlock: lastIndexedBlock + count, topics: [eventHashes] - }) - return blockLogs - } catch (error) { - throw new Error(` Error processing chunk of blocks events ${error.message}`) - } -} - -export const processBlocks = async ( - blockLogs: ethers.Log[], - signer: Signer, - provider: JsonRpcApiProvider, - network: number, - lastIndexedBlock: number, - count: number -): Promise => { - try { - const events: any[] | BlocksEvents = - blockLogs && blockLogs.length > 0 - ? await processChunkLogs(blockLogs, signer, provider, network) - : [] - - return { - lastBlock: lastIndexedBlock + count, - foundEvents: events } + INDEXER_LOGGER.debug( + `Retrieving events from block ${startIndex} to ${lastIndexedBlock + count}` + ) + const blockLogs = await provider.getLogs(details) + return blockLogs } catch (error) { + INDEXER_LOGGER.error( + `Error retrieving events from block ${lastIndexedBlock + 1} to ${ + lastIndexedBlock + count + }:` + ) + INDEXER_LOGGER.error(error) throw new Error(` Error processing chunk of blocks events ${error.message}`) } } @@ -133,120 +107,6 @@ export function findEventByKey(keyToFind: string): NetworkEvent { return null } -export const processChunkLogs = async ( - logs: readonly ethers.Log[], - signer: Signer, - provider: JsonRpcApiProvider, - chainId: number -): Promise => { - const storeEvents: BlocksEvents = {} - if (logs.length > 0) { - const allowedValidators = getAllowedValidators() - const checkMetadataValidated = allowedValidators.length > 0 - for (const log of logs) { - const event = findEventByKey(log.topics[0]) - - if (event && Object.values(EVENTS).includes(event.type)) { - // only log & process the ones we support - INDEXER_LOGGER.logMessage( - `-- ${event.type} -- triggered for ${log.transactionHash}`, - true - ) - if ( - event.type === EVENTS.METADATA_CREATED || - event.type === EVENTS.METADATA_UPDATED || - event.type === EVENTS.METADATA_STATE - ) { - if (checkMetadataValidated) { - const txReceipt = await provider.getTransactionReceipt(log.transactionHash) - const metadataProofs = fetchEventFromTransaction( - txReceipt, - 'MetadataValidated', - new Interface(ERC20Template.abi) - ) - if (!metadataProofs) { - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `Metadata Proof validator not allowed`, - true - ) - continue - } - const validators = metadataProofs.map((metadataProof) => - getAddress(metadataProof.args[0].toString()) - ) - const allowed = allowedValidators.filter( - (allowedValidator) => validators.indexOf(allowedValidator) !== -1 - ) - if (!allowed.length) { - INDEXER_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `Metadata Proof validators list is empty`, - true - ) - continue - } - } - } - if ( - event.type === EVENTS.METADATA_CREATED || - event.type === EVENTS.METADATA_UPDATED - ) { - const processor = getMetadataEventProcessor(chainId) - const rets = await processor.processEvent( - log, - chainId, - signer, - provider, - event.type - ) - if (rets) storeEvents[event.type] = rets - } else if (event.type === EVENTS.METADATA_STATE) { - const processor = getMetadataStateEventProcessor(chainId) - storeEvents[event.type] = await processor.processEvent(log, chainId, provider) - } else if (event.type === EVENTS.EXCHANGE_CREATED) { - storeEvents[event.type] = procesExchangeCreated() - } else if (event.type === EVENTS.EXCHANGE_RATE_CHANGED) { - storeEvents[event.type] = processExchangeRateChanged() - } else if (event.type === EVENTS.ORDER_STARTED) { - const processor = getOrderStartedEventProcessor(chainId) - storeEvents[event.type] = await processor.processEvent( - log, - chainId, - signer, - provider - ) - } else if (event.type === EVENTS.ORDER_REUSED) { - const processor = getOrderReusedEventProcessor(chainId) - storeEvents[event.type] = await processor.processEvent( - log, - chainId, - signer, - provider - ) - } else if (event.type === EVENTS.TOKEN_URI_UPDATE) { - storeEvents[event.type] = processTokenUriUpadate() - } - } - } - return storeEvents - } - - return {} -} - -const procesExchangeCreated = (): string => { - return 'EXCHANGE_CREATED' -} - -const processExchangeRateChanged = (): string => { - return 'EXCHANGE_RATE_CHANGED' -} - -const processTokenUriUpadate = (): string => { - return 'TOKEN_URI_UPDATE' -} - export const getNFTContract = (signer: Signer, address: string): ethers.Contract => { address = getAddress(address) return getContract(signer, 'ERC721Template', address) @@ -309,7 +169,7 @@ export async function wasNFTDeployedByOurFactory( // default in seconds const DEFAULT_INDEXER_CRAWLING_INTERVAL = 1000 * 30 // 30 seconds export const getCrawlingInterval = (): number => { - if (existsEnvironmentVariable(ENVIRONMENT_VARIABLES.INDEXER_INTERVAL)) { + if (isDefined(process.env.INDEXER_INTERVAL)) { const number: any = process.env.INDEXER_INTERVAL if (!isNaN(number) && number > 0) { return number @@ -330,3 +190,266 @@ export function buildJobIdentifier(command: string, extra: string[]): JobStatus hash: create256Hash(extra.join('')) } } + +export function findServiceIdByDatatoken( + ddo: VersionedDDO, + datatokenAddress: string +): string { + for (const s of ddo.getDDOFields().services) { + if (s.datatokenAddress.toLowerCase() === datatokenAddress.toLowerCase()) { + return s.id + } + } + return null +} + +export function doesDispenserAlreadyExist( + dispenserAddress: string, + prices: ServicePrice[] +): [boolean, ServicePrice?] { + for (const price of prices) { + if (dispenserAddress.toLowerCase() === price.contract.toLowerCase()) { + return [true, price] + } + } + return [false, null] +} + +export function doesFreAlreadyExist( + exchangeId: ethers.BytesLike, + prices: ServicePrice[] +): [boolean, ServicePrice?] { + for (const price of prices) { + if (exchangeId === price.exchangeId) { + return [true, price] + } + } + return [false, null] +} + +export async function getPricesByDt( + datatoken: ethers.Contract, + signer: Signer +): Promise { + let dispensers = [] + let fixedRates = [] + let prices: ServicePrice[] = [] + try { + dispensers = await datatoken.getDispensers() + } catch (e) { + INDEXER_LOGGER.error(`[GET PRICES] failure when retrieving dispensers: ${e}`) + } + try { + fixedRates = await datatoken.getFixedRates() + } catch (e) { + INDEXER_LOGGER.error( + `[GET PRICES] failure when retrieving fixed rate exchanges: ${e}` + ) + } + if (dispensers.length === 0 && fixedRates.length === 0) { + prices = [] + } else { + if (dispensers) { + for (const dispenser of dispensers) { + const dispenserContract = new ethers.Contract(dispenser, Dispenser.abi, signer) + try { + const [isActive, ,] = await dispenserContract.status( + await datatoken.getAddress() + ) + if (isActive === true) { + prices.push({ + type: 'dispenser', + price: '0', + contract: dispenser, + token: await datatoken.getAddress() + }) + } + } catch (e) { + INDEXER_LOGGER.error( + `[GET PRICES] failure when retrieving dispenser status from contracts: ${e}` + ) + } + } + } + + if (fixedRates) { + for (const fixedRate of fixedRates) { + const fixedRateContract = new ethers.Contract( + fixedRate[0], + FixedRateExchange.abi, + signer + ) + try { + const [, , , baseTokenAddress, , pricing, isActive, , , , , ,] = + await fixedRateContract.getExchange(fixedRate[1]) + if (isActive === true) { + prices.push({ + type: 'fixedrate', + price: ethers.formatEther(pricing), + token: baseTokenAddress, + contract: fixedRate[0], + exchangeId: fixedRate[1] + }) + } + } catch (e) { + INDEXER_LOGGER.error( + `[GET PRICES] failure when retrieving exchange status from contracts: ${e}` + ) + } + } + } + } + return prices +} + +export async function getPricingStatsForDddo( + ddo: VersionedDDO, + signer: Signer +): Promise { + const ddoData = ddo.getDDOData() + + if (!ddoData.indexedMetadata) { + ddoData.indexedMetadata = {} + } + + if (!Array.isArray(ddoData.indexedMetadata?.stats)) { + ddoData.indexedMetadata.stats = [] + } + + const stats = ddoData.indexedMetadata?.stats || [] + + for (const service of ddo.getDDOFields().services) { + const datatoken = new ethers.Contract( + service.datatokenAddress, + ERC20Template.abi, + signer + ) + let dispensers = [] + let fixedRates = [] + const prices: ServicePrice[] = [] + try { + dispensers = await datatoken.getDispensers() + } catch (e) { + INDEXER_LOGGER.error(`Contract call fails when retrieving dispensers: ${e}`) + } + try { + fixedRates = await datatoken.getFixedRates() + } catch (e) { + INDEXER_LOGGER.error( + `Contract call fails when retrieving fixed rate exchanges: ${e}` + ) + } + if (dispensers.length === 0 && fixedRates.length === 0) { + stats.push({ + datatokenAddress: service.datatokenAddress, + name: await datatoken.name(), + symbol: await datatoken.symbol(), + serviceId: service.id, + orders: 0, + prices: [] + }) + } else { + if (dispensers) { + for (const dispenser of dispensers) { + const dispenserContract = new ethers.Contract(dispenser, Dispenser.abi, signer) + try { + const [isActive, ,] = await dispenserContract.status( + await datatoken.getAddress() + ) + if (isActive === true) { + prices.push({ + type: 'dispenser', + price: '0', + contract: dispenser, + token: service.datatokenAddress + }) + stats.push({ + datatokenAddress: service.datatokenAddress, + name: await datatoken.name(), + symbol: await datatoken.symbol(), + serviceId: service.id, + orders: 0, + prices + }) + } + } catch (e) { + INDEXER_LOGGER.error( + `[GET PRICES] failure when retrieving dispenser status from contracts: ${e}` + ) + } + } + } + } + + if (fixedRates) { + for (const fixedRate of fixedRates) { + const fixedRateContract = new ethers.Contract( + fixedRate[0], + FixedRateExchange.abi, + signer + ) + try { + const [, , , baseTokenAddress, , pricing, isActive, , , , , ,] = + await fixedRateContract.getExchange(fixedRate[1]) + if (isActive === true) { + prices.push({ + type: 'fixedrate', + price: ethers.formatEther(pricing), + token: baseTokenAddress, + contract: fixedRate[0], + exchangeId: fixedRate[1] + }) + stats.push({ + datatokenAddress: service.datatokenAddress, + name: await datatoken.name(), + symbol: await datatoken.symbol(), + serviceId: service.id, + orders: 0, // just created + prices + }) + } + } catch (e) { + INDEXER_LOGGER.error( + `[GET PRICES] failure when retrieving exchange status from contracts: ${e}` + ) + } + } + } + } + + ddo.updateFields({ indexedMetadata: { stats } }) + return ddo +} + +export function getDid(nftAddress: string, chainId: number): string { + return ( + 'did:ope:' + + createHash('sha256') + .update(getAddress(nftAddress) + chainId.toString(10)) + .digest('hex') + ) +} + +export async function withRetrial( + fn: () => Promise, + maxRetries: number = 5, + delay: number = 2000 +): Promise { + let lastError: Error + + for (let attempt = 0; attempt < maxRetries; attempt++) { + try { + return await fn() + } catch (error) { + lastError = error + + if (attempt === maxRetries - 1) { + throw lastError + } + + await new Promise((resolve) => setTimeout(resolve, delay)) + } + } + + throw lastError +} diff --git a/src/components/Indexer/version.ts b/src/components/Indexer/version.ts new file mode 100644 index 000000000..ff07932d3 --- /dev/null +++ b/src/components/Indexer/version.ts @@ -0,0 +1,46 @@ +/** + * Compares two semantic version strings + * @param v1 First version + * @param v2 Second version + * @returns -1 if v1 < v2, 0 if v1 = v2, 1 if v1 > v2 + */ +export function compareVersions(v1: string, v2: string): number { + const parts1 = v1.split('.').map(Number) + const parts2 = v2.split('.').map(Number) + + for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) { + const part1 = i < parts1.length ? parts1[i] : 0 + const part2 = i < parts2.length ? parts2[i] : 0 + + if (part1 < part2) return -1 + if (part1 > part2) return 1 + } + + return 0 +} + +/** + * Checks if reindexing is needed based on version comparison + * @param currentVersion Current node version + * @param dbVersion Version stored in database + * @param minVersion Minimum version that requires reindexing + * @returns boolean indicating if reindexing is needed + */ +export function isReindexingNeeded( + currentVersion: string, + dbVersion: string | null, + minVersion: string +): boolean { + // If no DB version exists, reindexing is needed + if (!dbVersion) return true + + // If current version is less than min version, something is wrong + if (compareVersions(currentVersion, minVersion) < 0) { + throw new Error( + `Current version ${currentVersion} is less than minimum required version ${minVersion}` + ) + } + + // If DB version is less than min version, reindexing is needed + return compareVersions(dbVersion, minVersion) < 0 +} diff --git a/src/components/KeyManager/index.ts b/src/components/KeyManager/index.ts new file mode 100644 index 000000000..6b93552cd --- /dev/null +++ b/src/components/KeyManager/index.ts @@ -0,0 +1,214 @@ +import type { PeerId } from '@libp2p/interface' +import { Signer, Wallet, FallbackProvider } from 'ethers' +import { IKeyProvider } from '../../@types/KeyManager.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { RawPrivateKeyProvider } from './providers/RawPrivateKeyProvider.js' +import { EncryptMethod } from '../../@types/fileObject.js' +import { Readable } from 'stream' +import { PrivateKey } from '@libp2p/interface' +/** + * Factory function to create the appropriate key provider based on configuration. + * Provider is initialized in its constructor. + * + * @param config - Key provider configuration + * @returns An initialized key provider instance + */ +export function createKeyProvider(config: OceanNodeConfig): IKeyProvider { + let provider: IKeyProvider + + switch (config.keys.type) { + case 'raw': + provider = new RawPrivateKeyProvider(config) + break + + case 'gcp-kms': + throw new Error('GCP KMS provider not yet implemented') + + default: + throw new Error(`Unsupported key provider type: ${config.keys.type}`) + } + + return provider +} + +/** + * KeyManager centralizes all key management for OceanNode. + * Provides access to peerId, libp2p keys, EVM address, and EVM signers. + * Uses a key provider abstraction to support multiple key sources (raw, GCP KMS, etc.) + */ +export class KeyManager { + private keyProvider: IKeyProvider + private evmSigners: Map // Cache: "chainId-providerKey" -> Signer + + constructor(config: OceanNodeConfig) { + // Determine and create the appropriate key provider based on config.keys.type + + this.keyProvider = createKeyProvider(config) + this.evmSigners = new Map() + } + + /** + * Get the libp2p PeerId + */ + getPeerId(): PeerId { + return this.keyProvider.getPeerId() + } + + /** + * Get the libp2p private key + */ + getLibp2pPrivateKey(): PrivateKey { + return this.keyProvider.getLibp2pPrivateKey() + } + + /** + * Get the libp2p public key as Uint8Array + */ + getPublicKey(): Uint8Array { + return this.keyProvider.getPublicKey() + } + + /** + * Get the Ethereum Wallet + */ + getEthWallet(): Wallet { + return this.keyProvider.getEthWallet() + } + + /** + * Get the Ethereum address + */ + getEthAddress(): string { + return this.keyProvider.getEthAddress() + } + + /** + * Get the key provider instance + */ + getKeyProvider(): IKeyProvider { + return this.keyProvider + } + + /** + * Get or create an EVM signer for a specific chainId and provider. + * Signers are cached per chainId + * + * @param provider - The JSON-RPC provider to connect the signer to + * @returns An ethers Signer instance + */ + async getEvmSigner(provider: FallbackProvider, chainId?: number): Promise { + // Create a cache key based on chainId and provider URL + // TO DO + if (!chainId) { + const { chainId: networkChainId } = await provider.getNetwork() + chainId = Number(networkChainId) + } + + const cacheKey = `${chainId}` + + // Check if we have a cached signer + if (this.evmSigners.has(cacheKey)) { + let cachedSigner = this.evmSigners.get(cacheKey) + + // If the provider changed, reconnect the signer + if (cachedSigner.provider !== provider) { + cachedSigner = (cachedSigner as Wallet).connect(provider) + this.evmSigners.set(cacheKey, cachedSigner) + } + + return cachedSigner + } + + // Create new signer from private key bytes + const privateKeyBytes = this.keyProvider.getRawPrivateKeyBytes() + const privateKeyHex = Buffer.from(privateKeyBytes).toString('hex') + const signer = new Wallet(privateKeyHex, provider) + + // Cache the signer + this.evmSigners.set(cacheKey, signer) + + return signer + } + + /** + * Clear all cached EVM signers. + * Useful for testing or key rotation scenarios. + */ + clearEvmSignerCache(): void { + this.evmSigners.clear() + } + + /** + * Get the peerId as a string (for compatibility with existing code) + */ + getPeerIdString(): string { + return this.keyProvider.getPeerId().toString() + } + + /** + * This method encrypts data according to a given algorithm using node keys + * @param data data to encrypt + * @param algorithm encryption algorithm AES or ECIES + */ + async encrypt(data: Uint8Array, algorithm: EncryptMethod): Promise { + return await this.keyProvider.encrypt(data, algorithm) + } + + /** + * This method decrypts data according to a given algorithm using node keys + * @param data data to decrypt + * @param algorithm decryption algorithm AES or ECIES + */ + async decrypt(data: Uint8Array, algorithm: EncryptMethod): Promise { + return await this.keyProvider.decrypt(data, algorithm) + } + + /** + * Encrypts a stream according to a given algorithm using node keys + * @param inputStream - Readable stream to encrypt + * @param algorithm - Encryption algorithm AES or ECIES + * @returns Readable stream with encrypted data + */ + encryptStream(inputStream: Readable, algorithm: EncryptMethod): Readable { + return this.keyProvider.encryptStream(inputStream, algorithm) + } + + /** + * Decrypts a stream according to a given algorithm using node keys + * @param inputStream - Readable stream to decrypt + * @param algorithm - Decryption algorithm AES or ECIES + * @returns Readable stream with decrypted data + */ + decryptStream(inputStream: Readable, algorithm: EncryptMethod): Readable { + return this.keyProvider.decryptStream(inputStream, algorithm) + } + + /** + * Decrypts using ethCrypto.decryptWithPrivateKey + * @param key + * @param encryptedObject + * @returns Decrypted data + */ + async ethCryptoDecryptWithPrivateKey(encryptedObject: any): Promise { + return await this.keyProvider.ethCryptoDecryptWithPrivateKey(encryptedObject) + } + + /** + * Signs message using ethers wallet.signMessage + * @param message - Message to sign + * @returns Signature + */ + async signMessage(message: string): Promise { + return await this.keyProvider.signMessage(message) + } + + /** + * Cleanup resources (delegates to key provider if it has cleanup method) + */ + async cleanup(): Promise { + if (this.keyProvider.cleanup) { + await this.keyProvider.cleanup() + } + this.clearEvmSignerCache() + } +} diff --git a/src/components/KeyManager/providers/RawPrivateKeyProvider.ts b/src/components/KeyManager/providers/RawPrivateKeyProvider.ts new file mode 100644 index 000000000..5254690e0 --- /dev/null +++ b/src/components/KeyManager/providers/RawPrivateKeyProvider.ts @@ -0,0 +1,315 @@ +import type { PeerId } from '@libp2p/interface' +import { privateKeyFromRaw } from '@libp2p/crypto/keys' +import { peerIdFromPrivateKey } from '@libp2p/peer-id' +import { PrivateKey } from '@libp2p/interface' +import { Wallet, ethers } from 'ethers' +import { IKeyProvider } from '../../../@types/KeyManager.js' +import { hexStringToByteArray } from '../../../utils/index.js' +import { OceanNodeConfig } from '../../../@types/OceanNode.js' +import { EncryptMethod } from '../../../@types/fileObject.js' +import { Readable, Transform } from 'stream' +import * as ethCrypto from 'eth-crypto' +import eciesjs from 'eciesjs' +import crypto from 'crypto' + +/** + * Raw private key provider. + * Loads private key from environment variable or config. + */ +export class RawPrivateKeyProvider implements IKeyProvider { + private peerId: PeerId + private privateKey: any // libp2p PrivateKey type + private publicKey: Uint8Array + private ethWallet: Wallet + private ethAddress: string + + constructor(config: OceanNodeConfig) { + if (!config.keys.privateKey) { + throw new Error('RawPrivateKeyProvider requires keys.privateKey in config') + } + + // Initialize immediately in constructor + const rawPrivateKey = config.keys.privateKey + + // Remove '0x' prefix if present for processing + const privateKeyHex = rawPrivateKey.startsWith('0x') + ? rawPrivateKey.slice(2) + : rawPrivateKey + + // Convert hex string to bytes (hexStringToByteArray expects hex without 0x) + const privateKeyBytes = hexStringToByteArray(privateKeyHex) + + // Create libp2p private key + const key = privateKeyFromRaw(privateKeyBytes) + + // Derive peerId from private key + this.peerId = peerIdFromPrivateKey(key) + this.publicKey = key.publicKey.raw + + // Store keys + this.privateKey = key + + // Derive Ethereum address + // Wallet constructor accepts hex with or without 0x prefix + // We use without 0x to match existing behavior in getPeerIdFromPrivateKey + this.ethWallet = new Wallet(privateKeyHex) + this.ethAddress = this.ethWallet.address + } + + getType(): string { + return 'raw' + } + + getPeerId(): PeerId { + return this.peerId + } + + getLibp2pPrivateKey(): PrivateKey { + return this.privateKey + } + + getPublicKey(): Uint8Array { + return this.publicKey + } + + getEthWallet(): Wallet { + return this.ethWallet + } + + getEthAddress(): string { + return this.ethAddress + } + + getRawPrivateKeyBytes(): Uint8Array { + return this.privateKey.raw + } + + /** + * This method encrypts data according to a given algorithm using node keys + * @param data data to encrypt + * @param algorithm encryption algorithm AES or ECIES + */ + // eslint-disable-next-line require-await + async encrypt(data: Uint8Array, algorithm: EncryptMethod): Promise { + let encryptedData: Buffer + const { privateKey, publicKey } = this + if (algorithm === EncryptMethod.AES) { + // use first 16 bytes of public key as an initialisation vector + const initVector = publicKey.subarray(0, 16) + // creates cipher object, with the given algorithm, key and initialization vector + const cipher = crypto.createCipheriv('aes-256-cbc', privateKey.raw, initVector) + // encoding is ignored because we are working with bytes and want to return a buffer + encryptedData = Buffer.concat([cipher.update(data), cipher.final()]) + } else if (algorithm === EncryptMethod.ECIES) { + const sk = new eciesjs.PrivateKey(privateKey.raw) + // get public key from Elliptic curve + encryptedData = eciesjs.encrypt(sk.publicKey.toHex(), data) + } + return encryptedData + } + + /** + * This method decrypts data according to a given algorithm using node keys + * @param data data to decrypt + * @param algorithm decryption algorithm AES or ECIES + */ + // eslint-disable-next-line require-await + async decrypt(data: Uint8Array, algorithm: EncryptMethod): Promise { + let decryptedData: Buffer + const { privateKey, publicKey } = this + if (algorithm === EncryptMethod.AES) { + // use first 16 bytes of public key as an initialisation vector + const initVector = publicKey.subarray(0, 16) + // creates decipher object, with the given algorithm, key and initialization vector + + const decipher = crypto.createDecipheriv('aes-256-cbc', privateKey.raw, initVector) + + // encoding is ignored because we are working with bytes and want to return a buffer + decryptedData = Buffer.concat([decipher.update(data), decipher.final()]) + } else if (algorithm === EncryptMethod.ECIES) { + const sk = new eciesjs.PrivateKey(privateKey.raw) + decryptedData = eciesjs.decrypt(sk.secret, data) + } + return decryptedData + } + + /** + * Encrypts a stream according to a given algorithm using node keys + * @param inputStream - Readable stream to encrypt + * @param algorithm - Encryption algorithm AES or ECIES + * @returns Readable stream with encrypted data + */ + encryptStream(inputStream: Readable, algorithm: EncryptMethod): Readable { + if (!inputStream || typeof inputStream.pipe !== 'function') { + throw new Error('encryptStream: inputStream must be a readable stream') + } + + const { privateKey, publicKey } = this + + if (algorithm === EncryptMethod.AES) { + if (publicKey.length < 16) { + throw new Error( + 'encryptStream: publicKey must be at least 16 bytes for AES initialization vector' + ) + } + if (privateKey.raw.length !== 32) { + throw new Error('encryptStream: privateKey must be 32 bytes for AES-256') + } + // Use first 16 bytes of public key as an initialization vector + const initVector = publicKey.subarray(0, 16) + // Create cipher transform stream + const cipher = crypto.createCipheriv('aes-256-cbc', privateKey.raw, initVector) + + // Pipe input stream through cipher and return the encrypted stream + return inputStream.pipe(cipher) + } else if (algorithm === EncryptMethod.ECIES) { + // ECIES doesn't support streaming, so we need to collect all data first + const chunks: Buffer[] = [] + const collector = new Transform({ + transform(chunk, encoding, callback) { + try { + if (chunk == null) { + return callback(new Error('encryptStream: received null/undefined chunk')) + } + chunks.push( + Buffer.isBuffer(chunk) + ? chunk + : typeof chunk === 'string' + ? Buffer.from(chunk, encoding) + : Buffer.from(chunk) + ) + callback() + } catch (err) { + callback(err instanceof Error ? err : new Error(String(err))) + } + }, + flush(callback) { + try { + const data = Buffer.concat(chunks) + if (data.length === 0) { + return callback( + new Error('encryptStream: no data to encrypt (empty stream)') + ) + } + const sk = new eciesjs.PrivateKey(privateKey.raw) + const encryptedData = eciesjs.encrypt(sk.publicKey.toHex(), data) + this.push(Buffer.from(encryptedData)) + callback() + } catch (err) { + callback(err instanceof Error ? err : new Error(String(err))) + } + } + }) + + return inputStream.pipe(collector) + } else { + throw new Error(`Unsupported encryption algorithm: ${algorithm}`) + } + } + + /** + * Decrypts a stream according to a given algorithm using node keys + * @param inputStream - Readable stream to decrypt + * @param algorithm - Decryption algorithm AES or ECIES + * @returns Readable stream with decrypted data + */ + decryptStream(inputStream: Readable, algorithm: EncryptMethod): Readable { + if (!inputStream || typeof inputStream.pipe !== 'function') { + throw new Error('decryptStream: inputStream must be a readable stream') + } + + const { privateKey, publicKey } = this + + if (algorithm === EncryptMethod.AES) { + if (publicKey.length < 16) { + throw new Error( + 'decryptStream: publicKey must be at least 16 bytes for AES initialization vector' + ) + } + if (privateKey.raw.length !== 32) { + throw new Error('decryptStream: privateKey must be 32 bytes for AES-256') + } + // Use first 16 bytes of public key as an initialization vector + const initVector = publicKey.subarray(0, 16) + // Create decipher transform stream + const decipher = crypto.createDecipheriv('aes-256-cbc', privateKey.raw, initVector) + + // Pipe input stream through decipher and return the decrypted stream + return inputStream.pipe(decipher) + } else if (algorithm === EncryptMethod.ECIES) { + // ECIES doesn't support streaming, so we need to collect all data first + const chunks: Buffer[] = [] + const collector = new Transform({ + transform(chunk, encoding, callback) { + try { + if (chunk == null) { + return callback(new Error('decryptStream: received null/undefined chunk')) + } + chunks.push( + Buffer.isBuffer(chunk) + ? chunk + : typeof chunk === 'string' + ? Buffer.from(chunk, encoding) + : Buffer.from(chunk) + ) + callback() + } catch (err) { + callback(err instanceof Error ? err : new Error(String(err))) + } + }, + flush(callback) { + try { + const data = Buffer.concat(chunks) + if (data.length === 0) { + return callback( + new Error('decryptStream: no data to decrypt (empty stream)') + ) + } + const sk = new eciesjs.PrivateKey(privateKey.raw) + const decryptedData = eciesjs.decrypt(sk.secret, data) + this.push(Buffer.from(decryptedData)) + callback() + } catch (err) { + callback(err instanceof Error ? err : new Error(String(err))) + } + } + }) + + return inputStream.pipe(collector) + } else { + throw new Error(`Unsupported decryption algorithm: ${algorithm}`) + } + } + + /** + * Decrypts using ethCrypto.decryptWithPrivateKey + * @param key + * @param encryptedObject + * @returns Decrypted data + */ + async ethCryptoDecryptWithPrivateKey(encryptedObject: any): Promise { + const { privateKey } = this + const encrypted = ethCrypto.cipher.parse(encryptedObject) + // get the key from configuration + const nodePrivateKey = Buffer.from(privateKey.raw).toString('hex') + const decrypted = await ethCrypto.decryptWithPrivateKey(nodePrivateKey, encrypted) + return decrypted + } + + /** + * Signs message using ethers wallet.signMessage + * @param message - Message to sign + * @returns Signature + */ + async signMessage(message: string): Promise { + const wallet = this.ethWallet + const messageHash = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.getBytes(messageHash) + const signature = await wallet.signMessage(messageHashBytes) + + return signature + } +} diff --git a/src/components/P2P/handleProtocolCommands.ts b/src/components/P2P/handleProtocolCommands.ts index 924b47f05..91b5abefb 100644 --- a/src/components/P2P/handleProtocolCommands.ts +++ b/src/components/P2P/handleProtocolCommands.ts @@ -1,14 +1,18 @@ -import { pipe } from 'it-pipe' import { Readable } from 'stream' import { toString as uint8ArrayToString } from 'uint8arrays/to-string' +import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' import { P2P_LOGGER } from '../../utils/logging/common.js' import { Command } from '../../@types/commands.js' import { P2PCommandResponse } from '../../@types/OceanNode' import { GENERIC_EMOJIS, LOG_LEVELS_STR } from '../../utils/logging/Logger.js' -import StreamConcat from 'stream-concat' -import { Handler } from '../core/handler/handler.js' +import { BaseHandler } from '../core/handler/handler.js' import { getConfiguration } from '../../utils/index.js' +import { + checkGlobalConnectionsRateLimit, + checkRequestsRateLimit +} from '../../utils/validators.js' +import type { Connection, Stream } from '@libp2p/interface' export class ReadableString extends Readable { private sent = false @@ -27,137 +31,133 @@ export class ReadableString extends Readable { } } -// close the stream after sending data, libp2p will handle stream status -async function closeStreamConnection(connection: any, remotePeer: string) { - if (connection) { - try { - P2P_LOGGER.debug('Closing connection to remote peer:' + remotePeer) - await connection.close() - } catch (e) { - P2P_LOGGER.error(`Error closing connection for peer ${remotePeer}: ${e.message}`) - } - } -} +export async function handleProtocolCommands(stream: Stream, connection: Connection) { + const { remotePeer, remoteAddr } = connection -export async function handleProtocolCommands(otherPeerConnection: any) { - const { remotePeer, remoteAddr } = otherPeerConnection.connection + // Pause the stream. We do async operations here before writing. + stream.pause() - // only write if stream is in 'open' status - const connectionStatus = otherPeerConnection.connection.status P2P_LOGGER.logMessage('Incoming connection from peer ' + remotePeer, true) P2P_LOGGER.logMessage('Using ' + remoteAddr, true) - let status = null - let task: Command - let statusStream - let sendStream = null + const sendErrorAndClose = async (httpStatus: number, error: string) => { + try { + // Check if stream is already closed + if (stream.status === 'closed' || stream.status === 'closing') { + P2P_LOGGER.warn('Stream already closed, cannot send error response') + return + } - const buildWrongCommandStatus = function (errorCode: number, message: string) { - status = { - httpStatus: errorCode, - error: message + // Resume stream in case it's paused - we need to write + stream.resume() + const status = { httpStatus, error } + stream.send(uint8ArrayFromString(JSON.stringify(status))) + await stream.close() + } catch (e) { + P2P_LOGGER.error(`Error sending error response: ${e.message}`) + try { + stream.abort(e as Error) + } catch {} } - return status } - const denyList = await (await getConfiguration()).denyList - if (denyList.peers.length > 0) { - if (denyList.peers.includes(remotePeer.toString())) { - P2P_LOGGER.error(`Incoming request denied to peer: ${remotePeer}`) - - if (connectionStatus === 'open') { - statusStream = new ReadableString( - JSON.stringify(buildWrongCommandStatus(403, 'Unauthorized request')) - ) - try { - await pipe(statusStream, otherPeerConnection.stream.sink) - } catch (e) { - P2P_LOGGER.error(e) - } - } - await closeStreamConnection(otherPeerConnection.connection, remotePeer) - return - } + // Rate limiting and deny list checks + const configuration = await getConfiguration() + const { denyList } = configuration + + if (denyList.peers.includes(remotePeer.toString())) { + P2P_LOGGER.warn(`Incoming request denied to peer: ${remotePeer} (peer on deny list)`) + await sendErrorAndClose(403, 'Unauthorized request') + return + } + + const now = Date.now() + const rateLimitCheck = checkRequestsRateLimit(remoteAddr.toString(), configuration, now) + if (!rateLimitCheck.valid) { + P2P_LOGGER.warn( + `Incoming request denied to peer: ${remotePeer} (rate limit exceeded)` + ) + await sendErrorAndClose(403, 'Rate limit exceeded') + return + } + + const connectionsRateValidation = checkGlobalConnectionsRateLimit(configuration, now) + if (!connectionsRateValidation.valid) { + P2P_LOGGER.warn( + `Exceeded limit of connections per minute ${configuration.maxConnections}: ${connectionsRateValidation.error}` + ) + await sendErrorAndClose(403, 'Rate limit exceeded') + return } + // Resume the stream. We can now write. + stream.resume() + + // v3 streams are AsyncIterable + let task: Command try { - // eslint-disable-next-line no-unreachable-loop - for await (const chunk of otherPeerConnection.stream.source) { + for await (const chunk of stream) { try { const str = uint8ArrayToString(chunk.subarray()) task = JSON.parse(str) as Command } catch (e) { - if (connectionStatus === 'open') { - statusStream = new ReadableString( - JSON.stringify(buildWrongCommandStatus(400, 'Invalid command')) - ) - await pipe(statusStream, otherPeerConnection.stream.sink) - } - - await closeStreamConnection(otherPeerConnection.connection, remotePeer) + await sendErrorAndClose(400, 'Invalid command') return } } - if (!task) { - P2P_LOGGER.error('Invalid or missing task/command data!') - if (connectionStatus === 'open') { - statusStream = new ReadableString( - JSON.stringify(buildWrongCommandStatus(400, 'Invalid command')) - ) - await pipe(statusStream, otherPeerConnection.stream.sink) - } - - await closeStreamConnection(otherPeerConnection.connection, remotePeer) - return - } } catch (err) { P2P_LOGGER.log( LOG_LEVELS_STR.LEVEL_ERROR, `Unable to process P2P command: ${err.message}` ) - await closeStreamConnection(otherPeerConnection.connection, remotePeer) + await sendErrorAndClose(400, 'Invalid command') + return + } + + if (!task) { + P2P_LOGGER.error('Invalid or missing task/command data!') + await sendErrorAndClose(400, 'Invalid command') return } P2P_LOGGER.logMessage('Performing P2P task: ' + JSON.stringify(task), true) - // we get the handler from the running instance - // no need to create a new instance of Handler on every request - const handler: Handler = this.getCoreHandlers().getHandler(task.command) - let response: P2PCommandResponse = null - if (handler === null) { - status = { httpStatus: 501, error: `No handler found for command: ${task.command}` } - } else { - try { - // who is calling this handler? - handler.getOceanNode().setRemoteCaller(remotePeer.toString()) - response = await handler.handle(task) - if (response) { - // eslint-disable-next-line prefer-destructuring - status = response.status - sendStream = response.stream - } - statusStream = new ReadableString(JSON.stringify(status)) - - if (connectionStatus === 'open') { - if (sendStream == null) { - await pipe(statusStream, otherPeerConnection.stream.sink) - } else { - const combinedStream = new StreamConcat([statusStream, sendStream], { - highWaterMark: JSON.stringify(status).length // important for reading chunks correctly on sink! + + // Get and execute handler + const handler: BaseHandler = this.getCoreHandlers().getHandler(task.command) + if (!handler) { + await sendErrorAndClose(501, `No handler found for command: ${task.command}`) + return + } + + try { + task.caller = remotePeer.toString() + const response: P2PCommandResponse = await handler.handle(task) + + // Send status first + stream.send(uint8ArrayFromString(JSON.stringify(response.status))) + + // Stream data chunks without buffering, with backpressure support + if (response.stream) { + for await (const chunk of response.stream as Readable) { + const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk) + + // Handle backpressure - if send returns false, wait for drain + if (!stream.send(bytes)) { + await stream.onDrain({ + signal: AbortSignal.timeout(30000) // 30 second timeout for drain }) - await pipe(combinedStream, otherPeerConnection.stream.sink) } } - - await closeStreamConnection(otherPeerConnection.connection, remotePeer) - } catch (err) { - P2P_LOGGER.logMessageWithEmoji( - 'handleProtocolCommands Error: ' + err.message, - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - await closeStreamConnection(otherPeerConnection.connection, remotePeer) } + + await stream.close() + } catch (err) { + P2P_LOGGER.logMessageWithEmoji( + 'handleProtocolCommands Error: ' + err.message, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + await sendErrorAndClose(500, err.message) } } diff --git a/src/components/P2P/index.ts b/src/components/P2P/index.ts index 9e9ec1c79..44d51f8e5 100644 --- a/src/components/P2P/index.ts +++ b/src/components/P2P/index.ts @@ -1,50 +1,60 @@ // import diff from 'hyperdiff' -import { P2PCommandResponse, TypesenseSearchResponse } from '../../@types/index' import EventEmitter from 'node:events' -import clone from 'lodash.clonedeep' - -import { - // handlePeerConnect, - // handlePeerDiscovery, - // handlePeerDisconnect, - handleProtocolCommands -} from './handlers.js' +import lodash from 'lodash' +import { handleProtocolCommands } from './handlers.js' import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' +import { toString as uint8ArrayToString } from 'uint8arrays/to-string' +import type { Stream } from '@libp2p/interface' import { bootstrap } from '@libp2p/bootstrap' import { noise } from '@chainsafe/libp2p-noise' import { mdns } from '@libp2p/mdns' import { yamux } from '@chainsafe/libp2p-yamux' import { peerIdFromString } from '@libp2p/peer-id' -import { pipe } from 'it-pipe' // import { pubsubPeerDiscovery } from '@libp2p/pubsub-peer-discovery' import { tcp } from '@libp2p/tcp' import { webSockets } from '@libp2p/websockets' import { circuitRelayTransport, circuitRelayServer } from '@libp2p/circuit-relay-v2' import { createLibp2p, Libp2p } from 'libp2p' -import { identify } from '@libp2p/identify' +import type { AddressManager, TransportManager } from '@libp2p/interface-internal' +import { identify, identifyPush } from '@libp2p/identify' import { autoNAT } from '@libp2p/autonat' import { uPnPNAT } from '@libp2p/upnp-nat' import { ping } from '@libp2p/ping' import { dcutr } from '@libp2p/dcutr' -import { kadDHT, passthroughMapper } from '@libp2p/kad-dht' -// import { gossipsub } from '@chainsafe/libp2p-gossipsub' +import { + kadDHT, + passthroughMapper, + removePrivateAddressesMapper, + removePublicAddressesMapper +} from '@libp2p/kad-dht' import { EVENTS, cidFromRawString } from '../../utils/index.js' import { Transform } from 'stream' import { Database } from '../database' -import { OceanNodeConfig, FindDDOResponse } from '../../@types/OceanNode' +import { + OceanNodeConfig, + FindDDOResponse, + dhtFilterMethod +} from '../../@types/OceanNode.js' +import { KeyManager } from '../KeyManager/index.js' // eslint-disable-next-line camelcase -import is_ip_private from 'private-ip' -import ip from 'ip' +import ipaddr from 'ipaddr.js' import { GENERIC_EMOJIS, LOG_LEVELS_STR } from '../../utils/logging/Logger.js' import { INDEXER_DDO_EVENT_EMITTER } from '../Indexer/index.js' import { P2P_LOGGER } from '../../utils/logging/common.js' -import { CoreHandlersRegistry } from '../core/handler/coreHandlersRegistry' -import { type Multiaddr, multiaddr } from '@multiformats/multiaddr' +import { CoreHandlersRegistry } from '../core/handler/coreHandlersRegistry.js' +import { Multiaddr, multiaddr } from '@multiformats/multiaddr' +import { LevelDatastore } from 'datastore-level' + // import { getIPv4, getIPv6 } from '../../utils/ip.js' +import { autoTLS } from '@ipshipyard/libp2p-auto-tls' +import { keychain } from '@libp2p/keychain' +import { http } from '@libp2p/http' +import { tls } from '@libp2p/tls' +const store = new LevelDatastore('./databases/p2p-store') const DEFAULT_OPTIONS = { pollInterval: 1000 @@ -57,22 +67,16 @@ type DDOCache = { dht: Map } -// republish any ddos we are providing to the network every 4 hours -// (we can put smaller interval for testing purposes) -const REPUBLISH_INTERVAL_HOURS = 1000 * 60 * 60 * 4 // 4 hours - let index = 0 export class OceanP2P extends EventEmitter { - _libp2p: any + _libp2p: Libp2p _topic: string _options: any _peers: any[] _connections: {} _protocol: string _publicAddress: string - _publicKey: Uint8Array - _privateKey: Uint8Array _analyzeRemoteResponse: Transform _pendingAdvertise: string[] = [] private _ddoDHT: DDOCache @@ -83,10 +87,12 @@ export class OceanP2P extends EventEmitter { private _idx: number private readonly db: Database private readonly _config: OceanNodeConfig + private readonly keyManager: KeyManager private coreHandlers: CoreHandlersRegistry - constructor(config: OceanNodeConfig, db?: Database) { + constructor(config: OceanNodeConfig, keyManager: KeyManager, db?: Database) { super() this._config = config + this.keyManager = keyManager this.db = db this._ddoDHT = { updated: new Date().getTime(), @@ -107,7 +113,6 @@ export class OceanP2P extends EventEmitter { async start(options: any = null) { this._topic = 'oceanprotocol' this._libp2p = await this.createNode(this._config) - this._libp2p.addEventListener('peer:connect', (evt: any) => { this.handlePeerConnect(evt) }) @@ -117,16 +122,27 @@ export class OceanP2P extends EventEmitter { this._libp2p.addEventListener('peer:discovery', (details: any) => { this.handlePeerDiscovery(details) }) - - this._options = Object.assign({}, clone(DEFAULT_OPTIONS), clone(options)) + this._libp2p.addEventListener('certificate:provision', () => { + this.handleCertificateProvision() + }) + this._libp2p.addEventListener('certificate:renew', () => { + this.handleCertificateRenew() + }) + this._options = Object.assign( + {}, + lodash.cloneDeep(DEFAULT_OPTIONS), + lodash.cloneDeep(options) + ) this._peers = [] this._connections = {} this._protocol = '/ocean/nodes/1.0.0' - // this._interval = setInterval(this._pollPeers.bind(this), this._options.pollInterval) - this._libp2p.handle(this._protocol, handleProtocolCommands.bind(this)) + this._interval = setInterval(this._flushAdvertiseQueue.bind(this), 60 * 1000) // every 60 seconds - setInterval(this.republishStoredDDOS.bind(this), REPUBLISH_INTERVAL_HOURS) + // only enable handling of commands if not bootstrap node + if (!this._config.isBootstrap) { + this._libp2p.handle(this._protocol, handleProtocolCommands.bind(this)) + } this._idx = index++ @@ -138,7 +154,7 @@ export class OceanP2P extends EventEmitter { // listen for indexer events and advertise did INDEXER_DDO_EVENT_EMITTER.addListener(EVENTS.METADATA_CREATED, (did) => { P2P_LOGGER.info(`Listened "${EVENTS.METADATA_CREATED}"`) - this.advertiseDid(did) + this.advertiseString(did) }) } @@ -157,17 +173,29 @@ export class OceanP2P extends EventEmitter { P2P_LOGGER.debug('Connection closed to:' + peerId.toString()) // Emitted when a peer has been found } - async handlePeerDiscovery(details: any) { + handlePeerDiscovery(details: any) { try { const peerInfo = details.detail - // P2P_LOGGER.debug('Discovered new peer:' + peerInfo.id.toString()) - if (peerInfo.multiaddrs) { - await this._libp2p.peerStore.save(peerInfo.id, { - multiaddrs: peerInfo.multiaddrs - }) - await this._libp2p.peerStore.patch(peerInfo.id, { - multiaddrs: peerInfo.multiaddrs - }) + P2P_LOGGER.debug('Discovered new peer:' + peerInfo.id.toString()) + + // v2/v3: autodialer was removed - we implement custom dial logic + const currentConnections = this._libp2p.getConnections().length + const { minConnections, maxConnections } = this._config.p2pConfig + + // Only dial if we're below minConnections or have room for more + if (currentConnections < minConnections || currentConnections < maxConnections) { + const existingConnections = this._libp2p.getConnections(peerInfo.id) + if (existingConnections.length === 0) { + this._libp2p + .dial(peerInfo.id, { + signal: AbortSignal.timeout(10000) + }) + .catch((err: Error) => { + P2P_LOGGER.debug( + `Failed to dial discovered peer ${peerInfo.id}: ${err.message}` + ) + }) + } } } catch (e) { // no panic if it failed @@ -175,6 +203,26 @@ export class OceanP2P extends EventEmitter { } } + handleCertificateProvision() { + P2P_LOGGER.info('----- A TLS certificate was provisioned -----') + const interval = setInterval(() => { + const mas = this._libp2p + .getMultiaddrs() + .filter((ma: any) => ma.toString().includes('/sni/')) + .map((ma: any) => ma.toString()) + if (mas.length > 0) { + P2P_LOGGER.info('----- TLS addresses: -----') + P2P_LOGGER.info(mas.join('\n')) + P2P_LOGGER.info('----- End of TLS addresses -----') + } + clearInterval(interval) + }, 1_000) + } + + handleCertificateRenew() { + P2P_LOGGER.info('----- A TLS certificate was renewed -----') + } + handlePeerJoined(details: any) { P2P_LOGGER.debug('New peer joined us:' + details) } @@ -195,40 +243,40 @@ export class OceanP2P extends EventEmitter { try { const maddr = multiaddr(addr) // always filter loopback - if (ip.isLoopback(maddr.nodeAddress().address)) { - // disabled logs because of flooding - // P2P_LOGGER.debug('Deny announcement of loopback ' + maddr.nodeAddress().address) + const addressString = maddr.nodeAddress().address + + if (!ipaddr.isValid(addressString)) { + return false + } + + const parsedAddr = ipaddr.parse(addressString) + const range = parsedAddr.range() + + if (range === 'loopback') { return false } // check filters for (const filter of this._config.p2pConfig.filterAnnouncedAddresses) { - if (ip.cidrSubnet(filter).contains(maddr.nodeAddress().address)) { - // disabled logs because of flooding - // P2P_LOGGER.debug( - // 'Deny announcement of filtered ' + - // maddr.nodeAddress().address + - // '(belongs to ' + - // filter + - // ')' - // ) - return false + try { + const parsedCIDR = ipaddr.parseCIDR(filter) + if ((parsedAddr as any).match(parsedCIDR as any)) { + return false + } + } catch (e) { + P2P_LOGGER.error(`Invalid CIDR filter in config: ${filter}`) } } if ( this._config.p2pConfig.announcePrivateIp === false && - (is_ip_private(maddr.nodeAddress().address) || - ip.isPrivate(maddr.nodeAddress().address)) + (range === 'private' || range === 'uniqueLocal') ) { // disabled logs because of flooding // P2P_LOGGER.debug( // 'Deny announcement of private address ' + maddr.nodeAddress().address // ) return false - } else { - // disabled logs because of flooding - // P2P_LOGGER.debug('Allow announcement of ' + maddr.nodeAddress().address) - return true } + return true } catch (e) { // we reach this part when having circuit relay. this is fine return true @@ -237,9 +285,9 @@ export class OceanP2P extends EventEmitter { async createNode(config: OceanNodeConfig): Promise { try { - this._publicAddress = config.keys.peerId.toString() - this._publicKey = config.keys.publicKey - this._privateKey = config.keys.privateKey + this._publicAddress = this.keyManager.getPeerIdString() + P2P_LOGGER.info(`Starting P2P Node with peerID: ${this._publicAddress}`) + /** @type {import('libp2p').Libp2pOptions} */ // start with some default, overwrite based on config later const bindInterfaces = [] @@ -251,6 +299,11 @@ export class OceanP2P extends EventEmitter { bindInterfaces.push( `/ip4/${config.p2pConfig.ipV4BindAddress}/tcp/${config.p2pConfig.ipV4BindWsPort}/ws` ) + if (config.p2pConfig.ipV4BindWssPort) { + bindInterfaces.push( + `/ip4/${config.p2pConfig.ipV4BindAddress}/tcp/${config.p2pConfig.ipV4BindWssPort}/wss` + ) + } } if (config.p2pConfig.enableIPV6) { P2P_LOGGER.info('Binding P2P sockets to IPV6') @@ -270,7 +323,7 @@ export class OceanP2P extends EventEmitter { listen: bindInterfaces, announceFilter: (multiaddrs: any[]) => multiaddrs.filter((m) => this.shouldAnnounce(m)), - announce: config.p2pConfig.announceAddresses + appendAnnounce: config.p2pConfig.announceAddresses } } else { addresses = { @@ -279,8 +332,23 @@ export class OceanP2P extends EventEmitter { multiaddrs.filter((m) => this.shouldAnnounce(m)) } } + const dhtOptions = { + allowQueryWithZeroPeers: false, + maxInboundStreams: config.p2pConfig.dhtMaxInboundStreams, + maxOutboundStreams: config.p2pConfig.dhtMaxOutboundStreams, + clientMode: false, // always be a server + kBucketSize: 20, + protocol: '/ocean/nodes/1.0.0/kad/1.0.0', + peerInfoMapper: passthroughMapper // see below + } + if (config.p2pConfig.dhtFilter === dhtFilterMethod.filterPrivate) + dhtOptions.peerInfoMapper = removePrivateAddressesMapper + if (config.p2pConfig.dhtFilter === dhtFilterMethod.filterPublic) + dhtOptions.peerInfoMapper = removePublicAddressesMapper let servicesConfig = { identify: identify(), + dht: kadDHT(dhtOptions), + identifyPush: identifyPush(), /* pubsub: gossipsub({ fallbackToFloodsub: false, @@ -295,27 +363,18 @@ export class OceanP2P extends EventEmitter { // enabled: true allowedTopics: ['oceanprotocol._peer-discovery._p2p._pubsub', 'oceanprotocol'] }), */ - dht: kadDHT({ - // this is necessary because this node is not connected to the public network - // it can be removed if, for example bootstrappers are configured - allowQueryWithZeroPeers: true, - maxInboundStreams: config.p2pConfig.dhtMaxInboundStreams, - maxOutboundStreams: config.p2pConfig.dhtMaxOutboundStreams, - - clientMode: false, - kBucketSize: 20, - protocol: '/ocean/nodes/1.0.0/kad/1.0.0', - peerInfoMapper: passthroughMapper - // protocolPrefix: '/ocean/nodes/1.0.0' - // randomWalk: { - // enabled: true, // Allows to disable discovery (enabled by default) - // interval: 300e3, - // timeout: 10e3 - // } - }), ping: ping(), - dcutr: dcutr() + dcutr: dcutr(), + keychain: keychain(), + http: http(), + // Always announe the public address and tls in P2P_ANNOUNCE_ADDRESSES / p2pConfig.announceAddresses. + // Ex. /ip4//tcp//tls/ws + // Ex. /ip4//tcp//tls/wss + autoTLS: autoTLS({ + autoConfirmAddress: true + }) } + // eslint-disable-next-line no-constant-condition, no-self-compare if (config.p2pConfig.enableCircuitRelayServer) { P2P_LOGGER.info('Enabling Circuit Relay Server') @@ -324,46 +383,44 @@ export class OceanP2P extends EventEmitter { // eslint-disable-next-line no-constant-condition, no-self-compare if (config.p2pConfig.upnp) { P2P_LOGGER.info('Enabling UPnp discovery') - servicesConfig = { ...servicesConfig, ...{ upnpNAT: uPnPNAT() } } + servicesConfig = { + ...servicesConfig, + ...{ upnpNAT: uPnPNAT() } + } } // eslint-disable-next-line no-constant-condition, no-self-compare if (config.p2pConfig.autoNat) { P2P_LOGGER.info('Enabling AutoNat service') servicesConfig = { ...servicesConfig, - ...{ autoNAT: autoNAT({ maxInboundStreams: 20, maxOutboundStreams: 20 }) } + ...{ + autoNAT: autoNAT({ maxInboundStreams: 20, maxOutboundStreams: 20 }) + } } } let transports = [] P2P_LOGGER.info('Enabling P2P Transports: websockets, tcp, circuitRelay') - transports = [ - webSockets(), - tcp(), - circuitRelayTransport({ - discoverRelays: config.p2pConfig.circuitRelays - }) - ] + // relay discovery is now automatic through the network's RandomWalk component + transports = [webSockets(), tcp(), circuitRelayTransport()] let options = { addresses, - peerId: config.keys.peerId, + datastore: store, + privateKey: this.keyManager.getLibp2pPrivateKey(), transports, streamMuxers: [yamux()], - connectionEncryption: [ - noise() + connectionEncrypters: [ + noise(), + tls() // plaintext() ], services: servicesConfig, connectionManager: { - maxParallelDials: config.p2pConfig.connectionsMaxParallelDials, // 150 total parallel multiaddr dials - dialTimeout: config.p2pConfig.connectionsDialTimeout, // 10 second dial timeout per peer dial - minConnections: config.p2pConfig.minConnections, + maxParallelDials: config.p2pConfig.connectionsMaxParallelDials, + dialTimeout: config.p2pConfig.connectionsDialTimeout, maxConnections: config.p2pConfig.maxConnections, - autoDialPeerRetryThreshold: config.p2pConfig.autoDialPeerRetryThreshold, - autoDialConcurrency: config.p2pConfig.autoDialConcurrency, - maxPeerAddrsToDial: config.p2pConfig.maxPeerAddrsToDial, - autoDialInterval: config.p2pConfig.autoDialInterval + maxPeerAddrsToDial: config.p2pConfig.maxPeerAddrsToDial } } if (config.p2pConfig.bootstrapNodes && config.p2pConfig.bootstrapNodes.length > 0) { @@ -423,13 +480,6 @@ export class OceanP2P extends EventEmitter { this._upnp_interval = setInterval(this.UPnpCron.bind(this), 3000) } - if (config.p2pConfig.enableDHTServer) { - try { - await node.services.dht.setMode('server') - } catch (e) { - P2P_LOGGER.warn(`Failed to set mode server for DHT`) - } - } return node } catch (e) { P2P_LOGGER.logMessageWithEmoji( @@ -450,13 +500,31 @@ export class OceanP2P extends EventEmitter { // } } - async getNetworkingStats() { + getNetworkingStats() { const ret: any = {} - ret.binds = await this._libp2p.components.addressManager.getListenAddrs() - ret.listen = await this._libp2p.components.transportManager.getAddrs() - ret.observing = await this._libp2p.components.addressManager.getObservedAddrs() - ret.announce = await this._libp2p.components.addressManager.getAnnounceAddrs() - ret.connections = await this._libp2p.getConnections() + ret.announce = this._libp2p.getMultiaddrs().map((ma) => ma.toString()) + ret.connections = this._libp2p + .getConnections() + .map((conn) => conn.remoteAddr.toString()) + + const libp2pInternal = this._libp2p as Libp2p & { + components: { + addressManager: AddressManager + transportManager: TransportManager + } + } + if (libp2pInternal.components) { + ret.binds = libp2pInternal.components.addressManager + .getListenAddrs() + .map((ma) => ma.toString()) + ret.listen = libp2pInternal.components.transportManager + .getAddrs() + .map((ma) => ma.toString()) + ret.observing = libp2pInternal.components.addressManager + .getObservedAddrs() + .map((ma) => ma.toString()) + } + return ret } @@ -513,11 +581,9 @@ export class OceanP2P extends EventEmitter { // UPDATE: no need to slice 4 bytes here, actually we need those on client side to verify the node id and perform the encryption of the keys + iv // See config.ts => getPeerIdFromPrivateKey() - const pubKey = Buffer.from(peerId.publicKey).toString('hex') // no need to do .subarray(4).toString('hex') + const pubKey = Buffer.from(peerId.publicKey.raw).toString('hex') // no need to do .subarray(4).toString('hex') const peer = await this._libp2p.peerStore.get(peerId) - // write the publicKey as well - peer.publicKey = pubKey // Note: this is a 'compressed' version of the publicKey, we need to decompress it on client side (not working with bellow attempts) // otherwise the encryption will fail due to public key size mismatch @@ -526,12 +592,43 @@ export class OceanP2P extends EventEmitter { // Buffer.from(decompressedKey).toString('hex') // in any case is not working (it crashes here) - return peer + return { + ...peer, + publicKey: pubKey + } } catch (e) { return null } } + // we should have peer multiaddrs + // but there is a catch + // when dialing multiaddrs, either all of them have peerId, or none.. + // so decide which one to use + normalizeMultiaddrs(peerName: string, multiaddrs: Multiaddr[]): Multiaddr[] { + let finalmultiaddrs: Multiaddr[] = [] + const finalmultiaddrsWithAddress: Multiaddr[] = [] + const finalmultiaddrsWithoutAddress: Multiaddr[] = [] + for (const x of multiaddrs) { + if (x.toString().includes(peerName)) finalmultiaddrsWithAddress.push(x) + else { + let sd = x.toString() + if (x.toString().includes('p2p-circuit')) { + // because a p2p-circuit should always include peerId, if it's missing we will add it + sd = sd + '/p2p/' + peerName + finalmultiaddrsWithAddress.push(multiaddr(sd)) + } else { + finalmultiaddrsWithoutAddress.push(multiaddr(sd)) + } + } + } + if (finalmultiaddrsWithAddress.length > finalmultiaddrsWithoutAddress.length) + finalmultiaddrs = finalmultiaddrsWithAddress + else finalmultiaddrs = finalmultiaddrsWithoutAddress + + return finalmultiaddrs + } + async getPeerMultiaddrs( peerName: string, searchPeerStore: boolean = true, @@ -552,9 +649,19 @@ export class OceanP2P extends EventEmitter { }) if (peerData) { for (const x of peerData.addresses) { - multiaddrs.push(x.multiaddr) + // v3: Convert to local Multiaddr type to avoid type mismatch + multiaddrs.push(multiaddr(x.multiaddr.toString())) } } + + // If we have a connection, multiaddrs from peerStore are valid + const connection = await this._libp2p.dial(multiaddrs) + if ( + connection.remotePeer.toString() === peerId.toString() && + connection.status === 'open' + ) { + return this.normalizeMultiaddrs(peerName, multiaddrs) + } } catch (e) { // console.log(e) } @@ -567,7 +674,8 @@ export class OceanP2P extends EventEmitter { }) if (peerData) { for (const index in peerData.multiaddrs) { - multiaddrs.push(peerData.multiaddrs[index]) + // v3: Convert to local Multiaddr type to avoid type mismatch + multiaddrs.push(multiaddr(peerData.multiaddrs[index].toString())) } } } catch (e) { @@ -575,105 +683,108 @@ export class OceanP2P extends EventEmitter { } } - // now we should have peer multiaddrs - // but there is a catch - // when dialing multiaddrs, either all of them have peerId, or none.. - // so decide which one to use - let finalmultiaddrs: Multiaddr[] = [] - const finalmultiaddrsWithAddress: Multiaddr[] = [] - const finalmultiaddrsWithoutAddress: Multiaddr[] = [] - for (const x of multiaddrs) { - if (x.toString().includes(peerName)) finalmultiaddrsWithAddress.push(x) - else { - let sd = x.toString() - if (x.toString().includes('p2p-circuit')) { - // because a p2p-circuit should always include peerId, if it's missing we will add it - sd = sd + '/p2p/' + peerName - finalmultiaddrsWithAddress.push(multiaddr(sd)) - } else { - finalmultiaddrsWithoutAddress.push(multiaddr(sd)) - } - } - } - if (finalmultiaddrsWithAddress.length > finalmultiaddrsWithoutAddress.length) - finalmultiaddrs = finalmultiaddrsWithAddress - else finalmultiaddrs = finalmultiaddrsWithoutAddress - return finalmultiaddrs + return this.normalizeMultiaddrs(peerName, multiaddrs) + } + + async findPeerInDht(peerName: string, timeout?: number) { + try { + const peer = peerIdFromString(peerName) + const data = await this._libp2p.peerRouting.findPeer(peer, { + signal: + isNaN(timeout) || timeout === 0 + ? AbortSignal.timeout(5000) + : AbortSignal.timeout(timeout), + useCache: true, + useNetwork: true + }) + return data + } catch (e) {} + return null } async sendTo( peerName: string, message: string, - sink: any - ): Promise { + multiAddrs?: string[] + ): Promise<{ status: any; stream?: AsyncIterable }> { P2P_LOGGER.logMessage('SendTo() node ' + peerName + ' task: ' + message, true) - const response: P2PCommandResponse = { - status: { httpStatus: 200, error: '' }, - stream: null - } - let peerId: any + let peerId try { peerId = peerIdFromString(peerName) } catch (e) { P2P_LOGGER.logMessageWithEmoji( - 'Invalid peer (for id): ' + peerId, + 'Invalid peer (for id): ' + peerName, true, GENERIC_EMOJIS.EMOJI_CROSS_MARK, LOG_LEVELS_STR.LEVEL_ERROR ) - response.status.httpStatus = 404 - response.status.error = 'Invalid peer' - return response + return { status: { httpStatus: 404, error: 'Invalid peer' } } } - const multiaddrs: Multiaddr[] = await this.getPeerMultiaddrs(peerName) + + let multiaddrs: Multiaddr[] = [] + if (!multiAddrs || multiAddrs.length < 1) { + multiaddrs = await this.getPeerMultiaddrs(peerName) + } else { + for (const addr of multiAddrs) { + multiaddrs.push(multiaddr(addr)) + } + } + if (multiaddrs.length < 1) { - response.status.httpStatus = 404 - response.status.error = `Cannot find any address to dial for peer: ${peerId}` - P2P_LOGGER.error(response.status.error) - return response + const error = `Cannot find any address to dial for peer: ${peerId}` + P2P_LOGGER.error(error) + return { status: { httpStatus: 404, error } } } - let stream - // dial/connect to the target node + let stream: Stream try { - stream = await this._libp2p.dialProtocol(multiaddrs, this._protocol, { - signal: AbortSignal.timeout(3000), + const options = { + signal: AbortSignal.timeout(10000), priority: 100, - runOnTransientConnection: true - }) + runOnLimitedConnection: true + } + const connection = await this._libp2p.dial(multiaddrs, options) + if (connection.remotePeer.toString() !== peerId.toString()) { + const error = `Invalid peer on the other side: ${connection.remotePeer.toString()}` + P2P_LOGGER.error(error) + return { status: { httpStatus: 404, error } } + } + stream = await connection.newStream(this._protocol, options) } catch (e) { - response.status.httpStatus = 404 - response.status.error = `Cannot connect to peer: ${peerId}` - P2P_LOGGER.error(response.status.error) - return response + const error = `Cannot connect to peer ${peerId}: ${e.message}` + P2P_LOGGER.error(error) + return { status: { httpStatus: 404, error } } } - if (stream) { - response.stream = stream - try { - await pipe( - // Source data - [uint8ArrayFromString(message)], - // Write to the stream, and pass its output to the next function - stream, - // this is the anayze function - // doubler as any, - // Sink function - sink - ) - } catch (err) { - P2P_LOGGER.error(`Unable to send P2P message: ${err.message}`) - response.status.httpStatus = 404 - response.status.error = err.message - } - } else { - response.status.httpStatus = 404 - response.status.error = 'Unable to get remote P2P stream (null)' - P2P_LOGGER.error(response.status.error) + if (!stream) { + return { status: { httpStatus: 404, error: 'Unable to get remote P2P stream' } } } - return response + try { + // Send message and close write side + stream.send(uint8ArrayFromString(message)) + await stream.close() + + // Read and parse status from first chunk + const iterator = stream[Symbol.asyncIterator]() + const { done, value } = await iterator.next() + + if (done || !value) { + return { status: { httpStatus: 500, error: 'No response from peer' } } + } + + const status = JSON.parse(uint8ArrayToString(value.subarray())) + + // Return status and remaining stream + return { status, stream: { [Symbol.asyncIterator]: () => iterator } } + } catch (err) { + P2P_LOGGER.error(`P2P communication error: ${err.message}`) + try { + stream.abort(err as Error) + } catch {} + return { status: { httpStatus: 500, error: `P2P error: ${err.message}` } } + } } // when the target is this node @@ -729,17 +840,35 @@ export class OceanP2P extends EventEmitter { } } - async advertiseDid(did: string) { - P2P_LOGGER.logMessage('Advertising ' + did, true) + async _flushAdvertiseQueue() { + if (this._pendingAdvertise.length > 0) { + P2P_LOGGER.debug( + `Flushing advertise queue with ${this._pendingAdvertise.length} items` + ) + const list = JSON.parse(JSON.stringify(this._pendingAdvertise)) + for (const did of list) { + this._pendingAdvertise = this._pendingAdvertise.filter((item) => item !== did) + + await this.advertiseString(did) + } + // this._pendingAdvertise = [] + } + } + + async advertiseString(did: string) { try { + const cid = await cidFromRawString(did) + P2P_LOGGER.debug('Advertising "' + did + `" as CID:` + cid) const x = (await this.getAllOceanPeers()).length if (x > 0) { - const cid = await cidFromRawString(did) - const multiAddrs = this._libp2p.components.addressManager.getAddresses() + const multiAddrs = this._libp2p.getMultiaddrs() // console.log('multiaddrs: ', multiAddrs) - await this._libp2p.contentRouting.provide(cid, multiAddrs) + // @ts-ignore ignore the type mismatch + this._libp2p.contentRouting.provide(cid, multiAddrs).catch((err: any) => { + P2P_LOGGER.error(`Error advertising DDO: ${err}`) + }) } else { - P2P_LOGGER.verbose( + P2P_LOGGER.debug( 'Could not find any Ocean peers. Nobody is listening at the moment, skipping...' ) // save it for retry later @@ -753,65 +882,51 @@ export class OceanP2P extends EventEmitter { } } - async getProvidersForDid(did: string) { - P2P_LOGGER.logMessage('Fetching providers for ' + did, true) - const cid = await cidFromRawString(did) + getCommonPeers( + rets: Array> + ): Array<{ id: string; multiaddrs: any[] }> { + return rets.reduce( + (acc, curr) => + acc.filter((item) => curr.some((el) => el.id.toString() === item.id.toString())), + rets[0] // Initialize with first subarray + ) + } + + async getProvidersForStrings( + input: string[], + timeout?: number + ): Promise> { + const rets = await Promise.all( + input.map(async (x) => { + const providers = await this.getProvidersForString(x, timeout) + return providers && providers.length > 0 ? providers : [] // Keep only valid results + }) + ) + return this.getCommonPeers(rets) + } + + async getProvidersForString( + input: string, + timeout?: number + ): Promise> { + P2P_LOGGER.logMessage('Fetching providers for ' + input, true) + const cid = await cidFromRawString(input) const peersFound = [] try { - const f = await this._libp2p.contentRouting.findProviders(cid, { - queryFuncTimeout: 20000 // 20 seconds - // on timeout the query ends with an abort signal => CodeError: Query aborted + // @ts-ignore ignore the type mismatch + const f = this._libp2p.contentRouting.findProviders(cid, { + signal: AbortSignal.timeout(timeout || 20000) // 20 seconds // on timeout the query ends with an abort signal => CodeError: Query aborted }) for await (const value of f) { peersFound.push(value) } } catch (e) { - P2P_LOGGER.error('getProvidersForDid()' + e.message) - } - return peersFound - } - - // republish the ddos we have - // related: https://github.com/libp2p/go-libp2p-kad-dht/issues/323 - async republishStoredDDOS() { - try { - if (!this.db) { - P2P_LOGGER.logMessage( - `republishStoredDDOS() attempt aborted because there is no database!`, - true - ) - return - } - const db = this.db.ddo - const searchParameters = { - q: '*' - } - - const result: TypesenseSearchResponse[] = await db.search(searchParameters) - if (result && result.length > 0 && result[0].found) { - P2P_LOGGER.logMessage(`Will republish cid for ${result[0].found} documents`, true) - result[0].hits.forEach((hit: any) => { - const ddo = hit.document - this.advertiseDid(ddo.id) - // populate hash table if not exists - // (even if no peers are listening, it still goes to the pending publish table) - if (!this._ddoDHT.dht.has(ddo.id)) { - this.cacheDDO(ddo) - } - // todo check stuff like purgatory - }) - // update time - this._ddoDHT.updated = new Date().getTime() - } else { - P2P_LOGGER.logMessage('There is nothing to republish, skipping...', true) - } - } catch (err) { - P2P_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `Caught "${err.message}" on republishStoredDDOS()`, - true - ) + P2P_LOGGER.error('getProvidersForString()' + e.message) } + return peersFound.map((peer) => ({ + id: peer.id.toString(), + multiaddrs: peer.multiaddrs + })) } // cache a ddos object @@ -822,6 +937,7 @@ export class OceanP2P extends EventEmitter { lastUpdateTime: ddo.metadata.updated, provider: this.getPeerId() }) + this._ddoDHT.updated = new Date().getTime() } /** @@ -834,7 +950,7 @@ export class OceanP2P extends EventEmitter { } getPeerId(): string { - return this._config.keys.peerId.toString() + return this.keyManager.getPeerIdString() } getDDOCache(): DDOCache { @@ -867,7 +983,7 @@ export class OceanP2P extends EventEmitter { // if already added before, create() will return null, but still advertise it try { await db.create(ddo) - await this.advertiseDid(ddo.id) + await this.advertiseString(ddo.id) // populate hash table this.cacheDDO(ddo) count++ diff --git a/src/components/c2d/compute_engine_base.ts b/src/components/c2d/compute_engine_base.ts index ef147eea5..13e49a6a4 100644 --- a/src/components/c2d/compute_engine_base.ts +++ b/src/components/c2d/compute_engine_base.ts @@ -5,14 +5,42 @@ import type { ComputeAlgorithm, ComputeAsset, ComputeJob, - ComputeOutput -} from '../../@types/C2D.js' -import { C2DClusterType } from '../../@types/C2D.js' + ComputeOutput, + ComputeResourceRequest, + ComputeResourceRequestWithPrice, + ComputeResourceType, + ComputeResource, + ComputeResourcesPricingInfo, + DBComputeJobPayment, + DBComputeJob, + dockerDeviceRequest, + DBComputeJobMetadata, + ComputeEnvFees +} from '../../@types/C2D/C2D.js' +import { C2DClusterType } from '../../@types/C2D/C2D.js' +import { C2DDatabase } from '../database/C2DDatabase.js' +import { Escrow } from '../core/utils/escrow.js' +import { KeyManager } from '../KeyManager/index.js' -export class C2DEngine { +export abstract class C2DEngine { private clusterConfig: C2DClusterInfo - public constructor(cluster: C2DClusterInfo) { + public db: C2DDatabase + public escrow: Escrow + public keyManager: KeyManager + public constructor( + cluster: C2DClusterInfo, + db: C2DDatabase, + escrow: Escrow, + keyManager: KeyManager + ) { this.clusterConfig = cluster + this.db = db + this.escrow = escrow + this.keyManager = keyManager + } + + getKeyManager(): KeyManager { + return this.keyManager } getC2DConfig(): C2DClusterInfo { @@ -26,19 +54,53 @@ export class C2DEngine { } // functions which need to be implemented by all engine types - // eslint-disable-next-line require-await - public async getComputeEnvironments(chainId: number): Promise { - throw new Error(`Not implemented`) - } + public abstract getComputeEnvironments(chainId?: number): Promise - public async start(): Promise { - // overwritten by classes for start actions + // overwritten by classes for start actions + public start(): Promise { + return null } - public async stop(): Promise { - // overwritten by classes for cleanup + // overwritten by classes for cleanup + public stop(): Promise { + return null } + public abstract startComputeJob( + assets: ComputeAsset[], + algorithm: ComputeAlgorithm, + output: ComputeOutput, + environment: string, + owner: string, + maxJobDuration: number, + resources: ComputeResourceRequest[], + payment: DBComputeJobPayment, + jobId: string, + metadata?: DBComputeJobMetadata, + additionalViewers?: string[], + queueMaxWaitTime?: number + ): Promise + + public abstract stopComputeJob( + jobId: string, + owner: string, + agreementId?: string + ): Promise + + public abstract getComputeJobStatus( + consumerAddress?: string, + agreementId?: string, + jobId?: string + ): Promise + + public abstract getComputeJobResult( + consumerAddress: string, + jobId: string, + index: number + ): Promise<{ stream: Readable; headers: any }> + + public abstract cleanupExpiredStorage(job: DBComputeJob): Promise + public async envExists( chainId: number, envIdWithHash?: string, @@ -77,52 +139,388 @@ export class C2DEngine { return null } - // eslint-disable-next-line require-await - public async startComputeJob( - assets: ComputeAsset[], - algorithm: ComputeAlgorithm, - output: ComputeOutput, - owner: string, - environment: string, - validUntil: number, - chainId: number, - agreementId: string - ): Promise { - throw new Error(`Not implemented`) + public getStreamableLogs(jobId: string): Promise { + throw new Error(`Not implemented for this engine type`) } - // eslint-disable-next-line require-await - public async stopComputeJob( - jobId: string, - owner: string, - agreementId?: string - ): Promise { - throw new Error(`Not implemented`) + protected async getJobEnvironment(job: DBComputeJob): Promise { + const environments: ComputeEnvironment[] = await ( + await this.getComputeEnvironments() + ).filter((env: ComputeEnvironment) => env.id === job.environment) + // found it + if (environments.length === 1) { + const environment = environments[0] + return environment + } + return null + } + + /* Returns ComputeResources for a specific resource + */ + public getMaxMinResource( + id: ComputeResourceType, + env: ComputeEnvironment, + isFree: boolean + ): ComputeResource { + const paid = this.getResource(env.resources, id) + if (!paid) { + return { + id, + total: 0, + max: 0, + min: 0 + } + } + let free = null + if (isFree && 'free' in env && 'resources' in env.free) { + free = this.getResource(env.free.resources, id) + if (!free) { + // this resource is not listed under free, so it's not available + return { + id, + total: 0, + max: 0, + min: 0 + } + } + } + const total = 'total' in paid ? paid.total : 0 + const max = 'max' in paid ? paid.max : 0 + const min = 'min' in paid ? paid.min : 0 + const ret: ComputeResource = { + id, + total: free && 'total' in free ? free.total : total, + max: free && 'max' in free ? free.max : max, + min: free && 'min' in free ? free.min : min + } + + return ret } + // make sure that all requests have cpu, ram, storage // eslint-disable-next-line require-await - public async getComputeJobStatus( - consumerAddress?: string, - agreementId?: string, - jobId?: string - ): Promise { - throw new Error(`Not implemented`) + public async checkAndFillMissingResources( + resources: ComputeResourceRequest[], + env: ComputeEnvironment, + isFree: boolean + ): Promise { + if (isFree && !('free' in env)) throw new Error('This env does not support free jobs') + const properResources: ComputeResourceRequest[] = [] + const elements: string[] = [] + + for (const res of env.free.resources) elements.push(res.id) + for (const res of env.resources) if (!elements.includes(res.id)) elements.push(res.id) + + /* if (isFree && 'free' in env && 'resources' in env.free) { + for (const res of env.free.resources) elements.push(res.id) + } else for (const res of env.resources) elements.push(res.id) + */ + for (const device of elements) { + let desired = this.getResourceRequest(resources, device) + const minMax = this.getMaxMinResource(device, env, isFree) + if (!desired && minMax.min >= 0) { + // it's required + desired = minMax.min + } else { + if (desired < minMax.min) desired = minMax.min + if (desired > minMax.max) { + throw new Error( + 'Not enough ' + + device + + ' resources. Requested ' + + desired + + ', but max is ' + + minMax.max + ) + } + } + properResources.push({ id: device, amount: desired }) + } + + return properResources } + public async getUsedResources(env: ComputeEnvironment): Promise { + const usedResources: { [x: string]: any } = {} + const usedFreeResources: { [x: string]: any } = {} + const jobs = await this.db.getRunningJobs(this.getC2DConfig().hash) + let totalJobs = 0 + let totalFreeJobs = 0 + let queuedJobs = 0 + let queuedFreeJobs = 0 + let maxWaitTime = 0 + let maxWaitTimeFree = 0 + let maxRunningTime = 0 + let maxRunningTimeFree = 0 + for (const job of jobs) { + if (job.environment === env.id) { + if (job.queueMaxWaitTime === 0) { + const timeElapsed = + new Date().getTime() / 1000 - Number.parseFloat(job?.algoStartTimestamp) + totalJobs++ + maxRunningTime += job.maxJobDuration - timeElapsed + if (job.isFree) { + totalFreeJobs++ + maxRunningTimeFree += job.maxJobDuration - timeElapsed + } + + for (const resource of job.resources) { + if (!(resource.id in usedResources)) usedResources[resource.id] = 0 + usedResources[resource.id] += resource.amount + if (job.isFree) { + if (!(resource.id in usedFreeResources)) usedFreeResources[resource.id] = 0 + usedFreeResources[resource.id] += resource.amount + } + } + } else { + // queued job + queuedJobs++ + maxWaitTime += job.maxJobDuration + if (job.isFree) { + queuedFreeJobs++ + maxWaitTimeFree += job.maxJobDuration + } + } + } + } + return { + totalJobs, + totalFreeJobs, + usedResources, + usedFreeResources, + queuedJobs, + queuedFreeJobs, + maxWaitTime, + maxWaitTimeFree, + maxRunningTime, + maxRunningTimeFree + } + } + + // overridden by each engine if required // eslint-disable-next-line require-await - public async getComputeJobResult( - consumerAddress: string, - jobId: string, - index: number - ): Promise { - throw new Error(`Not implemented`) + public async checkIfResourcesAreAvailable( + resourcesRequest: ComputeResourceRequest[], + env: ComputeEnvironment, + isFree: boolean + ) { + // Filter out resources with amount 0 as they're not actually being requested + const activeResources = resourcesRequest.filter((r) => r.amount > 0) + + for (const request of activeResources) { + let envResource = this.getResource(env.resources, request.id) + if (!envResource) throw new Error(`No such resource ${request.id}`) + if (envResource.total - envResource.inUse < request.amount) + throw new Error(`Not enough available ${request.id}`) + if (isFree) { + if (!env.free) throw new Error(`No free resources`) + envResource = this.getResource(env.free.resources, request.id) + if (!envResource) throw new Error(`No such free resource ${request.id}`) + if (envResource.total - envResource.inUse < request.amount) + throw new Error(`Not enough available ${request.id} for free`) + } + } + if ('maxJobs' in env && env.maxJobs && env.runningJobs + 1 > env.maxJobs) { + throw new Error(`Too many running jobs `) + } + if ( + isFree && + 'free' in env && + `maxJobs` in env.free && + env.free.maxJobs && + env.runningfreeJobs + 1 > env.free.maxJobs + ) { + throw new Error(`Too many running free jobs `) + } + } + + public getResource(resources: ComputeResource[], id: ComputeResourceType) { + if (!resources) return null + for (const resource of resources) { + if (resource.id === id) { + return resource + } + } + return null + } + + public getResourceRequest( + resources: ComputeResourceRequest[], + id: ComputeResourceType + ) { + if (!resources) return null + for (const resource of resources) { + if (resource.id === id) { + return resource.amount + } + } + return null + } + + public getDockerDeviceRequest( + requests: ComputeResourceRequest[], + resources: ComputeResource[] + ): dockerDeviceRequest[] | null { + if (!resources) return null + + // Filter out resources with amount 0 as they're not actually being requested + const activeResources = requests.filter((r) => r.amount > 0) + const grouped: Record = {} + + for (const resource of activeResources) { + const res = this.getResource(resources, resource.id) + const init = res?.init?.deviceRequests + if (!init) continue + + const key = `${init.Driver}-${JSON.stringify(init.Capabilities)}` + if (!grouped[key]) { + grouped[key] = { + Driver: init.Driver, + Capabilities: init.Capabilities, + DeviceIDs: [], + Options: init.Options ?? null, + Count: undefined + } + } + + if (init.DeviceIDs?.length) { + grouped[key].DeviceIDs!.push(...init.DeviceIDs) + } + } + + return Object.values(grouped) + } + + public getDockerAdvancedConfig( + requests: ComputeResourceRequest[], + resources: ComputeResource[] + ) { + const ret = { + Devices: [] as any[], + GroupAdd: [] as string[], + SecurityOpt: [] as string[], + Binds: [] as string[], + CapAdd: [] as string[], + CapDrop: [] as string[], + IpcMode: null as string, + ShmSize: 0 as number + } + // Filter out resources with amount 0 as they're not actually being requested + const activeResources = requests.filter((r) => r.amount > 0) + + for (const resource of activeResources) { + const res = this.getResource(resources, resource.id) + if (res.init && res.init.advanced) { + for (const [key, value] of Object.entries(res.init.advanced)) { + switch (key) { + case 'IpcMode': + ret.IpcMode = value as string + break + case 'ShmSize': + ret.ShmSize = value as number + break + case 'GroupAdd': + for (const grp of value as string[]) { + if (!ret.GroupAdd.includes(grp)) ret.GroupAdd.push(grp) + } + break + case 'CapAdd': + for (const grp of value as string[]) { + if (!ret.CapAdd.includes(grp)) ret.CapAdd.push(grp) + } + break + case 'CapDrop': + for (const grp of value as string[]) { + if (!ret.CapDrop.includes(grp)) ret.CapDrop.push(grp) + } + break + case 'Devices': + for (const device of value as string[]) { + if (!ret.Devices.find((d) => d.PathOnHost === device)) + ret.Devices.push({ + PathOnHost: device, + PathInContainer: device, + CgroupPermissions: 'rwm' + }) + } + break + case 'SecurityOpt': + for (const [secKeys, secValues] of Object.entries(value)) + if (!ret.SecurityOpt.includes(secKeys + '=' + secValues)) + ret.SecurityOpt.push(secKeys + '=' + secValues) + break + case 'Binds': + for (const grp of value as string[]) { + if (!ret.Binds.includes(grp)) ret.Binds.push(grp) + } + break + } + } + } + } + return ret + } + + public getEnvPricesForToken( + env: ComputeEnvironment, + chainId: number, + token: string + ): ComputeResourcesPricingInfo[] { + if (!env.fees || !(chainId in env.fees) || !env.fees[chainId]) { + return null + } + for (const fee of env.fees[chainId]) { + // eslint-disable-next-line security/detect-possible-timing-attacks + if (fee.feeToken === token) { + return fee.prices + } + } + + return null } -} -export class C2DEngineLocal extends C2DEngine { - // eslint-disable-next-line no-useless-constructor - public constructor(clusterConfig: C2DClusterInfo) { - super(clusterConfig) + public getResourcePrice( + prices: ComputeResourcesPricingInfo[], + id: ComputeResourceType + ) { + for (const pr of prices) { + if (pr.id === id) { + return pr.price + } + } + return 0 + } + + public getTotalCostOfJob( + resources: ComputeResourceRequestWithPrice[], + duration: number, + fee: ComputeEnvFees + ) { + let cost: number = 0 + for (const request of resources) { + const price = fee.prices.find((p) => p.id === request.id)?.price + if (price) { + cost += price * request.amount * Math.ceil(duration / 60) + } + } + return cost + } + + public calculateResourcesCost( + resourcesRequest: ComputeResourceRequest[], + env: ComputeEnvironment, + chainId: number, + token: string, + maxJobDuration: number + ): number | null { + if (maxJobDuration < env.minJobDuration) maxJobDuration = env.minJobDuration + const prices = this.getEnvPricesForToken(env, chainId, token) + if (!prices) return null + let cost: number = 0 + for (const request of resourcesRequest) { + const resourcePrice = this.getResourcePrice(prices, request.id) + cost += resourcePrice * request.amount * Math.ceil(maxJobDuration / 60) + } + return cost } - // not implemented yet } diff --git a/src/components/c2d/compute_engine_docker.ts b/src/components/c2d/compute_engine_docker.ts new file mode 100644 index 000000000..7459e7ce2 --- /dev/null +++ b/src/components/c2d/compute_engine_docker.ts @@ -0,0 +1,2180 @@ +/* eslint-disable security/detect-non-literal-fs-filename */ +import { Readable } from 'stream' +import os from 'os' +import { + C2DStatusNumber, + C2DStatusText, + DBComputeJobMetadata +} from '../../@types/C2D/C2D.js' +import type { + C2DClusterInfo, + ComputeEnvironment, + ComputeAlgorithm, + ComputeAsset, + ComputeJob, + ComputeOutput, + DBComputeJob, + DBComputeJobPayment, + ComputeResult, + RunningPlatform, + ComputeEnvFeesStructure, + ComputeResourceRequest, + ComputeEnvFees +} from '../../@types/C2D/C2D.js' +import { getConfiguration } from '../../utils/config.js' +import { C2DEngine } from './compute_engine_base.js' +import { C2DDatabase } from '../database/C2DDatabase.js' +import { Escrow } from '../core/utils/escrow.js' +import { create256Hash } from '../../utils/crypt.js' +import { Storage } from '../storage/index.js' +import Dockerode from 'dockerode' +import type { ContainerCreateOptions, HostConfig, VolumeCreateOptions } from 'dockerode' +import * as tar from 'tar' +import * as tarStream from 'tar-stream' +import { + createWriteStream, + existsSync, + mkdirSync, + rmSync, + writeFileSync, + appendFileSync, + statSync, + createReadStream +} from 'fs' +import { pipeline } from 'node:stream/promises' +import { CORE_LOGGER } from '../../utils/logging/common.js' +import { AssetUtils } from '../../utils/asset.js' +import { FindDdoHandler } from '../core/handler/ddoHandler.js' +import { OceanNode } from '../../OceanNode.js' +import { KeyManager } from '../KeyManager/index.js' +import { decryptFilesObject, omitDBComputeFieldsFromComputeJob } from './index.js' +import { ValidateParams } from '../httpRoutes/validateCommands.js' +import { Service } from '@oceanprotocol/ddo-js' +import { getOceanTokenAddressForChain } from '../../utils/address.js' + +export class C2DEngineDocker extends C2DEngine { + private envs: ComputeEnvironment[] = [] + + public docker: Dockerode + private cronTimer: any + private cronTime: number = 2000 + private jobImageSizes: Map = new Map() + private isInternalLoopRunning: boolean = false + private imageCleanupTimer: NodeJS.Timeout | null = null + private static DEFAULT_DOCKER_REGISTRY = 'https://registry-1.docker.io' + private retentionDays: number + private cleanupInterval: number + + public constructor( + clusterConfig: C2DClusterInfo, + db: C2DDatabase, + escrow: Escrow, + keyManager: KeyManager + ) { + super(clusterConfig, db, escrow, keyManager) + + this.docker = null + if (clusterConfig.connection.socketPath) { + try { + this.docker = new Dockerode({ socketPath: clusterConfig.connection.socketPath }) + } catch (e) { + CORE_LOGGER.error('Could not create Docker container: ' + e.message) + } + } + this.retentionDays = clusterConfig.connection.imageRetentionDays || 7 + this.cleanupInterval = clusterConfig.connection.imageCleanupInterval || 86400 // 24 hours + if ( + clusterConfig.connection.protocol && + clusterConfig.connection.host && + clusterConfig.connection.port + ) { + try { + this.docker = new Dockerode({ + protocol: clusterConfig.connection.protocol, + host: clusterConfig.connection.host, + port: clusterConfig.connection.port + }) + } catch (e) { + CORE_LOGGER.error('Could not create Docker container: ' + e.message) + } + } + // TO DO C2D - create envs + try { + if (!existsSync(clusterConfig.tempFolder)) + mkdirSync(clusterConfig.tempFolder, { recursive: true }) + } catch (e) { + CORE_LOGGER.error( + 'Could not create Docker container temporary folders: ' + e.message + ) + } + // envs are build on start function + } + + public override async start() { + // let's build the env. Swarm and k8 will build multiple envs, based on arhitecture + const config = await getConfiguration() + const envConfig = await this.getC2DConfig().connection + let sysinfo = null + try { + sysinfo = await this.docker.info() + } catch (e) { + CORE_LOGGER.error('Could not get docker info: ' + e.message) + // since we cannot connect to docker, we cannot start the engine -> no envs + return + } + let fees: ComputeEnvFeesStructure = null + const supportedChains: number[] = [] + if (config.supportedNetworks) { + for (const chain of Object.keys(config.supportedNetworks)) { + supportedChains.push(parseInt(chain)) + } + } + for (const feeChain of Object.keys(envConfig.fees)) { + // for (const feeConfig of envConfig.fees) { + if (supportedChains.includes(parseInt(feeChain))) { + if (fees === null) fees = {} + if (!(feeChain in fees)) fees[feeChain] = [] + const tmpFees: ComputeEnvFees[] = [] + for (let i = 0; i < envConfig.fees[feeChain].length; i++) { + if ( + envConfig.fees[feeChain][i].prices && + envConfig.fees[feeChain][i].prices.length > 0 + ) { + if (!envConfig.fees[feeChain][i].feeToken) { + const tokenAddress = getOceanTokenAddressForChain(parseInt(feeChain)) + if (tokenAddress) { + envConfig.fees[feeChain][i].feeToken = tokenAddress + tmpFees.push(envConfig.fees[feeChain][i]) + } else { + CORE_LOGGER.error( + `Unable to find Ocean token address for chain ${feeChain} and no custom token provided` + ) + } + } else { + tmpFees.push(envConfig.fees[feeChain][i]) + } + } else { + CORE_LOGGER.error( + `Unable to find prices for fee ${JSON.stringify( + envConfig.fees[feeChain][i] + )} on chain ${feeChain}` + ) + } + } + fees[feeChain] = tmpFees + } + + /* for (const chain of Object.keys(config.supportedNetworks)) { + const chainId = parseInt(chain) + if (task.chainId && task.chainId !== chainId) continue + result[chainId] = await computeEngines.fetchEnvironments(chainId) + } */ + } + this.envs.push({ + id: '', // this.getC2DConfig().hash + '-' + create256Hash(JSON.stringify(this.envs[i])), + runningJobs: 0, + consumerAddress: this.getKeyManager().getEthAddress(), + platform: { + architecture: sysinfo.Architecture, + os: sysinfo.OSType + }, + access: { + addresses: [], + accessLists: null + }, + fees, + queuedJobs: 0, + queuedFreeJobs: 0, + queMaxWaitTime: 0, + queMaxWaitTimeFree: 0, + runMaxWaitTime: 0, + runMaxWaitTimeFree: 0 + }) + if (`access` in envConfig) this.envs[0].access = envConfig.access + + if (`storageExpiry` in envConfig) this.envs[0].storageExpiry = envConfig.storageExpiry + if (`minJobDuration` in envConfig) + this.envs[0].minJobDuration = envConfig.minJobDuration + if (`maxJobDuration` in envConfig) + this.envs[0].maxJobDuration = envConfig.maxJobDuration + if (`maxJobs` in envConfig) this.envs[0].maxJobs = envConfig.maxJobs + // let's add resources + this.envs[0].resources = [] + this.envs[0].resources.push({ + id: 'cpu', + type: 'cpu', + total: sysinfo.NCPU, + max: sysinfo.NCPU, + min: 1, + description: os.cpus()[0].model + }) + this.envs[0].resources.push({ + id: 'ram', + type: 'ram', + total: Math.floor(sysinfo.MemTotal / 1024 / 1024 / 1024), + max: Math.floor(sysinfo.MemTotal / 1024 / 1024 / 1024), + min: 1 + }) + + if (envConfig.resources) { + for (const res of envConfig.resources) { + // allow user to add other resources + if (res.id !== 'cpu' && res.id !== 'ram') { + if (!res.max) res.max = res.total + if (!res.min) res.min = 0 + this.envs[0].resources.push(res) + } + } + } + /* TODO - get namedresources & discreete one + if (sysinfo.GenericResources) { + for (const [key, value] of Object.entries(sysinfo.GenericResources)) { + for (const [type, val] of Object.entries(value)) { + // for (const resType in sysinfo.GenericResources) { + if (type === 'NamedResourceSpec') { + // if we have it, ignore it + const resourceId = val.Value + const resourceType = val.Kind + let found = false + for (const res of this.envs[0].resources) { + if (res.id === resourceId) { + found = true + break + } + } + if (!found) { + this.envs[0].resources.push({ + id: resourceId, + kind: resourceType, + total: 1, + max: 1, + min: 0 + }) + } + } + } + } + } + */ + // limits for free env + if ('free' in envConfig) { + this.envs[0].free = { + access: { + addresses: [], + accessLists: null + } + } + if (`access` in envConfig.free) this.envs[0].free.access = envConfig.free.access + if (`storageExpiry` in envConfig.free) + this.envs[0].free.storageExpiry = envConfig.free.storageExpiry + if (`minJobDuration` in envConfig.free) + this.envs[0].free.minJobDuration = envConfig.free.minJobDuration + if (`maxJobDuration` in envConfig.free) + this.envs[0].free.maxJobDuration = envConfig.free.maxJobDuration + if (`maxJobs` in envConfig.free) this.envs[0].free.maxJobs = envConfig.free.maxJobs + if ('resources' in envConfig.free) { + // TO DO - check if resource is also listed in this.envs[0].resources, if not, ignore it + this.envs[0].free.resources = envConfig.free.resources + } + } + this.envs[0].id = + this.getC2DConfig().hash + '-' + create256Hash(JSON.stringify(this.envs[0])) + + // only now set the timer + if (!this.cronTimer) { + this.setNewTimer() + } + // Start image cleanup timer + this.startImageCleanupTimer() + } + + public override stop(): Promise { + // Clear the timer and reset the flag + if (this.cronTimer) { + clearTimeout(this.cronTimer) + this.cronTimer = null + } + this.isInternalLoopRunning = false + // Stop image cleanup timer + if (this.imageCleanupTimer) { + clearInterval(this.imageCleanupTimer) + this.imageCleanupTimer = null + CORE_LOGGER.debug('Image cleanup timer stopped') + } + return Promise.resolve() + } + + public async updateImageUsage(image: string): Promise { + try { + await this.db.updateImage(image) + } catch (e) { + CORE_LOGGER.error(`Failed to update image usage for ${image}: ${e.message}`) + } + } + + private async cleanupOldImages(): Promise { + if (!this.docker) return + + try { + const oldImages = await this.db.getOldImages(this.retentionDays) + if (oldImages.length === 0) { + CORE_LOGGER.debug('No old images to clean up') + return + } + + CORE_LOGGER.info(`Starting cleanup of ${oldImages.length} old Docker images`) + let cleaned = 0 + let failed = 0 + + for (const image of oldImages) { + try { + const dockerImage = this.docker.getImage(image) + await dockerImage.remove({ force: true }) + cleaned++ + CORE_LOGGER.info(`Successfully removed old image: ${image}`) + } catch (e) { + failed++ + // Image might be in use or already deleted - log but don't throw + CORE_LOGGER.debug(`Could not remove image ${image}: ${e.message}`) + } + } + + CORE_LOGGER.info( + `Image cleanup completed: ${cleaned} removed, ${failed} failed (may be in use)` + ) + } catch (e) { + CORE_LOGGER.error(`Error during image cleanup: ${e.message}`) + } + } + + private startImageCleanupTimer(): void { + if (this.imageCleanupTimer) { + return // Already running + } + + if (!this.docker) { + CORE_LOGGER.debug('Docker not available, skipping image cleanup timer') + return + } + + // Run initial cleanup after a short delay + setTimeout(() => { + this.cleanupOldImages().catch((e) => { + CORE_LOGGER.error(`Initial image cleanup failed: ${e.message}`) + }) + }, 60000) // Wait 1 minute after start + + // Set up periodic cleanup + this.imageCleanupTimer = setInterval(() => { + this.cleanupOldImages().catch((e) => { + CORE_LOGGER.error(`Periodic image cleanup failed: ${e.message}`) + }) + }, this.cleanupInterval * 1000) + + CORE_LOGGER.info( + `Image cleanup timer started (interval: ${this.cleanupInterval / 60} minutes)` + ) + } + + // eslint-disable-next-line require-await + public override async getComputeEnvironments( + chainId?: number + ): Promise { + /** + * Returns all cluster's compute environments, filtered by a specific chainId if needed. Env's id already contains the cluster hash + */ + if (!this.docker) return [] + const filteredEnvs = [] + // const systemInfo = this.docker ? await this.docker.info() : null + for (const computeEnv of this.envs) { + if ( + !chainId || + (computeEnv.fees && Object.hasOwn(computeEnv.fees, String(chainId))) + ) { + // TO DO - At some point in time we need to handle multiple runtimes + // console.log('********************************') + // console.log(systemInfo.GenericResources) + // console.log('********************************') + // if (systemInfo.Runtimes) computeEnv.runtimes = systemInfo.Runtimes + // if (systemInfo.DefaultRuntime) + // computeEnv.defaultRuntime = systemInfo.DefaultRuntime + const { + totalJobs, + totalFreeJobs, + usedResources, + usedFreeResources, + queuedJobs, + queuedFreeJobs, + maxWaitTime, + maxWaitTimeFree, + maxRunningTime, + maxRunningTimeFree + } = await this.getUsedResources(computeEnv) + computeEnv.runningJobs = totalJobs + computeEnv.runningfreeJobs = totalFreeJobs + computeEnv.queuedJobs = queuedJobs + computeEnv.queuedFreeJobs = queuedFreeJobs + computeEnv.queMaxWaitTime = maxWaitTime + computeEnv.queMaxWaitTimeFree = maxWaitTimeFree + computeEnv.runMaxWaitTime = maxRunningTime + computeEnv.runMaxWaitTimeFree = maxRunningTimeFree + for (let i = 0; i < computeEnv.resources.length; i++) { + if (computeEnv.resources[i].id in usedResources) + computeEnv.resources[i].inUse = usedResources[computeEnv.resources[i].id] + else computeEnv.resources[i].inUse = 0 + } + if (computeEnv.free && computeEnv.free.resources) { + for (let i = 0; i < computeEnv.free.resources.length; i++) { + if (computeEnv.free.resources[i].id in usedFreeResources) + computeEnv.free.resources[i].inUse = + usedFreeResources[computeEnv.free.resources[i].id] + else computeEnv.free.resources[i].inUse = 0 + } + } + filteredEnvs.push(computeEnv) + } + } + + return filteredEnvs + } + + private static parseImage(image: string) { + let registry = C2DEngineDocker.DEFAULT_DOCKER_REGISTRY + let name = image + let ref = 'latest' + + const atIdx = name.indexOf('@') + const colonIdx = name.lastIndexOf(':') + + if (atIdx !== -1) { + ref = name.slice(atIdx + 1) + name = name.slice(0, atIdx) + } else if (colonIdx !== -1 && !name.slice(colonIdx).includes('/')) { + ref = name.slice(colonIdx + 1) + name = name.slice(0, colonIdx) + } + + const firstSlash = name.indexOf('/') + if (firstSlash !== -1) { + const potential = name.slice(0, firstSlash) + if (potential.includes('.') || potential.includes(':')) { + registry = potential.includes('localhost') + ? `http://${potential}` + : `https://${potential}` + name = name.slice(firstSlash + 1) + } + } + + if (registry === C2DEngineDocker.DEFAULT_DOCKER_REGISTRY && !name.includes('/')) { + name = `library/${name}` + } + + return { registry, name, ref } + } + + public static async getDockerManifest(image: string): Promise { + const { registry, name, ref } = C2DEngineDocker.parseImage(image) + const url = `${registry}/v2/${name}/manifests/${ref}` + let headers: Record = { + Accept: + 'application/vnd.docker.distribution.manifest.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.index.v1+json' + } + let response = await fetch(url, { headers }) + + if (response.status === 401) { + const match = (response.headers.get('www-authenticate') || '').match( + /Bearer realm="([^"]+)",service="([^"]+)"/ + ) + if (match) { + const tokenUrl = new URL(match[1]) + tokenUrl.searchParams.set('service', match[2]) + tokenUrl.searchParams.set('scope', `repository:${name}:pull`) + const { token } = (await fetch(tokenUrl.toString()).then((r) => r.json())) as { + token: string + } + headers = { ...headers, Authorization: `Bearer ${token}` } + response = await fetch(url, { headers }) + } + } + + if (!response.ok) { + const body = await response.text() + throw new Error( + `Failed to get manifest: ${response.status} ${response.statusText} - ${body}` + ) + } + return await response.json() + } + + /** + * Checks the docker image by looking at the manifest + * @param image name or tag + * @returns boolean + */ + public static async checkDockerImage( + image: string, + platform?: RunningPlatform + ): Promise { + try { + const manifest = await C2DEngineDocker.getDockerManifest(image) + + const platforms = Array.isArray(manifest.manifests) + ? manifest.manifests.map((entry: any) => entry.platform) + : [manifest.platform] + + const isValidPlatform = platforms.some((entry: any) => + checkManifestPlatform(entry, platform) + ) + + return { valid: isValidPlatform } + } catch (err: any) { + CORE_LOGGER.error(`Unable to get Manifest for image ${image}: ${err.message}`) + if (err.errors?.length) CORE_LOGGER.error(JSON.stringify(err.errors)) + + return { + valid: false, + status: 404, + reason: err.errors?.length ? JSON.stringify(err.errors) : err.message + } + } + } + + // eslint-disable-next-line require-await + public override async startComputeJob( + assets: ComputeAsset[], + algorithm: ComputeAlgorithm, + output: ComputeOutput, + environment: string, + owner: string, + maxJobDuration: number, + resources: ComputeResourceRequest[], + payment: DBComputeJobPayment, + jobId: string, + metadata?: DBComputeJobMetadata, + additionalViewers?: string[], + queueMaxWaitTime?: number + ): Promise { + if (!this.docker) return [] + // TO DO - iterate over resources and get default runtime + const isFree: boolean = !(payment && payment.lockTx) + + if (metadata && Object.keys(metadata).length > 0) { + const metadataSize = JSON.stringify(metadata).length + if (metadataSize > 1024) { + throw new Error('Metadata size is too large') + } + } + + const envIdWithHash = environment && environment.indexOf('-') > -1 + const env = await this.getComputeEnvironment( + payment && payment.chainId ? payment.chainId : null, + envIdWithHash ? environment : null, + environment + ) + if (!env) { + throw new Error(`Invalid environment ${environment}`) + } + // C2D - Check image, check arhitecture, etc + const image = getAlgorithmImage(algorithm, jobId) + // ex: node@sha256:1155995dda741e93afe4b1c6ced2d01734a6ec69865cc0997daf1f4db7259a36 + if (!image) { + // send a 500 with the error message + throw new Error( + `Unable to extract docker image ${image} from algoritm: ${JSON.stringify( + algorithm + )}` + ) + } + let additionalDockerFiles: { [key: string]: any } = null + if ( + algorithm.meta && + algorithm.meta.container && + algorithm.meta.container.additionalDockerFiles + ) { + additionalDockerFiles = JSON.parse( + JSON.stringify(algorithm.meta.container.additionalDockerFiles) + ) + // make sure that we don't keep them in the db structure + algorithm.meta.container.additionalDockerFiles = null + if (queueMaxWaitTime && queueMaxWaitTime > 0) { + throw new Error(`additionalDockerFiles cannot be used with queued jobs`) + } + } + const job: DBComputeJob = { + clusterHash: this.getC2DConfig().hash, + containerImage: image, + owner, + jobId, + dateCreated: String(Date.now() / 1000), + dateFinished: null, + status: + queueMaxWaitTime && queueMaxWaitTime > 0 + ? C2DStatusNumber.JobQueued + : C2DStatusNumber.JobStarted, + statusText: + queueMaxWaitTime && queueMaxWaitTime > 0 + ? C2DStatusText.JobQueued + : C2DStatusText.JobStarted, + results: [], + algorithm, + assets, + maxJobDuration, + environment, + configlogURL: null, + publishlogURL: null, + algologURL: null, + outputsURL: null, + stopRequested: false, + isRunning: true, + isStarted: false, + resources, + isFree, + algoStartTimestamp: '0', + algoStopTimestamp: '0', + payment, + metadata, + additionalViewers, + terminationDetails: { exitCode: null, OOMKilled: null }, + algoDuration: 0, + queueMaxWaitTime: queueMaxWaitTime || 0 + } + + if (algorithm.meta.container && algorithm.meta.container.dockerfile) { + // we need to build the image if job is not queued + if (queueMaxWaitTime === 0) { + job.status = C2DStatusNumber.BuildImage + job.statusText = C2DStatusText.BuildImage + } + } else { + // already built, we need to validate it + const validation = await C2DEngineDocker.checkDockerImage(image, env.platform) + if (!validation.valid) + throw new Error( + `Cannot find image ${image} for ${env.platform.architecture}. Maybe it does not exist or it's build for other arhitectures.` + ) + if (queueMaxWaitTime === 0) { + job.status = C2DStatusNumber.PullImage + job.statusText = C2DStatusText.PullImage + } + } + + await this.makeJobFolders(job) + // make sure we actually were able to insert on DB + const addedId = await this.db.newJob(job) + if (!addedId) { + return [] + } + if (queueMaxWaitTime === 0) { + if (algorithm.meta.container && algorithm.meta.container.dockerfile) { + this.buildImage(job, additionalDockerFiles) + } else { + this.pullImage(job) + } + } + // only now set the timer + if (!this.cronTimer) { + this.setNewTimer() + } + const cjob: ComputeJob = omitDBComputeFieldsFromComputeJob(job) + // we add cluster hash to user output + cjob.jobId = this.getC2DConfig().hash + '-' + cjob.jobId + // cjob.jobId = jobId + return [cjob] + } + + // eslint-disable-next-line require-await + public override async stopComputeJob( + jobId: string, + owner: string, + agreementId?: string + ): Promise { + const jobs = await this.db.getJob(jobId, agreementId, owner) + if (jobs.length === 0) { + return [] + } + const statusResults = [] + for (const job of jobs) { + job.stopRequested = true + await this.db.updateJob(job) + const res: ComputeJob = omitDBComputeFieldsFromComputeJob(job) + statusResults.push(res) + } + + return statusResults + } + + // eslint-disable-next-line require-await + protected async getResults(jobId: string): Promise { + const res: ComputeResult[] = [] + let index = 0 + try { + const logStat = statSync( + this.getC2DConfig().tempFolder + '/' + jobId + '/data/logs/image.log' + ) + if (logStat) { + res.push({ + filename: 'image.log', + filesize: logStat.size, + type: 'imageLog', + index + }) + index = index + 1 + } + } catch (e) {} + try { + const logStat = statSync( + this.getC2DConfig().tempFolder + '/' + jobId + '/data/logs/configuration.log' + ) + if (logStat) { + res.push({ + filename: 'configuration.log', + filesize: logStat.size, + type: 'configurationLog', + index + }) + index = index + 1 + } + } catch (e) {} + try { + const logStat = statSync( + this.getC2DConfig().tempFolder + '/' + jobId + '/data/logs/algorithm.log' + ) + if (logStat) { + res.push({ + filename: 'algorithm.log', + filesize: logStat.size, + type: 'algorithmLog', + index + }) + index = index + 1 + } + } catch (e) {} + try { + const outputStat = statSync( + this.getC2DConfig().tempFolder + '/' + jobId + '/data/outputs/outputs.tar' + ) + if (outputStat) { + res.push({ + filename: 'outputs.tar', + filesize: outputStat.size, + type: 'output', + index + }) + index = index + 1 + } + } catch (e) {} + try { + const logStat = statSync( + this.getC2DConfig().tempFolder + '/' + jobId + '/data/logs/publish.log' + ) + if (logStat) { + res.push({ + filename: 'publish.log', + filesize: logStat.size, + type: 'publishLog', + index + }) + index = index + 1 + } + } catch (e) {} + return res + } + + // eslint-disable-next-line require-await + public override async getComputeJobStatus( + consumerAddress?: string, + agreementId?: string, + jobId?: string + ): Promise { + const jobs = await this.db.getJob(jobId, agreementId, consumerAddress) + if (jobs.length === 0) { + return [] + } + const statusResults = [] + for (const job of jobs) { + const res: ComputeJob = omitDBComputeFieldsFromComputeJob(job) + // add results for algoLogs + res.results = await this.getResults(job.jobId) + statusResults.push(res) + } + + return statusResults + } + + // eslint-disable-next-line require-await + public override async getComputeJobResult( + consumerAddress: string, + jobId: string, + index: number + ): Promise<{ stream: Readable; headers: any }> { + const jobs = await this.db.getJob(jobId, null, null) + if (jobs.length === 0 || jobs.length > 1) { + throw new Error(`Cannot find job with id ${jobId}`) + } + if ( + jobs[0].owner !== consumerAddress && + (!jobs[0].additionalViewers || !jobs[0].additionalViewers.includes(consumerAddress)) + ) { + // consumerAddress is not the owner and not in additionalViewers + throw new Error( + `${consumerAddress} is not authorized to get results for job with id ${jobId}` + ) + } + const results = await this.getResults(jobId) + for (const i of results) { + if (i.index === index) { + if (i.type === 'algorithmLog') { + return { + stream: createReadStream( + this.getC2DConfig().tempFolder + '/' + jobId + '/data/logs/algorithm.log' + ), + headers: { + 'Content-Type': 'text/plain' + } + } + } + if (i.type === 'configurationLog') { + return { + stream: createReadStream( + this.getC2DConfig().tempFolder + + '/' + + jobId + + '/data/logs/configuration.log' + ), + headers: { + 'Content-Type': 'text/plain' + } + } + } + if (i.type === 'publishLog') { + return { + stream: createReadStream( + this.getC2DConfig().tempFolder + '/' + jobId + '/data/logs/publish.log' + ), + headers: { + 'Content-Type': 'text/plain' + } + } + } + if (i.type === 'imageLog') { + return { + stream: createReadStream( + this.getC2DConfig().tempFolder + '/' + jobId + '/data/logs/image.log' + ), + headers: { + 'Content-Type': 'text/plain' + } + } + } + if (i.type === 'output') { + return { + stream: createReadStream( + this.getC2DConfig().tempFolder + '/' + jobId + '/data/outputs/outputs.tar' + ), + headers: { + 'Content-Type': 'application/octet-stream' + } + } + } + } + } + return null + } + + // eslint-disable-next-line require-await + public override async getStreamableLogs(jobId: string): Promise { + const jobRes: DBComputeJob[] = await this.db.getJob(jobId) + if (jobRes.length === 0) return null + if (!jobRes[0].isRunning) return null + try { + const job = jobRes[0] + const container = await this.docker.getContainer(job.jobId + '-algoritm') + const details = await container.inspect() + if (details.State.Running === false) return null + return await container.logs({ + stdout: true, + stderr: true, + follow: true + }) + } catch (e) { + return null + } + } + + private setNewTimer() { + if (this.cronTimer) { + return + } + // don't set the cron if we don't have compute environments + if (this.envs.length > 0) + this.cronTimer = setTimeout(this.InternalLoop.bind(this), this.cronTime) + } + + private async InternalLoop() { + // this is the internal loop of docker engine + // gets list of all running jobs and process them one by one + + // Prevent concurrent execution + if (this.isInternalLoopRunning) { + CORE_LOGGER.debug( + `InternalLoop already running for engine ${this.getC2DConfig().hash}, skipping this execution` + ) + return + } + + this.isInternalLoopRunning = true + + if (this.cronTimer) { + clearTimeout(this.cronTimer) + this.cronTimer = null + } + try { + // get all running jobs + const jobs = await this.db.getRunningJobs(this.getC2DConfig().hash) + + if (jobs.length === 0) { + CORE_LOGGER.debug('No C2D jobs found for engine ' + this.getC2DConfig().hash) + } else { + CORE_LOGGER.debug( + `Got ${jobs.length} jobs for engine ${this.getC2DConfig().hash}` + ) + } + + if (jobs.length > 0) { + const promises: any = [] + for (const job of jobs) { + promises.push(this.processJob(job)) + } + // wait for all promises, there is no return + await Promise.all(promises) + } + } catch (e) { + CORE_LOGGER.error(`Error in C2D InternalLoop: ${e.message}`) + } finally { + // Reset the flag before setting the timer + this.isInternalLoopRunning = false + // set the cron again + this.setNewTimer() + } + } + + private async createDockerContainer( + containerInfo: ContainerCreateOptions, + retry: boolean = false + ): Promise | null { + try { + const container = await this.docker.createContainer(containerInfo) + return container + } catch (e) { + CORE_LOGGER.error(`Unable to create docker container: ${e.message}`) + if ( + e.message + .toLowerCase() + .includes('--storage-opt is supported only for overlay over xfs') && + retry + ) { + delete containerInfo.HostConfig.StorageOpt + CORE_LOGGER.info('Retrying again without HostConfig.StorageOpt options...') + // Retry without that option because it does not work + return this.createDockerContainer(containerInfo) + } + return null + } + } + + private async inspectContainer(container: Dockerode.Container): Promise { + try { + const data = await container.inspect() + return data.State + } catch (e) { + CORE_LOGGER.error(`Unable to inspect docker container: ${e.message}`) + return null + } + } + + private async createDockerVolume( + volume: VolumeCreateOptions, + retry: boolean = false + ): Promise { + try { + await this.docker.createVolume(volume) + return true + } catch (e) { + CORE_LOGGER.error(`Unable to create docker volume: ${e.message}`) + if ( + e.message.toLowerCase().includes('quota size requested but no quota support') && + retry + ) { + delete volume.DriverOpts + CORE_LOGGER.info('Retrying again without DriverOpts options...') + try { + return this.createDockerVolume(volume) + } catch (e) { + CORE_LOGGER.error( + `Unable to create docker volume without DriverOpts: ${e.message}` + ) + return false + } + } + return false + } + } + + // eslint-disable-next-line require-await + private async processJob(job: DBComputeJob) { + CORE_LOGGER.info( + `Process job ${job.jobId} started: [STATUS: ${job.status}: ${job.statusText}]` + ) + + // has to : + // - monitor running containers and stop them if over limits + // - monitor disc space and clean up + /* steps: + - wait until image is ready + - create volume + - after image is ready, create the container + - download assets & algo into temp folder + - download DDOS + - tar and upload assets & algo to container + - start the container + - check if container is exceeding validUntil + - if yes, stop it + - download /data/outputs and store it locally (or upload it somewhere) + - delete the container + - delete the volume + */ + if (job.status === C2DStatusNumber.JobQueued) { + // check if we can start the job now + const now = String(Date.now() / 1000) + if (job.queueMaxWaitTime < parseFloat(now) - parseFloat(job.dateCreated)) { + job.status = C2DStatusNumber.JobQueuedExpired + job.statusText = C2DStatusText.JobQueuedExpired + job.isRunning = false + job.dateFinished = now + await this.db.updateJob(job) + await this.cleanupJob(job) + return + } + // check if resources are available now + try { + const env = await this.getComputeEnvironment( + job.payment && job.payment.chainId ? job.payment.chainId : null, + job.environment, + null + ) + await this.checkIfResourcesAreAvailable(job.resources, env, job.isFree) + } catch (err) { + // resources are still not available + return + } + // resources are now available, let's start the job + const { algorithm } = job + if (algorithm?.meta.container && algorithm?.meta.container.dockerfile) { + job.status = C2DStatusNumber.BuildImage + job.statusText = C2DStatusText.BuildImage + this.buildImage(job, null) + } else { + job.status = C2DStatusNumber.PullImage + job.statusText = C2DStatusText.PullImage + this.pullImage(job) + } + await this.db.updateJob(job) + } + + if (job.status === C2DStatusNumber.ConfiguringVolumes) { + // create the volume & create container + // TO DO C2D: Choose driver & size + // get env info + const envResource = this.envs[0].resources + const volume: VolumeCreateOptions = { + Name: job.jobId + '-volume' + } + // volume + /* const diskSize = this.getResourceRequest(job.resources, 'disk') + if (diskSize && diskSize > 0) { + volume.DriverOpts = { + o: 'size=' + String(diskSize), + device: 'local', + type: 'local' + } + } */ + const volumeCreated = await this.createDockerVolume(volume, true) + if (!volumeCreated) { + job.status = C2DStatusNumber.VolumeCreationFailed + job.statusText = C2DStatusText.VolumeCreationFailed + job.isRunning = false + job.dateFinished = String(Date.now() / 1000) + await this.db.updateJob(job) + await this.cleanupJob(job) + return + } + + // create the container + const mountVols: any = { '/data': {} } + const hostConfig: HostConfig = { + Mounts: [ + { + Type: 'volume', + Source: volume.Name, + Target: '/data', + ReadOnly: false + } + ] + } + // disk + // if (diskSize && diskSize > 0) { + // hostConfig.StorageOpt = { + // size: String(diskSize) + // } + // } + // ram + const ramSize = this.getResourceRequest(job.resources, 'ram') + if (ramSize && ramSize > 0) { + hostConfig.Memory = ramSize * 1024 * 1024 * 1024 // config is in GB, docker wants bytes + // set swap to same memory value means no swap (otherwise it use like 2X mem) + hostConfig.MemorySwap = hostConfig.Memory + } + const cpus = this.getResourceRequest(job.resources, 'cpu') + if (cpus && cpus > 0) { + hostConfig.CpuPeriod = 100000 // 100 miliseconds is usually the default + hostConfig.CpuQuota = Math.floor(cpus * hostConfig.CpuPeriod) + } + const containerInfo: ContainerCreateOptions = { + name: job.jobId + '-algoritm', + Image: job.containerImage, + AttachStdin: false, + AttachStdout: true, + AttachStderr: true, + Tty: true, + OpenStdin: false, + StdinOnce: false, + Volumes: mountVols, + HostConfig: hostConfig + } + // TO DO - iterate over resources and get default runtime + // TO DO - check resources and pass devices + const dockerDeviceRequest = this.getDockerDeviceRequest(job.resources, envResource) + if (dockerDeviceRequest) { + containerInfo.HostConfig.DeviceRequests = dockerDeviceRequest + } + const advancedConfig = this.getDockerAdvancedConfig(job.resources, envResource) + if (advancedConfig.Devices) + containerInfo.HostConfig.Devices = advancedConfig.Devices + if (advancedConfig.GroupAdd) + containerInfo.HostConfig.GroupAdd = advancedConfig.GroupAdd + if (advancedConfig.SecurityOpt) + containerInfo.HostConfig.SecurityOpt = advancedConfig.SecurityOpt + if (advancedConfig.Binds) containerInfo.HostConfig.Binds = advancedConfig.Binds + if (advancedConfig.CapAdd) containerInfo.HostConfig.CapAdd = advancedConfig.CapAdd + if (advancedConfig.CapDrop) + containerInfo.HostConfig.CapDrop = advancedConfig.CapDrop + if (advancedConfig.IpcMode) + containerInfo.HostConfig.IpcMode = advancedConfig.IpcMode + if (advancedConfig.ShmSize) + containerInfo.HostConfig.ShmSize = advancedConfig.ShmSize + if (job.algorithm?.meta.container.entrypoint) { + const newEntrypoint = job.algorithm.meta.container.entrypoint.replace( + '$ALGO', + 'data/transformations/algorithm' + ) + containerInfo.Entrypoint = newEntrypoint.split(' ') + } + if (job.algorithm.envs) { + const envVars: string[] = [] + for (const key of Object.keys(job.algorithm.envs)) { + envVars.push(`${key}=${job.algorithm.envs[key]}`) + } + containerInfo.Env = envVars + } + const container = await this.createDockerContainer(containerInfo, true) + if (container) { + job.status = C2DStatusNumber.Provisioning + job.statusText = C2DStatusText.Provisioning + await this.db.updateJob(job) + } else { + job.status = C2DStatusNumber.ContainerCreationFailed + job.statusText = C2DStatusText.ContainerCreationFailed + job.isRunning = false + job.dateFinished = String(Date.now() / 1000) + await this.db.updateJob(job) + await this.cleanupJob(job) + return + } + return + } + if (job.status === C2DStatusNumber.Provisioning) { + // download algo & assets + const ret = await this.uploadData(job) + job.status = ret.status + job.statusText = ret.statusText + if (job.status !== C2DStatusNumber.RunningAlgorithm) { + // failed, let's close it + job.isRunning = false + job.dateFinished = String(Date.now() / 1000) + await this.db.updateJob(job) + await this.cleanupJob(job) + } else { + await this.db.updateJob(job) + } + } + if (job.status === C2DStatusNumber.RunningAlgorithm) { + let container + let details + try { + container = await this.docker.getContainer(job.jobId + '-algoritm') + details = await container.inspect() + } catch (e) { + console.error( + 'Could not retrieve container: ' + + e.message + + '\nBack to configuring volumes to create the container...' + ) + job.isStarted = false + job.status = C2DStatusNumber.ConfiguringVolumes + job.statusText = C2DStatusText.ConfiguringVolumes + job.isRunning = false + await this.db.updateJob(job) + return + } + + if (job.isStarted === false) { + // make sure is not started + if (details && details.State.Running === false) { + try { + await container.start() + job.isStarted = true + job.algoStartTimestamp = String(Date.now() / 1000) + await this.db.updateJob(job) + CORE_LOGGER.info(`Container started successfully for job ${job.jobId}`) + + await this.measureContainerBaseSize(job, container) + return + } catch (e) { + // container failed to start + job.algoStartTimestamp = String(Date.now() / 1000) + job.algoStopTimestamp = String(Date.now() / 1000) + try { + const algoLogFile = + this.getC2DConfig().tempFolder + + '/' + + job.jobId + + '/data/logs/algorithm.log' + writeFileSync(algoLogFile, String(e.message)) + } catch (e) { + CORE_LOGGER.error('Failed to write algorithm log file: ' + e.message) + } + CORE_LOGGER.error('Could not start container: ' + e.message) + job.status = C2DStatusNumber.AlgorithmFailed + job.statusText = C2DStatusText.AlgorithmFailed + + job.isRunning = false + job.dateFinished = String(Date.now() / 1000) + await this.db.updateJob(job) + await this.cleanupJob(job) + return + } + } + } else { + const canContinue = await this.monitorDiskUsage(job) + if (!canContinue) { + // Job was terminated due to disk quota exceeded + return + } + + const timeNow = Date.now() / 1000 + const expiry = parseFloat(job.algoStartTimestamp) + job.maxJobDuration + CORE_LOGGER.debug( + 'container running since timeNow: ' + timeNow + ' , Expiry: ' + expiry + ) + if (timeNow > expiry || job.stopRequested) { + // we need to stop the container + // make sure is running + if (details.State.Running === true) { + try { + await container.stop() + } catch (e) { + // we should never reach this, unless the container is already stopped or deleted by someone else + CORE_LOGGER.debug('Could not stop container: ' + e.message) + } + } + job.isStarted = false + job.status = C2DStatusNumber.PublishingResults + job.statusText = C2DStatusText.PublishingResults + job.algoStopTimestamp = String(Date.now() / 1000) + job.isRunning = false + await this.db.updateJob(job) + return + } else { + if (details.State.Running === false) { + job.isStarted = false + job.status = C2DStatusNumber.PublishingResults + job.statusText = C2DStatusText.PublishingResults + job.algoStopTimestamp = String(Date.now() / 1000) + job.isRunning = false + await this.db.updateJob(job) + return + } + } + } + } + if (job.status === C2DStatusNumber.PublishingResults) { + // get output + job.status = C2DStatusNumber.JobFinished + job.statusText = C2DStatusText.JobFinished + let container + try { + container = await this.docker.getContainer(job.jobId + '-algoritm') + } catch (e) { + CORE_LOGGER.debug('Could not retrieve container: ' + e.message) + job.isRunning = false + job.dateFinished = String(Date.now() / 1000) + try { + const algoLogFile = + this.getC2DConfig().tempFolder + '/' + job.jobId + '/data/logs/algorithm.log' + writeFileSync(algoLogFile, String(e.message)) + } catch (e) { + CORE_LOGGER.error('Failed to write algorithm log file: ' + e.message) + } + await this.db.updateJob(job) + await this.cleanupJob(job) + return + } + const state = await this.inspectContainer(container) + if (state) { + job.terminationDetails.OOMKilled = state.OOMKilled + job.terminationDetails.exitCode = state.ExitCode + } else { + job.terminationDetails.OOMKilled = null + job.terminationDetails.exitCode = null + } + + const outputsArchivePath = + this.getC2DConfig().tempFolder + '/' + job.jobId + '/data/outputs/outputs.tar' + try { + if (container) { + await pipeline( + await container.getArchive({ path: '/data/outputs' }), + createWriteStream(outputsArchivePath) + ) + } + } catch (e) { + CORE_LOGGER.error('Failed to get outputs archive: ' + e.message) + job.status = C2DStatusNumber.ResultsUploadFailed + job.statusText = C2DStatusText.ResultsUploadFailed + } + job.isRunning = false + job.dateFinished = String(Date.now() / 1000) + await this.db.updateJob(job) + await this.cleanupJob(job) + } + } + + // eslint-disable-next-line require-await + private async cleanupJob(job: DBComputeJob) { + // cleaning up + // - claim payment or release lock + // - get algo logs + // - delete volume + // - delete container + + this.jobImageSizes.delete(job.jobId) + + // payments + const algoDuration = + parseFloat(job.algoStopTimestamp) - parseFloat(job.algoStartTimestamp) + + job.algoDuration = algoDuration + await this.db.updateJob(job) + if (!job.isFree && job.payment) { + let txId = null + const env = await this.getComputeEnvironment(job.payment.chainId, job.environment) + let minDuration = 0 + + if (algoDuration < 0) minDuration += algoDuration * -1 + else minDuration += algoDuration + if ( + env && + `minJobDuration` in env && + env.minJobDuration && + minDuration < env.minJobDuration + ) { + minDuration = env.minJobDuration + } + let cost = 0 + if (minDuration > 0) { + // we need to claim + const fee = env.fees[job.payment.chainId].find( + (fee) => fee.feeToken === job.payment.token + ) + cost = this.getTotalCostOfJob(job.resources, minDuration, fee) + const proof = JSON.stringify(omitDBComputeFieldsFromComputeJob(job)) + try { + txId = await this.escrow.claimLock( + job.payment.chainId, + job.jobId, + job.payment.token, + job.owner, + cost, + proof + ) + } catch (e) { + CORE_LOGGER.error('Failed to claim lock: ' + e.message) + } + } else { + // release the lock, we are not getting paid + try { + txId = await this.escrow.cancelExpiredLocks( + job.payment.chainId, + job.jobId, + job.payment.token, + job.owner + ) + } catch (e) { + CORE_LOGGER.error('Failed to release lock: ' + e.message) + } + } + if (txId) { + job.payment.claimTx = txId + job.payment.cost = cost + await this.db.updateJob(job) + } + } + try { + const container = await this.docker.getContainer(job.jobId + '-algoritm') + if (container) { + if (job.status !== C2DStatusNumber.AlgorithmFailed) { + writeFileSync( + this.getC2DConfig().tempFolder + '/' + job.jobId + '/data/logs/algorithm.log', + await container.logs({ + stdout: true, + stderr: true, + follow: false + }) + ) + } + await container.remove() + } + } catch (e) { + // console.error('Container not found! ' + e.message) + } + try { + const volume = this.docker.getVolume(job.jobId + '-volume') + if (volume) { + try { + await volume.remove() + } catch (e) { + CORE_LOGGER.error('Failed to remove volume: ' + e.message) + } + } + } catch (e) { + CORE_LOGGER.error('Container volume not found! ' + e.message) + } + if (job.algorithm?.meta.container && job.algorithm?.meta.container.dockerfile) { + const image = getAlgorithmImage(job.algorithm, job.jobId) + if (image) { + try { + await this.docker.getImage(image).remove({ force: true }) + } catch (e) { + CORE_LOGGER.error('Could not delete image: ' + image + ' : ' + e.message) + } + } + } + try { + // remove folders + rmSync(this.getC2DConfig().tempFolder + '/' + job.jobId + '/data/inputs', { + recursive: true, + force: true + }) + } catch (e) { + console.error( + `Could not delete inputs from path ${this.getC2DConfig().tempFolder} for job ID ${ + job.jobId + }! ` + e.message + ) + } + try { + rmSync(this.getC2DConfig().tempFolder + '/' + job.jobId + '/data/transformations', { + recursive: true, + force: true + }) + } catch (e) { + console.error( + `Could not delete algorithms from path ${ + this.getC2DConfig().tempFolder + } for job ID ${job.jobId}! ` + e.message + ) + } + } + + private deleteOutputFolder(job: DBComputeJob) { + rmSync(this.getC2DConfig().tempFolder + '/' + job.jobId + '/data/outputs/', { + recursive: true, + force: true + }) + } + + private getDiskQuota(job: DBComputeJob): number { + if (!job.resources) return 0 + + const diskResource = job.resources.find((resource) => resource.id === 'disk') + return diskResource ? diskResource.amount : 0 + } + + // Inspect the real runtime size of the container + private async measureContainerBaseSize( + job: DBComputeJob, + container: Dockerode.Container + ): Promise { + try { + if (this.jobImageSizes.has(job.jobId)) { + CORE_LOGGER.debug(`Using cached base size for job ${job.jobId.slice(-8)}`) + return + } + + // Wait for container filesystem to stabilize + await new Promise((resolve) => setTimeout(resolve, 3000)) + + const actualBaseSize = await this.getContainerDiskUsage(container.id, '/') + this.jobImageSizes.set(job.jobId, actualBaseSize) + + CORE_LOGGER.info( + `Base container ${job.containerImage} runtime size: ${( + actualBaseSize / + 1024 / + 1024 / + 1024 + ).toFixed(2)}GB` + ) + } catch (error) { + CORE_LOGGER.error(`Failed to measure base container size: ${error.message}`) + this.jobImageSizes.set(job.jobId, 0) + } + } + + private async getContainerDiskUsage( + containerName: string, + path: string = '/data' + ): Promise { + try { + const container = this.docker.getContainer(containerName) + const containerInfo = await container.inspect() + if (!containerInfo.State.Running) { + CORE_LOGGER.debug( + `Container ${containerName} is not running, cannot check disk usage` + ) + return 0 + } + + const exec = await container.exec({ + Cmd: ['du', '-sb', path], + AttachStdout: true, + AttachStderr: true + }) + + const stream = await exec.start({ Detach: false, Tty: false }) + + const chunks: Buffer[] = [] + for await (const chunk of stream) { + chunks.push(chunk as Buffer) + } + + const output = Buffer.concat(chunks).toString() + + const match = output.match(/(\d+)\s/) + return match ? parseInt(match[1], 10) : 0 + } catch (error) { + CORE_LOGGER.error( + `Failed to get container disk usage for ${containerName}: ${error.message}` + ) + return 0 + } + } + + private async monitorDiskUsage(job: DBComputeJob): Promise { + const diskQuota = this.getDiskQuota(job) + if (diskQuota <= 0) return true + + const containerName = job.jobId + '-algoritm' + const totalUsage = await this.getContainerDiskUsage(containerName, '/') + const baseImageSize = this.jobImageSizes.get(job.jobId) || 0 + const algorithmUsage = Math.max(0, totalUsage - baseImageSize) + + const usageGB = (algorithmUsage / 1024 / 1024 / 1024).toFixed(2) + const quotaGB = diskQuota.toFixed(1) + const usagePercent = ( + (algorithmUsage / 1024 / 1024 / 1024 / diskQuota) * + 100 + ).toFixed(1) + + CORE_LOGGER.info( + `Job ${job.jobId.slice(-8)} disk: ${usageGB}GB / ${quotaGB}GB (${usagePercent}%)` + ) + + if (algorithmUsage / 1024 / 1024 / 1024 > diskQuota) { + CORE_LOGGER.warn( + `DISK QUOTA EXCEEDED - Stopping job ${job.jobId}: ${usageGB}GB used, ${quotaGB}GB allowed` + ) + + try { + const container = this.docker.getContainer(containerName) + await container.stop() + CORE_LOGGER.info(`Container stopped for job ${job.jobId}`) + } catch (e) { + CORE_LOGGER.warn(`Could not stop container: ${e.message}`) + } + + job.status = C2DStatusNumber.DiskQuotaExceeded + job.statusText = C2DStatusText.DiskQuotaExceeded + job.isRunning = false + job.isStarted = false + job.algoStopTimestamp = String(Date.now() / 1000) + job.dateFinished = String(Date.now() / 1000) + + await this.db.updateJob(job) + CORE_LOGGER.info(`Job ${job.jobId} terminated - DISK QUOTA EXCEEDED`) + + return false + } + + return true + } + + private async pullImage(originaljob: DBComputeJob) { + const job = JSON.parse(JSON.stringify(originaljob)) as DBComputeJob + const imageLogFile = + this.getC2DConfig().tempFolder + '/' + job.jobId + '/data/logs/image.log' + try { + const pullStream = await this.docker.pull(job.containerImage) + await new Promise((resolve, reject) => { + let wroteStatusBanner = false + this.docker.modem.followProgress( + pullStream, + (err: any, res: any) => { + // onFinished + if (err) { + appendFileSync(imageLogFile, String(err.message)) + return reject(err) + } + const logText = `Successfully pulled image: ${job.containerImage}` + CORE_LOGGER.debug(logText) + appendFileSync(imageLogFile, logText + '\n') + // Track image usage + this.updateImageUsage(job.containerImage).catch((e) => { + CORE_LOGGER.debug(`Failed to track image usage: ${e.message}`) + }) + resolve(res) + }, + (progress: any) => { + // onProgress + if (!wroteStatusBanner) { + wroteStatusBanner = true + CORE_LOGGER.debug('############# Pull docker image status: ##############') + } + // only write the status banner once, its cleaner + let logText = '' + if (progress.id) logText += progress.id + ' : ' + progress.status + else logText = progress.status + CORE_LOGGER.debug("Pulling image for jobId '" + job.jobId + "': " + logText) + appendFileSync(imageLogFile, logText + '\n') + } + ) + }) + job.status = C2DStatusNumber.ConfiguringVolumes + job.statusText = C2DStatusText.ConfiguringVolumes + this.db.updateJob(job) + } catch (err) { + const logText = `Unable to pull docker image: ${job.containerImage}: ${err.message}` + CORE_LOGGER.error(logText) + appendFileSync(imageLogFile, logText) + job.status = C2DStatusNumber.PullImageFailed + job.statusText = C2DStatusText.PullImageFailed + job.isRunning = false + job.dateFinished = String(Date.now() / 1000) + await this.db.updateJob(job) + await this.cleanupJob(job) + } + } + + private async buildImage( + originaljob: DBComputeJob, + additionalDockerFiles: { [key: string]: any } + ) { + const job = JSON.parse(JSON.stringify(originaljob)) as DBComputeJob + const imageLogFile = + this.getC2DConfig().tempFolder + '/' + job.jobId + '/data/logs/image.log' + try { + const pack = tarStream.pack() + + // Append the Dockerfile to the tar archive + pack.entry({ name: 'Dockerfile' }, job.algorithm.meta.container.dockerfile) + // Append any additional files to the tar archive + if (additionalDockerFiles) { + for (const filePath of Object.keys(additionalDockerFiles)) { + pack.entry({ name: filePath }, additionalDockerFiles[filePath]) + } + } + pack.finalize() + + // Build the image using the tar stream as context + const buildStream = await this.docker.buildImage(pack, { + t: job.containerImage + }) + + // Optional: listen to build output + buildStream.on('data', (data) => { + try { + const text = JSON.parse(data.toString('utf8')) + CORE_LOGGER.debug( + "Building image for jobId '" + job.jobId + "': " + text.stream.trim() + ) + appendFileSync(imageLogFile, String(text.stream)) + } catch (e) { + // console.log('non json build data: ', data.toString('utf8')) + } + }) + + await new Promise((resolve, reject) => { + buildStream.on('end', () => { + CORE_LOGGER.debug(`Image '${job.containerImage}' built successfully.`) + resolve() + }) + buildStream.on('error', (err) => { + CORE_LOGGER.debug(`Error building image '${job.containerImage}':` + err.message) + appendFileSync(imageLogFile, String(err.message)) + reject(err) + }) + }) + job.status = C2DStatusNumber.ConfiguringVolumes + job.statusText = C2DStatusText.ConfiguringVolumes + this.db.updateJob(job) + } catch (err) { + CORE_LOGGER.error( + `Unable to build docker image: ${job.containerImage}: ${err.message}` + ) + appendFileSync(imageLogFile, String(err.message)) + job.status = C2DStatusNumber.BuildImageFailed + job.statusText = C2DStatusText.BuildImageFailed + job.isRunning = false + job.dateFinished = String(Date.now() / 1000) + await this.db.updateJob(job) + await this.cleanupJob(job) + } + } + + private addUserDataToFilesObject( + filesObject: any, + userData: { [key: string]: any } + ): any { + if (filesObject?.url && userData) { + const url = new URL(filesObject.url) + const userDataObj = typeof userData === 'string' ? JSON.parse(userData) : userData + for (const [key, value] of Object.entries(userDataObj)) { + url.searchParams.append(key, String(value)) + } + filesObject.url = url.toString() + CORE_LOGGER.info('Appended userData to file url: ' + filesObject.url) + } + return filesObject + } + + private async uploadData( + job: DBComputeJob + ): Promise<{ status: C2DStatusNumber; statusText: C2DStatusText }> { + const config = await getConfiguration() + const ret = { + status: C2DStatusNumber.RunningAlgorithm, + statusText: C2DStatusText.RunningAlgorithm + } + const jobFolderPath = this.getC2DConfig().tempFolder + '/' + job.jobId + const fullAlgoPath = jobFolderPath + '/data/transformations/algorithm' + const configLogPath = jobFolderPath + '/data/logs/configuration.log' + + try { + appendFileSync( + configLogPath, + "Writing algocustom data to '/data/inputs/algoCustomData.json'\n" + ) + const customdataPath = + this.getC2DConfig().tempFolder + + '/' + + job.jobId + + '/data/inputs/algoCustomData.json' + writeFileSync(customdataPath, JSON.stringify(job.algorithm.algocustomdata ?? {})) + + let storage = null + + if (job.algorithm.meta.rawcode && job.algorithm.meta.rawcode.length > 0) { + // we have the code, just write it + appendFileSync(configLogPath, `Writing raw algo code to ${fullAlgoPath}\n`) + writeFileSync(fullAlgoPath, job.algorithm.meta.rawcode) + } else { + // do we have a files object? + if (job.algorithm.fileObject) { + // is it unencrypted? + if (job.algorithm.fileObject.type) { + // we can get the storage directly + try { + storage = Storage.getStorageClass(job.algorithm.fileObject, config) + } catch (e) { + CORE_LOGGER.error(`Unable to get storage class for algorithm: ${e.message}`) + appendFileSync( + configLogPath, + `Unable to get storage class for algorithm: ${e.message}\n` + ) + return { + status: C2DStatusNumber.AlgorithmProvisioningFailed, + statusText: C2DStatusText.AlgorithmProvisioningFailed + } + } + } else { + // ok, maybe we have this encrypted instead + CORE_LOGGER.info( + 'algorithm file object seems to be encrypted, checking it...' + ) + // 1. Decrypt the files object + try { + const decryptedFileObject = await decryptFilesObject( + job.algorithm.fileObject + ) + storage = Storage.getStorageClass(decryptedFileObject, config) + } catch (e) { + CORE_LOGGER.error(`Unable to decrypt algorithm files object: ${e.message}`) + appendFileSync( + configLogPath, + `Unable to decrypt algorithm files object: ${e.message}\n` + ) + return { + status: C2DStatusNumber.AlgorithmProvisioningFailed, + statusText: C2DStatusText.AlgorithmProvisioningFailed + } + } + } + } else { + // no files object, try to get information from documentId and serviceId + CORE_LOGGER.info( + 'algorithm file object seems to be missing, checking "serviceId" and "documentId"...' + ) + const { serviceId, documentId } = job.algorithm + appendFileSync( + configLogPath, + `Using ${documentId} and serviceId ${serviceId} to get algorithm files.\n` + ) + // we can get it from this info + if (serviceId && documentId) { + const algoDdo = await new FindDdoHandler( + OceanNode.getInstance() + ).findAndFormatDdo(documentId) + // 1. Get the service + const service: Service = AssetUtils.getServiceById(algoDdo, serviceId) + if (!service) { + CORE_LOGGER.error( + `Could not find service with ID ${serviceId} in DDO ${documentId}` + ) + appendFileSync( + configLogPath, + `Could not find service with ID ${serviceId} in DDO ${documentId}\n` + ) + return { + status: C2DStatusNumber.AlgorithmProvisioningFailed, + statusText: C2DStatusText.AlgorithmProvisioningFailed + } + } + try { + // 2. Decrypt the files object + const decryptedFileObject = await decryptFilesObject(service.files) + storage = Storage.getStorageClass(decryptedFileObject, config) + } catch (e) { + CORE_LOGGER.error(`Unable to decrypt algorithm files object: ${e.message}`) + appendFileSync( + configLogPath, + `Unable to decrypt algorithm files object: ${e.message}\n` + ) + return { + status: C2DStatusNumber.AlgorithmProvisioningFailed, + statusText: C2DStatusText.AlgorithmProvisioningFailed + } + } + } + } + + if (storage) { + await pipeline( + (await storage.getReadableStream()).stream, + createWriteStream(fullAlgoPath) + ) + } else { + CORE_LOGGER.info( + 'Could not extract any files object from the compute algorithm, skipping...' + ) + appendFileSync( + configLogPath, + 'Could not extract any files object from the compute algorithm, skipping...\n' + ) + } + } + } catch (e) { + CORE_LOGGER.error( + 'Unable to write algorithm to path: ' + fullAlgoPath + ': ' + e.message + ) + appendFileSync( + configLogPath, + 'Unable to write algorithm to path: ' + fullAlgoPath + ': ' + e.message + '\n' + ) + return { + status: C2DStatusNumber.AlgorithmProvisioningFailed, + statusText: C2DStatusText.AlgorithmProvisioningFailed + } + } + + // now for the assets + for (const i in job.assets) { + const asset = job.assets[i] + let storage = null + let fileInfo = null + appendFileSync(configLogPath, `Downloading asset ${i} to /data/inputs/\n`) + // without this check it would break if no fileObject is present + if (asset.fileObject) { + try { + if (asset.fileObject.type) { + storage = Storage.getStorageClass(asset.fileObject, config) + } else { + CORE_LOGGER.info('asset file object seems to be encrypted, checking it...') + // get the encrypted bytes + let filesObject: any = await decryptFilesObject(asset.fileObject) + filesObject = await this.addUserDataToFilesObject(filesObject, asset.userdata) + storage = Storage.getStorageClass(filesObject, config) + } + + // we need the file info for the name (but could be something else here) + fileInfo = await storage.getFileInfo({ + type: storage.getStorageType(asset.fileObject) + }) + } catch (e) { + CORE_LOGGER.error(`Unable to get storage class for asset: ${e.message}`) + appendFileSync( + configLogPath, + `Unable to get storage class for asset: ${e.message}\n` + ) + return { + status: C2DStatusNumber.DataProvisioningFailed, + statusText: C2DStatusText.DataProvisioningFailed + } + } + } else { + // we need to go the hard way + const { serviceId, documentId } = asset + appendFileSync( + configLogPath, + `Using ${documentId} and serviceId ${serviceId} for this asset.\n` + ) + if (serviceId && documentId) { + // need to get the file + try { + const ddo = await new FindDdoHandler( + OceanNode.getInstance() + ).findAndFormatDdo(documentId) + // 2. Get the service + const service: Service = AssetUtils.getServiceById(ddo, serviceId) + // 3. Decrypt the url + let decryptedFileObject = await decryptFilesObject(service.files) + decryptedFileObject = await this.addUserDataToFilesObject( + decryptedFileObject, + asset.userdata + ) + storage = Storage.getStorageClass(decryptedFileObject, config) + fileInfo = await storage.getFileInfo({ + type: storage.getStorageType(decryptedFileObject) + }) + } catch (e) { + CORE_LOGGER.error(`Unable to get storage class for asset: ${e.message}`) + appendFileSync( + configLogPath, + `Unable to get storage class for asset: ${e.message}\n` + ) + return { + status: C2DStatusNumber.DataProvisioningFailed, + statusText: C2DStatusText.DataProvisioningFailed + } + } + } + } + + if (storage && fileInfo) { + const fullPath = jobFolderPath + '/data/inputs/' + fileInfo[0].name + appendFileSync(configLogPath, `Downloading asset to ${fullPath}\n`) + try { + await pipeline( + (await storage.getReadableStream()).stream, + createWriteStream(fullPath) + ) + } catch (e) { + CORE_LOGGER.error( + 'Unable to write input data to path: ' + fullPath + ': ' + e.message + ) + appendFileSync( + configLogPath, + 'Unable to write input data to path: ' + fullPath + ': ' + e.message + '\n' + ) + return { + status: C2DStatusNumber.DataProvisioningFailed, + statusText: C2DStatusText.DataProvisioningFailed + } + } + } else { + CORE_LOGGER.info( + 'Could not extract any files object from the compute asset, skipping...' + ) + appendFileSync( + configLogPath, + 'Could not extract any files object from the compute asset, skipping...\n' + ) + } + } + CORE_LOGGER.info('All good with data provisioning, will start uploading it...') + appendFileSync( + configLogPath, + 'All good with data provisioning, will start uploading it...\n' + ) + // now, we have to create a tar arhive + const folderToTar = jobFolderPath + '/data' + const destination = jobFolderPath + '/tarData/upload.tar.gz' + try { + tar.create( + { + gzip: true, + file: destination, + sync: true, + C: folderToTar + }, + ['./'] + ) + // check if tar.gz actually exists + + if (existsSync(destination)) { + // now, upload it to the container + const container = await this.docker.getContainer(job.jobId + '-algoritm') + + try { + // await container2.putArchive(destination, { + await container.putArchive(destination, { + path: '/data' + }) + } catch (e) { + appendFileSync( + configLogPath, + 'Data upload to container failed: ' + e.message + '\n' + ) + return { + status: C2DStatusNumber.DataUploadFailed, + statusText: C2DStatusText.DataUploadFailed + } + } + } else { + CORE_LOGGER.debug('No data to upload, empty tar.gz') + appendFileSync(configLogPath, `No data to upload, empty tar.gz\n`) + } + } catch (e) { + CORE_LOGGER.debug(e.message) + appendFileSync(configLogPath, `Error creating data archive: ${e.message}\n`) + return { + status: C2DStatusNumber.DataProvisioningFailed, + statusText: C2DStatusText.DataProvisioningFailed + } + } + + rmSync(jobFolderPath + '/data/inputs', { + recursive: true, + force: true + }) + rmSync(jobFolderPath + '/data/transformations', { + recursive: true, + force: true + }) + rmSync(jobFolderPath + '/tarData', { + recursive: true, + force: true + }) + return ret + } + + // eslint-disable-next-line require-await + private async makeJobFolders(job: DBComputeJob) { + try { + const baseFolder = this.getC2DConfig().tempFolder + '/' + job.jobId + if (!existsSync(baseFolder)) mkdirSync(baseFolder) + if (!existsSync(baseFolder + '/data')) mkdirSync(baseFolder + '/data') + if (!existsSync(baseFolder + '/data/inputs')) mkdirSync(baseFolder + '/data/inputs') + if (!existsSync(baseFolder + '/data/transformations')) + mkdirSync(baseFolder + '/data/transformations') + // ddo directory + if (!existsSync(baseFolder + '/data/ddos')) { + mkdirSync(baseFolder + '/data/ddos') + } + if (!existsSync(baseFolder + '/data/outputs')) + mkdirSync(baseFolder + '/data/outputs') + if (!existsSync(baseFolder + '/data/logs')) mkdirSync(baseFolder + '/data/logs') + if (!existsSync(baseFolder + '/tarData')) mkdirSync(baseFolder + '/tarData') // used to upload and download data + } catch (e) {} + } + + // clean up temporary files + public override async cleanupExpiredStorage( + job: DBComputeJob, + isCleanAfterDownload: boolean = false + ): Promise { + if (!job) return false + CORE_LOGGER.info('Cleaning up C2D storage for Job: ' + job.jobId) + try { + // delete the storage + // for free env, the container is deleted as soon as we download the results + // so we avoid trying to do it again + if (!isCleanAfterDownload) { + await this.cleanupJob(job) + } + + // delete output folders + await this.deleteOutputFolder(job) + // delete the job + await this.db.deleteJob(job.jobId) + return true + } catch (e) { + CORE_LOGGER.error('Error cleaning up C2D storage and Job: ' + e.message) + } + return false + } +} + +// this uses the docker engine, but exposes only one env, the free one + +export function getAlgorithmImage(algorithm: ComputeAlgorithm, jobId: string): string { + if (!algorithm.meta || !algorithm.meta.container) { + return null + } + if (algorithm.meta.container.dockerfile) { + return jobId.toLowerCase() + '-image:latest' + } + let { image } = algorithm.meta.container + if (algorithm.meta.container.checksum) + image = image + '@' + algorithm.meta.container.checksum + else if (algorithm.meta.container.tag) + image = image + ':' + algorithm.meta.container.tag + else image = image + ':latest' + // console.log('Using image: ' + image) + return image +} + +export function checkManifestPlatform( + manifestPlatform: any, + envPlatform?: RunningPlatform +): boolean { + if (!manifestPlatform || !envPlatform) return true // skips if not present + if (envPlatform.architecture === 'amd64') envPlatform.architecture = 'x86_64' // x86_64 is compatible with amd64 + if (manifestPlatform.architecture === 'amd64') manifestPlatform.architecture = 'x86_64' // x86_64 is compatible with amd64 + + if ( + envPlatform.architecture !== manifestPlatform.architecture || + envPlatform.os !== manifestPlatform.os + ) + return false + return true +} diff --git a/src/components/c2d/compute_engine_opf_k8.ts b/src/components/c2d/compute_engine_opf_k8.ts deleted file mode 100644 index 9956cdcf2..000000000 --- a/src/components/c2d/compute_engine_opf_k8.ts +++ /dev/null @@ -1,284 +0,0 @@ -import { Readable } from 'stream' -import type { - C2DClusterInfo, - ComputeEnvironment, - ComputeAlgorithm, - ComputeAsset, - ComputeJob, - ComputeOutput, - OPFK8ComputeStage, - OPFK8ComputeStageAlgorithm, - OPFK8ComputeStageInput, - OPFK8ComputeWorkflow, - OPFK8ComputeStart, - OPFK8ComputeStop, - OPFK8ComputeGetStatus, - OPFK8ComputeGetResult -} from '../../@types/C2D.js' -import { sign } from '../core/utils/nonceHandler.js' -import axios from 'axios' -import { getConfiguration } from '../../utils/config.js' -import { ZeroAddress } from 'ethers' -import { getProviderFeeToken } from '../../components/core/utils/feesHandler.js' -import { URLUtils } from '../../utils/url.js' -import { C2DEngine } from './compute_engine_base.js' - -export class C2DEngineOPFK8 extends C2DEngine { - // eslint-disable-next-line no-useless-constructor - public constructor(clusterConfig: C2DClusterInfo) { - super(clusterConfig) - } - - public override async getComputeEnvironments( - chainId: number - ): Promise { - /** - * Returns all cluster's compute environments for a specific chainId. Env's id already contains the cluster hash - */ - const envs: ComputeEnvironment[] = [] - const clusterHash = this.getC2DConfig().hash - const baseUrl = URLUtils.sanitizeURLPath(this.getC2DConfig().connection) - const url = `${baseUrl}api/v1/operator/environments?chain_id=${chainId}` - try { - const { data } = await axios.get(url) - if (!data) return envs - // we need to add hash to each env id - for (const [index, val] of data.entries()) { - data[index].id = `${clusterHash}-${val.id}` - if (!data[index].feeToken || data[index].feeToken?.toLowerCase() === ZeroAddress) - data[index].feeToken = await getProviderFeeToken(chainId) - } - return data - } catch {} - return envs - } - - public override async startComputeJob( - assets: ComputeAsset[], - algorithm: ComputeAlgorithm, - output: ComputeOutput, - owner: string, - environment: string, - validUntil: number, - chainId: number, - agreementId: string - ): Promise { - // let's build the stage first - // start with stage.input - const config = await getConfiguration() - const stagesInput: OPFK8ComputeStageInput[] = [] - let index = 0 - for (const asset of assets) { - if (asset.url) - stagesInput.push({ - index, - url: [asset.url] - }) - else - stagesInput.push({ - index, - id: asset.documentId, - remote: { - txId: asset.transferTxId, - serviceId: asset.serviceId, - userdata: asset.userdata ? asset.userdata : {} - } - }) - index++ - } - let getOuput = {} - if (output) { - getOuput = output - } else if (config.hasHttp && config.c2dNodeUri) { - getOuput = { - metadataUri: config.c2dNodeUri - } - } - // continue with algorithm - const stageAlgorithm: OPFK8ComputeStageAlgorithm = {} - if (algorithm.url) { - stageAlgorithm.url = algorithm.url - } else { - stageAlgorithm.remote = { - txId: algorithm.transferTxId, - serviceId: algorithm.serviceId, - userdata: algorithm.userdata ? algorithm.userdata : {} - } - } - if (algorithm.documentId) stageAlgorithm.id = algorithm.documentId - if ('meta' in algorithm && 'rawcode' in algorithm.meta && algorithm.meta.rawcode) - stageAlgorithm.rawcode = algorithm.meta.rawcode - if ('meta' in algorithm && 'container' in algorithm.meta && algorithm.meta.container) - stageAlgorithm.container = algorithm.meta.container - const stage: OPFK8ComputeStage = { - index: 0, - input: stagesInput, - algorithm: stageAlgorithm, - output: getOuput, - compute: { - Instances: 1, - namespace: environment, - maxtime: 3600 - } - } - // now, let's build the workflow - const workflow: OPFK8ComputeWorkflow = { - stages: [stage] - } - // and the full payload - const nonce: number = new Date().getTime() - const providerSignature = await sign(String(nonce), config.keys.privateKey) - const payload: OPFK8ComputeStart = { - workflow, - owner, - providerSignature, - providerAddress: config.keys.ethAddress, - environment, - validUntil, - nonce, - agreementId, - chainId - } - // and send it to remote op-service - - try { - const response = await axios({ - method: 'post', - url: `${URLUtils.sanitizeURLPath( - this.getC2DConfig().connection - )}api/v1/operator/compute`, - data: payload - }) - if (response.status !== 200) { - const message = `Exception on startCompute. Status: ${response.status}, ${response.statusText}` - throw new Error(message) - } - const jobs: ComputeJob[] = response.data - const newResponse = JSON.parse(JSON.stringify(jobs)) as ComputeJob[] - const { hash } = this.getC2DConfig() - // we need to prepend cluster hash to each jobId - for (let i = 0; i < jobs.length; i++) { - newResponse[i].jobId = hash + '-' + jobs[i].jobId - } - return newResponse - } catch (e) {} - throw new Error(`startCompute Failure`) - } - - public override async stopComputeJob( - jobId: string, - owner: string, - agreementId?: string - ): Promise { - // and the full payload - const nonce: number = new Date().getTime() - const config = await getConfiguration() - // current provider (python) signature is owner + job_id + nonce OR owner + nonce - const providerSignature = await sign(String(nonce), config.keys.privateKey) - const payload: OPFK8ComputeStop = { - owner, - providerSignature, - providerAddress: config.keys.ethAddress, - nonce, - jobId, - agreementId - } - try { - const response = await axios({ - method: 'put', - url: `${URLUtils.sanitizeURLPath( - this.getC2DConfig().connection - )}api/v1/operator/compute`, - data: payload - }) - if (response.status !== 200) { - const message = `Exception on stopCompute. Status: ${response.status}, ${response.statusText}` - throw new Error(message) - } - return response.data - } catch (e) {} - throw new Error(`stopCompute Failure`) - } - - public override async getComputeJobStatus( - consumerAddress?: string, - agreementId?: string, - jobId?: string - ): Promise { - const nonce: number = new Date().getTime() - const config = await getConfiguration() - let message: string - if (jobId) message = String(nonce + consumerAddress + jobId) - else message = String(nonce + consumerAddress + jobId) - const providerSignature = await sign(message, config.keys.privateKey) - - const payload: OPFK8ComputeGetStatus = { - providerSignature, - providerAddress: config.keys.ethAddress, - nonce, - owner: consumerAddress, - agreementId, - jobId - } - try { - const response = await axios({ - method: 'get', - url: `${URLUtils.sanitizeURLPath( - this.getC2DConfig().connection - )}api/v1/operator/compute`, - data: payload - }) - if (response.status !== 200) { - // do not throw, just return [] - return [] - } - - return response.data - } catch (e) { - console.error(e) - } - throw new Error(`getComputeJobStatus Failure`) - } - - public override async getComputeJobResult( - consumerAddress: string, - jobId: string, - index: number - ): Promise { - const nonce: number = new Date().getTime() - const config = await getConfiguration() - // signature check on operator service is only owner + jobId - // nonce is not part of signature message - const message: string = jobId - ? String(consumerAddress + jobId) - : String(consumerAddress) - const providerSignature = await sign(message, config.keys.privateKey) - - const payload: OPFK8ComputeGetResult = { - providerSignature, - providerAddress: config.keys.ethAddress, - nonce, - owner: consumerAddress, - jobId, - index - } - try { - const response = await axios({ - method: 'get', - url: `${URLUtils.sanitizeURLPath( - this.getC2DConfig().connection - )}api/v1/operator/getResult`, - data: payload, - responseType: 'stream' - }) - if (response.status !== 200) { - const message = `Exception on getComputeJobResult. Status: ${response.status}, ${response.statusText}` - throw new Error(message) - } - return response.data - } catch (e) { - console.error(e) - } - throw new Error(`getComputeJobStatus Failure`) - } -} diff --git a/src/components/c2d/compute_engines.ts b/src/components/c2d/compute_engines.ts index 9991ac9e4..24d7cd46b 100644 --- a/src/components/c2d/compute_engines.ts +++ b/src/components/c2d/compute_engines.ts @@ -1,17 +1,29 @@ -import { C2DClusterType, ComputeEnvironment } from '../../@types/C2D.js' +import { C2DClusterType, ComputeEnvironment } from '../../@types/C2D/C2D.js' import { C2DEngine } from './compute_engine_base.js' -import { C2DEngineOPFK8 } from './compute_engine_opf_k8.js' +import { C2DEngineDocker } from './compute_engine_docker.js' import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { C2DDatabase } from '../database/C2DDatabase.js' +import { Escrow } from '../core/utils/escrow.js' +import { KeyManager } from '../KeyManager/index.js' export class C2DEngines { public engines: C2DEngine[] - public constructor(config: OceanNodeConfig) { + public constructor( + config: OceanNodeConfig, + db: C2DDatabase, + escrow: Escrow, + keyManager: KeyManager + ) { // let's see what engines do we have and initialize them one by one + // for docker, we need to add the "free" + + // TO DO - check if we have multiple config.c2dClusters with the same host + // if yes, do not create multiple engines if (config && config.c2dClusters) { this.engines = [] for (const cluster of config.c2dClusters) { - if (cluster.type === C2DClusterType.OPF_K8) { - this.engines.push(new C2DEngineOPFK8(cluster)) + if (cluster.type === C2DClusterType.DOCKER) { + this.engines.push(new C2DEngineDocker(cluster, db, escrow, keyManager)) } } } @@ -64,8 +76,25 @@ export class C2DEngines { throw new Error(`C2D Engine not found by hash: ${clusterHash}`) } + async getC2DByEnvId(envId: string): Promise { + /** + * Searches all envs and returns engine class + * + * @param envId - Environment Id + * + */ + const { engines } = this + for (const i of engines) { + const environments = await i.getComputeEnvironments() + for (const env of environments) { + if (env.id === envId) return i + } + } + throw new Error(`C2D Engine not found by id: ${envId}`) + } + async fetchEnvironments( - chainId: number, + chainId?: number, engine?: C2DEngine ): Promise { /** diff --git a/src/components/c2d/index.ts b/src/components/c2d/index.ts index 5e7fb9cfc..8f0470c96 100644 --- a/src/components/c2d/index.ts +++ b/src/components/c2d/index.ts @@ -1,48 +1,62 @@ import { OceanNode } from '../../OceanNode.js' -import { CORE_LOGGER } from '../../utils/logging/common.js' import { createHash } from 'crypto' import { FindDdoHandler } from '../core/handler/ddoHandler.js' -import { getConfiguration } from '../../utils/config.js' -import { ComputeGetEnvironmentsHandler } from '../core/compute/index.js' -import { PROTOCOL_COMMANDS } from '../../utils/constants.js' -import { streamToObject } from '../../utils/util.js' -import { Readable } from 'stream' import { ArweaveFileObject, IpfsFileObject, - UrlFileObject + UrlFileObject, + BaseFileObject, + EncryptMethod } from '../../@types/fileObject.js' -import { AlgoChecksums } from '../../@types/C2D.js' -import { DDO } from '../../@types/DDO/DDO.js' import { getFile } from '../../utils/file.js' import urlJoin from 'url-join' import { fetchFileMetadata } from '../../utils/asset.js' +import { DDO, DDOManager } from '@oceanprotocol/ddo-js' +import { deleteKeysFromObject, sanitizeServiceFiles } from '../../utils/util.js' + +import { CORE_LOGGER } from '../../utils/logging/common.js' +import { AlgoChecksums, ComputeJob, DBComputeJob } from '../../@types/index.js' export { C2DEngine } from './compute_engine_base.js' -export async function checkC2DEnvExists( - envId: string, - oceanNode: OceanNode -): Promise { - const config = await getConfiguration() - const { supportedNetworks } = config - for (const supportedNetwork of Object.keys(supportedNetworks)) { - const getEnvironmentsTask = { - command: PROTOCOL_COMMANDS.COMPUTE_GET_ENVIRONMENTS, - chainId: parseInt(supportedNetwork) - } - const response = await new ComputeGetEnvironmentsHandler(oceanNode).handle( - getEnvironmentsTask - ) - if (response.status.httpStatus === 200) { - const computeEnvironments = await streamToObject(response.stream as Readable) - for (const computeEnvironment of computeEnvironments[parseInt(supportedNetwork)]) { - if (computeEnvironment.id === envId) { - return true - } - } - } +export async function decryptFilesObject( + serviceFiles: any +): Promise { + const node = OceanNode.getInstance() + + try { + // 2. Decrypt the url + const decryptedUrlBytes = await node + .getKeyManager() + .decrypt( + Uint8Array.from(Buffer.from(sanitizeServiceFiles(serviceFiles), 'hex')), + EncryptMethod.ECIES + ) + + // 3. Convert the decrypted bytes back to a string + const decryptedFilesString = Buffer.from(decryptedUrlBytes as Uint8Array).toString() + const decryptedFileArray = JSON.parse(decryptedFilesString) + + return decryptedFileArray.files[0] + } catch (err) { + CORE_LOGGER.error('Error decrypting files object: ' + err.message) + return null } - return false +} + +export function omitDBComputeFieldsFromComputeJob(dbCompute: DBComputeJob): ComputeJob { + const job: ComputeJob = deleteKeysFromObject(dbCompute, [ + 'clusterHash', + 'configlogURL', + 'publishlogURL', + 'algologURL', + 'outputsURL', + // 'algorithm', + // 'assets', + 'isRunning', + 'isStarted', + 'containerImage' + ]) as ComputeJob + return job } export async function getAlgoChecksums( @@ -77,11 +91,11 @@ export async function getAlgoChecksums( const { contentChecksum } = await fetchFileMetadata(url, 'get', false) checksums.files = checksums.files.concat(contentChecksum) } - + const ddoInstance = DDOManager.getDDOClass(algoDDO) + const { metadata } = ddoInstance.getDDOFields() as any checksums.container = createHash('sha256') .update( - algoDDO.metadata.algorithm.container.entrypoint + - algoDDO.metadata.algorithm.container.checksum + metadata.algorithm.container.entrypoint + metadata.algorithm.container.checksum ) .digest('hex') return checksums @@ -97,13 +111,15 @@ export async function validateAlgoForDataset( files: string container: string }, - datasetDDO: DDO, + datasetDDO: DDO | Record, datasetServiceId: string, oceanNode: OceanNode ) { try { - const datasetService = datasetDDO.services.find( - (service) => service.id === datasetServiceId + const ddoInstance = DDOManager.getDDOClass(datasetDDO) + const { services } = ddoInstance.getDDOFields() as any + const datasetService = services.find( + (service: any) => service.id === datasetServiceId ) if (!datasetService) { throw new Error('Dataset service not found') @@ -124,7 +140,7 @@ export async function validateAlgoForDataset( // if is set only allow if match if (compute.publisherTrustedAlgorithms) { const trustedAlgo = compute.publisherTrustedAlgorithms.find( - (algo) => algo.did === algoDID + (algo: any) => algo.did === algoDID ) if (trustedAlgo) { return ( @@ -136,10 +152,12 @@ export async function validateAlgoForDataset( } if (compute.publisherTrustedAlgorithmPublishers) { const algoDDO = await new FindDdoHandler(oceanNode).findAndFormatDdo(algoDID) + const algoInstance = DDOManager.getDDOClass(algoDDO) + const { nftAddress } = algoInstance.getDDOFields() if (algoDDO) { return compute.publisherTrustedAlgorithmPublishers - .map((address) => address?.toLowerCase()) - .includes(algoDDO.nftAddress?.toLowerCase()) + .map((address: string) => address?.toLowerCase()) + .includes(nftAddress?.toLowerCase()) } return false } diff --git a/src/components/core/admin/IndexingThreadHandler.ts b/src/components/core/admin/IndexingThreadHandler.ts index 51c33dcd4..3e8bdb13f 100644 --- a/src/components/core/admin/IndexingThreadHandler.ts +++ b/src/components/core/admin/IndexingThreadHandler.ts @@ -8,11 +8,11 @@ import { validateCommandParameters, ValidateParams } from '../../httpRoutes/validateCommands.js' -import { AdminHandler } from './adminHandler.js' +import { AdminCommandHandler } from './adminHandler.js' import { checkSupportedChainId } from '../../../utils/blockchain.js' -export class IndexingThreadHandler extends AdminHandler { - validate(command: StartStopIndexingCommand): ValidateParams { +export class IndexingThreadHandler extends AdminCommandHandler { + async validateAdminCommand(command: StartStopIndexingCommand): Promise { if ( !validateCommandParameters(command, ['action']) || ![IndexingCommand.START_THREAD, IndexingCommand.STOP_THREAD].includes( @@ -24,12 +24,12 @@ export class IndexingThreadHandler extends AdminHandler { `Missing or invalid "action" and/or "chainId" fields for command: "${command}".` ) } - return super.validate(command) + return await super.validate(command) } // eslint-disable-next-line require-await async handle(task: StartStopIndexingCommand): Promise { - const validation = this.validate(task) + const validation = await this.validateAdminCommand(task) if (!validation.valid) { return buildInvalidParametersResponse(validation) } @@ -39,8 +39,8 @@ export class IndexingThreadHandler extends AdminHandler { } if (task.action === IndexingCommand.START_THREAD) { const output = task.chainId - ? indexer.startThread(task.chainId) - : indexer.startThreads() + ? indexer.startChainIndexer(task.chainId) + : indexer.startAllChainIndexers() return { status: { httpStatus: output ? 200 : 400, @@ -50,8 +50,8 @@ export class IndexingThreadHandler extends AdminHandler { } } else if (task.action === IndexingCommand.STOP_THREAD) { const output = task.chainId - ? indexer.stopThread(task.chainId) - : indexer.stopAllThreads() + ? indexer.stopChainIndexer(task.chainId) + : indexer.stopAllChainIndexers() return { status: { httpStatus: output ? 200 : 400, diff --git a/src/components/core/admin/adminHandler.ts b/src/components/core/admin/adminHandler.ts index 42612e8f3..406cd8c31 100644 --- a/src/components/core/admin/adminHandler.ts +++ b/src/components/core/admin/adminHandler.ts @@ -1,14 +1,39 @@ -import { AdminCommand } from '../../../@types/commands.js' +import { AdminCommand, IValidateAdminCommandHandler } from '../../../@types/commands.js' import { ValidateParams, validateCommandParameters, - buildInvalidRequestMessage + buildInvalidRequestMessage, + buildRateLimitReachedResponse, + buildInvalidParametersResponse } from '../../httpRoutes/validateCommands.js' import { validateAdminSignature } from '../../../utils/auth.js' -import { Handler } from '../handler/handler.js' +import { BaseHandler } from '../handler/handler.js' +import { P2PCommandResponse } from '../../../@types/OceanNode.js' +import { ReadableString } from '../../P2P/handleProtocolCommands.js' +import { CommonValidation } from '../../../utils/validators.js' -export abstract class AdminHandler extends Handler { - validate(command: AdminCommand): ValidateParams { +export abstract class AdminCommandHandler + extends BaseHandler + implements IValidateAdminCommandHandler +{ + async verifyParamsAndRateLimits(task: AdminCommand): Promise { + if (!(await this.checkRateLimit(task.caller))) { + return buildRateLimitReachedResponse() + } + // then validate the command arguments + const validation = await this.validate(task) + if (!validation.valid) { + return buildInvalidParametersResponse(validation) + } + + // all good! + return { + stream: new ReadableString('OK'), + status: { httpStatus: 200, error: null } + } + } + + async validate(command: AdminCommand): Promise { const commandValidation = validateCommandParameters(command, [ 'expiryTimestamp', 'signature' @@ -16,17 +41,16 @@ export abstract class AdminHandler extends Handler { if (!commandValidation.valid) { return buildInvalidRequestMessage(commandValidation.reason) } - const signatureValidation = validateAdminSignature( + const signatureValidation: CommonValidation = await validateAdminSignature( command.expiryTimestamp, - command.signature + command.signature, + command.address ) if (!signatureValidation.valid) { return buildInvalidRequestMessage( `Signature check failed: ${signatureValidation.error}` ) } - return { - valid: true - } + return { valid: true } } } diff --git a/src/components/core/admin/collectFeesHandler.ts b/src/components/core/admin/collectFeesHandler.ts index fb103cba2..e101eab66 100644 --- a/src/components/core/admin/collectFeesHandler.ts +++ b/src/components/core/admin/collectFeesHandler.ts @@ -1,4 +1,4 @@ -import { AdminHandler } from './adminHandler.js' +import { AdminCommandHandler } from './adminHandler.js' import { AdminCollectFeesCommand, AdminCollectFeesHandlerResponse @@ -11,18 +11,14 @@ import { buildInvalidRequestMessage, validateCommandParameters } from '../../httpRoutes/validateCommands.js' -import { - getConfiguration, - checkSupportedChainId, - Blockchain -} from '../../../utils/index.js' -import { parseUnits, Contract, ZeroAddress, isAddress, Wallet } from 'ethers' -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json' assert { type: 'json' } +import { getConfiguration, checkSupportedChainId } from '../../../utils/index.js' +import { parseUnits, Contract, ZeroAddress, isAddress } from 'ethers' +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json' with { type: 'json' } import { CORE_LOGGER } from '../../../utils/logging/common.js' import { Readable } from 'stream' -export class CollectFeesHandler extends AdminHandler { - validate(command: AdminCollectFeesCommand): ValidateParams { +export class CollectFeesHandler extends AdminCommandHandler { + async validate(command: AdminCollectFeesCommand): Promise { if ( !validateCommandParameters(command, [ 'chainId', @@ -40,16 +36,17 @@ export class CollectFeesHandler extends AdminHandler { CORE_LOGGER.error(msg) return buildInvalidRequestMessage(msg) } - return super.validate(command) + return await super.validate(command) } async handle(task: AdminCollectFeesCommand): Promise { - const validation = this.validate(task) + const validation = await this.validate(task) if (!validation.valid) { return buildInvalidParametersResponse(validation) } const config = await getConfiguration() - if (task.node && task.node !== config.keys.peerId.toString()) { + const keyManager = this.nodeInstance.getKeyManager() + if (task.node && task.node !== keyManager.getPeerIdString()) { const msg: string = `Cannot run this command ${JSON.stringify( task )} on a different node.` @@ -64,11 +61,16 @@ export class CollectFeesHandler extends AdminHandler { } try { - const { rpc, network, chainId, fallbackRPCs } = - config.supportedNetworks[task.chainId] - const blockchain = new Blockchain(rpc, network, chainId, fallbackRPCs) - const provider = blockchain.getProvider() - const providerWallet = blockchain.getSigner() as Wallet + const { chainId } = config.supportedNetworks[task.chainId] + const oceanNode = this.getOceanNode() + const blockchain = oceanNode.getBlockchain(chainId) + if (!blockchain) { + return buildErrorResponse( + `Blockchain instance not available for chain ${chainId}` + ) + } + const provider = await blockchain.getProvider() + const providerWallet = blockchain.getWallet() const providerWalletAddress = await providerWallet.getAddress() const ammountInEther = task.tokenAmount ? parseUnits(task.tokenAmount.toString(), 'ether') @@ -91,7 +93,7 @@ export class CollectFeesHandler extends AdminHandler { } receipt = await blockchain.sendTransaction( - providerWallet, + await blockchain.getSigner(), task.destinationAddress.toLowerCase(), ammountInEther ) @@ -99,7 +101,7 @@ export class CollectFeesHandler extends AdminHandler { const token = new Contract( task.tokenAddress.toLowerCase(), ERC20Template.abi, - providerWallet + await blockchain.getSigner() ) const tokenAmount = task.tokenAmount ? parseUnits(task.tokenAmount.toString(), 'ether') diff --git a/src/components/core/admin/fetchConfigHandler.ts b/src/components/core/admin/fetchConfigHandler.ts new file mode 100644 index 000000000..7f1f005de --- /dev/null +++ b/src/components/core/admin/fetchConfigHandler.ts @@ -0,0 +1,43 @@ +import { AdminCommandHandler } from './adminHandler.js' +import { AdminFetchConfigCommand } from '../../../@types/commands.js' +import { P2PCommandResponse } from '../../../@types/OceanNode.js' +import { + ValidateParams, + buildInvalidParametersResponse +} from '../../httpRoutes/validateCommands.js' +import { ReadableString } from '../../P2P/handleProtocolCommands.js' +import { loadConfigFromFile } from '../../../utils/config/index.js' + +export class FetchConfigHandler extends AdminCommandHandler { + async validate(command: AdminFetchConfigCommand): Promise { + return await super.validate(command) + } + + async handle(task: AdminFetchConfigCommand): Promise { + const validation = await this.validate(task) + if (!validation.valid) { + return new Promise((resolve) => { + resolve(buildInvalidParametersResponse(validation)) + }) + } + + try { + const config = loadConfigFromFile() + config.keys.privateKey = '[*** HIDDEN CONTENT ***]' + + return new Promise((resolve) => { + resolve({ + status: { httpStatus: 200 }, + stream: new ReadableString(JSON.stringify(config)) + }) + }) + } catch (error) { + return new Promise((resolve) => { + resolve({ + status: { httpStatus: 500, error: `Error fetching config: ${error.message}` }, + stream: null + }) + }) + } + } +} diff --git a/src/components/core/admin/pushConfigHandler.ts b/src/components/core/admin/pushConfigHandler.ts new file mode 100644 index 000000000..7a4839cb4 --- /dev/null +++ b/src/components/core/admin/pushConfigHandler.ts @@ -0,0 +1,92 @@ +import { AdminCommandHandler } from './adminHandler.js' +import { AdminPushConfigCommand } from '../../../@types/commands.js' +import { P2PCommandResponse } from '../../../@types/OceanNode.js' +import { + ValidateParams, + buildInvalidParametersResponse, + buildInvalidRequestMessage +} from '../../httpRoutes/validateCommands.js' +import { CORE_LOGGER } from '../../../utils/logging/common.js' +import { ReadableString } from '../../P2P/handleProtocolCommands.js' +import { getConfiguration, getConfigFilePath } from '../../../utils/config/index.js' +import { OceanNodeConfigSchema } from '../../../utils/config/schemas.js' +import fs from 'fs' + +export class PushConfigHandler extends AdminCommandHandler { + async validate(command: AdminPushConfigCommand): Promise { + const baseValidation = await super.validate(command) + if (!baseValidation.valid) { + return baseValidation + } + + if (!command.config || typeof command.config !== 'object') { + return buildInvalidRequestMessage('Config must be a valid object') + } + + // Pre-validate the config fields using Zod schema + try { + const currentConfig = await getConfiguration() + const mergedConfig = { ...currentConfig, ...command.config } + + OceanNodeConfigSchema.parse(mergedConfig) + } catch (error) { + if (error.name === 'ZodError') { + const issues = error.issues + .map((issue: any) => `${issue.path.join('.')}: ${issue.message}`) + .join(', ') + return buildInvalidRequestMessage(`Config validation failed: ${issues}`) + } + return buildInvalidRequestMessage(`Config validation error: ${error.message}`) + } + + return { valid: true } + } + + async handle(task: AdminPushConfigCommand): Promise { + const validation = await this.validate(task) + if (!validation.valid) { + return new Promise((resolve) => { + resolve(buildInvalidParametersResponse(validation)) + }) + } + + try { + const configPath = getConfigFilePath() + const configContent = await fs.promises.readFile(configPath, 'utf-8') + const currentConfig = JSON.parse(configContent) + + const mergedConfig = { ...currentConfig, ...task.config } + await this.saveConfigToFile(mergedConfig) + + const newConfig = await getConfiguration(true, false) + this.getOceanNode().setConfig(newConfig) + await this.getOceanNode().addC2DEngines() + + const responseConfig = structuredClone(newConfig) + responseConfig.keys.privateKey = '[*** HIDDEN CONTENT ***]' + CORE_LOGGER.logMessage('Configuration reloaded successfully') + + return new Promise((resolve) => { + resolve({ + status: { httpStatus: 200 }, + stream: new ReadableString(JSON.stringify(responseConfig)) + }) + }) + } catch (error) { + CORE_LOGGER.error(`Error pushing config: ${error.message}`) + return new Promise((resolve) => { + resolve({ + status: { httpStatus: 500, error: `Error pushing config: ${error.message}` }, + stream: null + }) + }) + } + } + + private async saveConfigToFile(config: Record): Promise { + const configPath = getConfigFilePath() + const content = JSON.stringify(config, null, 4) + await fs.promises.writeFile(configPath, content, 'utf-8') + CORE_LOGGER.logMessage(`Config saved to: ${configPath}`) + } +} diff --git a/src/components/core/admin/reindexChainHandler.ts b/src/components/core/admin/reindexChainHandler.ts index 911bbbfe5..10ac997bc 100644 --- a/src/components/core/admin/reindexChainHandler.ts +++ b/src/components/core/admin/reindexChainHandler.ts @@ -1,4 +1,4 @@ -import { AdminHandler } from './adminHandler.js' +import { AdminCommandHandler } from './adminHandler.js' import { AdminReindexChainCommand } from '../../../@types/commands.js' import { validateCommandParameters, @@ -12,18 +12,18 @@ import { CORE_LOGGER } from '../../../utils/logging/common.js' import { checkSupportedChainId } from '../../../utils/blockchain.js' import { ReadableString } from '../../P2P/handleProtocolCommands.js' -export class ReindexChainHandler extends AdminHandler { - validate(command: AdminReindexChainCommand): ValidateParams { +export class ReindexChainHandler extends AdminCommandHandler { + async validateAdminCommand(command: AdminReindexChainCommand): Promise { if (!validateCommandParameters(command, ['chainId'])) { return buildInvalidRequestMessage( `Missing chainId field for command: "${command}".` ) } - return super.validate(command) + return await super.validate(command) } async handle(task: AdminReindexChainCommand): Promise { - const validation = this.validate(task) + const validation = await this.validateAdminCommand(task) if (!validation.valid) { return buildInvalidParametersResponse(validation) } diff --git a/src/components/core/admin/reindexTxHandler.ts b/src/components/core/admin/reindexTxHandler.ts index 9fdbf6cb3..f9c746da0 100644 --- a/src/components/core/admin/reindexTxHandler.ts +++ b/src/components/core/admin/reindexTxHandler.ts @@ -1,4 +1,4 @@ -import { AdminHandler } from './adminHandler.js' +import { AdminCommandHandler } from './adminHandler.js' import { validateCommandParameters, buildInvalidRequestMessage, @@ -12,8 +12,8 @@ import { CORE_LOGGER } from '../../../utils/logging/common.js' import { ReadableString } from '../../P2P/handleProtocolCommands.js' import { checkSupportedChainId } from '../../../utils/blockchain.js' -export class ReindexTxHandler extends AdminHandler { - validate(command: AdminReindexTxCommand): ValidateParams { +export class ReindexTxHandler extends AdminCommandHandler { + async validate(command: AdminReindexTxCommand): Promise { if (!validateCommandParameters(command, ['chainId', 'txId'])) { return buildInvalidRequestMessage( `Missing chainId or txId fields for command: "${command}".` @@ -22,11 +22,11 @@ export class ReindexTxHandler extends AdminHandler { if (!/^0x([A-Fa-f0-9]{64})$/.test(command.txId)) { return buildInvalidRequestMessage(`Invalid format for transaction ID.`) } - return super.validate(command) + return await super.validate(command) } async handle(task: AdminReindexTxCommand): Promise { - const validation = this.validate(task) + const validation = await this.validate(task) if (!validation.valid) { return buildInvalidParametersResponse(validation) } diff --git a/src/components/core/admin/stopNodeHandler.ts b/src/components/core/admin/stopNodeHandler.ts index 9d705d50e..6b11cd5be 100644 --- a/src/components/core/admin/stopNodeHandler.ts +++ b/src/components/core/admin/stopNodeHandler.ts @@ -1,4 +1,4 @@ -import { AdminHandler } from './adminHandler.js' +import { AdminCommandHandler } from './adminHandler.js' import { AdminStopNodeCommand } from '../../../@types/commands.js' import { P2PCommandResponse } from '../../../@types/OceanNode.js' import { @@ -8,13 +8,13 @@ import { import { CORE_LOGGER } from '../../../utils/logging/common.js' import { ReadableString } from '../../P2P/handleProtocolCommands.js' -export class StopNodeHandler extends AdminHandler { - validate(command: AdminStopNodeCommand): ValidateParams { - return super.validate(command) +export class StopNodeHandler extends AdminCommandHandler { + async validate(command: AdminStopNodeCommand): Promise { + return await super.validate(command) } - handle(task: AdminStopNodeCommand): Promise { - const validation = this.validate(task) + async handle(task: AdminStopNodeCommand): Promise { + const validation = await this.validate(task) if (!validation.valid) { return new Promise((resolve, reject) => { resolve(buildInvalidParametersResponse(validation)) diff --git a/src/components/core/compute/environments.ts b/src/components/core/compute/environments.ts index 8561d66c4..95e8b0b6d 100644 --- a/src/components/core/compute/environments.ts +++ b/src/components/core/compute/environments.ts @@ -1,16 +1,14 @@ import { Readable } from 'stream' import { P2PCommandResponse } from '../../../@types/index.js' -import { ComputeEnvByChain } from '../../../@types/C2D.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' -import { Handler } from '../handler/handler.js' +import { CommandHandler } from '../handler/handler.js' import { ComputeGetEnvironmentsCommand } from '../../../@types/commands.js' -import { getConfiguration } from '../../../utils/config.js' import { ValidateParams, buildInvalidRequestMessage, validateCommandParameters } from '../../httpRoutes/validateCommands.js' -export class ComputeGetEnvironmentsHandler extends Handler { +export class ComputeGetEnvironmentsHandler extends CommandHandler { validate(command: ComputeGetEnvironmentsCommand): ValidateParams { const validateCommand = validateCommandParameters(command, []) if (!validateCommand.valid) { @@ -27,14 +25,8 @@ export class ComputeGetEnvironmentsHandler extends Handler { return validationResponse } try { - const result: ComputeEnvByChain = {} const computeEngines = this.getOceanNode().getC2DEngines() - const config = await getConfiguration() - for (const chain of Object.keys(config.supportedNetworks)) { - const chainId = parseInt(chain) - if (task.chainId && task.chainId !== chainId) continue - result[chainId] = await computeEngines.fetchEnvironments(chainId) - } + const result = await computeEngines.fetchEnvironments(task.chainId) CORE_LOGGER.logMessage( 'ComputeGetEnvironmentsCommand Response: ' + JSON.stringify(result, null, 2), diff --git a/src/components/core/compute/getResults.ts b/src/components/core/compute/getResults.ts index ffa242349..682278f07 100644 --- a/src/components/core/compute/getResults.ts +++ b/src/components/core/compute/getResults.ts @@ -1,8 +1,7 @@ import { P2PCommandResponse } from '../../../@types/index.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' -import { Handler } from '../handler/handler.js' +import { CommandHandler } from '../handler/handler.js' import { ComputeGetResultCommand } from '../../../@types/commands.js' -import { checkNonce, NonceResponse } from '../utils/nonceHandler.js' import { buildInvalidRequestMessage, validateCommandParameters, @@ -10,15 +9,9 @@ import { } from '../../httpRoutes/validateCommands.js' import { isAddress } from 'ethers' -export class ComputeGetResultHandler extends Handler { +export class ComputeGetResultHandler extends CommandHandler { validate(command: ComputeGetResultCommand): ValidateParams { - const validation = validateCommandParameters(command, [ - 'consumerAddress', - 'signature', - 'nonce', - 'jobId', - 'index' - ]) + const validation = validateCommandParameters(command, ['jobId', 'index']) if (validation.valid) { if (command.consumerAddress && !isAddress(command.consumerAddress)) { return buildInvalidRequestMessage( @@ -38,33 +31,17 @@ export class ComputeGetResultHandler extends Handler { return validationResponse } - let error = null - - // signature message to check against - const message = task.consumerAddress + task.jobId + task.index.toString() + task.nonce - const nonceCheckResult: NonceResponse = await checkNonce( - this.getOceanNode().getDatabase().nonce, + const authValidationResponse = await this.validateTokenOrSignature( + task.authorization, task.consumerAddress, - parseInt(task.nonce), + task.nonce, task.signature, - message // task.jobId + task.index.toString() + String(task.consumerAddress + task.jobId + task.index.toString() + task.nonce) ) - - if (!nonceCheckResult.valid) { - // eslint-disable-next-line prefer-destructuring - error = nonceCheckResult.error + if (authValidationResponse.status.httpStatus !== 200) { + return authValidationResponse } - if (error) { - CORE_LOGGER.logMessage(error, true) - return { - stream: null, - status: { - httpStatus: 400, - error - } - } - } // split jobId (which is already in hash-jobId format) and get the hash // then get jobId which might contain dashes as well const index = task.jobId.indexOf('-') @@ -90,16 +67,15 @@ export class ComputeGetResultHandler extends Handler { jobId, task.index ) - const anyResp: any = respStream as any const response: P2PCommandResponse = { - stream: respStream, + stream: respStream?.stream, status: { httpStatus: 200 } } // need to pass the headers properly - if (anyResp.headers) { - response.status.headers = anyResp.headers + if (respStream?.headers) { + response.status.headers = respStream?.headers } return response } catch (error) { diff --git a/src/components/core/compute/getStatus.ts b/src/components/core/compute/getStatus.ts index 23b330298..666289e05 100644 --- a/src/components/core/compute/getStatus.ts +++ b/src/components/core/compute/getStatus.ts @@ -1,8 +1,8 @@ import { Readable } from 'stream' import { P2PCommandResponse } from '../../../@types/index.js' -import { ComputeJob } from '../../../@types/C2D.js' +import { ComputeJob } from '../../../@types/C2D/C2D.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' -import { Handler } from '../handler/handler.js' +import { CommandHandler } from '../handler/handler.js' import { ComputeGetStatusCommand } from '../../../@types/commands.js' import { ValidateParams, @@ -11,7 +11,7 @@ import { } from '../../httpRoutes/validateCommands.js' import { isAddress } from 'ethers' -export class ComputeGetStatusHandler extends Handler { +export class ComputeGetStatusHandler extends CommandHandler { validate(command: ComputeGetStatusCommand): ValidateParams { const validation = validateCommandParameters(command, []) if (validation.valid) { @@ -44,20 +44,29 @@ export class ComputeGetStatusHandler extends Handler { // split jobId (which is already in hash-jobId format) and get the hash // then get jobId which might contain dashes as well const index = task.jobId.indexOf('-') - const hash = task.jobId.slice(0, index) - engines = [await this.getOceanNode().getC2DEngines().getC2DByHash(hash)] - jobId = task.jobId.slice(index + 1) + if (index > 0) { + const hash = task.jobId.slice(0, index) + engines = [await this.getOceanNode().getC2DEngines().getC2DByHash(hash)] + jobId = task.jobId.slice(index + 1) + } else { + engines = await this.getOceanNode().getC2DEngines().getAllEngines() + } } else { engines = await this.getOceanNode().getC2DEngines().getAllEngines() + CORE_LOGGER.logMessage( + 'ComputeGetStatusCommand: No jobId provided, querying all C2D clusters' + ) } for (const engine of engines) { + CORE_LOGGER.logMessage(`ComputeGetStatusCommand: Querying engine`) const jobs = await engine.getComputeJobStatus( task.consumerAddress, task.agreementId, jobId ) - response.push(...jobs) + + if (jobs && jobs.length > 0) response.push(...jobs) } CORE_LOGGER.logMessage( 'ComputeGetStatusCommand Response: ' + JSON.stringify(response, null, 2), diff --git a/src/components/core/compute/getStreamableLogs.ts b/src/components/core/compute/getStreamableLogs.ts new file mode 100644 index 000000000..45c701d28 --- /dev/null +++ b/src/components/core/compute/getStreamableLogs.ts @@ -0,0 +1,93 @@ +import { P2PCommandResponse } from '../../../@types/index.js' +import { CORE_LOGGER } from '../../../utils/logging/common.js' +import { CommandHandler } from '../handler/handler.js' +import { ComputeGetStreamableLogsCommand } from '../../../@types/commands.js' +import { Stream } from 'stream' +import { + buildInvalidRequestMessage, + validateCommandParameters, + ValidateParams +} from '../../httpRoutes/validateCommands.js' +import { isAddress } from 'ethers' + +export class ComputeGetStreamableLogsHandler extends CommandHandler { + validate(command: ComputeGetStreamableLogsCommand): ValidateParams { + const validation = validateCommandParameters(command, ['jobId']) + if (validation.valid) { + if (command.consumerAddress && !isAddress(command.consumerAddress)) { + return buildInvalidRequestMessage( + 'Parameter : "consumerAddress" is not a valid web3 address' + ) + } + } + return validation + } + + async handle(task: ComputeGetStreamableLogsCommand): Promise { + const oceanNode = this.getOceanNode() + + const validationResponse = await this.verifyParamsAndRateLimits(task) + if (this.shouldDenyTaskHandling(validationResponse)) { + return validationResponse + } + + const authValidationResponse = await this.validateTokenOrSignature( + task.authorization, + task.consumerAddress, + task.nonce, + task.signature, + String(task.consumerAddress + task.jobId + task.nonce) + ) + if (authValidationResponse.status.httpStatus !== 200) { + return authValidationResponse + } + + // split jobId (which is already in hash-jobId format) and get the hash + // then get jobId which might contain dashes as well + const index = task.jobId.indexOf('-') + const hash = task.jobId.slice(0, index) + const jobId = task.jobId.slice(index + 1) + + // env might contain + let engine + try { + engine = await oceanNode.getC2DEngines().getC2DByHash(hash) + } catch (e) { + return { + stream: null, + status: { + httpStatus: 500, + error: 'Invalid C2D Environment' + } + } + } + try { + const respStream = await engine.getStreamableLogs(jobId) + if (!respStream) { + return { + stream: null, + status: { + httpStatus: 404 + } + } + } + const response: P2PCommandResponse = { + stream: respStream as unknown as Stream, + status: { + httpStatus: 200 + } + } + + return response + } catch (error) { + CORE_LOGGER.error(error.message) + return { + stream: null, + status: { + httpStatus: 500, + error: error.message + } + } + } + } +} diff --git a/src/components/core/compute/index.ts b/src/components/core/compute/index.ts index 14d73f5cc..2beb8c621 100644 --- a/src/components/core/compute/index.ts +++ b/src/components/core/compute/index.ts @@ -4,3 +4,4 @@ export * from './stopCompute.js' export * from './getStatus.js' export * from './getResults.js' export * from './initialize.js' +export * from './getStreamableLogs.js' diff --git a/src/components/core/compute/initialize.ts b/src/components/core/compute/initialize.ts index 1c5f58bec..e9937d4c7 100644 --- a/src/components/core/compute/initialize.ts +++ b/src/components/core/compute/initialize.ts @@ -1,7 +1,8 @@ import { Readable } from 'stream' -import { P2PCommandResponse } from '../../../@types/index.js' +import { P2PCommandResponse } from '../../../@types/OceanNode.js' +import { C2DClusterType } from '../../../@types/C2D/C2D.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' -import { Handler } from '../handler/handler.js' +import { CommandHandler } from '../handler/handler.js' import { ComputeInitializeCommand } from '../../../@types/commands.js' import { ProviderComputeInitializeResults } from '../../../@types/Fees.js' import { @@ -12,27 +13,36 @@ import { isERC20Template4Active } from '../../../utils/asset.js' import { verifyProviderFees, createProviderFee } from '../utils/feesHandler.js' -import { Blockchain } from '../../../utils/blockchain.js' + import { validateOrderTransaction } from '../utils/validateOrders.js' import { EncryptMethod } from '../../../@types/fileObject.js' -import { decrypt } from '../../../utils/crypt.js' + import { ValidateParams, buildInvalidRequestMessage, validateCommandParameters } from '../../httpRoutes/validateCommands.js' import { isAddress } from 'ethers' -import { getConfiguration } from '../../../utils/index.js' +import { getConfiguration, isPolicyServerConfigured } from '../../../utils/index.js' import { sanitizeServiceFiles } from '../../../utils/util.js' import { FindDdoHandler } from '../handler/ddoHandler.js' import { isOrderingAllowedForAsset } from '../handler/downloadHandler.js' -export class ComputeInitializeHandler extends Handler { +import { getNonceAsNumber } from '../utils/nonceHandler.js' +import { C2DEngineDocker, getAlgorithmImage } from '../../c2d/compute_engine_docker.js' +import { Credentials, DDOManager } from '@oceanprotocol/ddo-js' +import { checkCredentials } from '../../../utils/credentials.js' +import { PolicyServer } from '../../policyServer/index.js' +import { generateUniqueID, getAlgoChecksums, validateAlgoForDataset } from './utils.js' + +export class ComputeInitializeHandler extends CommandHandler { validate(command: ComputeInitializeCommand): ValidateParams { const validation = validateCommandParameters(command, [ 'datasets', 'algorithm', - 'compute', - 'consumerAddress' + 'payment', + 'consumerAddress', + 'environment' + // we might also need a "signature" (did + nonce) for confidential evm template 4 ]) if (validation.valid) { if (command.consumerAddress && !isAddress(command.consumerAddress)) { @@ -40,17 +50,14 @@ export class ComputeInitializeHandler extends Handler { 'Parameter : "consumerAddress" is not a valid web3 address' ) } - const { validUntil } = command.compute - if (validUntil <= new Date().getTime() / 1000) { - const errorMsg = `Error validating validUntil ${validUntil}. It is not in the future.` - CORE_LOGGER.error(errorMsg) - return buildInvalidRequestMessage(errorMsg) - } else if (!command.compute || !command.compute.env) { - CORE_LOGGER.error(`Invalid compute environment: ${command.compute.env}`) - return buildInvalidRequestMessage( - `Invalid compute environment: ${command.compute.env}` - ) + if (!command.payment.chainId || !command.payment.token) { + return buildInvalidRequestMessage('Invalid payment options') + } + if (command.maxJobDuration && parseInt(String(command.maxJobDuration)) <= 0) { + return buildInvalidRequestMessage('Invalid maxJobDuration') } + + return validation } return validation @@ -61,21 +68,153 @@ export class ComputeInitializeHandler extends Handler { if (this.shouldDenyTaskHandling(validationResponse)) { return validationResponse } - + if (!task.queueMaxWaitTime) { + task.queueMaxWaitTime = 0 + } + let engine + let env + let resourcesNeeded try { - let foundValidCompute = null const node = this.getOceanNode() + const config = await getConfiguration() + try { + // split compute env (which is already in hash-envId format) and get the hash + // then get env which might contain dashes as well + const eIndex = task.environment.indexOf('-') + const hash = task.environment.slice(0, eIndex) + engine = await this.getOceanNode().getC2DEngines().getC2DByHash(hash) + } catch (e) { + return { + stream: null, + status: { + httpStatus: 500, + error: 'Invalid C2D Environment' + } + } + } + + const algoChecksums = await getAlgoChecksums( + task.algorithm.documentId, + task.algorithm.serviceId, + node, + config + ) + + const isRawCodeAlgorithm = task.algorithm.meta?.rawcode + const hasValidChecksums = algoChecksums.container && algoChecksums.files + + if (!isRawCodeAlgorithm && !hasValidChecksums) { + const errorMessage = + 'Failed to retrieve algorithm checksums. Both container and files checksums are required.' + CORE_LOGGER.error(errorMessage) + return { + stream: null, + status: { + httpStatus: 500, + error: errorMessage + } + } + } + if (engine === null) { + return { + stream: null, + status: { + httpStatus: 500, + error: 'Invalid C2D Environment' + } + } + } + try { + env = await engine.getComputeEnvironment(task.payment.chainId, task.environment) + if (!env) { + return { + stream: null, + status: { + httpStatus: 500, + error: 'Invalid C2D Environment' + } + } + } + if (!task.maxJobDuration || task.maxJobDuration > env.maxJobDuration) { + task.maxJobDuration = env.maxJobDuration + } + resourcesNeeded = await engine.checkAndFillMissingResources( + task.payment.resources, + env, + false + ) + } catch (e) { + return { + stream: null, + status: { + httpStatus: 500, + error: String(e) + } + } + } + // check if we have the required token as payment method + const prices = engine.getEnvPricesForToken( + env, + task.payment.chainId, + task.payment.token + ) + if (!prices) { + return { + stream: null, + status: { + httpStatus: 500, + error: `This compute env does not accept payments on chain: ${task.payment.chainId} using token ${task.payment.token}` + } + } + } + + const escrowAddress = engine.escrow.getEscrowContractAddressForChain( + task.payment.chainId + ) + if (!escrowAddress) { + return { + stream: null, + status: { + httpStatus: 500, + error: `Cannot handle payments on chainId: ${task.payment.chainId}` + } + } + } + // let's calculate payment needed based on resources request and maxJobDuration + const cost = engine.calculateResourcesCost( + resourcesNeeded, + env, + task.payment.chainId, + task.payment.token, + task.maxJobDuration + ) const allFees: ProviderComputeInitializeResults = { algorithm: null, - datasets: [] + datasets: [], + payment: { + escrowAddress, + payee: env.consumerAddress, + chainId: task.payment.chainId, + minLockSeconds: engine.escrow.getMinLockTime( + task.maxJobDuration + task.queueMaxWaitTime + ), + token: task.payment.token, + amount: await engine.escrow.getPaymentAmountInWei( + cost, + task.payment.chainId, + task.payment.token + ) + } } + // check algo let index = 0 + const policyServer = new PolicyServer() for (const elem of [...[task.algorithm], ...task.datasets]) { const result: any = { validOrder: false } if ('documentId' in elem && elem.documentId) { result.did = elem.documentId - result.serviceId = elem.documentId + result.serviceId = elem.serviceId const ddo = await new FindDdoHandler(node).findAndFormatDdo(elem.documentId) if (!ddo) { const error = `DDO ${elem.documentId} not found` @@ -87,6 +226,13 @@ export class ComputeInitializeHandler extends Handler { } } } + const ddoInstance = DDOManager.getDDOClass(ddo) + const { + chainId: ddoChainId, + nftAddress, + credentials, + metadata + } = ddoInstance.getDDOFields() const isOrdable = isOrderingAllowedForAsset(ddo) if (!isOrdable.isOrdable) { CORE_LOGGER.error(isOrdable.reason) @@ -98,22 +244,43 @@ export class ComputeInitializeHandler extends Handler { } } } - const service = AssetUtils.getServiceById(ddo, elem.serviceId) - if (!service) { - const error = `Cannot find service ${elem.serviceId} in DDO ${elem.documentId}` + if (metadata.type !== 'algorithm') { + const index = task.datasets.findIndex( + (d) => d.documentId === ddoInstance.getDid() + ) + const safeIndex = index === -1 ? 0 : index + const validAlgoForDataset = await validateAlgoForDataset( + task.algorithm.documentId, + algoChecksums, + ddoInstance, + task.datasets[safeIndex].serviceId, + node + ) + if (!validAlgoForDataset) { + return { + stream: null, + status: { + httpStatus: 400, + error: `Algorithm ${ + task.algorithm.documentId + } not allowed to run on the dataset: ${ddoInstance.getDid()}` + } + } + } + } + const config = await getConfiguration() + const { chainId } = config.supportedNetworks[ddoChainId] + const oceanNode = this.getOceanNode() + const blockchain = oceanNode.getBlockchain(chainId) + if (!blockchain) { return { stream: null, status: { - httpStatus: 500, - error + httpStatus: 400, + error: `Initialize Compute: Blockchain instance not available for chain ${chainId}` } } } - - const config = await getConfiguration() - const { rpc, network, chainId, fallbackRPCs } = - config.supportedNetworks[ddo.chainId] - const blockchain = new Blockchain(rpc, network, chainId, fallbackRPCs) const { ready, error } = await blockchain.isNetworkReady() if (!ready) { return { @@ -124,19 +291,134 @@ export class ComputeInitializeHandler extends Handler { } } } + // check credentials (DDO level) + let accessGrantedDDOLevel: boolean + if (credentials) { + // if POLICY_SERVER_URL exists, then ocean-node will NOT perform any checks. + // It will just use the existing code and let PolicyServer decide. + if (isPolicyServerConfigured()) { + const response = await policyServer.checkStartCompute( + ddoInstance.getDid(), + ddo, + elem.serviceId, + task.consumerAddress, + task.policyServer + ) + accessGrantedDDOLevel = response.success + } else { + accessGrantedDDOLevel = await checkCredentials( + task.consumerAddress, + credentials as Credentials, + await blockchain.getSigner() + ) + } + if (!accessGrantedDDOLevel) { + CORE_LOGGER.logMessage( + `Error: Access to asset ${ddoInstance.getDid()} was denied`, + true + ) + return { + stream: null, + status: { + httpStatus: 403, + error: `Error: Access to asset ${ddoInstance.getDid()} was denied` + } + } + } + } + const service = AssetUtils.getServiceById(ddo, elem.serviceId) + if (!service) { + const error = `Cannot find service ${elem.serviceId} in DDO ${elem.documentId}` + return { + stream: null, + status: { + httpStatus: 500, + error + } + } + } + // check credentials on service level + // if using a policy server and we are here it means that access was granted (they are merged/assessed together) + if (service.credentials) { + let accessGrantedServiceLevel: boolean + if (isPolicyServerConfigured()) { + // we use the previous check or we do it again + // (in case there is no DDO level credentials and we only have Service level ones) + const response = await policyServer.checkStartCompute( + ddo.id, + ddo, + elem.serviceId, + task.consumerAddress, + task.policyServer + ) + accessGrantedServiceLevel = accessGrantedDDOLevel || response.success + } else { + accessGrantedServiceLevel = await checkCredentials( + task.consumerAddress, + service.credentials, + await blockchain.getSigner() + ) + } + + if (!accessGrantedServiceLevel) { + CORE_LOGGER.logMessage( + `Error: Access to service with id ${service.id} was denied`, + true + ) + return { + stream: null, + status: { + httpStatus: 403, + error: `Error: Access to service with id ${service.id} was denied` + } + } + } + } - const signer = blockchain.getSigner() + // docker images? + const clusters = config.c2dClusters + let hasDockerImages = false + for (const cluster of clusters) { + if (cluster.type === C2DClusterType.DOCKER) { + hasDockerImages = true + break + } + } + if (hasDockerImages) { + const algoImage = getAlgorithmImage(task.algorithm, generateUniqueID(task)) + if (algoImage) { + const validation: ValidateParams = await C2DEngineDocker.checkDockerImage( + algoImage, + env.platform + ) + if (!validation.valid) { + return { + stream: null, + status: { + httpStatus: validation.status, + error: `Initialize Compute failed for image ${algoImage} :${validation.reason}` + } + } + } + } + } + + const signer = await blockchain.getSigner() // check if oasis evm or similar - const confidentialEVM = isConfidentialChainDDO(ddo.chainId, service) + const confidentialEVM = isConfidentialChainDDO(BigInt(ddoChainId), service) // let's see if we can access this asset let canDecrypt = false try { if (!confidentialEVM) { - await decrypt( - Uint8Array.from(Buffer.from(sanitizeServiceFiles(service.files), 'hex')), - EncryptMethod.ECIES - ) + await node + .getKeyManager() + .decrypt( + Uint8Array.from( + Buffer.from(sanitizeServiceFiles(service.files), 'hex') + ), + EncryptMethod.ECIES + ) canDecrypt = true } else { // TODO 'Initialize compute on confidential EVM! @@ -144,19 +426,34 @@ export class ComputeInitializeHandler extends Handler { service.datatokenAddress, signer ) - if (isTemplate4 && (await isERC20Template4Active(ddo.chainId, signer))) { - // call smart contract to decrypt - const serviceIndex = AssetUtils.getServiceIndexById(ddo, service.id) - const filesObject = await getFilesObjectFromConfidentialEVM( - serviceIndex, - service.datatokenAddress, - signer, - task.consumerAddress, - null, // TODO, we will need to have a signature verification - ddo.id - ) - if (filesObject !== null) { - canDecrypt = true + if (isTemplate4) { + if (!task.signature) { + CORE_LOGGER.error( + 'Could not decrypt ddo files on template 4, missing consumer signature!' + ) + } else if (await isERC20Template4Active(ddoChainId, signer)) { + // we need to get the proper data for the signature + const consumeData = + task.consumerAddress + + task.datasets[0].documentId + + getNonceAsNumber(task.consumerAddress) + // call smart contract to decrypt + const serviceIndex = AssetUtils.getServiceIndexById(ddo, service.id) + const filesObject = await getFilesObjectFromConfidentialEVM( + serviceIndex, + service.datatokenAddress, + signer, + task.consumerAddress, + task.signature, // we will need to have a signature verification + consumeData + ) + if (filesObject !== null) { + canDecrypt = true + } + } else { + CORE_LOGGER.error( + 'Could not decrypt ddo files on template 4, template is not active!' + ) } } } @@ -175,28 +472,14 @@ export class ComputeInitializeHandler extends Handler { } } - const provider = blockchain.getProvider() + const provider = await blockchain.getProvider() result.datatoken = service.datatokenAddress - result.chainId = ddo.chainId + result.chainId = ddoChainId // start with assumption than we need new providerfees let validFee = { isValid: false, - isComputeValid: false, message: false } - const env = await this.getOceanNode() - .getC2DEngines() - .getExactComputeEnv(task.compute.env, ddo.chainId) - if (!env) { - const error = `Compute environment: ${task.compute.env} not available on chainId: ${ddo.chainId}` - return { - stream: null, - status: { - httpStatus: 500, - error - } - } - } result.consumerAddress = env.consumerAddress if ('transferTxId' in elem && elem.transferTxId) { // search for that compute env and see if it has access to dataset @@ -204,11 +487,11 @@ export class ComputeInitializeHandler extends Handler { elem.transferTxId, env.consumerAddress, provider, - ddo.nftAddress, + nftAddress, service.datatokenAddress, AssetUtils.getServiceIndexById(ddo, service.id), service.timeout, - blockchain.getSigner() + await blockchain.getSigner() ) if (paymentValidation.isValid === true) { // order is valid, so let's check providerFees @@ -217,53 +500,19 @@ export class ComputeInitializeHandler extends Handler { elem.transferTxId, task.consumerAddress, provider, - service, - task.compute.env, - task.compute.validUntil + service ) } else { // no point in checking provider fees if order is expired result.validOrder = false } } - if (validFee.isComputeValid === true) { - foundValidCompute = { txId: elem.transferTxId, chainId: ddo.chainId } - } if (validFee.isValid === false) { - // providerFee is no longer valid, so we need to create one - const now = new Date().getTime() / 1000 - let bestValidUntil: number = 0 - if (service.timeout === 0) { - bestValidUntil = task.compute.validUntil // no need to pay more if asset is available for days, but we need houts - } else { - bestValidUntil = Math.min(now + service.timeout, task.compute.validUntil) - } - if (foundValidCompute || !canDecrypt) { - // we already have a valid compute fee with another asset, or it's an asset not served by us - // in any case, we need an access providerFee - if (canDecrypt) { - result.providerFee = await createProviderFee( - ddo, - service, - bestValidUntil, - null, - null - ) - } else { - // TO DO: Edge case when this asset is served by a remote provider. - // We should connect to that provider and get the fee - } + if (canDecrypt) { + result.providerFee = await createProviderFee(ddo, service, service.timeout) } else { - // we need to create a compute fee - // we can only create computeFee if the asset is ours.. - result.providerFee = await createProviderFee( - ddo, - service, - bestValidUntil, - env, - task.compute.validUntil - ) - foundValidCompute = { txId: null, chainId: ddo.chainId } + // TO DO: Edge case when this asset is served by a remote provider. + // We should connect to that provider and get the fee } } } @@ -271,12 +520,7 @@ export class ComputeInitializeHandler extends Handler { else allFees.datasets.push(result) index = index + 1 } - if (!foundValidCompute) { - // edge case, where all assets have valid orders and valid provider fees (for download) - // unfortunatelly, none have valid compute provider fees. let's create for the first asset that is published on a chainId that matches our env - // just take any asset and create provider fees with compute - console.log('TO DO!!!!') - } + return { stream: Readable.from(JSON.stringify(allFees)), status: { diff --git a/src/components/core/compute/startCompute.ts b/src/components/core/compute/startCompute.ts index 7d10ba894..cd625e428 100644 --- a/src/components/core/compute/startCompute.ts +++ b/src/components/core/compute/startCompute.ts @@ -1,10 +1,13 @@ import { Readable } from 'stream' import { P2PCommandResponse } from '../../../@types/index.js' -import { ComputeAsset } from '../../../@types/C2D.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' -import { Handler } from '../handler/handler.js' -import { ComputeStartCommand } from '../../../@types/commands.js' -import { getAlgoChecksums, validateAlgoForDataset } from './utils.js' +import { + FreeComputeStartCommand, + PaidComputeStartCommand +} from '../../../@types/commands.js' +import { CommandHandler } from '../handler/handler.js' +import { OceanNode } from '../../../OceanNode.js' +import { generateUniqueID, getAlgoChecksums, validateAlgoForDataset } from './utils.js' import { ValidateParams, buildInvalidRequestMessage, @@ -19,24 +22,30 @@ import { isERC20Template4Active } from '../../../utils/asset.js' import { EncryptMethod } from '../../../@types/fileObject.js' -import { decrypt } from '../../../utils/crypt.js' -import { verifyProviderFees } from '../utils/feesHandler.js' -import { Blockchain } from '../../../utils/blockchain.js' +import { + ComputeAccessList, + ComputeResourceRequestWithPrice +} from '../../../@types/C2D/C2D.js' +// import { verifyProviderFees } from '../utils/feesHandler.js' import { validateOrderTransaction } from '../utils/validateOrders.js' -import { getConfiguration } from '../../../utils/index.js' +import { getConfiguration, isPolicyServerConfigured } from '../../../utils/index.js' import { sanitizeServiceFiles } from '../../../utils/util.js' import { FindDdoHandler } from '../handler/ddoHandler.js' -import { ProviderFeeValidation } from '../../../@types/Fees.js' +// import { ProviderFeeValidation } from '../../../@types/Fees.js' import { isOrderingAllowedForAsset } from '../handler/downloadHandler.js' -export class ComputeStartHandler extends Handler { - validate(command: ComputeStartCommand): ValidateParams { +import { Credentials, DDOManager } from '@oceanprotocol/ddo-js' +import { getNonceAsNumber } from '../utils/nonceHandler.js' +import { PolicyServer } from '../../policyServer/index.js' +import { checkCredentials } from '../../../utils/credentials.js' +import { checkAddressOnAccessList } from '../../../utils/accessList.js' + +export class PaidComputeStartHandler extends CommandHandler { + validate(command: PaidComputeStartCommand): ValidateParams { const commandValidation = validateCommandParameters(command, [ - 'consumerAddress', - 'signature', - 'nonce', 'environment', 'algorithm', - 'dataset' + 'datasets', + 'maxJobDuration' ]) if (commandValidation.valid) { if (!isAddress(command.consumerAddress)) { @@ -44,25 +53,46 @@ export class ComputeStartHandler extends Handler { 'Parameter : "consumerAddress" is not a valid web3 address' ) } + if (parseInt(String(command.maxJobDuration)) <= 0) { + return buildInvalidRequestMessage('Invalid maxJobDuration') + } } return commandValidation } - async handle(task: ComputeStartCommand): Promise { + async handle(task: PaidComputeStartCommand): Promise { const validationResponse = await this.verifyParamsAndRateLimits(task) if (this.shouldDenyTaskHandling(validationResponse)) { return validationResponse } + if (!task.queueMaxWaitTime) { + task.queueMaxWaitTime = 0 + } + const authValidationResponse = await this.validateTokenOrSignature( + task.authorization, + task.consumerAddress, + task.nonce, + task.signature, + String(task.consumerAddress + task.datasets[0]?.documentId + task.nonce) + ) + + if (authValidationResponse.status.httpStatus !== 200) { + return authValidationResponse + } + try { + const node = this.getOceanNode() // split compute env (which is already in hash-envId format) and get the hash // then get env which might contain dashes as well const eIndex = task.environment.indexOf('-') const hash = task.environment.slice(0, eIndex) - const envId = task.environment.slice(eIndex + 1) let engine + let env try { - engine = await this.getOceanNode().getC2DEngines().getC2DByHash(hash) + engine = await node.getC2DEngines().getC2DByHash(hash) } catch (e) { + const errMsg = e?.message || String(e) + CORE_LOGGER.error(`Invalid C2D Environment: ${errMsg}`) return { stream: null, status: { @@ -71,33 +101,103 @@ export class ComputeStartHandler extends Handler { } } } - const node = this.getOceanNode() - const assets: ComputeAsset[] = [task.dataset] - if (task.additionalDatasets) assets.push(...task.additionalDatasets) + + try { + env = await engine.getComputeEnvironment(null, task.environment) + if (!env) { + return { + stream: null, + status: { + httpStatus: 500, + error: 'Invalid C2D Environment' + } + } + } + if (!task.maxJobDuration || task.maxJobDuration > env.maxJobDuration) { + task.maxJobDuration = env.maxJobDuration + } + task.resources = await engine.checkAndFillMissingResources( + task.resources, + env, + false + ) + } catch (e) { + const errMsg = e?.message || String(e) + CORE_LOGGER.error(`Error checking and filling missing resources: ${errMsg}`) + return { + stream: null, + status: { + httpStatus: 400, + error: errMsg + } + } + } + try { + await engine.checkIfResourcesAreAvailable(task.resources, env, false) + } catch (e) { + if (task.queueMaxWaitTime > 0) { + CORE_LOGGER.verbose( + `Compute resources not available, queuing job for max ${task.queueMaxWaitTime} seconds` + ) + } else { + const errMsg = e?.message || String(e) + CORE_LOGGER.error(`Error checking if resources are available: ${errMsg}`) + return { + stream: null, + status: { + httpStatus: 400, + error: e?.message || String(e) + } + } + } + } const { algorithm } = task - let foundValidCompute = null + const config = await getConfiguration() + + const accessGranted = await validateAccess( + task.consumerAddress, + env.access, + this.getOceanNode() + ) + if (!accessGranted) { + return { + stream: null, + status: { + httpStatus: 403, + error: 'Access denied' + } + } + } const algoChecksums = await getAlgoChecksums( task.algorithm.documentId, task.algorithm.serviceId, - this.getOceanNode() + node, + config ) - if (!algoChecksums.container || !algoChecksums.files) { - CORE_LOGGER.error(`Error retrieveing algorithm checksums!`) + + const isRawCodeAlgorithm = task.algorithm.meta?.rawcode + const hasValidChecksums = algoChecksums.container && algoChecksums.files + + if (!isRawCodeAlgorithm && !hasValidChecksums) { + const errorMessage = + 'Failed to retrieve algorithm checksums. Both container and files checksums are required.' + CORE_LOGGER.error(errorMessage) return { stream: null, status: { httpStatus: 500, - error: `Error retrieveing algorithm checksums!` + error: errorMessage } } } + const policyServer = new PolicyServer() // check algo - for (const elem of [...[task.algorithm], ...assets]) { + for (const elem of [...[task.algorithm], ...task.datasets]) { const result: any = { validOrder: false } if ('documentId' in elem && elem.documentId) { result.did = elem.documentId - result.serviceId = elem.documentId + result.serviceId = elem.serviceId const ddo = await new FindDdoHandler(node).findAndFormatDdo(elem.documentId) if (!ddo) { const error = `DDO ${elem.documentId} not found` @@ -109,6 +209,13 @@ export class ComputeStartHandler extends Handler { } } } + const ddoInstance = DDOManager.getDDOClass(ddo) + const { + chainId: ddoChainId, + metadata, + nftAddress, + credentials + } = ddoInstance.getDDOFields() const isOrdable = isOrderingAllowedForAsset(ddo) if (!isOrdable.isOrdable) { CORE_LOGGER.error(isOrdable.reason) @@ -120,22 +227,19 @@ export class ComputeStartHandler extends Handler { } } } - const service = AssetUtils.getServiceById(ddo, elem.serviceId) - if (!service) { - const error = `Cannot find service ${elem.serviceId} in DDO ${elem.documentId}` + const config = await getConfiguration() + const { chainId } = config.supportedNetworks[ddoChainId] + const oceanNode = this.getOceanNode() + const blockchain = oceanNode.getBlockchain(chainId) + if (!blockchain) { return { stream: null, status: { - httpStatus: 500, - error + httpStatus: 400, + error: `Start Compute: Blockchain instance not available for chain ${chainId}` } } } - - const config = await getConfiguration() - const { rpc, network, chainId, fallbackRPCs } = - config.supportedNetworks[ddo.chainId] - const blockchain = new Blockchain(rpc, network, chainId, fallbackRPCs) const { ready, error } = await blockchain.isNetworkReady() if (!ready) { return { @@ -147,17 +251,105 @@ export class ComputeStartHandler extends Handler { } } - const signer = blockchain.getSigner() + const signer = await blockchain.getSigner() + // check credentials (DDO level) + let accessGrantedDDOLevel: boolean + if (credentials) { + // if POLICY_SERVER_URL exists, then ocean-node will NOT perform any checks. + // It will just use the existing code and let PolicyServer decide. + if (isPolicyServerConfigured()) { + const response = await policyServer.checkStartCompute( + ddo.id, + ddo, + elem.serviceId, + task.consumerAddress, + task.policyServer + ) + accessGrantedDDOLevel = response.success + } else { + accessGrantedDDOLevel = await checkCredentials( + task.consumerAddress, + credentials as Credentials, + await blockchain.getSigner() + ) + } + if (!accessGrantedDDOLevel) { + CORE_LOGGER.logMessage( + `Error: Access to asset ${ddoInstance.getDid()} was denied`, + true + ) + return { + stream: null, + status: { + httpStatus: 403, + error: `Error: Access to asset ${ddoInstance.getDid()} was denied` + } + } + } + } + const service = AssetUtils.getServiceById(ddo, elem.serviceId) + if (!service) { + const error = `Cannot find service ${elem.serviceId} in DDO ${elem.documentId}` + return { + stream: null, + status: { + httpStatus: 500, + error + } + } + } + // check credentials on service level + // if using a policy server and we are here it means that access was granted (they are merged/assessed together) + if (service.credentials) { + let accessGrantedServiceLevel: boolean + if (isPolicyServerConfigured()) { + // we use the previous check or we do it again + // (in case there is no DDO level credentials and we only have Service level ones) + const response = await policyServer.checkStartCompute( + ddoInstance.getDid(), + ddo, + elem.serviceId, + task.consumerAddress, + task.policyServer + ) + accessGrantedServiceLevel = accessGrantedDDOLevel || response.success + } else { + accessGrantedServiceLevel = await checkCredentials( + task.consumerAddress, + service.credentials, + await blockchain.getSigner() + ) + } + + if (!accessGrantedServiceLevel) { + CORE_LOGGER.logMessage( + `Error: Access to service with id ${service.id} was denied`, + true + ) + return { + stream: null, + status: { + httpStatus: 403, + error: `Error: Access to service with id ${service.id} was denied` + } + } + } + } + // let's see if we can access this asset // check if oasis evm or similar - const confidentialEVM = isConfidentialChainDDO(ddo.chainId, service) + const confidentialEVM = isConfidentialChainDDO(BigInt(ddoChainId), service) let canDecrypt = false try { if (!confidentialEVM) { - await decrypt( - Uint8Array.from(Buffer.from(sanitizeServiceFiles(service.files), 'hex')), - EncryptMethod.ECIES - ) + await node + .getKeyManager() + .decrypt( + Uint8Array.from( + Buffer.from(sanitizeServiceFiles(service.files), 'hex') + ), + EncryptMethod.ECIES + ) canDecrypt = true } else { // TODO 'Start compute on confidential EVM!' @@ -165,7 +357,12 @@ export class ComputeStartHandler extends Handler { service.datatokenAddress, signer ) - if (isTemplate4 && (await isERC20Template4Active(ddo.chainId, signer))) { + if (isTemplate4 && (await isERC20Template4Active(ddoChainId, signer))) { + // we need to get the proper data for the signature + const consumeData = + task.consumerAddress + + task.datasets[0].documentId + + getNonceAsNumber(task.consumerAddress) // call smart contract to decrypt const serviceIndex = AssetUtils.getServiceIndexById(ddo, service.id) const filesObject = await getFilesObjectFromConfidentialEVM( @@ -173,8 +370,8 @@ export class ComputeStartHandler extends Handler { service.datatokenAddress, signer, task.consumerAddress, - task.signature, // TODO, we will need to have a signature verification - ddo.id + task.signature, // we will need to have a signature verification + consumeData ) if (filesObject != null) { canDecrypt = true @@ -195,12 +392,16 @@ export class ComputeStartHandler extends Handler { } } } - if (ddo.metadata.type !== 'algorithm') { + if (metadata.type !== 'algorithm') { + const index = task.datasets.findIndex( + (d) => d.documentId === ddoInstance.getDid() + ) + const safeIndex = index === -1 ? 0 : index const validAlgoForDataset = await validateAlgoForDataset( task.algorithm.documentId, algoChecksums, - ddo, - ddo.services[0].id, + ddoInstance, + task.datasets[safeIndex].serviceId, node ) if (!validAlgoForDataset) { @@ -208,17 +409,20 @@ export class ComputeStartHandler extends Handler { stream: null, status: { httpStatus: 400, - error: `Algorithm ${task.algorithm.documentId} not allowed to run on the dataset: ${ddo.id}` + error: `Algorithm ${task.algorithm.documentId} with serviceId ${ + task.algorithm.serviceId + } not allowed to run on the dataset: ${ddoInstance.getDid()} with serviceId: ${ + task.datasets[safeIndex].serviceId + }` } } } } - const provider = blockchain.getProvider() + const provider = await blockchain.getProvider() result.datatoken = service.datatokenAddress - result.chainId = ddo.chainId + result.chainId = ddoChainId - const env = await engine.getComputeEnvironment(ddo.chainId, task.environment) if (!('transferTxId' in elem) || !elem.transferTxId) { const error = `Missing transferTxId for DDO ${elem.documentId}` return { @@ -235,11 +439,11 @@ export class ComputeStartHandler extends Handler { elem.transferTxId, env.consumerAddress, provider, - ddo.nftAddress, + nftAddress, service.datatokenAddress, AssetUtils.getServiceIndexById(ddo, service.id), service.timeout, - blockchain.getSigner() + await blockchain.getSigner() ) if (paymentValidation.isValid === false) { const error = `TxId Service ${elem.transferTxId} is not valid for DDO ${elem.documentId} and service ${service.id}` @@ -252,78 +456,468 @@ export class ComputeStartHandler extends Handler { } } result.validOrder = elem.transferTxId - // start with assumption than we need new providerfees - const validFee: ProviderFeeValidation = - foundValidCompute === null - ? await verifyProviderFees( - elem.transferTxId, - task.consumerAddress, - provider, - service, - task.environment, - 0 - ) - : { - isValid: false, - isComputeValid: false, - message: false, - validUntil: 0 - } - if (validFee.isComputeValid === true) { + if (!('meta' in algorithm) && metadata.type === 'algorithm') { + const { entrypoint, image, tag, checksum } = metadata.algorithm.container + const container = { entrypoint, image, tag, checksum } + algorithm.meta = { + language: metadata.algorithm.language, + version: metadata.algorithm.version, + container + } + } + } + } + // let's lock the amount + const prices = engine.getEnvPricesForToken( + env, + task.payment.chainId, + task.payment.token + ) + if (!prices) { + return { + stream: null, + status: { + httpStatus: 500, + error: `This compute env does not accept payments on chain: ${task.payment.chainId} using token ${task.payment.token}` + } + } + } + const resources: ComputeResourceRequestWithPrice[] = [] + + for (const res of task.resources) { + const price = engine.getResourcePrice(prices, res.id) + resources.push({ + id: res.id, + amount: res.amount, + price + }) + } + const s = { + assets: task.datasets, + algorithm, + output: task.output, + environment: env.id, + owner: task.consumerAddress, + maxJobDuration: task.maxJobDuration, + chainId: task.payment.chainId, + agreementId: '', + resources, + metadata: task.metadata + } + // job ID unicity + const jobId = generateUniqueID(s) + // let's calculate payment needed based on resources request and maxJobDuration + const cost = engine.calculateResourcesCost( + task.resources, + env, + task.payment.chainId, + task.payment.token, + task.maxJobDuration + ) + let agreementId + try { + agreementId = await engine.escrow.createLock( + task.payment.chainId, + jobId, + task.payment.token, + task.consumerAddress, + cost, + engine.escrow.getMinLockTime( + Number(task.maxJobDuration) + Number(task.queueMaxWaitTime) + ) + ) + } catch (e) { + const errMsg = e?.message || String(e) + CORE_LOGGER.error(`Error creating lock: ${errMsg}`) + if (e.message.includes('insufficient funds for intrinsic transaction cost')) { + return { + stream: null, + status: { + httpStatus: 400, + error: + 'Node insufficient gas funds. If you are the node owner, please add gas funds to the node.' + } + } + } + return { + stream: null, + status: { + httpStatus: 400, + error: e?.message || String(e) + } + } + } + try { + const response = await engine.startComputeJob( + task.datasets, + algorithm, + task.output, + env.id, + task.consumerAddress, + task.maxJobDuration, + task.resources, + { + chainId: task.payment.chainId, + token: task.payment.token, + lockTx: agreementId, + claimTx: null, + cost: 0 + }, + jobId, + task.metadata, + task.additionalViewers, + task.queueMaxWaitTime + ) + CORE_LOGGER.logMessage( + 'ComputeStartCommand Response: ' + JSON.stringify(response, null, 2), + true + ) + + return { + stream: Readable.from(JSON.stringify(response)), + status: { + httpStatus: 200 + } + } + } catch (e) { + const errMsg = e?.message || String(e) + CORE_LOGGER.error(`Error starting compute job: ${errMsg}`) + try { + await engine.escrow.cancelExpiredLocks( + task.payment.chainId, + jobId, + task.payment.token, + task.consumerAddress + ) + } catch (cancelError) { + const cancelErrMsg = cancelError?.message || String(cancelError) + CORE_LOGGER.error(`Error canceling expired locks: ${cancelErrMsg}`) + // is fine if it fails + } + return { + stream: null, + status: { + httpStatus: 400, + error: e?.message || String(e) + } + } + } + } catch (error) { + const errMsg = error?.message || String(error) + CORE_LOGGER.error(`Error starting compute job: ${errMsg}`) + return { + stream: null, + status: { + httpStatus: 500, + error: error.message + } + } + } + } +} + +export class FreeComputeStartHandler extends CommandHandler { + validate(command: FreeComputeStartCommand): ValidateParams { + const commandValidation = validateCommandParameters(command, [ + 'algorithm', + 'datasets', + 'environment' + ]) + if (commandValidation.valid) { + if (!isAddress(command.consumerAddress)) { + return buildInvalidRequestMessage( + 'Parameter : "consumerAddress" is not a valid web3 address' + ) + } + } + return commandValidation + } + + async handle(task: FreeComputeStartCommand): Promise { + const thisNode = this.getOceanNode() + const validationResponse = await this.verifyParamsAndRateLimits(task) + if (this.shouldDenyTaskHandling(validationResponse)) { + return validationResponse + } + if (!task.queueMaxWaitTime) { + task.queueMaxWaitTime = 0 + } + const authValidationResponse = await this.validateTokenOrSignature( + task.authorization, + task.consumerAddress, + task.nonce, + task.signature, + String(task.nonce) + ) + if (authValidationResponse.status.httpStatus !== 200) { + return authValidationResponse + } + + let engine = null + try { + // split compute env (which is already in hash-envId format) and get the hash + // then get env which might contain dashes as well + const eIndex = task.environment.indexOf('-') + const hash = task.environment.slice(0, eIndex) + // const envId = task.environment.slice(eIndex + 1) + try { + engine = await thisNode.getC2DEngines().getC2DByHash(hash) + } catch (e) { + return { + stream: null, + status: { + httpStatus: 500, + error: 'Invalid C2D Environment' + } + } + } + if (engine === null) { + return { + stream: null, + status: { + httpStatus: 500, + error: 'Invalid C2D Environment' + } + } + } + const policyServer = new PolicyServer() + for (const elem of [...[task.algorithm], ...task.datasets]) { + if (!('documentId' in elem)) { + continue + } + const ddo = await new FindDdoHandler(this.getOceanNode()).findAndFormatDdo( + elem.documentId + ) + if (!ddo) { + const error = `DDO ${elem.documentId} not found` + return { + stream: null, + status: { + httpStatus: 500, + error + } + } + } + const ddoInstance = DDOManager.getDDOClass(ddo) + const { chainId: ddoChainId, credentials } = ddoInstance.getDDOFields() + const isOrdable = isOrderingAllowedForAsset(ddo) + if (!isOrdable.isOrdable) { + CORE_LOGGER.error(isOrdable.reason) + return { + stream: null, + status: { + httpStatus: 500, + error: isOrdable.reason + } + } + } + const config = await getConfiguration() + const { chainId } = config.supportedNetworks[ddoChainId] + const oceanNode = this.getOceanNode() + const blockchain = oceanNode.getBlockchain(chainId) + if (!blockchain) { + return { + stream: null, + status: { + httpStatus: 400, + error: `Start Compute: Blockchain instance not available for chain ${chainId}` + } + } + } + const { ready, error } = await blockchain.isNetworkReady() + if (!ready) { + return { + stream: null, + status: { + httpStatus: 400, + error: `Start Compute : ${error}` + } + } + } + + // check credentials (DDO level) + let accessGrantedDDOLevel: boolean + if (credentials) { + // if POLICY_SERVER_URL exists, then ocean-node will NOT perform any checks. + // It will just use the existing code and let PolicyServer decide. + if (isPolicyServerConfigured()) { + const response = await policyServer.checkStartCompute( + ddoInstance.getDid(), + ddo, + elem.serviceId, + task.consumerAddress, + task.policyServer + ) + accessGrantedDDOLevel = response.success + } else { + accessGrantedDDOLevel = await checkCredentials( + task.consumerAddress, + credentials as Credentials, + await blockchain.getSigner() + ) + } + if (!accessGrantedDDOLevel) { CORE_LOGGER.logMessage( - `Found a valid compute providerFee ${elem.transferTxId}`, + `Error: Access to asset ${ddoInstance.getDid()} was denied`, true ) - foundValidCompute = { - txId: elem.transferTxId, - chainId: ddo.chainId, - validUntil: validFee.validUntil + return { + stream: null, + status: { + httpStatus: 403, + error: `Error: Access to asset ${ddoInstance.getDid()} was denied` + } } } - if (!('meta' in algorithm) && ddo.metadata.type === 'algorithm') { - const { entrypoint, image, tag, checksum } = ddo.metadata.algorithm.container - const container = { entrypoint, image, tag, checksum } - algorithm.meta = { - language: ddo.metadata.algorithm.language, - version: ddo.metadata.algorithm.version, - container + } + const service = AssetUtils.getServiceById(ddo, elem.serviceId) + if (!service) { + const error = `Cannot find service ${elem.serviceId} in DDO ${elem.documentId}` + return { + stream: null, + status: { + httpStatus: 500, + error } - if ('format' in ddo.metadata.algorithm) { - algorithm.meta.format = ddo.metadata.algorithm.format + } + } + // check credentials on service level + // if using a policy server and we are here it means that access was granted (they are merged/assessed together) + if (service.credentials) { + let accessGrantedServiceLevel: boolean + if (isPolicyServerConfigured()) { + // we use the previous check or we do it again + // (in case there is no DDO level credentials and we only have Service level ones) + const response = await policyServer.checkStartCompute( + ddo.id, + ddo, + service.id, + task.consumerAddress, + task.policyServer + ) + accessGrantedServiceLevel = accessGrantedDDOLevel || response.success + } else { + accessGrantedServiceLevel = await checkCredentials( + task.consumerAddress, + service.credentials, + await blockchain.getSigner() + ) + } + + if (!accessGrantedServiceLevel) { + CORE_LOGGER.logMessage( + `Error: Access to service with id ${service.id} was denied`, + true + ) + return { + stream: null, + status: { + httpStatus: 403, + error: `Error: Access to service with id ${service.id} was denied` + } } } } } - if (!foundValidCompute) { - CORE_LOGGER.logMessage(`Cannot find a valid compute providerFee`, true) + const env = await engine.getComputeEnvironment(null, task.environment) + if (!env) { return { stream: null, status: { - httpStatus: 400, - error: `Invalid compute environment: ${task.environment}` + httpStatus: 500, + error: 'Invalid C2D Environment' } } } - // TODO - hardcoded values. - // - validate providerFees -> will generate chainId & agreementId & validUntil - const { chainId } = foundValidCompute - const agreementId = foundValidCompute.txId - const { validUntil } = foundValidCompute + try { + const accessGranted = await validateAccess( + task.consumerAddress, + env.free.access, + this.getOceanNode() + ) + if (!accessGranted) { + return { + stream: null, + status: { + httpStatus: 403, + error: 'Access denied' + } + } + } + + task.resources = await engine.checkAndFillMissingResources( + task.resources, + env, + true + ) + if (!task.maxJobDuration || task.maxJobDuration > env.free.maxJobDuration) { + task.maxJobDuration = env.free.maxJobDuration + } + } catch (e) { + console.error(e) + return { + stream: null, + status: { + httpStatus: 400, + error: String(e) + } + } + } + try { + await engine.checkIfResourcesAreAvailable(task.resources, env, true) + } catch (e) { + if (task.queueMaxWaitTime > 0) { + CORE_LOGGER.verbose( + `Compute resources not available, queuing job for max ${task.queueMaxWaitTime} seconds` + ) + } else { + return { + stream: null, + status: { + httpStatus: 400, + error: e?.message || String(e) + } + } + } + } + /* + return { + stream: null, + status: { + httpStatus: 200, + error: null + } + } */ + const s = { + assets: task.datasets, + algorithm: task.algorithm, + output: task.output, + environment: task.environment, + owner: task.consumerAddress, + maxJobDuration: task.maxJobDuration, + resources: task.resources, + metadata: task.metadata + } + const jobId = generateUniqueID(s) const response = await engine.startComputeJob( - assets, - algorithm, + task.datasets, + task.algorithm, task.output, + task.environment, task.consumerAddress, - envId, - validUntil, - chainId, - agreementId + task.maxJobDuration, + task.resources, + null, + jobId, + task.metadata, + task.additionalViewers, + task.queueMaxWaitTime ) CORE_LOGGER.logMessage( - 'ComputeStartCommand Response: ' + JSON.stringify(response, null, 2), + 'FreeComputeStartCommand Response: ' + JSON.stringify(response, null, 2), true ) @@ -345,3 +939,58 @@ export class ComputeStartHandler extends Handler { } } } + +async function validateAccess( + consumerAddress: string, + access: ComputeAccessList | undefined, + oceanNode: OceanNode +): Promise { + if (!access) { + return true + } + + if ( + !access.accessLists || + (Object.keys(access.accessLists).length === 0 && access.addresses.length === 0) + ) { + return true + } + + if (access.addresses.includes(consumerAddress)) { + return true + } + + const config = await getConfiguration() + const { supportedNetworks } = config + for (const chain of Object.keys(access.accessLists)) { + const { chainId } = supportedNetworks[chain] + try { + const blockchain = oceanNode.getBlockchain(chainId) + if (!blockchain) { + CORE_LOGGER.logMessage( + `Blockchain instance not available for chain ${chainId}, skipping access list check`, + true + ) + continue + } + const signer = await blockchain.getSigner() + for (const accessListAddress of access.accessLists[chain]) { + const hasAccess = await checkAddressOnAccessList( + accessListAddress, + consumerAddress, + signer + ) + if (hasAccess) { + return true + } + } + } catch (error) { + CORE_LOGGER.logMessage( + `Failed to check access lists on chain ${chain}: ${error.message}`, + true + ) + } + } + + return false +} diff --git a/src/components/core/compute/stopCompute.ts b/src/components/core/compute/stopCompute.ts index 72f3c4662..bed33cd9d 100644 --- a/src/components/core/compute/stopCompute.ts +++ b/src/components/core/compute/stopCompute.ts @@ -1,7 +1,7 @@ import { Readable } from 'stream' import { P2PCommandResponse } from '../../../@types/index.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' -import { Handler } from '../handler/handler.js' +import { CommandHandler } from '../handler/handler.js' import { ComputeStopCommand } from '../../../@types/commands.js' import { ValidateParams, @@ -10,14 +10,9 @@ import { } from '../../httpRoutes/validateCommands.js' import { isAddress } from 'ethers' -export class ComputeStopHandler extends Handler { +export class ComputeStopHandler extends CommandHandler { validate(command: ComputeStopCommand): ValidateParams { - const validation = validateCommandParameters(command, [ - 'consumerAddress', - 'signature', - 'nonce', - 'jobId' - ]) + const validation = validateCommandParameters(command, ['jobId']) if (validation.valid) { if (!isAddress(command.consumerAddress)) { return buildInvalidRequestMessage( @@ -33,6 +28,18 @@ export class ComputeStopHandler extends Handler { if (this.shouldDenyTaskHandling(validationResponse)) { return validationResponse } + + const authValidationResponse = await this.validateTokenOrSignature( + task.authorization, + task.consumerAddress, + task.nonce, + task.signature, + String(task.consumerAddress + (task.jobId || '')) + ) + if (authValidationResponse.status.httpStatus !== 200) { + return authValidationResponse + } + try { // split jobId (which is already in hash-jobId format) and get the hash // then get jobId which might contain dashes as well diff --git a/src/components/core/compute/utils.ts b/src/components/core/compute/utils.ts index c7fbe7940..dcbb4541d 100644 --- a/src/components/core/compute/utils.ts +++ b/src/components/core/compute/utils.ts @@ -1,11 +1,11 @@ import { OceanNode } from '../../../OceanNode.js' -import { AlgoChecksums } from '../../../@types/C2D.js' +import { AlgoChecksums } from '../../../@types/C2D/C2D.js' +import { OceanNodeConfig } from '../../../@types/OceanNode.js' import { ArweaveFileObject, IpfsFileObject, UrlFileObject } from '../../../@types/fileObject.js' -import { DDO } from '../../../@types/DDO/DDO.js' import { getFile } from '../../../utils/file.js' import urlJoin from 'url-join' import { fetchFileMetadata } from '../../../utils/asset.js' @@ -13,15 +13,28 @@ import { fetchFileMetadata } from '../../../utils/asset.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' import { createHash } from 'crypto' import { FindDdoHandler } from '../../core/handler/ddoHandler.js' +import { DDOManager, VersionedDDO } from '@oceanprotocol/ddo-js' + +export function generateUniqueID(jobStructure: any): string { + const timestamp = + BigInt(Date.now()) * 1_000_000n + (process.hrtime.bigint() % 1_000_000n) + const random = Math.random() + const jobId = createHash('sha256') + .update(JSON.stringify(jobStructure) + timestamp.toString() + random.toString()) + .digest('hex') + return jobId +} export async function getAlgoChecksums( algoDID: string, algoServiceId: string, - oceanNode: OceanNode + oceanNode: OceanNode, + config: OceanNodeConfig ): Promise { const checksums: AlgoChecksums = { files: '', - container: '' + container: '', + serviceId: algoServiceId } try { const algoDDO = await new FindDdoHandler(oceanNode).findAndFormatDdo(algoDID) @@ -35,22 +48,21 @@ export async function getAlgoChecksums( file.type === 'url' ? (file as UrlFileObject).url : file.type === 'arweave' - ? urlJoin( - process.env.ARWEAVE_GATEWAY, - (file as ArweaveFileObject).transactionId - ) + ? urlJoin(config.arweaveGateway, (file as ArweaveFileObject).transactionId) : file.type === 'ipfs' - ? urlJoin(process.env.IPFS_GATEWAY, (file as IpfsFileObject).hash) + ? urlJoin(config.ipfsGateway, (file as IpfsFileObject).hash) : null + const headers = file.type === 'url' ? (file as UrlFileObject).headers : undefined - const { contentChecksum } = await fetchFileMetadata(url, 'get', false) + const { contentChecksum } = await fetchFileMetadata(url, 'get', false, headers) checksums.files = checksums.files.concat(contentChecksum) } + const ddoInstance = DDOManager.getDDOClass(algoDDO) + const { metadata } = ddoInstance.getDDOFields() checksums.container = createHash('sha256') .update( - algoDDO.metadata.algorithm.container.entrypoint + - algoDDO.metadata.algorithm.container.checksum + metadata.algorithm.container.entrypoint + metadata.algorithm.container.checksum ) .digest('hex') return checksums @@ -65,54 +77,73 @@ export async function validateAlgoForDataset( algoChecksums: { files: string container: string + serviceId?: string }, - datasetDDO: DDO, + ddoInstance: VersionedDDO, datasetServiceId: string, oceanNode: OceanNode ) { try { - const datasetService = datasetDDO.services.find( - (service) => service.id === datasetServiceId + const { services } = ddoInstance.getDDOFields() as any + const datasetService = services.find( + (service: any) => service.id === datasetServiceId ) if (!datasetService) { throw new Error('Dataset service not found') } + if (datasetService.type === 'access') { + return true + } const { compute } = datasetService if (datasetService.type !== 'compute' || !compute) { throw new Error('Service not compute') } + const publishers = compute.publisherTrustedAlgorithmPublishers || [] + const algorithms = compute.publisherTrustedAlgorithms || [] + + // If no restrictions are set, deny by default + const hasTrustedPublishers = publishers.length > 0 + const hasTrustedAlgorithms = algorithms.length > 0 + if (!hasTrustedPublishers && !hasTrustedAlgorithms) return false if (algoDID) { - if ( - // if not set allow them all - !compute.publisherTrustedAlgorithms && - !compute.publisherTrustedAlgorithmPublishers - ) { - return true - } - // if is set only allow if match - if (compute.publisherTrustedAlgorithms) { - const trustedAlgo = compute.publisherTrustedAlgorithms.find( - (algo) => algo.did === algoDID - ) - if (trustedAlgo) { - return ( - trustedAlgo.filesChecksum === algoChecksums.files && - trustedAlgo.containerSectionChecksum === algoChecksums.container - ) - } - return false - } - if (compute.publisherTrustedAlgorithmPublishers) { - const algoDDO = await new FindDdoHandler(oceanNode).findAndFormatDdo(algoDID) - if (algoDDO) { - return compute.publisherTrustedAlgorithmPublishers - .map((address) => address?.toLowerCase()) - .includes(algoDDO.nftAddress?.toLowerCase()) + // Check if algorithm is explicitly trusted + const isAlgoTrusted = + hasTrustedAlgorithms && + algorithms.some((algo: any) => { + const didMatch = algo.did === '*' || algo.did === algoDID + const filesMatch = + algo.filesChecksum === '*' || algo.filesChecksum === algoChecksums.files + const containerMatch = + algo.containerSectionChecksum === '*' || + algo.containerSectionChecksum === algoChecksums.container + if ('serviceId' in algo) { + const serviceIdMatch = + algo.serviceId === '*' || algo.serviceId === algoChecksums.serviceId + return didMatch && filesMatch && containerMatch && serviceIdMatch + } + + return didMatch && filesMatch && containerMatch + }) + + // Check if algorithm publisher is trusted + let isPublisherTrusted = false + if (hasTrustedPublishers) { + if (!publishers.includes('*')) { + const algoDDO = await new FindDdoHandler(oceanNode).findAndFormatDdo(algoDID) + if (!algoDDO) return false + const algoInstance = DDOManager.getDDOClass(algoDDO) + const { nftAddress } = algoInstance.getDDOFields() + + isPublisherTrusted = publishers + .map((addr: string) => addr?.toLowerCase()) + .includes(nftAddress?.toLowerCase()) + } else { + isPublisherTrusted = true } - return false } - return true + + return isAlgoTrusted || isPublisherTrusted } return compute.allowRawAlgorithm diff --git a/src/components/core/handler/authHandler.ts b/src/components/core/handler/authHandler.ts new file mode 100644 index 000000000..fbe5c45d2 --- /dev/null +++ b/src/components/core/handler/authHandler.ts @@ -0,0 +1,122 @@ +import { CommandHandler } from './handler.js' +import { P2PCommandResponse } from '../../../@types/OceanNode.js' +import { + ValidateParams, + validateCommandParameters +} from '../../httpRoutes/validateCommands.js' +import { ReadableString } from '../../P2P/handlers.js' +import { Command } from '../../../@types/commands.js' +import { Readable } from 'stream' +import { checkNonce, NonceResponse } from '../utils/nonceHandler.js' + +export interface AuthMessage { + address: string + nonce: string + signature: string +} + +export interface CreateAuthTokenCommand extends AuthMessage, Command { + validUntil?: number | null + chainId?: string | null +} + +export interface InvalidateAuthTokenCommand extends AuthMessage, Command { + token: string + chainId?: string | null +} + +export class CreateAuthTokenHandler extends CommandHandler { + validate(command: CreateAuthTokenCommand): ValidateParams { + return validateCommandParameters(command, ['address', 'signature']) + } + + async handle(task: CreateAuthTokenCommand): Promise { + const { address, nonce, signature } = task + const nonceDb = this.getOceanNode().getDatabase().nonce + const validationResponse = await this.verifyParamsAndRateLimits(task) + if (this.shouldDenyTaskHandling(validationResponse)) { + return validationResponse + } + + try { + const nonceCheckResult: NonceResponse = await checkNonce( + nonceDb, + address, + parseInt(nonce), + signature, + String(address + nonce), + task.chainId + ) + + if (!nonceCheckResult.valid) { + return { + stream: null, + status: { httpStatus: 401, error: nonceCheckResult.error } + } + } + + const createdAt = Date.now() + const jwtToken = await this.getOceanNode() + .getAuth() + .getJWTToken(task.address, task.nonce, createdAt) + + await this.getOceanNode() + .getAuth() + .insertToken(task.address, jwtToken, task.validUntil, createdAt, task.chainId) + + return { + stream: Readable.from(JSON.stringify({ token: jwtToken })), + status: { httpStatus: 200, error: null } + } + } catch (error) { + return { + stream: null, + status: { httpStatus: 500, error: `Error creating auth token: ${error}` } + } + } + } +} + +export class InvalidateAuthTokenHandler extends CommandHandler { + validate(command: InvalidateAuthTokenCommand): ValidateParams { + return validateCommandParameters(command, ['address', 'signature', 'token']) + } + + async handle(task: InvalidateAuthTokenCommand): Promise { + const { address, nonce, signature, token } = task + const nonceDb = this.getOceanNode().getDatabase().nonce + const validationResponse = await this.verifyParamsAndRateLimits(task) + if (this.shouldDenyTaskHandling(validationResponse)) { + return validationResponse + } + + try { + const isValid = await checkNonce( + nonceDb, + address, + parseInt(nonce), + signature, + String(address + nonce), + task.chainId + ) + if (!isValid) { + return { + stream: null, + status: { httpStatus: 400, error: 'Invalid signature' } + } + } + + await this.getOceanNode().getAuth().invalidateToken(token) + + return { + stream: new ReadableString(JSON.stringify({ success: true })), + status: { httpStatus: 200, error: null } + } + } catch (error) { + return { + stream: null, + status: { httpStatus: 500, error: `Error invalidating auth token: ${error}` } + } + } + } +} diff --git a/src/components/core/handler/coreHandlersRegistry.ts b/src/components/core/handler/coreHandlersRegistry.ts index 82f0a3540..f84357160 100644 --- a/src/components/core/handler/coreHandlersRegistry.ts +++ b/src/components/core/handler/coreHandlersRegistry.ts @@ -12,10 +12,9 @@ import { import { DownloadHandler } from './downloadHandler.js' import { FileInfoHandler } from './fileInfoHandler.js' import { PolicyServerPassthroughHandler } from './policyServer.js' -import { EchoHandler } from './echoHandler.js' import { EncryptHandler, EncryptFileHandler } from './encryptHandler.js' import { FeesHandler } from './feesHandler.js' -import { Handler } from './handler.js' +import { BaseHandler, CommandHandler } from './handler.js' import { NonceHandler } from './nonceHandler.js' import { QueryHandler } from './queryHandler.js' import { DetailedStatusHandler, StatusHandler } from './statusHandler.js' @@ -23,27 +22,40 @@ import { OceanNode } from '../../../OceanNode.js' import { Command } from '../../../@types/commands.js' import { ComputeGetEnvironmentsHandler, - ComputeStartHandler, + PaidComputeStartHandler, + FreeComputeStartHandler, ComputeStopHandler, ComputeGetStatusHandler, ComputeGetResultHandler, - ComputeInitializeHandler + ComputeInitializeHandler, + ComputeGetStreamableLogsHandler } from '../compute/index.js' import { StopNodeHandler } from '../admin/stopNodeHandler.js' import { ReindexTxHandler } from '../admin/reindexTxHandler.js' import { ReindexChainHandler } from '../admin/reindexChainHandler.js' import { IndexingThreadHandler } from '../admin/IndexingThreadHandler.js' import { CollectFeesHandler } from '../admin/collectFeesHandler.js' +import { FetchConfigHandler } from '../admin/fetchConfigHandler.js' +import { PushConfigHandler } from '../admin/pushConfigHandler.js' +import { AdminCommandHandler } from '../admin/adminHandler.js' +import { + GetP2PPeerHandler, + GetP2PPeersHandler, + GetP2PNetworkStatsHandler, + FindPeerHandler +} from './p2p.js' +import { CreateAuthTokenHandler, InvalidateAuthTokenHandler } from './authHandler.js' +import { GetJobsHandler } from './getJobs.js' export type HandlerRegistry = { handlerName: string // name of the handler - handlerImpl: Handler // class that implements it + handlerImpl: BaseHandler // class that implements it } // we can use this factory class to create adittional handlers // and then register them on the Ocean Node instance export class HandlerFactory { - static buildHandlerForTask(task: Command, impl: Handler): HandlerRegistry { + static buildHandlerForTask(task: Command, impl: BaseHandler): HandlerRegistry { if (!task || !impl) { const msg = 'Invalid task/handler parameters!' OCEAN_NODE_LOGGER.error(msg) @@ -66,7 +78,7 @@ export class CoreHandlersRegistry { // eslint-disable-next-line no-use-before-define private static instance: CoreHandlersRegistry // map of handlers registered - private coreHandlers: Map = new Map() + private coreHandlers: Map = new Map() // private readonly node: OceanP2P private constructor(node: OceanNode) { @@ -85,7 +97,6 @@ export class CoreHandlersRegistry { ) this.registerCoreHandler(PROTOCOL_COMMANDS.FIND_DDO, new FindDdoHandler(node)) this.registerCoreHandler(PROTOCOL_COMMANDS.GET_FEES, new FeesHandler(node)) - this.registerCoreHandler(PROTOCOL_COMMANDS.ECHO, new EchoHandler(node)) this.registerCoreHandler(PROTOCOL_COMMANDS.FILE_INFO, new FileInfoHandler(node)) this.registerCoreHandler( PROTOCOL_COMMANDS.POLICY_SERVER_PASSTHROUGH, @@ -99,7 +110,11 @@ export class CoreHandlersRegistry { ) this.registerCoreHandler( PROTOCOL_COMMANDS.COMPUTE_START, - new ComputeStartHandler(node) + new PaidComputeStartHandler(node) + ) + this.registerCoreHandler( + PROTOCOL_COMMANDS.FREE_COMPUTE_START, + new FreeComputeStartHandler(node) ) this.registerCoreHandler(PROTOCOL_COMMANDS.COMPUTE_STOP, new ComputeStopHandler(node)) this.registerCoreHandler( @@ -110,6 +125,10 @@ export class CoreHandlersRegistry { PROTOCOL_COMMANDS.COMPUTE_GET_RESULT, new ComputeGetResultHandler(node) ) + this.registerCoreHandler( + PROTOCOL_COMMANDS.COMPUTE_GET_STREAMABLE_LOGS, + new ComputeGetStreamableLogsHandler(node) + ) this.registerCoreHandler( PROTOCOL_COMMANDS.COMPUTE_INITIALIZE, new ComputeInitializeHandler(node) @@ -125,17 +144,41 @@ export class CoreHandlersRegistry { new IndexingThreadHandler(node) ) this.registerCoreHandler(PROTOCOL_COMMANDS.COLLECT_FEES, new CollectFeesHandler(node)) + this.registerCoreHandler(PROTOCOL_COMMANDS.GET_P2P_PEER, new GetP2PPeerHandler(node)) + this.registerCoreHandler( + PROTOCOL_COMMANDS.GET_P2P_PEERS, + new GetP2PPeersHandler(node) + ) + this.registerCoreHandler( + PROTOCOL_COMMANDS.GET_P2P_NETWORK_STATS, + new GetP2PNetworkStatsHandler(node) + ) + this.registerCoreHandler(PROTOCOL_COMMANDS.FIND_PEER, new FindPeerHandler(node)) + this.registerCoreHandler( + PROTOCOL_COMMANDS.CREATE_AUTH_TOKEN, + new CreateAuthTokenHandler(node) + ) + this.registerCoreHandler( + PROTOCOL_COMMANDS.INVALIDATE_AUTH_TOKEN, + new InvalidateAuthTokenHandler(node) + ) + this.registerCoreHandler(PROTOCOL_COMMANDS.FETCH_CONFIG, new FetchConfigHandler(node)) + this.registerCoreHandler(PROTOCOL_COMMANDS.PUSH_CONFIG, new PushConfigHandler(node)) + this.registerCoreHandler(PROTOCOL_COMMANDS.JOBS, new GetJobsHandler(node)) } - public static getInstance(node: OceanNode): CoreHandlersRegistry { - if (!CoreHandlersRegistry.instance) { + public static getInstance( + node: OceanNode, + newInstance: boolean = false + ): CoreHandlersRegistry { + if (!CoreHandlersRegistry.instance || newInstance) { this.instance = new CoreHandlersRegistry(node) } return this.instance } // private method for registering the core handlers - private registerCoreHandler(handlerName: string, handlerObj: Handler) { + private registerCoreHandler(handlerName: string, handlerObj: BaseHandler) { if (!this.coreHandlers.has(handlerName)) { this.coreHandlers.set(handlerName, handlerObj) } @@ -145,14 +188,14 @@ export class CoreHandlersRegistry { public registerHandler(handler: HandlerRegistry) { if ( !this.coreHandlers.has(handler.handlerName) && - handler.handlerImpl instanceof Handler + handler.handlerImpl instanceof BaseHandler ) { this.coreHandlers.set(handler.handlerName, handler.handlerImpl) } } // pass the handler name from the SUPPORTED_PROTOCOL_COMMANDS keys - public getHandler(handlerName: string): Handler | null { + public getHandler(handlerName: string): any { if (!SUPPORTED_PROTOCOL_COMMANDS.includes(handlerName)) { OCEAN_NODE_LOGGER.error( `Invalid handler "${handlerName}". No known associated protocol command!` @@ -168,7 +211,7 @@ export class CoreHandlersRegistry { return this.coreHandlers.get(handlerName) } - public getHandlerForTask(task: Command): Handler | null { + public getHandlerForTask(task: Command): CommandHandler | AdminCommandHandler | null { return this.getHandler(task.command) } diff --git a/src/components/core/handler/ddoHandler.ts b/src/components/core/handler/ddoHandler.ts index f9cf76229..d557b32a9 100644 --- a/src/components/core/handler/ddoHandler.ts +++ b/src/components/core/handler/ddoHandler.ts @@ -1,8 +1,9 @@ -import { Handler } from './handler.js' +import { CommandHandler } from './handler.js' +import { OceanNode } from '../../../OceanNode.js' import { EVENTS, MetadataStates, PROTOCOL_COMMANDS } from '../../../utils/constants.js' import { P2PCommandResponse, FindDDOResponse } from '../../../@types/index.js' import { Readable } from 'stream' -import { decrypt, create256Hash } from '../../../utils/crypt.js' +import { create256Hash } from '../../../utils/crypt.js' import { hasCachedDDO, sortFindDDOResults, @@ -11,20 +12,13 @@ import { } from '../utils/findDdoHandler.js' import { toString as uint8ArrayToString } from 'uint8arrays/to-string' import { GENERIC_EMOJIS, LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' -import { sleep, readStream } from '../../../utils/util.js' -import { DDO } from '../../../@types/DDO/DDO.js' +import { sleep, readStream, streamToUint8Array } from '../../../utils/util.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' -import { Blockchain } from '../../../utils/blockchain.js' import { ethers, isAddress } from 'ethers' -import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' } +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } // import lzma from 'lzma-native' import lzmajs from 'lzma-purejs-requirejs' -import { - isRemoteDDO, - getValidationSignature, - makeDid, - validateObject -} from '../utils/validateDdoHandler.js' +import { getValidationSignature, isRemoteDDO } from '../utils/validateDdoHandler.js' import { getConfiguration, hasP2PInterface } from '../../../utils/config.js' import { GetDdoCommand, @@ -32,7 +26,6 @@ import { DecryptDDOCommand, ValidateDDOCommand } from '../../../@types/commands.js' -import { Storage } from '../../../components/storage/index.js' import { EncryptMethod } from '../../../@types/fileObject.js' import { ValidateParams, @@ -44,7 +37,11 @@ import { getNetworkHeight, wasNFTDeployedByOurFactory } from '../../Indexer/utils.js' -import { validateDDOHash } from '../../../utils/asset.js' +import { deleteIndexedMetadataIfExists, validateDDOHash } from '../../../utils/asset.js' +import { Asset, DDO, DDOManager } from '@oceanprotocol/ddo-js' +import { checkCredentialOnAccessList } from '../../../utils/credentials.js' +import { createHash } from 'crypto' +import { Storage } from '../../../components/storage/index.js' const MAX_NUM_PROVIDERS = 5 // after 60 seconds it returns whatever info we have available @@ -52,7 +49,7 @@ const MAX_RESPONSE_WAIT_TIME_SECONDS = 60 // wait time for reading the next getDDO command const MAX_WAIT_TIME_SECONDS_GET_DDO = 5 -export class DecryptDdoHandler extends Handler { +export class DecryptDdoHandler extends CommandHandler { validate(command: DecryptDDOCommand): ValidateParams { const validation = validateCommandParameters(command, [ 'decrypterAddress', @@ -70,6 +67,21 @@ export class DecryptDdoHandler extends Handler { return validation } + checkId(id: string, dataNftAddress: string, chainId: string): Boolean { + const didV5 = + 'did:ope:' + + createHash('sha256') + .update(ethers.getAddress(dataNftAddress) + chainId) + .digest('hex') + + const didV4 = + 'did:op:' + + createHash('sha256') + .update(ethers.getAddress(dataNftAddress) + chainId) + .digest('hex') + return id === didV4 || id === didV5 + } + async handle(task: DecryptDDOCommand): Promise { const validationResponse = await this.verifyParamsAndRateLimits(task) if (this.shouldDenyTaskHandling(validationResponse)) { @@ -80,7 +92,6 @@ export class DecryptDdoHandler extends Handler { try { decrypterAddress = ethers.getAddress(task.decrypterAddress) } catch (error) { - CORE_LOGGER.logMessage(`Decrypt DDO: error ${error}`, true) return { stream: null, status: { @@ -92,10 +103,6 @@ export class DecryptDdoHandler extends Handler { const nonce = Number(task.nonce) if (isNaN(nonce)) { - CORE_LOGGER.logMessage( - `Decrypt DDO: error ${task.nonce} value is not a number`, - true - ) return { stream: null, status: { @@ -110,7 +117,6 @@ export class DecryptDdoHandler extends Handler { const existingNonce = await dbNonce.retrieve(decrypterAddress) if (existingNonce && existingNonce.nonce === nonce) { - CORE_LOGGER.logMessage(`Decrypt DDO: error ${task.nonce} duplicate nonce`, true) return { stream: null, status: { @@ -124,10 +130,8 @@ export class DecryptDdoHandler extends Handler { const chainId = String(task.chainId) const config = await getConfiguration() const supportedNetwork = config.supportedNetworks[chainId] - // check if supported chainId if (!supportedNetwork) { - CORE_LOGGER.logMessage(`Decrypt DDO: Unsupported chain id ${chainId}`, true) return { stream: null, status: { @@ -136,16 +140,15 @@ export class DecryptDdoHandler extends Handler { } } } - + const ourEthAddress = this.getOceanNode().getKeyManager().getEthAddress() if (config.authorizedDecrypters.length > 0) { // allow if on authorized list or it is own node if ( !config.authorizedDecrypters .map((address) => address?.toLowerCase()) .includes(decrypterAddress?.toLowerCase()) && - decrypterAddress?.toLowerCase() !== config.keys.ethAddress?.toLowerCase() + decrypterAddress?.toLowerCase() !== ourEthAddress.toLowerCase() ) { - CORE_LOGGER.logMessage('Decrypt DDO: Decrypter not authorized', true) return { stream: null, status: { @@ -156,12 +159,17 @@ export class DecryptDdoHandler extends Handler { } } - const blockchain = new Blockchain( - supportedNetwork.rpc, - supportedNetwork.network, - supportedNetwork.chainId, - supportedNetwork.fallbackRPCs - ) + const oceanNode = this.getOceanNode() + const blockchain = oceanNode.getBlockchain(supportedNetwork.chainId) + if (!blockchain) { + return { + stream: null, + status: { + httpStatus: 400, + error: `Decrypt DDO: Blockchain instance not available for chain ${supportedNetwork.chainId}` + } + } + } const { ready, error } = await blockchain.isNetworkReady() if (!ready) { return { @@ -173,8 +181,8 @@ export class DecryptDdoHandler extends Handler { } } - const provider = blockchain.getProvider() - const signer = blockchain.getSigner() + const provider = await blockchain.getProvider() + const signer = await blockchain.getSigner() // note: "getOceanArtifactsAdresses()"" is broken for at least optimism sepolia // if we do: artifactsAddresses[supportedNetwork.network] // because on the contracts we have "optimism_sepolia" instead of "optimism-sepolia" @@ -186,12 +194,7 @@ export class DecryptDdoHandler extends Handler { signer, dataNftAddress ) - if (!wasDeployedByUs) { - CORE_LOGGER.logMessage( - 'Decrypt DDO: Asset not deployed by the data NFT factory', - true - ) return { stream: null, status: { @@ -201,11 +204,29 @@ export class DecryptDdoHandler extends Handler { } } + // access list checks, needs blockchain connection + const { authorizedDecryptersList } = config + + const isAllowed = await checkCredentialOnAccessList( + authorizedDecryptersList, + chainId, + decrypterAddress, + signer + ) + if (!isAllowed) { + return { + stream: null, + status: { + httpStatus: 403, + error: `Decrypt DDO: Decrypter ${decrypterAddress} not authorized per access list` + } + } + } + const transactionId = task.transactionId ? String(task.transactionId) : '' let encryptedDocument: Uint8Array let flags: number let documentHash: string - if (transactionId) { try { const receipt = await provider.getTransactionReceipt(transactionId) @@ -228,7 +249,6 @@ export class DecryptDdoHandler extends Handler { encryptedDocument = ethers.getBytes(eventData.args[4]) documentHash = eventData.args[5] } catch (error) { - CORE_LOGGER.logMessage(`Decrypt DDO: error ${error}`, true) return { stream: null, status: { @@ -241,9 +261,9 @@ export class DecryptDdoHandler extends Handler { try { encryptedDocument = ethers.getBytes(task.encryptedDocument) flags = Number(task.flags) + // eslint-disable-next-line prefer-destructuring documentHash = task.documentHash } catch (error) { - CORE_LOGGER.logMessage(`Decrypt DDO: error ${error}`, true) return { stream: null, status: { @@ -253,7 +273,6 @@ export class DecryptDdoHandler extends Handler { } } } - const templateContract = new ethers.Contract( dataNftAddress, ERC721Template.abi, @@ -261,13 +280,7 @@ export class DecryptDdoHandler extends Handler { ) const metaData = await templateContract.getMetaData() const metaDataState = Number(metaData[2]) - if ( - [ - MetadataStates.END_OF_LIFE, - MetadataStates.DEPRECATED, - MetadataStates.REVOKED - ].includes(metaDataState) - ) { + if ([MetadataStates.DEPRECATED, MetadataStates.REVOKED].includes(metaDataState)) { CORE_LOGGER.logMessage(`Decrypt DDO: error metadata state ${metaDataState}`, true) return { stream: null, @@ -277,10 +290,10 @@ export class DecryptDdoHandler extends Handler { } } } - if ( ![ MetadataStates.ACTIVE, + MetadataStates.END_OF_LIFE, MetadataStates.ORDERING_DISABLED, MetadataStates.UNLISTED ].includes(metaDataState) @@ -297,11 +310,12 @@ export class DecryptDdoHandler extends Handler { let decryptedDocument: Buffer // check if DDO is ECIES encrypted - if (flags & 2) { + if ((flags & 2) !== 0) { try { - decryptedDocument = await decrypt(encryptedDocument, EncryptMethod.ECIES) + decryptedDocument = await oceanNode + .getKeyManager() + .decrypt(encryptedDocument, EncryptMethod.ECIES) } catch (error) { - CORE_LOGGER.logMessage(`Decrypt DDO: error ${error}`, true) return { stream: null, status: { @@ -310,9 +324,7 @@ export class DecryptDdoHandler extends Handler { } } } - } - - if (flags & 1) { + } else { try { decryptedDocument = lzmajs.decompressFile(decryptedDocument) /* @@ -325,7 +337,6 @@ export class DecryptDdoHandler extends Handler { ) */ } catch (error) { - CORE_LOGGER.logMessage(`Decrypt DDO: error ${error}`, true) return { stream: null, status: { @@ -338,8 +349,7 @@ export class DecryptDdoHandler extends Handler { // did matches const ddo = JSON.parse(decryptedDocument.toString()) - if (ddo.id !== makeDid(dataNftAddress, chainId)) { - CORE_LOGGER.error(`Decrypted DDO ID is not matching the generated hash for DID.`) + if (ddo.id && !this.checkId(ddo.id, dataNftAddress, chainId)) { return { stream: null, status: { @@ -348,34 +358,41 @@ export class DecryptDdoHandler extends Handler { } } } + const decryptedDocumentString = decryptedDocument.toString() + const ddoObject = JSON.parse(decryptedDocumentString) - // checksum matches - const decryptedDocumentHash = create256Hash(decryptedDocument.toString()) - if (decryptedDocumentHash !== documentHash) { - CORE_LOGGER.logMessage( - `Decrypt DDO: error checksum does not match ${decryptedDocumentHash} with ${documentHash}`, - true - ) - return { - stream: null, - status: { - httpStatus: 400, - error: 'Decrypt DDO: checksum does not match' + let stream = Readable.from(decryptedDocumentString) + if (isRemoteDDO(ddoObject)) { + const storage = Storage.getStorageClass(ddoObject.remote, config) + const result = await storage.getReadableStream() + stream = result.stream as Readable + } else { + // checksum matches + const decryptedDocumentHash = create256Hash(decryptedDocument.toString()) + if (decryptedDocumentHash !== documentHash) { + return { + stream: null, + status: { + httpStatus: 400, + error: 'Decrypt DDO: checksum does not match' + } } } } // check signature try { + const useTxIdOrContractAddress = transactionId || dataNftAddress + const message = String( - transactionId + dataNftAddress + decrypterAddress + chainId + nonce + useTxIdOrContractAddress + decrypterAddress + chainId + nonce ) const messageHash = ethers.solidityPackedKeccak256( ['bytes'], [ethers.hexlify(ethers.toUtf8Bytes(message))] ) + const messageHashBytes = ethers.getBytes(messageHash) const addressFromHashSignature = ethers.verifyMessage(messageHash, task.signature) - const messageHashBytes = ethers.toBeArray(messageHash) const addressFromBytesSignature = ethers.verifyMessage( messageHashBytes, task.signature @@ -388,7 +405,6 @@ export class DecryptDdoHandler extends Handler { throw new Error('address does not match') } } catch (error) { - CORE_LOGGER.logMessage(`Decrypt DDO: error signature ${error}`, true) return { stream: null, status: { @@ -398,23 +414,12 @@ export class DecryptDdoHandler extends Handler { } } - const decryptedDocumentString = decryptedDocument.toString() - const ddoObject = JSON.parse(decryptedDocumentString) - - let stream = Readable.from(decryptedDocumentString) - - if (isRemoteDDO(ddoObject)) { - const storage = Storage.getStorageClass(ddoObject.remote, config) - const result = await storage.getReadableStream() - stream = result.stream as Readable - } - return { stream, status: { httpStatus: 200 } } } catch (error) { - CORE_LOGGER.logMessage(`Decrypt DDO: error ${error}`, true) + CORE_LOGGER.info(`ERROR Decrypt DDO: ${JSON.stringify(error)}`) // should be logged by caller return { stream: null, status: { httpStatus: 500, error: `Decrypt DDO: Unknown error ${error}` } @@ -423,7 +428,7 @@ export class DecryptDdoHandler extends Handler { } } -export class GetDdoHandler extends Handler { +export class GetDdoHandler extends CommandHandler { validate(command: GetDdoCommand): ValidateParams { let validation = validateCommandParameters(command, ['id']) if (validation.valid) { @@ -439,7 +444,15 @@ export class GetDdoHandler extends Handler { return validationResponse } try { - const ddo = await this.getOceanNode().getDatabase().ddo.retrieve(task.id) + const database = this.getOceanNode().getDatabase() + if (!database || !database.ddo) { + CORE_LOGGER.error('DDO database is not available') + return { + stream: null, + status: { httpStatus: 503, error: 'DDO database is not available' } + } + } + const ddo = await database.ddo.retrieve(task.id) if (!ddo) { return { stream: null, @@ -460,7 +473,7 @@ export class GetDdoHandler extends Handler { } } -export class FindDdoHandler extends Handler { +export class FindDdoHandler extends CommandHandler { validate(command: FindDDOCommand): ValidateParams { let validation = validateCommandParameters(command, ['id']) if (validation.valid) { @@ -496,7 +509,6 @@ export class FindDdoHandler extends Handler { // if we have the result cached recently we return that result if (hasCachedDDO(task, p2pNode)) { // 'found cached DDO' - CORE_LOGGER.logMessage('Found local cached version for DDO id: ' + task.id, true) resultList.push(p2pNode.getDDOCache().dht.get(task.id)) return { stream: Readable.from(JSON.stringify(resultList, null, 4)), @@ -505,7 +517,6 @@ export class FindDdoHandler extends Handler { } // otherwise we need to contact other providers and get DDO from them // ids of available providers - const providerIds: string[] = [] let processed = 0 let toProcess = 0 @@ -521,76 +532,56 @@ export class FindDdoHandler extends Handler { updatedCache = true } - // sink fn - const sink = async function (source: any) { - const chunks: string[] = [] - let first = true + const processDDOResponse = async (peer: string, data: Uint8Array) => { try { - for await (const chunk of source) { - if (first) { - first = false - const str = uint8ArrayToString(chunk.subarray()) // Obs: we need to specify the length of the subarrays - const decoded = JSON.parse(str) - if (decoded.httpStatus !== 200) { - processed++ - break + const ddo: any = JSON.parse(uint8ArrayToString(data)) + const isResponseLegit = await checkIfDDOResponseIsLegit(ddo, node) + + if (isResponseLegit) { + const ddoInfo: FindDDOResponse = { + id: ddo.id, + lastUpdateTx: ddo.indexedMetadata.event.txid, + lastUpdateTime: ddo.metadata.updated, + provider: peer + } + resultList.push(ddoInfo) + + CORE_LOGGER.logMessage( + `Successfully processed DDO info, id: ${ddo.id} from remote peer: ${peer}`, + true + ) + + // Update cache + const ddoCache = p2pNode.getDDOCache() + if (ddoCache.dht.has(ddo.id)) { + const localValue: FindDDOResponse = ddoCache.dht.get(ddo.id) + if ( + new Date(ddoInfo.lastUpdateTime) > new Date(localValue.lastUpdateTime) + ) { + // update cached version + ddoCache.dht.set(ddo.id, ddoInfo) } } else { - const str = uint8ArrayToString(chunk.subarray()) - chunks.push(str) + // just add it to the list + ddoCache.dht.set(ddo.id, ddoInfo) } - } // end for chunk - - const ddo: any = JSON.parse(chunks.toString()) - - chunks.length = 0 - // process it - if (providerIds.length > 0) { - const peer = providerIds.pop() - const isResponseLegit = await checkIfDDOResponseIsLegit(ddo) - if (isResponseLegit) { - const ddoInfo: FindDDOResponse = { - id: ddo.id, - lastUpdateTx: ddo.event.tx, - lastUpdateTime: ddo.metadata.updated, - provider: peer - } - resultList.push(ddoInfo) + updatedCache = true - CORE_LOGGER.logMessage( - `Succesfully processed DDO info, id: ${ddo.id} from remote peer: ${peer}`, - true - ) - - // is it cached? - const ddoCache = p2pNode.getDDOCache() - if (ddoCache.dht.has(ddo.id)) { - const localValue: FindDDOResponse = ddoCache.dht.get(ddo.id) - if ( - new Date(ddoInfo.lastUpdateTime) > new Date(localValue.lastUpdateTime) - ) { - // update cached version - ddoCache.dht.set(ddo.id, ddoInfo) - } - } else { - // just add it to the list - ddoCache.dht.set(ddo.id, ddoInfo) - } - updatedCache = true - // also store it locally on db - if (configuration.hasIndexer) { - const ddoExistsLocally = await node.getDatabase().ddo.retrieve(ddo.id) + // Store locally if indexer is enabled + if (configuration.hasIndexer) { + const database = node.getDatabase() + if (database && database.ddo) { + const ddoExistsLocally = await database.ddo.retrieve(ddo.id) if (!ddoExistsLocally) { p2pNode.storeAndAdvertiseDDOS([ddo]) } } - } else { - CORE_LOGGER.warn( - `Cannot confirm validity of ${ddo.id} fetch from remote node, skipping it...` - ) } + } else { + CORE_LOGGER.warn( + `Cannot confirm validity of ${ddo.id} from remote node, skipping it...` + ) } - processed++ } catch (err) { CORE_LOGGER.logMessageWithEmoji( 'FindDDO: Error on sink function: ' + err.message, @@ -598,10 +589,9 @@ export class FindDdoHandler extends Handler { GENERIC_EMOJIS.EMOJI_CROSS_MARK, LOG_LEVELS_STR.LEVEL_ERROR ) - processed++ } + processed++ } - // end sink // if something goes really bad then exit after 60 secs const fnTimeout = setTimeout(() => { @@ -613,7 +603,7 @@ export class FindDdoHandler extends Handler { }, 1000 * MAX_RESPONSE_WAIT_TIME_SECONDS) // check other providers for this ddo - const providers = await p2pNode.getProvidersForDid(task.id) + const providers = await p2pNode.getProvidersForString(task.id) // check if includes self and exclude from check list if (providers.length > 0) { // exclude this node from the providers list if present @@ -640,27 +630,22 @@ export class FindDdoHandler extends Handler { id: task.id, command: PROTOCOL_COMMANDS.GET_DDO } - // NOTE: do not push to response until we verify that it is legitimate - providerIds.push(peer) try { - // problem here is that even if we get the P2PCommandResponse right after await(), we still don't know - // exactly when the chunks are written/processed/received on the sink function - // so, better to wait/sleep some small amount of time before proceeding to the next one - const response: P2PCommandResponse = await p2pNode.sendTo( - peer, - JSON.stringify(getCommand), - sink - ) - if (response.status.httpStatus !== 200) { - providerIds.pop() // move to the next one + const response = await p2pNode.sendTo(peer, JSON.stringify(getCommand)) + + if (response.status.httpStatus === 200 && response.stream) { + // Convert stream to Uint8Array for processing + const data = await streamToUint8Array(response.stream as Readable) + await processDDOResponse(peer, data) + } else { processed++ } } catch (innerException) { - providerIds.pop() // ignore this one processed++ } // 'sleep 5 seconds...' + CORE_LOGGER.logMessage( `Sleeping for: ${MAX_WAIT_TIME_SECONDS_GET_DDO} seconds, while getting DDO info remote peer...`, true @@ -725,8 +710,16 @@ export class FindDdoHandler extends Handler { // First try to find the DDO Locally if findDDO is not enforced if (!force) { try { - const ddo = await node.getDatabase().ddo.retrieve(ddoId) - return ddo as DDO + const database = node.getDatabase() + if (database && database.ddo) { + const ddo = await database.ddo.retrieve(ddoId) + return ddo as DDO + } else { + CORE_LOGGER.logMessage( + `DDO database is not available. Proceeding to call findDDO`, + true + ) + } } catch (error) { CORE_LOGGER.logMessage( `Unable to find DDO locally. Proceeding to call findDDO`, @@ -756,7 +749,7 @@ export class FindDdoHandler extends Handler { const formattedServices = ddoData.services.map(formatService) // Map the DDO data to the DDO interface - const ddo: DDO = { + const ddo: Asset = { '@context': ddoData['@context'], id: ddoData.id, version: ddoData.version, @@ -765,7 +758,11 @@ export class FindDdoHandler extends Handler { metadata: ddoData.metadata, services: formattedServices, credentials: ddoData.credentials, - event: ddoData.event + indexedMetadata: { + stats: ddoData.indexedMetadata.stats, + event: ddoData.indexedMetadata.event, + nft: ddoData.indexedMetadata.nft + } } return ddo @@ -783,7 +780,7 @@ export class FindDdoHandler extends Handler { } } -export class ValidateDDOHandler extends Handler { +export class ValidateDDOHandler extends CommandHandler { validate(command: ValidateDDOCommand): ValidateParams { let validation = validateCommandParameters(command, ['ddo']) if (validation.valid) { @@ -798,12 +795,28 @@ export class ValidateDDOHandler extends Handler { if (this.shouldDenyTaskHandling(validationResponse)) { return validationResponse } - try { - const validation = await validateObject( - task.ddo, - task.ddo.chainId, - task.ddo.nftAddress + let shouldSign = false + const configuration = await getConfiguration() + if (configuration.validateUnsignedDDO) { + shouldSign = true + } + if (task.authorization || task.signature || task.nonce || task.publisherAddress) { + const validationResponse = await this.validateTokenOrSignature( + task.authorization, + task.publisherAddress, + task.nonce, + task.signature, + String(task.publisherAddress + task.nonce) ) + if (validationResponse.status.httpStatus !== 200) { + return validationResponse + } + shouldSign = true + } + + try { + const ddoInstance = DDOManager.getDDOClass(task.ddo) + const validation = await ddoInstance.validate() if (validation[0] === false) { CORE_LOGGER.logMessageWithEmoji( `Validation failed with error: ${validation[1]}`, @@ -816,9 +829,12 @@ export class ValidateDDOHandler extends Handler { status: { httpStatus: 400, error: `Validation error: ${validation[1]}` } } } - const signature = await getValidationSignature(JSON.stringify(task.ddo)) return { - stream: Readable.from(JSON.stringify(signature)), + stream: shouldSign + ? Readable.from( + JSON.stringify(await getValidationSignature(JSON.stringify(task.ddo))) + ) + : null, status: { httpStatus: 200 } } } catch (error) { @@ -836,6 +852,32 @@ export class ValidateDDOHandler extends Handler { } } +export function validateDdoSignedByPublisher( + ddo: DDO, + nonce: string, + signature: string, + publisherAddress: string +): boolean { + try { + const message = ddo.id + nonce + const messageHash = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.getBytes(messageHash) + // Try both verification methods for backward compatibility + const addressFromHashSignature = ethers.verifyMessage(messageHash, signature) + const addressFromBytesSignature = ethers.verifyMessage(messageHashBytes, signature) + return ( + addressFromHashSignature?.toLowerCase() === publisherAddress?.toLowerCase() || + addressFromBytesSignature?.toLowerCase() === publisherAddress?.toLowerCase() + ) + } catch (error) { + CORE_LOGGER.logMessage(`Error: ${error}`, true) + return false + } +} + export function validateDDOIdentifier(identifier: string): ValidateParams { const valid = identifier && identifier.length > 0 && identifier.startsWith('did:op') if (!valid) { @@ -853,14 +895,21 @@ export function validateDDOIdentifier(identifier: string): ValidateParams { /** * Checks if the response is legit * @param ddo the DDO + * @param oceanNode the OceanNode instance * @returns validation result */ -async function checkIfDDOResponseIsLegit(ddo: any): Promise { - const { nftAddress, chainId, event } = ddo - let isValid = validateDDOHash(ddo.id, nftAddress, chainId) +async function checkIfDDOResponseIsLegit( + ddo: any, + oceanNode: OceanNode +): Promise { + const clonedDdo = structuredClone(ddo) + const { indexedMetadata } = clonedDdo + const updatedDdo = deleteIndexedMetadataIfExists(ddo) + const { nftAddress, chainId } = updatedDdo + let isValid = validateDDOHash(updatedDdo.id, nftAddress, chainId) // 1) check hash sha256(nftAddress + chainId) if (!isValid) { - CORE_LOGGER.error(`Asset ${ddo.id} does not have a valid hash`) + CORE_LOGGER.error(`Asset ${updatedDdo.id} does not have a valid hash`) return false } @@ -879,13 +928,14 @@ async function checkIfDDOResponseIsLegit(ddo: any): Promise { return false } // 4) check if was deployed by our factory - const blockchain = new Blockchain( - network.rpc, - network.network, - chainId, - network.fallbackRPCs - ) - const signer = blockchain.getSigner() + const blockchain = oceanNode.getBlockchain(chainId as number) + if (!blockchain) { + CORE_LOGGER.error( + `Blockchain instance not available for chain ${chainId}, cannot confirm validation.` + ) + return false + } + const signer = await blockchain.getSigner() const wasDeployedByUs = await wasNFTDeployedByOurFactory( chainId as number, @@ -894,24 +944,31 @@ async function checkIfDDOResponseIsLegit(ddo: any): Promise { ) if (!wasDeployedByUs) { - CORE_LOGGER.error(`Asset ${ddo.id} not deployed by the data NFT factory`) + CORE_LOGGER.error(`Asset ${updatedDdo.id} not deployed by the data NFT factory`) return false } // 5) check block & events - const networkBlock = await getNetworkHeight(blockchain.getProvider()) - if (!event.block || event.block < 0 || networkBlock < event.block) { - CORE_LOGGER.error(`Event block: ${event.block} is either missing or invalid`) + const networkBlock = await getNetworkHeight(await blockchain.getProvider()) + if ( + !indexedMetadata.event.block || + indexedMetadata.event.block < 0 || + networkBlock < indexedMetadata.event.block + ) { + CORE_LOGGER.error( + `Event block: ${indexedMetadata.event.block} is either missing or invalid` + ) return false } // check events on logs - const txId: string = event.tx // NOTE: DDO is txid, Asset is tx + const txId: string = indexedMetadata.event.txid || indexedMetadata.event.tx // NOTE: DDO is txid, Asset is tx if (!txId) { CORE_LOGGER.error(`DDO event missing tx data, cannot confirm transaction`) return false } - const receipt = await blockchain.getProvider().getTransactionReceipt(txId) + const provider = await blockchain.getProvider() + const receipt = await provider.getTransactionReceipt(txId) let foundEvents = false if (receipt) { const { logs } = receipt diff --git a/src/components/core/handler/downloadHandler.ts b/src/components/core/handler/downloadHandler.ts index 1f50f772f..f57f5d789 100644 --- a/src/components/core/handler/downloadHandler.ts +++ b/src/components/core/handler/downloadHandler.ts @@ -1,16 +1,9 @@ -import { Handler } from './handler.js' -import { checkNonce, NonceResponse } from '../utils/nonceHandler.js' -import { - ENVIRONMENT_VARIABLES, - MetadataStates, - PROTOCOL_COMMANDS -} from '../../../utils/constants.js' +import { CommandHandler } from './handler.js' +import { MetadataStates, PROTOCOL_COMMANDS } from '../../../utils/constants.js' import { P2PCommandResponse } from '../../../@types/OceanNode.js' import { verifyProviderFees } from '../utils/feesHandler.js' -import { decrypt } from '../../../utils/crypt.js' import { FindDdoHandler } from './ddoHandler.js' import crypto from 'crypto' -import * as ethCrypto from 'eth-crypto' import { GENERIC_EMOJIS, LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' import { validateOrderTransaction } from '../utils/validateOrders.js' import { @@ -20,13 +13,8 @@ import { isDataTokenTemplate4, isERC20Template4Active } from '../../../utils/asset.js' -import { Service } from '../../../@types/DDO/Service.js' -import { ArweaveStorage, IpfsStorage, Storage } from '../../storage/index.js' -import { - Blockchain, - existsEnvironmentVariable, - getConfiguration -} from '../../../utils/index.js' +import { Storage } from '../../storage/index.js' +import { getConfiguration, isPolicyServerConfigured } from '../../../utils/index.js' import { checkCredentials } from '../../../utils/credentials.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' import { OceanNode } from '../../../OceanNode.js' @@ -37,22 +25,21 @@ import { validateCommandParameters, ValidateParams } from '../../httpRoutes/validateCommands.js' -import { DDO } from '../../../@types/DDO/DDO.js' import { sanitizeServiceFiles } from '../../../utils/util.js' -import { getNFTContract } from '../../Indexer/utils.js' import { OrdableAssetResponse } from '../../../@types/Asset.js' import { PolicyServer } from '../../policyServer/index.js' +import { Asset, Credentials, DDO, DDOManager, Service } from '@oceanprotocol/ddo-js' export const FILE_ENCRYPTION_ALGORITHM = 'aes-256-cbc' -export function isOrderingAllowedForAsset(asset: DDO): OrdableAssetResponse { +export function isOrderingAllowedForAsset(asset: Asset): OrdableAssetResponse { if (!asset) { return { isOrdable: false, reason: `Asset provided is either null, either undefined ${asset}` } } else if ( - asset.nft && - !(asset.nft.state in [MetadataStates.ACTIVE, MetadataStates.UNLISTED]) + asset.indexedMetadata.nft && + !(asset.indexedMetadata.nft.state in [MetadataStates.ACTIVE, MetadataStates.UNLISTED]) ) { return { isOrdable: false, @@ -77,29 +64,12 @@ export async function handleDownloadUrlCommand( try { // Determine the type of storage and get a readable stream const storage = Storage.getStorageClass(task.fileObject, config) - if ( - storage instanceof ArweaveStorage && - !existsEnvironmentVariable(ENVIRONMENT_VARIABLES.ARWEAVE_GATEWAY) - ) { - CORE_LOGGER.logMessageWithEmoji( - 'Failure executing downloadURL task: Oean-node does not support arweave storage type files! ', - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - return { - stream: null, - status: { - httpStatus: 501, - error: 'Error: Oean-node does not support arweave storage type files!' - } - } - } else if ( - storage instanceof IpfsStorage && - !existsEnvironmentVariable(ENVIRONMENT_VARIABLES.IPFS_GATEWAY) - ) { + + // Validate storage configuration (checks if gateways are configured) + const [isValid, validationError] = storage.validate() + if (!isValid) { CORE_LOGGER.logMessageWithEmoji( - 'Failure executing downloadURL task: Oean-node does not support ipfs storage type files! ', + `Failure executing downloadURL task: ${validationError}`, true, GENERIC_EMOJIS.EMOJI_CROSS_MARK, LOG_LEVELS_STR.LEVEL_ERROR @@ -108,7 +78,7 @@ export async function handleDownloadUrlCommand( stream: null, status: { httpStatus: 501, - error: 'Error: Oean-node does not support ipfs storage type files!' + error: `Error: ${validationError}` } } } @@ -130,13 +100,10 @@ export async function handleDownloadUrlCommand( `attachment;filename=${fileMetadata.name}` if (encryptFile) { // we parse the string into the object again - const encryptedObject = ethCrypto.cipher.parse(task.aes_encrypted_key) - // get the key from configuration - const nodePrivateKey = Buffer.from(config.keys.privateKey).toString('hex') - const decrypted = await ethCrypto.decryptWithPrivateKey( - nodePrivateKey, - encryptedObject - ) + + const decrypted = await node + .getKeyManager() + .ethCryptoDecryptWithPrivateKey(task.aes_encrypted_key) const decryptedPayload = JSON.parse(decrypted) // check signature // const senderAddress = ethCrypto.recover( @@ -192,12 +159,14 @@ export async function handleDownloadUrlCommand( } export function validateFilesStructure( - ddo: DDO, + ddo: DDO | Record, service: Service, decriptedFileObject: any ): boolean { + const ddoInstance = DDOManager.getDDOClass(ddo) + const { nftAddress } = ddoInstance.getDDOFields() if ( - decriptedFileObject.nftAddress?.toLowerCase() !== ddo.nftAddress?.toLowerCase() || + decriptedFileObject.nftAddress?.toLowerCase() !== nftAddress?.toLowerCase() || decriptedFileObject.datatokenAddress?.toLowerCase() !== service.datatokenAddress?.toLowerCase() ) { @@ -206,22 +175,30 @@ export function validateFilesStructure( return true } -export class DownloadHandler extends Handler { +export class DownloadHandler extends CommandHandler { validate(command: DownloadCommand): ValidateParams { return validateCommandParameters(command, [ 'fileIndex', 'documentId', 'serviceId', - 'transferTxId', - 'nonce', - 'consumerAddress', - 'signature' + 'transferTxId' ]) } // No encryption here yet async handle(task: DownloadCommand): Promise { const validationResponse = await this.verifyParamsAndRateLimits(task) + const isAuthRequestValid = await this.validateTokenOrSignature( + task.authorization, + task.consumerAddress, + task.nonce, + task.signature, + String(task.documentId + task.nonce) + ) + if (isAuthRequestValid.status.httpStatus !== 200) { + return isAuthRequestValid + } + if (this.shouldDenyTaskHandling(validationResponse)) { return validationResponse } @@ -233,7 +210,7 @@ export class DownloadHandler extends Handler { const ddo = await handler.findAndFormatDdo(task.documentId) if (ddo) { - CORE_LOGGER.logMessage('DDO for asset found: ' + ddo, true) + CORE_LOGGER.logMessage('DDO for asset found: ' + JSON.stringify(ddo), true) } else { CORE_LOGGER.logMessage( 'No DDO for asset found. Cannot proceed with download.', @@ -247,6 +224,14 @@ export class DownloadHandler extends Handler { } } } + const ddoInstance = DDOManager.getDDOClass(ddo) + const { + chainId: ddoChainId, + nftAddress, + metadata, + credentials + } = ddoInstance.getDDOFields() + const policyServer = new PolicyServer() const isOrdable = isOrderingAllowedForAsset(ddo) if (!isOrdable.isOrdable) { @@ -261,7 +246,7 @@ export class DownloadHandler extends Handler { } // 2. Validate ddo and credentials - if (!ddo.chainId || !ddo.nftAddress || !ddo.metadata) { + if (!ddoChainId || !nftAddress || !metadata) { CORE_LOGGER.logMessage('Error: DDO malformed or disabled', true) return { stream: null, @@ -272,51 +257,24 @@ export class DownloadHandler extends Handler { } } - // check credentials - if (ddo.credentials) { - const accessGranted = checkCredentials(ddo.credentials, task.consumerAddress) - if (!accessGranted) { - CORE_LOGGER.logMessage(`Error: Access to asset ${ddo.id} was denied`, true) + // Initialize blockchain early (needed for credential checks with accessList) + const config = await getConfiguration() + const { chainId } = config.supportedNetworks[ddoChainId] + let provider + let blockchain + let oceanNode: OceanNode + try { + oceanNode = this.getOceanNode() + blockchain = oceanNode.getBlockchain(chainId) + if (!blockchain) { return { stream: null, status: { - httpStatus: 403, - error: `Error: Access to asset ${ddo.id} was denied` + httpStatus: 400, + error: `Download handler: Blockchain instance not available for chain ${chainId}` } } } - } - - // 3. Validate nonce and signature - const nonceCheckResult: NonceResponse = await checkNonce( - this.getOceanNode().getDatabase().nonce, - task.consumerAddress, - parseInt(task.nonce), - task.signature, - String(ddo.id + task.nonce) - ) - - if (!nonceCheckResult.valid) { - CORE_LOGGER.logMessage( - 'Invalid nonce or signature, unable to proceed with download: ' + - nonceCheckResult.error, - true - ) - return { - stream: null, - status: { - httpStatus: 500, - error: nonceCheckResult.error - } - } - } - // from now on, we need blockchain checks - const config = await getConfiguration() - const { rpc, network, chainId, fallbackRPCs } = config.supportedNetworks[ddo.chainId] - let provider - let blockchain - try { - blockchain = new Blockchain(rpc, network, chainId, fallbackRPCs) const { ready, error } = await blockchain.isNetworkReady() if (!ready) { return { @@ -327,7 +285,7 @@ export class DownloadHandler extends Handler { } } } - provider = blockchain.getProvider() + provider = await blockchain.getProvider() } catch (e) { CORE_LOGGER.error('Download JsonRpcProvider ERROR: ' + e.message) return { @@ -338,57 +296,71 @@ export class DownloadHandler extends Handler { } } } - if (!rpc) { - CORE_LOGGER.logMessage( - `Cannot proceed with download. RPC not configured for this chain ${ddo.chainId}`, - true - ) - return { - stream: null, - status: { - httpStatus: 500, - error: `Cannot proceed with download. RPC not configured for this chain ${ddo.chainId}` - } + + // check credentials (DDO level) + let accessGrantedDDOLevel: boolean + if (credentials) { + // if POLICY_SERVER_URL exists, then ocean-node will NOT perform any checks. + // It will just use the existing code and let PolicyServer decide. + if (isPolicyServerConfigured()) { + const response = await policyServer.checkDownload( + ddoInstance.getDid(), + ddo, + task.serviceId, + task.consumerAddress, + task.policyServer + ) + accessGrantedDDOLevel = response.success + } else { + accessGrantedDDOLevel = await checkCredentials( + task.consumerAddress, + credentials as Credentials, + await blockchain.getSigner() + ) } - } - // check lifecycle state of the asset - const nftContract = getNFTContract(blockchain.getSigner(), ddo.nftAddress) - const nftState = Number(await nftContract.metaDataState()) - if (nftState !== 0 && nftState !== 5) { - CORE_LOGGER.logMessage( - `Error: Asset with id ${ddo.id} is not in an active state`, - true - ) - return { - stream: null, - status: { - httpStatus: 500, - error: `Error: Asset with id ${ddo.id} is not in an active state` + if (!accessGrantedDDOLevel) { + CORE_LOGGER.logMessage( + `Error: Access to asset ${ddoInstance.getDid()} was denied`, + true + ) + return { + stream: null, + status: { + httpStatus: 403, + error: `Error: Access to asset ${ddoInstance.getDid()} was denied` + } } } } - let service: Service = AssetUtils.getServiceById(ddo, task.serviceId) + + let service = AssetUtils.getServiceById(ddo, task.serviceId) if (!service) service = AssetUtils.getServiceByIndex(ddo, Number(task.serviceId)) if (!service) throw new Error('Cannot find service') - // check lifecycle state of the service - undefined state is considered active - if (service.state && service.state !== 0 && service.state !== 5) { - CORE_LOGGER.logMessage( - `Error: Service with id ${service.id} is not in an active state`, - true - ) - return { - stream: null, - status: { - httpStatus: 500, - error: `Error: Service with id ${service.id} is not in an active state` - } - } - } // check credentials on service level + // if using a policy server and we are here it means that access was granted (they are merged/assessed together) if (service.credentials) { - const accessGranted = checkCredentials(service.credentials, task.consumerAddress) - if (!accessGranted) { + let accessGrantedServiceLevel: boolean + if (isPolicyServerConfigured()) { + // we use the previous check or we do it again + // (in case there is no DDO level credentials and we only have Service level ones) + const response = await policyServer.checkDownload( + ddoInstance.getDid(), + ddo, + service.id, + task.consumerAddress, + task.policyServer + ) + accessGrantedServiceLevel = accessGrantedDDOLevel || response.success + } else { + accessGrantedServiceLevel = await checkCredentials( + task.consumerAddress, + service.credentials, + await blockchain.getSigner() + ) + } + + if (!accessGrantedServiceLevel) { CORE_LOGGER.logMessage( `Error: Access to service with id ${service.id} was denied`, true @@ -396,12 +368,13 @@ export class DownloadHandler extends Handler { return { stream: null, status: { - httpStatus: 500, + httpStatus: 403, error: `Error: Access to service with id ${service.id} was denied` } } } } + // 4. Check service type const serviceType = service.type if (serviceType === 'compute') { @@ -409,9 +382,7 @@ export class DownloadHandler extends Handler { // get all compute envs const computeAddrs: string[] = [] - const environments = await this.getOceanNode() - .getC2DEngines() - .fetchEnvironments(ddo.chainId) + const environments = await oceanNode.getC2DEngines().fetchEnvironments(ddo.chainId) for (const env of environments) computeAddrs.push(env.consumerAddress?.toLowerCase()) @@ -432,9 +403,7 @@ export class DownloadHandler extends Handler { task.transferTxId, task.consumerAddress, provider, - service, - null, - null + service ) if (!validFee.isValid) { return { @@ -451,11 +420,11 @@ export class DownloadHandler extends Handler { task.transferTxId, task.consumerAddress, provider, - ddo.nftAddress, + nftAddress, service.datatokenAddress, AssetUtils.getServiceIndexById(ddo, task.serviceId), service.timeout, - blockchain.getSigner() + await blockchain.getSigner() ) if (paymentValidation.isValid) { @@ -476,26 +445,6 @@ export class DownloadHandler extends Handler { } } } - // policyServer check - const policyServer = new PolicyServer() - const policyStatus = await policyServer.checkDownload( - ddo.id, - ddo, - service.id, - task.fileIndex, - task.transferTxId, - task.consumerAddress, - task.policyServer - ) - if (!policyStatus.success) { - return { - stream: null, - status: { - httpStatus: 405, - error: policyStatus.message - } - } - } try { // 7. Decrypt the url @@ -504,13 +453,13 @@ export class DownloadHandler extends Handler { let decriptedFileObject: any = null let decryptedFileData: any = null // check if confidential EVM - const confidentialEVM = isConfidentialChainDDO(ddo.chainId, service) + const confidentialEVM = isConfidentialChainDDO(BigInt(ddoChainId), service) // check that files is missing and template 4 is active on the chain if (confidentialEVM) { - const signer = blockchain.getSigner() + const signer = await blockchain.getSigner() const isTemplate4 = await isDataTokenTemplate4(service.datatokenAddress, signer) - if (!isTemplate4 || !(await isERC20Template4Active(ddo.chainId, signer))) { + if (!isTemplate4 || !(await isERC20Template4Active(ddoChainId, signer))) { const errorMsg = 'Cannot decrypt DDO files, Template 4 is not active for confidential EVM!' CORE_LOGGER.error(errorMsg) @@ -537,21 +486,38 @@ export class DownloadHandler extends Handler { task.signature, consumerMessage ) - decryptedFileData = JSON.parse(filesObject) decriptedFileObject = decryptedFileData.files[task.fileIndex] + CORE_LOGGER.info('decrypted file obj for headers') + CORE_LOGGER.info(JSON.stringify(decriptedFileObject)) } } else { // non confidential EVM filesObject = service.files + CORE_LOGGER.info('filesObject file obj for headers in else') + CORE_LOGGER.info(JSON.stringify(filesObject)) const uint8ArrayHex = Uint8Array.from( Buffer.from(sanitizeServiceFiles(filesObject), 'hex') ) - const decryptedUrlBytes = await decrypt(uint8ArrayHex, EncryptMethod.ECIES) + const decryptedUrlBytes = await oceanNode + .getKeyManager() + .decrypt(uint8ArrayHex, EncryptMethod.ECIES) // Convert the decrypted bytes back to a string const decryptedFilesString = Buffer.from(decryptedUrlBytes).toString() decryptedFileData = JSON.parse(decryptedFilesString) decriptedFileObject = decryptedFileData.files[task.fileIndex] + CORE_LOGGER.info(JSON.stringify(decriptedFileObject)) + } + + if (decriptedFileObject?.url && task.userData) { + const url = new URL(decriptedFileObject.url) + const userDataObj = + typeof task.userData === 'string' ? JSON.parse(task.userData) : task.userData + for (const [key, value] of Object.entries(userDataObj)) { + url.searchParams.append(key, String(value)) + } + decriptedFileObject.url = url.toString() + CORE_LOGGER.info('Appended userData to file url: ' + decriptedFileObject.url) } if (!validateFilesStructure(ddo, service, decryptedFileData)) { diff --git a/src/components/core/handler/echoHandler.ts b/src/components/core/handler/echoHandler.ts deleted file mode 100644 index 9c97bb284..000000000 --- a/src/components/core/handler/echoHandler.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { P2PCommandResponse } from '../../../@types/index.js' -import { EchoCommand } from '../../../@types/commands.js' -import { ReadableString } from '../../P2P/handleProtocolCommands.js' -import { - validateCommandParameters, - ValidateParams -} from '../../httpRoutes/validateCommands.js' -import { Handler } from './handler.js' - -export class EchoHandler extends Handler { - validate(command: EchoCommand): ValidateParams { - return validateCommandParameters(command, []) - } - - async handle(task: EchoCommand): Promise { - const validationResponse = await this.verifyParamsAndRateLimits(task) - if (this.shouldDenyTaskHandling(validationResponse)) { - return validationResponse - } - return { - status: { - httpStatus: 200, - error: null - }, - stream: new ReadableString('OK') - } - } -} diff --git a/src/components/core/handler/encryptHandler.ts b/src/components/core/handler/encryptHandler.ts index 43213085a..f2acf4d0b 100644 --- a/src/components/core/handler/encryptHandler.ts +++ b/src/components/core/handler/encryptHandler.ts @@ -1,11 +1,11 @@ -import { Handler } from './handler.js' +import { CommandHandler } from './handler.js' import { P2PCommandResponse } from '../../../@types/OceanNode.js' import { EncryptCommand, EncryptFileCommand } from '../../../@types/commands.js' import * as base58 from 'base58-js' import { Readable } from 'stream' -import { encrypt } from '../../../utils/crypt.js' import { Storage } from '../../storage/index.js' -import { getConfiguration } from '../../../utils/index.js' +import { getConfiguration, isPolicyServerConfigured } from '../../../utils/index.js' +import { PolicyServer } from '../../policyServer/index.js' import { EncryptMethod } from '../../../@types/fileObject.js' import { ValidateParams, @@ -21,7 +21,7 @@ export const SUPPORTED_ENCRYPTION_METHODS = [ EncryptMethod.ECIES.toString() ] -export class EncryptHandler extends Handler { +export class EncryptHandler extends CommandHandler { validate(command: EncryptCommand): ValidateParams { const commandValidation = validateCommandParameters(command, ['blob']) if (!commandValidation.valid) { @@ -50,10 +50,43 @@ export class EncryptHandler extends Handler { async handle(task: EncryptCommand): Promise { const validationResponse = await this.verifyParamsAndRateLimits(task) + if (this.shouldDenyTaskHandling(validationResponse)) { return validationResponse } + const isAuthRequestValid = await this.validateTokenOrSignature( + task.authorization, + task.consumerAddress, + task.nonce, + task.signature, + String(task.nonce) + ) + if (isAuthRequestValid.status.httpStatus !== 200) { + return isAuthRequestValid + } + + if (isPolicyServerConfigured()) { + const policyServer = new PolicyServer() + const response = await policyServer.checkEncrypt( + task.consumerAddress, + task.policyServer + ) + if (!response) { + CORE_LOGGER.logMessage( + `Error: Encrypt for ${task.consumerAddress} was denied`, + true + ) + return { + stream: null, + status: { + httpStatus: 403, + error: `Error: Encrypt for ${task.consumerAddress} was denied` + } + } + } + } try { + const oceanNode = this.getOceanNode() // prepare an empty array in case if let blobData: Uint8Array = new Uint8Array() if (task.encoding?.toLowerCase() === 'string') { @@ -65,7 +98,9 @@ export class EncryptHandler extends Handler { blobData = base58.base58_to_binary(task.blob) } // do encrypt magic - const encryptedData = await encrypt(blobData, task.encryptionType) + const encryptedData = await oceanNode + .getKeyManager() + .encrypt(blobData, task.encryptionType) return { stream: Readable.from('0x' + encryptedData.toString('hex')), status: { httpStatus: 200 } @@ -80,7 +115,7 @@ export class EncryptHandler extends Handler { } } -export class EncryptFileHandler extends Handler { +export class EncryptFileHandler extends CommandHandler { validate(command: EncryptFileCommand): ValidateParams { const validateCommand = validateCommandParameters(command, []) if (validateCommand.valid) { @@ -110,22 +145,69 @@ export class EncryptFileHandler extends Handler { if (this.shouldDenyTaskHandling(validationResponse)) { return validationResponse } + const isAuthRequestValid = await this.validateTokenOrSignature( + task.authorization, + task.consumerAddress, + task.nonce, + task.signature, + String(task.nonce) + ) + if (isAuthRequestValid.status.httpStatus !== 200) { + return isAuthRequestValid + } + + if (isPolicyServerConfigured()) { + const policyServer = new PolicyServer() + const response = await policyServer.checkEncryptFile( + task.consumerAddress, + task.policyServer, + task.files + ) + if (!response) { + CORE_LOGGER.logMessage( + `Error: EncryptFile for ${task.consumerAddress} was denied`, + true + ) + return { + stream: null, + status: { + httpStatus: 403, + error: `Error: EncryptFile for ${task.consumerAddress} was denied` + } + } + } + } + try { + const oceanNode = this.getOceanNode() const config = await getConfiguration() const headers = { 'Content-Type': 'application/octet-stream', - 'X-Encrypted-By': config.keys.peerId.toString(), + 'X-Encrypted-By': oceanNode.getKeyManager().getPeerId().toString(), 'X-Encrypted-Method': task.encryptionType } - let encryptedContent: Buffer + let encryptedContent: Readable if (task.files) { const storage = Storage.getStorageClass(task.files, config) - encryptedContent = await storage.encryptContent(task.encryptionType) + const stream = await storage.getReadableStream() + if (stream.stream) { + encryptedContent = await oceanNode + .getKeyManager() + .encryptStream(stream.stream, task.encryptionType) + } else { + return { + stream: null, + status: { httpStatus: 500, error: 'Cannot fetch files' } + } + } } else if (task.rawData !== null) { - encryptedContent = await encrypt(task.rawData, task.encryptionType) + const cont = await oceanNode + .getKeyManager() + .encrypt(task.rawData, task.encryptionType) + encryptedContent = Readable.from(cont) } return { - stream: Readable.from(encryptedContent), + stream: encryptedContent, status: { httpStatus: 200, headers diff --git a/src/components/core/handler/feesHandler.ts b/src/components/core/handler/feesHandler.ts index 985e5f45b..41d81c483 100644 --- a/src/components/core/handler/feesHandler.ts +++ b/src/components/core/handler/feesHandler.ts @@ -1,4 +1,4 @@ -import { Handler } from './handler.js' +import { CommandHandler } from './handler.js' import { GetFeesCommand } from '../../../@types/commands.js' import { P2PCommandResponse } from '../../../@types/OceanNode.js' import { createProviderFee } from '../utils/feesHandler.js' @@ -16,8 +16,9 @@ import { ProviderInitialize } from '../../../@types/Fees.js' import { getNonce } from '../utils/nonceHandler.js' import { streamToString } from '../../../utils/util.js' import { isOrderingAllowedForAsset } from './downloadHandler.js' +import { DDOManager } from '@oceanprotocol/ddo-js' -export class FeesHandler extends Handler { +export class FeesHandler extends CommandHandler { validate(command: GetFeesCommand): ValidateParams { let validation = validateCommandParameters(command, ['ddoId', 'serviceId']) if (validation.valid) { @@ -58,8 +59,9 @@ export class FeesHandler extends Handler { } } } - - const service = ddo.services.find((what: any) => what.id === task.serviceId) + const ddoInstance = DDOManager.getDDOClass(ddo) + const { services } = ddoInstance.getDDOFields() as any + const service = services.find((what: any) => what.id === task.serviceId) if (!service) { errorMsg = 'Invalid serviceId' } @@ -98,7 +100,7 @@ export class FeesHandler extends Handler { const nonce = await streamToString(nonceHandlerResponse.stream as Readable) try { - const providerFee = await createProviderFee(ddo, service, validUntil, null, null) + const providerFee = await createProviderFee(ddo, service, validUntil) if (providerFee) { const response: ProviderInitialize = { providerFee, diff --git a/src/components/core/handler/fileInfoHandler.ts b/src/components/core/handler/fileInfoHandler.ts index ad89de96f..68c5db08f 100644 --- a/src/components/core/handler/fileInfoHandler.ts +++ b/src/components/core/handler/fileInfoHandler.ts @@ -6,10 +6,11 @@ import { IpfsFileObject, UrlFileObject } from '../../../@types/fileObject.js' +import { OceanNodeConfig } from '../../../@types/OceanNode.js' import { FileInfoCommand } from '../../../@types/commands.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' import { Storage } from '../../storage/index.js' -import { Handler } from './handler.js' +import { CommandHandler } from './handler.js' import { validateDDOIdentifier } from './ddoHandler.js' import { fetchFileMetadata } from '../../../utils/asset.js' import { @@ -19,22 +20,27 @@ import { } from '../../httpRoutes/validateCommands.js' import { getFile } from '../../../utils/file.js' import { getConfiguration } from '../../../utils/index.js' -async function formatMetadata(file: ArweaveFileObject | IpfsFileObject | UrlFileObject) { + +async function formatMetadata( + file: ArweaveFileObject | IpfsFileObject | UrlFileObject, + config: OceanNodeConfig +) { const url = file.type === 'url' ? (file as UrlFileObject).url : file.type === 'arweave' - ? urlJoin(process.env.ARWEAVE_GATEWAY, (file as ArweaveFileObject).transactionId) + ? urlJoin(config.arweaveGateway, (file as ArweaveFileObject).transactionId) : file.type === 'ipfs' - ? urlJoin(process.env.IPFS_GATEWAY, (file as IpfsFileObject).hash) + ? urlJoin(config.ipfsGateway, (file as IpfsFileObject).hash) : null + const headers = file.type === 'url' ? (file as UrlFileObject).headers : undefined const { contentLength, contentType, contentChecksum } = await fetchFileMetadata( url, 'get', - false + false, + headers ) - CORE_LOGGER.logMessage(`Metadata for file: ${contentLength} ${contentType}`) return { valid: true, @@ -45,7 +51,7 @@ async function formatMetadata(file: ArweaveFileObject | IpfsFileObject | UrlFile type: file.type } } -export class FileInfoHandler extends Handler { +export class FileInfoHandler extends CommandHandler { validate(command: FileInfoCommand): ValidateParams { let validation = validateCommandParameters(command, []) // all optional? weird if (validation.valid) { @@ -76,10 +82,11 @@ export class FileInfoHandler extends Handler { } try { const oceanNode = this.getOceanNode() + const config = await getConfiguration() let fileInfo = [] if (task.file && task.type) { - const storage = Storage.getStorageClass(task.file, await getConfiguration()) + const storage = Storage.getStorageClass(task.file, config) fileInfo = await storage.getFileInfo({ type: task.type, @@ -88,11 +95,11 @@ export class FileInfoHandler extends Handler { } else if (task.did && task.serviceId) { const fileArray = await getFile(task.did, task.serviceId, oceanNode) if (task.fileIndex) { - const fileMetadata = await formatMetadata(fileArray[task.fileIndex]) + const fileMetadata = await formatMetadata(fileArray[task.fileIndex], config) fileInfo.push(fileMetadata) } else { for (const file of fileArray) { - const fileMetadata = await formatMetadata(file) + const fileMetadata = await formatMetadata(file, config) fileInfo.push(fileMetadata) } } diff --git a/src/components/core/handler/getJobs.ts b/src/components/core/handler/getJobs.ts new file mode 100644 index 000000000..e50f5c4b1 --- /dev/null +++ b/src/components/core/handler/getJobs.ts @@ -0,0 +1,54 @@ +import { Readable } from 'stream' +import { GetJobsCommand } from '../../../@types/commands.js' +import { CORE_LOGGER } from '../../../utils/logging/common.js' +import { buildInvalidRequestMessage } from '../../httpRoutes/validateCommands.js' +import { CommandHandler } from './handler.js' +import { P2PCommandResponse } from '../../../@types/OceanNode.js' + +export class GetJobsHandler extends CommandHandler { + validate(command: GetJobsCommand) { + if (command.fromTimestamp && typeof command.fromTimestamp !== 'string') { + return buildInvalidRequestMessage( + 'Parameter : "fromTimestamp" is not a valid string' + ) + } + return { valid: true } + } + + async handle(task: GetJobsCommand): Promise { + const validationResponse = await this.verifyParamsAndRateLimits(task) + if (this.shouldDenyTaskHandling(validationResponse)) { + return validationResponse + } + + try { + const { c2d } = this.getOceanNode().getDatabase() + if (!c2d) { + throw new Error('C2D database not initialized') + } + + const jobs = await c2d.getJobs( + task.environments, + task.fromTimestamp, + task.consumerAddrs + ) + return { + stream: Readable.from(JSON.stringify(jobs)), + status: { + httpStatus: 200, + error: null + } + } + } catch (error) { + const message = error instanceof Error ? error.message : String(error) + CORE_LOGGER.error('Error retrieving node jobs: ' + message) + return { + status: { + httpStatus: 500, + error: message + }, + stream: null + } + } + } +} diff --git a/src/components/core/handler/handler.ts b/src/components/core/handler/handler.ts index 93aafdc94..923993dcb 100644 --- a/src/components/core/handler/handler.ts +++ b/src/components/core/handler/handler.ts @@ -1,34 +1,29 @@ import { P2PCommandResponse } from '../../../@types/OceanNode.js' -import { OceanNode } from '../../../OceanNode.js' -import { Command, ICommandHandler } from '../../../@types/commands.js' +import { OceanNode, RequestDataCheck, RequestLimiter } from '../../../OceanNode.js' import { - ValidateParams, + Command, + ICommandHandler, + IValidateCommandHandler +} from '../../../@types/commands.js' +import { + // ValidateParams, buildInvalidParametersResponse, - buildRateLimitReachedResponse + buildRateLimitReachedResponse, + ValidateParams } from '../../httpRoutes/validateCommands.js' import { getConfiguration } from '../../../utils/index.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' import { ReadableString } from '../../P2P/handlers.js' +import { CONNECTION_HISTORY_DELETE_THRESHOLD } from '../../../utils/constants.js' -export interface RequestLimiter { - requester: string | string[] // IP address or peer ID - lastRequestTime: number // time of the last request done (in miliseconds) - numRequests: number // number of requests done in the specific time period -} - -export interface RequestDataCheck { - valid: boolean - updatedRequestData: RequestLimiter -} -export abstract class Handler implements ICommandHandler { - private nodeInstance?: OceanNode - private requestMap: Map +export abstract class BaseHandler implements ICommandHandler { + public nodeInstance: OceanNode public constructor(oceanNode: OceanNode) { this.nodeInstance = oceanNode - this.requestMap = new Map() } - abstract validate(command: Command): ValidateParams + // abstract validate(command: Command): ValidateParams + abstract verifyParamsAndRateLimits(task: Command): Promise abstract handle(task: Command): Promise @@ -37,34 +32,46 @@ export abstract class Handler implements ICommandHandler { } // TODO LOG, implement all handlers - async checkRateLimit(): Promise { - const ratePerSecond = (await getConfiguration()).rateLimit - const caller: string | string[] = this.getOceanNode().getRemoteCaller() + async checkRateLimit(caller: string | string[]): Promise { + const requestMap = this.getOceanNode().getRequestMap() + const ratePerMinute = (await getConfiguration()).rateLimit const requestTime = new Date().getTime() let isOK = true + // If caller is not set, we cannot rate limit - allow the request + if (!caller) { + CORE_LOGGER.debug('No remote caller set, allowing request without rate limiting') + return true + } + + // we have to clear this from time to time, so it does not grow forever + if (requestMap.size > CONNECTION_HISTORY_DELETE_THRESHOLD) { + CORE_LOGGER.info('Request history reached threeshold, cleaning cache...') + requestMap.clear() + } + const self = this // common stuff const updateRequestData = function (remoteCaller: string) { const updatedRequestData = self.checkRequestData( remoteCaller, requestTime, - ratePerSecond + ratePerMinute ) isOK = updatedRequestData.valid - self.requestMap.set(remoteCaller, updatedRequestData.updatedRequestData) + requestMap.set(remoteCaller, updatedRequestData.updatedRequestData) } let data: RequestLimiter = null if (Array.isArray(caller)) { for (const remote of caller) { - if (!this.requestMap.has(remote)) { + if (!requestMap.has(remote)) { data = { requester: remote, lastRequestTime: requestTime, numRequests: 1 } - this.requestMap.set(remote, data) + requestMap.set(remote, data) } else { updateRequestData(remote) } @@ -72,20 +79,20 @@ export abstract class Handler implements ICommandHandler { if (!isOK) { CORE_LOGGER.warn( `Request denied (rate limit exceeded) for remote caller ${remote}. Current request map: ${JSON.stringify( - this.requestMap.get(remote) + requestMap.get(remote) )}` ) return false } } } else { - if (!this.requestMap.has(caller)) { + if (!requestMap.has(caller)) { data = { requester: caller, lastRequestTime: requestTime, numRequests: 1 } - this.requestMap.set(caller, data) + requestMap.set(caller, data) return true } else { updateRequestData(caller) @@ -93,7 +100,7 @@ export abstract class Handler implements ICommandHandler { if (!isOK) { CORE_LOGGER.warn( `Request denied (rate limit exceeded) for remote caller ${caller}. Current request map: ${JSON.stringify( - this.requestMap.get(caller) + requestMap.get(caller) )}` ) } @@ -105,18 +112,19 @@ export abstract class Handler implements ICommandHandler { /** * Checks if the request is within the rate limit defined * @param remote remote endpoint (ip or peer identifier) - * @param ratePerSecond number of calls per second allowed + * @param ratePerMinute number of calls per minute allowed (per ip or peer identifier) * @returns updated request data */ checkRequestData( remote: string, currentTime: number, - ratePerSecond: number + ratePerMinute: number ): RequestDataCheck { - const requestData: RequestLimiter = this.requestMap.get(remote) - const diffSeconds = (currentTime - requestData.lastRequestTime) / 1000 - // more than 1 sec difference means no problem - if (diffSeconds >= 1) { + const requestMap = this.getOceanNode().getRequestMap() + const requestData: RequestLimiter = requestMap.get(remote) + const diffMinutes = ((currentTime - requestData.lastRequestTime) / 1000) * 60 + // more than 1 minute difference means no problem + if (diffMinutes >= 1) { // its fine requestData.lastRequestTime = currentTime requestData.numRequests = 1 @@ -128,15 +136,28 @@ export abstract class Handler implements ICommandHandler { // requests in the same interval of 1 second requestData.numRequests++ return { - valid: requestData.numRequests <= ratePerSecond, + valid: requestData.numRequests <= ratePerMinute, updatedRequestData: requestData } } } + shouldDenyTaskHandling(validationResponse: P2PCommandResponse): boolean { + return ( + validationResponse.status.httpStatus !== 200 || + validationResponse.status.error !== null + ) + } +} + +export abstract class CommandHandler + extends BaseHandler + implements IValidateCommandHandler +{ + abstract validate(command: Command): ValidateParams async verifyParamsAndRateLimits(task: Command): Promise { // first check rate limits, if any - if (!(await this.checkRateLimit())) { + if (!(await this.checkRateLimit(task.caller))) { return buildRateLimitReachedResponse() } // then validate the command arguments @@ -152,10 +173,38 @@ export abstract class Handler implements ICommandHandler { } } - shouldDenyTaskHandling(validationResponse: P2PCommandResponse): boolean { - return ( - validationResponse.status.httpStatus !== 200 || - validationResponse.status.error !== null - ) + async validateTokenOrSignature( + authToken: string, + address: string, + nonce: string, + signature: string, + message: string + ): Promise { + const oceanNode = this.getOceanNode() + const auth = oceanNode.getAuth() + if (!auth) { + return { + stream: null, + status: { httpStatus: 401, error: 'Auth not configured' } + } + } + const isAuthRequestValid = await auth.validateAuthenticationOrToken({ + token: authToken, + address, + nonce, + signature, + message + }) + if (!isAuthRequestValid.valid) { + return { + stream: null, + status: { httpStatus: 401, error: isAuthRequestValid.error } + } + } + + return { + stream: null, + status: { httpStatus: 200 } + } } } diff --git a/src/components/core/handler/nonceHandler.ts b/src/components/core/handler/nonceHandler.ts index f5211a42b..18c27cc48 100644 --- a/src/components/core/handler/nonceHandler.ts +++ b/src/components/core/handler/nonceHandler.ts @@ -1,4 +1,4 @@ -import { Handler } from './handler.js' +import { CommandHandler } from './handler.js' import { P2PCommandResponse } from '../../../@types/OceanNode.js' import { NonceCommand } from '../../../@types/commands.js' import { getNonce } from '../utils/nonceHandler.js' @@ -9,7 +9,7 @@ import { } from '../../httpRoutes/validateCommands.js' import { isAddress } from 'ethers' -export class NonceHandler extends Handler { +export class NonceHandler extends CommandHandler { validate(command: NonceCommand): ValidateParams { const validation = validateCommandParameters(command, ['address']) if (validation.valid) { diff --git a/src/components/core/handler/p2p.ts b/src/components/core/handler/p2p.ts new file mode 100644 index 000000000..6b4a58617 --- /dev/null +++ b/src/components/core/handler/p2p.ts @@ -0,0 +1,154 @@ +import { CommandHandler } from './handler.js' +import { getConfiguration } from '../../../utils/config.js' +import { P2PCommandResponse } from '../../../@types/OceanNode.js' +import { + FindPeerCommand, + GetP2PPeerCommand, + GetP2PPeersCommand, + GetP2PNetworkStatsCommand +} from '../../../@types/commands.js' +import { Readable } from 'stream' +import { + ValidateParams, + validateCommandParameters +} from '../../httpRoutes/validateCommands.js' +import { CORE_LOGGER } from '../../../utils/logging/common.js' + +export class FindPeerHandler extends CommandHandler { + validate(command: FindPeerCommand): ValidateParams { + const validation = validateCommandParameters(command, ['peerId']) + return validation + } + + async handle(task: FindPeerCommand): Promise { + const checks = await this.verifyParamsAndRateLimits(task) + if (checks.status.httpStatus !== 200 || checks.status.error !== null) { + return checks + } + try { + const peer = await this.getOceanNode() + .getP2PNode() + .findPeerInDht(String(task.peerId), parseInt(String(task.timeout))) + // .getPeerDetails(String(task.peerId)) + if (!peer) { + return { + stream: null, + status: { httpStatus: 404, error: 'Peer Not Found' } + } + } + return { + stream: Readable.from(JSON.stringify(peer, null, 4)), + status: { httpStatus: 200 } + } + } catch (error) { + CORE_LOGGER.error(`Error in Handler: ${error.message}`) + return { + stream: null, + status: { httpStatus: 500, error: 'Unknown error: ' + error.message } + } + } + } +} + +export class GetP2PPeerHandler extends CommandHandler { + validate(command: GetP2PPeerCommand): ValidateParams { + const validation = validateCommandParameters(command, ['peerId']) + return validation + } + + async handle(task: GetP2PPeerCommand): Promise { + const checks = await this.verifyParamsAndRateLimits(task) + if (checks.status.httpStatus !== 200 || checks.status.error !== null) { + return checks + } + try { + const peers = await this.getOceanNode() + .getP2PNode() + .getPeerDetails(String(task.peerId)) + if (!peers) { + return { + stream: null, + status: { httpStatus: 404, error: 'Peer Not Found' } + } + } + return { + stream: Readable.from(JSON.stringify(peers, null, 4)), + status: { httpStatus: 200 } + } + } catch (error) { + CORE_LOGGER.error(`Error in Handler: ${error.message}`) + return { + stream: null, + status: { httpStatus: 500, error: 'Unknown error: ' + error.message } + } + } + } +} + +export class GetP2PPeersHandler extends CommandHandler { + validate(command: GetP2PPeersCommand): ValidateParams { + const validation = validateCommandParameters(command, []) + return validation + } + + async handle(task: GetP2PPeersCommand): Promise { + const checks = await this.verifyParamsAndRateLimits(task) + if (checks.status.httpStatus !== 200 || checks.status.error !== null) { + return checks + } + try { + const peers = await this.getOceanNode().getP2PNode().getAllPeerStore() + if (!peers) { + return { + stream: null, + status: { httpStatus: 404, error: 'Peers Not Found' } + } + } + return { + stream: Readable.from(JSON.stringify(peers, null, 4)), + status: { httpStatus: 200 } + } + } catch (error) { + CORE_LOGGER.error(`Error in Handler: ${error.message}`) + return { + stream: null, + status: { httpStatus: 500, error: 'Unknown error: ' + error.message } + } + } + } +} + +export class GetP2PNetworkStatsHandler extends CommandHandler { + validate(command: GetP2PNetworkStatsCommand): ValidateParams { + const validation = validateCommandParameters(command, []) + return validation + } + + async handle(task: GetP2PNetworkStatsCommand): Promise { + const checks = await this.verifyParamsAndRateLimits(task) + if (checks.status.httpStatus !== 200 || checks.status.error !== null) { + return checks + } + try { + const config = await getConfiguration() + if (config.p2pConfig.enableNetworkStats) { + const stats = this.getOceanNode().getP2PNode().getNetworkingStats() + return { + stream: Readable.from(JSON.stringify(stats)), + status: { httpStatus: 200 } + } + } else { + return { + stream: null, + status: { httpStatus: 400, error: 'Not enabled or unavailable' } + } + } + } catch (error) { + CORE_LOGGER.error(`Error in Handler: ${error.message}`) + return { + stream: null, + status: { httpStatus: 500, error: 'Unknown error: ' + error.message } + } + } + } +} diff --git a/src/components/core/handler/policyServer.ts b/src/components/core/handler/policyServer.ts index 16f37698b..053cc869a 100644 --- a/src/components/core/handler/policyServer.ts +++ b/src/components/core/handler/policyServer.ts @@ -1,16 +1,20 @@ import { P2PCommandResponse } from '../../../@types/index.js' -import { PolicyServerPassthroughCommand } from '../../../@types/commands.js' +import { + PolicyServerPassthroughCommand, + PolicyServerInitializeCommand +} from '../../../@types/commands.js' import { Readable } from 'stream' -import { Handler } from './handler.js' +import { CommandHandler } from './handler.js' import { ValidateParams, buildInvalidRequestMessage, validateCommandParameters } from '../../httpRoutes/validateCommands.js' +import { CORE_LOGGER } from '../../../utils/logging/common.js' import { PolicyServer } from '../../policyServer/index.js' -export class PolicyServerPassthroughHandler extends Handler { +export class PolicyServerPassthroughHandler extends CommandHandler { validate(command: PolicyServerPassthroughCommand): ValidateParams { if (!command.policyServerPassthrough) return buildInvalidRequestMessage( @@ -25,7 +29,18 @@ export class PolicyServerPassthroughHandler extends Handler { if (this.shouldDenyTaskHandling(validationResponse)) { return validationResponse } - + task.policyServerPassthrough.ddo = null + // resolve DDO first + try { + task.policyServerPassthrough.ddo = await this.getOceanNode() + .getDatabase() + .ddo.retrieve(task.policyServerPassthrough.documentId) + } catch (error) { + // just log it + CORE_LOGGER.warn( + `PolicyServerPassthroughHandler: DDO not found for documentId ${task.policyServerPassthrough.documentId}: ${error.message}` + ) + } // policyServer check const policyServer = new PolicyServer() const policyStatus = await policyServer.passThrough(task.policyServerPassthrough) @@ -41,9 +56,76 @@ export class PolicyServerPassthroughHandler extends Handler { return { stream: Readable.from(policyStatus.message), status: { - httpStatus: 200 + httpStatus: policyStatus.httpStatus + } + } + } + } +} + +export class PolicyServerInitializeHandler extends CommandHandler { + validate(command: PolicyServerInitializeCommand): ValidateParams { + if (!command.policyServer) + return buildInvalidRequestMessage('Invalid Request: missing policyServer field!') + const validation = validateCommandParameters(command, [ + 'documentId', + 'serviceId', + 'consumerAddress' + ]) // all optional? weird + return validation + } + + async handle(task: PolicyServerInitializeCommand): Promise { + const validationResponse = await this.verifyParamsAndRateLimits(task) + if (this.shouldDenyTaskHandling(validationResponse)) { + return validationResponse + } + // resolve DDO first + try { + const database = this.getOceanNode().getDatabase() + if (!database || !database.ddo) { + return { + stream: null, + status: { httpStatus: 503, error: 'DDO database is not available' } } } + const ddo = await database.ddo.retrieve(task.documentId) + if (!ddo) { + return { + stream: null, + status: { httpStatus: 404, error: 'Not found' } + } + } + // policyServer check + const policyServer = new PolicyServer() + const policyStatus = await policyServer.initializePSVerification( + task.documentId, + ddo, + task.serviceId, + task.consumerAddress, + task.policyServer + ) + if (!policyStatus.success) { + return { + stream: null, + status: { + httpStatus: policyStatus.httpStatus, + error: policyStatus.message + } + } + } else { + return { + stream: Readable.from(policyStatus.message), + status: { + httpStatus: policyStatus.httpStatus + } + } + } + } catch (error) { + return { + stream: null, + status: { httpStatus: 500, error: 'Unknown error: ' + error.message } + } } } } diff --git a/src/components/core/handler/queryHandler.ts b/src/components/core/handler/queryHandler.ts index 15a313bcc..3e28a1d3c 100644 --- a/src/components/core/handler/queryHandler.ts +++ b/src/components/core/handler/queryHandler.ts @@ -1,4 +1,4 @@ -import { Handler } from './handler.js' +import { CommandHandler } from './handler.js' import { QueryCommand } from '../../../@types/commands.js' import { P2PCommandResponse } from '../../../@types/OceanNode.js' import { Readable } from 'stream' @@ -9,7 +9,7 @@ import { } from '../../httpRoutes/validateCommands.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' -export class QueryHandler extends Handler { +export class QueryHandler extends CommandHandler { validate(command: QueryCommand): ValidateParams { return validateCommandParameters(command, ['query']) } @@ -20,7 +20,15 @@ export class QueryHandler extends Handler { return validationResponse } try { - let result = await this.getOceanNode().getDatabase().ddo.search(task.query) + const database = this.getOceanNode().getDatabase() + if (!database || !database.ddo) { + CORE_LOGGER.error('DDO database is not available') + return { + stream: null, + status: { httpStatus: 503, error: 'DDO database is not available' } + } + } + let result = await database.ddo.search(task.query) if (!result) { result = [] } @@ -45,7 +53,27 @@ export class QueryDdoStateHandler extends QueryHandler { return buildInvalidParametersResponse(validation) } try { - const result = await this.getOceanNode().getDatabase().ddoState.search(task.query) + const database = this.getOceanNode().getDatabase() + if (!database || !database.ddoState) { + CORE_LOGGER.error('DDO State database is not available') + return { + stream: null, + status: { httpStatus: 503, error: 'DDO State database is not available' } + } + } + + const result = await database.ddoState.search(task.query) + + CORE_LOGGER.debug(`DDO State search result: ${JSON.stringify(result)}`) + + if (result === null) { + CORE_LOGGER.error('Database search returned null') + return { + stream: null, + status: { httpStatus: 500, error: 'Database search failed' } + } + } + return { stream: Readable.from(JSON.stringify(result)), status: { httpStatus: 200 } diff --git a/src/components/core/handler/statusHandler.ts b/src/components/core/handler/statusHandler.ts index fe61963ec..76aeeadd6 100644 --- a/src/components/core/handler/statusHandler.ts +++ b/src/components/core/handler/statusHandler.ts @@ -1,4 +1,4 @@ -import { Handler } from './handler.js' +import { CommandHandler } from './handler.js' import { status } from '../utils/statusHandler.js' import { P2PCommandResponse } from '../../../@types/OceanNode.js' import { DetailedStatusCommand, StatusCommand } from '../../../@types/commands.js' @@ -9,21 +9,18 @@ import { } from '../../httpRoutes/validateCommands.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' -export class StatusHandler extends Handler { +export class StatusHandler extends CommandHandler { validate(command: StatusCommand): ValidateParams { return validateCommandParameters(command, []) } - async handle( - task: StatusCommand, - detailed: boolean = false - ): Promise { + async handle(task: StatusCommand): Promise { const checks = await this.verifyParamsAndRateLimits(task) if (checks.status.httpStatus !== 200 || checks.status.error !== null) { return checks } try { - const statusResult = await status(this.getOceanNode(), task.node, detailed) + const statusResult = await status(this.getOceanNode(), task.node, !!task.detailed) if (!statusResult) { return { stream: null, @@ -50,6 +47,7 @@ export class DetailedStatusHandler extends StatusHandler { } async handle(task: StatusCommand): Promise { - return await super.handle(task, true) + task.detailed = true + return await super.handle(task) } } diff --git a/src/components/core/utils/escrow.ts b/src/components/core/utils/escrow.ts new file mode 100644 index 000000000..10416a71e --- /dev/null +++ b/src/components/core/utils/escrow.ts @@ -0,0 +1,295 @@ +import { Blockchain, getDatatokenDecimals } from '../../../utils/blockchain.js' +import { ethers, parseUnits, formatUnits, BigNumberish } from 'ethers' +import EscrowJson from '@oceanprotocol/contracts/artifacts/contracts/escrow/Escrow.sol/Escrow.json' with { type: 'json' } +import { EscrowAuthorization, EscrowLock } from '../../../@types/Escrow.js' +import { getOceanArtifactsAdressesByChainId } from '../../../utils/address.js' +import { RPCS } from '../../../@types/blockchain.js' +import { create256Hash } from '../../../utils/crypt.js' +import { sleep } from '../../../utils/util.js' +import { BlockchainRegistry } from '../../BlockchainRegistry/index.js' +import { CORE_LOGGER } from '../../../utils/logging/common.js' + +export class Escrow { + private networks: RPCS + private claimDurationTimeout: number + private blockchainRegistry: BlockchainRegistry + + constructor( + supportedNetworks: RPCS, + claimDurationTimeout: number, + blockchainRegistry: BlockchainRegistry + ) { + this.networks = supportedNetworks + this.claimDurationTimeout = claimDurationTimeout + this.blockchainRegistry = blockchainRegistry + } + + // eslint-disable-next-line require-await + getEscrowContractAddressForChain(chainId: number): string | null { + const addresses = getOceanArtifactsAdressesByChainId(chainId) + if (addresses && addresses.EnterpriseEscrow) return addresses.EnterpriseEscrow + if (addresses && addresses.Escrow) return addresses.Escrow + return null + } + + getMinLockTime(maxJobDuration: number) { + return maxJobDuration + this.claimDurationTimeout + } + + /** + * Get a Blockchain instance for the given chainId from BlockchainRegistry. + * + * @param chainId - The chain ID to get a Blockchain instance for + * @returns Blockchain instance + * @throws Error if blockchain instance is not available + */ + private getBlockchain(chainId: number): Blockchain { + const blockchain = this.blockchainRegistry.getBlockchain(chainId) + if (!blockchain) { + throw new Error(`Blockchain instance not available for chain ${chainId}`) + } + return blockchain + } + + async getPaymentAmountInWei(cost: number, chain: number, token: string) { + const blockchain = this.getBlockchain(chain) + const provider = await blockchain.getProvider() + + const decimalgBigNumber = await getDatatokenDecimals(token, provider) + const decimals = parseInt(decimalgBigNumber.toString()) + + const roundedCost = Number(cost.toFixed(decimals)).toString() + + return parseUnits(roundedCost, decimals).toString() + } + + async getNumberFromWei(wei: string, chain: number, token: string) { + const blockchain = this.getBlockchain(chain) + const provider = await blockchain.getProvider() + const decimals = await getDatatokenDecimals(token, provider) + return parseFloat(formatUnits(wei, decimals)) + } + + // eslint-disable-next-line require-await + getContract(chainId: number, signer: ethers.Signer): ethers.Contract | null { + const address = this.getEscrowContractAddressForChain(chainId) + if (!address) return null + return new ethers.Contract(address, EscrowJson.abi, signer) + } + + async getUserAvailableFunds( + chain: number, + payer: string, + token: string + ): Promise { + const blockchain = this.getBlockchain(chain) + const signer = await blockchain.getSigner() + const contract = this.getContract(chain, signer) + try { + const funds = await contract.getUserFunds(payer, token) + return funds.available + } catch (e) { + CORE_LOGGER.error('Failed to get user available funds: ' + e.message) + return null + } + } + + async getLocks( + chain: number, + token: string, + payer: string, + payee: string + ): Promise { + const blockchain = this.getBlockchain(chain) + const signer = await blockchain.getSigner() + const contract = this.getContract(chain, signer) + try { + return await contract.getLocks(token, payer, payee) + } catch (e) { + CORE_LOGGER.error('Failed to get locks: ' + e.message) + return null + } + } + + async getAuthorizations( + chain: number, + token: string, + payer: string, + payee: string + ): Promise { + const blockchain = this.getBlockchain(chain) + const signer = await blockchain.getSigner() + const contract = this.getContract(chain, signer) + try { + return await contract.getAuthorizations(token, payer, payee) + } catch (e) { + CORE_LOGGER.error('Failed to get authorizations: ' + e.message) + return null + } + } + + async createLock( + chain: number, + job: string, + token: string, + payer: string, + amount: number, + expiry: BigNumberish + ): Promise { + const jobId = create256Hash(job) + const blockchain = this.getBlockchain(chain) + const signer = await blockchain.getSigner() + const contract = this.getContract(chain, signer) + if (!contract) throw new Error(`Failed to initialize escrow contract`) + const wei = await this.getPaymentAmountInWei(amount, chain, token) + const userBalance = await this.getUserAvailableFunds(chain, payer, token) + if (BigInt(userBalance.toString()) < BigInt(wei)) { + // not enough funds + throw new Error(`User ${payer} does not have enough funds`) + } + + const signerAddress = await signer.getAddress() + + let retries = 2 + let auths: EscrowAuthorization[] = [] + while (retries > 0) { + auths = await this.getAuthorizations(chain, token, payer, signerAddress) + if (!auths || auths.length !== 1) { + CORE_LOGGER.error( + `No escrow auths found for: chain=${chain}, token=${token}, payer=${payer}, nodeAddress=${signerAddress}. Found ${ + auths?.length || 0 + } authorizations. ${retries > 0 ? 'Retrying..' : ''}` + ) + } else if (auths && auths.length === 1) { + break + } + if (retries > 1) { + await sleep(1000) + } + retries-- + } + if (!auths || auths.length !== 1) { + throw new Error( + `No escrow auths found for: chain=${chain}, token=${token}, payer=${payer}, nodeAddress=${signerAddress}. Found ${ + auths?.length || 0 + } authorizations.` + ) + } + + if ( + BigInt(auths[0].currentLockedAmount.toString()) + BigInt(wei) > + BigInt(auths[0].maxLockedAmount.toString()) + ) { + throw new Error(`No valid escrow auths found(will go over limit)`) + } + if (BigInt(auths[0].maxLockSeconds.toString()) < BigInt(expiry)) { + throw new Error(`No valid escrow auths found(maxLockSeconds too low)`) + } + if ( + BigInt(auths[0].currentLocks.toString()) + BigInt(1) > + BigInt(auths[0].maxLockCounts.toString()) + ) { + throw new Error(`No valid escrow auths found(too many active locks)`) + } + try { + const gas = await contract.createLock.estimateGas(jobId, token, payer, wei, expiry) + const gasOptions = await blockchain.getGasOptions(gas, 1.2) + const tx = await contract.createLock(jobId, token, payer, wei, expiry, gasOptions) + return tx.hash + } catch (e) { + CORE_LOGGER.error('Failed to create lock: ' + e.message) + throw new Error(String(e.message)) + } + } + + async claimLock( + chain: number, + job: string, + token: string, + payer: string, + amount: number, + proof: string + ): Promise { + const blockchain = this.getBlockchain(chain) + const signer = await blockchain.getSigner() + const contract = this.getContract(chain, signer) + const wei = await this.getPaymentAmountInWei(amount, chain, token) + const jobId = create256Hash(job) + CORE_LOGGER.info('ClaimLock function init') + + if (!contract) return null + try { + const locks = await this.getLocks(chain, token, payer, await signer.getAddress()) + CORE_LOGGER.info(`Found ${locks.length} locks for job ${jobId}`) + for (const lock of locks) { + if (BigInt(lock.jobId.toString()) === BigInt(jobId)) { + const gas = await contract.claimLockAndWithdraw.estimateGas( + jobId, + token, + payer, + wei, + ethers.toUtf8Bytes(proof) + ) + CORE_LOGGER.info('Claiming lock for job: ' + jobId) + CORE_LOGGER.info('Gas: ' + gas) + const gasOptions = await blockchain.getGasOptions(gas, 1.2) + const tx = await contract.claimLockAndWithdraw( + jobId, + token, + payer, + wei, + ethers.toUtf8Bytes(proof), + gasOptions + ) + CORE_LOGGER.info('Transaction hash: ' + tx?.hash) + return tx.hash + } + } + return null + } catch (e) { + CORE_LOGGER.error('Failed to claim lock: ' + e.message) + throw new Error(String(e.message)) + } + } + + async cancelExpiredLocks( + chain: number, + job: string, + token: string, + payer: string + ): Promise { + const blockchain = this.getBlockchain(chain) + const signer = await blockchain.getSigner() + const jobId = create256Hash(job) + const contract = this.getContract(chain, signer) + + if (!contract) return null + try { + const locks = await this.getLocks(chain, token, payer, await signer.getAddress()) + for (const lock of locks) { + if (BigInt(lock.jobId.toString()) === BigInt(jobId)) { + const gas = await contract.cancelExpiredLocks.estimateGas( + jobId, + token, + payer, + await signer.getAddress() + ) + const gasOptions = await blockchain.getGasOptions(gas, 1.2) + const tx = await contract.cancelExpiredLocks( + jobId, + token, + payer, + await signer.getAddress(), + gasOptions + ) + + return tx.hash + } + } + return null + } catch (e) { + CORE_LOGGER.error('Failed to cancel expired locks: ' + e.message) + throw new Error(String(e.message)) + } + } +} diff --git a/src/components/core/utils/feesHandler.ts b/src/components/core/utils/feesHandler.ts index 39ffa4378..b351e5cf8 100644 --- a/src/components/core/utils/feesHandler.ts +++ b/src/components/core/utils/feesHandler.ts @@ -1,20 +1,20 @@ -import type { ComputeEnvironment } from '../../../@types/C2D.js' +import type { ComputeResourcesPricingInfo } from '../../../@types/C2D/C2D.js' import { - JsonRpcApiProvider, + FallbackProvider, ethers, Interface, BigNumberish, parseUnits, ZeroAddress } from 'ethers' +import { OceanNode } from '../../../OceanNode.js' import { FeeTokens, ProviderFeeData, ProviderFeeValidation, ProviderFees } from '../../../@types/Fees' -import { DDO } from '../../../@types/DDO/DDO' -import { Service } from '../../../@types/DDO/Service' +import { Service, DDOManager, Asset } from '@oceanprotocol/ddo-js' import { getDatatokenDecimals, verifyMessage, @@ -24,68 +24,64 @@ import { getConfiguration } from '../../../utils/config.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' import { getOceanArtifactsAdresses } from '../../../utils/address.js' -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' assert { type: 'json' } +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } import { fetchEventFromTransaction } from '../../../utils/util.js' import { fetchTransactionReceipt } from './validateOrders.js' +export function getEnvironmentPriceSchemaForResource( + prices: ComputeResourcesPricingInfo[], + id: string +): number { + for (const pr of prices) { + if (pr.id === id) { + return pr.price + } + } + return 0 +} async function calculateProviderFeeAmount( validUntil: number, - computeEnv: ComputeEnvironment + chainId: string // asset?: DDO ): Promise { - const now = new Date().getTime() / 1000 - const seconds = validUntil - now - let providerFeeAmount: number - // we have different ways of computing providerFee - if (computeEnv) { - // it's a compute provider fee - providerFeeAmount = (seconds * parseFloat(String(computeEnv.priceMin))) / 60 - } else { - // it's a download provider fee - // we should get asset file size, and do a proper fee managment according to time - // something like estimated 3 downloads per day - providerFeeAmount = (await getConfiguration()).feeStrategy.feeAmount.amount - } + // it's a download provider fee + // we should get asset file size, and do a proper fee management according to time + // something like estimated 3 downloads per day + const config = await getConfiguration() + const providerFeeAmount = config?.feeStrategy?.feeAmount?.amount || 0 return providerFeeAmount } export async function createProviderFee( - asset: DDO, + asset: Asset, service: Service, - validUntil: number, - computeEnv: ComputeEnvironment, - computeValidUntil: number + validUntil: number ): Promise | undefined { // round for safety validUntil = Math.round(validUntil) - computeValidUntil = Math.round(computeValidUntil) + const providerData = { - environment: computeEnv ? computeEnv.id : null, - timestamp: computeValidUntil || 0, dt: service.datatokenAddress, id: service.id } - const providerWallet = await getProviderWallet(String(asset.chainId)) - + const ddoInstance = DDOManager.getDDOClass(asset) + const { chainId: assetChainId } = ddoInstance.getDDOFields() + const providerWallet = await getProviderWallet(String(assetChainId)) const providerFeeAddress: string = providerWallet.address let providerFeeAmount: number let providerFeeAmountFormatted: BigNumberish - - let providerFeeToken: string - if (computeEnv) { - providerFeeToken = computeEnv.feeToken - } else { - // it's download, take it from config - providerFeeToken = await getProviderFeeToken(asset.chainId) - } + const providerFeeToken = await getProviderFeeToken(assetChainId) if (providerFeeToken?.toLowerCase() === ZeroAddress) { providerFeeAmount = 0 } else { - providerFeeAmount = await calculateProviderFeeAmount(validUntil, computeEnv) + providerFeeAmount = await calculateProviderFeeAmount( + validUntil, + String(asset.chainId) + ) } if (providerFeeToken && providerFeeToken?.toLowerCase() !== ZeroAddress) { - const provider = await getJsonRpcProvider(asset.chainId) + const provider = await getJsonRpcProvider(assetChainId) const decimals = await getDatatokenDecimals(providerFeeToken, provider) providerFeeAmountFormatted = parseUnits(providerFeeAmount.toString(10), decimals) } else { @@ -138,16 +134,16 @@ export async function createProviderFee( export async function verifyProviderFees( txId: string, userAddress: string, - provider: JsonRpcApiProvider, - service: Service, - computeEnv?: string, - validUntil?: number // only for computeEnv + provider: FallbackProvider, + service: Service ): Promise { + /* given a transaction, check if there is a valid provider fee event + * We could have multiple orders, for multiple assets & providers + */ if (!txId) { CORE_LOGGER.error('Invalid txId') return { isValid: false, - isComputeValid: false, message: 'Invalid txId', validUntil: 0 } @@ -156,21 +152,23 @@ export async function verifyProviderFees( const { chainId } = await provider.getNetwork() const providerWallet = await getProviderWallet(String(chainId)) const contractInterface = new Interface(ERC20Template.abi) + const now = Math.round(new Date().getTime() / 1000) const txReceiptMined = await fetchTransactionReceipt(txId, provider) + const blockMined = await txReceiptMined.getBlock() + if (!txReceiptMined) { const message = `Tx receipt cannot be processed, because tx id ${txId} was not mined.` CORE_LOGGER.error(message) - return { isValid: false, isComputeValid: false, message, validUntil: 0 } + return { isValid: false, message, validUntil: 0 } } - const now = Math.round(new Date().getTime() / 1000) const providerFeesEvents = fetchEventFromTransaction( txReceiptMined, 'ProviderFee', contractInterface ) - let allEventsValid = true + let foundValid = false let providerData for (const event of providerFeesEvents) { const providerAddress = event.args[0]?.toLowerCase() @@ -181,53 +179,36 @@ export async function verifyProviderFees( providerData = JSON.parse(utf) } catch (e) { CORE_LOGGER.error('ProviderFee event JSON parsing failed') - allEventsValid = false continue } if ( - !providerData || - providerAddress !== providerWallet.address?.toLowerCase() || - providerData.id !== service.id || - providerData.dt?.toLowerCase() !== service.datatokenAddress?.toLowerCase() || - !(now < validUntilContract || validUntilContract === 0) + providerData && + providerAddress === providerWallet.address?.toLowerCase() && + providerData.id === service.id && + providerData.dt?.toLowerCase() === service.datatokenAddress?.toLowerCase() ) { - allEventsValid = false - break // Invalid event found, no need to check further - } - } - - if (!allEventsValid) { - const message = 'Not all ProviderFee events are valid' - CORE_LOGGER.error(message) - return { isValid: false, isComputeValid: false, message, validUntil: 0 } - } - - // Compute environment validation - let isComputeValid = true - if (computeEnv) { - if (providerData.environment !== computeEnv) { - isComputeValid = false - } - if (validUntil > 0 && providerData.timestamp < validUntil) { - isComputeValid = false + if (validUntilContract !== 0) { + // check if it's expired + if (now - blockMined.timestamp <= validUntilContract) { + foundValid = true + break + } + } else { + foundValid = true + break + } } } - if (!isComputeValid) { - const message = 'Compute environment validation failed' + if (!foundValid) { + const message = 'No valid providerFee events' CORE_LOGGER.error(message) - return { - isValid: true, - isComputeValid, - message, - validUntil: providerData ? providerData.timestamp : 0 - } + return { isValid: false, message, validUntil: 0 } } return { isValid: true, - isComputeValid, message: 'Validation successful', validUntil: providerData.timestamp } @@ -239,7 +220,7 @@ export async function verifyProviderFees( // equiv to get_provider_fees // *** NOTE: provider.py => get_provider_fees *** export async function createFee( - asset: DDO, + asset: Asset, validUntil: number, computeEnv: string, service: Service @@ -459,7 +440,7 @@ export async function checkFee( const message = ethers.toBeArray(signableHash) // await wallet.signMessage() // and also check that we signed this message - return await verifyMessage(message, nodeAddress, txId) + return verifyMessage(message, nodeAddress, txId) // before was only return await verifyMessage(message, nodeAddress, txId) } @@ -470,17 +451,14 @@ export async function checkFee( * @param chainId the chain id (not used now) * @returns the wallet */ +// eslint-disable-next-line require-await export async function getProviderWallet(chainId?: string): Promise { - return new ethers.Wallet( - Buffer.from((await getConfiguration()).keys.privateKey).toString('hex') - ) + const oceanNode = OceanNode.getInstance() + const keyManager = oceanNode.getKeyManager() + return keyManager.getEthWallet() } export async function getProviderWalletAddress(): Promise { - return (await getProviderWallet()).address -} - -export async function getProviderKey(): Promise { - return Buffer.from((await getConfiguration()).keys.privateKey).toString('hex') + return (await this.getProviderWallet()).address } /** @@ -489,9 +467,9 @@ export async function getProviderKey(): Promise { * @returns the token address */ export async function getProviderFeeToken(chainId: number): Promise { - const result = (await getConfiguration()).feeStrategy.feeTokens.filter( - (token: FeeTokens) => Number(token.chain) === chainId - ) + const config = await getConfiguration() + const feeTokens = config?.feeStrategy?.feeTokens || [] + const result = feeTokens.filter((token: FeeTokens) => Number(token.chain) === chainId) if (result.length === 0 && chainId === 8996) { const localOceanToken = getOceanArtifactsAdresses().development.Ocean return localOceanToken || ethers.ZeroAddress @@ -504,7 +482,8 @@ export async function getProviderFeeToken(chainId: number): Promise { * @returns amount */ export async function getProviderFeeAmount(): Promise { - return (await getConfiguration()).feeStrategy.feeAmount.amount + const config = await getConfiguration() + return config?.feeStrategy?.feeAmount?.amount || 0 } // https://github.com/oceanprotocol/contracts/blob/main/contracts/templates/ERC20Template.sol#L65-L74 // https://github.com/oceanprotocol/contracts/blob/main/contracts/templates/ERC20Template.sol#L447-L508 diff --git a/src/components/core/utils/findDdoHandler.ts b/src/components/core/utils/findDdoHandler.ts index 2485d5b73..02693903f 100644 --- a/src/components/core/utils/findDdoHandler.ts +++ b/src/components/core/utils/findDdoHandler.ts @@ -2,10 +2,10 @@ import { OceanP2P, CACHE_TTL } from '../../P2P/index.js' import { FindDDOCommand } from '../../../@types/commands.js' import { LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' import { FindDDOResponse } from '../../../@types/index.js' -import { Service } from '../../../@types/DDO/Service.js' +import { Service } from '@oceanprotocol/ddo-js' import { CORE_LOGGER } from '../../../utils/logging/common.js' import { OceanNode } from '../../../OceanNode.js' -import { getConfiguration, hasP2PInterface } from '../../../utils/config.js' +import { hasP2PInterface } from '../../../utils/config.js' /** * Check if the specified ddo is cached and if the cached version is recent enough @@ -58,12 +58,22 @@ export async function findDDOLocally( node: OceanNode, id: string ): Promise | undefined { - const ddo = await node.getDatabase().ddo.retrieve(id) + const database = node.getDatabase() + if (!database || !database.ddo) { + CORE_LOGGER.log( + LOG_LEVELS_STR.LEVEL_WARN, + 'DDO database is not available. Cannot retrieve DDO locally.', + true + ) + return undefined + } + + const ddo = await database.ddo.retrieve(id) if (ddo) { // node has ddo const p2pNode: OceanP2P = node.getP2PNode() if (!p2pNode || !hasP2PInterface) { - const peerId: string = await (await getConfiguration()).keys.peerId.toString() + const peerId: string = node.getKeyManager().getPeerId().toString() return { id: ddo.id, lastUpdateTx: ddo.event.tx, diff --git a/src/components/core/utils/nonceHandler.ts b/src/components/core/utils/nonceHandler.ts index bc6fa494f..9fdd86a98 100644 --- a/src/components/core/utils/nonceHandler.ts +++ b/src/components/core/utils/nonceHandler.ts @@ -2,8 +2,15 @@ import { ReadableString } from '../../P2P/handleProtocolCommands.js' import { P2PCommandResponse } from '../../../@types/OceanNode.js' import { ethers } from 'ethers' import { GENERIC_EMOJIS, LOG_LEVELS_STR } from '../../../utils/logging/Logger.js' -import { DATABASE_LOGGER } from '../../../utils/logging/common.js' +import { CORE_LOGGER, DATABASE_LOGGER } from '../../../utils/logging/common.js' import { AbstractNonceDatabase } from '../../database/BaseDatabase.js' +import { CoreHandlersRegistry } from '../handler/coreHandlersRegistry.js' +import { OceanNode } from '../../../OceanNode.js' +import { PROTOCOL_COMMANDS } from '../../../utils/constants.js' +import { NonceCommand } from '../../../@types/commands.js' +import { streamToString } from '../../../utils/util.js' +import { Readable } from 'node:stream' +import { getConfiguration } from '../../../utils/config.js' export function getDefaultErrorResponse(errorMessage: string): P2PCommandResponse { return { @@ -32,6 +39,18 @@ export type NonceResponse = { error?: string } +// we are doing the nonce stream response transformation in a few places +// so we can use this shortcut function when we just want the final number +export async function getNonceAsNumber(address: string): Promise { + const command: NonceCommand = { command: PROTOCOL_COMMANDS.NONCE, address } + const nonceResponse = await CoreHandlersRegistry.getInstance(OceanNode.getInstance()) + .getHandlerForTask(command) + .handle(command) + if (nonceResponse.stream) { + return await Number(streamToString(nonceResponse.stream as Readable)) + } + return 0 +} // get stored nonce for an address ( 0 if not found) export async function getNonce( db: AbstractNonceDatabase, @@ -101,7 +120,8 @@ export async function checkNonce( consumer: string, nonce: number, signature: string, - message: string + message: string, + chainId?: string | null ): Promise { try { // get nonce from db @@ -111,18 +131,30 @@ export async function checkNonce( previousNonce = existingNonce.nonce } // check if bigger than previous stored one and validate signature - const validate = validateNonceAndSignature( + const validate = await validateNonceAndSignature( nonce, previousNonce, // will return 0 if none exists consumer, signature, - message // String(ddoId + nonce) + message, // String(ddoId + nonce) + chainId ) if (validate.valid) { const updateStatus = await updateNonce(db, consumer, nonce) return updateStatus + } else { + // log error level when validation failed + CORE_LOGGER.logMessageWithEmoji( + 'Failure when validating nonce and signature: ' + validate.error, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + return { + valid: false, + error: validate.error + } } - return validate // return validation status and possible error msg } catch (err) { DATABASE_LOGGER.logMessageWithEmoji( @@ -147,46 +179,92 @@ export async function checkNonce( * @param message Use this message instead of default String(nonce) * @returns true or false + error message */ -function validateNonceAndSignature( +async function validateNonceAndSignature( nonce: number, existingNonce: number, consumer: string, signature: string, - message: string = null -): NonceResponse { - // check if is bigger than previous nonce + message: string = null, + chainId?: string | null +): Promise { + if (nonce <= existingNonce) { + return { + valid: false, + error: 'nonce: ' + nonce + ' is not a valid nonce' + } + } - if (nonce > existingNonce) { - // nonce good - // now validate signature - if (!message) message = String(nonce) - const consumerMessage = ethers.solidityPackedKeccak256( - ['bytes'], - [ethers.hexlify(ethers.toUtf8Bytes(message))] - ) - const messageHashBytes = ethers.toBeArray(consumerMessage) + if (!message) message = String(nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + + // Try EOA signature validation + try { const addressFromHashSignature = ethers.verifyMessage(consumerMessage, signature) const addressFromBytesSignature = ethers.verifyMessage(messageHashBytes, signature) - if ( ethers.getAddress(addressFromHashSignature)?.toLowerCase() === ethers.getAddress(consumer)?.toLowerCase() || ethers.getAddress(addressFromBytesSignature)?.toLowerCase() === ethers.getAddress(consumer)?.toLowerCase() ) { - // update nonce on DB, return OK - return { - valid: true - } + return { valid: true } } - return { - valid: false, - error: 'consumer address and nonce signature mismatch' + } catch (error) { + // Continue to smart account check + } + + // Try ERC-1271 (smart account) validation + try { + const config = await getConfiguration() + const targetChainId = chainId || Object.keys(config?.supportedNetworks || {})[0] + if (targetChainId && config?.supportedNetworks?.[targetChainId]) { + const provider = new ethers.JsonRpcProvider( + config.supportedNetworks[targetChainId].rpc + ) + + // Try custom hash format (for backward compatibility) + if (await isERC1271Valid(consumer, consumerMessage, signature, provider)) { + return { valid: true } + } + + // Try EIP-191 prefixed hash (standard for smart wallets) + const eip191Hash = ethers.hashMessage(message) + if (await isERC1271Valid(consumer, eip191Hash, signature, provider)) { + return { valid: true } + } } + } catch (error) { + // Smart account validation failed } + return { valid: false, - error: 'nonce: ' + nonce + ' is not a valid nonce' + error: 'consumer address and nonce signature mismatch' + } +} + +// Smart account validation +export async function isERC1271Valid( + address: string, + hash: string | Uint8Array, + signature: string, + provider: ethers.Provider +): Promise { + try { + const contract = new ethers.Contract( + address, + ['function isValidSignature(bytes32, bytes) view returns (bytes4)'], + provider + ) + const hashToUse = typeof hash === 'string' ? hash : ethers.hexlify(hash) + const result = await contract.isValidSignature(hashToUse, signature) + return result === '0x1626ba7e' // ERC-1271 magic value + } catch { + return false } } diff --git a/src/components/core/utils/statusHandler.ts b/src/components/core/utils/statusHandler.ts index a7105442e..c69d2c069 100644 --- a/src/components/core/utils/statusHandler.ts +++ b/src/components/core/utils/statusHandler.ts @@ -7,35 +7,20 @@ import { StorageTypes, OceanNodeConfig } from '../../../@types/OceanNode.js' -import { existsEnvironmentVariable, getConfiguration } from '../../../utils/index.js' -import { ENVIRONMENT_VARIABLES } from '../../../utils/constants.js' +import { getConfiguration } from '../../../utils/index.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' import { OceanNode } from '../../../OceanNode.js' -import { isAddress } from 'ethers' import { typesenseSchemas } from '../../database/TypesenseSchemas.js' import { SupportedNetwork } from '../../../@types/blockchain.js' +import { getAdminAddresses } from '../../../utils/auth.js' +import HumanHasher from 'humanhash' -function getAdminAddresses(config: OceanNodeConfig) { - const validAddresses = [] - if (config.allowedAdmins && config.allowedAdmins.length > 0) { - for (const admin of config.allowedAdmins) { - if (isAddress(admin) === true) { - validAddresses.push(admin) - } - } - if (validAddresses.length === 0) { - CORE_LOGGER.log( - LOG_LEVELS_STR.LEVEL_ERROR, - `Invalid format for ETH address from ALLOWED ADMINS.` - ) - } +function getSupportedStorageTypes(config: OceanNodeConfig): StorageTypes { + return { + url: true, + arwave: !!config.arweaveGateway, + ipfs: !!config.ipfsGateway } - return validAddresses -} -const supportedStorageTypes: StorageTypes = { - url: true, - arwave: existsEnvironmentVariable(ENVIRONMENT_VARIABLES.ARWEAVE_GATEWAY), - ipfs: existsEnvironmentVariable(ENVIRONMENT_VARIABLES.IPFS_GATEWAY) } // platform information @@ -90,8 +75,15 @@ async function getIndexerBlockInfo( ): Promise { let blockNr = '0' try { - const { indexer: indexerDatabase } = oceanNode.getDatabase() - const { lastIndexedBlock } = await indexerDatabase.retrieve(supportedNetwork.chainId) + const database = oceanNode.getDatabase() + if (!database || !database.indexer) { + CORE_LOGGER.log( + LOG_LEVELS_STR.LEVEL_WARN, + `Indexer database is not available for network ${supportedNetwork.network}` + ) + return blockNr + } + const { lastIndexedBlock } = await database.indexer.retrieve(supportedNetwork.chainId) blockNr = lastIndexedBlock.toString() } catch (error) { CORE_LOGGER.log( @@ -123,20 +115,27 @@ export async function status( // no previous status? if (!nodeStatus) { + const publicKey = oceanNode.getKeyManager().getPublicKey() + const publicKeyHex = Buffer.from(publicKey).toString('hex') + nodeStatus = { - id: nodeId && nodeId !== undefined ? nodeId : config.keys.peerId.toString(), // get current node ID - publicKey: Buffer.from(config.keys.publicKey).toString('hex'), - address: config.keys.ethAddress, + id: + nodeId && nodeId !== undefined + ? nodeId + : oceanNode.getKeyManager().getPeerId().toString(), // get current node ID + publicKey: publicKeyHex, + friendlyName: new HumanHasher().humanize(publicKeyHex), + address: oceanNode.getKeyManager().getEthAddress(), version: process.env.npm_package_version, http: config.hasHttp, p2p: config.hasP2P, provider: [], indexer: [], - supportedStorage: supportedStorageTypes, + supportedStorage: getSupportedStorageTypes(config), // uptime: process.uptime(), platform: platformInfo, codeHash: config.codeHash, - allowedAdmins: getAdminAddresses(config) + allowedAdmins: await getAdminAddresses() } } // need to update at least block info if available @@ -151,7 +150,20 @@ export async function status( // depends on request if (detailed) { - nodeStatus.c2dClusters = config.c2dClusters + nodeStatus.c2dClusters = [] + try { + const engines = await oceanNode.getC2DEngines().getAllEngines() + for (const engine of engines) { + const type = await engine.getC2DType() + nodeStatus.c2dClusters.push({ + type, + hash: await engine.getC2DConfig().hash, + environments: await engine.getComputeEnvironments() + }) + } + } catch (error) { + CORE_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error getting c2d clusters: ${error}`) + } nodeStatus.supportedSchemas = typesenseSchemas.ddoSchemas } return nodeStatus diff --git a/src/components/core/utils/validateDdoHandler.ts b/src/components/core/utils/validateDdoHandler.ts index 891b73121..935070551 100644 --- a/src/components/core/utils/validateDdoHandler.ts +++ b/src/components/core/utils/validateDdoHandler.ts @@ -1,155 +1,7 @@ -import { fileURLToPath } from 'url' -import { dirname, resolve } from 'path' -// @ts-ignore -import rdf from '@zazuko/env-node' -import SHACLValidator from 'rdf-validate-shacl' -import formats from '@rdfjs/formats-common' -import { fromRdf } from 'rdf-literal' -import { createHash } from 'crypto' -import { ethers, getAddress } from 'ethers' +import { ethers } from 'ethers' import { CORE_LOGGER } from '../../../utils/logging/common.js' import { create256Hash } from '../../../utils/crypt.js' import { getProviderWallet } from './feesHandler.js' -import { Readable } from 'stream' - -const CURRENT_VERSION = '4.7.0' -const ALLOWED_VERSIONS = ['4.1.0', '4.3.0', '4.5.0', '4.7.0'] - -export function getSchema(version: string = CURRENT_VERSION): string { - if (!ALLOWED_VERSIONS.includes(version)) { - CORE_LOGGER.logMessage(`Can't find schema ${version}`, true) - return - } - const path = `../../../../schemas/${version}.ttl` - // Use fileURLToPath to convert the URL to a file path - const currentModulePath = fileURLToPath(import.meta.url) - - // Use dirname to get the directory name - const currentDirectory = dirname(currentModulePath) - const schemaFilePath = resolve(currentDirectory, path) - if (!schemaFilePath) { - CORE_LOGGER.logMessage(`Can't find schema ${version}`, true) - return - } - return schemaFilePath -} - -/* function isIsoFormat(dateString: string): boolean { - const isoDateRegex = /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{1,3})?Z)?$/ - return isoDateRegex.test(dateString) -} -*/ - -export function makeDid(nftAddress: string, chainId: string): string { - return ( - 'did:op:' + - createHash('sha256') - .update(getAddress(nftAddress) + chainId) - .digest('hex') - ) -} - -export async function validateObject( - obj: Record, - chainId: number, - nftAddress: string -): Promise<[boolean, Record]> { - const ddoCopy = JSON.parse(JSON.stringify(obj)) - ddoCopy['@type'] = 'DDO' - - const extraErrors: Record = {} - // overwrite context - ddoCopy['@context'] = { - '@vocab': 'http://schema.org/' - } - /* if (!('@context' in ddoCopy) || !Array.isArray(ddoCopy['@context'])) { - ddoCopy['@context'] = { - '@vocab': 'http://schema.org/' - } - } - if (!('@vocab' in ddoCopy['@context'])) { - ddoCopy['@context']['@vocab'] = 'http://schema.org/' - } - */ - /* if (!('metadata' in obj)) { - if (!('metadata' in extraErrors)) extraErrors.metadata = [] - extraErrors.metadata.push('Metadata is missing.') - } - if (obj.metadata && !('created' in obj.metadata)) { - if (!('created' in extraErrors)) extraErrors.created = [] - extraErrors.created.push('Created is missing or invalid.') - } - if (obj.metadata && !('updated' in obj.metadata)) { - if (!('updated' in extraErrors)) extraErrors.updated = [] - extraErrors.updated.push('Metadata is missing or invalid.') - } - ;['created', 'updated'].forEach((attr) => { - if ('metadata' in obj && attr in obj.metadata && !isIsoFormat(obj.metadata[attr])) { - if (!('metadata' in extraErrors)) extraErrors.metadata = [] - extraErrors.metadata.push(`${attr} is not in ISO format.`) - } - }) - */ - if (!chainId) { - if (!('chainId' in extraErrors)) extraErrors.chainId = [] - extraErrors.chainId.push('chainId is missing or invalid.') - } - - try { - getAddress(nftAddress) - } catch (err) { - if (!('nftAddress' in extraErrors)) extraErrors.nftAddress = [] - extraErrors.nftAddress.push('nftAddress is missing or invalid.') - CORE_LOGGER.logMessage(`Error when retrieving address ${nftAddress}: ${err}`, true) - } - - if (!(makeDid(nftAddress, chainId.toString(10)) === obj.id)) { - if (!('id' in extraErrors)) extraErrors.id = [] - extraErrors.id.push('did is not valid for chain Id and nft address') - } - const version = ddoCopy.version || CURRENT_VERSION - const schemaFilePath = getSchema(version) - CORE_LOGGER.logMessage(`Using ` + schemaFilePath, true) - - const shapes = await rdf.dataset().import(rdf.fromFile(schemaFilePath)) - const dataStream = Readable.from(JSON.stringify(ddoCopy)) - const output = formats.parsers.import('application/ld+json', dataStream) - const data = await rdf.dataset().import(output) - const validator = new SHACLValidator(shapes, { factory: rdf }) - const report = await validator.validate(data) - if (report.conforms) { - CORE_LOGGER.logMessage(`Valid object: ` + JSON.stringify(obj), true) - return [true, {}] - } - for (const result of report.results) { - // See https://www.w3.org/TR/shacl/#results-validation-result for details - // about each property - const key = result.path.value.replace('http://schema.org/', '') - if (!(key in extraErrors)) extraErrors[key] = [] - extraErrors[key].push(fromRdf(result.message[0])) - } - extraErrors.fullReport = await report.dataset.serialize({ - format: 'application/ld+json' - }) - CORE_LOGGER.logMessage(`Failed to validate DDO: ` + JSON.stringify(obj), true) - CORE_LOGGER.logMessage(JSON.stringify(extraErrors), true) - return [false, extraErrors] -} - -export function isRemoteDDO(ddo: any): boolean { - let keys - try { - keys = Object.keys(ddo) - } catch (e) { - return false - } - - if (keys.length === 1 && keys[0] === 'remote') { - return true - } - - return false -} export async function getValidationSignature(ddo: string): Promise { try { @@ -172,3 +24,18 @@ export async function getValidationSignature(ddo: string): Promise { return { hash: '', publicKey: '', r: '', s: '', v: '' } } } + +export function isRemoteDDO(ddo: any): boolean { + let keys + try { + keys = Object.keys(ddo) + } catch (e) { + return false + } + + if (keys.length === 1 && keys[0] === 'remote') { + return true + } + + return false +} diff --git a/src/components/core/utils/validateOrders.ts b/src/components/core/utils/validateOrders.ts index 146819732..8210d150e 100644 --- a/src/components/core/utils/validateOrders.ts +++ b/src/components/core/utils/validateOrders.ts @@ -1,13 +1,7 @@ -import { - JsonRpcApiProvider, - Contract, - Interface, - TransactionReceipt, - Signer -} from 'ethers' +import { Contract, Interface, TransactionReceipt, Signer, FallbackProvider } from 'ethers' import { fetchEventFromTransaction } from '../../../utils/util.js' -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' assert { type: 'json' } -import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' } +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } import { CORE_LOGGER } from '../../../utils/logging/common.js' import { EVENTS } from '../../../utils/index.js' @@ -20,7 +14,7 @@ const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) export async function fetchTransactionReceipt( txId: string, - provider: JsonRpcApiProvider, + provider: FallbackProvider, retries: number = 2 ): Promise { while (retries > 0) { @@ -45,7 +39,7 @@ export async function fetchTransactionReceipt( export async function validateOrderTransaction( txId: string, userAddress: string, - provider: JsonRpcApiProvider, + provider: FallbackProvider, dataNftAddress: string, datatokenAddress: string, serviceIndex: number, @@ -134,6 +128,9 @@ export async function validateOrderTransaction( const currentTimestamp = Math.floor(Date.now() / 1000) const timeElapsed = currentTimestamp - eventTimestamp + CORE_LOGGER.logMessage( + `serviceTimeout ${serviceTimeout} vs. timeElapsed ${timeElapsed} when validating order.` + ) if (serviceTimeout !== 0 && timeElapsed > serviceTimeout) { return { diff --git a/src/components/database/AuthTokenDatabase.ts b/src/components/database/AuthTokenDatabase.ts new file mode 100644 index 000000000..662489a41 --- /dev/null +++ b/src/components/database/AuthTokenDatabase.ts @@ -0,0 +1,59 @@ +import { DATABASE_LOGGER } from '../../utils/logging/common.js' +import { AbstractDatabase } from './BaseDatabase.js' +import { OceanNodeDBConfig } from '../../@types/OceanNode.js' +import path from 'path' +import * as fs from 'fs' +import { SQLiteAuthToken } from './sqliteAuthToken.js' + +export interface AuthToken { + token: string + address: string + created: Date + validUntil: Date | null + isValid: boolean + chainId?: string | null +} + +export class AuthTokenDatabase extends AbstractDatabase { + private provider: SQLiteAuthToken + + private constructor(config: OceanNodeDBConfig, provider?: SQLiteAuthToken) { + super(config) + this.provider = provider + } + + static async create(config: OceanNodeDBConfig): Promise { + DATABASE_LOGGER.info('Creating AuthTokenDatabase with SQLite') + const dbDir = path.dirname('databases/authTokenDatabase.sqlite') + if (!fs.existsSync(dbDir)) { + fs.mkdirSync(dbDir, { recursive: true }) + } + const provider = new SQLiteAuthToken('databases/authTokenDatabase.sqlite') + await provider.createTable() + return new AuthTokenDatabase(config, provider) + } + + async createToken( + token: string, + address: string, + validUntil: number | null = null, + createdAt: number, + chainId?: string | null + ): Promise { + await this.provider.createToken(token, address, createdAt, validUntil, chainId) + return token + } + + async validateToken(token: string): Promise { + const tokenEntry = await this.provider.validateTokenEntry(token) + if (!tokenEntry) { + return null + } + + return tokenEntry + } + + async invalidateToken(token: string): Promise { + await this.provider.invalidateTokenEntry(token) + } +} diff --git a/src/components/database/BaseDatabase.ts b/src/components/database/BaseDatabase.ts index 637b82aec..3fddb074f 100644 --- a/src/components/database/BaseDatabase.ts +++ b/src/components/database/BaseDatabase.ts @@ -5,7 +5,7 @@ import { DATABASE_LOGGER } from '../../utils/logging/common.js' import { ElasticsearchSchema } from './ElasticSchemas.js' import { TypesenseSchema } from './TypesenseSchemas.js' -export abstract class AbstractNonceDatabase { +export abstract class AbstractDatabase { protected config: OceanNodeDBConfig protected schema: TypesenseSchema @@ -13,7 +13,8 @@ export abstract class AbstractNonceDatabase { this.config = config this.schema = schema } - +} +export abstract class AbstractNonceDatabase extends AbstractDatabase { abstract create(address: string, nonce: number): Promise abstract retrieve(address: string): Promise abstract update(address: string, nonce: number): Promise @@ -30,30 +31,14 @@ export abstract class AbstractNonceDatabase { } } -export abstract class AbstractIndexerDatabase { - protected config: OceanNodeDBConfig - protected schema: TypesenseSchema - - constructor(config: OceanNodeDBConfig, schema?: TypesenseSchema) { - this.config = config - this.schema = schema - } - +export abstract class AbstractIndexerDatabase extends AbstractDatabase { abstract create(network: number, lastIndexedBlock: number): Promise abstract retrieve(network: number): Promise abstract update(network: number, lastIndexedBlock: number): Promise abstract delete(network: number): Promise } -export abstract class AbstractLogDatabase { - protected config: OceanNodeDBConfig - protected schema: TypesenseSchema - - constructor(config: OceanNodeDBConfig, schema?: TypesenseSchema) { - this.config = config - this.schema = schema - } - +export abstract class AbstractLogDatabase extends AbstractDatabase { abstract insertLog(logEntry: Record): Promise abstract retrieveLog(id: string): Promise | null> abstract retrieveMultipleLogs( @@ -63,22 +48,14 @@ export abstract class AbstractLogDatabase { moduleName?: string, level?: string, page?: number - ): Promise[] | null> + ): Promise[]> abstract delete(logId: string): Promise abstract deleteOldLogs(): Promise abstract getLogsCount(): Promise } -export abstract class AbstractDdoStateDatabase { - protected config: OceanNodeDBConfig - protected schema: TypesenseSchema - - constructor(config: OceanNodeDBConfig, schema?: TypesenseSchema) { - this.config = config - this.schema = schema - } - +export abstract class AbstractDdoStateDatabase extends AbstractDatabase { abstract create( chainId: number, did: string, @@ -165,8 +142,6 @@ export abstract class AbstractDdoDatabase { return (schema as TypesenseSchema).name !== undefined } - abstract validateDDO(ddo: Record): Promise - abstract search( query: Record, maxResultsPerPage?: number, diff --git a/src/components/database/C2DDatabase.ts b/src/components/database/C2DDatabase.ts new file mode 100644 index 000000000..01eff5a09 --- /dev/null +++ b/src/components/database/C2DDatabase.ts @@ -0,0 +1,163 @@ +import path from 'path' +import fs from 'fs' +import { ComputeEnvironment, DBComputeJob } from '../../@types/C2D/C2D.js' +import { SQLiteCompute } from './sqliteCompute.js' +import { DATABASE_LOGGER } from '../../utils/logging/common.js' +import { OceanNodeDBConfig } from '../../@types/OceanNode.js' +import { TypesenseSchema } from './TypesenseSchemas.js' +import { AbstractDatabase } from './BaseDatabase.js' +import { OceanNode } from '../../OceanNode.js' +import { getDatabase } from '../../utils/database.js' +import { getConfiguration } from '../../utils/index.js' +import { generateUniqueID } from '../core/compute/utils.js' +export class C2DDatabase extends AbstractDatabase { + private provider: SQLiteCompute + + constructor(config: OceanNodeDBConfig, schema: TypesenseSchema) { + super(config, schema) + return (async (): Promise => { + // Fall back to SQLite + DATABASE_LOGGER.info('Creating C2DDatabase with SQLite') + + // Ensure the directory exists before instantiating SQLiteProvider + const dbDir = path.dirname('databases/c2dDatabase.sqlite') + if (!fs.existsSync(dbDir)) { + fs.mkdirSync(dbDir, { recursive: true }) + } + this.provider = new SQLiteCompute('databases/c2dDatabase.sqlite') + await this.provider.createTable() + await this.provider.createImageTable() + + return this + })() as unknown as C2DDatabase + } + + async newJob(job: DBComputeJob): Promise { + if (!job.jobId) job.jobId = generateUniqueID(job) + const jobId = await this.provider.newJob(job) + return jobId + } + + async getJob( + jobId?: string, + agreementId?: string, + owner?: string + ): Promise { + const jobs = await this.provider.getJob(jobId, agreementId, owner) + return jobs + } + + async updateJob(job: DBComputeJob): Promise { + let updated = 0 + const previouslySaved: DBComputeJob[] = await this.getJob(job.jobId) + if (previouslySaved.length === 1) { + previouslySaved[0] = job + updated = await this.provider.updateJob(previouslySaved[0]) + if (!updated) { + DATABASE_LOGGER.error(`Unable to update job: ${job.jobId}. No rows affected!`) + } + } else { + DATABASE_LOGGER.error( + `Unable to update job: ${job.jobId}. It seems this jobID does not exist!` + ) + } + return updated + } + + async getRunningJobs(engine?: string, environment?: string): Promise { + return await this.provider.getRunningJobs(engine, environment) + } + + async deleteJob(jobId: string): Promise { + return await this.provider.deleteJob(jobId) + } + + async getFinishedJobs(environments?: string[]): Promise { + return await this.provider.getFinishedJobs(environments) + } + + async getJobs( + environments?: string[], + fromTimestamp?: string, + consumerAddrs?: string[] + ): Promise { + return await this.provider.getJobs(environments, fromTimestamp, consumerAddrs) + } + + async updateImage(image: string): Promise { + return await this.provider.updateImage(image) + } + + async getOldImages(retentionDays: number): Promise { + return await this.provider.getOldImages(retentionDays) + } + + /** + * + * @param environment compute environment to check for + * + * All compute engines have compute environments, + * and each compute environment specifies how long the output produced by + * a job is held by the node, before being deleted. + * When a job expiry is overdue, the node will delete all storage used by that job, + * and also delete the job record from the database + * @returns array of eexpired jobs + */ + async cleanStorageExpiredJobs(): Promise { + const config = await getConfiguration(true) + const allEngines = await OceanNode.getInstance( + config, + await getDatabase() + ).getC2DEngines().engines + + let cleaned = 0 + for (const engine of allEngines) { + const allEnvironments = await engine.getComputeEnvironments() + for (const computeEnvironment of allEnvironments) { + const finishedOrExpired: DBComputeJob[] = await this.provider.getFinishedJobs([ + computeEnvironment.id + ]) + for (const job of finishedOrExpired) { + if ( + computeEnvironment && + computeEnvironment.storageExpiry > Date.now() / 1000 + ) { + if (await engine.cleanupExpiredStorage(job)) { + cleaned++ + } + } + } + } + cleaned += await this.cleanOrphanJobs(allEnvironments) + } + return cleaned + } + + /** + * Clean orphan jobs. Stuff left on DB without existing environments associated + * @param existingEnvironments + * @returns number of orphans + */ + async cleanOrphanJobs(existingEnvironments: ComputeEnvironment[]) { + const c2dDatabase = await (await getDatabase()).c2d + let cleaned = 0 + + const envIds: string[] = existingEnvironments + .filter((env: any) => env && typeof env.id === 'string') + .map((env: any) => env.id) + + // Get all finished jobs from DB, not just from known environments + const allJobs: DBComputeJob[] = await c2dDatabase.getFinishedJobs() + + for (const job of allJobs) { + if (!job.environment || !envIds.includes(job.environment)) { + if (await c2dDatabase.deleteJob(job.jobId)) { + cleaned++ + } + } + } + + DATABASE_LOGGER.info('Cleaned ' + cleaned + ' orphan C2D jobs') + return cleaned + } +} diff --git a/src/components/database/DatabaseFactory.ts b/src/components/database/DatabaseFactory.ts index fc1a85b56..e83549f9d 100644 --- a/src/components/database/DatabaseFactory.ts +++ b/src/components/database/DatabaseFactory.ts @@ -29,7 +29,10 @@ import { TypesenseMetadataQuery } from './TypesenseMetadataQuery.js' import { IMetadataQuery } from '../../@types/DDO/IMetadataQuery.js' import { ElasticSearchMetadataQuery } from './ElasticSearchMetadataQuery.js' import { DB_TYPES } from '../../utils/index.js' +import { C2DDatabase } from './C2DDatabase.js' import { SQLLiteNonceDatabase } from './SQLLiteNonceDatabase.js' +import { SQLLiteConfigDatabase } from './SQLLiteConfigDatabase.js' +import { AuthTokenDatabase } from './AuthTokenDatabase.js' export class DatabaseFactory { private static databaseMap = { @@ -85,6 +88,16 @@ export class DatabaseFactory { return this.createDatabase('ddo', config) } + static async createC2DDatabase(config: OceanNodeDBConfig): Promise { + return await new C2DDatabase(config, typesenseSchemas.c2dSchemas) + } + + static async createAuthTokenDatabase( + config: OceanNodeDBConfig + ): Promise { + return await AuthTokenDatabase.create(config) + } + static createIndexerDatabase( config: OceanNodeDBConfig ): Promise { @@ -112,4 +125,8 @@ export class DatabaseFactory { static createMetadataQuery(config: OceanNodeDBConfig): Promise { return this.createDatabase('metadataQuery', config) } + + static async createConfigDatabase(): Promise { + return await new SQLLiteConfigDatabase() + } } diff --git a/src/components/database/ElasticSearchDatabase.ts b/src/components/database/ElasticSearchDatabase.ts index 87bf8d807..2d69e8602 100644 --- a/src/components/database/ElasticSearchDatabase.ts +++ b/src/components/database/ElasticSearchDatabase.ts @@ -6,12 +6,14 @@ import { AbstractLogDatabase, AbstractOrderDatabase } from './BaseDatabase.js' -import { createElasticsearchClient } from './ElasticsearchConfigHelper.js' +import { createElasticsearchClientWithRetry } from './ElasticsearchConfigHelper.js' import { OceanNodeDBConfig } from '../../@types' import { ElasticsearchSchema } from './ElasticSchemas.js' import { DATABASE_LOGGER } from '../../utils/logging/common.js' import { GENERIC_EMOJIS, LOG_LEVELS_STR } from '../../utils/logging/Logger.js' -import { validateObject } from '../core/utils/validateDdoHandler.js' + +import { DDOManager } from '@oceanprotocol/ddo-js' +import { validateDDO } from '../../utils/asset.js' export class ElasticsearchIndexerDatabase extends AbstractIndexerDatabase { private client: Client @@ -19,10 +21,13 @@ export class ElasticsearchIndexerDatabase extends AbstractIndexerDatabase { constructor(config: OceanNodeDBConfig) { super(config) - this.client = new Client({ node: config.url }) this.index = 'indexer' - this.initializeIndex() + return (async (): Promise => { + this.client = await createElasticsearchClientWithRetry(config) + await this.initializeIndex() + return this + })() as unknown as ElasticsearchIndexerDatabase } private async initializeIndex() { @@ -139,16 +144,20 @@ export class ElasticsearchIndexerDatabase extends AbstractIndexerDatabase { } } } + export class ElasticsearchDdoStateDatabase extends AbstractDdoStateDatabase { private client: Client private index: string constructor(config: OceanNodeDBConfig) { super(config) - this.client = new Client({ node: config.url }) this.index = 'ddo_state' - this.initializeIndex() + return (async (): Promise => { + this.client = await createElasticsearchClientWithRetry(config) + await this.initializeIndex() + return this + })() as unknown as ElasticsearchDdoStateDatabase } private async initializeIndex() { @@ -228,12 +237,9 @@ export class ElasticsearchDdoStateDatabase extends AbstractDdoStateDatabase { try { const result = await this.client.search({ index: this.index, - query: { - match: { - [query.query_by]: query.q - } - } + query }) + console.log('Query result: ', result) return result.hits.hits.map((hit: any) => { return normalizeDocumentId(hit._source, hit._id) }) @@ -311,12 +317,17 @@ export class ElasticsearchDdoStateDatabase extends AbstractDdoStateDatabase { } } } + export class ElasticsearchOrderDatabase extends AbstractOrderDatabase { private provider: Client constructor(config: OceanNodeDBConfig, schema: ElasticsearchSchema) { super(config, schema) - this.provider = createElasticsearchClient(config) + + return (async (): Promise => { + this.provider = await createElasticsearchClientWithRetry(config) + return this + })() as unknown as ElasticsearchOrderDatabase } getSchema(): ElasticsearchSchema { @@ -377,6 +388,7 @@ export class ElasticsearchOrderDatabase extends AbstractOrderDatabase { did, startOrderId } + await this.provider.index({ index: this.getSchema().index, id: orderId, @@ -462,7 +474,11 @@ export class ElasticsearchDdoDatabase extends AbstractDdoDatabase { constructor(config: OceanNodeDBConfig, schemas: ElasticsearchSchema[]) { super(config, schemas) - this.client = createElasticsearchClient(config) + + return (async (): Promise => { + this.client = await createElasticsearchClientWithRetry(config) + return this + })() as unknown as ElasticsearchDdoDatabase } getSchemas(): ElasticsearchSchema[] { @@ -471,10 +487,15 @@ export class ElasticsearchDdoDatabase extends AbstractDdoDatabase { getDDOSchema(ddo: Record) { let schemaName: string | undefined - if (ddo.nft?.state !== 0) { - schemaName = 'op_ddo_short' - } else if (ddo.version) { + const ddoInstance = DDOManager.getDDOClass(ddo) + const ddoData = ddoInstance.getDDOData() + if (ddoData.version) { schemaName = `op_ddo_v${ddo.version}` + } else if ( + 'indexedMetadata' in ddoData && + ddoData?.indexedMetadata?.nft?.state !== 0 + ) { + schemaName = 'op_ddo_short' } const schema = this.getSchemas().find((s) => s.index === schemaName) DATABASE_LOGGER.logMessageWithEmoji( @@ -486,32 +507,6 @@ export class ElasticsearchDdoDatabase extends AbstractDdoDatabase { return schema } - async validateDDO(ddo: Record): Promise { - if (ddo.nft?.state !== 0) { - return true - } else { - const validation = await validateObject(ddo, ddo.chainId, ddo.nftAddress) - if (validation[0] === true) { - DATABASE_LOGGER.logMessageWithEmoji( - `Validation of DDO with did: ${ddo.id} has passed`, - true, - GENERIC_EMOJIS.EMOJI_OCEAN_WAVE, - LOG_LEVELS_STR.LEVEL_INFO - ) - return true - } else { - DATABASE_LOGGER.logMessageWithEmoji( - `Validation of DDO with schema version ${ddo.version} failed with errors: ` + - JSON.stringify(validation[1]), - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - return false - } - } - } - async search(query: Record): Promise { const results = [] const maxPerPage = query.size || 100 @@ -529,10 +524,18 @@ export class ElasticsearchDdoDatabase extends AbstractDdoDatabase { } }) if (response.hits?.hits.length > 0) { - const nomalizedResponse = response.hits.hits.map((hit: any) => { - return normalizeDocumentId(hit._source, hit._id) + const totalHits = + typeof response.hits.total === 'number' + ? response.hits.total + : response.hits.total?.value || 0 + + const normalizedResults = response.hits.hits.map((hit: any) => + normalizeDocumentId(hit._source, hit._id) + ) + results.push({ + results: normalizedResults, + totalResults: totalHits }) - results.push(nomalizedResponse) } } catch (error) { const schemaErrorMsg = `Error for schema ${query.index}: ${error.message}` @@ -555,10 +558,18 @@ export class ElasticsearchDdoDatabase extends AbstractDdoDatabase { } }) if (response.hits?.hits.length > 0) { - const nomalizedResponse = response.hits.hits.map((hit: any) => { - return normalizeDocumentId(hit._source, hit._id) + const totalHits = + typeof response.hits.total === 'number' + ? response.hits.total + : response.hits.total?.value || 0 + + const normalizedResults = response.hits.hits.map((hit: any) => + normalizeDocumentId(hit._source, hit._id) + ) + results.push({ + results: normalizedResults, + totalResults: totalHits }) - results.push(nomalizedResponse) } } catch (error) { const schemaErrorMsg = `Error for schema ${schema.index}: ${error.message}` @@ -582,7 +593,10 @@ export class ElasticsearchDdoDatabase extends AbstractDdoDatabase { throw new Error(`Schema for version ${ddo.version} not found`) } try { - const validation = await this.validateDDO(ddo) + // avoid issue with nft fields, due to schema + if (ddo?.indexedMetadata?.nft) delete ddo.nft + const validation = await validateDDO(ddo) + if (validation === true) { const response = await this.client.index({ index: schema.index, @@ -650,7 +664,9 @@ export class ElasticsearchDdoDatabase extends AbstractDdoDatabase { throw new Error(`Schema for version ${ddo.version} not found`) } try { - const validation = await this.validateDDO(ddo) + // avoid issue with nft fields, due to schema + if (ddo?.indexedMetadata?.nft) delete ddo.nft + const validation = await validateDDO(ddo) if (validation === true) { const response: any = await this.client.update({ index: schema.index, @@ -768,10 +784,13 @@ export class ElasticsearchLogDatabase extends AbstractLogDatabase { constructor(config: OceanNodeDBConfig) { super(config) - this.client = new Client({ node: config.url }) this.index = 'log' - this.initializeIndex() + return (async (): Promise => { + this.client = await createElasticsearchClientWithRetry(config) + await this.initializeIndex() + return this + })() as unknown as ElasticsearchLogDatabase } private async initializeIndex() { @@ -849,7 +868,7 @@ export class ElasticsearchLogDatabase extends AbstractLogDatabase { moduleName?: string, level?: string, page?: number - ): Promise[] | null> { + ): Promise[]> { try { const filterConditions: any = { bool: { @@ -888,10 +907,6 @@ export class ElasticsearchLogDatabase extends AbstractLogDatabase { from }) - console.log('logs results:', result) - console.log('logs results hits:', result.hits) - console.log('logs results hits hits:', result.hits.hits) - return result.hits.hits.map((hit: any) => { return normalizeDocumentId(hit._source, hit._id) }) @@ -903,7 +918,7 @@ export class ElasticsearchLogDatabase extends AbstractLogDatabase { GENERIC_EMOJIS.EMOJI_CROSS_MARK, LOG_LEVELS_STR.LEVEL_ERROR ) - return null + return [] } } @@ -943,13 +958,12 @@ export class ElasticsearchLogDatabase extends AbstractLogDatabase { try { const oldLogs = await this.retrieveMultipleLogs(new Date(0), deleteBeforeTime, 200) - if (oldLogs) { - for (const log of oldLogs) { - if (log.id) { - await this.delete(log.id) - } + for (const log of oldLogs) { + if (log.id) { + await this.delete(log.id) } } + return oldLogs ? oldLogs.length : 0 } catch (error) { DATABASE_LOGGER.logMessageWithEmoji( diff --git a/src/components/database/ElasticSearchDdoStateQuery.ts b/src/components/database/ElasticSearchDdoStateQuery.ts index 16751db21..324d2f85d 100644 --- a/src/components/database/ElasticSearchDdoStateQuery.ts +++ b/src/components/database/ElasticSearchDdoStateQuery.ts @@ -6,7 +6,7 @@ export class ElasticSearchDdoStateQuery implements IDdoStateQuery { if (did) { query = { - match: { + term: { did } } @@ -14,7 +14,7 @@ export class ElasticSearchDdoStateQuery implements IDdoStateQuery { if (nft) { query = { - match: { + term: { nft } } @@ -22,7 +22,7 @@ export class ElasticSearchDdoStateQuery implements IDdoStateQuery { if (txId) { query = { - match: { + term: { txId } } diff --git a/src/components/database/ElasticSearchMetadataQuery.ts b/src/components/database/ElasticSearchMetadataQuery.ts index 5cfc74f2b..1c1ca86ac 100644 --- a/src/components/database/ElasticSearchMetadataQuery.ts +++ b/src/components/database/ElasticSearchMetadataQuery.ts @@ -48,6 +48,6 @@ export class ElasticSearchMetadataQuery implements IMetadataQuery { } private isElasticSearchQuery(query: any): boolean { - return query && query.query && query.query.bool !== undefined + return query && query.query } } diff --git a/src/components/database/ElasticsearchConfigHelper.ts b/src/components/database/ElasticsearchConfigHelper.ts index 1eab4e00d..9838e4ff1 100644 --- a/src/components/database/ElasticsearchConfigHelper.ts +++ b/src/components/database/ElasticsearchConfigHelper.ts @@ -1,12 +1,371 @@ import { Client } from '@elastic/elasticsearch' import { OceanNodeDBConfig } from '../../@types' +import { DATABASE_LOGGER } from '../../utils/logging/common.js' +import { GENERIC_EMOJIS, LOG_LEVELS_STR } from '../../utils/logging/Logger.js' +import { DB_TYPES } from '../../utils/constants.js' -export function createElasticsearchClient(config: OceanNodeDBConfig): Client { - return new Client({ - node: config.url, - auth: - config.username && config.password - ? { username: config.username, password: config.password } - : undefined - }) +export interface ElasticsearchRetryConfig { + requestTimeout?: number + pingTimeout?: number + resurrectStrategy?: 'ping' | 'optimistic' | 'none' + maxRetries?: number + sniffOnStart?: boolean + sniffInterval?: number | false + sniffOnConnectionFault?: boolean + healthCheckInterval?: number +} + +export const DEFAULT_ELASTICSEARCH_CONFIG: Required = { + requestTimeout: parseInt(process.env.ELASTICSEARCH_REQUEST_TIMEOUT || '60000'), + pingTimeout: parseInt(process.env.ELASTICSEARCH_PING_TIMEOUT || '5000'), + resurrectStrategy: + (process.env.ELASTICSEARCH_RESURRECT_STRATEGY as 'ping' | 'optimistic' | 'none') || + 'ping', + maxRetries: parseInt(process.env.ELASTICSEARCH_MAX_RETRIES || '5'), + sniffOnStart: process.env.ELASTICSEARCH_SNIFF_ON_START !== 'false', + sniffInterval: + process.env.ELASTICSEARCH_SNIFF_INTERVAL === 'false' + ? false + : parseInt(process.env.ELASTICSEARCH_SNIFF_INTERVAL || '30000'), + sniffOnConnectionFault: process.env.ELASTICSEARCH_SNIFF_ON_CONNECTION_FAULT !== 'false', + healthCheckInterval: parseInt( + process.env.ELASTICSEARCH_HEALTH_CHECK_INTERVAL || '60000' + ) +} + +class ElasticsearchClientSingleton { + private static instance: any = null + private client: Client | null = null + private config: OceanNodeDBConfig | null = null + private connectionAttempts: number = 0 + private lastConnectionTime: number = 0 + private isRetrying: boolean = false + private healthCheckTimer: NodeJS.Timeout | null = null + private isMonitoring: boolean = false + + private constructor() {} + + public static getInstance(): ElasticsearchClientSingleton { + if (!ElasticsearchClientSingleton.instance) { + ElasticsearchClientSingleton.instance = new ElasticsearchClientSingleton() + } + return ElasticsearchClientSingleton.instance + } + + private isElasticsearchDatabase(config: OceanNodeDBConfig): boolean { + return config.dbType === DB_TYPES.ELASTIC_SEARCH + } + + public async getClient( + config: OceanNodeDBConfig, + customConfig: Partial = {} + ): Promise { + if (!this.isElasticsearchDatabase(config)) { + DATABASE_LOGGER.logMessageWithEmoji( + `Skipping Elasticsearch connection - database type is set to '${ + config.dbType || 'unknown' + }', not '${DB_TYPES.ELASTIC_SEARCH}'`, + true, + GENERIC_EMOJIS.EMOJI_OCEAN_WAVE, + LOG_LEVELS_STR.LEVEL_DEBUG + ) + throw new Error(`Database type '${config.dbType}' is not Elasticsearch`) + } + + if (this.client && this.config) { + const isHealthy = await this.checkConnectionHealth() + if (isHealthy) { + this.startHealthMonitoring(config, customConfig) + return this.client + } else { + DATABASE_LOGGER.logMessageWithEmoji( + `Elasticsearch connection interrupted or failed to ${this.maskUrl( + this.config.url + )} - starting retry phase`, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_WARN + ) + this.closeConnectionSync() + return this.startRetryConnection(config, customConfig) + } + } + + const client = await this.createNewConnection(config, customConfig) + this.startHealthMonitoring(config, customConfig) + return client + } + + private startHealthMonitoring( + config: OceanNodeDBConfig, + customConfig: Partial = {} + ): void { + if (this.isMonitoring || !this.client || !this.isElasticsearchDatabase(config)) return + + const finalConfig = { + ...DEFAULT_ELASTICSEARCH_CONFIG, + ...customConfig + } + + this.isMonitoring = true + DATABASE_LOGGER.logMessageWithEmoji( + `Starting Elasticsearch connection monitoring (health check every ${finalConfig.healthCheckInterval}ms)`, + true, + GENERIC_EMOJIS.EMOJI_OCEAN_WAVE, + LOG_LEVELS_STR.LEVEL_DEBUG + ) + + this.healthCheckTimer = setInterval(async () => { + if (this.client && !this.isRetrying) { + const isHealthy = await this.checkConnectionHealth() + if (!isHealthy) { + DATABASE_LOGGER.logMessageWithEmoji( + `Elasticsearch connection lost during monitoring - triggering automatic reconnection`, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_WARN + ) + this.closeConnectionSync() + try { + await this.startRetryConnection(config, customConfig) + } catch (error) { + DATABASE_LOGGER.logMessageWithEmoji( + `Automatic reconnection failed: ${error.message}`, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + } + } + } + }, finalConfig.healthCheckInterval) + } + + private stopHealthMonitoring(): void { + if (this.healthCheckTimer) { + clearInterval(this.healthCheckTimer) + this.healthCheckTimer = null + this.isMonitoring = false + DATABASE_LOGGER.logMessageWithEmoji( + `Stopped Elasticsearch connection monitoring`, + true, + GENERIC_EMOJIS.EMOJI_OCEAN_WAVE, + LOG_LEVELS_STR.LEVEL_DEBUG + ) + } + } + + private async startRetryConnection( + config: OceanNodeDBConfig, + customConfig: Partial = {} + ): Promise { + if (!this.isElasticsearchDatabase(config)) { + throw new Error(`Database type '${config.dbType}' is not Elasticsearch`) + } + + this.isRetrying = true + const finalConfig = { + ...DEFAULT_ELASTICSEARCH_CONFIG, + ...customConfig + } + + DATABASE_LOGGER.logMessageWithEmoji( + `Starting Elasticsearch retry connection phase to ${this.maskUrl( + config.url + )} (max retries: ${finalConfig.maxRetries})`, + true, + GENERIC_EMOJIS.EMOJI_OCEAN_WAVE, + LOG_LEVELS_STR.LEVEL_INFO + ) + + for (let attempt = 1; attempt <= finalConfig.maxRetries; attempt++) { + try { + DATABASE_LOGGER.logMessageWithEmoji( + `Elasticsearch reconnection attempt ${attempt}/${ + finalConfig.maxRetries + } to ${this.maskUrl(config.url)}`, + true, + GENERIC_EMOJIS.EMOJI_OCEAN_WAVE, + LOG_LEVELS_STR.LEVEL_INFO + ) + + const client = await this.createNewConnection(config, customConfig) + this.isRetrying = false + return client + } catch (error) { + if (attempt === finalConfig.maxRetries) { + this.isRetrying = false + DATABASE_LOGGER.logMessageWithEmoji( + `Elasticsearch retry connection failed after ${ + finalConfig.maxRetries + } attempts to ${this.maskUrl(config.url)}: ${error.message}`, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + throw error + } + + const delay = Math.min(1000 * Math.pow(2, attempt - 1), 30000) + DATABASE_LOGGER.logMessageWithEmoji( + `Elasticsearch retry attempt ${attempt}/${finalConfig.maxRetries} failed, waiting ${delay}ms before next attempt: ${error.message}`, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_WARN + ) + await new Promise((resolve) => setTimeout(resolve, delay)) + } + } + + throw new Error('Maximum retry attempts reached') + } + + private async checkConnectionHealth(): Promise { + if (!this.client) return false + + try { + await this.client.ping() + return true + } catch (error) { + DATABASE_LOGGER.logMessageWithEmoji( + `Elasticsearch connection health check failed: ${error.message}`, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_DEBUG + ) + return false + } + } + + private async createNewConnection( + config: OceanNodeDBConfig, + customConfig: Partial = {} + ): Promise { + if (!this.isElasticsearchDatabase(config)) { + throw new Error(`Database type '${config.dbType}' is not Elasticsearch`) + } + + this.connectionAttempts++ + this.lastConnectionTime = Date.now() + + const finalConfig = { + ...DEFAULT_ELASTICSEARCH_CONFIG, + ...customConfig + } + + try { + const client = new Client({ + node: config.url, + auth: + config.username && config.password + ? { username: config.username, password: config.password } + : undefined, + requestTimeout: finalConfig.requestTimeout, + pingTimeout: finalConfig.pingTimeout, + resurrectStrategy: finalConfig.resurrectStrategy, + maxRetries: finalConfig.maxRetries, + sniffOnStart: finalConfig.sniffOnStart, + sniffInterval: finalConfig.sniffInterval, + sniffOnConnectionFault: finalConfig.sniffOnConnectionFault + }) + + await client.ping() + + this.client = client + this.config = { ...config } + + DATABASE_LOGGER.logMessageWithEmoji( + `Elasticsearch connection established successfully to ${this.maskUrl( + config.url + )} (attempt ${this.connectionAttempts}/${ + finalConfig.maxRetries + }) last successful connection ${this.lastConnectionTime}`, + true, + GENERIC_EMOJIS.EMOJI_CHECK_MARK, + LOG_LEVELS_STR.LEVEL_INFO + ) + + return this.client + } catch (error) { + DATABASE_LOGGER.logMessageWithEmoji( + `Failed to connect to Elasticsearch at ${this.maskUrl(config.url)} (attempt ${ + this.connectionAttempts + }/${finalConfig.maxRetries}) last successful connection ${ + this.lastConnectionTime + }: ${error.message}`, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + throw error + } + } + + private maskUrl(url: string): string { + try { + const urlObj = new URL(url) + return `${urlObj.protocol}//${urlObj.hostname}:${ + urlObj.port || (urlObj.protocol === 'https:' ? '443' : '80') + }` + } catch (error) { + return url.replace(/\/\/[^@]+@/, '//***:***@') + } + } + + private closeConnectionSync(): void { + this.stopHealthMonitoring() + if (this.client) { + try { + this.client.close() + } catch (error) { + // silent close, no logging needed + } + this.client = null + this.config = null + } + } + + public getConnectionStats(): { + attempts: number + lastConnection: number + connected: boolean + isRetrying: boolean + isMonitoring: boolean + } { + return { + attempts: this.connectionAttempts, + lastConnection: this.lastConnectionTime, + connected: this.client !== null, + isRetrying: this.isRetrying, + isMonitoring: this.isMonitoring + } + } +} + +export async function createElasticsearchClientWithRetry( + config: OceanNodeDBConfig, + customConfig: Partial = {} +): Promise { + const singleton = ElasticsearchClientSingleton.getInstance() + return await singleton.getClient(config, customConfig) +} + +export function getElasticsearchConfig( + retryConfig: ElasticsearchRetryConfig = {} +): Required { + return { + ...DEFAULT_ELASTICSEARCH_CONFIG, + ...retryConfig + } +} + +export function getElasticsearchConnectionStats(): { + attempts: number + lastConnection: number + connected: boolean + isRetrying: boolean + isMonitoring: boolean +} { + const singleton = ElasticsearchClientSingleton.getInstance() + return singleton.getConnectionStats() } diff --git a/src/components/database/SQLLiteConfigDatabase.ts b/src/components/database/SQLLiteConfigDatabase.ts new file mode 100644 index 000000000..72f9f0942 --- /dev/null +++ b/src/components/database/SQLLiteConfigDatabase.ts @@ -0,0 +1,55 @@ +import fs from 'fs' +import path from 'path' +import { DATABASE_LOGGER } from '../../utils/logging/common.js' +import { GENERIC_EMOJIS, LOG_LEVELS_STR } from '../../utils/logging/Logger.js' +import { SQLiteProvider } from './sqlite.js' + +export class SQLLiteConfigDatabase { + private provider: SQLiteProvider + + constructor() { + return (async (): Promise => { + DATABASE_LOGGER.info('Config Database initiated with SQLite provider') + + // Ensure the directory exists before instantiating SQLiteProvider + const dbDir = path.dirname('databases/config.sqlite') + if (!fs.existsSync(dbDir)) { + fs.mkdirSync(dbDir, { recursive: true }) + } + this.provider = new SQLiteProvider('databases/config.sqlite') + await this.provider.createTableForConfig() + + return this + })() as unknown as SQLLiteConfigDatabase + } + + async createOrUpdateConfig(key: string = 'version', value: string) { + try { + return await this.provider.createOrUpdateConfig(key, value) + } catch (error) { + const errorMsg = `Error when creating new version entry ${value}: ` + error.message + DATABASE_LOGGER.logMessageWithEmoji( + errorMsg, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + return null + } + } + + async retrieveValue(key: string = 'version') { + try { + return await this.provider.retrieveValue(key) + } catch (error) { + const errorMsg = `Error when retrieving latest version entry: ` + error.message + DATABASE_LOGGER.logMessageWithEmoji( + errorMsg, + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + return null + } + } +} diff --git a/src/components/database/SQLLiteNonceDatabase.ts b/src/components/database/SQLLiteNonceDatabase.ts index 1eca067de..06334c6e7 100644 --- a/src/components/database/SQLLiteNonceDatabase.ts +++ b/src/components/database/SQLLiteNonceDatabase.ts @@ -21,7 +21,7 @@ export class SQLLiteNonceDatabase extends AbstractNonceDatabase { fs.mkdirSync(dbDir, { recursive: true }) } this.provider = new SQLiteProvider('databases/nonceDatabase.sqlite') - await this.provider.createTable() + await this.provider.createTableForNonce() return this })() as unknown as SQLLiteNonceDatabase @@ -29,7 +29,7 @@ export class SQLLiteNonceDatabase extends AbstractNonceDatabase { async create(address: string, nonce: number) { try { - return await this.provider.create(address, nonce) + return await this.provider.createNonce(address, nonce) } catch (error) { const errorMsg = `Error when creating new nonce entry ${nonce} for address ${address}: ` + @@ -46,7 +46,7 @@ export class SQLLiteNonceDatabase extends AbstractNonceDatabase { async retrieve(address: string) { try { - return await this.provider.retrieve(address) + return await this.provider.retrieveNonce(address) } catch (error) { const errorMsg = `Error when retrieving nonce entry for address ${address}: ` + error.message @@ -62,7 +62,7 @@ export class SQLLiteNonceDatabase extends AbstractNonceDatabase { async update(address: string, nonce: number) { try { - return await this.provider.update(address, nonce) + return await this.provider.updateNonce(address, nonce) } catch (error) { const errorMsg = `Error when updating nonce entry ${nonce} for address ${address}: ` + @@ -79,7 +79,7 @@ export class SQLLiteNonceDatabase extends AbstractNonceDatabase { async delete(address: string) { try { - return await this.provider.delete(address) + return await this.provider.deleteNonceEntry(address) } catch (error) { const errorMsg = `Error when deleting nonce entry for address ${address}: ` + error.message diff --git a/src/components/database/TypenseDatabase.ts b/src/components/database/TypenseDatabase.ts index 6a67fc281..f191f8749 100644 --- a/src/components/database/TypenseDatabase.ts +++ b/src/components/database/TypenseDatabase.ts @@ -5,7 +5,6 @@ import { TypesenseSearchParams } from '../../@types/index.js' import { LOG_LEVELS_STR, GENERIC_EMOJIS } from '../../utils/logging/Logger.js' import { DATABASE_LOGGER } from '../../utils/logging/common.js' -import { validateObject } from '../core/utils/validateDdoHandler.js' import { ENVIRONMENT_VARIABLES, TYPESENSE_HITS_CAP } from '../../utils/constants.js' import { AbstractDdoDatabase, @@ -14,6 +13,8 @@ import { AbstractLogDatabase, AbstractOrderDatabase } from './BaseDatabase.js' +import { DDOManager } from '@oceanprotocol/ddo-js' +import { validateDDO } from '../../utils/asset.js' export class TypesenseOrderDatabase extends AbstractOrderDatabase { private provider: Typesense @@ -371,7 +372,9 @@ export class TypesenseDdoDatabase extends AbstractDdoDatabase { getDDOSchema(ddo: Record): TypesenseSchema { // Find the schema based on the DDO version OR use the short DDO schema when state !== 0 let schemaName: string - if (ddo.nft?.state !== 0) { + const ddoInstance = DDOManager.getDDOClass(ddo) + const ddoData = ddoInstance.getDDOData() + if ('indexedMetadata' in ddoData && ddoData?.indexedMetadata?.nft.state !== 0) { schemaName = 'op_ddo_short' } else if (ddo.version) { schemaName = `op_ddo_v${ddo.version}` @@ -386,35 +389,6 @@ export class TypesenseDdoDatabase extends AbstractDdoDatabase { return schema } - async validateDDO(ddo: Record): Promise { - if (ddo.nft?.state !== 0) { - // Skipping validation for short DDOs as it currently doesn't work - // TODO: DDO validation needs to be updated to consider the fields required by the schema - // See github issue: https://github.com/oceanprotocol/ocean-node/issues/256 - return true - } else { - const validation = await validateObject(ddo, ddo.chainId, ddo.nftAddress) - if (validation[0] === true) { - DATABASE_LOGGER.logMessageWithEmoji( - `Validation of DDO with did: ${ddo.id} has passed`, - true, - GENERIC_EMOJIS.EMOJI_OCEAN_WAVE, - LOG_LEVELS_STR.LEVEL_INFO - ) - return true - } else { - DATABASE_LOGGER.logMessageWithEmoji( - `Validation of DDO with schema version ${ddo.version} failed with errors: ` + - JSON.stringify(validation[1]), - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - return false - } - } - } - async search( query: Record, maxResultsPerPage?: number, @@ -469,7 +443,10 @@ export class TypesenseDdoDatabase extends AbstractDdoDatabase { throw new Error(`Schema for version ${ddo.version} not found`) } try { - const validation = await this.validateDDO(ddo) + // avoid failure because of schema + if (ddo?.indexedMetadata?.nft) delete ddo.nft + + const validation = await validateDDO(ddo) if (validation === true) { return await this.provider .collections(schema.name) @@ -530,7 +507,9 @@ export class TypesenseDdoDatabase extends AbstractDdoDatabase { throw new Error(`Schema for version ${ddo.version} not found`) } try { - const validation = await this.validateDDO(ddo) + // avoid issue with nft fields, due to schema + if (ddo?.indexedMetadata?.nft) delete ddo.nft + const validation = await validateDDO(ddo) if (validation === true) { return await this.provider .collections(schema.name) @@ -632,6 +611,9 @@ export class TypesenseDdoDatabase extends AbstractDdoDatabase { export class TypesenseIndexerDatabase extends AbstractIndexerDatabase { private provider: Typesense + // constant for the node version document ID + private static readonly VERSION_DOC_ID = 'node_version' + constructor(config: OceanNodeDBConfig, schema: TypesenseSchema) { super(config, schema) return (async (): Promise => { @@ -805,7 +787,7 @@ export class TypesenseLogDatabase extends AbstractLogDatabase { moduleName?: string, level?: string, page?: number - ): Promise[] | null> { + ): Promise[]> { try { let filterConditions = `timestamp:>=${startTime.getTime()} && timestamp:<${endTime.getTime()}` if (moduleName) { @@ -851,7 +833,7 @@ export class TypesenseLogDatabase extends AbstractLogDatabase { GENERIC_EMOJIS.EMOJI_CROSS_MARK, LOG_LEVELS_STR.LEVEL_ERROR ) - return null + return [] } } @@ -902,7 +884,7 @@ export class TypesenseLogDatabase extends AbstractLogDatabase { } } } - return oldLogs ? oldLogs.length : 0 + return oldLogs.length } catch (error) { DATABASE_LOGGER.logMessageWithEmoji( `Error when deleting old log entries: ${error.message}`, diff --git a/src/components/database/TypesenseSchemas.ts b/src/components/database/TypesenseSchemas.ts index 9b17ffcf6..0cdf7ea5e 100644 --- a/src/components/database/TypesenseSchemas.ts +++ b/src/components/database/TypesenseSchemas.ts @@ -48,6 +48,7 @@ export type TypesenseSchema = TypesenseCollectionCreateSchema export type TypesenseSchemas = { ddoSchemas: TypesenseSchema[] nonceSchemas: TypesenseSchema + c2dSchemas: TypesenseSchema indexerSchemas: TypesenseSchema logSchemas: TypesenseSchema orderSchema: TypesenseSchema @@ -61,6 +62,24 @@ export const typesenseSchemas: TypesenseSchemas = { enable_nested_fields: true, fields: [{ name: 'nonce', type: 'int64' }] }, + c2dSchemas: { + name: 'c2djobs', + enable_nested_fields: true, + fields: [ + // not really needed because it will be SQL Lite + { name: 'clusterHash', type: 'string', optional: false }, + { name: 'configlogURL', type: 'string', optional: false }, + { name: 'publishlogURL', type: 'string', optional: false }, + { name: 'algologURL', type: 'string', optional: false }, + { name: 'outputsURL', type: 'auto', optional: false }, + { name: 'stopRequested', type: 'bool', optional: false }, + { name: 'algorithm', type: 'auto', optional: false }, + { name: 'assets', type: 'auto', optional: false }, + { name: 'isRunning', type: 'bool', optional: false }, + { name: 'isStarted', type: 'bool', optional: false }, + { name: 'containerImage', type: 'string', optional: false } + ] + }, indexerSchemas: { name: 'indexer', enable_nested_fields: true, diff --git a/src/components/database/index.ts b/src/components/database/index.ts index cd5e9e430..6b0da5250 100644 --- a/src/components/database/index.ts +++ b/src/components/database/index.ts @@ -10,54 +10,104 @@ import { AbstractDdoStateDatabase, AbstractIndexerDatabase, AbstractLogDatabase, - AbstractNonceDatabase, AbstractOrderDatabase } from './BaseDatabase.js' +import { C2DDatabase } from './C2DDatabase.js' import { DatabaseFactory } from './DatabaseFactory.js' import { ElasticsearchSchema } from './ElasticSchemas.js' +import { SQLLiteConfigDatabase } from './SQLLiteConfigDatabase.js' +import { SQLLiteNonceDatabase } from './SQLLiteNonceDatabase.js' import { TypesenseSchema } from './TypesenseSchemas.js' +import { AuthTokenDatabase } from './AuthTokenDatabase.js' export type Schema = ElasticsearchSchema | TypesenseSchema export class Database { ddo: AbstractDdoDatabase - nonce: AbstractNonceDatabase + nonce: SQLLiteNonceDatabase indexer: AbstractIndexerDatabase logs: AbstractLogDatabase order: AbstractOrderDatabase ddoState: AbstractDdoStateDatabase + sqliteConfig: SQLLiteConfigDatabase + c2d: C2DDatabase + authToken: AuthTokenDatabase + + constructor(private config: OceanNodeDBConfig) {} + + static async init(config: OceanNodeDBConfig): Promise { + const db = new Database(config) + try { + db.nonce = await DatabaseFactory.createNonceDatabase(config) + } catch (error) { + DATABASE_LOGGER.error(`Nonce database initialization failed: ${error}`) + return null + } + try { + db.sqliteConfig = await DatabaseFactory.createConfigDatabase() + } catch (error) { + DATABASE_LOGGER.error(`Config database initialization failed: ${error}`) + return null + } + try { + db.c2d = await DatabaseFactory.createC2DDatabase(config) + } catch (error) { + DATABASE_LOGGER.error(`C2D database initialization failed: ${error}`) + return null + } + try { + db.authToken = await DatabaseFactory.createAuthTokenDatabase(config) + } catch (error) { + DATABASE_LOGGER.error(`Auth database initialization failed: ${error}`) + return null + } + + if (hasValidDBConfiguration(config)) { + if (USE_DB_TRANSPORT()) { + configureCustomDBTransport(db, DATABASE_LOGGER) + } else { + DATABASE_LOGGER.warn('LOG_DB is false. Logs will NOT be saved to DB!') + } + try { + db.ddo = await DatabaseFactory.createDdoDatabase(config) + } catch (error) { + DATABASE_LOGGER.error(`DDO database initialization failed: ${error}`) + return null + } + try { + db.indexer = await DatabaseFactory.createIndexerDatabase(config) + } catch (error) { + DATABASE_LOGGER.error(`Indexer database initialization failed: ${error}`) + return null + } - constructor(private config: OceanNodeDBConfig) { - return (async (): Promise => { try { - this.nonce = await DatabaseFactory.createNonceDatabase(this.config) - if (hasValidDBConfiguration(this.config)) { - // add this DB transport too - // once we create a DB instance, the logger will be using this transport as well - // we cannot have this the other way around because of the dependencies cycle - if (USE_DB_TRANSPORT()) { - configureCustomDBTransport(this, DATABASE_LOGGER) - } else { - DATABASE_LOGGER.warn( - 'Property "LOG_DB" is set to "false". This means logs will NOT be saved to database!' - ) - } - this.ddo = await DatabaseFactory.createDdoDatabase(this.config) - this.indexer = await DatabaseFactory.createIndexerDatabase(this.config) - this.logs = await DatabaseFactory.createLogDatabase(this.config) - this.order = await DatabaseFactory.createOrderDatabase(this.config) - this.ddoState = await DatabaseFactory.createDdoStateDatabase(this.config) - } else { - DATABASE_LOGGER.info( - 'Invalid URL. Only Nonce Database is initialized. Other databases are not available.' - ) - } - return this + db.logs = await DatabaseFactory.createLogDatabase(config) } catch (error) { - DATABASE_LOGGER.error(`Database initialization failed: ${error}`) + DATABASE_LOGGER.error(`Logs database initialization failed: ${error}`) return null } - })() as unknown as Database + + try { + db.order = await DatabaseFactory.createOrderDatabase(config) + } catch (error) { + DATABASE_LOGGER.error(`Order database initialization failed: ${error}`) + return null + } + + try { + db.ddoState = await DatabaseFactory.createDdoStateDatabase(config) + } catch (error) { + DATABASE_LOGGER.error(`DDO State database initialization failed: ${error}`) + return null + } + } else { + DATABASE_LOGGER.info( + 'Invalid DB URL. Only Nonce, C2D, Auth Token and Config Databases are initialized.' + ) + } + + return db } // useful to know which configuration was passed to DB diff --git a/src/components/database/sqlite.ts b/src/components/database/sqlite.ts index e2f77de1a..61231688e 100644 --- a/src/components/database/sqlite.ts +++ b/src/components/database/sqlite.ts @@ -2,25 +2,27 @@ import { TypesenseSchema, typesenseSchemas } from './TypesenseSchemas.js' import sqlite3 from 'sqlite3' interface DatabaseProvider { - create(address: string, nonce: number): Promise<{ id: string; nonce: number }> - retrieve(address: string): Promise<{ id: string; nonce: number | null }> - update(address: string, nonce: number): Promise<{ id: string; nonce: number }> - delete(address: string): Promise<{ id: string; nonce: number | null }> + createNonce(address: string, nonce: number): Promise<{ id: string; nonce: number }> + retrieveNonce(address: string): Promise<{ id: string; nonce: number | null }> + updateNonce(address: string, nonce: number): Promise<{ id: string; nonce: number }> + deleteNonceEntry(address: string): Promise<{ id: string; nonce: number | null }> } export class SQLiteProvider implements DatabaseProvider { private db: sqlite3.Database - private schema: TypesenseSchema + private schemaNonce: TypesenseSchema + private configSchema: string - constructor(private dbFilePath: string) { + constructor(dbFilePath: string) { this.db = new sqlite3.Database(dbFilePath) - this.schema = typesenseSchemas.nonceSchemas + this.schemaNonce = typesenseSchemas.nonceSchemas + this.configSchema = 'config' } // eslint-disable-next-line require-await - async createTable() { + async createTableForNonce() { const createTableSQL = ` - CREATE TABLE IF NOT EXISTS ${this.schema.name} ( + CREATE TABLE IF NOT EXISTS ${this.schemaNonce.name} ( id TEXT PRIMARY KEY, nonce INTEGER ); @@ -34,9 +36,25 @@ export class SQLiteProvider implements DatabaseProvider { } // eslint-disable-next-line require-await - async create(address: string, nonce: number) { + async createTableForConfig() { + const createTableSQL = ` + CREATE TABLE IF NOT EXISTS ${this.configSchema} ( + key TEXT NOT NULL PRIMARY KEY, + value TEXT + ); + ` + return new Promise((resolve, reject) => { + this.db.run(createTableSQL, (err) => { + if (err) reject(err) + else resolve() + }) + }) + } + + // eslint-disable-next-line require-await + async createNonce(address: string, nonce: number) { const insertSQL = ` - INSERT INTO ${this.schema.name} (id, nonce) + INSERT INTO ${this.schemaNonce.name} (id, nonce) VALUES (?, ?) ON CONFLICT(id) DO UPDATE SET nonce=excluded.nonce; ` @@ -49,9 +67,24 @@ export class SQLiteProvider implements DatabaseProvider { } // eslint-disable-next-line require-await - async retrieve(address: string) { + async createOrUpdateConfig(key: string, value: string) { + const insertSQL = ` + INSERT INTO ${this.configSchema} (key, value) + VALUES (?, ?) + ON CONFLICT(key) DO UPDATE SET value = excluded.value; + ` + return new Promise<{ key: string; value: string }>((resolve, reject) => { + this.db.run(insertSQL, [key, value], (err) => { + if (err) reject(err) + else resolve({ key, value }) + }) + }) + } + + // eslint-disable-next-line require-await + async retrieveNonce(address: string) { const selectSQL = ` - SELECT * FROM ${this.schema.name} WHERE id = ? + SELECT * FROM ${this.schemaNonce.name} WHERE id = ? ` return new Promise<{ id: string; nonce: number | null }>((resolve, reject) => { this.db.get(selectSQL, [address], (err, row: { nonce: number } | undefined) => { @@ -63,18 +96,31 @@ export class SQLiteProvider implements DatabaseProvider { } // eslint-disable-next-line require-await - async update(address: string, nonce: number) { - return this.create(address, nonce) + async retrieveValue(key: string) { + const selectSQL = ` + SELECT value FROM ${this.configSchema} WHERE key = ?; + ` + return new Promise<{ value: string | null }>((resolve, reject) => { + this.db.get(selectSQL, [key], (err, row: { value: string } | undefined) => { + if (err) reject(err) + else resolve(row ? { value: row.value } : { value: null }) // Returns null if no version exists + }) + }) + } + + // eslint-disable-next-line require-await + async updateNonce(address: string, nonce: number) { + return this.createNonce(address, nonce) } // eslint-disable-next-line require-await - async delete(address: string) { + async deleteNonceEntry(address: string) { const selectSQL = ` - SELECT nonce FROM ${this.schema.name} WHERE id = ? + SELECT nonce FROM ${this.schemaNonce.name} WHERE id = ? ` const deleteSQL = ` - DELETE FROM ${this.schema.name} WHERE id = ? + DELETE FROM ${this.schemaNonce.name} WHERE id = ? ` return new Promise<{ id: string; nonce: number | null }>((resolve, reject) => { diff --git a/src/components/database/sqliteAuthToken.ts b/src/components/database/sqliteAuthToken.ts new file mode 100644 index 000000000..5f607dafd --- /dev/null +++ b/src/components/database/sqliteAuthToken.ts @@ -0,0 +1,124 @@ +import { AuthToken } from './AuthTokenDatabase.js' +import sqlite3 from 'sqlite3' +import { DATABASE_LOGGER } from '../../utils/logging/common.js' + +interface AuthTokenDatabaseProvider { + createToken( + token: string, + address: string, + createdAt: number, + validUntil: number | null, + chainId?: string | null + ): Promise + validateTokenEntry(token: string): Promise + invalidateTokenEntry(token: string): Promise +} + +export class SQLiteAuthToken implements AuthTokenDatabaseProvider { + private db: sqlite3.Database + + constructor(dbFilePath: string) { + this.db = new sqlite3.Database(dbFilePath) + } + + async createTable(): Promise { + await this.db.exec(` + CREATE TABLE IF NOT EXISTS authTokens ( + token TEXT PRIMARY KEY, + address TEXT NOT NULL, + createdAt DATETIME DEFAULT CURRENT_TIMESTAMP, + validUntil DATETIME, + isValid BOOLEAN DEFAULT TRUE, + chainId TEXT + ) + `) + + // Migration: Add chainId column if it doesn't exist + return new Promise((resolve) => { + this.db.run(`ALTER TABLE authTokens ADD COLUMN chainId TEXT`, (_err) => { + // Ignore error if column already exists + resolve() + }) + }) + } + + createToken( + token: string, + address: string, + createdAt: number, + validUntil: number | null = null, + chainId?: string | null + ): Promise { + const insertSQL = ` + INSERT INTO authTokens (token, address, createdAt, validUntil, chainId) VALUES (?, ?, ?, ?, ?) + ` + return new Promise((resolve, reject) => { + this.db.run(insertSQL, [token, address, createdAt, validUntil, chainId], (err) => { + if (err) { + DATABASE_LOGGER.error(`Error creating auth token: ${err}`) + reject(err) + } else { + resolve() + } + }) + }) + } + + validateTokenEntry(token: string): Promise { + const selectSQL = ` + SELECT * FROM authTokens WHERE token = ? + ` + return new Promise((resolve, reject) => { + this.db.get(selectSQL, [token], async (err, row: AuthToken) => { + if (err) { + DATABASE_LOGGER.error(`Error validating auth token: ${err}`) + reject(err) + return + } + + if (!row) { + resolve(null) + return + } + + if (!row.isValid) { + resolve(null) + return + } + + if (row.validUntil === null) { + resolve(row) + return + } + + const validUntilDate = new Date(row.validUntil).getTime() + const now = Date.now() + + if (validUntilDate < now) { + resolve(null) + DATABASE_LOGGER.info(`Auth token ${token} is invalid`) + await this.invalidateTokenEntry(token) + return + } + + resolve(row) + }) + }) + } + + invalidateTokenEntry(token: string): Promise { + const deleteSQL = ` + UPDATE authTokens SET isValid = FALSE WHERE token = ? + ` + return new Promise((resolve, reject) => { + this.db.run(deleteSQL, [token], (err) => { + if (err) { + DATABASE_LOGGER.error(`Error invalidating auth token: ${err}`) + reject(err) + } else { + resolve() + } + }) + }) + } +} diff --git a/src/components/database/sqliteCompute.ts b/src/components/database/sqliteCompute.ts new file mode 100644 index 000000000..0ae9823dc --- /dev/null +++ b/src/components/database/sqliteCompute.ts @@ -0,0 +1,486 @@ +import { typesenseSchemas, TypesenseSchema } from './TypesenseSchemas.js' +import { + C2DStatusNumber, + C2DStatusText, + type DBComputeJob +} from '../../@types/C2D/C2D.js' +import sqlite3, { RunResult } from 'sqlite3' +import { DATABASE_LOGGER } from '../../utils/logging/common.js' + +interface ComputeDatabaseProvider { + newJob(job: DBComputeJob): Promise + getJob(jobId?: string, agreementId?: string, owner?: string): Promise + updateJob(job: DBComputeJob): Promise + getRunningJobs(engine?: string, environment?: string): Promise + deleteJob(jobId: string): Promise + getFinishedJobs(environments?: string[]): Promise + getJobs( + environments?: string[], + fromTimestamp?: string, + consumerAddrs?: string[] + ): Promise + updateImage(image: string): Promise + getOldImages(retentionDays: number): Promise +} + +function getInternalStructure(job: DBComputeJob): any { + const internalBlob = { + clusterHash: job.clusterHash, + configlogURL: job.configlogURL, + publishlogURL: job.publishlogURL, + algologURL: job.algologURL, + outputsURL: job.outputsURL, + stopRequested: job.stopRequested, + algorithm: job.algorithm, + assets: job.assets, + isRunning: job.isRunning, + isStarted: job.isStarted, + containerImage: job.containerImage, + resources: job.resources, + isFree: job.isFree, + algoStartTimestamp: job.algoStartTimestamp, + algoStopTimestamp: job.algoStopTimestamp, + metadata: job.metadata, + additionalViewers: job.additionalViewers, + terminationDetails: job.terminationDetails, + payment: job.payment, + algoDuration: job.algoDuration, + queueMaxWaitTime: job.queueMaxWaitTime + } + return internalBlob +} +export function generateBlobFromJSON(job: DBComputeJob): Buffer { + return Buffer.from(JSON.stringify(getInternalStructure(job))) +} + +export function generateJSONFromBlob(blob: any): Promise { + return JSON.parse(blob.toString()) +} + +// we cannot store array of strings, so we use string separators instead +export const STRING_SEPARATOR = '__,__' + +export function convertArrayToString(array: string[]) { + let str: string = '' + for (let i = 0; i < array.length; i++) { + str = str + array[i] + // Do not append comma at the end of last element + if (i < array.length - 1) { + str = str + STRING_SEPARATOR + } + } + return str +} +export function convertStringToArray(str: string) { + const arr: string[] = str.split(STRING_SEPARATOR) + return arr +} + +export class SQLiteCompute implements ComputeDatabaseProvider { + private db: sqlite3.Database + private schema: TypesenseSchema + + constructor(dbFilePath: string) { + this.db = new sqlite3.Database(dbFilePath) + this.schema = typesenseSchemas.c2dSchemas + } + + deleteJob(jobId: string): Promise { + const deleteSQL = ` + DELETE FROM ${this.schema.name} WHERE jobId = ? + ` + return new Promise((resolve, reject) => { + this.db.run(deleteSQL, [jobId], function (this: RunResult, err) { + if (err) reject(err) + else resolve(this.changes === 1) + }) + }) + } + + createTable() { + /* although we have field called expiteTimestamp, we are actually storing maxJobDuration in it */ + const createTableSQL = ` + CREATE TABLE IF NOT EXISTS ${this.schema.name} ( + owner TEXT, + did TEXT DEFAULT NULL, + jobId TEXT PRIMARY KEY, + dateCreated TEXT, + dateFinished TEXT DEFAULT NULL, + status INTEGER, + statusText TEXT, + results BLOB, + inputDID TEXT DEFAULT NULL, + algoDID TEXT DEFAULT NULL, + agreementId TEXT DEFAULT NULL, + expireTimestamp INTEGER, + environment TEXT DEFAULT NULL, + body BLOB + ); + ` + return new Promise((resolve, reject) => { + this.db.run(createTableSQL, (err) => { + if (err) reject(err) + else resolve() + }) + }) + } + + createImageTable(): Promise { + const createTableSQL = ` + CREATE TABLE IF NOT EXISTS docker_images ( + image TEXT PRIMARY KEY, + lastUsedTimestamp INTEGER NOT NULL + ); + ` + return new Promise((resolve, reject) => { + this.db.run(createTableSQL, (err) => { + if (err) { + DATABASE_LOGGER.error('Could not create docker_images table: ' + err.message) + reject(err) + } else { + resolve() + } + }) + }) + } + + updateImage(image: string): Promise { + const timestamp = Math.floor(Date.now() / 1000) // Unix timestamp in seconds + const insertSQL = ` + INSERT OR REPLACE INTO docker_images (image, lastUsedTimestamp) + VALUES (?, ?); + ` + return new Promise((resolve, reject) => { + this.db.run(insertSQL, [image, timestamp], (err) => { + if (err) { + DATABASE_LOGGER.error( + `Could not update image usage for ${image}: ${err.message}` + ) + reject(err) + } else { + DATABASE_LOGGER.debug(`Updated image usage timestamp for ${image}`) + resolve() + } + }) + }) + } + + getOldImages(retentionDays: number = 7): Promise { + const cutoffTimestamp = Math.floor(Date.now() / 1000) - retentionDays * 24 * 60 * 60 + const selectSQL = ` + SELECT image FROM docker_images + WHERE lastUsedTimestamp < ? + ORDER BY lastUsedTimestamp ASC; + ` + return new Promise((resolve, reject) => { + this.db.all(selectSQL, [cutoffTimestamp], (err, rows: any[] | undefined) => { + if (err) { + DATABASE_LOGGER.error(`Could not get old images: ${err.message}`) + reject(err) + } else { + const images = rows ? rows.map((row) => row.image) : [] + resolve(images) + } + }) + }) + } + + newJob(job: DBComputeJob): Promise { + // TO DO C2D + const insertSQL = ` + INSERT INTO ${this.schema.name} + ( + owner, + did, + jobId, + dateCreated, + status, + statusText, + inputDID, + algoDID, + agreementId, + expireTimestamp, + environment, + body + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); + ` + + return new Promise((resolve, reject) => { + this.db.run( + insertSQL, + [ + job.owner, + job.did, + job.jobId, + job.dateCreated || String(Date.now() / 1000), // seconds from epoch, + job.status || C2DStatusNumber.JobStarted, + job.statusText || C2DStatusText.JobStarted, + job.inputDID ? convertArrayToString(job.inputDID) : job.inputDID, + job.algoDID, + job.agreementId, + job.maxJobDuration, + job.environment, + generateBlobFromJSON(job) + ], + (err) => { + if (err) { + DATABASE_LOGGER.error('Could not insert C2D job on DB: ' + err.message) + reject(err) + } else { + DATABASE_LOGGER.info('Successfully inserted job with id:' + job.jobId) + resolve(job.jobId) + } + } + ) + }) + } + + /** + * on a get status for instance, all params are optional + * but at least one is required... In case we don't have a jobId, + * we have multiple results (by owner for instance) + * So, it refines the query or we can have more than 1 result (same as current implementation) + * @param jobId the job identifier + * @param agreementId the agreement identifier (did ?) + * @param owner the consumer address / job owner + * @returns job(s) + */ + getJob(jobId?: string, agreementId?: string, owner?: string): Promise { + const params: any = [] + let selectSQL = `SELECT * FROM ${this.schema.name} WHERE 1=1` + if (jobId) { + selectSQL += ` AND jobId = ?` + params.push(jobId) + } + if (agreementId) { + if (!agreementId.startsWith('0x')) { + agreementId = '0x' + agreementId + } + selectSQL += ` AND agreementId = ?` + params.push(agreementId) + } + if (owner) { + selectSQL += ` AND owner = ?` + params.push(owner) + } + + return new Promise((resolve, reject) => { + this.db.all(selectSQL, params, (err, rows: any[] | undefined) => { + if (err) { + DATABASE_LOGGER.error(err.message) + reject(err) + } else { + // also decode the internal data into job data + if (rows && rows.length > 0) { + const all: DBComputeJob[] = rows.map((row) => { + const body = generateJSONFromBlob(row.body) + delete row.body + const maxJobDuration = row.expireTimestamp + delete row.expireTimestamp + const job: DBComputeJob = { ...row, ...body, maxJobDuration } + return job + }) + resolve(all) + } else { + DATABASE_LOGGER.error( + `Could not find any job with jobId: ${jobId}, agreementId: ${agreementId}, or owner: ${owner} in database!` + ) + resolve([]) + } + } + }) + }) + } + + updateJob(job: DBComputeJob): Promise { + // if (job.dateFinished && job.isRunning) { + // job.isRunning = false + // } + // TO DO C2D + const data: any[] = [ + job.owner, + job.status, + job.statusText, + job.maxJobDuration, + generateBlobFromJSON(job), + job.dateFinished, + job.jobId + ] + const updateSQL = ` + UPDATE ${this.schema.name} + SET + owner = ?, + status = ?, + statusText = ?, + expireTimestamp = ?, + body = ?, + dateFinished = ? + WHERE jobId = ?; + ` + + return new Promise((resolve, reject) => { + this.db.run(updateSQL, data, function (this: RunResult, err: Error | null) { + if (err) { + DATABASE_LOGGER.error(`Error while updating job: ${err.message}`) + reject(err) + } else { + // number of rows updated successfully + resolve(this.changes) + } + }) + }) + } + + getRunningJobs(engine?: string, environment?: string): Promise { + const selectSQL = ` + SELECT * FROM ${this.schema.name} WHERE dateFinished IS NULL ORDER by dateCreated + ` + return new Promise((resolve, reject) => { + this.db.all(selectSQL, (err, rows: any[] | undefined) => { + if (err) { + DATABASE_LOGGER.error(err.message) + reject(err) + } else { + // also decode the internal data into job data + // get them all running + if (rows && rows.length > 0) { + const all: DBComputeJob[] = rows.map((row) => { + const body = generateJSONFromBlob(row.body) + delete row.body + const maxJobDuration = row.expireTimestamp + delete row.expireTimestamp + const job: DBComputeJob = { ...row, ...body, maxJobDuration } + return job + }) + // filter them out + const filtered = all.filter((job) => { + let include = true + if (engine && engine !== job.clusterHash) { + include = false + } + if (environment && environment !== job.environment) { + include = false + } + if (job.dateFinished) { + include = false + } + return include + }) + resolve(filtered) + } else { + // DATABASE_LOGGER.info('Could not find any running C2D jobs!') + resolve([]) + } + } + }) + }) + } + + getFinishedJobs(environments?: string[]): Promise { + let selectSQL = ` + SELECT * FROM ${this.schema.name} WHERE (dateFinished IS NOT NULL OR results IS NOT NULL) + ` + const params: string[] = [] + if (environments && environments.length > 0) { + const placeholders = environments.map(() => '?').join(',') + selectSQL += ` AND environment IN (${placeholders})` + params.push(...environments) + } + + selectSQL += ` ORDER BY dateFinished DESC` + + return new Promise((resolve, reject) => { + this.db.all(selectSQL, params, (err, rows: any[] | undefined) => { + if (err) { + DATABASE_LOGGER.error(err.message) + reject(err) + } else { + // also decode the internal data into job data + // get them all running + if (rows && rows.length > 0) { + const all: DBComputeJob[] = rows.map((row) => { + const body = generateJSONFromBlob(row.body) + delete row.body + const maxJobDuration = row.expireTimestamp + delete row.expireTimestamp + const job: DBComputeJob = { ...row, ...body, maxJobDuration } + return job + }) + resolve(all) + } else { + environments + ? DATABASE_LOGGER.info( + 'No jobs found for the specified enviroments: ' + environments.join(',') + ) + : DATABASE_LOGGER.info('No jobs found') + resolve([]) + } + } + }) + }) + } + + getJobs( + environments?: string[], + fromTimestamp?: string, + consumerAddrs?: string[] + ): Promise { + let selectSQL = `SELECT * FROM ${this.schema.name}` + + const params: string[] = [] + const conditions: string[] = [] + + if (environments && environments.length > 0) { + const placeholders = environments.map(() => '?').join(',') + conditions.push(`environment IN (${placeholders})`) + params.push(...environments) + } + + if (fromTimestamp) { + conditions.push(`dateFinished >= ?`) + params.push(fromTimestamp) + } + + if (consumerAddrs && consumerAddrs.length > 0) { + const placeholders = consumerAddrs.map(() => '?').join(',') + conditions.push(`owner NOT IN (${placeholders})`) + params.push(...consumerAddrs) + } + + if (conditions.length > 0) { + selectSQL += ` WHERE ${conditions.join(' AND ')}` + } + selectSQL += ` ORDER BY dateCreated DESC` + + return new Promise((resolve, reject) => { + this.db.all(selectSQL, params, (err, rows: any[] | undefined) => { + if (err) { + DATABASE_LOGGER.error(err.message) + reject(err) + } else { + // also decode the internal data into job data + // get them all running + if (rows && rows.length > 0) { + const all: DBComputeJob[] = rows.map((row) => { + const body = generateJSONFromBlob(row.body) + delete row.body + const maxJobDuration = row.expireTimestamp + delete row.expireTimestamp + const job: DBComputeJob = { ...row, ...body, maxJobDuration } + return job + }) + resolve(all) + } else { + environments + ? DATABASE_LOGGER.info( + 'No jobs found for the specified enviroments: ' + environments.join(',') + ) + : DATABASE_LOGGER.info('No jobs found') + resolve([]) + } + } + }) + }) + } +} diff --git a/src/components/httpRoutes/adminConfig.ts b/src/components/httpRoutes/adminConfig.ts new file mode 100644 index 000000000..4a3c0d071 --- /dev/null +++ b/src/components/httpRoutes/adminConfig.ts @@ -0,0 +1,60 @@ +import express from 'express' +import { HTTP_LOGGER } from '../../utils/logging/common.js' +import { FetchConfigHandler } from '../core/admin/fetchConfigHandler.js' +import { PushConfigHandler } from '../core/admin/pushConfigHandler.js' +import { PROTOCOL_COMMANDS } from '../../utils/constants.js' +import { Readable } from 'stream' +import { streamToObject } from '../../utils/util.js' + +export const adminConfigRoutes = express.Router() + +adminConfigRoutes.get('/api/admin/config', express.json(), async (req, res) => { + try { + const { expiryTimestamp, signature, address } = req.body + + const response = await new FetchConfigHandler(req.oceanNode).handle({ + command: PROTOCOL_COMMANDS.FETCH_CONFIG, + expiryTimestamp, + signature, + address, + caller: req.caller + }) + + if (response.status.httpStatus === 200) { + const result = await streamToObject(response.stream as Readable) + res.status(200).json(result) + } else { + HTTP_LOGGER.log('LEVEL_ERROR', `Error fetching config: ${response.status.error}`) + res.status(response.status.httpStatus).json({ error: response.status.error }) + } + } catch (error) { + HTTP_LOGGER.error(`Error fetching config: ${error.message}`) + res.status(500).send(`Internal Server Error: ${error.message}`) + } +}) + +adminConfigRoutes.post('/api/admin/config/update', express.json(), async (req, res) => { + try { + const { expiryTimestamp, signature, config, address } = req.body + + const response = await new PushConfigHandler(req.oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp, + signature, + config, + address, + caller: req.caller + }) + + if (response.status.httpStatus === 200) { + const result = await streamToObject(response.stream as Readable) + res.status(200).json(result) + } else { + HTTP_LOGGER.log('LEVEL_ERROR', `Error pushing config: ${response.status.error}`) + res.status(response.status.httpStatus).json({ error: response.status.error }) + } + } catch (error) { + HTTP_LOGGER.error(`Error pushing config: ${error.message}`) + res.status(500).send(`Internal Server Error: ${error.message}`) + } +}) diff --git a/src/components/httpRoutes/aquarius.ts b/src/components/httpRoutes/aquarius.ts index 102c2521e..24a2817aa 100644 --- a/src/components/httpRoutes/aquarius.ts +++ b/src/components/httpRoutes/aquarius.ts @@ -6,7 +6,6 @@ import { LOG_LEVELS_STR } from '../../utils/logging/Logger.js' import { FindDdoHandler, ValidateDDOHandler } from '../core/handler/ddoHandler.js' import { QueryDdoStateHandler, QueryHandler } from '../core/handler/queryHandler.js' import { HTTP_LOGGER } from '../../utils/logging/common.js' -import { DDO } from '../../@types/DDO/DDO.js' import { QueryCommand } from '../../@types/commands.js' import { DatabaseFactory } from '../database/DatabaseFactory.js' import { SearchQuery } from '../../@types/DDO/SearchQuery.js' @@ -21,7 +20,7 @@ aquariusRoutes.get( async (req, res) => { try { const { did, force } = req.params - if (!did || !did.startsWith('did:op')) { + if (!did || !/^did:ope?/.test(did)) { res.status(400).send('Missing or invalid required parameter: "did"') return } @@ -44,7 +43,7 @@ aquariusRoutes.get( async (req, res) => { try { const { did, force } = req.params - if (!did || !did.startsWith('did:op')) { + if (!did || !/^did:ope?/.test(did)) { res.status(400).send('Missing or invalid required parameter: "did"') return } @@ -78,7 +77,8 @@ aquariusRoutes.post( const result = await new QueryHandler(req.oceanNode).handle({ query: transformedQuery, - command: PROTOCOL_COMMANDS.QUERY + command: PROTOCOL_COMMANDS.QUERY, + caller: req.caller }) if (result.stream) { const queryResult = JSON.parse(await streamToString(result.stream as Readable)) @@ -97,13 +97,15 @@ aquariusRoutes.get(`${AQUARIUS_API_BASE_PATH}/state/ddo`, async (req, res) => { try { const config = await getConfiguration() const queryStrategy = await DatabaseFactory.createDdoStateQuery(config.dbConfig) + + const did = req.query.did ? String(req.query.did) : undefined + const nft = req.query.nft ? String(req.query.nft) : undefined + const txId = req.query.txId ? String(req.query.txId) : undefined + const queryDdoState: QueryCommand = { - query: queryStrategy.buildQuery( - String(req.query.did), - String(req.query.nft), - String(req.query.txId) - ), - command: PROTOCOL_COMMANDS.QUERY + query: queryStrategy.buildQuery(did, nft, txId), + command: PROTOCOL_COMMANDS.QUERY, + caller: req.caller } if (!Object.keys(queryDdoState.query).length) { @@ -119,9 +121,28 @@ aquariusRoutes.get(`${AQUARIUS_API_BASE_PATH}/state/ddo`, async (req, res) => { if (result.stream) { const queryResult = JSON.parse(await streamToString(result.stream as Readable)) - if (queryResult[0].found) { - res.json(queryResult[0].hits[0]) + + if ( + queryResult && + typeof queryResult === 'object' && + queryResult.found !== undefined + ) { + if (queryResult.found > 0 && queryResult.hits && queryResult.hits.length > 0) { + res.json(queryResult.hits[0].document || queryResult.hits[0]) + } else { + res.status(404).send('Not found') + } + } else if (Array.isArray(queryResult)) { + if (queryResult.length > 0) { + res.json(queryResult[0]) + } else { + res.status(404).send('Not found') + } } else { + HTTP_LOGGER.log( + LOG_LEVELS_STR.LEVEL_DEBUG, + `Query result structure (not found): ${JSON.stringify(queryResult)}` + ) res.status(404).send('Not found') } } else { @@ -134,23 +155,36 @@ aquariusRoutes.get(`${AQUARIUS_API_BASE_PATH}/state/ddo`, async (req, res) => { }) aquariusRoutes.post(`${AQUARIUS_API_BASE_PATH}/assets/ddo/validate`, async (req, res) => { + const node = req.oceanNode try { - if (!req.body || req.body === undefined) { + if (!req.body) { res.status(400).send('Missing DDO object') return } - const ddo = JSON.parse(req.body) as DDO + + const requestBody = JSON.parse(req.body) + const authorization = req.headers?.authorization + const { publisherAddress, nonce, signature } = requestBody + + // This is for backward compatibility with the old way of sending the DDO + const ddo = requestBody.ddo || JSON.parse(req.body) if (!ddo.version) { res.status(400).send('Missing DDO version') return } - const node = req.oceanNode const result = await new ValidateDDOHandler(node).handle({ ddo, - command: PROTOCOL_COMMANDS.VALIDATE_DDO + publisherAddress, + authorization, + nonce, + signature, + message: ddo.id + nonce, + command: PROTOCOL_COMMANDS.VALIDATE_DDO, + caller: req.caller }) + if (result.stream) { const validationResult = JSON.parse(await streamToString(result.stream as Readable)) res.json(validationResult) diff --git a/src/components/httpRoutes/auth.ts b/src/components/httpRoutes/auth.ts new file mode 100644 index 000000000..389954b4a --- /dev/null +++ b/src/components/httpRoutes/auth.ts @@ -0,0 +1,83 @@ +import express from 'express' +import { SERVICES_API_BASE_PATH, PROTOCOL_COMMANDS } from '../../utils/constants.js' +import { HTTP_LOGGER } from '../../utils/logging/common.js' +import { + CreateAuthTokenHandler, + InvalidateAuthTokenHandler +} from '../core/handler/authHandler.js' +import { streamToString } from '../../utils/util.js' +import { Readable } from 'stream' + +export const authRoutes = express.Router() + +authRoutes.post( + `${SERVICES_API_BASE_PATH}/auth/token`, + express.json(), + async (req, res) => { + try { + const { signature, address, nonce, validUntil, chainId } = req.body + + if (!signature || !address) { + return res.status(400).json({ error: 'Missing required parameters' }) + } + + const response = await new CreateAuthTokenHandler(req.oceanNode).handle({ + command: PROTOCOL_COMMANDS.CREATE_AUTH_TOKEN, + signature, + address, + nonce, + validUntil, + chainId, + caller: req.caller + }) + + if (response.status.error) { + return res + .status(response.status.httpStatus) + .json({ error: response.status.error }) + } + + const result = JSON.parse(await streamToString(response.stream as Readable)) + res.json(result) + } catch (error) { + HTTP_LOGGER.error(`Error creating auth token: ${error}`) + res.status(500).json({ error: 'Internal server error' }) + } + } +) + +authRoutes.post( + `${SERVICES_API_BASE_PATH}/auth/token/invalidate`, + express.json(), + async (req, res) => { + try { + const { signature, address, nonce, token, chainId } = req.body + + if (!signature || !address || !token) { + return res.status(400).json({ error: 'Missing required parameters' }) + } + + const response = await new InvalidateAuthTokenHandler(req.oceanNode).handle({ + command: PROTOCOL_COMMANDS.INVALIDATE_AUTH_TOKEN, + signature, + address, + nonce, + token, + chainId, + caller: req.caller + }) + + if (response.status.error) { + return res + .status(response.status.httpStatus) + .json({ error: response.status.error }) + } + + const result = JSON.parse(await streamToString(response.stream as Readable)) + res.json(result) + } catch (error) { + HTTP_LOGGER.error(`Error invalidating auth token: ${error}`) + res.status(500).json({ error: 'Internal server error' }) + } + } +) diff --git a/src/components/httpRoutes/commands.ts b/src/components/httpRoutes/commands.ts index 5c26389fd..746d4caf7 100644 --- a/src/components/httpRoutes/commands.ts +++ b/src/components/httpRoutes/commands.ts @@ -1,17 +1,64 @@ /* eslint-disable no-unreachable */ import express, { Request, Response } from 'express' -import { P2PCommandResponse } from '../../@types' import { toString as uint8ArrayToString } from 'uint8arrays/to-string' import { HTTP_LOGGER } from '../../utils/logging/common.js' import { hasP2PInterface } from '../../utils/config.js' import { validateCommandParameters } from './validateCommands.js' +import { Readable } from 'stream' + +function mapChunkToBuffer(chunk: any): Buffer | Uint8Array { + if (typeof chunk === 'string') { + return Buffer.from(chunk) + } + + if (Buffer.isBuffer(chunk)) { + return chunk + } + + if (typeof chunk === 'object' && 'subarray' in chunk) { + return chunk.subarray() + } + + return Buffer.from(JSON.stringify(chunk)) +} + +async function streamToResponse( + res: Response, + stream: any, + isBinaryContent: boolean +): Promise { + if (!stream) { + HTTP_LOGGER.error('streamToResponse called with null/undefined stream') + throw new Error('Stream is null or undefined') + } + + try { + for await (const chunk of stream) { + if (!chunk) { + continue + } + + const data = mapChunkToBuffer(chunk) + if (isBinaryContent) { + res.write(data) + } else { + res.write(uint8ArrayToString(data)) + } + } + } catch (err) { + HTTP_LOGGER.error(`Stream error: ${err.message}`) + throw err + } +} export const directCommandRoute = express.Router() directCommandRoute.post( '/directCommand', express.json(), async (req: Request, res: Response): Promise => { + let closedResponse = false + try { const validate = validateCommandParameters(req.body, []) if (!validate.valid) { @@ -19,110 +66,76 @@ directCommandRoute.post( return } - let closedResponse = false - - // detect connection closed res.on('close', () => { if (!closedResponse) { HTTP_LOGGER.error('TCP connection was closed before we could send a response!') } closedResponse = true }) - let isBinaryContent = false - const sink = async function (source: any) { - let first = true - for await (const chunk of source) { - if (first) { - first = false - try { - const str = uint8ArrayToString(chunk.subarray()) // Obs: we need to specify the length of the subarrays - const decoded = JSON.parse(str) - - res.status(decoded.httpStatus) - if ('headers' in decoded) { - res.header(decoded.headers) - // when streaming binary data we cannot convert to plain string, specially if encrypted data - if (str?.toLowerCase().includes('application/octet-stream')) { - isBinaryContent = true - } - } - } catch (e) { - res.status(500) - res.write(uint8ArrayToString(chunk.subarray())) - closedResponse = true - res.end() - HTTP_LOGGER.error(e.message) - } - } else { - try { - if (isBinaryContent) { - // Binary content, could be encrypted - res.write(chunk.subarray()) - } else { - const str = uint8ArrayToString(chunk.subarray()) - res.write(str) - } - } catch (e) { - HTTP_LOGGER.error(e.message) - } - } - } - closedResponse = true - res.end() - } HTTP_LOGGER.logMessage('Sending command : ' + JSON.stringify(req.body), true) - // TODO NOTES: We are sending all "/directCommand" requests to the P2P component as "req.oceanNode.getP2PNode()" - // even if we do not need any P2P functionality at all (as all our handlers are "inside" P2P) - // All ends up here => "handleProtocolCommands()" or here => "handleDirectProtocolCommands()", where we do not have - // any access to main OceanNode, neither Provider or Indexer components - // probably the handlers should be on the OceanNode level, and if they need P2P connectivity we pass them the getP2PNode() - // (we kinda do it already on most handlers anyway) - - let response: P2PCommandResponse = null - // send to this peer (we might not need P2P connectivity) - if ( + const isLocalCommand = !hasP2PInterface || !req.body.node || - req.oceanNode.getP2PNode().isTargetPeerSelf(req.body.node) - ) { - // send to this node - response = await req.oceanNode.handleDirectProtocolCommand( - JSON.stringify(req.body), - sink + req.oceanNode.getP2PNode()?.isTargetPeerSelf(req.body.node) + + if (isLocalCommand) { + // Local command - call handler directly + const response = await req.oceanNode.handleDirectProtocolCommand( + JSON.stringify(req.body) ) - // UPDATED: we can just call the handler directly here, once we have them - // moving some of the logic from "handleProtocolCommands()" and "handleDirectProtocolCommands()" to the OceanNode - // These actions do not need P2P connections directly + + res.status(response.status.httpStatus) + if (response.status.headers) { + res.header(response.status.headers) + } + + const isBinaryContent = + response.status.headers?.['content-type'] + ?.toLowerCase() + .includes('application/octet-stream') || false + + if (response.stream) { + await streamToResponse(res, response.stream as Readable, isBinaryContent) + } else if (response.status.error) { + res.write(response.status.error) + } + + closedResponse = true + res.end() } else if (hasP2PInterface) { - // send to another peer (Only here we need P2P networking) - response = await req.oceanNode + // Remote command - use P2P sendTo + const response = await req.oceanNode .getP2PNode() - .sendTo(req.body.node as string, JSON.stringify(req.body), sink) - } else { - response = { - stream: null, - status: { - httpStatus: 400, - error: 'Invalid or Non Existing P2P configuration' - } + .sendTo(req.body.node as string, JSON.stringify(req.body), req.body.multiAddrs) + + res.status(response.status.httpStatus) + if (response.status.headers) { + res.header(response.status.headers) } - } - // only if response was not already sent - if (response.stream == null && !closedResponse) { - try { - res.statusMessage = response.status.error - res.status(response.status.httpStatus).send(response.status.error) - closedResponse = true - res.end() - } catch (e) { - HTTP_LOGGER.error(e.message) + const isBinaryContent = + response.status.headers?.['content-type'] + ?.toLowerCase() + .includes('application/octet-stream') || false + + if (response.stream) { + await streamToResponse(res, response.stream as Readable, isBinaryContent) + } else if (response.status.error) { + res.write(response.status.error) } + + closedResponse = true + res.end() + } else { + res.status(400).send('Invalid or Non Existing P2P configuration') + closedResponse = true + res.end() } } catch (err) { HTTP_LOGGER.error(err.message) + res.status(500).send(err.message) } } ) diff --git a/src/components/httpRoutes/compute.ts b/src/components/httpRoutes/compute.ts index c127981d7..c7137b89a 100644 --- a/src/components/httpRoutes/compute.ts +++ b/src/components/httpRoutes/compute.ts @@ -1,18 +1,28 @@ import express from 'express' import { ComputeGetEnvironmentsHandler, - ComputeStartHandler, + PaidComputeStartHandler, + FreeComputeStartHandler, ComputeStopHandler, ComputeGetStatusHandler, ComputeGetResultHandler, - ComputeInitializeHandler + ComputeInitializeHandler, + ComputeGetStreamableLogsHandler } from '../core/compute/index.js' -import type { ComputeAlgorithm, ComputeAsset, ComputeOutput } from '../../@types/C2D.js' import type { - ComputeStartCommand, + ComputeAlgorithm, + ComputeAsset, + ComputeOutput, + ComputeResourceRequest +} from '../../@types/C2D/C2D.js' +import type { + PaidComputeStartCommand, + ComputePayment, + FreeComputeStartCommand, ComputeStopCommand, ComputeGetResultCommand, - ComputeGetStatusCommand + ComputeGetStatusCommand, + ComputeGetStreamableLogsCommand } from '../../@types/commands.js' import { streamToObject, streamToString } from '../../utils/util.js' @@ -20,29 +30,9 @@ import { PROTOCOL_COMMANDS, SERVICES_API_BASE_PATH } from '../../utils/constants import { Readable } from 'stream' import { HTTP_LOGGER } from '../../utils/logging/common.js' import { LOG_LEVELS_STR } from '../../utils/logging/Logger.js' -import { getConfiguration } from '../../utils/index.js' export const computeRoutes = express.Router() -async function areEmpty(computeEnvs: any, requestChainId?: any): Promise { - if (requestChainId) { - return computeEnvs[parseInt(requestChainId)].length === 0 - } else { - const config = await getConfiguration() - let isEmpty: number = 0 - const supportedNetworks = Object.keys(config.supportedNetworks) - for (const supportedNetwork of supportedNetworks) { - if (computeEnvs[supportedNetwork].length === 0) { - isEmpty++ - } - } - if (isEmpty === supportedNetworks.length) { - return true - } - return false - } -} - computeRoutes.get(`${SERVICES_API_BASE_PATH}/computeEnvironments`, async (req, res) => { try { HTTP_LOGGER.logMessage( @@ -52,29 +42,23 @@ computeRoutes.get(`${SERVICES_API_BASE_PATH}/computeEnvironments`, async (req, r const getEnvironmentsTask = { command: PROTOCOL_COMMANDS.COMPUTE_GET_ENVIRONMENTS, chainId: parseInt(req.query.chainId as string) || null, - node: (req.query.node as string) || null + node: (req.query.node as string) || null, + caller: req.caller } const response = await new ComputeGetEnvironmentsHandler(req.oceanNode).handle( getEnvironmentsTask ) // get compute environments const computeEnvironments = await streamToObject(response.stream as Readable) - // check if computeEnvironments is a valid json object and not empty - if ( - computeEnvironments && - !(await areEmpty(computeEnvironments, req.query.chainId)) - ) { - res.json(computeEnvironments) - } else { - HTTP_LOGGER.logMessage(`Compute environments not found`, true) - res.status(404).send('Compute environments not found') - } + // always return the array, even if it's empty + res.json(computeEnvironments) } catch (error) { HTTP_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error: ${error}`) res.status(500).send('Internal Server Error') } }) +// start compute computeRoutes.post(`${SERVICES_API_BASE_PATH}/compute`, async (req, res) => { try { HTTP_LOGGER.logMessage( @@ -82,25 +66,79 @@ computeRoutes.post(`${SERVICES_API_BASE_PATH}/compute`, async (req, res) => { true ) - const startComputeTask: ComputeStartCommand = { + const startComputeTask: PaidComputeStartCommand = { command: PROTOCOL_COMMANDS.COMPUTE_START, node: (req.body.node as string) || null, consumerAddress: (req.body.consumerAddress as string) || null, signature: (req.body.signature as string) || null, nonce: (req.body.nonce as string) || null, environment: (req.body.environment as string) || null, + maxJobDuration: (req.body.maxJobDuration as number) || null, algorithm: (req.body.algorithm as ComputeAlgorithm) || null, - dataset: (req.body.dataset as unknown as ComputeAsset) || null + datasets: (req.body.datasets as unknown as ComputeAsset[]) || null, + payment: (req.body.payment as unknown as ComputePayment) || null, + resources: (req.body.resources as unknown as ComputeResourceRequest[]) || null, + policyServer: (req.body.policyServer as any) || null, + metadata: req.body.metadata || null, + authorization: req.headers?.authorization, + additionalViewers: (req.body.additionalViewers as unknown as string[]) || null, + queueMaxWaitTime: req.body.queueMaxWaitTime || 0, + caller: req.caller } - if (req.body.additionalDatasets) { - startComputeTask.additionalDatasets = req.query - .additionalDatasets as unknown as ComputeAsset[] + if (req.body.output) { + startComputeTask.output = req.body.output as ComputeOutput + } + + const response = await new PaidComputeStartHandler(req.oceanNode).handle( + startComputeTask + ) + if (response?.status?.httpStatus === 200) { + const jobs = await streamToObject(response.stream as Readable) + res.status(200).json(jobs) + } else { + HTTP_LOGGER.log(LOG_LEVELS_STR.LEVEL_INFO, `Error: ${response?.status?.error}`) + res.status(response?.status.httpStatus).json(response?.status?.error) + } + } catch (error) { + HTTP_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error: ${error}`) + res.status(500).send('Internal Server Error') + } +}) + +// free compute +computeRoutes.post(`${SERVICES_API_BASE_PATH}/freeCompute`, async (req, res) => { + try { + HTTP_LOGGER.logMessage( + `FreeComputeStartCommand request received as body params: ${JSON.stringify( + req.body + )}`, + true + ) + const startComputeTask: FreeComputeStartCommand = { + command: PROTOCOL_COMMANDS.FREE_COMPUTE_START, + node: (req.body.node as string) || null, + consumerAddress: (req.body.consumerAddress as string) || null, + signature: (req.body.signature as string) || null, + nonce: (req.body.nonce as string) || null, + environment: (req.body.environment as string) || null, + algorithm: (req.body.algorithm as ComputeAlgorithm) || null, + datasets: (req.body.datasets as unknown as ComputeAsset[]) || null, + resources: (req.body.resources as unknown as ComputeResourceRequest[]) || null, + maxJobDuration: req.body.maxJobDuration || null, + policyServer: (req.body.policyServer as any) || null, + metadata: req.body.metadata || null, + authorization: req.headers?.authorization, + additionalViewers: (req.body.additionalViewers as unknown as string[]) || null, + queueMaxWaitTime: req.body.queueMaxWaitTime || 0, + caller: req.caller } if (req.body.output) { startComputeTask.output = req.body.output as ComputeOutput } - const response = await new ComputeStartHandler(req.oceanNode).handle(startComputeTask) + const response = await new FreeComputeStartHandler(req.oceanNode).handle( + startComputeTask + ) if (response?.status?.httpStatus === 200) { const jobs = await streamToObject(response.stream as Readable) res.status(200).json(jobs) @@ -114,6 +152,7 @@ computeRoutes.post(`${SERVICES_API_BASE_PATH}/compute`, async (req, res) => { } }) +// stop compute computeRoutes.put(`${SERVICES_API_BASE_PATH}/compute`, async (req, res) => { try { HTTP_LOGGER.logMessage( @@ -130,7 +169,9 @@ computeRoutes.put(`${SERVICES_API_BASE_PATH}/compute`, async (req, res) => { signature: (req.query.signature as string) || null, nonce: (req.query.nonce as string) || null, jobId: (req.query.jobId as string) || null, - agreementId: (req.query.agreementId as string) || null + agreementId: (req.query.agreementId as string) || null, + authorization: req.headers?.authorization || null, + caller: req.caller } const response = await new ComputeStopHandler(req.oceanNode).handle(stopComputeTask) const jobs = await streamToObject(response.stream as Readable) @@ -141,6 +182,7 @@ computeRoutes.put(`${SERVICES_API_BASE_PATH}/compute`, async (req, res) => { } }) +// get status computeRoutes.get(`${SERVICES_API_BASE_PATH}/compute`, async (req, res) => { try { HTTP_LOGGER.logMessage( @@ -152,7 +194,8 @@ computeRoutes.get(`${SERVICES_API_BASE_PATH}/compute`, async (req, res) => { node: (req.query.node as string) || null, consumerAddress: (req.query.consumerAddress as string) || null, jobId: (req.query.jobId as string) || null, - agreementId: (req.query.agreementId as string) || null + agreementId: (req.query.agreementId as string) || null, + caller: req.caller } const response = await new ComputeGetStatusHandler(req.oceanNode).handle( statusComputeTask @@ -165,6 +208,7 @@ computeRoutes.get(`${SERVICES_API_BASE_PATH}/compute`, async (req, res) => { } }) +// compute results computeRoutes.get(`${SERVICES_API_BASE_PATH}/computeResult`, async (req, res) => { try { HTTP_LOGGER.logMessage( @@ -178,7 +222,9 @@ computeRoutes.get(`${SERVICES_API_BASE_PATH}/computeResult`, async (req, res) => index: req.query.index ? Number(req.query.index) : null, // can't be parseInt() because that excludes index 0 jobId: (req.query.jobId as string) || null, signature: (req.query.signature as string) || null, - nonce: (req.query.nonce as string) || null + nonce: (req.query.nonce as string) || null, + authorization: req.headers?.authorization, + caller: req.caller } const response = await new ComputeGetResultHandler(req.oceanNode).handle( @@ -196,6 +242,44 @@ computeRoutes.get(`${SERVICES_API_BASE_PATH}/computeResult`, async (req, res) => res.status(500).send('Internal Server Error') } }) + +// streaming logs +computeRoutes.get(`${SERVICES_API_BASE_PATH}/computeStreamableLogs`, async (req, res) => { + try { + HTTP_LOGGER.logMessage( + `ComputeGetStreamableLogsCommand request received with query: ${JSON.stringify( + req.query + )}`, + true + ) + + const resultComputeTask: ComputeGetStreamableLogsCommand = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_STREAMABLE_LOGS, + node: (req.query.node as string) || null, + consumerAddress: (req.query.consumerAddress as string) || null, + jobId: (req.query.jobId as string) || null, + signature: (req.query.signature as string) || null, + nonce: (req.query.nonce as string) || null, + authorization: req.headers?.authorization, + caller: req.caller + } + + const response = await new ComputeGetStreamableLogsHandler(req.oceanNode).handle( + resultComputeTask + ) + if (response.stream) { + res.status(response.status.httpStatus) + res.set(response.status.headers) + response.stream.pipe(res) + } else { + res.status(response.status.httpStatus).send(response.status.error) + } + } catch (error) { + HTTP_LOGGER.log(LOG_LEVELS_STR.LEVEL_ERROR, `Error: ${error}`) + res.status(500).send('Internal Server Error') + } +}) + computeRoutes.post(`${SERVICES_API_BASE_PATH}/initializeCompute`, async (req, res) => { try { HTTP_LOGGER.logMessage( @@ -207,20 +291,20 @@ computeRoutes.post(`${SERVICES_API_BASE_PATH}/initializeCompute`, async (req, re res.status(400).send('Missing required body') return } - if (!body.datasets && !body.algorithm) { - res.status(400).send('Missing datasets and algorithm') + + body.datasets = body.datasets || [] + + if (!body.algorithm) { + res.status(400).send('Missing algorithm') return } + for (const dataset of body.datasets) { if (!dataset.documentId) { res.status(400).send('Missing dataset did') return } } - if (!body.algorithm.documentId) { - res.status(400).send('Missing algorithm did') - return - } body.command = PROTOCOL_COMMANDS.COMPUTE_INITIALIZE const result = await new ComputeInitializeHandler(req.oceanNode).handle(body) if (result.stream) { diff --git a/src/components/httpRoutes/dids.ts b/src/components/httpRoutes/dids.ts index ed9c4f1bd..28b60f402 100644 --- a/src/components/httpRoutes/dids.ts +++ b/src/components/httpRoutes/dids.ts @@ -2,41 +2,56 @@ import express, { Request, Response } from 'express' import { sendMissingP2PResponse } from './index.js' import { hasP2PInterface } from '../../utils/config.js' -export const advertiseDidRoute = express.Router() - -advertiseDidRoute.post( - '/advertiseDid', +export const getProvidersForStringRoute = express.Router() +getProvidersForStringRoute.get( + '/getProvidersForString', express.urlencoded({ extended: true, type: '*/*' }), async (req: Request, res: Response): Promise => { - if (!req.query.did) { + if (!req.query.input) { res.sendStatus(400) return } if (hasP2PInterface) { - await req.oceanNode.getP2PNode().advertiseDid(req.query.did as string) - res.sendStatus(200) + const providers = await req.oceanNode + .getP2PNode() + .getProvidersForString(req.query.input as string) + res.json(providers) } else { sendMissingP2PResponse(res) } } ) -export const getProvidersForDidRoute = express.Router() -getProvidersForDidRoute.get( - '/getProvidersForDid', - express.urlencoded({ extended: true, type: '*/*' }), - async (req: Request, res: Response): Promise => { - if (!req.query.did) { - res.sendStatus(400) - return - } - if (hasP2PInterface) { - const providers = await req.oceanNode - .getP2PNode() - .getProvidersForDid(req.query.did as string) - res.json(providers) - } else { - sendMissingP2PResponse(res) +export const getProvidersForStringsRoute = express.Router() +getProvidersForStringsRoute.post( + '/getProvidersForStrings', + express.json(), + async (req, res) => { + try { + if (!req.body) { + res.status(400).send('Missing array of strings in request body.') + return + } + // const body = JSON.parse(req.body) + if ( + Array.isArray(req.body) && + req.body.every((item: unknown) => typeof item === 'string') + ) { + const timeout = + typeof req.query?.timeout === 'string' + ? parseInt(req.query.timeout, 10) + : undefined + const providers = await req.oceanNode + .getP2PNode() + .getProvidersForStrings(req.body, timeout) + + res.json(providers) + } else { + res.status(400).send('Expected an array of strings.') + } + } catch (error) { + console.error('Error processing request:', error) + res.status(400).send(error) } } ) diff --git a/src/components/httpRoutes/fileInfo.ts b/src/components/httpRoutes/fileInfo.ts index 7c3da3cd9..14f96f2a1 100644 --- a/src/components/httpRoutes/fileInfo.ts +++ b/src/components/httpRoutes/fileInfo.ts @@ -51,7 +51,8 @@ fileInfoRoute.post( fileInfoTask = { command: PROTOCOL_COMMANDS.FILE_INFO, did: fileInfoReq.did, - serviceId: fileInfoReq.serviceId + serviceId: fileInfoReq.serviceId, + caller: req.caller } } else if (fileInfoReq.type === 'url' && fileInfoReq.url) { fileObject = { @@ -62,7 +63,8 @@ fileInfoRoute.post( fileInfoTask = { command: PROTOCOL_COMMANDS.FILE_INFO, file: fileObject, - type: fileObject.type as FileObjectType + type: fileObject.type as FileObjectType, + caller: req.caller } } else if (fileInfoReq.type === 'ipfs' && fileInfoReq.hash) { fileObject = { @@ -73,7 +75,8 @@ fileInfoRoute.post( fileInfoTask = { command: PROTOCOL_COMMANDS.FILE_INFO, file: fileObject, - type: fileObject.type as FileObjectType + type: fileObject.type as FileObjectType, + caller: req.caller } } else if (fileInfoReq.type === 'arweave' && fileInfoReq.transactionId) { fileObject = { @@ -84,7 +87,8 @@ fileInfoRoute.post( fileInfoTask = { command: PROTOCOL_COMMANDS.FILE_INFO, file: fileObject, - type: fileObject.type as FileObjectType + type: fileObject.type as FileObjectType, + caller: req.caller } } const response = await new FileInfoHandler(req.oceanNode).handle(fileInfoTask) diff --git a/src/components/httpRoutes/getOceanPeers.ts b/src/components/httpRoutes/getOceanPeers.ts index 4c619d72b..66366b5c0 100644 --- a/src/components/httpRoutes/getOceanPeers.ts +++ b/src/components/httpRoutes/getOceanPeers.ts @@ -1,51 +1,73 @@ import express, { Request, Response } from 'express' -import { getDefaultLevel } from '../../utils/logging/Logger.js' -import { P2P_LOGGER } from '../../utils/logging/common.js' -import { sendMissingP2PResponse } from './index.js' -import { getBoolEnvValue, hasP2PInterface } from '../../utils/config.js' -export const getOceanPeersRoute = express.Router() +import { + GetP2PPeerHandler, + GetP2PPeersHandler, + GetP2PNetworkStatsHandler, + FindPeerHandler +} from '../core/handler/p2p.js' +import { PROTOCOL_COMMANDS } from '../../utils/constants.js' +import { streamToString } from '../../utils/util.js' +import { Readable } from 'stream' +export const p2pRoutes = express.Router() -getOceanPeersRoute.get( +p2pRoutes.get( '/getP2pNetworkStats', async (req: Request, res: Response): Promise => { - // only return values if env P2P_ENABLE_NETWORK_STATS is explicitly allowed - if (hasP2PInterface && getBoolEnvValue('P2P_ENABLE_NETWORK_STATS', false)) { - const stats = await req.oceanNode.getP2PNode().getNetworkingStats() - P2P_LOGGER.log(getDefaultLevel(), `getP2pNetworkStats: ${stats}`, true) - res.json(stats) + const node = req.oceanNode + const result = await new GetP2PNetworkStatsHandler(node).handle({ + command: PROTOCOL_COMMANDS.GET_P2P_NETWORK_STATS, + caller: req.caller + }) + if (result.stream) { + const validationResult = JSON.parse(await streamToString(result.stream as Readable)) + res.json(validationResult) } else { - res.status(400).send('Not enabled or unavailable') + res.status(result.status.httpStatus).send(result.status.error) } } ) -getOceanPeersRoute.get( - '/getOceanPeers', + +p2pRoutes.get( + '/findPeer', + express.urlencoded({ extended: true }), async (req: Request, res: Response): Promise => { - if (hasP2PInterface) { - const peers = await req.oceanNode.getP2PNode().getAllOceanPeers() - P2P_LOGGER.log(getDefaultLevel(), `getOceanPeers: ${peers}`, true) - res.json(peers) + if (!req.query.peerId) { + res.sendStatus(400) + return + } + const node = req.oceanNode + const result = await new FindPeerHandler(node).handle({ + command: PROTOCOL_COMMANDS.FIND_PEER, + peerId: req.query.peerId as string, + timeout: req.query.timeout as string, + caller: req.caller + }) + if (result.stream) { + const validationResult = JSON.parse(await streamToString(result.stream as Readable)) + res.json(validationResult) } else { - sendMissingP2PResponse(res) + res.status(result.status.httpStatus).send(result.status.error) } } ) export const getP2PPeersRoute = express.Router() -getP2PPeersRoute.get( - '/getP2PPeers', - async (req: Request, res: Response): Promise => { - if (hasP2PInterface) { - const peers = await req.oceanNode.getP2PNode().getAllPeerStore() - res.json(peers) - } else { - sendMissingP2PResponse(res) - } +p2pRoutes.get('/getP2PPeers', async (req: Request, res: Response): Promise => { + const node = req.oceanNode + const result = await new GetP2PPeersHandler(node).handle({ + command: PROTOCOL_COMMANDS.GET_P2P_PEERS, + caller: req.caller + }) + if (result.stream) { + const validationResult = JSON.parse(await streamToString(result.stream as Readable)) + res.json(validationResult) + } else { + res.status(result.status.httpStatus).send(result.status.error) } -) +}) export const getP2PPeerRoute = express.Router() -getP2PPeersRoute.get( +p2pRoutes.get( '/getP2PPeer', express.urlencoded({ extended: true }), async (req: Request, res: Response): Promise => { @@ -53,13 +75,17 @@ getP2PPeersRoute.get( res.sendStatus(400) return } - if (hasP2PInterface) { - const peers = await req.oceanNode - .getP2PNode() - .getPeerDetails(String(req.query.peerId)) - res.json(peers) + const node = req.oceanNode + const result = await new GetP2PPeerHandler(node).handle({ + command: PROTOCOL_COMMANDS.GET_P2P_PEER, + peerId: req.query.peerId as string, + caller: req.caller + }) + if (result.stream) { + const validationResult = JSON.parse(await streamToString(result.stream as Readable)) + res.json(validationResult) } else { - sendMissingP2PResponse(res) + res.status(result.status.httpStatus).send(result.status.error) } } ) diff --git a/src/components/httpRoutes/index.ts b/src/components/httpRoutes/index.ts index ee974a52d..cf5530c5f 100644 --- a/src/components/httpRoutes/index.ts +++ b/src/components/httpRoutes/index.ts @@ -1,6 +1,6 @@ import express, { Response } from 'express' -import { getOceanPeersRoute, getP2PPeersRoute, getP2PPeerRoute } from './getOceanPeers.js' -import { advertiseDidRoute, getProvidersForDidRoute } from './dids.js' +import { p2pRoutes } from './getOceanPeers.js' +import { getProvidersForStringRoute, getProvidersForStringsRoute } from './dids.js' import { directCommandRoute } from './commands.js' import { logRoutes } from './logs.js' import { providerRoutes } from './provider.js' @@ -12,8 +12,12 @@ import { queueRoutes } from './queue.js' // import { getConfiguration } from '../../utils/config.js' import { jobsRoutes } from './jobs.js' import { addMapping, allRoutesMapping, findPathName } from './routeUtils.js' +import { PolicyServerPassthroughRoute } from './policyServer.js' +import { authRoutes } from './auth.js' +import { adminConfigRoutes } from './adminConfig.js' export * from './getOceanPeers.js' +export * from './auth.js' export const httpRoutes = express.Router() @@ -21,16 +25,11 @@ export function sendMissingP2PResponse(res: Response) { res.status(400).send('Invalid or Non Existing P2P configuration') } -// /getOceanPeers -httpRoutes.use(getOceanPeersRoute) -// /getP2PPeers -httpRoutes.use(getP2PPeersRoute) -// /getP2PPeer -httpRoutes.use(getP2PPeerRoute) -// /advertiseDid -httpRoutes.use(advertiseDidRoute) +// /p2pRoutes +httpRoutes.use(p2pRoutes) // /getProvidersForDid -httpRoutes.use(getProvidersForDidRoute) +httpRoutes.use(getProvidersForStringRoute) +httpRoutes.use(getProvidersForStringsRoute) // /directCommand httpRoutes.use(directCommandRoute) // /logs @@ -57,6 +56,12 @@ httpRoutes.use(computeRoutes) httpRoutes.use(queueRoutes) // running jobs httpRoutes.use(jobsRoutes) +// policy server passthrough +httpRoutes.use(PolicyServerPassthroughRoute) +// auth routes +httpRoutes.use(authRoutes) +// admin config routes +httpRoutes.use(adminConfigRoutes) export function getAllServiceEndpoints() { httpRoutes.stack.forEach(addMapping.bind(null, [])) diff --git a/src/components/httpRoutes/logs.ts b/src/components/httpRoutes/logs.ts index ba0631b03..f9c38f992 100644 --- a/src/components/httpRoutes/logs.ts +++ b/src/components/httpRoutes/logs.ts @@ -1,11 +1,12 @@ import express from 'express' import { validateAdminSignature } from '../../utils/auth.js' import { HTTP_LOGGER } from '../../utils/logging/common.js' +import { CommonValidation } from '../../utils/validators.js' export const logRoutes = express.Router() // Middleware to validate signature and expiry timestamp -const validateRequest = ( +const validateRequest = async ( req: express.Request, res: express.Response, next: express.NextFunction @@ -26,7 +27,10 @@ const validateRequest = ( return res.status(400).send('Invalid expiryTimestamp') } - const isValid = validateAdminSignature(expiryTimestamp, signature) + const isValid: CommonValidation = await validateAdminSignature( + expiryTimestamp, + signature + ) if (!isValid.valid) { return res.status(403).send(`Invalid signature: ${isValid.error}`) } @@ -56,7 +60,7 @@ logRoutes.post('/logs', express.json(), validateRequest, async (req, res) => { .getDatabase() .logs.retrieveMultipleLogs(startTime, endTime, maxLogs, moduleName, level, page) - if (logs) { + if (logs.length > 0) { res.json(logs) } else { res.status(404).send('No logs found') @@ -70,7 +74,12 @@ logRoutes.post('/logs', express.json(), validateRequest, async (req, res) => { logRoutes.post('/log/:id', express.json(), validateRequest, async (req, res) => { try { const logId = req.params.id - const log = await req.oceanNode.getDatabase().logs.retrieveLog(logId) + const database = req.oceanNode.getDatabase() + if (!database || !database.logs) { + res.status(503).send('Logs database is not available') + return + } + const log = await database.logs.retrieveLog(logId) if (log) { res.json(log) } else { diff --git a/src/components/httpRoutes/policyServer.ts b/src/components/httpRoutes/policyServer.ts index 8d89c162e..4c2bf6274 100644 --- a/src/components/httpRoutes/policyServer.ts +++ b/src/components/httpRoutes/policyServer.ts @@ -1,5 +1,8 @@ import express, { Request, Response } from 'express' -import { PolicyServerPassthroughHandler } from '../core/handler/policyServer.js' +import { + PolicyServerPassthroughHandler, + PolicyServerInitializeHandler +} from '../core/handler/policyServer.js' import { HTTP_LOGGER } from '../../utils/logging/common.js' import { PROTOCOL_COMMANDS, SERVICES_API_BASE_PATH } from '../../utils/constants.js' @@ -17,7 +20,73 @@ PolicyServerPassthroughRoute.post( try { const response = await new PolicyServerPassthroughHandler(req.oceanNode).handle({ command: PROTOCOL_COMMANDS.POLICY_SERVER_PASSTHROUGH, - policyServerPassthrough: req.body.policyServerPassthrough + policyServerPassthrough: req.body.policyServerPassthrough, + caller: req.caller + }) + if (response.stream) { + res.status(response.status.httpStatus) + res.set(response.status.headers) + response.stream.pipe(res) + } else { + HTTP_LOGGER.error(response.status.error) + res.status(response.status.httpStatus).send(response.status.error) + } + } catch (error) { + HTTP_LOGGER.error(error.message) + res.status(500).send(error) + } + // res.sendStatus(200) + } +) + +PolicyServerPassthroughRoute.post( + `${SERVICES_API_BASE_PATH}/initializePSVerification`, + express.urlencoded({ extended: true, type: '*/*' }), + async (req: Request, res: Response): Promise => { + HTTP_LOGGER.logMessage( + `initializePSVerificationRoute request received: ${JSON.stringify(req.body)}`, + true + ) + try { + const response = await new PolicyServerInitializeHandler(req.oceanNode).handle({ + command: PROTOCOL_COMMANDS.POLICY_SERVER_PASSTHROUGH, + documentId: req.body.documentId, + serviceId: req.body.serviceId, + consumerAddress: req.body.consumerAddress, + policyServer: req.body.policyServer, + caller: req.caller + }) + if (response.stream) { + res.status(response.status.httpStatus) + res.set(response.status.headers) + response.stream.pipe(res) + } else { + HTTP_LOGGER.error(response.status.error) + res.status(response.status.httpStatus).send(response.status.error) + } + } catch (error) { + HTTP_LOGGER.error(error.message) + res.status(500).send(error) + } + // res.sendStatus(200) + } +) + +PolicyServerPassthroughRoute.post( + `${SERVICES_API_BASE_PATH}/initializePSVerification`, + express.urlencoded({ extended: true, type: '*/*' }), + async (req: Request, res: Response): Promise => { + HTTP_LOGGER.logMessage( + `initializePSVerificationRoute request received: ${JSON.stringify(req.body)}`, + true + ) + try { + const response = await new PolicyServerInitializeHandler(req.oceanNode).handle({ + command: PROTOCOL_COMMANDS.POLICY_SERVER_PASSTHROUGH, + documentId: req.body.documentId, + serviceId: req.body.serviceId, + consumerAddress: req.body.consumerAddress, + policyServer: req.body.policyServer }) if (response.stream) { res.status(response.status.httpStatus) diff --git a/src/components/httpRoutes/provider.ts b/src/components/httpRoutes/provider.ts index 4194a2689..f44a05744 100644 --- a/src/components/httpRoutes/provider.ts +++ b/src/components/httpRoutes/provider.ts @@ -20,7 +20,8 @@ providerRoutes.post(`${SERVICES_API_BASE_PATH}/decrypt`, async (req, res) => { try { const result = await new DecryptDdoHandler(req.oceanNode).handle({ ...req.body, - command: PROTOCOL_COMMANDS.DECRYPT_DDO + command: PROTOCOL_COMMANDS.DECRYPT_DDO, + caller: req.caller }) if (result.stream) { const decryptedData = await streamToString(result.stream as Readable) @@ -46,7 +47,11 @@ providerRoutes.post(`${SERVICES_API_BASE_PATH}/encrypt`, async (req, res) => { blob: data, encoding: 'string', encryptionType: EncryptMethod.ECIES, - command: PROTOCOL_COMMANDS.ENCRYPT + command: PROTOCOL_COMMANDS.ENCRYPT, + caller: req.caller, + nonce: req.query.nonce as string, + consumerAddress: req.query.consumerAddress as string, + signature: req.query.signature as string }) if (result.stream) { const encryptedData = await streamToString(result.stream as Readable) @@ -97,7 +102,11 @@ providerRoutes.post(`${SERVICES_API_BASE_PATH}/encryptFile`, async (req, res) => const result = await new EncryptFileHandler(req.oceanNode).handle({ rawData: input, encryptionType: encryptMethod, - command: PROTOCOL_COMMANDS.ENCRYPT_FILE + command: PROTOCOL_COMMANDS.ENCRYPT_FILE, + caller: req.caller, + nonce: req.query.nonce as string, + consumerAddress: req.query.consumerAddress as string, + signature: req.query.signature as string }) return result } @@ -112,7 +121,11 @@ providerRoutes.post(`${SERVICES_API_BASE_PATH}/encryptFile`, async (req, res) => result = await new EncryptFileHandler(req.oceanNode).handle({ files: req.body as BaseFileObject, encryptionType: encryptMethod, - command: PROTOCOL_COMMANDS.ENCRYPT_FILE + command: PROTOCOL_COMMANDS.ENCRYPT_FILE, + caller: req.caller, + nonce: req.query.nonce as string, + consumerAddress: req.query.consumerAddress as string, + signature: req.query.signature as string }) return await writeResponse(result, encryptMethod) // raw data on body @@ -153,7 +166,8 @@ providerRoutes.get(`${SERVICES_API_BASE_PATH}/initialize`, async (req, res) => { serviceId: (req.query.serviceId as string) || null, consumerAddress: (req.query.consumerAddress as string) || null, validUntil: parseInt(req.query.validUntil as string) || null, - policyServer: req.query.policyServer || null + policyServer: (req.query.policyServer as any) || null, + caller: req.caller }) if (result.stream) { const initializeREsponse = await streamToObject(result.stream as Readable) @@ -200,6 +214,7 @@ providerRoutes.get( `Download request received: ${JSON.stringify(req.query)}`, true ) + const authorization = req.headers?.authorization try { const { fileIndex, @@ -208,9 +223,20 @@ providerRoutes.get( transferTxId, nonce, consumerAddress, - signature + signature, + userdata } = req.query + let parsedUserData: any = null + if (userdata) { + try { + parsedUserData = JSON.parse(userdata as string) + } catch (e) { + HTTP_LOGGER.logMessage(`Invalid userdata JSON: ${userdata}`, true) + parsedUserData = null + } + } + const downloadTask: DownloadCommand = { fileIndex: Number(fileIndex), documentId: documentId as string, @@ -220,14 +246,23 @@ providerRoutes.get( consumerAddress: consumerAddress as string, signature: signature as string, command: PROTOCOL_COMMANDS.DOWNLOAD, - policyServer: req.query.policyServer || null + policyServer: (req.query.policyServer as any) || null, + authorization: authorization as string, + userData: parsedUserData, + caller: req.caller } const response = await new DownloadHandler(req.oceanNode).handle(downloadTask) if (response.stream) { res.status(response.status.httpStatus) - res.set(response.status.headers) + + const safeHeaders = { ...response.status.headers } + if (safeHeaders['content-length'] && safeHeaders['Transfer-Encoding']) { + delete safeHeaders['content-length'] + } + + res.set(safeHeaders) response.stream.pipe(res) } else { res.status(response.status.httpStatus).send(response.status.error) diff --git a/src/components/httpRoutes/requestValidator.ts b/src/components/httpRoutes/requestValidator.ts index 6fb6e553b..dd505fca4 100644 --- a/src/components/httpRoutes/requestValidator.ts +++ b/src/components/httpRoutes/requestValidator.ts @@ -1,36 +1,55 @@ import { Request, Response } from 'express' -import { getConfiguration } from '../../utils/index.js' +import { getConfiguration } from '../../utils/config.js' import { HTTP_LOGGER } from '../../utils/logging/common.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { + checkGlobalConnectionsRateLimit, + checkRequestsRateLimit, + CommonValidation +} from '../../utils/validators.js' -// TODO we should group common stuff, -// we have multiple similar validation interfaces -export interface CommonValidation { - valid: boolean - error?: string -} - -// midleware to valid client addresses against a denylist +// Middleware to validate IP and apply rate limiting export const requestValidator = async function (req: Request, res: Response, next: any) { - // Perform the validations. - const requestIP = req.headers['x-forwarded-for'] || req.socket.remoteAddress - const validation = await checkIP(requestIP) - // Validation failed, or an error occurred during the external request. - if (!validation.valid) { - res.status(403).send(validation.error) + const now = Date.now() + const requestIP = (req.headers['x-forwarded-for'] || + req.socket.remoteAddress || + '') as string + + const configuration = await getConfiguration() + + const ipValidation = await checkIP(requestIP, configuration) + if (!ipValidation.valid) { + HTTP_LOGGER.logMessage(`IP denied: ${ipValidation.error}`) + return res.status(403).send(ipValidation.error) + } + + const rateLimitCheck = checkRequestsRateLimit(requestIP, configuration, now) + if (!rateLimitCheck.valid) { + HTTP_LOGGER.logMessage( + `Exceeded limit of requests per minute ${configuration.rateLimit}: ${rateLimitCheck.error}` + ) + return res.status(429).send(rateLimitCheck.error) + } + + const connectionsRateValidation = checkGlobalConnectionsRateLimit(configuration, now) + if (!connectionsRateValidation.valid) { + res.status(403).send(connectionsRateValidation.error) return } - // Validation passed. + next() } -async function checkIP(requestIP: string | string[]): Promise { +function checkIP( + requestIP: string | string[], + configuration: OceanNodeConfig +): CommonValidation { let onDenyList = false - const configuration = await getConfiguration() if (!Array.isArray(requestIP)) { - onDenyList = configuration.denyList?.ips.includes(requestIP) + onDenyList = configuration.denyList?.ips?.includes(requestIP) } else { for (const ip of requestIP) { - if (configuration.denyList?.ips.includes(ip)) { + if (configuration.denyList?.ips?.includes(ip)) { onDenyList = true break } diff --git a/src/components/httpRoutes/rootEndpoint.ts b/src/components/httpRoutes/rootEndpoint.ts index 6aa57c83d..4f3a60684 100644 --- a/src/components/httpRoutes/rootEndpoint.ts +++ b/src/components/httpRoutes/rootEndpoint.ts @@ -9,9 +9,11 @@ rootEndpointRoutes.get('/', async (req, res) => { if (!config.supportedNetworks) { HTTP_LOGGER.warn(`Supported networks not defined`) } + const keyManager = req.oceanNode.getKeyManager() res.json({ + nodeId: keyManager.getPeerId().toString(), chainIds: config.supportedNetworks ? Object.keys(config.supportedNetworks) : [], - providerAddress: config.keys.ethAddress, + providerAddress: keyManager.getEthAddress(), serviceEndpoints: getAllServiceEndpoints(), software: 'Ocean-Node', version: '0.0.1' diff --git a/src/components/httpRoutes/routeUtils.ts b/src/components/httpRoutes/routeUtils.ts index 4843f5d0e..0445fd027 100644 --- a/src/components/httpRoutes/routeUtils.ts +++ b/src/components/httpRoutes/routeUtils.ts @@ -46,6 +46,16 @@ routesNames.set('computeStart', { method: 'post' }) +routesNames.set('freeCompute', { + path: `${SERVICES_API_BASE_PATH}/freeCompute`, + method: 'post' +}) + +routesNames.set('computeStreamableLogs', { + path: `${SERVICES_API_BASE_PATH}/computeStreamableLogs`, + method: 'GET' +}) + routesNames.set('computeStatus', { path: `${SERVICES_API_BASE_PATH}/compute`, method: 'get' @@ -174,6 +184,26 @@ routesNames.set('indexQueue', { method: 'get' }) +routesNames.set('PolicyServerPassthrough', { + path: `${SERVICES_API_BASE_PATH}/PolicyServerPassthrough`, + method: 'post' +}) + +routesNames.set('initializePSVerification', { + path: `${SERVICES_API_BASE_PATH}/initializePSVerification`, + method: 'post' +}) + +routesNames.set('generateAuthToken', { + path: `${SERVICES_API_BASE_PATH}/auth/token`, + method: 'post' +}) + +routesNames.set('invalidateAuthToken', { + path: `${SERVICES_API_BASE_PATH}/auth/token/invalidate`, + method: 'post' +}) + export function addMapping(path: any, layer: any) { if (layer.route) { layer.route.stack.forEach(addMapping.bind(null, path.concat(split(layer.route.path)))) diff --git a/src/components/policyServer/index.ts b/src/components/policyServer/index.ts index eeb0523c1..1950d55c3 100644 --- a/src/components/policyServer/index.ts +++ b/src/components/policyServer/index.ts @@ -1,6 +1,7 @@ -// import { CORE_LOGGER } from '../../utils/logging/common.js' +import { DDO } from '@oceanprotocol/ddo-js' import { PolicyServerResult } from '../../@types/policyServer.js' -import { DDO } from '../../@types/DDO/DDO.js' +import { isDefined } from '../../utils/util.js' +import { BaseFileObject } from '../../@types/fileObject.js' export class PolicyServer { serverUrl: string @@ -10,7 +11,7 @@ export class PolicyServer { } private async askServer(command: any): Promise { - if (!this.serverUrl) return { success: true, message: '', httpStatus: 0 } + if (!this.serverUrl) return { success: true, message: '', httpStatus: 404 } let response try { response = await fetch(this.serverUrl, { @@ -21,10 +22,18 @@ export class PolicyServer { body: JSON.stringify(command) }) } catch (e) { - return { success: true, message: '', httpStatus: 0 } + return { + success: true, + message: '', + httpStatus: 400 + } } if (response.status === 200) { - return { success: true, message: '', httpStatus: response.status } + return { + success: true, + message: await response.text(), + httpStatus: response.status + } } return { success: false, message: await response.text(), httpStatus: response.status } } @@ -61,7 +70,33 @@ export class PolicyServer { return await this.askServer(command) } - async checkInitialize( + async checkEncrypt( + consumerAddress: string, + policyServer: any + ): Promise { + const command = { + action: 'encrypt', + consumerAddress, + policyServer + } + return await this.askServer(command) + } + + async checkEncryptFile( + consumerAddress: string, + policyServer: any, + files?: BaseFileObject + ): Promise { + const command = { + action: 'encryptFile', + consumerAddress, + policyServer, + files + } + return await this.askServer(command) + } + + async checkDownload( documentId: string, ddo: DDO, serviceId: string, @@ -69,7 +104,7 @@ export class PolicyServer { policyServer: any ): Promise { const command = { - action: 'initialize', + action: 'download', documentId, ddo, serviceId, @@ -79,22 +114,36 @@ export class PolicyServer { return await this.askServer(command) } - async checkDownload( + async checkStartCompute( documentId: string, - ddo: DDO, + ddo: DDO | Record, serviceId: string, - fileIndex: number, - transferTxId: string, consumerAddress: string, policyServer: any ): Promise { const command = { - action: 'download', + action: 'startCompute', documentId, ddo, serviceId, - fileIndex, - transferTxId, + consumerAddress, + policyServer + } + return await this.askServer(command) + } + + async initializePSVerification( + documentId: string, + ddo: DDO, + serviceId: string, + consumerAddress: string, + policyServer: any + ): Promise { + const command = { + action: 'initiate', + documentId, + serviceId, + ddo, consumerAddress, policyServer } @@ -104,4 +153,8 @@ export class PolicyServer { async passThrough(request: any): Promise { return await this.askServer(request) } + + public isConfigured(): boolean { + return isDefined(this.serverUrl) + } } diff --git a/src/components/storage/index.ts b/src/components/storage/index.ts index 509766e1d..e00d5257b 100644 --- a/src/components/storage/index.ts +++ b/src/components/storage/index.ts @@ -14,12 +14,11 @@ import { OceanNodeConfig } from '../../@types/OceanNode.js' import { fetchFileMetadata } from '../../utils/asset.js' import axios from 'axios' import urlJoin from 'url-join' -import { encrypt as encryptData, decrypt as decryptData } from '../../utils/crypt.js' -import { Readable } from 'stream' import AWS from 'aws-sdk' import { GetObjectCommand, S3Client } from '@aws-sdk/client-s3' import { CORE_LOGGER } from '../../utils/logging/common.js' - +import { Readable } from 'stream' +import { encrypt as encryptData, decrypt as decryptData } from '../../utils/crypt.js' export abstract class Storage { private file: UrlFileObject | IpfsFileObject | ArweaveFileObject | S3FileObject config: OceanNodeConfig @@ -39,7 +38,6 @@ export abstract class Storage { forceChecksum: boolean ): Promise - abstract encryptContent(encryptionType: 'AES' | 'ECIES'): Promise abstract isFilePath(): boolean getFile(): any { @@ -49,11 +47,14 @@ export abstract class Storage { // similar to all subclasses async getReadableStream(): Promise { const input = this.getDownloadUrl() + CORE_LOGGER.info(`Fetching the file from ${input}`) const response = await axios({ method: 'get', url: input, - responseType: 'stream' + responseType: 'stream', + timeout: 30000 }) + CORE_LOGGER.info(`Successfully fetched the file from ${input}`) return { httpStatus: response.status, @@ -65,22 +66,33 @@ export abstract class Storage { static getStorageClass( file: any, config: OceanNodeConfig - ): UrlStorage | IpfsStorage | ArweaveStorage | S3Storage { - const { type } = file - switch ( - type?.toLowerCase() // case insensitive - ) { - case FileObjectType.URL: - return new UrlStorage(file, config) - case FileObjectType.IPFS: - return new IpfsStorage(file, config) - case FileObjectType.ARWEAVE: - return new ArweaveStorage(file, config) - case FileObjectType.S3: - return new S3Storage(file, config) - default: - throw new Error(`Invalid storage type: ${type}`) + ): UrlStorage | IpfsStorage | ArweaveStorage { + if (!file) { + throw new Error('Empty file object') } + try { + const { type } = file + switch ( + type?.toLowerCase() // case insensitive + ) { + case FileObjectType.URL: + return new UrlStorage(file, config) + case FileObjectType.IPFS: + return new IpfsStorage(file, config) + case FileObjectType.ARWEAVE: + return new ArweaveStorage(file, config) + default: + throw new Error(`Invalid storage type: ${type}`) + } + } catch (err) { + console.error('Error in getStorageClass: ', err) + throw err + } + } + + getStorageType(file: any): FileObjectType { + const { type } = file + return type } async getFileInfo( @@ -190,7 +202,28 @@ export class UrlStorage extends Storage { super(file, config) const [isValid, message] = this.validate() if (isValid === false) { - throw new Error(`Error validationg the URL file: ${message}`) + throw new Error(`Error validating the URL file: ${message}`) + } + } + + async getReadableStream(): Promise { + const input = this.getDownloadUrl() + const file = this.getFile() + CORE_LOGGER.info(`Fetching the file from ${input}`) + CORE_LOGGER.debug(`Using headers: ${JSON.stringify(file.headers)}`) + const { headers } = file + const response = await axios({ + method: 'get', + url: input, + headers, + responseType: 'stream', + timeout: 30000 + }) + + return { + httpStatus: response.status, + stream: response.data, + headers: response.headers as any } } @@ -240,11 +273,12 @@ export class UrlStorage extends Storage { fileObject: UrlFileObject, forceChecksum: boolean ): Promise { - const { url, method } = fileObject + const { url, method, headers } = fileObject const { contentLength, contentType, contentChecksum } = await fetchFileMetadata( url, - method, - forceChecksum + method || 'get', + forceChecksum, + headers ) return { valid: true, @@ -257,18 +291,6 @@ export class UrlStorage extends Storage { encryptMethod: fileObject.encryptMethod } } - - async encryptContent( - encryptionType: EncryptMethod.AES | EncryptMethod.ECIES - ): Promise { - const file = this.getFile() - const response = await axios({ - url: file.url, - method: file.method || 'get', - headers: file.headers - }) - return await encryptData(response.data, encryptionType) - } } export class ArweaveStorage extends Storage { @@ -277,13 +299,13 @@ export class ArweaveStorage extends Storage { const [isValid, message] = this.validate() if (isValid === false) { - throw new Error(`Error validationg the Arweave file: ${message}`) + throw new Error(`Error validating the Arweave file: ${message}`) } } validate(): [boolean, string] { - if (!process.env.ARWEAVE_GATEWAY) { - return [false, 'Arweave gateway is not provided!'] + if (!this.config.arweaveGateway) { + return [false, 'Arweave gateway is not configured!'] } const file: ArweaveFileObject = this.getFile() as ArweaveFileObject if (!file.transactionId) { @@ -312,14 +334,14 @@ export class ArweaveStorage extends Storage { } getDownloadUrl(): string { - return urlJoin(process.env.ARWEAVE_GATEWAY, this.getFile().transactionId) + return urlJoin(this.config.arweaveGateway, this.getFile().transactionId) } async fetchSpecificFileMetadata( fileObject: ArweaveFileObject, forceChecksum: boolean ): Promise { - const url = urlJoin(process.env.ARWEAVE_GATEWAY, fileObject.transactionId) + const url = urlJoin(this.config.arweaveGateway, fileObject.transactionId) const { contentLength, contentType, contentChecksum } = await fetchFileMetadata( url, 'get', @@ -336,17 +358,6 @@ export class ArweaveStorage extends Storage { encryptMethod: fileObject.encryptMethod } } - - async encryptContent( - encryptionType: EncryptMethod.AES | EncryptMethod.ECIES - ): Promise { - const file = this.getFile() - const response = await axios({ - url: urlJoin(process.env.ARWEAVE_GATEWAY, file.transactionId), - method: 'get' - }) - return await encryptData(response.data, encryptionType) - } } export class IpfsStorage extends Storage { @@ -355,13 +366,13 @@ export class IpfsStorage extends Storage { const [isValid, message] = this.validate() if (isValid === false) { - throw new Error(`Error validationg the IPFS file: ${message}`) + throw new Error(`Error validating the IPFS file: ${message}`) } } validate(): [boolean, string] { - if (!process.env.IPFS_GATEWAY) { - return [false, 'IPFS gateway is not provided!'] + if (!this.config.ipfsGateway) { + return [false, 'IPFS gateway is not configured!'] } const file: IpfsFileObject = this.getFile() as IpfsFileObject if (!file.hash) { @@ -384,14 +395,14 @@ export class IpfsStorage extends Storage { } getDownloadUrl(): string { - return urlJoin(process.env.IPFS_GATEWAY, urlJoin('/ipfs', this.getFile().hash)) + return urlJoin(this.config.ipfsGateway, urlJoin('/ipfs', this.getFile().hash)) } async fetchSpecificFileMetadata( fileObject: IpfsFileObject, forceChecksum: boolean ): Promise { - const url = urlJoin(process.env.IPFS_GATEWAY, urlJoin('/ipfs', fileObject.hash)) + const url = urlJoin(this.config.ipfsGateway, urlJoin('/ipfs', fileObject.hash)) const { contentLength, contentType, contentChecksum } = await fetchFileMetadata( url, 'get', @@ -408,17 +419,6 @@ export class IpfsStorage extends Storage { encryptMethod: fileObject.encryptMethod } } - - async encryptContent( - encryptionType: EncryptMethod.AES | EncryptMethod.ECIES - ): Promise { - const file = this.getFile() - const response = await axios({ - url: file.hash, - method: 'get' - }) - return await encryptData(response.data, encryptionType) - } } export class S3Storage extends Storage { diff --git a/src/helpers/scripts/setupNodeEnv.sh b/src/helpers/scripts/setupNodeEnv.sh index e3727f7b8..7c2447f08 100755 --- a/src/helpers/scripts/setupNodeEnv.sh +++ b/src/helpers/scripts/setupNodeEnv.sh @@ -239,6 +239,34 @@ if [ "$run_indexer" == 'y' ]; then configure_rpc fi +# Check if user wants to enable compute functionality +read -p "Do you want to enable compute functionality on your node? [ y/n ]: " enable_compute +enable_compute=${enable_compute:-y} +if [ "$enable_compute" == 'y' ]; then + echo "" + echo "✅ Setting default Docker compute environment configuration" + echo " This enables compute-to-data functionality with standard resource limits:" + echo " • Docker socket path: /var/run/docker.sock" + echo " • Storage expiry: 7 days (604800 seconds)" + echo " • Max job duration: 10 hours (36000 seconds)" + echo " • Free compute resources: 1 CPU, 1GB RAM, 1GB disk" + echo " • Maximum free jobs: 3 concurrent jobs" + echo "" + echo " You can customize this in your .env file for production use." + echo "" + + DOCKER_COMPUTE_ENV="[{\"socketPath\":\"/var/run/docker.sock\",\"resources\":[{\"id\":\"disk\",\"total\":10}],\"storageExpiry\":604800,\"maxJobDuration\":36000,\"minJobDuration\":60,\"fees\":{\"1\":[{\"feeToken\":\"0x123\",\"prices\":[{\"id\":\"cpu\",\"price\":1}]}]},\"free\":{\"maxJobDuration\":360000,\"minJobDuration\":60,\"maxJobs\":3,\"resources\":[{\"id\":\"cpu\",\"max\":1},{\"id\":\"ram\",\"max\":1},{\"id\":\"disk\",\"max\":1}]}}]" + + REPLACE_STR="DOCKER_COMPUTE_ENVIRONMENTS='$DOCKER_COMPUTE_ENV'" + if [ "$(uname)" == "Darwin" ]; then + sed -i '' -e "s;DOCKER_COMPUTE_ENVIRONMENTS=;$REPLACE_STR;" "$env_file_path" + else + sed -i -e "s;DOCKER_COMPUTE_ENVIRONMENTS=;$REPLACE_STR;" "$env_file_path" + fi + echo "Compute environment successfully configured!" +fi +echo "------------------------------------------------------------------------------" + if [ $created_pk_file -eq 1 ]; then read -p "Do you want me to delete the generated $pk_file file? (your key is already saved): [ y/n ]" delete_pk_file delete_pk_file=${delete_pk_file:-n} diff --git a/src/index.ts b/src/index.ts index 1796a87b9..532dc363d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,8 @@ import { OceanIndexer } from './components/Indexer/index.js' import { Database } from './components/database/index.js' import express, { Express } from 'express' import { OceanNode } from './OceanNode.js' +import { KeyManager } from './components/KeyManager/index.js' +import { BlockchainRegistry } from './components/BlockchainRegistry/index.js' import { httpRoutes } from './components/httpRoutes/index.js' import { getConfiguration, @@ -13,11 +15,12 @@ import { import { GENERIC_EMOJIS, LOG_LEVELS_STR } from './utils/logging/Logger.js' import fs from 'fs' +import https from 'https' import { OCEAN_NODE_LOGGER } from './utils/logging/common.js' import path from 'path' import { fileURLToPath } from 'url' import cors from 'cors' -import { scheduleCronJobs } from './utils/logging/logDeleteCron.js' +import { scheduleCronJobs } from './utils/cronjobs/scheduleCronJobs.js' import { requestValidator } from './components/httpRoutes/requestValidator.js' import { hasValidDBConfiguration } from './utils/database.js' @@ -33,6 +36,7 @@ declare global { // eslint-disable-next-line no-unused-vars interface Request { oceanNode: OceanNode + caller?: string | string[] } } } @@ -65,7 +69,6 @@ const isStartup: boolean = true // this is to avoid too much verbose logging, cause we're calling getConfig() from many parts // and we are always running though the same process.env checks // (we must start accessing the config from the OceanNode class only once we refactor) -console.log('\n\n\n\n') OCEAN_NODE_LOGGER.logMessageWithEmoji( '[ Starting Ocean Node ]', true, @@ -86,7 +89,10 @@ let node: OceanP2P = null let indexer = null let provider = null // If there is no DB URL only the nonce database will be available -const dbconn: Database = await new Database(config.dbConfig) +const dbconn: Database = await Database.init(config.dbConfig) +if (!dbconn) { + OCEAN_NODE_LOGGER.error('Database failed to initialize') +} if (!hasValidDBConfiguration(config.dbConfig)) { // once we create a database instance, we check the environment and possibly add the DB transport @@ -98,16 +104,21 @@ if (!hasValidDBConfiguration(config.dbConfig)) { ) } +// Create KeyManager and BlockchainRegistry +// KeyManager will determine provider type from config.keys.type and initialize in constructor +const keyManager = new KeyManager(config) +const blockchainRegistry = new BlockchainRegistry(keyManager, config) + if (config.hasP2P) { if (dbconn) { - node = new OceanP2P(config, dbconn) + node = new OceanP2P(config, keyManager, dbconn) } else { - node = new OceanP2P(config) + node = new OceanP2P(config, keyManager) } await node.start() } if (config.hasIndexer && dbconn) { - indexer = new OceanIndexer(dbconn, config.indexingNetworks) + indexer = new OceanIndexer(dbconn, config.indexingNetworks, blockchainRegistry) // if we set this var // it also loads initial data (useful for testing, or we might actually want to have a bootstrap list) // store and advertise DDOs @@ -126,8 +137,17 @@ if (dbconn) { } // Singleton instance across application -const oceanNode = OceanNode.getInstance(dbconn, node, provider, indexer) -oceanNode.addC2DEngines(config) +const oceanNode = OceanNode.getInstance( + config, + + dbconn, + node, + provider, + indexer, + keyManager, + blockchainRegistry +) +oceanNode.addC2DEngines() function removeExtraSlashes(req: any, res: any, next: any) { req.url = req.url.replace(/\/{2,}/g, '/') @@ -139,14 +159,13 @@ if (config.hasHttp) { app.use(express.raw({ limit: '25mb' })) app.use(cors()) - if (config.hasDashboard) { + if (config.hasControlPanel) { // Serve static files expected at the root, under the '/_next' path - app.use('/_next', express.static(path.join(__dirname, '/dashboard/_next'))) + app.use('/_next', express.static(path.join(__dirname, '/controlpanel/_next'))) - // Serve static files for Next.js under both '/dashboard' and '/controlpanel' - const dashboardPath = path.join(__dirname, '/dashboard') - app.use('/dashboard', express.static(dashboardPath)) - app.use('/controlpanel', express.static(dashboardPath)) + // Serve static files for Next.js under '/controlpanel' + const controlPanelPath = path.join(__dirname, '/controlpanel') + app.use('/controlpanel', express.static(controlPanelPath)) // Custom middleware for SPA routing: Serve index.html for non-static asset requests const serveIndexHtml = ( @@ -158,15 +177,14 @@ if (config.hasHttp) { return next() // Skip this middleware if the request is for a static asset } // For any other requests, serve index.html - res.sendFile(path.join(dashboardPath, 'index.html')) + res.sendFile(path.join(controlPanelPath, 'index.html')) } - app.use('/dashboard', serveIndexHtml) app.use('/controlpanel', serveIndexHtml) } app.use(requestValidator, (req, res, next) => { - oceanNode.setRemoteCaller(req.headers['x-forwarded-for'] || req.socket.remoteAddress) + req.caller = req.headers['x-forwarded-for'] || req.socket.remoteAddress req.oceanNode = oceanNode next() }) @@ -175,10 +193,28 @@ if (config.hasHttp) { app.use(removeExtraSlashes) app.use('/', httpRoutes) - app.listen(config.httpPort, () => { - OCEAN_NODE_LOGGER.logMessage(`HTTP port: ${config.httpPort}`, true) - }) + if (config.httpCertPath && config.httpKeyPath) { + try { + const options = { + cert: fs.readFileSync(config.httpCertPath), + key: fs.readFileSync(config.httpKeyPath) + } + https.createServer(options, app).listen(config.httpPort, () => { + OCEAN_NODE_LOGGER.logMessage(`HTTPS port: ${config.httpPort}`, true) + }) + } catch (err) { + OCEAN_NODE_LOGGER.error(`Error starting HTTPS server: ${err.message}`) + OCEAN_NODE_LOGGER.logMessage(`Falling back to HTTP`, true) + app.listen(config.httpPort, () => { + OCEAN_NODE_LOGGER.logMessage(`HTTP port: ${config.httpPort}`, true) + }) + } + } else { + app.listen(config.httpPort, () => { + OCEAN_NODE_LOGGER.logMessage(`HTTP port: ${config.httpPort}`, true) + }) + } // Call the function to schedule the cron job to delete old logs - scheduleCronJobs(dbconn) + scheduleCronJobs(oceanNode) } diff --git a/src/test/.env.test b/src/test/.env.test index ca1887f9b..e00a09e78 100644 --- a/src/test/.env.test +++ b/src/test/.env.test @@ -4,6 +4,8 @@ PRIVATE_KEY=0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58 RPCS='{ "8996": {"rpc": "http://127.0.0.1:8545", "chainId": 8996, "network": "development", "chunkSize": 100}}' INDEXER_NETWORKS='[8996]' DB_URL=http://localhost:9200 +DB_USERNAME=elastic +DB_PASSWORD=changeme IPFS_GATEWAY=https://ipfs.io/ ARWEAVE_GATEWAY=https://arweave.net/ NODE1_PRIVATE_KEY=0xcb345bd2b11264d523ddaf383094e2675c420a17511c3102a53817f13474a7ff diff --git a/src/test/.env.test2 b/src/test/.env.test2 new file mode 100644 index 000000000..8f16fafb8 --- /dev/null +++ b/src/test/.env.test2 @@ -0,0 +1,2 @@ +PRIVATE_KEY='0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58' +CONFIG_PATH="$HOME/config.json" diff --git a/src/test/config.json b/src/test/config.json new file mode 100644 index 000000000..c21b4aa2e --- /dev/null +++ b/src/test/config.json @@ -0,0 +1,172 @@ +{ + "authorizedDecrypters": [], + "authorizedDecryptersList": [], + "allowedValidators": [], + "allowedValidatorsList": [], + "authorizedPublishers": [], + "authorizedPublishersList": [], + "keys": {}, + "hasIndexer": true, + "hasHttp": true, + "hasP2P": true, + "p2pConfig": { + "bootstrapNodes": [], + "bootstrapTimeout": 20000, + "bootstrapTagName": "bootstrap", + "bootstrapTagValue": 50, + "bootstrapTTL": 0, + "enableIPV4": true, + "enableIPV6": true, + "ipV4BindAddress": "0.0.0.0", + "ipV4BindTcpPort": 8000, + "ipV4BindWsPort": 0, + "ipV6BindAddress": "::1", + "ipV6BindTcpPort": 0, + "ipV6BindWsPort": 0, + "announceAddresses": [], + "pubsubPeerDiscoveryInterval": 10000, + "dhtMaxInboundStreams": 500, + "dhtMaxOutboundStreams": 500, + "dhtFilter": null, + "mDNSInterval": 20000, + "connectionsMaxParallelDials": 15, + "connectionsDialTimeout": 30000, + "upnp": true, + "autoNat": true, + "enableCircuitRelayServer": false, + "enableCircuitRelayClient": false, + "circuitRelays": 0, + "announcePrivateIp": false, + "filterAnnouncedAddresses": [ + "127.0.0.0/8", + "10.0.0.0/8", + "172.16.0.0/12", + "192.168.0.0/16", + "100.64.0.0/10", + "169.254.0.0/16", + "192.0.0.0/24", + "192.0.2.0/24", + "198.51.100.0/24", + "203.0.113.0/24", + "224.0.0.0/4", + "240.0.0.0/4" + ], + "minConnections": 1, + "maxConnections": 300, + "autoDialPeerRetryThreshold": 7200000, + "autoDialConcurrency": 5, + "maxPeerAddrsToDial": 5, + "autoDialInterval": 5000, + "enableNetworkStats": false + }, + "hasControlPanel": true, + "httpPort": 8001, + "dbConfig": { + "url": "http://localhost:9200", + "username": "", + "password": "", + "dbType": "elasticsearch" + }, + "supportedNetworks": { + "8996": { + "rpc": "http://127.0.0.1:8545", + "chainId": 8996, + "network": "development", + "chunkSize": 100 + } + }, + "indexingNetworks": [8996], + "feeStrategy": {}, + "c2dClusters": [], + "c2dNodeUri": "", + "accountPurgatoryUrl": "", + "assetPurgatoryUrl": "", + "allowedAdmins": [], + "allowedAdminsList": [], + "rateLimit": 30, + "maxConnections": 30, + "denyList": { + "peers": [], + "ips": [] + }, + "unsafeURLs": [], + "isBootstrap": false, + "claimDurationTimeout": 600, + "validateUnsignedDDO": true, + "jwtSecret": "ocean-node-secret", + "dockerComputeEnvironments": [ + { + "socketPath": "/var/run/docker.sock", + "resources": [ + { + "id": "disk", + "total": 1000000000 + } + ], + "storageExpiry": 604800, + "maxJobDuration": 3600, + "minJobDuration": 60, + "fees": { + "11155111": [ + { + "feeToken": "0x1B083D8584dd3e6Ff37d04a6e7e82b5F622f3985", + "prices": [ + { + "id": "cpu", + "price": 1 + } + ] + }, + { + "feeToken": "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", + "prices": [ + { + "id": "cpu", + "price": 1 + } + ] + } + ], + "11155420": [ + { + "feeToken": "0xf26c6C93f9f1d725e149d95f8E7B2334a406aD10", + "prices": [ + { + "id": "cpu", + "price": 1 + } + ] + }, + { + "feeToken": "0x4200000000000000000000000000000000000006", + "prices": [ + { + "id": "cpu", + "price": 1 + } + ] + } + ] + }, + "free": { + "maxJobDuration": 3600, + "minJobDuration": 60, + "maxJobs": 3, + "resources": [ + { + "id": "cpu", + "max": 1 + }, + { + "id": "ram", + "max": 1000000000 + }, + { + "id": "disk", + "max": 1000000000 + } + ] + } + } + ] +} diff --git a/src/test/data/assets.ts b/src/test/data/assets.ts index 476b78850..532415d48 100644 --- a/src/test/data/assets.ts +++ b/src/test/data/assets.ts @@ -1,4 +1,5 @@ -import { Credentials } from '../../@types/DDO/Credentials' +import { Credentials } from '@oceanprotocol/ddo-js' +import { CREDENTIALS_TYPES } from '../../@types/DDO/Credentials.js' export const downloadAsset = { '@context': ['https://w3id.org/did/v1'], @@ -10,19 +11,17 @@ export const downloadAsset = { created: '2021-12-20T14:35:20Z', updated: '2021-12-20T14:35:20Z', type: 'dataset', - name: 'cli fixed asset', - description: 'asset published using ocean.js cli tool', + name: 'downloadAsset', + description: 'download asset with no credentials', tags: ['test'], author: 'oceanprotocol', license: 'https://market.oceanprotocol.com/terms', - additionalInformation: { - termsAndConditions: true - } + additionalInformation: { termsAndConditions: true } }, services: [ { id: 'ccb398c50d6abd5b456e8d7242bd856a1767a890b537c2f8c10ba8b8a10e6025', - type: 'download', + type: 'access', files: { files: [ { @@ -47,42 +46,54 @@ export const downloadAsset = { owner: '', created: '' }, - purgatory: { - state: false - }, - datatokens: [] as any, - stats: { - allocated: 0, - orders: 0, - price: { - value: '0' - } - } + stats: { orders: 0, price: { value: '0' } }, + purgatory: { state: false }, + datatokens: [] as any } const nftLevelCredentials: Credentials = { + match_allow: 'any', allow: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: ['0xBE5449a6A97aD46c8558A3356267Ee5D2731ab5e'] }, { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: ['0xA78deb2Fa79463945C247991075E2a0e98Ba7A09'] } ], deny: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, + values: ['0x02354A1F160A3fd7ac8b02ee91F04104440B28E7'] + } + ] +} +const nftLevelCredentialsWithMatchAll: Credentials = { + allow: [ + { + type: CREDENTIALS_TYPES.ADDRESS, + values: ['0xBE5449a6A97aD46c8558A3356267Ee5D2731ab5e'] + }, + { + type: CREDENTIALS_TYPES.ADDRESS, + values: ['0xA78deb2Fa79463945C247991075E2a0e98Ba7A09'] + } + ], + deny: [ + { + type: CREDENTIALS_TYPES.ADDRESS, values: ['0x02354A1F160A3fd7ac8b02ee91F04104440B28E7'] } ] } const serviceLevelCredentials: Credentials = { + allow: [], deny: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: ['0xA78deb2Fa79463945C247991075E2a0e98Ba7A09'] } ] @@ -93,25 +104,23 @@ export const downloadAssetWithCredentials = { id: '', nftAddress: '', version: '4.1.0', - chainId: 80001, + chainId: 8996, metadata: { created: '2021-12-20T14:35:20Z', updated: '2021-12-20T14:35:20Z', type: 'dataset', - name: 'cli fixed asset', - description: 'asset published using ocean.js cli tool', + name: 'downloadAssetWithCredentials', + description: 'asset with credentials match any', tags: ['test'], author: 'oceanprotocol', license: 'https://market.oceanprotocol.com/terms', - additionalInformation: { - termsAndConditions: true - } + additionalInformation: { termsAndConditions: true } }, credentials: nftLevelCredentials, services: [ { id: 'ccb398c50d6abd5b456e8d7242bd856a1767a890b537c2f8c10ba8b8a10e6025', - type: 'download', + type: 'access', files: { files: [ { @@ -137,41 +146,84 @@ export const downloadAssetWithCredentials = { owner: '', created: '' }, - purgatory: { - state: false - }, + purgatory: { state: false }, datatokens: [] as any, - stats: { - allocated: 0, - orders: 0, - price: { - value: '0' - } - } + stats: { allocated: 0, orders: 0, price: { value: '0' } } } -export const computeAsset = { +export const downloadAssetWithCredentialsWithMatchAll = { '@context': ['https://w3id.org/did/v1'], id: '', nftAddress: '', version: '4.1.0', - chainId: 80001, + chainId: 8996, metadata: { created: '2021-12-20T14:35:20Z', updated: '2021-12-20T14:35:20Z', type: 'dataset', - name: 'cli fixed asset', - description: 'asset published using ocean.js cli tool', + name: 'downloadAssetWithCredentialsWithMatchAll', + description: 'asset with credentials match all', tags: ['test'], author: 'oceanprotocol', license: 'https://market.oceanprotocol.com/terms', - additionalInformation: { - termsAndConditions: true + additionalInformation: { termsAndConditions: true } + }, + credentials: nftLevelCredentialsWithMatchAll, + services: [ + { + id: 'ccb398c50d6abd5b456e8d7242bd856a1767a890b537c2f8c10ba8b8a10e6025', + type: 'access', + files: { + files: [ + { + type: 'url', + url: 'https://raw.githubusercontent.com/oceanprotocol/testdatasets/main/shs_dataset_test.txt', + method: 'GET' + } + ] + }, + credentials: serviceLevelCredentials, + datatokenAddress: '', + serviceEndpoint: 'https://v4.provider.oceanprotocol.com', + timeout: 86400 } + ], + event: {}, + nft: { + address: '', + name: 'Ocean Data NFT', + symbol: 'OCEAN-NFT', + state: 5, + tokenURI: '', + owner: '', + created: '' }, + purgatory: { state: false }, + datatokens: [] as any, + stats: { allocated: 0, orders: 0, price: { value: '0' } } +} + +export const computeAssetWithCredentials = { + '@context': ['https://w3id.org/did/v1'], + id: '', + nftAddress: '', + version: '4.1.0', + chainId: 8996, + metadata: { + created: '2021-12-20T14:35:20Z', + updated: '2021-12-20T14:35:20Z', + type: 'dataset', + name: 'computeAssetWithCredentials', + description: 'compute asset with credentials match any', + tags: ['test'], + author: 'oceanprotocol', + license: 'https://market.oceanprotocol.com/terms', + additionalInformation: { termsAndConditions: true } + }, + credentials: nftLevelCredentials, services: [ { - id: '1155995dda741e93afe4b1c6ced2d01734a6ec69865cc0997daf1f4db7259a36', + id: 'ccb398c50d6abd5b456e8d7242bd856a1767a890b537c2f8c10ba8b8a10e6025', type: 'compute', files: { files: [ @@ -182,14 +234,17 @@ export const computeAsset = { } ] }, + credentials: serviceLevelCredentials, datatokenAddress: '', serviceEndpoint: 'https://v4.provider.oceanprotocol.com', timeout: 86400, compute: { allowRawAlgorithm: false, allowNetworkAccess: true, - publisherTrustedAlgorithmPublishers: [] as any, - publisherTrustedAlgorithms: [] as any + publisherTrustedAlgorithmPublishers: ['*'] as any, + publisherTrustedAlgorithms: [ + { did: '*', filesChecksum: '*', containerSectionChecksum: '*' } + ] as any } } ], @@ -203,36 +258,26 @@ export const computeAsset = { owner: '', created: '' }, - purgatory: { - state: false - }, + purgatory: { state: false }, datatokens: [] as any, - stats: { - allocated: 0, - orders: 0, - price: { - value: '0' - } - } + stats: { allocated: 0, orders: 0, price: { value: '0' } } } -export const algoAsset = { +export const algoAssetWithCredentials = { '@context': ['https://w3id.org/did/v1'], id: '', nftAddress: '', version: '4.1.0', - chainId: 137, + chainId: 8996, metadata: { created: '2023-08-01T17:09:39Z', updated: '2023-08-01T17:09:39Z', type: 'algorithm', - name: 'CLi Algo', - description: 'Cli algo', + name: 'algoAssetWithCredentials', + description: 'algo asset with credentials', author: 'OPF', license: 'https://market.oceanprotocol.com/terms', - additionalInformation: { - termsAndConditions: true - }, + additionalInformation: { termsAndConditions: true }, algorithm: { language: '', version: '0.1', @@ -245,6 +290,7 @@ export const algoAsset = { } } }, + credentials: nftLevelCredentials, services: [ { id: 'db164c1b981e4d2974e90e61bda121512e6909c1035c908d68933ae4cfaba6b0', @@ -252,14 +298,122 @@ export const algoAsset = { files: { files: [ { + type: 'url', + method: 'GET', url: 'https://raw.githubusercontent.com/oceanprotocol/test-algorithm/master/javascript/algo.js', contentType: 'text/js', encoding: 'UTF-8' } ] }, + credentials: serviceLevelCredentials, + timeout: 86400, + serviceEndpoint: 'https://v4.provider.oceanprotocol.com' + } + ], + stats: { allocated: 0, orders: 0, price: { value: '0' } }, + nft: { + address: '', + name: 'Ocean Data NFT', + symbol: 'OCEAN-NFT', + state: 5, + tokenURI: '', + owner: '', + created: '' + } +} + +export const computeAsset = { + '@context': ['https://w3id.org/did/v1'], + id: '', + nftAddress: '', + version: '4.1.0', + chainId: 8996, + metadata: { + created: '2021-12-20T14:35:20Z', + updated: '2021-12-20T14:35:20Z', + type: 'dataset', + name: 'computeAsset', + description: 'compute asset with no credentials', + tags: ['test'], + author: 'oceanprotocol', + license: 'https://market.oceanprotocol.com/terms', + additionalInformation: { termsAndConditions: true } + }, + services: [ + { + id: '1155995dda741e93afe4b1c6ced2d01734a6ec69865cc0997daf1f4db7259a36', + type: 'compute', + files: { + files: [ + { + type: 'url', + url: 'https://raw.githubusercontent.com/oceanprotocol/testdatasets/main/shs_dataset_test.txt', + method: 'GET' + } + ] + }, + datatokenAddress: '', + serviceEndpoint: 'https://v4.provider.oceanprotocol.com', timeout: 86400, + compute: { + allowRawAlgorithm: false, + allowNetworkAccess: true, + publisherTrustedAlgorithmPublishers: ['*'] as any, + publisherTrustedAlgorithms: [ + { did: '*', filesChecksum: '*', containerSectionChecksum: '*' } + ] as any + } + } + ], + event: {}, + nft: { + address: '', + name: 'Ocean Data NFT', + symbol: 'OCEAN-NFT', + state: 5, + tokenURI: '', + owner: '', + created: '' + }, + purgatory: { state: false }, + datatokens: [] as any, + stats: { allocated: 0, orders: 0, price: { value: '0' } } +} + +export const computeAssetWithNoAccess = { + '@context': ['https://w3id.org/did/v1'], + id: '', + nftAddress: '', + version: '4.1.0', + chainId: 8996, + metadata: { + created: '2021-12-20T14:35:20Z', + updated: '2021-12-20T14:35:20Z', + type: 'dataset', + name: 'computeAssetWithNoAccess', + description: 'compute asset with no access', + tags: ['test'], + author: 'oceanprotocol', + license: 'https://market.oceanprotocol.com/terms', + additionalInformation: { termsAndConditions: true } + }, + services: [ + { + id: '1155995dda741e93afe4b1c6ced2d01734a6ec69865cc0997daf1f4db7259a36', + type: 'compute', + files: { + files: [ + { + type: 'url', + url: 'https://raw.githubusercontent.com/oceanprotocol/testdatasets/main/shs_dataset_test.txt', + method: 'GET' + } + ] + }, + datatokenAddress: '', serviceEndpoint: 'https://v4.provider.oceanprotocol.com', + timeout: 86400, compute: { allowRawAlgorithm: false, allowNetworkAccess: true, @@ -268,13 +422,68 @@ export const algoAsset = { } } ], - stats: { - allocated: 0, - orders: 0, - price: { - value: '0' + event: {}, + nft: { + address: '', + name: 'Ocean Data NFT', + symbol: 'OCEAN-NFT', + state: 5, + tokenURI: '', + owner: '', + created: '' + }, + purgatory: { state: false }, + datatokens: [] as any, + stats: { allocated: 0, orders: 0, price: { value: '0' } } +} + +export const algoAsset = { + '@context': ['https://w3id.org/did/v1'], + id: '', + nftAddress: '', + version: '4.1.0', + chainId: 8996, + metadata: { + created: '2023-08-01T17:09:39Z', + updated: '2023-08-01T17:09:39Z', + type: 'algorithm', + name: 'algoAsset', + description: 'algoAsset', + author: 'OPF', + license: 'https://market.oceanprotocol.com/terms', + additionalInformation: { termsAndConditions: true }, + algorithm: { + language: '', + version: '0.1', + container: { + entrypoint: 'node $ALGO', + image: 'node', + tag: 'latest', + checksum: + 'sha256:1155995dda741e93afe4b1c6ced2d01734a6ec69865cc0997daf1f4db7259a36' + } } }, + services: [ + { + id: 'db164c1b981e4d2974e90e61bda121512e6909c1035c908d68933ae4cfaba6b0', + type: 'access', + files: { + files: [ + { + type: 'url', + method: 'GET', + url: 'https://raw.githubusercontent.com/oceanprotocol/test-algorithm/master/javascript/algo.js', + contentType: 'text/js', + encoding: 'UTF-8' + } + ] + }, + timeout: 86400, + serviceEndpoint: 'https://v4.provider.oceanprotocol.com' + } + ], + stats: { allocated: 0, orders: 0, price: { value: '0' } }, nft: { address: '', name: 'Ocean Data NFT', @@ -285,3 +494,96 @@ export const algoAsset = { created: '' } } + +export const completeDBComputeJob = { + owner: '0x6c957a45C801035d3297d43d0Ce83a237Ec5E0d1', + did: '', + jobId: '34aa4e7e-ce41-4547-b3e1-57aa1a7f97e6', + dateCreated: '1732720690.68', + dateFinished: '', + status: 70, + statusText: 'Job finished', + results: '', + inputDID: '', + algoDID: '', + agreementId: '0x56e2a0a9a6abcadac403dddc59858a5caf51ac286b401c811655b0235cd45da6', + expireTimestamp: 1732721290.68, + environment: '0x46f61c90309fcffa02e887e1a8a1ebdfeabe4f1ff279e306de2803df36bd46f7-free', + clusterHash: '0x3e072d2ac72e9ad87fed5a913caea960c89dfad85d447cbbc92c32457f0413e1', + configlogURL: '', + publishlogURL: '', + algologURL: '', + outputsURL: '', + stopRequested: false, + algorithm: { + documentId: 'did:op:39d9c2a7536865f9516b9f84432a624e25c8bb3e482de113ac9919af7d7a4866', + serviceId: 'db164c1b981e4d2974e90e61bda121512e6909c1035c908d68933ae4cfaba6b0', + meta: { language: '', version: '0.1', container: [Object] }, + transferTxId: '0x5c946d52cdd1623061330f455d4cb6d5898770987baa6539bda851d6c537cf6e' + }, + assets: [ + { + documentId: + 'did:op:ae13ce05f05457c041b013f41bf51400863eb5f387ba34e1b076f1f832a68071', + serviceId: 'ccb398c50d6abd5b456e8d7242bd856a1767a890b537c2f8c10ba8b8a10e6025', + transferTxId: '0xf14e89d0f0a80bf55392430e7479cac5eca6ed453e7b3ead99ab3c9820c9a411' + } + ], + isRunning: false, + isStarted: false, + containerImage: + 'node@sha256:1155995dda741e93afe4b1c6ced2d01734a6ec69865cc0997daf1f4db7259a36' +} + +export const dockerImageManifest = { + schemaVersion: 2, + mediaType: 'application/vnd.docker.distribution.manifest.v2+json', + config: { + mediaType: 'application/vnd.docker.container.image.v1+json', + size: 7286, + digest: 'sha256:386e0be86bde5eff9f85ea9eda02727dd4641664d746688b4049f79ef0cdb1c9' + }, + platform: { architecture: 'amd64', os: 'linux' }, + layers: [ + { + mediaType: 'application/vnd.docker.image.rootfs.diff.tar.gzip', + size: 49557601, + digest: 'sha256:167b8a53ca4504bc6aa3182e336fa96f4ef76875d158c1933d3e2fa19c57e0c3' + }, + { + mediaType: 'application/vnd.docker.image.rootfs.diff.tar.gzip', + size: 24030522, + digest: 'sha256:b47a222d28fa95680198398973d0a29b82a968f03e7ef361cc8ded562e4d84a3' + }, + { + mediaType: 'application/vnd.docker.image.rootfs.diff.tar.gzip', + size: 64112257, + digest: 'sha256:debce5f9f3a9709885f7f2ad3cf41f036a3b57b406b27ba3a883928315787042' + }, + { + mediaType: 'application/vnd.docker.image.rootfs.diff.tar.gzip', + size: 211039785, + digest: 'sha256:1d7ca7cd2e066ae77ac6284a9d027f72a31a02a18bfc2a249ef2e7b01074338b' + }, + { + mediaType: 'application/vnd.docker.image.rootfs.diff.tar.gzip', + size: 3371, + digest: 'sha256:94c7791033e87c3ab82bf56f778253138bbd5caf172ead6fc0ce39d459560607' + }, + { + mediaType: 'application/vnd.docker.image.rootfs.diff.tar.gzip', + size: 47856943, + digest: 'sha256:72ab0dfaf5cb14ab09fd3478f8a01e3c3e21b7ad06e7b04ccac2f304d455ff45' + }, + { + mediaType: 'application/vnd.docker.image.rootfs.diff.tar.gzip', + size: 2280920, + digest: 'sha256:3316ed2852d408595e2dfc601d96f39f4a39747bd1eb2eb1b63b1f3d49c42919' + }, + { + mediaType: 'application/vnd.docker.image.rootfs.diff.tar.gzip', + size: 451, + digest: 'sha256:ef5505406bea98d0f6adb559b937c0dad0aef6d98500b1120c6e27c50fdf172b' + } + ] +} diff --git a/src/test/data/commands.ts b/src/test/data/commands.ts new file mode 100644 index 000000000..af0ab7a38 --- /dev/null +++ b/src/test/data/commands.ts @@ -0,0 +1,31 @@ +export const freeComputeStartPayload = { + command: 'freeStartCompute', + consumerAddress: '0xeB5ae11175008E8f178d57d0152678a863FbB887', + environment: '', + nonce: '1', + signature: '0x123', + datasets: [ + { + fileObject: { + type: 'url', + url: 'https://raw.githubusercontent.com/oceanprotocol/ocean-cli/refs/heads/main/metadata/simpleComputeDataset.json', + method: 'GET' + } + } + ], + algorithm: { + fileObject: { + type: 'url', + url: 'https://raw.githubusercontent.com/oceanprotocol/ocean-cli/refs/heads/main/metadata/pythonAlgo.json', + method: 'GET' + }, + meta: { + container: { + image: 'my-compute-test', + tag: 'latest', + entrypoint: 'python $ALGO', + checksum: 'my-compute-checksum' + } + } + } +} diff --git a/src/test/data/ddo.ts b/src/test/data/ddo.ts index cc624b7f4..ff8cf1a3c 100644 --- a/src/test/data/ddo.ts +++ b/src/test/data/ddo.ts @@ -1,24 +1,35 @@ export const ddo = { hashType: 'sha256', '@context': ['https://w3id.org/did/v1'], - id: 'did:op:fa0e8fa9550e8eb13392d6eeb9ba9f8111801b332c8d2345b350b3bc66b379d7', - nftAddress: '0xBB1081DbF3227bbB233Db68f7117114baBb43656', + id: 'did:op:b5ef03b7f0d148cde2942c8a330625d4fc71dd32b67a0093da24fcb9a4439887', + nftAddress: '0xca63894B1c911515F1C034BE3509AfC008B42d83', version: '4.1.0', chainId: 137, metadata: { created: '2022-12-30T08:40:06Z', updated: '2022-12-30T08:40:06Z', type: 'dataset', - name: 'DEX volume in details', + name: 'ETH/USDT orderbook', description: - 'Volume traded and locked of Decentralized Exchanges (Uniswap, Sushiswap, Curve, Balancer, ...), daily in details', - tags: ['index', 'defi', 'tvl'], - author: 'DEX', + 'Real time ETH/USDT orderbook\n\nTo take the bid orders, access data.bids array\nTo take the ask orders, access data.asks array\n\nResponse schema:\n\n```json\n{\n "code":"200000",\n "data":\n {\n "time":1665865828392,\n "sequence":"357821345",\n "bids":\n [\n ["1280","0.00078381"],\n ["1279.9","0.02901545"],\n ....\n ],\n "asks":\n [\n ["1280.2","0.0288382"],\n ["1280.3","0.00167897"],\n ...\n ]\n }\n}\n```\n\nAccess is permited for 1 day after buying.', + tags: ['defi', 'orderbook'], + author: '0x4Ab0C24005c410111e21aE16Df5e19180fAD0f6a', license: 'https://market.oceanprotocol.com/terms', additionalInformation: { termsAndConditions: true } - } + }, + services: [ + { + id: '24654b91482a3351050510ff72694d88edae803cf31a5da993da963ba0087648', + type: 'access', + files: + '0x04beba2f90639ff7559618160df5a81729904022578e6bd5f60c3bebfe5cb2aca59d7e062228a98ed88c4582c290045f47cdf3824d1c8bb25b46b8e10eb9dc0763ce82af826fd347517011855ce1396ac94af8cc6f29b78012b679cb78a594d9064b6f6f4a8229889f0bb53262b6ab62b56fa5c608ea126ba228dd0f87290c0628fe07023416280c067beb01a42d0a4df95fdb5a857f1f59b3e6a13b0ae4619080369ba5bede6c7beff6afc7fc31c71ed8100e7817d965d1f8f1abfaace3c01f0bd5d0127df308175941088a1f120a4d9a0290be590d65a7b4de01ae1efe24286d7a06fadeeafba83b5eab25b90961abf1f24796991f06de6c8e1c2357fbfb31f484a94e87e7dba80a489e12fffa1adde89f113b4c8c4c8877914911a008dbed0a86bdd9d14598c35894395fb4a8ea764ed2f9459f6acadac66e695b3715536338f6cdee616b721b0130f726c78ca60ec02fc86c', + datatokenAddress: '0xfF4AE9869Cafb5Ff725f962F3Bbc22Fb303A8aD8', + serviceEndpoint: 'https://v4.provider.polygon.oceanprotocol.com', + timeout: 0 + } + ] } export const genericAlgorithm = { '@context': ['https://w3id.org/did/v1'], @@ -352,6 +363,122 @@ export const ddov7 = { ] } +export const ddoEOPV5 = { + '@context': ['https://www.w3.org/ns/credentials/v2'], + version: '5.0.0', + id: 'did:ope:fa0e8fa9550e8eb13392d6eeb9ba9f8111801b332c8d2345b350b3bc66b379d5', + credentialSubject: { + id: 'did:ope:fa0e8fa9550e8eb13392d6eeb9ba9f8111801b332c8d2345b350b3bc66b379d5', + metadata: { + created: '2024-10-03T14:35:20Z', + updated: '2024-10-03T14:35:20Z', + type: 'dataset', + name: 'DDO 5.0.0 Asset', + description: { + '@value': 'New asset published using ocean CLI tool with version 5.0.0', + '@language': 'en', + '@direction': 'ltr' + }, + copyrightHolder: 'Your Copyright Holder', + providedBy: 'Your Organization', + author: 'oceanprotocol', + license: { + name: 'https://market.oceanprotocol.com/terms' + }, + tags: ['version-5', 'new-schema'], + categories: ['data', 'ocean-protocol'], + additionalInformation: { + termsAndConditions: true + } + }, + services: [ + { + id: 'ccb398c50d6abd5b456e8d7242bd856a1767a890b537c2f8c10ba8b8a10e6025', + type: 'access', + name: 'Access Service', + description: { + '@value': 'Service for accessing the dataset', + '@language': 'en', + '@direction': 'ltr' + }, + datatokenAddress: '0xff4ae9869cafb5ff725f962f3bbc22fb303a8ad8', + nftAddress: '0xBB1081DbF3227bbB233Db68f7117114baBb43656', + serviceEndpoint: 'https://v4.provider.oceanprotocol.com', + files: + 'https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract10.xml.gz-rss.xml', + timeout: 86400, + compute: { + allowRawAlgorithm: false, + allowNetworkAccess: true + }, + state: 0, + credentials: [{}] + } + ], + credentials: { + allow: { + request_credentials: [ + { + type: 'VerifiableId', + format: 'jwt_vc_json' + }, + { + type: 'ProofOfResidence', + format: 'jwt_vc_json' + }, + { + type: 'OpenBadgeCredential', + format: 'jwt_vc_json', + policies: ['signature'] + } + ] + } + }, + event: { + txid: '0xceb617f13a8db82ba9ef24efcee72e90d162915fd702f07ac6012427c31ac952', + block: 39326976, + from: '0x0DB823218e337a6817e6D7740eb17635DEAdafAF', + contract: '0xBB1081DbF3227bbB233Db68f7117114baBb43656', + datetime: '2023-02-15T16:42:22' + }, + nft: { + address: '0xBB1081DbF3227bbB233Db68f7117114baBb43656', + name: 'Ocean Data NFT', + symbol: 'OCEAN-NFT', + state: 0, + tokenURI: + 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDpmYTBlOGZhOTU1MGU4ZWIxMzM5MmQ2ZWViOWJhOWY4MTExODAxYjMzMmM4ZDIzNDViMzUwYjNiYzY2YjM3OWQ1IiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmZhMGU4ZmE5NTUwZThlYjEzMzkyZDZlZWI5YmE5ZjgxMTE4MDFiMzMyYzhkMjM0NWIzNTBiM2JjNjZiMzc5ZDUiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIzQzEzLDIwIDI3LDE4IDM3LDE4QzQ2LDE3IDUyLDE4IDYyLDIwQzcxLDIxIDg1LDI0IDk5LDI3TDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw1MkMxMSw0OCAyMyw0NCAzMyw0NEM0Miw0MyA1MCw0NSA2MSw0OEM3MSw1MCA4NSw1MiA5OSw1NUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDcyQzgsNzMgMTcsNzUgMjksNzZDNDAsNzYgNTMsNzYgNjYsNzdDNzgsNzcgODgsNzcgOTksNzhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9', + owner: '0x0DB823218e337a6817e6D7740eb17635DEAdafAF', + created: '2022-12-30T08:40:43' + }, + purgatory: { + state: false + }, + datatokens: [ + { + address: '0xfF4AE9869Cafb5Ff725f962F3Bbc22Fb303A8aD8', + name: 'Boorish Fish Token', + symbol: 'BOOFIS-23', + serviceId: '24654b91482a3351050510ff72694d88edae803cf31a5da993da963ba0087648' + } + ], + stats: { + allocated: 5211144, + orders: 36, + price: { + value: 1000, + tokenAddress: '0x282d8efCe846A88B159800bd4130ad77443Fa1A1', + tokenSymbol: 'mOCEAN' + } + }, + chainId: 137, + nftAddress: '0xBB1081DbF3227bbB233Db68f7117114baBb43656' + }, + issuer: 'did:op:issuer-did', + type: ['VerifiableCredential'], + additionalDdos: [{ type: '', data: '' }] +} + export const publishAlgoDDO = { '@context': ['https://w3id.org/did/v1'], id: '', diff --git a/src/test/integration/accessLists.test.ts b/src/test/integration/accessLists.test.ts new file mode 100644 index 000000000..fe901f65e --- /dev/null +++ b/src/test/integration/accessLists.test.ts @@ -0,0 +1,200 @@ +import { + buildEnvOverrideConfig, + getMockSupportedNetworks, + OverrideEnvConfig, + setupEnvironment, + tearDownEnvironment, + TEST_ENV_CONFIG_FILE +} from '../utils/utils.js' +import { JsonRpcProvider, Signer } from 'ethers' +import { BlockchainRegistry } from '../../components/BlockchainRegistry/index.js' +import { Blockchain } from '../../utils/blockchain.js' +import { RPCS, SupportedNetwork } from '../../@types/blockchain.js' +import { DEVELOPMENT_CHAIN_ID } from '../../utils/address.js' +import { ENVIRONMENT_VARIABLES } from '../../utils/constants.js' +import { deployAndGetAccessListConfig, EXISTING_ACCESSLISTS } from '../utils/contracts.js' +import { AccessListContract, OceanNodeConfig } from '../../@types/OceanNode.js' +import { homedir } from 'os' +import { getConfiguration } from '../../utils/config.js' +import { assert, expect } from 'chai' +import { checkAddressOnAccessList } from '../../utils/accessList.js' +import { KeyManager } from '../../components/KeyManager/index.js' + +describe('Should deploy some accessLists before all other tests.', () => { + let config: OceanNodeConfig + let provider: JsonRpcProvider + const mockSupportedNetworks: RPCS = getMockSupportedNetworks() + + let previousConfiguration: OverrideEnvConfig[] + + let blockchain: Blockchain + // let contractAcessList: Contract + let owner: Signer + + let wallets: Signer[] = [] + + let allAccessListsDefinitions: AccessListContract[] = [] + + before(async () => { + provider = new JsonRpcProvider('http://127.0.0.1:8545') + config = await getConfiguration() // Force reload the configuration + + wallets = [ + (await provider.getSigner(0)) as Signer, + (await provider.getSigner(1)) as Signer, + (await provider.getSigner(2)) as Signer, + (await provider.getSigner(3)) as Signer + ] + + const rpcs: RPCS = config.supportedNetworks + const chain: SupportedNetwork = rpcs[String(DEVELOPMENT_CHAIN_ID)] + const keyManager = new KeyManager(config) + const blockchains = new BlockchainRegistry(keyManager, config) + blockchain = blockchains.getBlockchain(chain.chainId) + + owner = await blockchain.getSigner() + + // ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS_LIST + const accessListPublishers = await deployAndGetAccessListConfig( + owner, + provider, + wallets + ) + EXISTING_ACCESSLISTS.set( + ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS_LIST.name, + accessListPublishers + ) + const accessListValidators = await deployAndGetAccessListConfig( + owner, + provider, + wallets + ) + // ENVIRONMENT_VARIABLES.ALLOWED_VALIDATORS_LIST + EXISTING_ACCESSLISTS.set( + ENVIRONMENT_VARIABLES.ALLOWED_VALIDATORS_LIST.name, + accessListValidators + ) + + const accessListDecrypters = await deployAndGetAccessListConfig( + owner, + provider, + wallets + ) + // ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS_LIST + EXISTING_ACCESSLISTS.set( + ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS_LIST.name, + accessListDecrypters + ) + + // put them all here + allAccessListsDefinitions = [ + accessListPublishers, + accessListValidators, + accessListDecrypters + ] + + // override and save configuration (always before calling getConfig()) + previousConfiguration = await setupEnvironment( + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.RPCS, + ENVIRONMENT_VARIABLES.INDEXER_NETWORKS, + ENVIRONMENT_VARIABLES.PRIVATE_KEY, + ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS, + ENVIRONMENT_VARIABLES.ALLOWED_ADMINS, + ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS, + ENVIRONMENT_VARIABLES.ADDRESS_FILE, + // ACCESS_LISTS + ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS_LIST, + ENVIRONMENT_VARIABLES.ALLOWED_VALIDATORS_LIST, + ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS_LIST + ], + [ + JSON.stringify(mockSupportedNetworks), + JSON.stringify([8996]), + '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', + JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), + JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), + JSON.stringify([ + await owner.getAddress() // the node + ]), + `${homedir}/.ocean/ocean-contracts/artifacts/address.json`, + JSON.stringify( + EXISTING_ACCESSLISTS.get( + ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS_LIST.name + ) + ), + JSON.stringify( + EXISTING_ACCESSLISTS.get(ENVIRONMENT_VARIABLES.ALLOWED_VALIDATORS_LIST.name) + ), + JSON.stringify( + EXISTING_ACCESSLISTS.get( + ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS_LIST.name + ) + ) + ] + ) + ) + + config = await getConfiguration() + }) + + it('should have some access lists', () => { + expect(EXISTING_ACCESSLISTS.size > 0, 'Should have at least 1 accessList') + }) + + it(`should have ${ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS_LIST.name} access lists`, () => { + assert( + config.authorizedPublishersList !== null, + `${ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS_LIST.name} accessList is not defined` + ) + console.log(config.authorizedPublishersList) + }) + + it(`should have ${ENVIRONMENT_VARIABLES.ALLOWED_VALIDATORS_LIST.name} access lists`, () => { + assert( + config.allowedValidatorsList !== null, + `${ENVIRONMENT_VARIABLES.ALLOWED_VALIDATORS_LIST.name} accessList is not defined` + ) + console.log(config.allowedValidatorsList) + }) + + it(`should have ${ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS_LIST.name} access lists`, () => { + assert( + config.authorizedPublishersList !== null, + `${ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS_LIST.name} accessList is not defined` + ) + console.log(config.authorizedPublishersList) + }) + + it('should check if wallets are on accessList (with Access)', async function () { + for (let z = 0; z < allAccessListsDefinitions.length; z++) { + const accessListAddress = allAccessListsDefinitions[z][DEVELOPMENT_CHAIN_ID][0] // we have only 1 accesslist per config + for (let i = 0; i < wallets.length; i++) { + const account = await wallets[i].getAddress() + expect( + (await checkAddressOnAccessList(accessListAddress, account, owner)) === true, + `Address ${account} has no balance on Access List ${accessListAddress}, so its not Authorized` + ) + } + } + }) + + it('should check that wallets are NOT on accessList (without Access)', async function () { + for (let z = 0; z < allAccessListsDefinitions.length; z++) { + const accessListAddress = allAccessListsDefinitions[z][DEVELOPMENT_CHAIN_ID][0] // we have only 1 accesslist per config + for (let i = wallets.length; i < 4; i++) { + const account = await (await provider.getSigner(i)).getAddress() + expect( + (await checkAddressOnAccessList(accessListAddress, account, owner)) === false, + `Address ${account} should not be part Access List ${accessListAddress}, therefore its not Authorized` + ) + } + } + }) + + after(async () => { + await tearDownEnvironment(previousConfiguration) + }) +}) diff --git a/src/test/integration/algorithmsAccess.test.ts b/src/test/integration/algorithmsAccess.test.ts new file mode 100644 index 000000000..e80d1947d --- /dev/null +++ b/src/test/integration/algorithmsAccess.test.ts @@ -0,0 +1,499 @@ +import { expect, assert } from 'chai' +import { + ComputeGetEnvironmentsHandler, + ComputeInitializeHandler, + PaidComputeStartHandler +} from '../../components/core/compute/index.js' +import type { + PaidComputeStartCommand, + ComputeInitializeCommand +} from '../../@types/commands.js' +import type { + ComputeAsset, + ComputeAlgorithm, + ComputeEnvironment +} from '../../@types/C2D/C2D.js' +import { + ENVIRONMENT_VARIABLES, + EVENTS, + PROTOCOL_COMMANDS, + getConfiguration +} from '../../utils/index.js' +import { Database } from '../../components/database/index.js' +import { OceanNode } from '../../OceanNode.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { OceanIndexer } from '../../components/Indexer/index.js' +import { Readable } from 'stream' +import { waitToIndex } from './testUtils.js' +import { streamToObject } from '../../utils/util.js' +import { ethers, hexlify, JsonRpcProvider, Signer } from 'ethers' +import { publishAsset, orderAsset } from '../utils/assets.js' +import { algoAsset, computeAssetWithNoAccess } from '../data/assets.js' +import { RPCS } from '../../@types/blockchain.js' +import { + DEFAULT_TEST_TIMEOUT, + OverrideEnvConfig, + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig, + getMockSupportedNetworks, + setupEnvironment, + tearDownEnvironment +} from '../utils/utils.js' + +import { ProviderComputeInitializeResults } from '../../@types/Fees.js' +import { homedir } from 'os' +import { DEVELOPMENT_CHAIN_ID, getOceanArtifactsAdresses } from '../../utils/address.js' +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } +import OceanToken from '@oceanprotocol/contracts/artifacts/contracts/utils/OceanToken.sol/OceanToken.json' with { type: 'json' } +import EscrowJson from '@oceanprotocol/contracts/artifacts/contracts/escrow/Escrow.sol/Escrow.json' with { type: 'json' } +import { createHash } from 'crypto' +import { getAlgoChecksums } from '../../components/core/compute/utils.js' + +describe('Trusted algorithms Flow', () => { + let previousConfiguration: OverrideEnvConfig[] + let config: OceanNodeConfig + let dbconn: Database + let oceanNode: OceanNode + let provider: any + let publisherAccount: any + let consumerAccount: any + let computeEnvironments: any + let publishedComputeDataset: any + let publishedAlgoDataset: any + let jobId: string + let datasetOrderTxId: any + let algoOrderTxId: any + let paymentToken: any + let paymentTokenContract: any + let escrowContract: any + let indexer: OceanIndexer + // const now = new Date().getTime() / 1000 + const computeJobDuration = 60 * 15 // 15 minutes from now should be enough + let firstEnv: ComputeEnvironment + + const wallet = new ethers.Wallet( + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' + ) + // const chainId = DEVELOPMENT_CHAIN_ID + const mockSupportedNetworks: RPCS = getMockSupportedNetworks() + let artifactsAddresses: any + let initializeResponse: ProviderComputeInitializeResults + + before(async () => { + artifactsAddresses = getOceanArtifactsAdresses() + paymentToken = artifactsAddresses.development.Ocean + previousConfiguration = await setupEnvironment( + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.RPCS, + ENVIRONMENT_VARIABLES.INDEXER_NETWORKS, + ENVIRONMENT_VARIABLES.PRIVATE_KEY, + ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS, + ENVIRONMENT_VARIABLES.ADDRESS_FILE, + ENVIRONMENT_VARIABLES.DOCKER_COMPUTE_ENVIRONMENTS + ], + [ + JSON.stringify(mockSupportedNetworks), + JSON.stringify([DEVELOPMENT_CHAIN_ID]), + '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', + JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), + `${homedir}/.ocean/ocean-contracts/artifacts/address.json`, + '[{"socketPath":"/var/run/docker.sock","resources":[{"id":"disk","total":10}],"storageExpiry":604800,"maxJobDuration":3600,"minJobDuration":60,"fees":{"' + + DEVELOPMENT_CHAIN_ID + + '":[{"feeToken":"' + + paymentToken + + '","prices":[{"id":"cpu","price":1}]}]},"free":{"maxJobDuration":60, "minJobDuration":10, "maxJobs":3,"resources":[{"id":"cpu","max":1},{"id":"ram","max":1},{"id":"disk","max":1}]}}]' + ] + ) + ) + config = await getConfiguration(true) + dbconn = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance(config, dbconn, null, null, null) + indexer = new OceanIndexer( + dbconn, + config.indexingNetworks, + oceanNode.blockchainRegistry + ) + oceanNode.addIndexer(indexer) + oceanNode.addC2DEngines() + + provider = new JsonRpcProvider('http://127.0.0.1:8545') + publisherAccount = (await provider.getSigner(0)) as Signer + consumerAccount = (await provider.getSigner(1)) as Signer + paymentTokenContract = new ethers.Contract( + paymentToken, + OceanToken.abi, + publisherAccount + ) + escrowContract = new ethers.Contract( + artifactsAddresses.development.Escrow, + EscrowJson.abi, + publisherAccount + ) + }) + + it('Sets up compute envs', () => { + assert(oceanNode, 'Failed to instantiate OceanNode') + assert(config.c2dClusters, 'Failed to get c2dClusters') + }) + + // let's publish assets & algos + it('should publish compute datasets & algos', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 2) + publishedComputeDataset = await publishAsset( + computeAssetWithNoAccess, + publisherAccount + ) + publishedAlgoDataset = await publishAsset(algoAsset, publisherAccount) + const computeDatasetResult = await waitToIndex( + publishedComputeDataset.ddo.id, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT + ) + // Fail the test if compute dataset DDO was not indexed - subsequent tests depend on it + assert( + computeDatasetResult.ddo, + `Compute dataset DDO was not indexed${ + computeDatasetResult.wasTimeout ? ' (timeout)' : '' + }` + ) + const algoDatasetResult = await waitToIndex( + publishedAlgoDataset.ddo.id, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT + ) + // Fail the test if algorithm DDO was not indexed - subsequent tests depend on it + assert( + algoDatasetResult.ddo, + `Algorithm DDO was not indexed${algoDatasetResult.wasTimeout ? ' (timeout)' : ''}` + ) + }) + + it('Get compute environments', async () => { + const getEnvironmentsTask = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_ENVIRONMENTS + } + const response = await new ComputeGetEnvironmentsHandler(oceanNode).handle( + getEnvironmentsTask + ) + assert(response, 'Failed to get response') + assert(response.status.httpStatus === 200, 'Failed to get 200 response') + assert(response.stream, 'Failed to get stream') + expect(response.stream).to.be.instanceOf(Readable) + + computeEnvironments = await streamToObject(response.stream as Readable) + console.log('existing envs: ', computeEnvironments) + // expect 1 OR + envs (1 if only docker free env is available) + assert(computeEnvironments.length >= 1, 'Not enough compute envs') + for (const computeEnvironment of computeEnvironments) { + assert(computeEnvironment.id, 'id missing in computeEnvironments') + assert(computeEnvironment.fees, 'fees missing in computeEnvironments') + assert( + computeEnvironment.consumerAddress, + 'consumerAddress missing in computeEnvironments' + ) + + assert(computeEnvironment.id.startsWith('0x'), 'id should start with 0x') + assert(computeEnvironment.resources.length > 2, 'Missing resources') + assert( + computeEnvironment.maxJobDuration > 0, + 'maxJobDuration missing in computeEnvironments' + ) + } + firstEnv = computeEnvironments[0] + }) + + it('should not initialize compute without orders transaction IDs because algorithm is not trusted by dataset', async () => { + const dataset: ComputeAsset = { + documentId: publishedComputeDataset.ddo.id, + serviceId: publishedComputeDataset.ddo.services[0].id + } + const algorithm: ComputeAlgorithm = { + documentId: publishedAlgoDataset.ddo.id, + serviceId: publishedAlgoDataset.ddo.services[0].id + } + const getEnvironmentsTask = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_ENVIRONMENTS + } + const response = await new ComputeGetEnvironmentsHandler(oceanNode).handle( + getEnvironmentsTask + ) + computeEnvironments = await streamToObject(response.stream as Readable) + firstEnv = computeEnvironments[0] + + const initializeComputeTask: ComputeInitializeCommand = { + datasets: [dataset], + algorithm, + environment: firstEnv.id, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken + }, + maxJobDuration: computeJobDuration, + consumerAddress: firstEnv.consumerAddress, + command: PROTOCOL_COMMANDS.COMPUTE_INITIALIZE + } + const resp = await new ComputeInitializeHandler(oceanNode).handle( + initializeComputeTask + ) + console.log(resp) + assert(resp, 'Failed to get response') + assert(resp.status.httpStatus === 400, 'Failed to get 400 response') + assert( + resp.status.error === + `Algorithm ${publishedAlgoDataset.ddo.id} not allowed to run on the dataset: ${publishedComputeDataset.ddo.id}`, + 'Inconsistent error message' + ) + assert(resp.stream === null, 'Failed to get stream') + }) + + it('should add the algorithm to the dataset trusted algorithm list', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 5) + const config = await getConfiguration() + const algoChecksums = await getAlgoChecksums( + publishedAlgoDataset.ddo.id, + publishedAlgoDataset.ddo.services[0].id, + oceanNode, + config + ) + publishedComputeDataset.ddo.services[0].compute = { + allowRawAlgorithm: false, + allowNetworkAccess: true, + publisherTrustedAlgorithmPublishers: [], + publisherTrustedAlgorithms: [ + { + did: publishedAlgoDataset.ddo.id, + filesChecksum: algoChecksums.files, + containerSectionChecksum: algoChecksums.container + } + ] + } + const metadata = hexlify(Buffer.from(JSON.stringify(publishedComputeDataset.ddo))) + const hash = createHash('sha256').update(metadata).digest('hex') + const nftContract = new ethers.Contract( + publishedComputeDataset.ddo.nftAddress, + ERC721Template.abi, + publisherAccount + ) + const setMetaDataTx = await nftContract.setMetaData( + 0, + 'http://v4.provider.oceanprotocol.com', + '0x123', + '0x00', + metadata, + '0x' + hash, + [] + ) + const txReceipt = await setMetaDataTx.wait() + assert(txReceipt, 'set metadata failed') + publishedComputeDataset = await waitToIndex( + publishedComputeDataset.ddo.id, + EVENTS.METADATA_UPDATED, + DEFAULT_TEST_TIMEOUT * 2, + true + ) + assert( + publishedComputeDataset?.ddo?.services[0]?.compute?.publisherTrustedAlgorithms + .length > 0, + 'Trusted algorithms not updated' + ) + assert( + publishedComputeDataset?.ddo?.services[0]?.compute?.publisherTrustedAlgorithms[0] + .did === publishedAlgoDataset.ddo.id, + 'Algorithm DID mismatch in trusted algorithms' + ) + }) + + it('Initialize compute without orders transaction IDs', async () => { + const dataset: ComputeAsset = { + documentId: publishedComputeDataset.ddo.id, + serviceId: publishedComputeDataset.ddo.services[0].id + } + const algorithm: ComputeAlgorithm = { + documentId: publishedAlgoDataset.ddo.id, + serviceId: publishedAlgoDataset.ddo.services[0].id + } + const getEnvironmentsTask = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_ENVIRONMENTS + } + const response = await new ComputeGetEnvironmentsHandler(oceanNode).handle( + getEnvironmentsTask + ) + computeEnvironments = await streamToObject(response.stream as Readable) + firstEnv = computeEnvironments[0] + + const initializeComputeTask: ComputeInitializeCommand = { + datasets: [dataset], + algorithm, + environment: firstEnv.id, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken + }, + maxJobDuration: computeJobDuration, + consumerAddress: firstEnv.consumerAddress, + command: PROTOCOL_COMMANDS.COMPUTE_INITIALIZE + } + const resp = await new ComputeInitializeHandler(oceanNode).handle( + initializeComputeTask + ) + console.log(resp) + assert(resp, 'Failed to get response') + assert(resp.status.httpStatus === 200, 'Failed to get 200 response') + assert(resp.stream, 'Failed to get stream') + expect(resp.stream).to.be.instanceOf(Readable) + initializeResponse = (await streamToObject( + resp.stream as Readable + )) as ProviderComputeInitializeResults + }) + + it('should start an order on dataset', async function () { + const orderTxReceipt = await orderAsset( + publishedComputeDataset.ddo, + 0, + consumerAccount, + firstEnv.consumerAddress, // for compute, consumer is always address of compute env + publisherAccount, + oceanNode, + initializeResponse.datasets[0].providerFee + ) + assert(orderTxReceipt, 'order transaction failed') + datasetOrderTxId = orderTxReceipt.hash + assert(datasetOrderTxId, 'transaction id not found') + }) + it('should start an order on algorithm', async function () { + const orderTxReceipt = await orderAsset( + publishedAlgoDataset.ddo, + 0, + consumerAccount, + firstEnv.consumerAddress, // for compute, consumer is always address of compute env + publisherAccount, + oceanNode, + initializeResponse.algorithm.providerFee + ) + assert(orderTxReceipt, 'order transaction failed') + algoOrderTxId = orderTxReceipt.hash + assert(algoOrderTxId, 'transaction id not found') + }) + + it('should start a compute job', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 10) + // let's put funds in escrow & create an auth + let balance = await paymentTokenContract.balanceOf(await consumerAccount.getAddress()) + if (BigInt(balance.toString()) === BigInt(0)) { + const mintAmount = ethers.parseUnits('1000', 18) + const mintTx = await paymentTokenContract.mint( + await consumerAccount.getAddress(), + mintAmount + ) + await mintTx.wait() + balance = await paymentTokenContract.balanceOf(await consumerAccount.getAddress()) + } + assert(BigInt(balance.toString()) > BigInt(0), 'Consumer has no Ocean tokens') + const approveTx = await paymentTokenContract + .connect(consumerAccount) + .approve(initializeResponse.payment.escrowAddress, balance) + await approveTx.wait() + const depositTx = await escrowContract + .connect(consumerAccount) + .deposit(initializeResponse.payment.token, balance) + await depositTx.wait() + const authorizeTx = await escrowContract + .connect(consumerAccount) + .authorize( + initializeResponse.payment.token, + firstEnv.consumerAddress, + balance, + initializeResponse.payment.minLockSeconds, + 10 + ) + await authorizeTx.wait() + const locks = await oceanNode.escrow.getLocks( + DEVELOPMENT_CHAIN_ID, + paymentToken, + await consumerAccount.getAddress(), + firstEnv.consumerAddress + ) + + if (locks.length > 0) { + // cancel all locks + for (const lock of locks) { + try { + await escrowContract + .connect(consumerAccount) + .cancelExpiredLocks(lock.jobId, lock.token, lock.payer, lock.payee) + } catch (e) {} + } + } + const nonce = Date.now().toString() + const message = String( + (await consumerAccount.getAddress()) + publishedComputeDataset.ddo.id + nonce + ) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await wallet.signMessage(messageHashBytes) + const startComputeTask: PaidComputeStartCommand = { + command: PROTOCOL_COMMANDS.COMPUTE_START, + consumerAddress: await consumerAccount.getAddress(), + signature, + nonce, + environment: firstEnv.id, + datasets: [ + { + documentId: publishedComputeDataset.ddo.id, + serviceId: publishedComputeDataset.ddo.services[0].id, + transferTxId: datasetOrderTxId + } + ], + algorithm: { + documentId: publishedAlgoDataset.ddo.id, + serviceId: publishedAlgoDataset.ddo.services[0].id, + transferTxId: algoOrderTxId, + meta: publishedAlgoDataset.ddo.metadata.algorithm + }, + output: {}, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken + }, + maxJobDuration: computeJobDuration + // additionalDatasets?: ComputeAsset[] + // output?: ComputeOutput + } + const auth = await oceanNode.escrow.getAuthorizations( + DEVELOPMENT_CHAIN_ID, + paymentToken, + await consumerAccount.getAddress(), + firstEnv.consumerAddress + ) + assert(auth.length > 0, 'Should have authorization') + assert( + BigInt(auth[0].maxLockedAmount.toString()) > BigInt(0), + ' Should have maxLockedAmount in auth' + ) + assert( + BigInt(auth[0].maxLockCounts.toString()) > BigInt(0), + ' Should have maxLockCounts in auth' + ) + const response = await new PaidComputeStartHandler(oceanNode).handle(startComputeTask) + console.log(`response: ${response.status.httpStatus}`) + console.log(`response: ${JSON.stringify(response)}`) + assert(response, 'Failed to get response') + assert(response.status.httpStatus === 200, 'Failed to get 200 response') + assert(response.stream, 'Failed to get stream') + expect(response.stream).to.be.instanceOf(Readable) + + const jobs = await streamToObject(response.stream as Readable) + // eslint-disable-next-line prefer-destructuring + jobId = jobs[0].jobId + assert(jobId) + }) + after(async () => { + await tearDownEnvironment(previousConfiguration) + indexer.stopAllChainIndexers() + }) +}) diff --git a/src/test/integration/auth.test.ts b/src/test/integration/auth.test.ts new file mode 100644 index 000000000..2a0672032 --- /dev/null +++ b/src/test/integration/auth.test.ts @@ -0,0 +1,246 @@ +import { JsonRpcProvider, Signer, Wallet } from 'ethers' +import { Database } from '../../components/database/index.js' +import { getConfiguration, getMessageHash } from '../../utils/index.js' +import { + DEFAULT_TEST_TIMEOUT, + OverrideEnvConfig, + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig, + setupEnvironment, + tearDownEnvironment, + getMockSupportedNetworks +} from '../utils/utils.js' +import { ENVIRONMENT_VARIABLES, PROTOCOL_COMMANDS } from '../../utils/constants.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { RPCS } from '../../@types/blockchain.js' +import { OceanNode } from '../../OceanNode.js' +import { + CreateAuthTokenHandler, + InvalidateAuthTokenHandler +} from '../../components/core/handler/authHandler.js' +import { streamToObject } from '../../utils/util.js' +import { Readable } from 'stream' +import { expect } from 'chai' +import { ValidateDDOHandler } from '../../components/core/handler/ddoHandler.js' + +describe('Auth Token Integration Tests', () => { + let config: OceanNodeConfig + let database: Database + let provider: JsonRpcProvider + let consumerAccount: Signer + let previousConfiguration: OverrideEnvConfig[] + let oceanNode: OceanNode + + const mockSupportedNetworks: RPCS = getMockSupportedNetworks() + + before(async () => { + previousConfiguration = await setupEnvironment( + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.RPCS, + ENVIRONMENT_VARIABLES.INDEXER_NETWORKS, + ENVIRONMENT_VARIABLES.VALIDATE_UNSIGNED_DDO + ], + [JSON.stringify(mockSupportedNetworks), JSON.stringify([8996]), 'false'] + ) + ) + + config = await getConfiguration(true) + database = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance(config, database) + + provider = new JsonRpcProvider(mockSupportedNetworks['8996'].rpc) + + const consumerPrivateKey = + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' + consumerAccount = new Wallet(consumerPrivateKey, provider) + }) + + after(async () => { + await tearDownEnvironment(previousConfiguration) + }) + + const getRandomNonce = () => { + return Date.now().toString() + } + + const ddoValiationRequest = async (token: string) => { + try { + const validateHandler = new ValidateDDOHandler(oceanNode) + const validateResponse = await validateHandler.handle({ + command: PROTOCOL_COMMANDS.VALIDATE_DDO, + authorization: token, + ddo: { + id: 'did:op:f00896cc6f5f9f2c17be06dd28bd6be085e1406bb55274cbd2b65b7271e7b104', + '@context': [], + version: '4.1.0', + nftAddress: '0x3357cCd4e75536422b61F6aeda3ad38545b9b01F', + chainId: 11155111, + metadata: { + created: new Date().toISOString(), + updated: new Date().toISOString(), + type: 'dataset', + name: 'Test DDO', + description: 'Test DDO', + tags: [], + author: 'Test Author', + license: 'https://market.oceanprotocol.com/terms', + additionalInformation: { + termsAndConditions: true + } + }, + services: [ + { + id: 'ccb398c50d6abd5b456e8d7242bd856a1767a890b537c2f8c10ba8b8a10e6025', + type: 'compute', + files: '0x0', + datatokenAddress: '0x0Cf4BE72EAD0583deD382589aFcbF34F3E860Bdc', + serviceEndpoint: '', + timeout: 86400 + } + ] + } + }) + + return validateResponse + } catch (error) { + console.log(`Error validating DDO: ${error}`) + return { status: error.response.status, data: error.response.data } + } + } + + describe('Token Management Tests', () => { + it('should create and validate token', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const consumerAddress = await consumerAccount.getAddress() + const nonce = getRandomNonce() + const message = String(consumerAddress + nonce) + const messageHash = getMessageHash(message) + const signature = await consumerAccount.signMessage(messageHash) + + const handlerResponse = await new CreateAuthTokenHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.CREATE_AUTH_TOKEN, + address: consumerAddress, + signature, + nonce + }) + + const token = await streamToObject(handlerResponse.stream as Readable) + const testEndpointResponse = await ddoValiationRequest(token.token) + expect(testEndpointResponse.status.httpStatus).to.equal(200) + }) + + it('should handle token expiry', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const consumerAddress = await consumerAccount.getAddress() + const nonce = getRandomNonce() + const message = String(consumerAddress + nonce) + const messageHash = getMessageHash(message) + const signature = await consumerAccount.signMessage(messageHash) + + const validUntil = Date.now() + 1000 + const handlerResponse = await new CreateAuthTokenHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.CREATE_AUTH_TOKEN, + address: consumerAddress, + signature, + nonce, + validUntil + }) + + const token = await streamToObject(handlerResponse.stream as Readable) + + await new Promise((resolve) => setTimeout(resolve, 2000)) + + const testEndpointResponse = await ddoValiationRequest(token.token) + expect(testEndpointResponse.status.httpStatus).to.equal(401) + }) + + it('should invalidate token', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const consumerAddress = await consumerAccount.getAddress() + const nonce = getRandomNonce() + const message = String(consumerAddress + nonce) + const messageHash = getMessageHash(message) + const signature = await consumerAccount.signMessage(messageHash) + + const handlerResponse = await new CreateAuthTokenHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.CREATE_AUTH_TOKEN, + address: consumerAddress, + signature, + nonce + }) + + const token = await streamToObject(handlerResponse.stream as Readable) + const newNonce = getRandomNonce() + + await new InvalidateAuthTokenHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.INVALIDATE_AUTH_TOKEN, + address: consumerAddress, + signature, + nonce: newNonce, + token: token.token + }) + + const testEndpointResponse = await ddoValiationRequest(token.token) + expect(testEndpointResponse.status.httpStatus).to.equal(401) + }) + + describe('Error Cases', () => { + it('should handle invalid signatures', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const consumerAddress = await consumerAccount.getAddress() + + const response = await new CreateAuthTokenHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.CREATE_AUTH_TOKEN, + address: consumerAddress, + signature: '0xinvalid', + nonce: getRandomNonce() + }) + expect(response.status.httpStatus).to.equal(401) + }) + + it('should handle invalid tokens', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const testEndpointResponse = await ddoValiationRequest('invalid-token') + expect(testEndpointResponse.status.httpStatus).to.equal(401) + }) + + it('should handle missing parameters', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + // Missing signature + const response = await new CreateAuthTokenHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.CREATE_AUTH_TOKEN, + address: await consumerAccount.getAddress(), + signature: undefined, + nonce: getRandomNonce() + }) + expect(response.status.httpStatus).to.equal(400) + + // Missing address + const nonce = getRandomNonce() + const message = String((await consumerAccount.getAddress()) + nonce) + const messageHash = getMessageHash(message) + const signature = await consumerAccount.signMessage(messageHash) + + const response2 = await new CreateAuthTokenHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.CREATE_AUTH_TOKEN, + address: undefined, + signature, + nonce: getRandomNonce() + }) + expect(response2.status.httpStatus).to.equal(400) + }) + }) + }) + + after(async () => { + await tearDownEnvironment(previousConfiguration) + }) +}) diff --git a/src/test/integration/compute.test.ts b/src/test/integration/compute.test.ts index 395fd9900..53d041be2 100644 --- a/src/test/integration/compute.test.ts +++ b/src/test/integration/compute.test.ts @@ -1,22 +1,27 @@ import { expect, assert } from 'chai' import { ComputeGetEnvironmentsHandler, - ComputeStartHandler, + // ComputeStartHandler, ComputeStopHandler, ComputeGetStatusHandler, - ComputeInitializeHandler + ComputeInitializeHandler, + FreeComputeStartHandler, + PaidComputeStartHandler, + ComputeGetResultHandler } from '../../components/core/compute/index.js' import type { - ComputeStartCommand, + PaidComputeStartCommand, + FreeComputeStartCommand, ComputeStopCommand, ComputeGetStatusCommand, - ComputeInitializeCommand + ComputeInitializeCommand, + ComputeGetResultCommand } from '../../@types/commands.js' -import type { - ComputeAsset, - ComputeAlgorithm, - ComputeEnvironment -} from '../../@types/C2D.js' +import { + type ComputeAsset, + type ComputeAlgorithm, + type ComputeEnvironment +} from '../../@types/C2D/C2D.js' import { // DB_TYPES, ENVIRONMENT_VARIABLES, @@ -53,21 +58,26 @@ import { tearDownEnvironment } from '../utils/utils.js' -import { ProviderFees } from '../../@types/Fees.js' +import { ProviderFees, ProviderComputeInitializeResults } from '../../@types/Fees.js' import { homedir } from 'os' import { publishAlgoDDO, publishDatasetDDO } from '../data/ddo.js' import { DEVELOPMENT_CHAIN_ID, getOceanArtifactsAdresses } from '../../utils/address.js' -import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' assert { type: 'json' } -import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' } +import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' with { type: 'json' } +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } +import OceanToken from '@oceanprotocol/contracts/artifacts/contracts/utils/OceanToken.sol/OceanToken.json' with { type: 'json' } +import EscrowJson from '@oceanprotocol/contracts/artifacts/contracts/escrow/Escrow.sol/Escrow.json' with { type: 'json' } import { createHash } from 'crypto' -import { encrypt } from '../../utils/crypt.js' import { EncryptMethod } from '../../@types/fileObject.js' -import { checkC2DEnvExists } from '../../components/c2d/index.js' import { getAlgoChecksums, validateAlgoForDataset } from '../../components/core/compute/utils.js' +import { freeComputeStartPayload } from '../data/commands.js' +import { DDOManager } from '@oceanprotocol/ddo-js' + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) + describe('Compute', () => { let previousConfiguration: OverrideEnvConfig[] let config: OceanNodeConfig @@ -80,21 +90,32 @@ describe('Compute', () => { let publishedComputeDataset: any let publishedAlgoDataset: any let jobId: string + let freeJobId: string let datasetOrderTxId: any let algoOrderTxId: any + let paymentToken: any + let paymentTokenContract: any + let escrowContract: any let providerFeesComputeDataset: ProviderFees let providerFeesComputeAlgo: ProviderFees let indexer: OceanIndexer - const now = new Date().getTime() / 1000 - const computeJobValidUntil = now + 60 * 15 // 15 minutes from now should be enough + // const now = new Date().getTime() / 1000 + const computeJobDuration = 60 * 15 // 15 minutes from now should be enough let firstEnv: ComputeEnvironment const wallet = new ethers.Wallet( '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' ) + const wallet2 = new ethers.Wallet( + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45210' + ) + const wallet3 = new ethers.Wallet( + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d4521A' + ) + // const chainId = DEVELOPMENT_CHAIN_ID const mockSupportedNetworks: RPCS = getMockSupportedNetworks() - const chainId = 8996 + const chainId = DEVELOPMENT_CHAIN_ID // randomly use a set of trusted algos or empty arrays // should validate if set and match, invalidate otherwise const setTrustedAlgosEmpty: boolean = Math.random() <= 0.5 @@ -103,8 +124,12 @@ describe('Compute', () => { let factoryContract: Contract let algoDDO: any let datasetDDO: any + let artifactsAddresses: any + let initializeResponse: ProviderComputeInitializeResults before(async () => { + artifactsAddresses = getOceanArtifactsAdresses() + paymentToken = artifactsAddresses.development.Ocean previousConfiguration = await setupEnvironment( TEST_ENV_CONFIG_FILE, buildEnvOverrideConfig( @@ -114,34 +139,46 @@ describe('Compute', () => { ENVIRONMENT_VARIABLES.PRIVATE_KEY, ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS, ENVIRONMENT_VARIABLES.ADDRESS_FILE, - ENVIRONMENT_VARIABLES.OPERATOR_SERVICE_URL - // ENVIRONMENT_VARIABLES.DB_URL, - // ENVIRONMENT_VARIABLES.DB_TYPE + ENVIRONMENT_VARIABLES.DOCKER_COMPUTE_ENVIRONMENTS ], [ JSON.stringify(mockSupportedNetworks), - JSON.stringify([8996]), + JSON.stringify([DEVELOPMENT_CHAIN_ID]), '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), `${homedir}/.ocean/ocean-contracts/artifacts/address.json`, - JSON.stringify(['http://localhost:31000']) - // 'http://localhost:9200', - // DB_TYPES.ELASTIC_SEARCH + '[{"socketPath":"/var/run/docker.sock","resources":[{"id":"disk","total":10}],"storageExpiry":604800,"maxJobDuration":3600,"minJobDuration":60,"fees":{"' + + DEVELOPMENT_CHAIN_ID + + '":[{"feeToken":"' + + paymentToken + + '","prices":[{"id":"cpu","price":1}]}]},"free":{"maxJobDuration":60,"minJobDuration":10,"maxJobs":3,"resources":[{"id":"cpu","max":1},{"id":"ram","max":1},{"id":"disk","max":1}]}}]' ] ) ) config = await getConfiguration(true) - dbconn = await new Database(config.dbConfig) - oceanNode = await OceanNode.getInstance(dbconn) - indexer = new OceanIndexer(dbconn, config.indexingNetworks) + dbconn = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance( + config, + dbconn, + null, + null, + null, + null, + null, + true + ) + indexer = new OceanIndexer( + dbconn, + config.indexingNetworks, + oceanNode.blockchainRegistry + ) oceanNode.addIndexer(indexer) - oceanNode.addC2DEngines(config) + oceanNode.addC2DEngines() provider = new JsonRpcProvider('http://127.0.0.1:8545') publisherAccount = (await provider.getSigner(0)) as Signer consumerAccount = (await provider.getSigner(1)) as Signer - const artifactsAddresses = getOceanArtifactsAdresses() publisherAddress = await publisherAccount.getAddress() algoDDO = { ...publishAlgoDDO } datasetDDO = { ...publishDatasetDDO } @@ -150,6 +187,16 @@ describe('Compute', () => { ERC721Factory.abi, publisherAccount ) + paymentTokenContract = new ethers.Contract( + paymentToken, + OceanToken.abi, + publisherAccount + ) + escrowContract = new ethers.Contract( + artifactsAddresses.development.Escrow, + EscrowJson.abi, + publisherAccount + ) }) it('Sets up compute envs', () => { @@ -187,10 +234,12 @@ describe('Compute', () => { it('should add the algorithm to the dataset trusted algorithm list', async function () { this.timeout(DEFAULT_TEST_TIMEOUT * 5) + const config = await getConfiguration() const algoChecksums = await getAlgoChecksums( publishedAlgoDataset.ddo.id, publishedAlgoDataset.ddo.services[0].id, - oceanNode + oceanNode, + config ) publishedComputeDataset.ddo.services[0].compute = { allowRawAlgorithm: false, @@ -224,20 +273,26 @@ describe('Compute', () => { assert(txReceipt, 'set metadata failed') publishedComputeDataset = await waitToIndex( publishedComputeDataset.ddo.id, - EVENTS.METADATA_CREATED, - DEFAULT_TEST_TIMEOUT * 2, + EVENTS.METADATA_UPDATED, + DEFAULT_TEST_TIMEOUT * 3, true ) - assert( - publishedComputeDataset?.ddo?.services[0]?.compute?.publisherTrustedAlgorithms - .length > 0, - 'Trusted algorithms not updated' - ) - assert( - publishedComputeDataset?.ddo?.services[0]?.compute?.publisherTrustedAlgorithms[0] - .did === publishedAlgoDataset.ddo.id, - 'Algorithm DID mismatch in trusted algorithms' - ) + if (!publishedComputeDataset.ddo) { + expect(expectedTimeoutFailure(this.test.title)).to.be.equal( + publishedComputeDataset.wasTimeout + ) + } else { + assert( + publishedComputeDataset?.ddo?.services[0]?.compute?.publisherTrustedAlgorithms + .length > 0, + 'Trusted algorithms not updated' + ) + assert( + publishedComputeDataset?.ddo?.services[0]?.compute?.publisherTrustedAlgorithms[0] + .did === publishedAlgoDataset.ddo.id, + 'Algorithm DID mismatch in trusted algorithms' + ) + } }) it('Get compute environments', async () => { @@ -253,29 +308,28 @@ describe('Compute', () => { expect(response.stream).to.be.instanceOf(Readable) computeEnvironments = await streamToObject(response.stream as Readable) - // expect 2 envs - expect(computeEnvironments[DEVELOPMENT_CHAIN_ID].length === 2, 'incorrect length') - for (const computeEnvironment of computeEnvironments[DEVELOPMENT_CHAIN_ID]) { + console.log('existing envs: ', computeEnvironments) + // expect 1 OR + envs (1 if only docker free env is available) + assert(computeEnvironments.length >= 1, 'Not enough compute envs') + for (const computeEnvironment of computeEnvironments) { assert(computeEnvironment.id, 'id missing in computeEnvironments') + assert(computeEnvironment.fees, 'fees missing in computeEnvironments') assert( computeEnvironment.consumerAddress, 'consumerAddress missing in computeEnvironments' ) - assert(computeEnvironment.lastSeen, 'lastSeen missing in computeEnvironments') + assert(computeEnvironment.id.startsWith('0x'), 'id should start with 0x') - assert(computeEnvironment.cpuNumber > 0, 'cpuNumber missing in computeEnvironments') - assert(computeEnvironment.ramGB > 0, 'ramGB missing in computeEnvironments') - assert(computeEnvironment.diskGB > 0, 'diskGB missing in computeEnvironments') - assert(computeEnvironment.maxJobs > 0, 'maxJobs missing in computeEnvironments') + assert(computeEnvironment.resources.length > 2, 'Missing resources') assert( computeEnvironment.maxJobDuration > 0, 'maxJobDuration missing in computeEnvironments' ) } - firstEnv = computeEnvironments[DEVELOPMENT_CHAIN_ID][0] + firstEnv = computeEnvironments[0] }) - it('Initialize compute without transaction IDs', async () => { + it('Initialize compute without orders transaction IDs', async () => { const dataset: ComputeAsset = { documentId: publishedComputeDataset.ddo.id, serviceId: publishedComputeDataset.ddo.services[0].id @@ -290,28 +344,32 @@ describe('Compute', () => { const response = await new ComputeGetEnvironmentsHandler(oceanNode).handle( getEnvironmentsTask ) + console.log('firstEnv', firstEnv) computeEnvironments = await streamToObject(response.stream as Readable) - firstEnv = computeEnvironments[DEVELOPMENT_CHAIN_ID][0] - + firstEnv = computeEnvironments[0] const initializeComputeTask: ComputeInitializeCommand = { datasets: [dataset], algorithm, - compute: { - env: firstEnv.id, - validUntil: computeJobValidUntil + environment: firstEnv.id, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken }, + maxJobDuration: computeJobDuration, consumerAddress: firstEnv.consumerAddress, command: PROTOCOL_COMMANDS.COMPUTE_INITIALIZE } const resp = await new ComputeInitializeHandler(oceanNode).handle( initializeComputeTask ) + console.log(resp) assert(resp, 'Failed to get response') assert(resp.status.httpStatus === 200, 'Failed to get 200 response') assert(resp.stream, 'Failed to get stream') expect(resp.stream).to.be.instanceOf(Readable) const result: any = await streamToObject(resp.stream as Readable) + console.log(result) assert(result.algorithm, 'algorithm does not exist') expect(result.algorithm.datatoken?.toLowerCase()).to.be.equal( publishedAlgoDataset.datatokenAddress?.toLowerCase() @@ -365,9 +423,17 @@ describe('Compute', () => { assert(resultParsed.providerFee.validUntil, 'algorithm validUntil does not exist') assert(result.datasets[0].validOrder === false, 'incorrect validOrder') // expect false because tx id was not provided and no start order was called before + assert(result.payment, ' Payment structure does not exists') + assert( + result.payment.escrowAddress === artifactsAddresses.development.Escrow, + 'Incorrect escrow address' + ) + assert(result.payment.payee === firstEnv.consumerAddress, 'Incorrect payee address') + assert(result.payment.token === paymentToken, 'Incorrect payment token address') + // TO DO: check result.payment.amount }) - it('should start an order', async function () { + it('should start an order on dataset', async function () { const orderTxReceipt = await orderAsset( publishedComputeDataset.ddo, 0, @@ -383,11 +449,11 @@ describe('Compute', () => { }) it('Initialize compute with dataset tx and without algoritm tx', async () => { - // now, we have a valid order for dataset, with valid compute provider fees + // now, we have a valid order for dataset, with valid provider fees // expected results: // - dataset should have valid order - // - dataset should have valid providerFee - // - algo should not have any valid order or providerFee + // - dataset should not have providerFee, cause it's already paid & valid + // - algo should not have any valid order and it should have providerFee const dataset: ComputeAsset = { documentId: publishedComputeDataset.ddo.id, @@ -401,10 +467,12 @@ describe('Compute', () => { const initializeComputeTask: ComputeInitializeCommand = { datasets: [dataset], algorithm, - compute: { - env: firstEnv.id, - validUntil: computeJobValidUntil + environment: firstEnv.id, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken }, + maxJobDuration: computeJobDuration, consumerAddress: firstEnv.consumerAddress, command: PROTOCOL_COMMANDS.COMPUTE_INITIALIZE } @@ -417,6 +485,10 @@ describe('Compute', () => { expect(resp.stream).to.be.instanceOf(Readable) const result: any = await streamToObject(resp.stream as Readable) + console.log('446') + console.log(result) + console.log('Algo') + console.log(result.algorithm) assert(result.algorithm, 'algorithm does not exist') expect(result.algorithm.datatoken?.toLowerCase()).to.be.equal( publishedAlgoDataset.datatokenAddress?.toLowerCase() @@ -445,7 +517,7 @@ describe('Compute', () => { assert(result.datasets.length > 0, 'datasets key does not exist') const resultParsed = JSON.parse(JSON.stringify(result.datasets[0])) - + if ('providerFee' in resultParsed) console.log(resultParsed.providerFee) expect(resultParsed.datatoken?.toLowerCase()).to.be.equal( publishedComputeDataset.ddo.datatokens[0].address?.toLowerCase() ) @@ -491,10 +563,12 @@ describe('Compute', () => { const initializeComputeTask: ComputeInitializeCommand = { datasets: [dataset], algorithm, - compute: { - env: firstEnv.id, - validUntil: computeJobValidUntil + environment: firstEnv.id, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken }, + maxJobDuration: computeJobDuration, consumerAddress: firstEnv.consumerAddress, command: PROTOCOL_COMMANDS.COMPUTE_INITIALIZE } @@ -508,6 +582,7 @@ describe('Compute', () => { expect(resp.stream).to.be.instanceOf(Readable) const result: any = await streamToObject(resp.stream as Readable) + initializeResponse = JSON.parse(JSON.stringify(result)) assert(result.algorithm, 'algorithm does not exist') expect(result.algorithm.datatoken?.toLowerCase()).to.be.equal( publishedAlgoDataset.datatokenAddress?.toLowerCase() @@ -533,44 +608,107 @@ describe('Compute', () => { it('should fail to start a compute job', async () => { const nonce = Date.now().toString() - const message = String(nonce) + const message = String( + (await consumerAccount.getAddress()) + publishedComputeDataset.ddo.id + nonce + ) // sign message/nonce const consumerMessage = ethers.solidityPackedKeccak256( ['bytes'], [ethers.hexlify(ethers.toUtf8Bytes(message))] ) const messageHashBytes = ethers.toBeArray(consumerMessage) + + // since ganache does not supports personal_sign, we use wallet account const signature = await wallet.signMessage(messageHashBytes) - const startComputeTask: ComputeStartCommand = { + const startComputeTask: PaidComputeStartCommand = { command: PROTOCOL_COMMANDS.COMPUTE_START, - consumerAddress: await wallet.getAddress(), + consumerAddress: await consumerAccount.getAddress(), + environment: firstEnv.id, signature, nonce, - environment: firstEnv.id, - dataset: { - documentId: publishedComputeDataset.ddo.id, - serviceId: publishedComputeDataset.ddo.services[0].id, - transferTxId: '0x123' - }, + datasets: [ + { + documentId: publishedComputeDataset.ddo.id, + serviceId: publishedComputeDataset.ddo.services[0].id, + transferTxId: '0x123' + } + ], algorithm: { documentId: publishedAlgoDataset.ddo.id, serviceId: publishedAlgoDataset.ddo.services[0].id, transferTxId: '0x123', meta: publishedAlgoDataset.ddo.metadata.algorithm - } + }, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken + }, + maxJobDuration: computeJobDuration // additionalDatasets?: ComputeAsset[] // output?: ComputeOutput } - const response = await new ComputeStartHandler(oceanNode).handle(startComputeTask) + const response = await new PaidComputeStartHandler(oceanNode).handle(startComputeTask) assert(response, 'Failed to get response') // should fail, because txId '0x123' is not a valid order assert(response.status.httpStatus === 500, 'Failed to get 500 response') assert(!response.stream, 'We should not have a stream') }) - it('should start a compute job', async () => { + it('should start a compute job with maxed resources', async () => { + // first check escrow auth + + let balance = await paymentTokenContract.balanceOf(await consumerAccount.getAddress()) + let funds = await oceanNode.escrow.getUserAvailableFunds( + DEVELOPMENT_CHAIN_ID, + await consumerAccount.getAddress(), + paymentToken + ) + // make sure we have 0 funds + if (BigInt(funds.toString()) > BigInt(0)) { + await escrowContract + .connect(consumerAccount) + .withdraw([initializeResponse.payment.token], [funds]) + } + let auth = await oceanNode.escrow.getAuthorizations( + DEVELOPMENT_CHAIN_ID, + paymentToken, + await consumerAccount.getAddress(), + firstEnv.consumerAddress + ) + if (auth.length > 0) { + // remove any auths + await escrowContract + .connect(consumerAccount) + .authorize(initializeResponse.payment.token, firstEnv.consumerAddress, 0, 0, 0) + } + let locks = await oceanNode.escrow.getLocks( + DEVELOPMENT_CHAIN_ID, + paymentToken, + await consumerAccount.getAddress(), + firstEnv.consumerAddress + ) + + if (locks.length > 0) { + // cancel all locks + for (const lock of locks) { + try { + await escrowContract + .connect(consumerAccount) + .cancelExpiredLocks(lock.jobId, lock.token, lock.payer, lock.payee) + } catch (e) {} + } + locks = await oceanNode.escrow.getLocks( + DEVELOPMENT_CHAIN_ID, + paymentToken, + await consumerAccount.getAddress(), + firstEnv.consumerAddress + ) + } + const locksBefore = locks.length const nonce = Date.now().toString() - const message = String(nonce) + const message = String( + (await consumerAccount.getAddress()) + publishedComputeDataset.ddo.id + nonce + ) // sign message/nonce const consumerMessage = ethers.solidityPackedKeccak256( ['bytes'], @@ -578,28 +716,103 @@ describe('Compute', () => { ) const messageHashBytes = ethers.toBeArray(consumerMessage) const signature = await wallet.signMessage(messageHashBytes) - const startComputeTask: ComputeStartCommand = { + const re = [] + for (const res of firstEnv.resources) { + re.push({ id: res.id, amount: res.total }) + } + const startComputeTask: PaidComputeStartCommand = { command: PROTOCOL_COMMANDS.COMPUTE_START, - consumerAddress: await wallet.getAddress(), + consumerAddress: await consumerAccount.getAddress(), signature, nonce, environment: firstEnv.id, - dataset: { - documentId: publishedComputeDataset.ddo.id, - serviceId: publishedComputeDataset.ddo.services[0].id, - transferTxId: datasetOrderTxId - }, + datasets: [ + { + documentId: publishedComputeDataset.ddo.id, + serviceId: publishedComputeDataset.ddo.services[0].id, + transferTxId: datasetOrderTxId + } + ], algorithm: { documentId: publishedAlgoDataset.ddo.id, serviceId: publishedAlgoDataset.ddo.services[0].id, transferTxId: algoOrderTxId, meta: publishedAlgoDataset.ddo.metadata.algorithm }, - output: {} + output: {}, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken + }, + metadata: { + key: 'value' + }, + additionalViewers: [await wallet2.getAddress()], + maxJobDuration: computeJobDuration, + resources: re // additionalDatasets?: ComputeAsset[] // output?: ComputeOutput } - const response = await new ComputeStartHandler(oceanNode).handle(startComputeTask) + // it should fail, because we don't have funds & auths in escrow + let response = await new PaidComputeStartHandler(oceanNode).handle(startComputeTask) + assert(response.status.httpStatus === 400, 'Failed to get 400 response') + assert(!response.stream, 'We should not have a stream') + // let's put funds in escrow & create an auth + balance = await paymentTokenContract.balanceOf(await consumerAccount.getAddress()) + await paymentTokenContract + .connect(consumerAccount) + .approve(initializeResponse.payment.escrowAddress, balance) + await escrowContract + .connect(consumerAccount) + .deposit(initializeResponse.payment.token, balance) + await escrowContract + .connect(consumerAccount) + .authorize( + initializeResponse.payment.token, + firstEnv.consumerAddress, + balance, + initializeResponse.payment.minLockSeconds, + 10 + ) + auth = await oceanNode.escrow.getAuthorizations( + DEVELOPMENT_CHAIN_ID, + paymentToken, + await consumerAccount.getAddress(), + firstEnv.consumerAddress + ) + const authBefore = auth[0] + funds = await oceanNode.escrow.getUserAvailableFunds( + DEVELOPMENT_CHAIN_ID, + await consumerAccount.getAddress(), + paymentToken + ) + const fundsBefore = funds + assert(BigInt(funds.toString()) > BigInt(0), 'Should have funds in escrow') + assert(auth.length > 0, 'Should have authorization') + assert( + BigInt(auth[0].maxLockedAmount.toString()) > BigInt(0), + ' Should have maxLockedAmount in auth' + ) + assert( + BigInt(auth[0].maxLockCounts.toString()) > BigInt(0), + ' Should have maxLockCounts in auth' + ) + const nonce2 = Date.now().toString() + const message2 = String( + (await consumerAccount.getAddress()) + publishedComputeDataset.ddo.id + nonce2 + ) + const consumerMessage2 = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message2))] + ) + const messageHashBytes2 = ethers.toBeArray(consumerMessage2) + const signature2 = await wallet.signMessage(messageHashBytes2) + response = await new PaidComputeStartHandler(oceanNode).handle({ + ...startComputeTask, + nonce: nonce2, + signature: signature2 + }) + console.log(response) assert(response, 'Failed to get response') assert(response.status.httpStatus === 200, 'Failed to get 200 response') assert(response.stream, 'Failed to get stream') @@ -608,9 +821,95 @@ describe('Compute', () => { const jobs = await streamToObject(response.stream as Readable) // eslint-disable-next-line prefer-destructuring jobId = jobs[0].jobId + console.log('**** Started compute job with id: ', jobId) + // check escrow + funds = await oceanNode.escrow.getUserAvailableFunds( + DEVELOPMENT_CHAIN_ID, + await consumerAccount.getAddress(), + paymentToken + ) + assert(fundsBefore > funds, 'We should have less funds') + locks = await oceanNode.escrow.getLocks( + DEVELOPMENT_CHAIN_ID, + paymentToken, + await consumerAccount.getAddress(), + firstEnv.consumerAddress + ) + assert(locks.length > locksBefore, 'We should have locks') + auth = await oceanNode.escrow.getAuthorizations( + DEVELOPMENT_CHAIN_ID, + paymentToken, + await consumerAccount.getAddress(), + firstEnv.consumerAddress + ) + assert(auth[0].currentLocks > authBefore.currentLocks, 'We should have running jobs') + assert( + auth[0].currentLockedAmount > authBefore.currentLockedAmount, + 'We should have higher currentLockedAmount' + ) }) - it('should stop a compute job', async () => { + it('should try start another compute job with maxed resources, but fail', async () => { + const getEnvironmentsTask = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_ENVIRONMENTS + } + const eresponse = await new ComputeGetEnvironmentsHandler(oceanNode).handle( + getEnvironmentsTask + ) + computeEnvironments = await streamToObject(eresponse.stream as Readable) + console.log(computeEnvironments[0]) + const nonce = Date.now().toString() + const message = String( + (await consumerAccount.getAddress()) + publishedComputeDataset.ddo.id + nonce + ) + // sign message/nonce + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await wallet.signMessage(messageHashBytes) + const re = [] + for (const res of firstEnv.resources) { + re.push({ id: res.id, amount: res.total }) + } + const startComputeTask: PaidComputeStartCommand = { + command: PROTOCOL_COMMANDS.COMPUTE_START, + consumerAddress: await consumerAccount.getAddress(), + signature, + nonce, + environment: firstEnv.id, + datasets: [ + { + documentId: publishedComputeDataset.ddo.id, + serviceId: publishedComputeDataset.ddo.services[0].id, + transferTxId: datasetOrderTxId + } + ], + algorithm: { + documentId: publishedAlgoDataset.ddo.id, + serviceId: publishedAlgoDataset.ddo.services[0].id, + transferTxId: algoOrderTxId, + meta: publishedAlgoDataset.ddo.metadata.algorithm + }, + output: {}, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken + }, + maxJobDuration: computeJobDuration, + resources: re + // additionalDatasets?: ComputeAsset[] + // output?: ComputeOutput + } + // it should fail, because we don't have enough free resources + const response = await new PaidComputeStartHandler(oceanNode).handle(startComputeTask) + console.log(response) + assert(response.status.httpStatus === 400, 'Failed to get 400 response') + assert(!response.stream, 'We should not have a stream') + }) + + it('should start a queued free docker compute job', async () => { const nonce = Date.now().toString() const message = String(nonce) // sign message/nonce @@ -620,18 +919,45 @@ describe('Compute', () => { ) const messageHashBytes = ethers.toBeArray(consumerMessage) const signature = await wallet.signMessage(messageHashBytes) - const stopComputeTask: ComputeStopCommand = { - command: PROTOCOL_COMMANDS.COMPUTE_STOP, + const startComputeTask: FreeComputeStartCommand = { + command: PROTOCOL_COMMANDS.FREE_COMPUTE_START, consumerAddress: await wallet.getAddress(), signature, nonce, - jobId + environment: firstEnv.id, + datasets: [ + { + fileObject: computeAsset.services[0].files.files[0], + documentId: publishedComputeDataset.ddo.id, + serviceId: publishedComputeDataset.ddo.services[0].id, + transferTxId: datasetOrderTxId + } + ], + algorithm: { + fileObject: algoAsset.services[0].files.files[0], + documentId: publishedAlgoDataset.ddo.id, + serviceId: publishedAlgoDataset.ddo.services[0].id, + transferTxId: algoOrderTxId, + meta: publishedAlgoDataset.ddo.metadata.algorithm + }, + output: {}, + queueMaxWaitTime: 300 // 5 minutes + // additionalDatasets?: ComputeAsset[] + // output?: ComputeOutput } - const response = await new ComputeStopHandler(oceanNode).handle(stopComputeTask) + const response = await new FreeComputeStartHandler(oceanNode).handle(startComputeTask) + console.log(response) assert(response, 'Failed to get response') assert(response.status.httpStatus === 200, 'Failed to get 200 response') assert(response.stream, 'Failed to get stream') expect(response.stream).to.be.instanceOf(Readable) + + const jobs = await streamToObject(response.stream as Readable) + assert(jobs[0].jobId, 'failed to got job id') + console.log('**** Started FREE compute job with id: ', jobs[0].jobId) + console.log(jobs[0]) + // eslint-disable-next-line prefer-destructuring + freeJobId = jobs[0].jobId }) it('should get job status by jobId', async () => { @@ -649,13 +975,14 @@ describe('Compute', () => { assert(response.stream, 'Failed to get stream') expect(response.stream).to.be.instanceOf(Readable) const jobs = await streamToObject(response.stream as Readable) + expect(jobs[0].metadata).to.deep.equal({ key: 'value' }) console.log(jobs) }) it('should get job status by consumer', async () => { const statusComputeTask: ComputeGetStatusCommand = { command: PROTOCOL_COMMANDS.COMPUTE_GET_STATUS, - consumerAddress: wallet.address, + consumerAddress: consumerAccount.address, agreementId: null, jobId: null } @@ -669,13 +996,174 @@ describe('Compute', () => { const jobs = await streamToObject(response.stream as Readable) console.log(jobs) }) - - it('should checkC2DEnvExists', async () => { - const envId = '0x123' - const result = await checkC2DEnvExists(envId, oceanNode) - expect(result).to.equal(false) + it('should get job result by consumer', async () => { + const nonce = Date.now().toString() + const message = String((await wallet.getAddress()) + jobId + '0' + nonce) + // sign message/nonce + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await wallet.signMessage(messageHashBytes) + const resultComputeTask: ComputeGetResultCommand = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_RESULT, + consumerAddress: await wallet.getAddress(), + jobId, + signature, + nonce, + index: 0 + } + const response = await new ComputeGetResultHandler(oceanNode).handle( + resultComputeTask + ) + assert(response, 'Failed to get response') + assert(response.status.httpStatus === 200, 'Failed to get 200 response') + }) + it('should get job result by additional viewer', async () => { + const nonce = Date.now().toString() + const message = String((await wallet2.getAddress()) + jobId + '0' + nonce) + // sign message/nonce + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await wallet2.signMessage(messageHashBytes) + const resultComputeTask: ComputeGetResultCommand = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_RESULT, + consumerAddress: await wallet2.getAddress(), + jobId, + signature, + nonce, + index: 0 + } + const response = await new ComputeGetResultHandler(oceanNode).handle( + resultComputeTask + ) + assert(response, 'Failed to get response') + assert(response.status.httpStatus === 200, 'Failed to get 200 response') + }) + it('should fail to get job result by non allowed address', async () => { + const nonce = Date.now().toString() + const message = String((await wallet3.getAddress()) + jobId + '0' + nonce) + // sign message/nonce + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await wallet3.signMessage(messageHashBytes) + const resultComputeTask: ComputeGetResultCommand = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_RESULT, + consumerAddress: await wallet3.getAddress(), + jobId, + signature, + nonce, + index: 0 + } + const response = await new ComputeGetResultHandler(oceanNode).handle( + resultComputeTask + ) + console.log(response) + assert(response, 'Failed to get response') + assert(response.status.httpStatus === 500, 'Failed to get 500 response') + console.log(response.status.error) }) + it('should stop a compute job', async () => { + const nonce = Date.now().toString() + const message = String((await consumerAccount.getAddress()) + (jobId || '')) + // sign message/nonce + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await wallet.signMessage(messageHashBytes) + const stopComputeTask: ComputeStopCommand = { + command: PROTOCOL_COMMANDS.COMPUTE_STOP, + consumerAddress: await consumerAccount.getAddress(), + signature, + nonce, + jobId + } + const response = await new ComputeStopHandler(oceanNode).handle(stopComputeTask) + assert(response, 'Failed to get response') + assert(response.status.httpStatus === 200, 'Failed to get 200 response') + assert(response.stream, 'Failed to get stream') + expect(response.stream).to.be.instanceOf(Readable) + let tries = 0 + do { + const statusComputeTask: ComputeGetStatusCommand = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_STATUS, + consumerAddress: null, + agreementId: null, + jobId + } + const response = await new ComputeGetStatusHandler(oceanNode).handle( + statusComputeTask + ) + assert(response, 'Failed to get response') + assert(response.status.httpStatus === 200, 'Failed to get 200 response') + assert(response.stream, 'Failed to get stream') + expect(response.stream).to.be.instanceOf(Readable) + const jobs = await streamToObject(response.stream as Readable) + console.log('Checking job status after stop...') + console.log(jobs[0]) + if (jobs[0].dateFinished) break + if (tries > 10) assert.fail('Job not stopped after multiple tries') + await sleep(2000) + tries++ + } while (true) + }) + it('should deny the Free job due to signature (directCommand payload)', async function () { + freeComputeStartPayload.environment = firstEnv.id + const command: FreeComputeStartCommand = freeComputeStartPayload + const handler = new FreeComputeStartHandler(oceanNode) + const response = await handler.handle(command) + assert(response.status.httpStatus === 401, 'Failed to get 401 response') + assert(response.stream === null, 'Should not get stream') + }) + it('should deny the Free job due to bad container image (directCommand payload)', async function () { + const nonce = Date.now().toString() + const message = String(nonce) + // sign message/nonce + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await wallet.signMessage(messageHashBytes) + freeComputeStartPayload.signature = signature + freeComputeStartPayload.nonce = nonce + freeComputeStartPayload.environment = firstEnv.id + freeComputeStartPayload.consumerAddress = await wallet.getAddress() + const command: FreeComputeStartCommand = freeComputeStartPayload + const handler = new FreeComputeStartHandler(oceanNode) + const response = await handler.handle(command) + assert(response.status.httpStatus === 500, 'Failed to get 500 response') + assert(response.stream === null, 'Should not get stream') + }) + // let's check our queued job + it('should get job status by jobId', async () => { + const statusComputeTask: ComputeGetStatusCommand = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_STATUS, + consumerAddress: null, + agreementId: null, + jobId: freeJobId + } + const response = await new ComputeGetStatusHandler(oceanNode).handle( + statusComputeTask + ) + assert(response, 'Failed to get response') + assert(response.status.httpStatus === 200, 'Failed to get 200 response') + assert(response.stream, 'Failed to get stream') + expect(response.stream).to.be.instanceOf(Readable) + const jobs = await streamToObject(response.stream as Readable) + console.log('Checking FREE job status...') + console.log(jobs[0]) + }) // algo and checksums related describe('C2D algo and checksums related', () => { it('should publish AlgoDDO', async () => { @@ -730,7 +1218,9 @@ describe('Compute', () => { ] } const filesData = Uint8Array.from(Buffer.from(JSON.stringify(files))) - algoDDO.services[0].files = await encrypt(filesData, EncryptMethod.ECIES) + algoDDO.services[0].files = await oceanNode + .getKeyManager() + .encrypt(filesData, EncryptMethod.ECIES) const metadata = hexlify(Buffer.from(JSON.stringify(algoDDO))) const hash = createHash('sha256').update(metadata).digest('hex') @@ -800,7 +1290,9 @@ describe('Compute', () => { ] } const filesData = Uint8Array.from(Buffer.from(JSON.stringify(files))) - datasetDDO.services[0].files = await encrypt(filesData, EncryptMethod.ECIES) + datasetDDO.services[0].files = await oceanNode + .getKeyManager() + .encrypt(filesData, EncryptMethod.ECIES) datasetDDO.services[0].compute = { allowRawAlgorithm: false, @@ -846,10 +1338,12 @@ describe('Compute', () => { ) const algoDDOTest = ddo if (algoDDOTest) { + const config = await getConfiguration() const algoChecksums = await getAlgoChecksums( algoDDOTest.id, algoDDOTest.services[0].id, - oceanNode + oceanNode, + config ) expect(algoChecksums.files).to.equal( 'f6a7b95e4a2e3028957f69fdd2dac27bd5103986b2171bc8bfee68b52f874dcd' @@ -857,11 +1351,12 @@ describe('Compute', () => { expect(algoChecksums.container).to.equal( 'ba8885fcc7d366f058d6c3bb0b7bfe191c5f85cb6a4ee3858895342436c23504' ) + expect(algoChecksums.serviceId).to.equal(algoDDOTest.services[0].id) } else expect(expectedTimeoutFailure(this.test.title)).to.be.equal(wasTimeout) }) it('should validateAlgoForDataset', async function () { - this.timeout(DEFAULT_TEST_TIMEOUT * 3) + this.timeout(DEFAULT_TEST_TIMEOUT * 10) const { ddo, wasTimeout } = await waitToIndex( algoDDO.id, EVENTS.METADATA_CREATED, @@ -871,10 +1366,12 @@ describe('Compute', () => { const algoDDOTest = ddo if (algoDDOTest) { + const config = await getConfiguration() const algoChecksums = await getAlgoChecksums( algoDDOTest.id, algoDDOTest.services[0].id, - oceanNode + oceanNode, + config ) const { ddo, wasTimeout } = await waitToIndex( datasetDDO.id, @@ -884,15 +1381,21 @@ describe('Compute', () => { ) const datasetDDOTest = ddo + const datasetInstance = DDOManager.getDDOClass(datasetDDO) + console.log('datasetDDOTest', datasetDDOTest) if (datasetDDOTest) { const result = await validateAlgoForDataset( algoDDOTest.id, algoChecksums, - datasetDDOTest, + datasetInstance, datasetDDOTest.services[0].id, oceanNode ) - expect(result).to.equal(!setTrustedAlgosEmpty) + // datasetDDOTest does not have set + // publisherTrustedAlgorithms, nor + // publisherTrustedAlgorithmPublishers + // expect the result to be true + expect(result).to.equal(true) } else expect(expectedTimeoutFailure(this.test.title)).to.be.equal(wasTimeout) } else expect(expectedTimeoutFailure(this.test.title)).to.be.equal(wasTimeout) }) @@ -900,6 +1403,423 @@ describe('Compute', () => { after(async () => { await tearDownEnvironment(previousConfiguration) - indexer.stopAllThreads() + indexer.stopAllChainIndexers() + }) +}) + +describe('Compute Access Restrictions', () => { + let previousConfiguration: OverrideEnvConfig[] + let config: OceanNodeConfig + let dbconn: Database + let oceanNode: OceanNode + let provider: any + let publisherAccount: any + let computeEnvironments: any + let publishedComputeDataset: any + let publishedAlgoDataset: any + let paymentToken: any + let firstEnv: ComputeEnvironment + let accessListAddress: string + + const wallet = new ethers.Wallet( + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' + ) + const wallet2 = new ethers.Wallet( + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45210' + ) + const wallet3 = new ethers.Wallet( + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d4521A' + ) + const mockSupportedNetworks: RPCS = getMockSupportedNetworks() + const computeJobDuration = 60 * 15 + + async function createPaidComputeCommand( + consumerAddr: string, + signerWallet: ethers.Wallet, + envId: string + ): Promise { + const nonce = Date.now().toString() + const message = String(consumerAddr + publishedComputeDataset.ddo.id + nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const signature = await signerWallet.signMessage(ethers.toBeArray(consumerMessage)) + + return { + command: PROTOCOL_COMMANDS.COMPUTE_START, + consumerAddress: consumerAddr, + environment: envId, + signature, + nonce, + datasets: [ + { + documentId: publishedComputeDataset.ddo.id, + serviceId: publishedComputeDataset.ddo.services[0].id, + transferTxId: '0x123' + } + ], + algorithm: { + documentId: publishedAlgoDataset.ddo.id, + serviceId: publishedAlgoDataset.ddo.services[0].id, + transferTxId: '0x123', + meta: publishedAlgoDataset.ddo.metadata.algorithm + }, + payment: { chainId: DEVELOPMENT_CHAIN_ID, token: paymentToken }, + maxJobDuration: computeJobDuration + } + } + + async function createFreeComputeCommand( + consumerAddr: string, + signerWallet: ethers.Wallet, + envId: string + ): Promise { + const nonce = Date.now().toString() + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(nonce))] + ) + const signature = await signerWallet.signMessage(ethers.toBeArray(consumerMessage)) + + return { + command: PROTOCOL_COMMANDS.FREE_COMPUTE_START, + consumerAddress: consumerAddr, + signature, + nonce, + environment: envId, + datasets: [ + { + fileObject: computeAsset.services[0].files.files[0], + documentId: publishedComputeDataset.ddo.id, + serviceId: publishedComputeDataset.ddo.services[0].id + } + ], + algorithm: { + fileObject: algoAsset.services[0].files.files[0], + documentId: publishedAlgoDataset.ddo.id, + serviceId: publishedAlgoDataset.ddo.services[0].id, + meta: publishedAlgoDataset.ddo.metadata.algorithm + }, + output: {} + } + } + + describe('Address-based restrictions', () => { + before(async () => { + const artifactsAddresses = getOceanArtifactsAdresses() + paymentToken = artifactsAddresses.development.Ocean + const allowedAddress = await wallet.getAddress() + previousConfiguration = await setupEnvironment( + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.RPCS, + ENVIRONMENT_VARIABLES.INDEXER_NETWORKS, + ENVIRONMENT_VARIABLES.PRIVATE_KEY, + ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS, + ENVIRONMENT_VARIABLES.ADDRESS_FILE, + ENVIRONMENT_VARIABLES.DOCKER_COMPUTE_ENVIRONMENTS + ], + [ + JSON.stringify(mockSupportedNetworks), + JSON.stringify([DEVELOPMENT_CHAIN_ID]), + '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', + JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), + `${homedir}/.ocean/ocean-contracts/artifacts/address.json`, + '[{"socketPath":"/var/run/docker.sock","resources":[{"id":"disk","total":10}],"storageExpiry":604800,"maxJobDuration":3600,"minJobDuration":60,"access":{"addresses":["' + + allowedAddress + + '"],"accessLists":[]},"fees":{"' + + DEVELOPMENT_CHAIN_ID + + '":[{"feeToken":"' + + paymentToken + + '","prices":[{"id":"cpu","price":1}]}]},"free":{"maxJobDuration":60,"minJobDuration":10,"maxJobs":3,"access":{"addresses":["' + + allowedAddress + + '"],"accessLists":[]},"resources":[{"id":"cpu","max":1},{"id":"ram","max":1},{"id":"disk","max":1}]}}]' + ] + ) + ) + config = await getConfiguration(true) + dbconn = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance( + config, + dbconn, + null, + null, + null, + null, + null, + true + ) + const indexer = new OceanIndexer( + dbconn, + config.indexingNetworks, + oceanNode.blockchainRegistry + ) + oceanNode.addIndexer(indexer) + oceanNode.addC2DEngines() + + provider = new JsonRpcProvider('http://127.0.0.1:8545') + publisherAccount = await provider.getSigner(0) + + publishedComputeDataset = await publishAsset(computeAsset, publisherAccount) + publishedAlgoDataset = await publishAsset(algoAsset, publisherAccount) + + await waitToIndex( + publishedComputeDataset.ddo.id, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT + ) + await waitToIndex( + publishedAlgoDataset.ddo.id, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT + ) + }) + + it('Get compute environments with address restrictions', async () => { + const getEnvironmentsTask = { command: PROTOCOL_COMMANDS.COMPUTE_GET_ENVIRONMENTS } + const response = await new ComputeGetEnvironmentsHandler(oceanNode).handle( + getEnvironmentsTask + ) + computeEnvironments = await streamToObject(response.stream as Readable) + firstEnv = computeEnvironments[0] + assert(firstEnv.access, 'Access control should exist') + assert( + firstEnv.access.addresses.includes(await wallet.getAddress()), + 'Should have wallet address in allowed list' + ) + }) + + it('should deny access for paid compute when address not in allowed list', async () => { + const command = await createPaidComputeCommand( + await wallet3.getAddress(), + wallet3, + firstEnv.id + ) + const response = await new PaidComputeStartHandler(oceanNode).handle(command) + assert(response.status.httpStatus === 403, 'Should get 403 access denied') + }) + + it('should deny access for free compute when address not in allowed list', async () => { + const command = await createFreeComputeCommand( + await wallet3.getAddress(), + wallet3, + firstEnv.id + ) + const response = await new FreeComputeStartHandler(oceanNode).handle(command) + assert(response.status.httpStatus === 403, 'Should get 403 access denied') + }) + + after(async () => { + await tearDownEnvironment(previousConfiguration) + }) + }) + + describe('Access List restrictions', () => { + before(async () => { + const artifactsAddresses = getOceanArtifactsAdresses() + paymentToken = artifactsAddresses.development.Ocean + + provider = new JsonRpcProvider('http://127.0.0.1:8545') + publisherAccount = await provider.getSigner(0) + + const AccessListFactory = await import( + '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessListFactory.sol/AccessListFactory.json', + { with: { type: 'json' } } + ) + + const factoryContract = new ethers.Contract( + artifactsAddresses.development.AccessListFactory, + AccessListFactory.default.abi, + publisherAccount + ) + + const tx = await factoryContract.deployAccessListContract( + 'ComputeAccessList', + 'CAL', + false, + await publisherAccount.getAddress(), + [await wallet.getAddress(), await wallet2.getAddress()], + ['https://oceanprotocol.com/nft/', 'https://oceanprotocol.com/nft/'] + ) + const txReceipt = await tx.wait() + const events = txReceipt?.logs?.filter((log: any) => { + return log.fragment?.name === 'NewAccessList' + }) + accessListAddress = events[0].args[0] + + const AccessListAbi = await import( + '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessList.sol/AccessList.json', + { with: { type: 'json' } } + ) + const accessListContract = new ethers.Contract( + accessListAddress, + AccessListAbi.default.abi, + publisherAccount + ) + const wallet1Balance = await accessListContract.balanceOf(await wallet.getAddress()) + const wallet2Balance = await accessListContract.balanceOf( + await wallet2.getAddress() + ) + const wallet3Balance = await accessListContract.balanceOf( + await wallet3.getAddress() + ) + + if (Number(wallet1Balance) === 0 || Number(wallet2Balance) === 0) { + throw new Error('Access list tokens were not minted correctly') + } + + if (Number(wallet3Balance) > 0) { + throw new Error('Wallet3 should not have access list token') + } + + previousConfiguration = await setupEnvironment( + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.RPCS, + ENVIRONMENT_VARIABLES.INDEXER_NETWORKS, + ENVIRONMENT_VARIABLES.PRIVATE_KEY, + ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS, + ENVIRONMENT_VARIABLES.ADDRESS_FILE, + ENVIRONMENT_VARIABLES.DOCKER_COMPUTE_ENVIRONMENTS + ], + [ + JSON.stringify(mockSupportedNetworks), + JSON.stringify([DEVELOPMENT_CHAIN_ID]), + '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', + JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), + `${homedir}/.ocean/ocean-contracts/artifacts/address.json`, + JSON.stringify([ + { + socketPath: '/var/run/docker.sock', + resources: [{ id: 'disk', total: 10 }], + storageExpiry: 604800, + maxJobDuration: 3600, + minJobDuration: 60, + access: { + addresses: [], + accessLists: { + [DEVELOPMENT_CHAIN_ID]: [accessListAddress] + } + }, + fees: { + [DEVELOPMENT_CHAIN_ID]: [ + { + feeToken: paymentToken, + prices: [{ id: 'cpu', price: 1 }] + } + ] + }, + free: { + maxJobDuration: 60, + minJobDuration: 10, + maxJobs: 3, + access: { + addresses: [], + accessLists: { + DEVELOPMENT_CHAIN_ID: [accessListAddress] + } + }, + resources: [ + { id: 'cpu', max: 1 }, + { id: 'ram', max: 1 }, + { id: 'disk', max: 1 } + ] + } + } + ]) + ] + ) + ) + config = await getConfiguration(true) + dbconn = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance( + config, + dbconn, + null, + null, + null, + null, + null, + true + ) + const indexer = new OceanIndexer( + dbconn, + config.indexingNetworks, + oceanNode.blockchainRegistry + ) + oceanNode.addIndexer(indexer) + oceanNode.addC2DEngines() + + publishedComputeDataset = await publishAsset(computeAsset, publisherAccount) + publishedAlgoDataset = await publishAsset(algoAsset, publisherAccount) + + await waitToIndex( + publishedComputeDataset.ddo.id, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT + ) + await waitToIndex( + publishedAlgoDataset.ddo.id, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT + ) + }) + + it('Get compute environments with access list restrictions', async () => { + const getEnvironmentsTask = { command: PROTOCOL_COMMANDS.COMPUTE_GET_ENVIRONMENTS } + const response = await new ComputeGetEnvironmentsHandler(oceanNode).handle( + getEnvironmentsTask + ) + computeEnvironments = await streamToObject(response.stream as Readable) + firstEnv = computeEnvironments[0] + assert(firstEnv.access, 'Access control should exist') + assert( + firstEnv.access.accessLists[DEVELOPMENT_CHAIN_ID].includes(accessListAddress), + 'Should have access list address' + ) + }) + + it('should allow access for paid compute when address is in access list', async () => { + const command = await createPaidComputeCommand( + await wallet.getAddress(), + wallet, + firstEnv.id + ) + const response = await new PaidComputeStartHandler(oceanNode).handle(command) + console.log(response) + expect(response.status.httpStatus).to.not.equal(403) + }) + + it('should deny access for paid compute when address not in access list', async () => { + const command = await createPaidComputeCommand( + await wallet3.getAddress(), + wallet3, + firstEnv.id + ) + const response = await new PaidComputeStartHandler(oceanNode).handle(command) + console.log(response) + assert( + response.status.httpStatus === 403, + `Expected 403 but got ${response.status.httpStatus}: ${response.status.error}` + ) + }) + + it('should allow access for free compute when address is in access list', async () => { + const command = await createFreeComputeCommand( + await wallet2.getAddress(), + wallet2, + firstEnv.id + ) + const response = await new FreeComputeStartHandler(oceanNode).handle(command) + console.log(response) + expect(response.status.httpStatus).to.not.equal(403) + }) + + after(async () => { + await tearDownEnvironment(previousConfiguration) + }) }) }) diff --git a/src/test/integration/configAdmin.test.ts b/src/test/integration/configAdmin.test.ts new file mode 100644 index 000000000..e971d5508 --- /dev/null +++ b/src/test/integration/configAdmin.test.ts @@ -0,0 +1,375 @@ +import { Wallet } from 'ethers' +import { Database } from '../../components/database/index.js' +import { getConfiguration, loadConfigFromFile } from '../../utils/index.js' +import { + DEFAULT_TEST_TIMEOUT, + OverrideEnvConfig, + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig, + setupEnvironment, + tearDownEnvironment, + getMockSupportedNetworks +} from '../utils/utils.js' +import { ENVIRONMENT_VARIABLES, PROTOCOL_COMMANDS } from '../../utils/constants.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { RPCS } from '../../@types/blockchain.js' +import { OceanNode } from '../../OceanNode.js' +import { FetchConfigHandler } from '../../components/core/admin/fetchConfigHandler.js' +import { PushConfigHandler } from '../../components/core/admin/pushConfigHandler.js' +import { streamToObject } from '../../utils/util.js' +import { Readable } from 'stream' +import { expect } from 'chai' + +describe('Config Admin Endpoints Integration Tests', () => { + let config: OceanNodeConfig + let database: Database + let adminAccount: Wallet + let previousConfiguration: OverrideEnvConfig[] + let oceanNode: OceanNode + + const mockSupportedNetworks: RPCS = getMockSupportedNetworks() + + before(async () => { + const adminPrivateKey = + '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58' + adminAccount = new Wallet(adminPrivateKey) + const adminAddress = await adminAccount.getAddress() + + previousConfiguration = await setupEnvironment( + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.RPCS, + ENVIRONMENT_VARIABLES.INDEXER_NETWORKS, + ENVIRONMENT_VARIABLES.ALLOWED_ADMINS + ], + [ + JSON.stringify(mockSupportedNetworks), + JSON.stringify([8996]), + JSON.stringify([adminAddress]) + ] + ) + ) + + config = await getConfiguration(true) + database = await Database.init(config.dbConfig) + oceanNode = OceanNode.getInstance(config, database) + }) + + after(async () => { + await tearDownEnvironment(previousConfiguration) + }) + + const getAdminSignature = async (expiryTimestamp: number): Promise => { + const message = expiryTimestamp.toString() + return await adminAccount.signMessage(message) + } + + describe('Fetch Config Tests', () => { + it('should fetch current config', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() + 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const handlerResponse = await new FetchConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.FETCH_CONFIG, + expiryTimestamp, + signature + }) + + expect(handlerResponse.status.httpStatus).to.equal(200) + + const response = await streamToObject(handlerResponse.stream as Readable) + expect(response).to.be.an('object') + expect(response).to.have.property('hasHttp') + expect(response).to.have.property('hasP2P') + }) + + it('should hide private key in fetched config', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() + 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const handlerResponse = await new FetchConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.FETCH_CONFIG, + expiryTimestamp, + signature + }) + + expect(handlerResponse.status.httpStatus).to.equal(200) + + const response = await streamToObject(handlerResponse.stream as Readable) + expect(response).to.have.property('keys') + expect(response.keys).to.have.property('privateKey') + expect(response.keys.privateKey).to.equal('[*** HIDDEN CONTENT ***]') + }) + + it('should reject fetch config with signature from non-admin', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const nonAdminPrivateKey = + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' + const nonAdminAccount = new Wallet(nonAdminPrivateKey) + + const expiryTimestamp = Date.now() + 60000 + const message = expiryTimestamp.toString() + const invalidSignature = await nonAdminAccount.signMessage(message) + + const handlerResponse = await new FetchConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.FETCH_CONFIG, + expiryTimestamp, + signature: invalidSignature + }) + + expect(handlerResponse.status.httpStatus).to.not.equal(200) + }) + + it('should reject fetch config with expired timestamp', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() - 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const handlerResponse = await new FetchConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.FETCH_CONFIG, + expiryTimestamp, + signature + }) + + expect(handlerResponse.status.httpStatus).to.not.equal(200) + }) + }) + + describe('Push Config Tests', () => { + it('should push config changes and reload node', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() + 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const newConfig = { + rateLimit: 100, + maxConnections: 200 + } + + const handlerResponse = await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp, + signature, + config: newConfig + }) + + expect(handlerResponse.status.httpStatus).to.equal(200) + + const response = await streamToObject(handlerResponse.stream as Readable) + expect(response).to.be.an('object') + expect(response.rateLimit).to.equal(100) + expect(response.maxConnections).to.equal(200) + + const savedConfig = loadConfigFromFile() + expect(savedConfig.rateLimit).to.equal(100) + expect(savedConfig.maxConnections).to.equal(200) + + const restoreConfig = { + rateLimit: 30, + maxConnections: 30 + } + + await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp: Date.now() + 60000, + signature: await getAdminSignature(Date.now() + 60000), + config: restoreConfig + }) + }) + + it('should merge new config with existing config', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() + 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const fetchResponse = await new FetchConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.FETCH_CONFIG, + expiryTimestamp, + signature + }) + + const currentConfig = await streamToObject(fetchResponse.stream as Readable) + + const partialConfig = { + rateLimit: 75 + } + + const pushResponse = await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp: Date.now() + 60000, + signature: await getAdminSignature(Date.now() + 60000), + config: partialConfig + }) + + const updatedConfig = await streamToObject(pushResponse.stream as Readable) + + expect(updatedConfig.rateLimit).to.equal(75) + expect(updatedConfig.maxConnections).to.equal(currentConfig.maxConnections) + + await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp: Date.now() + 60000, + signature: await getAdminSignature(Date.now() + 60000), + config: { rateLimit: currentConfig.rateLimit } + }) + }) + + it('should hide private key in push config response', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() + 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const response = await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp, + signature, + config: { rateLimit: 50 } + }) + + expect(response.status.httpStatus).to.equal(200) + + const updatedConfig = await streamToObject(response.stream as Readable) + expect(updatedConfig).to.have.property('keys') + expect(updatedConfig.keys).to.have.property('privateKey') + expect(updatedConfig.keys.privateKey).to.equal('[*** HIDDEN CONTENT ***]') + + await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp: Date.now() + 60000, + signature: await getAdminSignature(Date.now() + 60000), + config: { rateLimit: 30 } + }) + }) + + it('should reject push config with signature from non-admin', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const nonAdminPrivateKey = + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' + const nonAdminAccount = new Wallet(nonAdminPrivateKey) + + const expiryTimestamp = Date.now() + 60000 + const message = expiryTimestamp.toString() + const invalidSignature = await nonAdminAccount.signMessage(message) + + const handlerResponse = await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp, + signature: invalidSignature, + config: { rateLimit: 100 } + }) + + expect(handlerResponse.status.httpStatus).to.not.equal(200) + }) + + it('should reject push config with expired timestamp', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() - 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const handlerResponse = await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp, + signature, + config: { rateLimit: 100 } + }) + + expect(handlerResponse.status.httpStatus).to.not.equal(200) + }) + + it('should reject push config with missing config parameter', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() + 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const handlerResponse = await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp, + signature, + config: undefined + }) + + expect(handlerResponse.status.httpStatus).to.equal(400) + }) + + it('should reject push config with invalid config type', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() + 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const handlerResponse = await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp, + signature, + config: 'invalid' as any + }) + + expect(handlerResponse.status.httpStatus).to.equal(400) + }) + + it('should reject push config with invalid field values (Zod validation)', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() + 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const handlerResponse = await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp, + signature, + config: { rateLimit: 'not-a-number' as any } + }) + + expect(handlerResponse.status.httpStatus).to.equal(400) + expect(handlerResponse.status.error).to.not.equal(undefined) + expect(handlerResponse.stream).to.equal(null) + }) + }) + + describe('Config Reload Tests', () => { + it('should reload node configuration after push', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const expiryTimestamp = Date.now() + 60000 + const signature = await getAdminSignature(expiryTimestamp) + + const configBefore = await getConfiguration() + + await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp, + signature, + config: { rateLimit: 999 } + }) + + const configAfter = await getConfiguration() + + expect(configAfter.rateLimit).to.equal(999) + expect(configAfter.rateLimit).to.not.equal(configBefore.rateLimit) + + await new PushConfigHandler(oceanNode).handle({ + command: PROTOCOL_COMMANDS.PUSH_CONFIG, + expiryTimestamp: Date.now() + 60000, + signature: await getAdminSignature(Date.now() + 60000), + config: { rateLimit: configBefore.rateLimit } + }) + }) + + after(async () => { + await tearDownEnvironment(previousConfiguration) + }) + }) +}) diff --git a/src/test/integration/configDatabase.test.ts b/src/test/integration/configDatabase.test.ts new file mode 100644 index 000000000..401075947 --- /dev/null +++ b/src/test/integration/configDatabase.test.ts @@ -0,0 +1,134 @@ +import { Database } from '../../components/database/index.js' +import { OceanNode } from '../../OceanNode.js' +import { expect, assert } from 'chai' +import { OceanIndexer } from '../../components/Indexer/index.js' +import { + buildEnvOverrideConfig, + getMockSupportedNetworks, + OverrideEnvConfig, + setupEnvironment, + tearDownEnvironment, + TEST_ENV_CONFIG_FILE +} from '../utils/utils.js' +import { ENVIRONMENT_VARIABLES, getConfiguration } from '../../utils/index.js' +import { SQLLiteConfigDatabase } from '../../components/database/SQLLiteConfigDatabase.js' +import { DB_TYPES } from '../../utils/constants.js' +import { OceanNodeDBConfig } from '../../@types/OceanNode.js' +import { homedir } from 'os' + +const versionConfig: OceanNodeDBConfig = { + url: 'http://localhost:8108/test-version?apiKey=xyz', + dbType: DB_TYPES.TYPESENSE +} + +const emptyDBConfig: OceanNodeDBConfig = { + url: '', + dbType: null +} + +describe('Config Database', () => { + let database: Database + let oceanIndexer: OceanIndexer + let initialVersionNull: any + let previousConfiguration: OverrideEnvConfig[] + + before(async () => { + database = await Database.init(versionConfig) + // override and save configuration (always before calling getConfig()) + previousConfiguration = await setupEnvironment( + TEST_ENV_CONFIG_FILE, + buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.RPCS, + ENVIRONMENT_VARIABLES.INDEXER_NETWORKS, + ENVIRONMENT_VARIABLES.PRIVATE_KEY, + ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS, + ENVIRONMENT_VARIABLES.ALLOWED_ADMINS, + ENVIRONMENT_VARIABLES.ADDRESS_FILE + ], + [ + JSON.stringify(getMockSupportedNetworks()), + JSON.stringify([8996]), + '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', + JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), + JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), + `${homedir}/.ocean/ocean-contracts/artifacts/address.json` + ] + ) + ) + + it('should have null version initially', async () => { + initialVersionNull = await oceanIndexer.getDatabase().sqliteConfig.retrieveValue() + assert(initialVersionNull.value === null, 'Initial version should be null') + }) + + const oceanNode = await OceanNode.getInstance(await getConfiguration(true), database) + oceanIndexer = new OceanIndexer( + database, + getMockSupportedNetworks(), + oceanNode.blockchainRegistry + ) + oceanNode.addIndexer(oceanIndexer) + }) + + it('check version DB instance of SQL Lite', () => { + expect(database.sqliteConfig).to.be.instanceOf(SQLLiteConfigDatabase) + }) + + it('should set and retrieve version', async () => { + // Set a specific test version + const testVersion = '0.9.9' + await oceanIndexer + .getDatabase() + .sqliteConfig.createOrUpdateConfig('version', testVersion) + + // Verify we can retrieve it + const version = await oceanIndexer.getDatabase().sqliteConfig.retrieveValue() + assert(version.value === testVersion, `Version should be ${testVersion}`) + }) + + it('should update version and retrieve latest', async () => { + const initialVersion = '0.2.2' + const updatedVersion = '0.2.3' + + // Set initial version + await oceanIndexer + .getDatabase() + .sqliteConfig.createOrUpdateConfig('version', initialVersion) + let version = await oceanIndexer.getDatabase().sqliteConfig.retrieveValue() + assert(version.value === initialVersion, `Version should be ${initialVersion}`) + + // Update to new version + await oceanIndexer + .getDatabase() + .sqliteConfig.createOrUpdateConfig('version', updatedVersion) + version = await oceanIndexer.getDatabase().sqliteConfig.retrieveValue() + assert(version.value === updatedVersion, `Version should be ${updatedVersion}`) + }) + after(async () => { + oceanIndexer.stopAllChainIndexers() + await tearDownEnvironment(previousConfiguration) + }) +}) + +describe('VersionDatabase CRUD (without Elastic or Typesense config)', () => { + let database: Database + + before(async () => { + database = await Database.init(emptyDBConfig) + }) + + it('check version DB instance of SQL Lite', () => { + expect(database.sqliteConfig).to.be.instanceOf(SQLLiteConfigDatabase) + }) + + it('create version', async () => { + const result = await database.sqliteConfig.createOrUpdateConfig('version', '0.1.0') + expect(result?.value).to.equal('0.1.0') + }) + + it('retrieve latest version', async () => { + const result = await database.sqliteConfig.retrieveValue('version') + expect(result?.value).to.equal('0.1.0') + }) +}) diff --git a/src/test/integration/credentials.test.ts b/src/test/integration/credentials.test.ts index c7fef309f..d2bd88d56 100644 --- a/src/test/integration/credentials.test.ts +++ b/src/test/integration/credentials.test.ts @@ -14,19 +14,21 @@ * 5. Try to Download the asset by all consumers. */ import { expect, assert } from 'chai' -import { JsonRpcProvider, Signer, ethers } from 'ethers' +import { JsonRpcProvider, Signer, ethers, Contract, EventLog } from 'ethers' import { Database } from '../../components/database/index.js' import { OceanIndexer } from '../../components/Indexer/index.js' import { OceanNode } from '../../OceanNode.js' -import { RPCS } from '../../@types/blockchain.js' +import { RPCS, SupportedNetwork } from '../../@types/blockchain.js' import { streamToObject } from '../../utils/util.js' import { expectedTimeoutFailure, waitToIndex } from './testUtils.js' import { + Blockchain, ENVIRONMENT_VARIABLES, EVENTS, PROTOCOL_COMMANDS, - getConfiguration + getConfiguration, + printCurrentConfig } from '../../utils/index.js' import { DownloadHandler } from '../../components/core/handler/downloadHandler.js' import { GetDdoHandler } from '../../components/core/handler/ddoHandler.js' @@ -49,28 +51,59 @@ import { getOceanArtifactsAdressesByChainId } from '../../utils/address.js' import { publishAsset, orderAsset } from '../utils/assets.js' -import { downloadAssetWithCredentials } from '../data/assets.js' +import { + algoAsset, + computeAssetWithCredentials, + downloadAssetWithCredentials, + downloadAssetWithCredentialsWithMatchAll +} from '../data/assets.js' import { ganachePrivateKeys } from '../utils/addresses.js' import { homedir } from 'os' - -describe('Should run a complete node flow.', () => { +import AccessListFactory from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessListFactory.sol/AccessListFactory.json' with { type: 'json' } +import AccessList from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessList.sol/AccessList.json' with { type: 'json' } +import { deployAccessListContract, getContract } from '../utils/contracts.js' +import { ComputeInitializeHandler } from '../../components/core/compute/initialize.js' +import { ComputeAlgorithm, ComputeAsset } from '../../@types/index.js' +import { ComputeGetEnvironmentsHandler } from '../../components/core/compute/environments.js' +import { ComputeInitializeCommand } from '../../@types/commands.js' + +describe('[Credentials Flow] - Should run a complete node flow.', () => { let config: OceanNodeConfig let oceanNode: OceanNode let provider: JsonRpcProvider + let computeEnvironments: any + let firstEnv: any let publisherAccount: Signer let consumerAccounts: Signer[] let consumerAddresses: string[] let ddo: any + let ddoWithMatchAll: any + let computeDdo: any + let algoDdo: any let did: string + let didWithMatchAll: string + let computeDid: string + let algoDid: string const orderTxIds: string[] = [] - + const orderTxIdsWithMatchAll: string[] = [] const mockSupportedNetworks: RPCS = getMockSupportedNetworks() let previousConfiguration: OverrideEnvConfig[] + let artifactsAddresses: any + let paymentToken: string + + let blockchain: Blockchain + let contractAcessList: Contract + let signer: Signer before(async () => { + provider = new JsonRpcProvider('http://127.0.0.1:8545') + publisherAccount = (await provider.getSigner(0)) as Signer + artifactsAddresses = getOceanArtifactsAdresses() + paymentToken = artifactsAddresses.development.Ocean + // override and save configuration (always before calling getConfig()) previousConfiguration = await setupEnvironment( TEST_ENV_CONFIG_FILE, @@ -81,7 +114,9 @@ describe('Should run a complete node flow.', () => { ENVIRONMENT_VARIABLES.PRIVATE_KEY, ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS, ENVIRONMENT_VARIABLES.ALLOWED_ADMINS, - ENVIRONMENT_VARIABLES.ADDRESS_FILE + ENVIRONMENT_VARIABLES.AUTHORIZED_PUBLISHERS, + ENVIRONMENT_VARIABLES.ADDRESS_FILE, + ENVIRONMENT_VARIABLES.DOCKER_COMPUTE_ENVIRONMENTS ], [ JSON.stringify(mockSupportedNetworks), @@ -89,25 +124,34 @@ describe('Should run a complete node flow.', () => { '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), JSON.stringify(['0xe2DD09d719Da89e5a3D0F2549c7E24566e947260']), - `${homedir}/.ocean/ocean-contracts/artifacts/address.json` + JSON.stringify([ + await publisherAccount.getAddress() // signer 0 + ]), + `${homedir}/.ocean/ocean-contracts/artifacts/address.json`, + '[{"socketPath":"/var/run/docker.sock","resources":[{"id":"disk","total":10}],"storageExpiry":604800,"maxJobDuration":3600,"minJobDuration":60,"fees":{"' + + DEVELOPMENT_CHAIN_ID + + '":[{"feeToken":"' + + paymentToken + + '","prices":[{"id":"cpu","price":1}]}]},"free":{"maxJobDuration":60,"minJobDuration":10,"maxJobs":3,"resources":[{"id":"cpu","max":1},{"id":"ram","max":1},{"id":"disk","max":1}]}}]' ] ) ) config = await getConfiguration(true) // Force reload the configuration - const database = await new Database(config.dbConfig) - oceanNode = await OceanNode.getInstance(database) - const indexer = new OceanIndexer(database, config.indexingNetworks) + const database = await Database.init(config.dbConfig) + oceanNode = OceanNode.getInstance(config, database) + const indexer = new OceanIndexer( + database, + config.indexingNetworks, + oceanNode.blockchainRegistry + ) oceanNode.addIndexer(indexer) + await oceanNode.addC2DEngines() - let network = getOceanArtifactsAdressesByChainId(DEVELOPMENT_CHAIN_ID) - if (!network) { - network = getOceanArtifactsAdresses().development - } - - provider = new JsonRpcProvider('http://127.0.0.1:8545') + const rpcs: RPCS = config.supportedNetworks + const chain: SupportedNetwork = rpcs[String(DEVELOPMENT_CHAIN_ID)] + blockchain = oceanNode.blockchainRegistry.getBlockchain(chain.chainId) - publisherAccount = (await provider.getSigner(0)) as Signer consumerAccounts = [ (await provider.getSigner(1)) as Signer, (await provider.getSigner(2)) as Signer, @@ -116,13 +160,68 @@ describe('Should run a complete node flow.', () => { consumerAddresses = await Promise.all(consumerAccounts.map((a) => a.getAddress())) }) + it('should deploy accessList contract', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 2) + let networkArtifacts = getOceanArtifactsAdressesByChainId(DEVELOPMENT_CHAIN_ID) + if (!networkArtifacts) { + networkArtifacts = getOceanArtifactsAdresses().development + } + + signer = await blockchain.getSigner() + const txAddress = await deployAccessListContract( + signer, + networkArtifacts.AccessListFactory, + AccessListFactory.abi, + 'AllowList', + 'ALLOW', + false, + await signer.getAddress(), + [await signer.getAddress()], + ['https://oceanprotocol.com/nft/'] + ) + + contractAcessList = getContract(txAddress, AccessList.abi, signer) + // check if we emited the event and the address is part of the list now + const account = await signer.getAddress() + const eventLogs: Array = (await contractAcessList.queryFilter( + 'AddressAdded', + networkArtifacts.startBlock, + 'latest' + )) as Array + // at least 1 event + expect(eventLogs.length).to.be.at.least(1) + for (const log of eventLogs) { + // check the account address + if (log.args.length === 2 && Number(log.args[1] >= 1)) { + const address: string = log.args[0] + expect(address.toLowerCase()).to.be.equal(account.toLowerCase()) + } + } + }) + + it('should have balance from accessList contract', async function () { + const balance = await contractAcessList.balanceOf(await signer.getAddress()) + expect(Number(balance)).to.equal(1) + }) + it('should publish download datasets', async function () { - this.timeout(DEFAULT_TEST_TIMEOUT * 3) + this.timeout(DEFAULT_TEST_TIMEOUT * 5) const publishedDataset = await publishAsset( downloadAssetWithCredentials, publisherAccount ) + const publishedDatasetWithMatchAll = await publishAsset( + downloadAssetWithCredentialsWithMatchAll, + publisherAccount + ) + + const publishedComputeDataset = await publishAsset( + computeAssetWithCredentials, + publisherAccount + ) + + const publishedAlgo = await publishAsset(algoAsset, publisherAccount) did = publishedDataset.ddo.id const { ddo, wasTimeout } = await waitToIndex( @@ -133,6 +232,40 @@ describe('Should run a complete node flow.', () => { if (!ddo) { assert(wasTimeout === true, 'published failed due to timeout!') } + didWithMatchAll = publishedDatasetWithMatchAll.ddo.id + const resolvedDdoWithMatchAll = await waitToIndex( + didWithMatchAll, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT * 3 + ) + if (!resolvedDdoWithMatchAll.ddo) { + assert(wasTimeout === true, 'published failed due to timeout!') + } + ddoWithMatchAll = resolvedDdoWithMatchAll.ddo + + computeDid = publishedComputeDataset.ddo.id + const resolvedComputeDdo = await waitToIndex( + computeDid, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT * 3 + ) + const ddoCompute = resolvedComputeDdo.ddo + const timeoutCompute = resolvedComputeDdo.wasTimeout + if (!ddoCompute) { + assert(timeoutCompute === true, 'published failed due to timeout!') + } + + algoDid = publishedAlgo.ddo.id + const resolvedAlgo = await waitToIndex( + algoDid, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT * 3 + ) + const algo = resolvedAlgo.ddo + const timeoutAlgo = resolvedAlgo.wasTimeout + if (!algo) { + assert(timeoutAlgo === true, 'published failed due to timeout!') + } }) it('should fetch the published ddo', async () => { @@ -140,9 +273,25 @@ describe('Should run a complete node flow.', () => { command: PROTOCOL_COMMANDS.GET_DDO, id: did } - const response = await new GetDdoHandler(oceanNode).handle(getDDOTask) + let response = await new GetDdoHandler(oceanNode).handle(getDDOTask) ddo = await streamToObject(response.stream as Readable) assert(ddo.id === did, 'DDO id not matching') + + const getComputeDDOTask = { + command: PROTOCOL_COMMANDS.GET_DDO, + id: computeDid + } + response = await new GetDdoHandler(oceanNode).handle(getComputeDDOTask) + computeDdo = await streamToObject(response.stream as Readable) + assert(computeDdo.id === computeDid, 'computeDdo id not matching') + + const getAlgoDDOTask = { + command: PROTOCOL_COMMANDS.GET_DDO, + id: algoDid + } + response = await new GetDdoHandler(oceanNode).handle(getAlgoDDOTask) + algoDdo = await streamToObject(response.stream as Readable) + assert(algoDdo.id === algoDid, 'computeDdo id not matching') }) it('should start an order for all consumers', async function () { @@ -162,9 +311,62 @@ describe('Should run a complete node flow.', () => { assert(txHash, `transaction id not found for consumer ${i}`) orderTxIds.push(txHash) } + for (let i = 0; i < 3; i++) { + const orderTxReceipt = await orderAsset( + ddoWithMatchAll, + 0, + consumerAccounts[i], + consumerAddresses[i], + publisherAccount, + oceanNode + ) + assert(orderTxReceipt, `order transaction for consumer ${i} failed`) + const txHash = orderTxReceipt.hash + assert(txHash, `transaction id not found for consumer ${i}`) + orderTxIdsWithMatchAll.push(txHash) + } }) - it('should download file for first consumer', async function () { + it('should fail to download file for first consumer for credentials with match all', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 3) + + const doCheck = async () => { + const consumerAddress = consumerAddresses[0] + const consumerPrivateKey = ganachePrivateKeys[consumerAddress] + const transferTxId = orderTxIdsWithMatchAll[0] + + const wallet = new ethers.Wallet(consumerPrivateKey) + const nonce = Date.now().toString() + const message = String(ddoWithMatchAll.id + nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await wallet.signMessage(messageHashBytes) + + const downloadTask = { + fileIndex: 0, + documentId: didWithMatchAll, + serviceId: ddoWithMatchAll.services[0].id, + transferTxId, + nonce, + consumerAddress, + signature, + command: PROTOCOL_COMMANDS.DOWNLOAD + } + const response = await new DownloadHandler(oceanNode).handle(downloadTask) + assert(response) + assert(response.status.httpStatus === 403, 'http status not 403') + } + + setTimeout(() => { + expect(expectedTimeoutFailure(this.test.title)).to.be.equal(true) + }, DEFAULT_TEST_TIMEOUT * 3) + + await doCheck() + }) + it('should download file for first consumer for credentials with match any', async function () { this.timeout(DEFAULT_TEST_TIMEOUT * 3) const doCheck = async () => { @@ -173,7 +375,7 @@ describe('Should run a complete node flow.', () => { const transferTxId = orderTxIds[0] const wallet = new ethers.Wallet(consumerPrivateKey) - const nonce = Math.floor(Date.now() / 1000).toString() + const nonce = Date.now().toString() const message = String(ddo.id + nonce) const consumerMessage = ethers.solidityPackedKeccak256( ['bytes'], @@ -206,6 +408,115 @@ describe('Should run a complete node flow.', () => { await doCheck() }) + it('should initializeCompute work for first consumer', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 3) + + const consumerAddress = consumerAddresses[0] + + const dataset: ComputeAsset = { + documentId: computeDid, + serviceId: computeDdo.services[0].id + } + const algorithm: ComputeAlgorithm = { + documentId: algoDid, + serviceId: algoDdo.services[0].id + } + const getEnvironmentsTask = { + command: PROTOCOL_COMMANDS.COMPUTE_GET_ENVIRONMENTS + } + const resp = await new ComputeGetEnvironmentsHandler(oceanNode).handle( + getEnvironmentsTask + ) + computeEnvironments = await streamToObject(resp.stream as Readable) + firstEnv = computeEnvironments[0] + + const initializeComputeTask: ComputeInitializeCommand = { + datasets: [dataset], + algorithm, + environment: firstEnv.id, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken + }, + maxJobDuration: 2 * 60, + consumerAddress, + command: PROTOCOL_COMMANDS.COMPUTE_INITIALIZE + } + const response = await new ComputeInitializeHandler(oceanNode).handle( + initializeComputeTask + ) + assert(response) + assert(response.stream, 'stream not present') + assert(response.status.httpStatus === 200, 'http status not 200') + expect(response.stream).to.be.instanceOf(Readable) + }) + + it('should NOT initializeCompute for second consumer - service level credentials', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 3) + + const consumerAddress = consumerAddresses[1] + + const dataset: ComputeAsset = { + documentId: computeDid, + serviceId: computeDdo.services[0].id + } + const algorithm: ComputeAlgorithm = { + documentId: algoDid, + serviceId: algoDdo.services[0].id + } + const initializeComputeTask: ComputeInitializeCommand = { + datasets: [dataset], + algorithm, + environment: firstEnv.id, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken + }, + maxJobDuration: 2 * 60, + consumerAddress, + command: PROTOCOL_COMMANDS.COMPUTE_INITIALIZE + } + const response = await new ComputeInitializeHandler(oceanNode).handle( + initializeComputeTask + ) + assert(response) + assert(response.stream === null, 'stream is present') + assert(response.status.httpStatus === 403, 'http status not 403') + }) + + it('should NOT initializeCompute for third consumer - asset level credentials', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 3) + + const consumerAddress = consumerAddresses[2] + + const dataset: ComputeAsset = { + documentId: computeDid, + serviceId: computeDdo.services[0].id + } + const algorithm: ComputeAlgorithm = { + documentId: algoDid, + serviceId: algoDdo.services[0].id + } + const initializeComputeTask: ComputeInitializeCommand = { + datasets: [dataset], + algorithm, + environment: firstEnv.id, + payment: { + chainId: DEVELOPMENT_CHAIN_ID, + token: paymentToken + }, + maxJobDuration: 2 * 60, + consumerAddress, + command: PROTOCOL_COMMANDS.COMPUTE_INITIALIZE + } + const response = await new ComputeInitializeHandler(oceanNode).handle( + initializeComputeTask + ) + assert(response) + assert(response.stream === null, 'stream is present') + assert(response.status.httpStatus === 403, 'http status not 403') + }) + it('should not allow to download the asset for second consumer - service level credentials', async function () { this.timeout(DEFAULT_TEST_TIMEOUT * 3) @@ -215,7 +526,7 @@ describe('Should run a complete node flow.', () => { const transferTxId = orderTxIds[1] const wallet = new ethers.Wallet(consumerPrivateKey) - const nonce = Math.floor(Date.now() / 1000).toString() + const nonce = Date.now().toString() const message = String(ddo.id + nonce) const consumerMessage = ethers.solidityPackedKeccak256( ['bytes'], @@ -237,7 +548,7 @@ describe('Should run a complete node flow.', () => { const response = await new DownloadHandler(oceanNode).handle(downloadTask) assert(response) assert(response.stream === null, 'stream is present') - assert(response.status.httpStatus === 500, 'http status not 500') + assert(response.status.httpStatus === 403, 'http status not 403') } setTimeout(() => { @@ -256,7 +567,7 @@ describe('Should run a complete node flow.', () => { const transferTxId = orderTxIds[1] const wallet = new ethers.Wallet(consumerPrivateKey) - const nonce = Math.floor(Date.now() / 1000).toString() + const nonce = Date.now().toString() const message = String(ddo.id + nonce) const consumerMessage = ethers.solidityPackedKeccak256( ['bytes'], @@ -288,8 +599,37 @@ describe('Should run a complete node flow.', () => { await doCheck() }) + it('should NOT allow to index the asset because address is not on AUTHORIZED_PUBLISHERS', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 2) + + // this is not authorized + const nonAuthorizedAccount = (await provider.getSigner(4)) as Signer + const authorizedAccount = await publisherAccount.getAddress() + + printCurrentConfig() + expect( + config.authorizedPublishers.length === 1 && + config.authorizedPublishers[0] === authorizedAccount, + 'Unable to set AUTHORIZED_PUBLISHERS' + ) + + const publishedDataset = await publishAsset( + downloadAssetWithCredentials, + nonAuthorizedAccount + ) + + // will timeout + const { ddo, wasTimeout } = await waitToIndex( + publishedDataset?.ddo.id, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT + ) + + assert(ddo === null && wasTimeout === true, 'DDO should NOT have been indexed') + }) + after(async () => { await tearDownEnvironment(previousConfiguration) - oceanNode.getIndexer().stopAllThreads() + oceanNode.getIndexer().stopAllChainIndexers() }) }) diff --git a/src/test/integration/database.test.ts b/src/test/integration/database.test.ts index 82cdc879c..a47ee2114 100644 --- a/src/test/integration/database.test.ts +++ b/src/test/integration/database.test.ts @@ -15,7 +15,9 @@ const typesenseConfig: OceanNodeDBConfig = { const elasticConfig: OceanNodeDBConfig = { url: 'http://localhost:9200', - dbType: DB_TYPES.ELASTIC_SEARCH + dbType: DB_TYPES.ELASTIC_SEARCH, + username: process.env.DB_USERNAME, + password: process.env.DB_PASSWORD } const emptyDBConfig: OceanNodeDBConfig = { @@ -27,7 +29,7 @@ describe('Database', () => { let database: Database before(async () => { - database = await new Database(typesenseConfig) + database = await Database.init(typesenseConfig) }) it('instance Database', () => { @@ -62,7 +64,7 @@ describe('DdoDatabase CRUD', () => { } before(async () => { - database = await new Database(typesenseConfig) + database = await Database.init(typesenseConfig) }) it('creates ddo schema as an array', () => { @@ -89,7 +91,7 @@ describe('NonceDatabase CRUD - SQL lite (With typesense DB config)', () => { let database: Database before(async () => { - database = await new Database(typesenseConfig) + database = await Database.init(typesenseConfig) }) it('check nonce DB instance of SQL Lite', () => { @@ -125,7 +127,7 @@ describe('NonceDatabase CRUD (without Elastic or Typesense config)', () => { let database: Database before(async () => { - database = await new Database(emptyDBConfig) + database = await Database.init(emptyDBConfig) }) it('check nonce DB instance of SQL Lite', () => { @@ -162,7 +164,7 @@ describe('IndexerDatabase CRUD', () => { let existsPrevious: any = {} before(async () => { - database = await new Database(typesenseConfig) + database = await Database.init(typesenseConfig) }) it('create indexer', async () => { @@ -205,7 +207,7 @@ describe('OrderDatabase CRUD', () => { let database: Database before(async () => { - database = await new Database(typesenseConfig) + database = await Database.init(typesenseConfig) }) it('create order', async () => { @@ -386,7 +388,7 @@ describe('DdoStateQuery', () => { const query = (await DatabaseFactory.createDdoStateQuery(elasticConfig)).buildQuery( 'did:op:abc123' ) - expect(query.match.did).to.equal('did:op:abc123') + expect(query.term.did).to.equal('did:op:abc123') }) it('should build Elasticsearch query for nft', async () => { @@ -394,7 +396,7 @@ describe('DdoStateQuery', () => { undefined, 'nft:op:abc123' ) - expect(query.match.nft).to.equal('nft:op:abc123') + expect(query.term.nft).to.equal('nft:op:abc123') }) it('should build Elasticsearch query for txId', async () => { @@ -403,7 +405,7 @@ describe('DdoStateQuery', () => { undefined, 'txId123' ) - expect(query.match.txId).to.equal('txId123') + expect(query.term.txId).to.equal('txId123') }) }) diff --git a/src/test/integration/download.test.ts b/src/test/integration/download.test.ts index cc4a3b4cb..1b5194950 100644 --- a/src/test/integration/download.test.ts +++ b/src/test/integration/download.test.ts @@ -39,12 +39,12 @@ import { getOceanArtifactsAdresses, getOceanArtifactsAdressesByChainId } from '../../utils/address.js' -import { publishAsset, orderAsset, updateAssetMetadata } from '../utils/assets.js' +import { publishAsset, orderAsset } from '../utils/assets.js' import { downloadAsset } from '../data/assets.js' import { genericDDO } from '../data/ddo.js' import { homedir } from 'os' -describe('Should run a complete node flow.', () => { +describe('[Download Flow] - Should run a complete node flow.', () => { let config: OceanNodeConfig let database: Database let oceanNode: OceanNode @@ -56,6 +56,7 @@ describe('Should run a complete node flow.', () => { let publishedDataset: any let actualDDO: any let indexer: OceanIndexer + let anotherConsumer: ethers.Wallet const mockSupportedNetworks: RPCS = getMockSupportedNetworks() const serviceId = '0' @@ -87,9 +88,13 @@ describe('Should run a complete node flow.', () => { ) config = await getConfiguration(true) // Force reload the configuration - database = await new Database(config.dbConfig) - oceanNode = await OceanNode.getInstance(database) - indexer = new OceanIndexer(database, config.indexingNetworks) + database = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance(config, database) + indexer = new OceanIndexer( + database, + config.indexingNetworks, + oceanNode.blockchainRegistry + ) oceanNode.addIndexer(indexer) let network = getOceanArtifactsAdressesByChainId(DEVELOPMENT_CHAIN_ID) @@ -98,6 +103,10 @@ describe('Should run a complete node flow.', () => { } provider = new JsonRpcProvider('http://127.0.0.1:8545') + anotherConsumer = new ethers.Wallet( + ENVIRONMENT_VARIABLES.NODE2_PRIVATE_KEY.value, + provider + ) publisherAccount = (await provider.getSigner(0)) as Signer consumerAccount = (await provider.getSigner(1)) as Signer @@ -105,34 +114,31 @@ describe('Should run a complete node flow.', () => { }) it('should get node status', async () => { - const oceanNodeConfig = await getConfiguration(true) - const statusCommand = { command: PROTOCOL_COMMANDS.STATUS, - node: oceanNodeConfig.keys.peerId.toString() + node: oceanNode.getKeyManager().getPeerId().toString() } const response = await new StatusHandler(oceanNode).handle(statusCommand) assert(response.status.httpStatus === 200, 'http status not 200') const resp = await streamToString(response.stream as Readable) const status = JSON.parse(resp) - assert(status.id === oceanNodeConfig.keys.peerId.toString(), 'peer id not matching ') - // test allowedAdmins - assert(status.allowedAdmins.length === 1, 'incorrect length') assert( - status.allowedAdmins[0]?.toLowerCase() === + status.id === oceanNode.getKeyManager().getPeerId().toString(), + 'peer id not matching ' + ) + assert( + status.allowedAdmins?.addresses[0]?.toLowerCase() === '0xe2DD09d719Da89e5a3D0F2549c7E24566e947260'?.toLowerCase(), - 'incorrect allowed admin publisherAddress' + 'incorrect admin address' ) assert(status.c2dClusters === undefined, 'clusters info should be undefined') assert(status.supportedSchemas === undefined, 'schemas info should be undefined') }) it('should get node detailed status', async () => { - const oceanNodeConfig = await getConfiguration(true) - const statusCommand = { command: PROTOCOL_COMMANDS.DETAILED_STATUS, - node: oceanNodeConfig.keys.peerId.toString() + node: oceanNode.getKeyManager().getPeerId().toString() } const response = await new DetailedStatusHandler(oceanNode).handle(statusCommand) assert(response.status.httpStatus === 200, 'http status not 200') @@ -240,7 +246,7 @@ describe('Should run a complete node flow.', () => { const wallet = new ethers.Wallet( '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' ) - const nonce = Math.floor(Date.now() / 1000).toString() + const nonce = Date.now().toString() const message = String(publishedDataset.ddo.id + nonce) const consumerMessage = ethers.solidityPackedKeccak256( ['bytes'], @@ -287,15 +293,24 @@ describe('Should run a complete node flow.', () => { }) it('should not allow to download the asset with different consumer address', async function () { const assetDID = publishedDataset.ddo.id + const nonce = Date.now().toString() + const message = String(assetDID + nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await anotherConsumer.signMessage(messageHashBytes) + const doCheck = async () => { const downloadTask = { fileIndex: 0, documentId: assetDID, serviceId, transferTxId: orderTxId, - nonce: Date.now().toString(), - consumerAddress: '0xBE5449a6A97aD46c8558A3356267Ee5D2731ab57', - signature: '0xBE5449a6', + nonce, + consumerAddress: await anotherConsumer.getAddress(), + signature, command: PROTOCOL_COMMANDS.DOWNLOAD } const response = await new DownloadHandler(oceanNode).handle(downloadTask) @@ -310,86 +325,8 @@ describe('Should run a complete node flow.', () => { await doCheck() }) - - it('should update state of the service to 1 - end of life', async () => { - const updatedDDO = { - ...actualDDO, - services: [ - { - ...actualDDO.services[0], - state: 1 - } - ] - } - await updateAssetMetadata(actualDDO.nftAddress, updatedDDO, publisherAccount) - await waitToIndex(updatedDDO.id, EVENTS.METADATA_UPDATED, DEFAULT_TEST_TIMEOUT, true) - }) - it('should fetch the updated ddo', async () => { - const getDDOTask = { - command: PROTOCOL_COMMANDS.GET_DDO, - id: actualDDO.id - } - const response = await new GetDdoHandler(oceanNode).handle(getDDOTask) - actualDDO = await streamToObject(response.stream as Readable) - - assert(actualDDO.services[0], 'Service not present') - assert(actualDDO.services[0].state === 1, 'Service state not updated to 1') - }) - it('should start an order', async function () { - const orderTxReceipt = await orderAsset( - actualDDO, - 0, - consumerAccount, - await consumerAccount.getAddress(), - publisherAccount, - oceanNode - ) - assert(orderTxReceipt, 'order transaction failed') - orderTxId = orderTxReceipt.hash - assert(orderTxId, 'transaction id not found') - }) - it('should not allow to download end of life service', async function () { - this.timeout(DEFAULT_TEST_TIMEOUT * 3) - - const doCheck = async () => { - const wallet = new ethers.Wallet( - '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' - ) - const nonce = Date.now().toString() - const message = String(actualDDO.id + nonce) - const consumerMessage = ethers.solidityPackedKeccak256( - ['bytes'], - [ethers.hexlify(ethers.toUtf8Bytes(message))] - ) - const messageHashBytes = ethers.toBeArray(consumerMessage) - const signature = await wallet.signMessage(messageHashBytes) - - const downloadTask = { - fileIndex: 0, - documentId: actualDDO.id, - serviceId: actualDDO.services[0].id, - transferTxId: orderTxId, - nonce, - consumerAddress, - signature, - command: PROTOCOL_COMMANDS.DOWNLOAD - } - const response = await new DownloadHandler(oceanNode).handle(downloadTask) - - assert(response) - assert(response.stream === null, 'stream is present') - assert(response.status.httpStatus === 500, 'http status not 500') - } - - setTimeout(() => { - expect(expectedTimeoutFailure(this.test.title)).to.be.equal(true) - }, DEFAULT_TEST_TIMEOUT * 3) - - await doCheck() - }) - after(async () => { await tearDownEnvironment(previousConfiguration) - indexer.stopAllThreads() + indexer.stopAllChainIndexers() }) }) diff --git a/src/test/integration/elasticsearch.test.ts b/src/test/integration/elasticsearch.test.ts index 86507cb37..171b6b727 100644 --- a/src/test/integration/elasticsearch.test.ts +++ b/src/test/integration/elasticsearch.test.ts @@ -13,9 +13,11 @@ import { SQLLiteNonceDatabase } from '../../components/database/SQLLiteNonceData const dbConfig = { url: 'http://localhost:9200', - dbType: DB_TYPES.ELASTIC_SEARCH + dbType: DB_TYPES.ELASTIC_SEARCH, + username: 'elastic', + password: 'changeme' } -const elasticsearch: Database = await new Database(dbConfig) +const elasticsearch: Database = await Database.init(dbConfig) describe('Elastic Search', () => { it('Get instances of Elastic Search', () => { diff --git a/src/test/integration/encryptDecryptDDO.test.ts b/src/test/integration/encryptDecryptDDO.test.ts index 174469394..f6d076176 100644 --- a/src/test/integration/encryptDecryptDDO.test.ts +++ b/src/test/integration/encryptDecryptDDO.test.ts @@ -9,17 +9,16 @@ import { } from 'ethers' import { assert, expect } from 'chai' import { getEventFromTx, streamToString } from '../../utils/util.js' -import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' assert { type: 'json' } +import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' with { type: 'json' } import { RPCS } from '../../@types/blockchain.js' import { DEVELOPMENT_CHAIN_ID, getOceanArtifactsAdresses, getOceanArtifactsAdressesByChainId } from '../../utils/address.js' -import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' } +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } import { genericDDO } from '../data/ddo.js' import { createHash } from 'crypto' -import { encrypt } from '../../utils/crypt.js' import { Database } from '../../components/database/index.js' import { DecryptDdoHandler } from '../../components/core/handler/ddoHandler.js' import { @@ -56,7 +55,7 @@ describe('Should encrypt and decrypt DDO', () => { let encryptedMetaData: any let documentHash: any let indexer: OceanIndexer - const nonce = Math.floor(Date.now() / 1000).toString() + const nonce = Date.now().toString() const chainId = 8996 const mockSupportedNetworks: RPCS = { @@ -103,11 +102,15 @@ describe('Should encrypt and decrypt DDO', () => { ERC721Factory.abi, publisherAccount ) - - database = await new Database(await (await getConfiguration()).dbConfig) - oceanNode = OceanNode.getInstance(database) + const config = await getConfiguration() + database = await Database.init(config.dbConfig) + oceanNode = OceanNode.getInstance(config, database) // will be used later - indexer = new OceanIndexer(database, mockSupportedNetworks) + indexer = new OceanIndexer( + database, + mockSupportedNetworks, + oceanNode.blockchainRegistry + ) oceanNode.addIndexer(indexer) }) @@ -157,7 +160,9 @@ describe('Should encrypt and decrypt DDO', () => { '0x' + createHash('sha256').update(JSON.stringify(genericAsset)).digest('hex') const genericAssetData = Uint8Array.from(Buffer.from(JSON.stringify(genericAsset))) - const encryptedData = await encrypt(genericAssetData, EncryptMethod.ECIES) + const encryptedData = await oceanNode + .getKeyManager() + .encrypt(genericAssetData, EncryptMethod.ECIES) encryptedMetaData = hexlify(encryptedData) const setMetaDataTx = await nftContract.setMetaData( @@ -213,10 +218,9 @@ describe('Should encrypt and decrypt DDO', () => { }) it('should authorize decrypter since is this node', async () => { - const config = await getConfiguration() const decryptDDOTask: DecryptDDOCommand = { command: PROTOCOL_COMMANDS.DECRYPT_DDO, - decrypterAddress: await config.keys.ethAddress, + decrypterAddress: oceanNode.getKeyManager().getEthAddress(), chainId, nonce: Date.now().toString(), signature: '0x123' @@ -311,7 +315,6 @@ describe('Should encrypt and decrypt DDO', () => { } const response = await new DecryptDdoHandler(oceanNode).handle(decryptDDOTask) expect(response.status.httpStatus).to.equal(400) - expect(response.status.error).to.equal('Decrypt DDO: checksum does not match') }) it('should return signature does not match', async () => { @@ -335,13 +338,7 @@ describe('Should encrypt and decrypt DDO', () => { it('should decrypt ddo with transactionId and return it', async () => { const nonce = Date.now().toString() const wallet = new ethers.Wallet(process.env.PRIVATE_KEY) - const message = String( - txReceiptEncryptDDO.hash + - dataNftAddress + - publisherAddress + - chainId.toString() + - nonce - ) + const message = String(txReceiptEncryptDDO.hash + publisherAddress + chainId + nonce) const messageHash = ethers.solidityPackedKeccak256( ['bytes'], [ethers.hexlify(ethers.toUtf8Bytes(message))] @@ -367,7 +364,7 @@ describe('Should encrypt and decrypt DDO', () => { it('should decrypt ddo with encryptedDocument, flags, documentHash and return it', async () => { const nonce = Date.now().toString() const wallet = new ethers.Wallet(process.env.PRIVATE_KEY) - const message = String(dataNftAddress + publisherAddress + chainId.toString() + nonce) + const message = String(dataNftAddress + publisherAddress + chainId + nonce) const messageHash = ethers.solidityPackedKeccak256( ['bytes'], [ethers.hexlify(ethers.toUtf8Bytes(message))] @@ -394,6 +391,6 @@ describe('Should encrypt and decrypt DDO', () => { after(async () => { await tearDownEnvironment(previousConfiguration) - indexer.stopAllThreads() + indexer.stopAllChainIndexers() }) }) diff --git a/src/test/integration/encryptFile.test.ts b/src/test/integration/encryptFile.test.ts index acbef3475..aa55e3ab5 100644 --- a/src/test/integration/encryptFile.test.ts +++ b/src/test/integration/encryptFile.test.ts @@ -7,6 +7,7 @@ import { Readable } from 'stream' import { EncryptFileHandler } from '../../components/core/handler/encryptHandler.js' import { EncryptFileCommand } from '../../@types/commands' import { EncryptMethod, FileObjectType, UrlFileObject } from '../../@types/fileObject.js' +import { Wallet, ethers } from 'ethers' import fs from 'fs' import { OverrideEnvConfig, @@ -21,6 +22,7 @@ describe('Encrypt File', () => { let config: OceanNodeConfig let oceanNode: OceanNode let previousConfiguration: OverrideEnvConfig[] + let anotherConsumerWallet: Wallet before(async () => { previousConfiguration = await setupEnvironment( @@ -31,13 +33,30 @@ describe('Encrypt File', () => { ) ) config = await getConfiguration(true) // Force reload the configuration - const dbconn = await new Database(config.dbConfig) - oceanNode = await OceanNode.getInstance(dbconn) + const dbconn = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance(config, dbconn) + anotherConsumerWallet = new ethers.Wallet( + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' + ) }) it('should encrypt files', async () => { + const wallet = new ethers.Wallet( + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' + ) + const nonce = Date.now().toString() + const message = String(nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await wallet.signMessage(messageHashBytes) const encryptFileTask: EncryptFileCommand = { command: PROTOCOL_COMMANDS.ENCRYPT_FILE, + nonce, + consumerAddress: await wallet.getAddress(), + signature, encryptionType: EncryptMethod.AES, files: { type: FileObjectType.URL, @@ -54,7 +73,7 @@ describe('Encrypt File', () => { const expectedHeaders = { 'Content-Type': 'application/octet-stream', - 'X-Encrypted-By': config.keys.peerId.toString(), + 'X-Encrypted-By': oceanNode.getKeyManager().getPeerId().toString(), 'X-Encrypted-Method': EncryptMethod.AES } expect(response.status.headers).to.deep.equal(expectedHeaders) @@ -63,10 +82,21 @@ describe('Encrypt File', () => { it('should encrypt raw data file on body (AES)', async () => { // should return a buffer const file: Buffer = fs.readFileSync('src/test/data/organizations-100.aes') + const nonce = Date.now().toString() + const message = String(nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await anotherConsumerWallet.signMessage(messageHashBytes) const encryptFileTask: EncryptFileCommand = { command: PROTOCOL_COMMANDS.ENCRYPT_FILE, encryptionType: EncryptMethod.AES, - rawData: file + rawData: file, + nonce, + consumerAddress: await anotherConsumerWallet.getAddress(), + signature } const response = await new EncryptFileHandler(oceanNode).handle(encryptFileTask) @@ -76,7 +106,7 @@ describe('Encrypt File', () => { expect(response.stream).to.be.instanceOf(Readable) const expectedHeaders = { 'Content-Type': 'application/octet-stream', - 'X-Encrypted-By': config.keys.peerId.toString(), + 'X-Encrypted-By': oceanNode.getKeyManager().getPeerId().toString(), 'X-Encrypted-Method': EncryptMethod.AES } expect(response.status.headers).to.deep.equal(expectedHeaders) @@ -85,10 +115,21 @@ describe('Encrypt File', () => { it('should encrypt raw data file on body (ECIES)', async () => { // should return a buffer const file: Buffer = fs.readFileSync('src/test/data/organizations-100.aes') + const nonce = Date.now().toString() + const message = String(nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await anotherConsumerWallet.signMessage(messageHashBytes) const encryptFileTask: EncryptFileCommand = { command: PROTOCOL_COMMANDS.ENCRYPT_FILE, encryptionType: EncryptMethod.ECIES, - rawData: file + rawData: file, + nonce, + consumerAddress: await anotherConsumerWallet.getAddress(), + signature } const response = await new EncryptFileHandler(oceanNode).handle(encryptFileTask) @@ -98,13 +139,21 @@ describe('Encrypt File', () => { expect(response.stream).to.be.instanceOf(Readable) const expectedHeaders = { 'Content-Type': 'application/octet-stream', - 'X-Encrypted-By': config.keys.peerId.toString(), + 'X-Encrypted-By': oceanNode.getKeyManager().getPeerId().toString(), 'X-Encrypted-Method': EncryptMethod.ECIES } expect(response.status.headers).to.deep.equal(expectedHeaders) }) it('should return unknown file type', async () => { + const nonce = Date.now().toString() + const message = String(nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await anotherConsumerWallet.signMessage(messageHashBytes) const encryptFileTask: EncryptFileCommand = { command: PROTOCOL_COMMANDS.ENCRYPT_FILE, encryptionType: EncryptMethod.AES, @@ -112,7 +161,10 @@ describe('Encrypt File', () => { type: 'Unknown', url: 'Unknown', method: 'Unknown' - } as UrlFileObject + } as UrlFileObject, + nonce, + consumerAddress: await anotherConsumerWallet.getAddress(), + signature } const response = await new EncryptFileHandler(oceanNode).handle(encryptFileTask) diff --git a/src/test/integration/getJobs.test.ts b/src/test/integration/getJobs.test.ts new file mode 100644 index 000000000..0f405a66b --- /dev/null +++ b/src/test/integration/getJobs.test.ts @@ -0,0 +1,150 @@ +import { expect } from 'chai' +import { Readable } from 'stream' +import { Database } from '../../components/database/index.js' +import { OceanNode } from '../../OceanNode.js' +import { GetJobsHandler } from '../../components/core/handler/getJobs.js' +import { + C2DStatusNumber, + C2DStatusText, + type DBComputeJob +} from '../../@types/C2D/C2D.js' +import { PROTOCOL_COMMANDS, getConfiguration } from '../../utils/index.js' +import { + DEFAULT_TEST_TIMEOUT, + OverrideEnvConfig, + TEST_ENV_CONFIG_FILE, + setupEnvironment, + tearDownEnvironment +} from '../utils/utils.js' +import { streamToObject } from '../../utils/util.js' + +// Helper to create a minimal valid DBComputeJob +function buildJob(overrides: Partial = {}): DBComputeJob { + const nowSec = Math.floor(Date.now() / 1000).toString() + return { + owner: overrides.owner || '0xowner_test', + did: overrides.did, + jobId: overrides.jobId || `job-${Date.now()}-${Math.random().toString(36).slice(2)}`, + dateCreated: overrides.dateCreated || nowSec, + dateFinished: overrides.dateFinished || (null as unknown as string), + status: overrides.status ?? C2DStatusNumber.JobStarted, + statusText: overrides.statusText || C2DStatusText.JobStarted, + results: overrides.results || [], + inputDID: overrides.inputDID, + algoDID: overrides.algoDID, + maxJobDuration: overrides.maxJobDuration, + agreementId: overrides.agreementId, + environment: overrides.environment || 'env-default', + metadata: overrides.metadata, + terminationDetails: overrides.terminationDetails, + + clusterHash: overrides.clusterHash || '', + configlogURL: overrides.configlogURL || '', + publishlogURL: overrides.publishlogURL || '', + algologURL: overrides.algologURL || '', + outputsURL: overrides.outputsURL || '', + stopRequested: overrides.stopRequested ?? false, + algorithm: overrides.algorithm as any, + assets: overrides.assets || [], + isRunning: overrides.isRunning ?? false, + isStarted: overrides.isStarted ?? true, + containerImage: overrides.containerImage || '', + isFree: overrides.isFree ?? true, + algoStartTimestamp: overrides.algoStartTimestamp || nowSec, + algoStopTimestamp: overrides.algoStopTimestamp || nowSec, + resources: overrides.resources || [], + payment: overrides.payment, + additionalViewers: overrides.additionalViewers || [], + algoDuration: overrides.algoDuration || 0, + queueMaxWaitTime: overrides.queueMaxWaitTime || 0 + } +} + +describe('GetJobsHandler integration', () => { + let previousConfiguration: OverrideEnvConfig[] + let oceanNode: OceanNode + let db: Database + let handler: GetJobsHandler + + const uniqueEnv = `env-it-${Date.now()}` + const ownerA = '0xAa0000000000000000000000000000000000000' + const ownerB = '0xBb0000000000000000000000000000000000000' + + before(async () => { + previousConfiguration = await setupEnvironment(TEST_ENV_CONFIG_FILE) + const config = await getConfiguration(true) + db = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance(config, db) + + handler = new GetJobsHandler(oceanNode) + + const jobA = buildJob({ owner: ownerA, environment: uniqueEnv }) + const jobB = buildJob({ owner: ownerB, environment: uniqueEnv }) + + await db.c2d.newJob(jobA) + await db.c2d.newJob(jobB) + + const finishedAt = Math.floor(Date.now() / 1000).toString() + + jobA.status = C2DStatusNumber.JobFinished + jobA.statusText = C2DStatusText.JobFinished + jobA.dateFinished = finishedAt + jobA.isRunning = false + + jobB.status = C2DStatusNumber.JobFinished + jobB.statusText = C2DStatusText.JobFinished + jobB.dateFinished = finishedAt + jobB.isRunning = false + + await db.c2d.updateJob(jobA) + await db.c2d.updateJob(jobB) + }) + + after(async () => { + await tearDownEnvironment(previousConfiguration) + }) + + it('validate should fail when fromTimestamp is not a string', async () => { + const validation = await handler.validate({ + command: PROTOCOL_COMMANDS.JOBS, + fromTimestamp: 12345 + } as any) + expect(validation.valid).to.be.equal(false) + expect(validation.reason).to.contain('fromTimestamp') + }) + + it('should return finished jobs for a specific environment since timestamp', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const fromTs = Math.floor(Date.now() / 1000 - 10).toString() + const resp = await handler.handle({ + command: PROTOCOL_COMMANDS.JOBS, + environments: [uniqueEnv], + fromTimestamp: fromTs + }) + + expect(resp.status.httpStatus).to.equal(200) + const jobs = (await streamToObject(resp.stream as Readable)) as any[] + + const filtered = jobs.filter((j) => j.environment === uniqueEnv) + expect(filtered.length).to.be.greaterThanOrEqual(2) + expect(filtered.every((j) => Number(j.dateFinished) >= Number(fromTs))).to.equal(true) + }) + + it('should exclude jobs owned by specified consumer addresses', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT) + + const resp = await handler.handle({ + command: PROTOCOL_COMMANDS.JOBS, + environments: [uniqueEnv], + consumerAddrs: [ownerA] + }) + + expect(resp.status.httpStatus).to.equal(200) + const jobs = (await streamToObject(resp.stream as Readable)) as any[] + + const owners = jobs.filter((j) => j.environment === uniqueEnv).map((j) => j.owner) + expect(owners.includes(ownerA)).to.equal(false) + expect(owners.includes(ownerB)).to.equal(true) + }) +}) diff --git a/src/test/integration/imageCleanUp.test.ts b/src/test/integration/imageCleanUp.test.ts new file mode 100644 index 000000000..00245525b --- /dev/null +++ b/src/test/integration/imageCleanUp.test.ts @@ -0,0 +1,325 @@ +import { expect, assert } from 'chai' +import { SQLiteCompute } from '../../components/database/sqliteCompute.js' +import { C2DDatabase } from '../../components/database/C2DDatabase.js' +import { typesenseSchemas } from '../../components/database/TypesenseSchemas.js' +import { getConfiguration } from '../../utils/config.js' +import { + buildEnvOverrideConfig, + OverrideEnvConfig, + setupEnvironment, + tearDownEnvironment, + TEST_ENV_CONFIG_FILE +} from '../utils/utils.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { ENVIRONMENT_VARIABLES } from '../../utils/constants.js' +import { C2DEngineDocker } from '../../components/c2d/compute_engine_docker.js' +import { Escrow } from '../../components/core/utils/escrow.js' +import { KeyManager } from '../../components/KeyManager/index.js' +import { C2DClusterInfo } from '../../@types/C2D/C2D.js' +import Dockerode from 'dockerode' + +describe('Docker Image Cleanup Integration Tests', () => { + let envOverrides: OverrideEnvConfig[] + let config: OceanNodeConfig + let db: C2DDatabase + let sqliteProvider: SQLiteCompute + let dockerEngine: C2DEngineDocker + let docker: Dockerode + + before(async () => { + envOverrides = buildEnvOverrideConfig( + [ENVIRONMENT_VARIABLES.DOCKER_COMPUTE_ENVIRONMENTS], + [ + JSON.stringify([ + { + socketPath: '/var/run/docker.sock', + resources: [{ id: 'disk', total: 10 }], + storageExpiry: 604800, + maxJobDuration: 3600, + minJobDuration: 60, + fees: { + '1': [ + { + feeToken: '0x123', + prices: [{ id: 'cpu', price: 1 }] + } + ] + }, + access: { + addresses: [], + accessLists: null + }, + imageRetentionDays: 7, + imageCleanupInterval: 60 // 1 minute for testing + } + ]) + ] + ) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) + config = await getConfiguration(true) + db = await new C2DDatabase(config.dbConfig, typesenseSchemas.c2dSchemas) + sqliteProvider = (db as any).provider as SQLiteCompute + + // Initialize Docker connection for testing + docker = new Dockerode() + }) + + after(async () => { + await tearDownEnvironment(envOverrides) + if (dockerEngine) { + await dockerEngine.stop() + } + }) + + describe('Image Tracking Database Methods', () => { + it('should create docker_images table', async () => { + await sqliteProvider.createImageTable() + // If no error is thrown, table creation succeeded + assert(true, 'Table creation should succeed') + }) + + it('should update image usage timestamp', async () => { + const testImage = 'test-image:latest' + await sqliteProvider.updateImage(testImage) + + // Verify image was recorded by querying directly + // getOldImages(0) looks for images older than now, so we query the DB directly + const imageRecord = await new Promise((resolve, reject) => { + const { db } = sqliteProvider as any + db.get( + 'SELECT image, lastUsedTimestamp FROM docker_images WHERE image = ?', + [testImage], + (err: Error | null, row: any) => { + if (err) reject(err) + else resolve(row) + } + ) + }) + + assert(imageRecord, 'Image should be recorded in database') + expect(imageRecord.image).to.equal(testImage) + expect(imageRecord.lastUsedTimestamp).to.be.a('number') + const currentTimestamp = Math.floor(Date.now() / 1000) + expect(imageRecord.lastUsedTimestamp).to.be.at.least(currentTimestamp - 1) + }) + + it('should update existing image timestamp', async () => { + const testImage = 'test-image-update:latest' + const firstTimestamp = Math.floor(Date.now() / 1000) + + // Insert image first time + await sqliteProvider.updateImage(testImage) + + // Wait a bit to ensure timestamp difference + await new Promise((resolve) => setTimeout(resolve, 1100)) + + // Update image again - timestamp should be newer + await sqliteProvider.updateImage(testImage) + + // Verify image exists with updated timestamp + const imageRecord = await new Promise((resolve, reject) => { + const { db } = sqliteProvider as any + db.get( + 'SELECT image, lastUsedTimestamp FROM docker_images WHERE image = ?', + [testImage], + (err: Error | null, row: any) => { + if (err) reject(err) + else resolve(row) + } + ) + }) + + assert(imageRecord, 'Image should be recorded in database') + expect(imageRecord.image).to.equal(testImage) + expect(imageRecord.lastUsedTimestamp).to.be.greaterThan(firstTimestamp) + }) + + it('should return old images based on retention days', async () => { + const recentImage = 'recent-image:latest' + const oldImage = 'old-image:latest' + + // Update recent image + await sqliteProvider.updateImage(recentImage) + + // Manually insert an old image by directly updating the database + const oldTimestamp = Math.floor(Date.now() / 1000) - 8 * 24 * 60 * 60 // 8 days ago + await new Promise((resolve, reject) => { + const { db } = sqliteProvider as any + db.run( + 'INSERT OR REPLACE INTO docker_images (image, lastUsedTimestamp) VALUES (?, ?)', + [oldImage, oldTimestamp], + (err: Error | null) => { + if (err) reject(err) + else resolve(undefined) + } + ) + }) + + // Get images older than 7 days + const oldImages = await sqliteProvider.getOldImages(7) + expect(oldImages).to.include(oldImage) + expect(oldImages).to.not.include(recentImage) + }) + + it('should return empty array when no old images exist', async () => { + const recentImage = 'very-recent-image:latest' + await sqliteProvider.updateImage(recentImage) + + const oldImages = await sqliteProvider.getOldImages(30) // 30 days retention + expect(oldImages).to.not.include(recentImage) + }) + }) + + describe('C2DEngineDocker Image Cleanup', () => { + let clusterConfig: C2DClusterInfo + let escrow: Escrow + let keyManager: KeyManager + + before(() => { + // Create minimal cluster config for testing + clusterConfig = { + type: 'docker' as any, + hash: 'test-cluster-hash', + connection: config.dockerComputeEnvironments[0], + tempFolder: '/tmp/test-c2d' + } + + // Create mock escrow and keyManager (minimal setup) + escrow = {} as Escrow + keyManager = {} as KeyManager + + dockerEngine = new C2DEngineDocker(clusterConfig, db, escrow, keyManager) + }) + + it('should track image usage when image is pulled', async () => { + const testImage = 'alpine:latest' + + // Call updateImageUsage directly (using private method access for testing) + await (dockerEngine as any).updateImageUsage(testImage) + + // Verify image was recorded in database + const imageRecord = await new Promise((resolve, reject) => { + const { db } = sqliteProvider as any + db.get( + 'SELECT image, lastUsedTimestamp FROM docker_images WHERE image = ?', + [testImage], + (err: Error | null, row: any) => { + if (err) reject(err) + else resolve(row) + } + ) + }) + + assert(imageRecord, 'Image should be recorded in database after updateImageUsage') + expect(imageRecord.image).to.equal(testImage) + }) + + it('should start image cleanup timer on engine start', () => { + // Check if timer property exists + assert(dockerEngine, 'dockerEngine should be initialized') + expect(dockerEngine).to.have.property('imageCleanupTimer') + }) + + it('should stop image cleanup timer on engine stop', async () => { + await dockerEngine.stop() + // Timer should be cleared + const timer = (dockerEngine as any).imageCleanupTimer + assert(timer === null, 'Timer should be cleared after stop') + }) + + it('should handle cleanup of non-existent images gracefully', async () => { + const nonExistentImage = 'non-existent-image:999999' + + // Manually insert into database + await sqliteProvider.updateImage(nonExistentImage) + + // Try to clean it up - should not throw error + try { + await (dockerEngine as any).cleanupOldImages() + assert(true, 'cleanupOldImages should complete without error') + } catch (e) { + // Cleanup should handle errors gracefully + assert.fail('cleanupOldImages should not throw errors for non-existent images') + } + }) + }) + + describe('Image Cleanup with Real Docker (if available)', () => { + let testImageName: string + + before(async () => { + // Check if Docker is available + try { + await docker.info() + } catch (e) { + // Skip tests if Docker is not available + } + }) + + it('should cleanup old images from Docker', async function () { + // Skip if Docker not available + try { + await docker.info() + } catch (e) { + this.skip() + } + + testImageName = 'alpine:3.18' + + // Pull a test image + try { + await docker.pull(testImageName) + } catch (e) { + // If pull fails, skip test + this.skip() + } + + // Track the image with old timestamp (8 days ago) + const oldTimestamp = Math.floor(Date.now() / 1000) - 8 * 24 * 60 * 60 + await new Promise((resolve, reject) => { + const { db } = sqliteProvider as any + db.run( + 'INSERT OR REPLACE INTO docker_images (image, lastUsedTimestamp) VALUES (?, ?)', + [testImageName, oldTimestamp], + (err: Error | null) => { + if (err) reject(err) + else resolve(undefined) + } + ) + }) + + // Verify image exists before cleanup + const imagesBefore = await docker.listImages() + const imageExistsBefore = imagesBefore.some( + (img) => img.RepoTags && img.RepoTags.includes(testImageName) + ) + + if (imageExistsBefore) { + // Run cleanup + await (dockerEngine as any).cleanupOldImages() + + // Verify cleanup was attempted (may or may not succeed if image in use) + // We just verify the cleanup function ran without error + assert(true, 'cleanupOldImages should complete without error') + } + }) + + after(async function () { + // Clean up test image if it exists + try { + const dockerInfo = await docker.info() + assert(dockerInfo, 'Docker should be available for cleanup') + if (testImageName) { + try { + const image = docker.getImage(testImageName) + await image.remove({ force: true }) + } catch (e) { + // Ignore errors during cleanup + } + } + } catch (e) { + // Docker not available, skip cleanup + } + }) + }) +}) diff --git a/src/test/integration/indexer.test.ts b/src/test/integration/indexer.test.ts index 5c8b53c21..059895cd1 100644 --- a/src/test/integration/indexer.test.ts +++ b/src/test/integration/indexer.test.ts @@ -11,16 +11,14 @@ import { parseUnits } from 'ethers' import { Readable } from 'stream' -import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' assert { type: 'json' } -import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' } -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' assert { type: 'json' } +import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' with { type: 'json' } +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } import { Database } from '../../components/database/index.js' -import { - INDEXER_CRAWLING_EVENT_EMITTER, - OceanIndexer -} from '../../components/Indexer/index.js' +import { DatabaseFactory } from '../../components/database/DatabaseFactory.js' +import { OceanIndexer } from '../../components/Indexer/index.js' import { RPCS } from '../../@types/blockchain.js' -import { getEventFromTx, sleep, streamToObject } from '../../utils/util.js' +import { getEventFromTx, streamToObject } from '../../utils/util.js' import { waitToIndex, expectedTimeoutFailure } from './testUtils.js' import { genericDDO } from '../data/ddo.js' import { @@ -29,11 +27,10 @@ import { getOceanArtifactsAdressesByChainId } from '../../utils/address.js' import { createFee } from '../../components/core/utils/feesHandler.js' -import { DDO } from '../../@types/DDO/DDO.js' +import { Asset, DDO } from '@oceanprotocol/ddo-js' import { DEFAULT_TEST_TIMEOUT, OverrideEnvConfig, - TEST_ENV_CONFIG_FILE, buildEnvOverrideConfig, getMockSupportedNetworks, setupEnvironment, @@ -42,22 +39,15 @@ import { import { ENVIRONMENT_VARIABLES, EVENTS, - INDEXER_CRAWLING_EVENTS, PROTOCOL_COMMANDS } from '../../utils/constants.js' import { homedir } from 'os' import { QueryDdoStateHandler } from '../../components/core/handler/queryHandler.js' import { OceanNode } from '../../OceanNode.js' import { QueryCommand } from '../../@types/commands.js' -import { - getDeployedContractBlock, - getNetworkHeight -} from '../../components/Indexer/utils.js' -import { Blockchain } from '../../utils/blockchain.js' import { getConfiguration } from '../../utils/config.js' -import { OceanNodeConfig } from '../../@types/OceanNode.js' -import { encrypt } from '../../utils/crypt.js' import { EncryptMethod } from '../../@types/fileObject.js' +import { deleteIndexedMetadataIfExists } from '../../utils/asset.js' describe('Indexer stores a new metadata events and orders.', () => { let database: Database @@ -71,7 +61,7 @@ describe('Indexer stores a new metadata events and orders.', () => { let datatokenAddress: string const chainId = 8996 let assetDID: string - let resolvedDDO: Record = {} + let resolvedDDO: Asset let genericAsset: any let setMetaDataTxReceipt: any let orderTxId: string @@ -109,9 +99,13 @@ describe('Indexer stores a new metadata events and orders.', () => { ) const config = await getConfiguration(true) - database = await new Database(config.dbConfig) - oceanNode = await OceanNode.getInstance() - indexer = new OceanIndexer(database, mockSupportedNetworks) + database = await Database.init(config.dbConfig) + oceanNode = OceanNode.getInstance(config, database) + indexer = new OceanIndexer( + database, + mockSupportedNetworks, + oceanNode.blockchainRegistry + ) oceanNode.addIndexer(indexer) let artifactsAddresses = getOceanArtifactsAdressesByChainId(DEVELOPMENT_CHAIN_ID) if (!artifactsAddresses) { @@ -176,6 +170,7 @@ describe('Indexer stores a new metadata events and orders.', () => { genericAsset.nftAddress = nftAddress assetDID = genericAsset.id // create proper service.files string + genericAsset.services[0].datatokenAddress = datatokenAddress genericAsset.services[0].files.datatokenAddress = datatokenAddress genericAsset.services[0].files.nftAddress = nftAddress // let's call node to encrypt @@ -183,7 +178,9 @@ describe('Indexer stores a new metadata events and orders.', () => { const data = Uint8Array.from( Buffer.from(JSON.stringify(genericAsset.services[0].files)) ) - const encryptedData = await encrypt(data, EncryptMethod.ECIES) + const encryptedData = await oceanNode + .getKeyManager() + .encrypt(data, EncryptMethod.ECIES) const encryptedDataString = encryptedData.toString('hex') genericAsset.services[0].files = encryptedDataString const stringDDO = JSON.stringify(genericAsset) @@ -208,11 +205,6 @@ describe('Indexer stores a new metadata events and orders.', () => { genericAsset.event.from = setMetaDataTxReceipt.from genericAsset.event.contract = setMetaDataTxReceipt.contractAddress genericAsset.event.datetime = '2023-02-15T16:42:22' - - genericAsset.nft.address = nftAddress - genericAsset.nft.owner = setMetaDataTxReceipt.from - genericAsset.nft.state = 0 - genericAsset.nft.created = '2022-12-30T08:40:43' }) it('should store the ddo in the database and return it ', async function () { @@ -229,28 +221,40 @@ describe('Indexer stores a new metadata events and orders.', () => { }) it('should have nft field stored in ddo', async function () { - assert(resolvedDDO.nft, 'NFT field is not present') + assert(resolvedDDO.indexedMetadata.nft, 'NFT field is not present') assert( - resolvedDDO.nft.address?.toLowerCase() === nftAddress?.toLowerCase(), + resolvedDDO.indexedMetadata.nft.address?.toLowerCase() === + nftAddress?.toLowerCase(), 'NFT address mismatch' ) - assert(resolvedDDO.nft.state === 0, 'NFT state mismatch') // ACTIVE - assert(resolvedDDO.nft.name === (await nftContract.name()), 'NFT name mismatch') - assert(resolvedDDO.nft.symbol === (await nftContract.symbol()), 'NFT symbol mismatch') + assert(resolvedDDO.indexedMetadata.nft.state === 0, 'NFT state mismatch') // ACTIVE + assert( + resolvedDDO.indexedMetadata.nft.name === (await nftContract.name()), + 'NFT name mismatch' + ) + assert( + resolvedDDO.indexedMetadata.nft.symbol === (await nftContract.symbol()), + 'NFT symbol mismatch' + ) assert( - resolvedDDO.nft.tokenURI === + resolvedDDO.indexedMetadata.nft.tokenURI === (await nftContract.tokenURI(await nftContract.getId())), 'NFT tokeURI mismatch' ) assert( - resolvedDDO.nft.owner?.toLowerCase() === setMetaDataTxReceipt.from?.toLowerCase(), + resolvedDDO.indexedMetadata.nft.owner?.toLowerCase() === + setMetaDataTxReceipt.from?.toLowerCase(), 'NFT owner mismatch' ) - assert(resolvedDDO.nft.created, 'NFT created timestamp does not exist') + assert( + resolvedDDO.indexedMetadata.nft.created, + 'NFT created timestamp does not exist' + ) }) it('should store the ddo state in the db with no errors and retrieve it using did', async function () { const ddoState = await database.ddoState.retrieve(resolvedDDO.id) + console.log('ddoState: ', ddoState) assert(ddoState, 'ddoState not found') expect(resolvedDDO.id).to.equal(ddoState.did) expect(ddoState.valid).to.equal(true) @@ -260,12 +264,10 @@ describe('Indexer stores a new metadata events and orders.', () => { it('should find the state of the ddo using query ddo state handler', async function () { const queryDdoStateHandler = new QueryDdoStateHandler(oceanNode) - // query using the did + const config = await getConfiguration(true) + const queryStrategy = await DatabaseFactory.createDdoStateQuery(config.dbConfig) const queryDdoState: QueryCommand = { - query: { - q: resolvedDDO.id, - query_by: 'did' - }, + query: queryStrategy.buildQuery(resolvedDDO.id), command: PROTOCOL_COMMANDS.QUERY } const response = await queryDdoStateHandler.handle(queryDdoState) @@ -273,14 +275,24 @@ describe('Indexer stores a new metadata events and orders.', () => { assert(response.status.httpStatus === 200, 'Failed to get 200 response') assert(response.stream, 'Failed to get stream') const result = await streamToObject(response.stream as Readable) - if (result) { - // Elastic Search returns Array type - const ddoState = Array.isArray(result) ? result[0] : result.hits[0].document - expect(resolvedDDO.id).to.equal(ddoState.did) - expect(ddoState.valid).to.equal(true) - expect(ddoState.error).to.equal(' ') + assert(result, 'Failed to get result from stream') + + let ddoState + if (Array.isArray(result)) { + assert(result.length > 0, 'No ddo state found in results array') + ddoState = result[0] + } else if (result.hits && Array.isArray(result.hits)) { + assert(result.hits.length > 0, 'No ddo state found in results hits') + ddoState = result.hits[0].document + } else { + assert.fail('Unexpected result format from database') } + assert(ddoState, 'ddoState is undefined') + expect(resolvedDDO.id).to.equal(ddoState.did) + expect(ddoState.valid).to.equal(true) + expect(ddoState.error).to.equal(' ') + // add txId check once we have that as change merged and the event will be indexed }) @@ -288,6 +300,7 @@ describe('Indexer stores a new metadata events and orders.', () => { resolvedDDO.metadata.name = 'dataset-name-updated' resolvedDDO.metadata.description = 'Updated description for the Ocean protocol test dataset' + resolvedDDO = deleteIndexedMetadataIfExists(resolvedDDO) const stringDDO = JSON.stringify(resolvedDDO) const bytes = Buffer.from(stringDDO) const metadata = hexlify(bytes) @@ -338,10 +351,12 @@ describe('Indexer stores a new metadata events and orders.', () => { ) const retrievedDDO: any = ddo if (retrievedDDO) { - expect(retrievedDDO.nft).to.not.equal(undefined) - expect(retrievedDDO).to.have.nested.property('nft.state') + expect(retrievedDDO.indexedMetadata.nft).to.not.equal(undefined) + expect(retrievedDDO).to.have.nested.property('indexedMetadata.nft.state') // Expect the result from contract - expect(retrievedDDO.nft.state).to.equal(parseInt(result[2].toString())) + expect(retrievedDDO.indexedMetadata.nft.state).to.equal( + parseInt(result[2].toString()) + ) } else expect(expectedTimeoutFailure(this.test.title)).to.be.equal(wasTimeout) }) @@ -362,7 +377,7 @@ describe('Indexer stores a new metadata events and orders.', () => { if (retrievedDDO != null) { // Expect the result from contract expect(retrievedDDO.id).to.equal(assetDID) - expect(retrievedDDO.nft.state).to.equal(0) + expect(retrievedDDO.indexedMetadata.nft.state).to.equal(0) } else expect(expectedTimeoutFailure(this.test.title)).to.be.equal(wasTimeout) }) @@ -449,9 +464,15 @@ describe('Indexer stores a new metadata events and orders.', () => { true ) if (ddo) { - const retrievedDDO: any = ddo - expect(retrievedDDO.stats.orders).to.equal(1) - initialOrderCount = retrievedDDO.stats.orders + const retrievedDDO = ddo + console.log('indexer retrieved ddo: ', JSON.stringify(retrievedDDO)) + for (const stat of retrievedDDO.indexedMetadata.stats) { + if (stat.datatokenAddress === datatokenAddress) { + expect(stat.orders).to.equal(1) + initialOrderCount = stat.orders + break + } + } const resultOrder = await database.order.retrieve(orderTxId) if (resultOrder) { if (resultOrder.id) { @@ -536,10 +557,15 @@ describe('Indexer stores a new metadata events and orders.', () => { true ) - const retrievedDDO: any = ddo + const retrievedDDO = ddo if (retrievedDDO) { - expect(retrievedDDO.stats.orders).to.be.greaterThan(initialOrderCount) + for (const stat of retrievedDDO.indexedMetadata.stats) { + if (stat.datatokenAddress === datatokenAddress) { + expect(stat.orders).to.be.greaterThan(initialOrderCount) + break + } + } const resultOrder = await database.order.retrieve(reuseOrderTxId) if (resultOrder) { if (resultOrder.id) { @@ -576,16 +602,18 @@ describe('Indexer stores a new metadata events and orders.', () => { const { ddo, wasTimeout } = await waitToIndex( assetDID, - EVENTS.METADATA_UPDATED, + EVENTS.METADATA_STATE, DEFAULT_TEST_TIMEOUT, true ) const resolvedDDO: any = ddo if (resolvedDDO) { // Expect a short version of the DDO - expect(Object.keys(resolvedDDO).length).to.equal(4) + expect(Object.keys(resolvedDDO).length).to.equal(5) expect( - 'id' in resolvedDDO && 'nftAddress' in resolvedDDO && 'nft' in resolvedDDO + 'id' in resolvedDDO && + 'nftAddress' in resolvedDDO && + 'nft' in resolvedDDO.indexedMetadata ).to.equal(true) } else { expect(expectedTimeoutFailure(this.test.title)).to.be.equal(wasTimeout) @@ -629,68 +657,6 @@ describe('Indexer stores a new metadata events and orders.', () => { after(async () => { await tearDownEnvironment(previousConfiguration) - indexer.stopAllThreads() - }) -}) - -describe('OceanIndexer - crawler threads', () => { - let envOverrides: OverrideEnvConfig[] - let config: OceanNodeConfig - let db: Database - let blockchain: Blockchain - - let oceanIndexer: OceanIndexer - const supportedNetworks: RPCS = getMockSupportedNetworks() - const chainID = DEVELOPMENT_CHAIN_ID.toString() - - let netHeight = 0 - let deployBlock = 0 - let startingBlock = 0 - - before(async () => { - blockchain = new Blockchain( - supportedNetworks[chainID].rpc, - supportedNetworks[chainID].network, - supportedNetworks[chainID].chainId - ) - - deployBlock = getDeployedContractBlock(supportedNetworks[chainID].chainId) - netHeight = await getNetworkHeight(blockchain.getProvider()) - startingBlock = deployBlock + 1 - supportedNetworks[chainID].startBlock = startingBlock - - envOverrides = buildEnvOverrideConfig( - [ENVIRONMENT_VARIABLES.RPCS, ENVIRONMENT_VARIABLES.ADDRESS_FILE], - [ - JSON.stringify(supportedNetworks), - `${homedir}/.ocean/ocean-contracts/artifacts/address.json` - ] - ) - envOverrides = await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) - config = await getConfiguration(true) - db = await new Database(config.dbConfig) - // oceanNode = OceanNode.getInstance(db) - }) - - it('should start a worker thread and handle RPCS "startBlock"', async () => { - INDEXER_CRAWLING_EVENT_EMITTER.addListener( - INDEXER_CRAWLING_EVENTS.CRAWLING_STARTED, - (data: any) => { - const { startBlock, contractDeploymentBlock, networkHeight } = data - expect(startBlock).to.be.equal(startingBlock) - expect(contractDeploymentBlock).to.be.equal(deployBlock) - expect(networkHeight).to.be.equal(netHeight) - } - ) - oceanIndexer = new OceanIndexer(db, supportedNetworks) - await sleep(DEFAULT_TEST_TIMEOUT / 2) - }) - - after(async () => { - await tearDownEnvironment(envOverrides) - oceanIndexer.stopAllThreads() - INDEXER_CRAWLING_EVENT_EMITTER.removeAllListeners( - INDEXER_CRAWLING_EVENTS.CRAWLING_STARTED - ) + indexer.stopAllChainIndexers() }) }) diff --git a/src/test/integration/indexerRemote.test.ts b/src/test/integration/indexerRemote.test.ts deleted file mode 100644 index 0c41ae4f6..000000000 --- a/src/test/integration/indexerRemote.test.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { expect, assert } from 'chai' -import { - JsonRpcProvider, - Signer, - Contract, - ethers, - hexlify, - ZeroAddress, - getAddress, - toUtf8Bytes -} from 'ethers' -import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' assert { type: 'json' } -import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' } -import { Database } from '../../components/database/index.js' -import { OceanIndexer } from '../../components/Indexer/index.js' -import { RPCS } from '../../@types/blockchain.js' -import { getEventFromTx } from '../../utils/util.js' -import { expectedTimeoutFailure, waitToIndex } from './testUtils.js' -import { genericDDO } from '../data/ddo.js' -import { makeDid } from '../../components/core/utils/validateDdoHandler.js' -import { create256Hash } from '../../utils/crypt.js' -import { - DEVELOPMENT_CHAIN_ID, - getOceanArtifactsAdresses, - getOceanArtifactsAdressesByChainId -} from '../../utils/address.js' -import { - getMockSupportedNetworks, - setupEnvironment, - tearDownEnvironment, - OverrideEnvConfig, - buildEnvOverrideConfig, - DEFAULT_TEST_TIMEOUT -} from '../utils/utils.js' -import { ENVIRONMENT_VARIABLES, EVENTS } from '../../utils/constants.js' -import { homedir } from 'os' -import { OceanNode } from '../../OceanNode.js' -import axios from 'axios' -import { getConfiguration } from '../../utils/index.js' - -function uploadToIpfs(data: any): Promise { - return new Promise((resolve, reject) => { - axios - .post( - 'http://172.15.0.16:5001/api/v0/add', - '--------------------------a28d68b1c872c96f\r\nContent-Disposition: form-data; name="file"; filename="ddo.json"\r\nContent-Type: application/octet-stream\r\n\r\n' + - data + - '\r\n--------------------------a28d68b1c872c96f--\r\n', - { - headers: { - 'Content-Type': - 'multipart/form-data; boundary=------------------------a28d68b1c872c96f' - } - } - ) - .then(function (response: any) { - resolve(response.data.Hash) - }) - .catch(function (error: any) { - reject(error) - }) - }) -} - -describe('RemoteDDO: Indexer stores a new metadata events and orders.', () => { - let database: Database - // eslint-disable-next-line no-unused-vars - let indexer: OceanIndexer - let provider: JsonRpcProvider - let factoryContract: Contract - let nftContract: Contract - let publisherAccount: Signer - // eslint-disable-next-line no-unused-vars - let consumerAccount: Signer - let nftAddress: string - let datatokenAddress: string - let resolvedDDO: Record - // eslint-disable-next-line no-unused-vars - let genericAsset: any - let setMetaDataTxReceipt: any - // eslint-disable-next-line no-unused-vars - let oceanNode: OceanNode - const chainId = 8996 - let previousConfiguration: OverrideEnvConfig[] - const mockSupportedNetworks: RPCS = getMockSupportedNetworks() - - before(async () => { - const config = await getConfiguration(true) - - previousConfiguration = await setupEnvironment( - null, - buildEnvOverrideConfig( - [ - ENVIRONMENT_VARIABLES.RPCS, - ENVIRONMENT_VARIABLES.PRIVATE_KEY, - ENVIRONMENT_VARIABLES.DB_URL, - ENVIRONMENT_VARIABLES.ADDRESS_FILE - ], - [ - JSON.stringify(mockSupportedNetworks), - '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', - config.dbConfig.url, - `${homedir}/.ocean/ocean-contracts/artifacts/address.json` - ] - ) - ) - - database = await new Database(config.dbConfig) - indexer = new OceanIndexer(database, mockSupportedNetworks) - oceanNode = await OceanNode.getInstance(database) - let artifactsAddresses = getOceanArtifactsAdressesByChainId(DEVELOPMENT_CHAIN_ID) - if (!artifactsAddresses) { - artifactsAddresses = getOceanArtifactsAdresses().development - } - - provider = new JsonRpcProvider('http://127.0.0.1:8545') - publisherAccount = (await provider.getSigner(0)) as Signer - consumerAccount = (await provider.getSigner(1)) as Signer - genericAsset = genericDDO - factoryContract = new ethers.Contract( - artifactsAddresses.ERC721Factory, - ERC721Factory.abi, - publisherAccount - ) - }) - - it('should publish a dataset', async () => { - const tx = await factoryContract.createNftWithErc20( - { - name: '72120Bundle', - symbol: '72Bundle', - templateIndex: 1, - tokenURI: 'https://oceanprotocol.com/nft/', - transferable: true, - owner: await publisherAccount.getAddress() - }, - { - strings: ['ERC20B1', 'ERC20DT1Symbol'], - templateIndex: 1, - addresses: [ - await publisherAccount.getAddress(), - ZeroAddress, - ZeroAddress, - '0x0000000000000000000000000000000000000000' - ], - uints: [1000, 0], - bytess: [] - } - ) - const txReceipt = await tx.wait() - assert(txReceipt, 'transaction failed') - const event = getEventFromTx(txReceipt, 'NFTCreated') - nftAddress = event.args[0] - assert(nftAddress, 'find nft created failed') - const datatokenEvent = getEventFromTx(txReceipt, 'TokenCreated') - datatokenAddress = datatokenEvent.args[0] - assert(datatokenAddress, 'find datatoken created failed') - }) - - it('should set metadata and save (the remote DDO is encrypted) ', async () => { - nftContract = new ethers.Contract(nftAddress, ERC721Template.abi, publisherAccount) - const ddoToPublish = genericDDO - ddoToPublish.id = makeDid(getAddress(nftAddress), chainId.toString(10)) - const ipfsCID = await uploadToIpfs(JSON.stringify(ddoToPublish)) - const remoteDDO = { - remote: { - type: 'ipfs', - hash: ipfsCID - } - } - const stringDDO = JSON.stringify(remoteDDO) - const bytes = Buffer.from(stringDDO) - const metadata = hexlify(bytes) - // create metadata hash using the original DDO - const utf8Bytes = toUtf8Bytes(JSON.stringify(ddoToPublish)) - const hash = create256Hash(hexlify(utf8Bytes).toString()) - // publish metadata - const setMetaDataTx = await nftContract.setMetaData( - 0, - 'http://v4.provider.oceanprotocol.com', - '0x123', - '0x01', - metadata, - hash, - [] - ) - setMetaDataTxReceipt = await setMetaDataTx.wait() - assert(setMetaDataTxReceipt, 'set metada failed') - }) - - it('should store the ddo in the database and return it ', async function () { - this.timeout(DEFAULT_TEST_TIMEOUT * 2) - const did = makeDid(getAddress(nftAddress), chainId.toString(10)) - const { ddo, wasTimeout } = await waitToIndex( - did, - EVENTS.METADATA_CREATED, - DEFAULT_TEST_TIMEOUT * 2 - ) - if (ddo) { - resolvedDDO = ddo - expect(resolvedDDO.id).to.equal(genericAsset.id) - } else expect(expectedTimeoutFailure(this.test.title)).to.be.equal(wasTimeout) - }) - after(() => { - tearDownEnvironment(previousConfiguration) - }) -}) diff --git a/src/test/integration/logs.test.ts b/src/test/integration/logs.test.ts index f216d8a0c..4d528ef73 100644 --- a/src/test/integration/logs.test.ts +++ b/src/test/integration/logs.test.ts @@ -37,7 +37,7 @@ describe('LogDatabase CRUD', () => { buildEnvOverrideConfig([ENVIRONMENT_VARIABLES.LOG_DB], ['true']) ) const { dbConfig } = await getConfiguration(true) - database = await new Database(dbConfig) + database = await Database.init(dbConfig) // Initialize logger with the custom transport that writes to the LogDatabase logger = getCustomLoggerForModule( LOGGER_MODULE_NAMES.HTTP, @@ -87,11 +87,11 @@ describe('LogDatabase CRUD', () => { if (logs.length > 0) { logs = logs.filter((log) => log.message === newLogEntry.message) - expect(logs?.length).to.equal(1) - expect(Number(logs?.[0].id)).to.greaterThan(Number(logId)) - expect(logs?.[0].level).to.equal(newLogEntry.level) - expect(logs?.[0].message).to.equal(newLogEntry.message) - expect(logs?.[0].moduleName).to.equal('HTTP') + expect(logs.length).to.equal(1) + expect(Number(logs[0].id)).to.greaterThan(Number(logId)) + expect(logs[0].level).to.equal(newLogEntry.level) + expect(logs[0].message).to.equal(newLogEntry.message) + expect(logs[0].moduleName).to.equal('HTTP') } }) @@ -118,11 +118,11 @@ describe('LogDatabase CRUD', () => { logs = logs.filter((log) => log.message === newLogEntry.message) if (logs.length > 0) { - expect(logs?.length).to.equal(1) - expect(Number(logs?.[0].id)).to.greaterThan(Number(logId)) - expect(logs?.[0].level).to.equal(newLogEntry.level) - expect(logs?.[0].message).to.equal(newLogEntry.message) - expect(logs?.[0].moduleName).to.equal('HTTP') + expect(logs.length).to.equal(1) + expect(Number(logs[0].id)).to.greaterThan(Number(logId)) + expect(logs[0].level).to.equal(newLogEntry.level) + expect(logs[0].message).to.equal(newLogEntry.message) + expect(logs[0].moduleName).to.equal('HTTP') } }) @@ -153,11 +153,11 @@ describe('LogDatabase CRUD', () => { logs = logs.filter((log) => log.message.includes(newLogEntry.message)) if (logs.length > 0) { - expect(logs?.length).to.equal(1) - expect(Number(logs?.[0].id)).to.greaterThan(Number(logId)) - expect(logs?.[0].level).to.equal(newLogEntry.level) - assert(logs?.[0].message) - expect(logs?.[0].moduleName).to.equal('HTTP') + expect(logs.length).to.equal(1) + expect(Number(logs[0].id)).to.greaterThan(Number(logId)) + expect(logs[0].level).to.equal(newLogEntry.level) + assert(logs[0].message) + expect(logs[0].moduleName).to.equal('HTTP') } }) @@ -179,7 +179,7 @@ describe('LogDatabase retrieveMultipleLogs with specific parameters', () => { ) const { dbConfig } = await getConfiguration(true) - database = await new Database(dbConfig) + database = await Database.init(dbConfig) }) it('should retrieve logs with a specific moduleName', async () => { @@ -245,7 +245,7 @@ describe('LogDatabase retrieveMultipleLogs with specific parameters', () => { before(async () => { const { dbConfig } = await getConfiguration(true) - database = await new Database(dbConfig) + database = await Database.init(dbConfig) }) it('should insert a log for deletion', async () => { @@ -293,13 +293,13 @@ describe('LogDatabase retrieveMultipleLogs with specific parameters', () => { it('should return an empty array for negative maxLogs', async () => { const logs = await database.logs.retrieveMultipleLogs(startTime, endTime, -1) - assert.isNull(logs, 'Expected logs to be null') + assert.isEmpty(logs, 'Expected logs to be empty') }) it('should retrieve a maximum of one log when maxLogs is set to 1', async () => { const logs = await database.logs.retrieveMultipleLogs(startTime, endTime, 1) // check if the length of logs is 1 or less - expect(logs?.length).to.be.at.most(1) + expect(logs.length).to.be.at.most(1) }) it('should retrieve no logs when maxLogs is set to 0', async () => { @@ -348,7 +348,7 @@ describe('LogDatabase deleteOldLogs', () => { buildEnvOverrideConfig([ENVIRONMENT_VARIABLES.LOG_DB], ['true']) ) const { dbConfig } = await getConfiguration(true) - database = await new Database(dbConfig) + database = await Database.init(dbConfig) }) it('should insert an old log and a recent log', async () => { @@ -383,14 +383,14 @@ describe('LogDatabase deleteOldLogs', () => { let logs = await database.logs.retrieveMultipleLogs(startTime, endTime, 100) // Check that the old log is not present, but the recent one is - const oldLogPresent = logs?.some((log) => log.message === oldLogEntry.message) + const oldLogPresent = logs.some((log) => log.message === oldLogEntry.message) assert(oldLogPresent === false, 'Old logs are still present') // since we have many logs going to DB by default, we need to re-frame the timestamp to grab it startTime = new Date(recentLogEntry.timestamp - 1000) endTime = new Date(recentLogEntry.timestamp + 1000) logs = await database.logs.retrieveMultipleLogs(startTime, endTime, 100) - const recentLogPresent = logs?.some((log) => log.message === recentLogEntry.message) + const recentLogPresent = logs.some((log) => log.message === recentLogEntry.message) assert(recentLogPresent === true, 'Recent logs are not present') } else assert( @@ -413,7 +413,7 @@ describe('LogDatabase retrieveMultipleLogs with pagination', () => { buildEnvOverrideConfig([ENVIRONMENT_VARIABLES.LOG_DB], ['true']) ) const { dbConfig } = await getConfiguration(true) - database = await new Database(dbConfig) + database = await Database.init(dbConfig) // Insert multiple log entries to ensure there are enough logs for pagination for (let i = 0; i < logCount; i++) { diff --git a/src/test/integration/operationsDashboard.test.ts b/src/test/integration/operationsDashboard.test.ts index 074644318..8f102b741 100644 --- a/src/test/integration/operationsDashboard.test.ts +++ b/src/test/integration/operationsDashboard.test.ts @@ -25,7 +25,7 @@ import { INDEXER_CRAWLING_EVENTS } from '../../utils/index.js' import { OceanNodeConfig } from '../../@types/OceanNode.js' -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json' assert { type: 'json' } +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json' with { type: 'json' } import { DEVELOPMENT_CHAIN_ID, getOceanArtifactsAdresses } from '../../utils/address.js' import { AdminReindexChainCommand, @@ -49,10 +49,12 @@ import { OceanIndexer } from '../../components/Indexer/index.js' import { getCrawlingInterval } from '../../components/Indexer/utils.js' -import { ReindexTask } from '../../components/Indexer/crawlerThread.js' +import { ReindexTask } from '../../components/Indexer/ChainIndexer.js' import { create256Hash } from '../../utils/crypt.js' import { CollectFeesHandler } from '../../components/core/admin/collectFeesHandler.js' import { getProviderFeeToken } from '../../components/core/utils/feesHandler.js' +import { KeyManager } from '../../components/KeyManager/index.js' +import { BlockchainRegistry } from '../../components/BlockchainRegistry/index.js' describe('Should test admin operations', () => { let config: OceanNodeConfig @@ -105,9 +107,23 @@ describe('Should test admin operations', () => { ) config = await getConfiguration(true) // Force reload the configuration - dbconn = await new Database(config.dbConfig) - oceanNode = await OceanNode.getInstance(dbconn) - indexer = new OceanIndexer(dbconn, config.indexingNetworks) + dbconn = await Database.init(config.dbConfig) + const keyManager = new KeyManager(config) + const blockchainRegistry = new BlockchainRegistry(keyManager, config) + oceanNode = await OceanNode.getInstance( + config, + dbconn, + null, + null, + null, + keyManager, + blockchainRegistry + ) + indexer = new OceanIndexer( + dbconn, + config.indexingNetworks, + oceanNode.blockchainRegistry + ) oceanNode.addIndexer(indexer) }) @@ -120,11 +136,13 @@ describe('Should test admin operations', () => { const stopNodeCommand: AdminStopNodeCommand = { command: PROTOCOL_COMMANDS.STOP_NODE, - node: config.keys.peerId.toString(), + node: oceanNode.getKeyManager().getPeerId().toString(), expiryTimestamp, signature } - const validationResponse = new StopNodeHandler(oceanNode).validate(stopNodeCommand) + const validationResponse = await new StopNodeHandler(oceanNode).validate( + stopNodeCommand + ) assert(validationResponse, 'invalid stop node validation response') assert(validationResponse.valid === true, 'validation for stop node command failed') }) @@ -135,7 +153,7 @@ describe('Should test admin operations', () => { // CollectFeesHandler const collectFeesHandler: CollectFeesHandler = CoreHandlersRegistry.getInstance( oceanNode - ).getHandler(PROTOCOL_COMMANDS.COLLECT_FEES) + ).getHandler(PROTOCOL_COMMANDS.COLLECT_FEES) as CollectFeesHandler const signature = await getSignature(expiryTimestamp.toString()) const collectFeesCommand: AdminCollectFeesCommand = { @@ -147,7 +165,7 @@ describe('Should test admin operations', () => { expiryTimestamp, signature } - const validationResponse = collectFeesHandler.validate(collectFeesCommand) + const validationResponse = await collectFeesHandler.validate(collectFeesCommand) assert(validationResponse, 'invalid collect fees validation response') assert( validationResponse.valid === true, @@ -160,7 +178,9 @@ describe('Should test admin operations', () => { providerWallet ) const balanceBefore = await token.balanceOf(await destinationWallet.getAddress()) - expect(collectFeesHandler.validate(collectFeesCommand).valid).to.be.equal(true) // OK + expect((await collectFeesHandler.validate(collectFeesCommand)).valid).to.be.equal( + true + ) // OK const result = await collectFeesHandler.handle(collectFeesCommand) expect(result.status.httpStatus).to.be.equal(200) // OK @@ -221,14 +241,14 @@ describe('Should test admin operations', () => { const reindexTxCommand: AdminReindexTxCommand = { command: PROTOCOL_COMMANDS.REINDEX_TX, - node: config.keys.peerId.toString(), + node: oceanNode.getKeyManager().getPeerId().toString(), txId: publishedDataset.trxReceipt.hash, chainId: DEVELOPMENT_CHAIN_ID, expiryTimestamp, signature } const reindexTxHandler = new ReindexTxHandler(oceanNode) - const validationResponse = reindexTxHandler.validate(reindexTxCommand) + const validationResponse = await reindexTxHandler.validate(reindexTxCommand) assert(validationResponse, 'invalid reindex tx validation response') assert(validationResponse.valid === true, 'validation for reindex tx command failed') @@ -237,7 +257,7 @@ describe('Should test admin operations', () => { INDEXER_CRAWLING_EVENTS.REINDEX_QUEUE_POP, // triggered when tx completes and removed from queue (data) => { // {ReindexTask} - reindexResult = data.result as ReindexTask + reindexResult = data as ReindexTask expect(reindexResult.txId).to.be.equal(publishedDataset.trxReceipt.hash) expect(reindexResult.chainId).to.be.equal(DEVELOPMENT_CHAIN_ID) } @@ -266,11 +286,16 @@ describe('Should test admin operations', () => { 'wrong job hash' ) // wait a bit - await sleep(getCrawlingInterval() * 2) - if (reindexResult !== null) { - assert('chainId' in reindexResult, 'expected a chainId') - assert('txId' in reindexResult, 'expected a txId') - } + let loopCount = 0 + do { + if (reindexResult !== null || loopCount > 10) { + break + } + await sleep(getCrawlingInterval()) + loopCount++ + } while (true) + assert('chainId' in reindexResult, 'expected a chainId') + assert('txId' in reindexResult, 'expected a txId') const response = await new FindDdoHandler(oceanNode).handle(findDDOTask) const actualDDO = await streamToObject(response.stream as Readable) @@ -291,13 +316,13 @@ describe('Should test admin operations', () => { } else { const reindexChainCommand: AdminReindexChainCommand = { command: PROTOCOL_COMMANDS.REINDEX_CHAIN, - node: config.keys.peerId.toString(), + node: oceanNode.getKeyManager().getPeerId().toString(), chainId: DEVELOPMENT_CHAIN_ID, expiryTimestamp, signature } const reindexChainHandler = new ReindexChainHandler(oceanNode) - const validationResponse = reindexChainHandler.validate(reindexChainCommand) + const validationResponse = await reindexChainHandler.validate(reindexChainCommand) assert(validationResponse, 'invalid reindex chain validation response') assert( validationResponse.valid === true, @@ -348,8 +373,9 @@ describe('Should test admin operations', () => { // ----------------------------------------- // IndexingThreadHandler const indexingHandler: IndexingThreadHandler = CoreHandlersRegistry.getInstance( - oceanNode - ).getHandler(PROTOCOL_COMMANDS.HANDLE_INDEXING_THREAD) + oceanNode, + true + ).getHandler(PROTOCOL_COMMANDS.HANDLE_INDEXING_THREAD) as IndexingThreadHandler const signature = await getSignature(expiryTimestamp.toString()) const indexingStartCommand: StartStopIndexingCommand = { @@ -358,7 +384,7 @@ describe('Should test admin operations', () => { expiryTimestamp, signature } - expect(indexingHandler.validate(indexingStartCommand).valid).to.be.equal(true) // OK + expect((await indexingHandler.validate(indexingStartCommand)).valid).to.be.equal(true) // OK const indexingStopCommand: StartStopIndexingCommand = { command: PROTOCOL_COMMANDS.HANDLE_INDEXING_THREAD, @@ -366,15 +392,16 @@ describe('Should test admin operations', () => { expiryTimestamp: 10, signature } - expect(indexingHandler.validate(indexingStopCommand).valid).to.be.equal(false) // NOK + expect((await indexingHandler.validate(indexingStopCommand)).valid).to.be.equal(false) // NOK // OK now indexingStopCommand.expiryTimestamp = expiryTimestamp indexingStopCommand.chainId = 8996 - expect(indexingHandler.validate(indexingStopCommand).valid).to.be.equal(true) // OK + expect((await indexingHandler.validate(indexingStopCommand)).valid).to.be.equal(true) // OK // should exist a running thread for this network atm const response = await indexingHandler.handle(indexingStopCommand) + console.log({ responseStoppingThread: response }) assert(response.stream, 'Failed to get stream when stoping thread') expect(response.status.httpStatus).to.be.equal(200) @@ -390,6 +417,6 @@ describe('Should test admin operations', () => { after(async () => { await tearDownEnvironment(previousConfiguration) INDEXER_CRAWLING_EVENT_EMITTER.removeAllListeners() - indexer.stopAllThreads() + indexer.stopAllChainIndexers() }) }) diff --git a/src/test/integration/pricing.test.ts b/src/test/integration/pricing.test.ts new file mode 100644 index 000000000..fed4f9d15 --- /dev/null +++ b/src/test/integration/pricing.test.ts @@ -0,0 +1,381 @@ +import { expect, assert } from 'chai' +import { createHash } from 'crypto' +import { + JsonRpcProvider, + Signer, + Contract, + ethers, + getAddress, + hexlify, + ZeroAddress, + parseUnits +} from 'ethers' +import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' with { type: 'json' } +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } +import Dispenser from '@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json' with { type: 'json' } +import { Database } from '../../components/database/index.js' +import { OceanIndexer } from '../../components/Indexer/index.js' +import { RPCS } from '../../@types/blockchain.js' +import { getEventFromTx } from '../../utils/util.js' +import { waitToIndex, expectedTimeoutFailure } from './testUtils.js' +import { genericDDO } from '../data/ddo.js' +import { + DEVELOPMENT_CHAIN_ID, + getOceanArtifactsAdresses, + getOceanArtifactsAdressesByChainId +} from '../../utils/address.js' +import { + DEFAULT_TEST_TIMEOUT, + OverrideEnvConfig, + buildEnvOverrideConfig, + getMockSupportedNetworks, + setupEnvironment, + tearDownEnvironment +} from '../utils/utils.js' +import { ENVIRONMENT_VARIABLES, EVENTS } from '../../utils/constants.js' +import { homedir } from 'os' +import { OceanNode } from '../../OceanNode.js' +import { getConfiguration } from '../../utils/config.js' +import { EncryptMethod } from '../../@types/fileObject.js' +import { Asset } from '@oceanprotocol/ddo-js' + +describe('Publish pricing scehmas and assert ddo stats - FRE & Dispenser', () => { + let database: Database + let oceanNode: OceanNode + let provider: JsonRpcProvider + let factoryContract: Contract + let nftContract: Contract + let datatokenContract: Contract + let publisherAccount: Signer + let nftAddress: string + let datatokenAddress: string + let exchangeId: string + let dispenserContract: ethers.Contract + const chainId = 8996 + let assetDID: string + let resolvedDDO: Asset + let genericAsset: any + let setMetaDataTxReceipt: any + let indexer: OceanIndexer + let artifactsAddresses: any + const mockSupportedNetworks: RPCS = getMockSupportedNetworks() + let previousConfiguration: OverrideEnvConfig[] + let genericAssetCloned: any + + before(async () => { + previousConfiguration = await setupEnvironment( + null, + buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.RPCS, + ENVIRONMENT_VARIABLES.INDEXER_NETWORKS, + ENVIRONMENT_VARIABLES.PRIVATE_KEY, + ENVIRONMENT_VARIABLES.ADDRESS_FILE + ], + [ + JSON.stringify(mockSupportedNetworks), + JSON.stringify([8996]), + '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', + `${homedir}/.ocean/ocean-contracts/artifacts/address.json` + ] + ) + ) + + const config = await getConfiguration(true) + database = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance() + indexer = new OceanIndexer( + database, + mockSupportedNetworks, + oceanNode.blockchainRegistry + ) + oceanNode.addIndexer(indexer) + artifactsAddresses = getOceanArtifactsAdressesByChainId(DEVELOPMENT_CHAIN_ID) + if (!artifactsAddresses) { + artifactsAddresses = getOceanArtifactsAdresses().development + } + console.log(artifactsAddresses.FixedPrice) + + provider = new JsonRpcProvider('http://127.0.0.1:8545') + publisherAccount = (await provider.getSigner(0)) as Signer + genericAsset = JSON.parse(JSON.stringify(genericDDO)) + factoryContract = new ethers.Contract( + artifactsAddresses.ERC721Factory, + ERC721Factory.abi, + publisherAccount + ) + genericAssetCloned = structuredClone(genericAsset) + delete genericAssetCloned.event + delete genericAssetCloned.nft + }) + + it('instance Database', () => { + expect(database).to.be.instanceOf(Database) + }) + + it('should publish a dataset w fre', async () => { + const tx = await factoryContract.createNftWithErc20WithFixedRate( + { + name: '72120Bundle', + symbol: '72Bundle', + templateIndex: 1, + tokenURI: 'https://oceanprotocol.com/nft/', + transferable: true, + owner: await publisherAccount.getAddress() + }, + { + strings: ['ERC20B1', 'ERC20DT1Symbol'], + templateIndex: 1, + addresses: [ + await publisherAccount.getAddress(), + ZeroAddress, + ZeroAddress, + ZeroAddress + ], + uints: [1000, 0], + bytess: [] + }, + { + fixedPriceAddress: artifactsAddresses.FixedPrice, + addresses: [ + artifactsAddresses.Ocean, + await publisherAccount.getAddress(), + await publisherAccount.getAddress(), + ZeroAddress + ], + uints: [18, 18, parseUnits('1', 18).toString(), parseUnits('0', 18).toString(), 1] + } + ) + const txReceipt = await tx.wait() + assert(txReceipt, 'transaction failed') + const event = getEventFromTx(txReceipt, 'NFTCreated') + nftAddress = event.args[0] + assert(nftAddress, 'find nft created failed') + const datatokenEvent = getEventFromTx(txReceipt, 'TokenCreated') + datatokenAddress = datatokenEvent.args[0] + assert(datatokenAddress, 'find datatoken created failed') + datatokenContract = new ethers.Contract( + datatokenAddress, + ERC20Template.abi, + publisherAccount + ) + assert(datatokenContract) + const freEvent = getEventFromTx(txReceipt, 'NewFixedRate') + exchangeId = freEvent.args[0] + assert(exchangeId, 'exchangeId not found.') + }) + + it('should set metadata and save ', async () => { + nftContract = new ethers.Contract(nftAddress, ERC721Template.abi, publisherAccount) + genericAssetCloned.id = + 'did:op:' + + createHash('sha256') + .update(getAddress(nftAddress) + chainId.toString(10)) + .digest('hex') + genericAssetCloned.nftAddress = nftAddress + assetDID = genericAssetCloned.id + // create proper service.files string + genericAssetCloned.services[0].datatokenAddress = datatokenAddress + genericAssetCloned.nftAddress = nftAddress + // let's call node to encrypt + + const data = Uint8Array.from( + Buffer.from(JSON.stringify(genericAssetCloned.services[0].files)) + ) + const encryptedData = await oceanNode + .getKeyManager() + .encrypt(data, EncryptMethod.ECIES) + const encryptedDataString = encryptedData.toString('hex') + genericAssetCloned.services[0].files = encryptedDataString + const stringDDO = JSON.stringify(genericAssetCloned) + const bytes = Buffer.from(stringDDO) + const metadata = hexlify(bytes) + const hash = createHash('sha256').update(metadata).digest('hex') + + const setMetaDataTx = await nftContract.setMetaData( + 0, + 'http://v4.provider.oceanprotocol.com', + '0x123', + '0x01', + metadata, + '0x' + hash, + [] + ) + setMetaDataTxReceipt = await setMetaDataTx.wait() + assert(setMetaDataTxReceipt, 'set metada failed') + }) + + it('should store the ddo in the database and return it ', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 3) + const { ddo, wasTimeout } = await waitToIndex( + assetDID, + EVENTS.METADATA_CREATED, + DEFAULT_TEST_TIMEOUT * 2 + ) + if (ddo) { + resolvedDDO = ddo + console.log(`resolved ddo: ${JSON.stringify(resolvedDDO)}`) + expect(resolvedDDO.id).to.equal(genericAssetCloned.id) + } else expect(expectedTimeoutFailure(this.test.title)).to.be.equal(wasTimeout) + }) + + it('should get stats for fre', async function () { + assert(resolvedDDO.indexedMetadata, 'No stats available') + assert(resolvedDDO.indexedMetadata.stats.length === 1) + assert( + resolvedDDO.indexedMetadata.stats[0].datatokenAddress === datatokenAddress, + 'DT is missing.' + ) + assert( + resolvedDDO.indexedMetadata.stats[0].name === (await datatokenContract.name()), + 'Name is missing.' + ) + assert( + resolvedDDO.indexedMetadata.stats[0].orders === 0, + 'Number of orders are missing.' + ) + assert( + resolvedDDO.indexedMetadata.stats[0].serviceId === '0', + 'Service ID is missing.' + ) + assert( + resolvedDDO.indexedMetadata.stats[0].prices.length === 1, + 'Incorrect length of prices' + ) + assert( + resolvedDDO.indexedMetadata.stats[0].prices[0].type === 'fixedrate', + 'Type from prices is not present.' + ) + assert( + resolvedDDO.indexedMetadata.stats[0].prices[0].token === artifactsAddresses.Ocean, + 'Datatoken from prices is not present.' + ) + assert( + resolvedDDO.indexedMetadata.stats[0].prices[0].price === '1.0', + 'Price is not present.' + ) + assert( + resolvedDDO.indexedMetadata.stats[0].prices[0].exchangeId === exchangeId, + 'Exchange ID is not present.' + ) + }) + + it('should attach a dispenser', async () => { + const dtTx = await nftContract.createERC20( + 1, + ['newERC20', 'newERC20s'], + [ + await publisherAccount.getAddress(), + await publisherAccount.getAddress(), + await publisherAccount.getAddress(), + datatokenAddress + ], + [parseUnits('10000', 18), parseUnits('1', 18)], + [] + ) + assert(dtTx, 'Cannot create datatoken') + const dtTxReceipt = await dtTx.wait() + const dtEvent = getEventFromTx(dtTxReceipt, 'TokenCreated') + const newdatatokenAddress = dtEvent.args[0] + const newDtContract = new ethers.Contract( + newdatatokenAddress, + ERC20Template.abi, + publisherAccount + ) + const tx = await newDtContract.createDispenser( + artifactsAddresses.Dispenser, + parseUnits('1', 18), + parseUnits('1', 18), + true, + await publisherAccount.getAddress() + ) + assert(tx, 'Cannot create dispenser') + const txReceipt = await tx.wait() + const dispenserEvent = getEventFromTx(txReceipt, 'NewDispenser') + const dispenserAddress = dispenserEvent.topics[0] + assert(dispenserAddress, 'Dispenser contract not retrieved') + + dispenserContract = new ethers.Contract( + dispenserAddress, + Dispenser.abi, + publisherAccount + ) + assert(dispenserContract) + genericAssetCloned.services.push({ + id: '1', + type: 'access', + description: 'Download service', + datatokenAddress: newdatatokenAddress, + files: [ + { + url: 'https://raw.githubusercontent.com/oceanprotocol/test-algorithm/master/javascript/algo.js', + contentType: 'text/js', + encoding: 'UTF-8' + } + ], + serviceEndpoint: 'http://172.15.0.4:8030', + timeout: 0 + }) + assert(genericAssetCloned.services.length === 2, 'the 2 services are not present') + const data = Uint8Array.from( + Buffer.from(JSON.stringify(genericAssetCloned.services[1].files)) + ) + const encryptedData = await oceanNode + .getKeyManager() + .encrypt(data, EncryptMethod.ECIES) + const encryptedDataString = encryptedData.toString('hex') + genericAssetCloned.services[1].files = encryptedDataString + const stringDDO = JSON.stringify(genericAssetCloned) + const bytes = Buffer.from(stringDDO) + const metadata = hexlify(bytes) + const hash = createHash('sha256').update(metadata).digest('hex') + + const setMetaDataTx = await nftContract.setMetaData( + 0, + 'http://v4.provider.oceanprotocol.com', + '0x123', + '0x01', + metadata, + '0x' + hash, + [] + ) + setMetaDataTxReceipt = await setMetaDataTx.wait() + assert(setMetaDataTxReceipt, 'set metada failed') + }) + it('should store the updated ddo in the database and return it ', async function () { + this.timeout(DEFAULT_TEST_TIMEOUT * 3) + const { ddo, wasTimeout } = await waitToIndex( + genericAssetCloned.id, + EVENTS.METADATA_UPDATED, + DEFAULT_TEST_TIMEOUT * 2, + true + ) + console.log(`updated ddo: ${JSON.stringify(ddo.indexedMetadata.stats)}`) + if (ddo) { + assert( + ddo.indexedMetadata.stats.length === 2, + 'the 2 pricing schemas were not captured in the stats' + ) + assert( + ddo.indexedMetadata.stats[1].prices[0].type === 'dispenser', + 'type is not dispenser' + ) + assert( + ddo.indexedMetadata.stats[1].datatokenAddress === + genericAssetCloned.services[1].datatokenAddress, + 'mismatch datatoken address' + ) + assert(ddo.indexedMetadata.stats[1].prices[0].price === '0', 'price is not 0') + assert( + ddo.indexedMetadata.stats[1].prices[0].token === + genericAssetCloned.services[1].datatokenAddress, + 'mismatch datatoken address' + ) + } else expect(expectedTimeoutFailure(this.test.title)).to.be.equal(wasTimeout) + }) + after(async () => { + await tearDownEnvironment(previousConfiguration) + indexer.stopAllChainIndexers() + }) +}) diff --git a/src/test/integration/testUtils.ts b/src/test/integration/testUtils.ts index 066e04cf9..b1d7b1053 100644 --- a/src/test/integration/testUtils.ts +++ b/src/test/integration/testUtils.ts @@ -5,20 +5,18 @@ import { INDEXER_LOGGER } from '../../utils/logging/common.js' import { JsonRpcSigner, JsonRpcProvider, getBytes } from 'ethers' import { DEFAULT_TEST_TIMEOUT } from '../utils/utils.js' import { getDatabase } from '../../utils/database.js' -import { DDO } from '../../@types/DDO/DDO.js' -import { sleep } from '../../utils/util.js' +import { Asset } from '@oceanprotocol/ddo-js' // listen for indexer events export function addIndexerEventListener(eventName: string, ddoId: string, callback: any) { - // add listener - INDEXER_DDO_EVENT_EMITTER.addListener(eventName, (did: string) => { - INDEXER_LOGGER.info(`Test suite - Listened event: "${eventName}" for DDO: ${did}`) - if (ddoId === did && typeof callback === 'function') { - // remove it - INDEXER_DDO_EVENT_EMITTER.removeListener(eventName, () => {}) + const listener = (did: string) => { + if (ddoId === did) { callback(did) } - }) + } + + INDEXER_DDO_EVENT_EMITTER.addListener(eventName, listener) + return listener } export const delay = (interval: number) => { @@ -47,78 +45,42 @@ async function getIndexedDDOFromDB(did: string): Promise { } export type WaitIndexResult = { - ddo: DDO | null + ddo: Asset | null wasTimeout: boolean } -// WIP + export const waitToIndex = async ( did: string, eventName: string, testTimeout: number = DEFAULT_TEST_TIMEOUT, forceWaitForEvent?: boolean ): Promise => { - const result: WaitIndexResult = { ddo: null, wasTimeout: false } - let listening = false - let wait = true + if (!forceWaitForEvent) { + const ddo = await getIndexedDDOFromDB(did) + if (ddo) return { ddo, wasTimeout: false } + } - const timeout = setTimeout(async () => { - const res = await getIndexedDDOFromDB(did) - result.ddo = res - result.wasTimeout = true - wait = false - return result - }, testTimeout - 5000) // little less (5 secs) than the initial timeout + return new Promise((resolve) => { + const listener = addIndexerEventListener(eventName, did, async () => { + clearTimeout(timeoutId) + const ddo = await getIndexedDDOFromDB(did) + INDEXER_DDO_EVENT_EMITTER.removeListener(eventName, listener) + resolve({ ddo, wasTimeout: false }) + }) - while (wait) { - // we might want to wait for the event, on certain ocasions (ex: when we update something that already exists) - // otherwise we might get the still "unmodified" version - // ideally, the tests would call the waitToIndex() method before the action that triggers it - if (!forceWaitForEvent) { - // first try - const res = await getIndexedDDOFromDB(did) - if (res !== null) { - clearTimeout(timeout) - result.ddo = res - result.wasTimeout = false - wait = false - return result + const timeoutId = setTimeout(async () => { + try { + const ddo = await getIndexedDDOFromDB(did) + INDEXER_DDO_EVENT_EMITTER.removeListener(eventName, listener) + resolve({ ddo, wasTimeout: true }) + } catch (error) { + console.error('Error fetching DDO:', error) + INDEXER_DDO_EVENT_EMITTER.removeListener(eventName, listener) + resolve({ ddo: null, wasTimeout: true }) } - } else if (!listening) { - // 2nd approach, whatever happens first (timeout or event emition) - listening = true - addIndexerEventListener(eventName, did, async (id: string) => { - clearTimeout(timeout) - const res = await getIndexedDDOFromDB(id) - result.ddo = res - result.wasTimeout = false - wait = false - return result - }) - } - // hold your breath for a while - await sleep(1000) - } - return result + }, testTimeout - 5000) + }) } -/** -export const waitToIndex = async (did: string, database: Database): Promise => { - const timeout = setTimeout(() => {}, 1500) - let tries = 0 - do { - try { - const ddo = await database.ddo.retrieve(did) - if (ddo) { - return ddo - } - } catch (e) { - INDEXER_LOGGER.logMessage(`Error could not retrieve the DDO ${did}: ${e}`) - } - await sleep(1500) - - tries++ - } while (tries < 100) - return null -} */ export const deleteAsset = async (did: string, database: Database): Promise => { try { diff --git a/src/test/integration/transactionValidation.test.ts b/src/test/integration/transactionValidation.test.ts index 104c677f8..651be6af9 100644 --- a/src/test/integration/transactionValidation.test.ts +++ b/src/test/integration/transactionValidation.test.ts @@ -1,5 +1,5 @@ import { expect, assert } from 'chai' -import { JsonRpcProvider, Signer } from 'ethers' +import { JsonRpcProvider, Signer, FallbackProvider } from 'ethers' import { validateOrderTransaction } from '../../components/core/utils/validateOrders.js' import { expectedTimeoutFailure, waitToIndex } from './testUtils.js' import { genericDDO } from '../data/ddo.js' @@ -29,6 +29,7 @@ describe('validateOrderTransaction Function with Orders', () => { let database: Database let oceanNode: OceanNode let provider: JsonRpcProvider + let fallbackProvider: FallbackProvider let publisherAccount: Signer let consumerAccount: Signer let consumerAddress: string @@ -67,9 +68,13 @@ describe('validateOrderTransaction Function with Orders', () => { ) config = await getConfiguration(true) // Force reload the configuration - const dbconn = await new Database(config.dbConfig) - oceanNode = await OceanNode.getInstance(dbconn) - indexer = new OceanIndexer(dbconn, config.indexingNetworks) + const dbconn = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance(config, dbconn) + indexer = new OceanIndexer( + dbconn, + config.indexingNetworks, + oceanNode.blockchainRegistry + ) oceanNode.addIndexer(indexer) let network = getOceanArtifactsAdressesByChainId(DEVELOPMENT_CHAIN_ID) @@ -78,6 +83,7 @@ describe('validateOrderTransaction Function with Orders', () => { } provider = new JsonRpcProvider('http://127.0.0.1:8545') + fallbackProvider = new FallbackProvider([provider]) publisherAccount = (await provider.getSigner(0)) as Signer consumerAccount = (await provider.getSigner(1)) as Signer @@ -89,7 +95,7 @@ describe('validateOrderTransaction Function with Orders', () => { } const { dbConfig } = await getConfiguration(true) - database = await new Database(dbConfig) + database = await Database.init(dbConfig) }) it('Start instance of Database', () => { @@ -149,7 +155,7 @@ describe('validateOrderTransaction Function with Orders', () => { const validationResult = await validateOrderTransaction( orderTxId, consumerAddress, - provider, + fallbackProvider, dataNftAddress, datatokenAddress, parseInt(serviceId), @@ -179,7 +185,7 @@ describe('validateOrderTransaction Function with Orders', () => { const validationResult = await validateOrderTransaction( reOrderTxId, consumerAddress, - provider, + fallbackProvider, dataNftAddress, datatokenAddress, parseInt(serviceId), @@ -198,7 +204,7 @@ describe('validateOrderTransaction Function with Orders', () => { const validationResult = await validateOrderTransaction( reOrderTxId, consumerAddress, - provider, + fallbackProvider, dataNftAddress, datatokenAddress, parseInt('999'), @@ -217,7 +223,7 @@ describe('validateOrderTransaction Function with Orders', () => { const validationResult = await validateOrderTransaction( reOrderTxId, '0x0', - provider, + fallbackProvider, dataNftAddress, datatokenAddress, parseInt(serviceId), @@ -233,6 +239,6 @@ describe('validateOrderTransaction Function with Orders', () => { }) after(async () => { await tearDownEnvironment(previousConfiguration) - indexer.stopAllThreads() + indexer.stopAllChainIndexers() }) }) diff --git a/src/test/integration/typesense.test.ts b/src/test/integration/typesense.test.ts index 1bf59a24e..8742284ca 100644 --- a/src/test/integration/typesense.test.ts +++ b/src/test/integration/typesense.test.ts @@ -6,6 +6,7 @@ import { import { ddoSchema } from '../data/ddoSchema.js' import { ddo } from '../data/ddo.js' import { expect } from 'chai' +import { TypesenseSearchParams } from '../../@types/index.js' describe('Typesense', () => { let typesense: Typesense @@ -161,14 +162,17 @@ describe('Typesense documents', () => { expect(result.metadata).to.not.be.an('undefined') expect(result.metadata.name).to.be.equal(ddo.metadata.name) }) - it('search document in ddo collection', async () => { - const result = await typesense.collections(ddoSchema.name).documents().search({ - q: 'DEX', - query_by: 'metadata.author', - filter_by: 'chainId:<138', + const queryParams: TypesenseSearchParams = { + q: 'new metadata name', + query_by: 'metadata.name', + filter_by: 'chainId:=137', sort_by: 'version:desc' - }) + } + const result = await typesense + .collections(ddoSchema.name) + .documents() + .search(queryParams) expect(result.found).to.equal(1) expect(result.hits[0]).to.not.be.an('undefined') diff --git a/src/test/unit/auth/token.test.ts b/src/test/unit/auth/token.test.ts new file mode 100644 index 000000000..f185de0ba --- /dev/null +++ b/src/test/unit/auth/token.test.ts @@ -0,0 +1,68 @@ +import { OceanNodeConfig } from '../../../@types/OceanNode.js' +import { getConfiguration } from '../../../utils/index.js' +import { expect } from 'chai' +import { Wallet } from 'ethers' +import { Auth } from '../../../components/Auth/index.js' +import { AuthTokenDatabase } from '../../../components/database/AuthTokenDatabase.js' + +describe('Auth Token Tests', () => { + let wallet: Wallet + let authTokenDatabase: AuthTokenDatabase + let config: OceanNodeConfig + let auth: Auth + + before(async () => { + config = await getConfiguration(true) + authTokenDatabase = await AuthTokenDatabase.create(config.dbConfig) + wallet = new Wallet(process.env.PRIVATE_KEY) + auth = new Auth(authTokenDatabase) + }) + + const getRandomNonce = () => { + return Math.floor(Math.random() * 1000000).toString() + } + + it('should create and validate a token', async () => { + const jwtToken = await auth.getJWTToken(wallet.address, getRandomNonce(), Date.now()) + await auth.insertToken(wallet.address, jwtToken, Date.now() + 1000, Date.now()) + + const result = await auth.validateAuthenticationOrToken({ token: jwtToken }) + expect(result.valid).to.be.equal(true) + }) + + it('should fail validation with invalid token', async () => { + const result = await auth.validateAuthenticationOrToken({ token: 'invalid-token' }) + expect(result.valid).to.be.equal(false) + }) + + it('should fail validation with invalid signature', async () => { + const invalidSignature = '0x' + '0'.repeat(130) + + const result = await auth.validateAuthenticationOrToken({ + signature: invalidSignature, + nonce: getRandomNonce(), + address: wallet.address + }) + expect(result.valid).to.be.equal(false) + }) + + it('should respect token expiry', async () => { + const jwtToken = await auth.getJWTToken(wallet.address, getRandomNonce(), Date.now()) + await auth.insertToken(wallet.address, jwtToken, Date.now() + 1000, Date.now()) + + await new Promise((resolve) => setTimeout(resolve, 1500)) + + const validationResult = await auth.validateToken(jwtToken) + expect(validationResult).to.be.equal(null) + }) + + it('should invalidate a token', async () => { + const jwtToken = await auth.getJWTToken(wallet.address, getRandomNonce(), Date.now()) + await auth.insertToken(wallet.address, jwtToken, Date.now() + 1000, Date.now()) + + await auth.invalidateToken(jwtToken) + + const validationResult = await auth.validateToken(jwtToken) + expect(validationResult).to.be.equal(null) + }) +}) diff --git a/src/test/unit/blockchain.test.ts b/src/test/unit/blockchain.test.ts index 978c1fe1b..737157c19 100644 --- a/src/test/unit/blockchain.test.ts +++ b/src/test/unit/blockchain.test.ts @@ -1,82 +1,57 @@ import { expect } from 'chai' import { OceanNodeConfig } from '../../@types/OceanNode.js' -import { RPCS, SupportedNetwork } from '../../@types/blockchain.js' + +import { BlockchainRegistry } from '../../components/BlockchainRegistry/index.js' +import { KeyManager } from '../../components/KeyManager/index.js' import { Blockchain } from '../../utils/blockchain.js' import { getConfiguration } from '../../utils/config.js' import { ENVIRONMENT_VARIABLES } from '../../utils/constants.js' import { DEFAULT_TEST_TIMEOUT, OverrideEnvConfig, + TEST_ENV_CONFIG_FILE, buildEnvOverrideConfig, setupEnvironment, tearDownEnvironment } from '../utils/utils.js' -import { expectedTimeoutFailure } from '../integration/testUtils.js' + import { DEVELOPMENT_CHAIN_ID, KNOWN_CONFIDENTIAL_EVMS } from '../../utils/address.js' import { isConfidentialEVM } from '../../utils/asset.js' let envOverrides: OverrideEnvConfig[] let config: OceanNodeConfig -let rpcs: RPCS -let network: SupportedNetwork let blockchain: Blockchain describe('Should validate blockchain network connections', () => { before(async () => { envOverrides = buildEnvOverrideConfig( [ENVIRONMENT_VARIABLES.RPCS], [ - '{ "8996":{ "rpc":"http://172.0.0.1:8545", "fallbackRPCs": ["http://172.0.0.3:8545","http://127.0.0.1:8545"], "chainId": 8996, "network": "development", "chunkSize": 100 }}' + '{ "8996":{ "rpc":"http://127.0.0.254:8545", "fallbackRPCs": ["http://127.0.0.3:8545","http://127.0.0.1:8545"], "chainId": 8996, "network": "development", "chunkSize": 100 }}' ] ) - envOverrides = await setupEnvironment(null, envOverrides) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) config = await getConfiguration(true) - - rpcs = config.supportedNetworks - network = rpcs['8996'] - blockchain = new Blockchain( - network.rpc, - network.network, - network.chainId, - network.fallbackRPCs - ) + const keyManager = new KeyManager(config) + const blockchainRegistry = new BlockchainRegistry(keyManager, config) + // network = rpcs['8996'] + blockchain = blockchainRegistry.getBlockchain(8996) }) it('should get known rpcs', () => { expect(blockchain.getKnownRPCs().length).to.be.equal(3) }) - it('should get network not ready (wrong RPC setting)', async () => { - const status = await blockchain.isNetworkReady() - expect(status.ready).to.be.equal(false) - }) - - it('should get network ready after retry other RPCs', async function () { + it('should get network not ready', async function () { this.timeout(DEFAULT_TEST_TIMEOUT * 2) - let status = await blockchain.isNetworkReady() + const status = await blockchain.isNetworkReady() expect(status.ready).to.be.equal(false) - // at least one should be OK - const retryResult = await blockchain.tryFallbackRPCs() - // ignore node network errors (on ci there are network issues sometimes) - // we can't do much if we have timeouts, bad urls or connections refused - if (!retryResult.ready && retryResult.error) { - const networkIssue = - retryResult.error.includes('TIMEOUT') || - retryResult.error.includes('ECONNREFUSED') || - retryResult.error.includes('ENOTFOUND') - - expect(expectedTimeoutFailure(this.test.title)).to.be.equal(networkIssue) - } else { - expect(retryResult.ready).to.be.equal(true) - status = await blockchain.isNetworkReady() - expect(status.ready).to.be.equal(true) - } }) it('should check if chain is confidential EVM', () => { for (const chain of KNOWN_CONFIDENTIAL_EVMS) { expect(isConfidentialEVM(chain)).to.be.equal(true) } - expect(isConfidentialEVM(DEVELOPMENT_CHAIN_ID)).to.be.equal(false) + expect(isConfidentialEVM(BigInt(DEVELOPMENT_CHAIN_ID))).to.be.equal(false) }) after(async () => { diff --git a/src/test/unit/commands.test.ts b/src/test/unit/commands.test.ts index e00874075..9b358f2b8 100644 --- a/src/test/unit/commands.test.ts +++ b/src/test/unit/commands.test.ts @@ -1,18 +1,20 @@ import { expect } from 'chai' import { PROTOCOL_COMMANDS, SUPPORTED_PROTOCOL_COMMANDS } from '../../utils/index.js' import { CoreHandlersRegistry } from '../../components/core/handler/coreHandlersRegistry.js' -import { Handler } from '../../components/core/handler/handler.js' +import { BaseHandler } from '../../components/core/handler/handler.js' +import { getConfiguration } from '../../utils/config.js' import { OceanNode } from '../../OceanNode.js' +import { Database } from '../../components/database/index.js' +import { KeyManager } from '../../components/KeyManager/index.js' import { ComputeGetEnvironmentsCommand, ComputeGetResultCommand, ComputeGetStatusCommand, ComputeInitializeCommand, - ComputeStartCommand, + PaidComputeStartCommand, ComputeStopCommand, DecryptDDOCommand, DownloadCommand, - EchoCommand, EncryptCommand, EncryptFileCommand, FileInfoCommand, @@ -22,7 +24,8 @@ import { NonceCommand, QueryCommand, StatusCommand, - ValidateDDOCommand + ValidateDDOCommand, + GetJobsCommand } from '../../@types/commands.js' import { NonceHandler } from '../../components/core/handler/nonceHandler.js' import { DownloadHandler } from '../../components/core/handler/downloadHandler.js' @@ -38,10 +41,9 @@ import { import { QueryHandler } from '../../components/core/handler/queryHandler.js' import { StatusHandler } from '../../components/core/handler/statusHandler.js' import { FeesHandler } from '../../components/core/handler/feesHandler.js' -import { EchoHandler } from '../../components/core/handler/echoHandler.js' import { FileInfoHandler } from '../../components/core/handler/fileInfoHandler.js' import { ComputeGetEnvironmentsHandler } from '../../components/core/compute/environments.js' -import { ComputeStartHandler } from '../../components/core/compute/startCompute.js' +import { PaidComputeStartHandler } from '../../components/core/compute/startCompute.js' import { ComputeStopHandler } from '../../components/core/compute/stopCompute.js' import { ComputeGetStatusHandler } from '../../components/core/compute/getStatus.js' import { ComputeGetResultHandler } from '../../components/core/compute/getResults.js' @@ -50,28 +52,39 @@ import { StopNodeHandler } from '../../components/core/admin/stopNodeHandler.js' import { ReindexTxHandler } from '../../components/core/admin/reindexTxHandler.js' import { ReindexChainHandler } from '../../components/core/admin/reindexChainHandler.js' import { CollectFeesHandler } from '../../components/core/admin/collectFeesHandler.js' - +import { GetJobsHandler } from '../../components/core/handler/getJobs.js' +import { Wallet, ethers } from 'ethers' describe('Commands and handlers', () => { + let node: OceanNode + let consumerAccount: Wallet + let consumerAddress: string + before(async () => { + const config = await getConfiguration() + const keyManager = new KeyManager(config) + const db = await Database.init(config.dbConfig) + node = OceanNode.getInstance(config, db, null, null, null, keyManager, null, true) + consumerAccount = new Wallet(process.env.PRIVATE_KEY) + consumerAddress = await consumerAccount.getAddress() + }) + it('Check that all supported commands have registered handlers', () => { // To make sure we do not forget to register handlers - const node: OceanNode = OceanNode.getInstance() + for (const command of SUPPORTED_PROTOCOL_COMMANDS) { expect(CoreHandlersRegistry.getInstance(node).getHandler(command)).to.be.instanceof( - Handler + BaseHandler ) } }) it('Check that supported commands and handlers match', () => { // To make sure we do not forget to register anything on supported commands - const node: OceanNode = OceanNode.getInstance() const handlers: string[] = node.getCoreHandlers().getRegisteredCommands() expect(SUPPORTED_PROTOCOL_COMMANDS.length).to.be.equal(handlers.length) }) - it('Check that all commands are validating required parameters', () => { + it('Check that all commands are validating required parameters', async () => { // To make sure we do not forget to register anything on supported commands - const node: OceanNode = OceanNode.getInstance() // downloadHandler const downloadHandler: DownloadHandler = CoreHandlersRegistry.getInstance( @@ -88,7 +101,7 @@ describe('Commands and handlers', () => { command: PROTOCOL_COMMANDS.DOWNLOAD } expect(downloadHandler.validate(downloadCommand).valid).to.be.equal(true) - downloadCommand.nonce = null + downloadCommand.documentId = undefined expect(downloadHandler.validate(downloadCommand).valid).to.be.equal(false) // ----------------------------------------- // DecryptDDOHandler @@ -124,9 +137,20 @@ describe('Commands and handlers', () => { const encryptHandler: EncryptHandler = CoreHandlersRegistry.getInstance( node ).getHandler(PROTOCOL_COMMANDS.ENCRYPT) + let nonce = Date.now().toString() + let message = String(nonce) + let consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + let messageHashBytes = ethers.toBeArray(consumerMessage) + let signature = await consumerAccount.signMessage(messageHashBytes) const encryptCommand: EncryptCommand = { blob: '1425252525', - command: PROTOCOL_COMMANDS.ENCRYPT + command: PROTOCOL_COMMANDS.ENCRYPT, + nonce, + consumerAddress, + signature } expect(encryptHandler.validate(encryptCommand).valid).to.be.equal(true) delete encryptCommand.blob @@ -136,9 +160,20 @@ describe('Commands and handlers', () => { const encryptFileHandler: EncryptFileHandler = CoreHandlersRegistry.getInstance( node ).getHandler(PROTOCOL_COMMANDS.ENCRYPT_FILE) + nonce = (parseFloat(nonce) + 1).toString() + message = String(nonce) + consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + messageHashBytes = ethers.toBeArray(consumerMessage) + signature = await consumerAccount.signMessage(messageHashBytes) const encryptFileCommand: EncryptFileCommand = { rawData: Buffer.from('12345'), - command: PROTOCOL_COMMANDS.ENCRYPT_FILE + command: PROTOCOL_COMMANDS.ENCRYPT_FILE, + nonce, + consumerAddress, + signature } expect(encryptFileHandler.validate(encryptFileCommand).valid).to.be.equal(true) delete encryptFileCommand.rawData @@ -202,37 +237,28 @@ describe('Commands and handlers', () => { feesCommand.consumerAddress = 'INVALID_1234567' expect(feesHandler.validate(feesCommand).valid).to.be.equal(false) // ----------------------------------------- - // EchoHandler - const echoHandler: EchoHandler = CoreHandlersRegistry.getInstance(node).getHandler( - PROTOCOL_COMMANDS.ECHO - ) - const echoCommand: EchoCommand = { - command: PROTOCOL_COMMANDS.ECHO - } - expect(echoHandler.validate(echoCommand).valid).to.be.equal(true) - // ----------------------------------------- // Stop Node Handler for Admin const stopNodeHandler: StopNodeHandler = CoreHandlersRegistry.getInstance( node - ).getHandler(PROTOCOL_COMMANDS.ECHO) + ).getHandler(PROTOCOL_COMMANDS.STOP_NODE) as StopNodeHandler expect(stopNodeHandler).to.be.not.equal(null) // ----------------------------------------- // Reindex Tx Handler const reindexTxHandler: ReindexTxHandler = CoreHandlersRegistry.getInstance( node - ).getHandler(PROTOCOL_COMMANDS.REINDEX_TX) + ).getHandler(PROTOCOL_COMMANDS.REINDEX_TX) as ReindexTxHandler expect(reindexTxHandler).to.be.not.equal(null) // ----------------------------------------- // Reindex Chain Handler const reindexChainHandler: ReindexChainHandler = CoreHandlersRegistry.getInstance( node - ).getHandler(PROTOCOL_COMMANDS.REINDEX_CHAIN) + ).getHandler(PROTOCOL_COMMANDS.REINDEX_CHAIN) as ReindexChainHandler expect(reindexChainHandler).to.be.not.equal(null) // ----------------------------------------- // CollectFeesHandler const collectFeesHandler: CollectFeesHandler = CoreHandlersRegistry.getInstance( node - ).getHandler(PROTOCOL_COMMANDS.COLLECT_FEES) + ).getHandler(PROTOCOL_COMMANDS.COLLECT_FEES) as CollectFeesHandler expect(collectFeesHandler).to.be.not.equal(null) // ----------------------------------------- // FileInfoHandler @@ -279,17 +305,18 @@ describe('Commands and handlers', () => { expect(getEnvHandler.validate(getEnvCommand).valid).to.be.equal(true) // ----------------------------------------- // ComputeStartHandler - const startEnvHandler: ComputeStartHandler = CoreHandlersRegistry.getInstance( + const startEnvHandler: PaidComputeStartHandler = CoreHandlersRegistry.getInstance( node ).getHandler(PROTOCOL_COMMANDS.COMPUTE_START) - const startEnvCommand: ComputeStartCommand = { + const startEnvCommand: PaidComputeStartCommand = { command: PROTOCOL_COMMANDS.COMPUTE_START, consumerAddress: '', signature: '', nonce: '', environment: '', algorithm: undefined, - dataset: undefined + datasets: undefined, + payment: undefined } expect(startEnvHandler.validate(startEnvCommand).valid).to.be.equal(false) // ----------------------------------------- @@ -341,8 +368,20 @@ describe('Commands and handlers', () => { consumerAddress: 'abcdef', datasets: null, algorithm: undefined, - compute: undefined + payment: undefined, + environment: undefined, + maxJobDuration: 60 } expect(initComputeHandler.validate(computeInitCommand).valid).to.be.equal(false) + // ----------------------------------------- + // JobsHandler + const jobsHandler: GetJobsHandler = CoreHandlersRegistry.getInstance(node).getHandler( + PROTOCOL_COMMANDS.JOBS + ) + const getJobsCommand: GetJobsCommand = { + command: PROTOCOL_COMMANDS.JOBS + } + expect(jobsHandler.validate(getJobsCommand).valid).to.be.equal(true) + // ----------------------------------------- }) }) diff --git a/src/test/unit/compute.test.ts b/src/test/unit/compute.test.ts new file mode 100644 index 000000000..c6d10f6e6 --- /dev/null +++ b/src/test/unit/compute.test.ts @@ -0,0 +1,261 @@ +import { C2DDatabase } from '../../components/database/C2DDatabase.js' +// import { existsEnvironmentVariable, getConfiguration } from '../../utils/config.js' +import { getConfiguration } from '../../utils/config.js' +import { typesenseSchemas } from '../../components/database/TypesenseSchemas.js' +import { + C2DStatusNumber, + C2DStatusText, + ComputeAlgorithm, + ComputeAsset, + // ComputeEnvironment, + // ComputeJob, + DBComputeJob, + RunningPlatform +} from '../../@types/C2D/C2D.js' +// import { computeAsset } from '../data/assets' +import { assert, expect } from 'chai' +import { + convertArrayToString, + convertStringToArray, + STRING_SEPARATOR +} from '../../components/database/sqliteCompute.js' +import os from 'os' +import { + buildEnvOverrideConfig, + OverrideEnvConfig, + setupEnvironment, + tearDownEnvironment, + TEST_ENV_CONFIG_FILE +} from '../utils/utils.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { ENVIRONMENT_VARIABLES } from '../../utils/constants.js' +import { dockerImageManifest } from '../data/assets.js' +// import { omitDBComputeFieldsFromComputeJob } from '../../components/c2d/index.js' +import { checkManifestPlatform } from '../../components/c2d/compute_engine_docker.js' + +describe('Compute Jobs Database', () => { + let envOverrides: OverrideEnvConfig[] + let config: OceanNodeConfig + let db: C2DDatabase = null + let jobId: string = null + const jobDuration = 60 + const algorithm: ComputeAlgorithm = { + documentId: 'did:op:12345', + serviceId: '0x1828228' + } + const dataset: ComputeAsset = { + documentId: 'did:op:12345', + serviceId: '0x12345abc' + } + + before(async () => { + envOverrides = buildEnvOverrideConfig( + [ENVIRONMENT_VARIABLES.DOCKER_COMPUTE_ENVIRONMENTS], + [ + '[{"socketPath":"/var/run/docker.sock","resources":[{"id":"disk","total":10}],"storageExpiry":604800,"maxJobDuration":3600,"minJobDuration":60,"fees":{"1":[{"feeToken":"0x123","prices":[{"id":"cpu","price":1}]}]},"free":{"maxJobDuration":60,"minJobDuration":10,"maxJobs":3,"resources":[{"id":"cpu","max":1},{"id":"ram","max":1},{"id":"disk","max":1}]}}]' + ] + ) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) + config = await getConfiguration(true) + db = await new C2DDatabase(config.dbConfig, typesenseSchemas.c2dSchemas) + }) + + it('should create a new C2D Job', async () => { + const job: DBComputeJob = { + owner: '0xe2DD09d719Da89e5a3D0F2549c7E24566e947260', + jobId: null, + dateCreated: null, + dateFinished: null, + status: C2DStatusNumber.JobStarted, + statusText: C2DStatusText.JobStarted, + results: null, + inputDID: ['did:op:1', 'did:op:2', 'did:op:3'], + maxJobDuration: jobDuration, + + // internal structure + clusterHash: 'clusterHash', + configlogURL: 'http://localhost:8001', + publishlogURL: 'http://localhost:8001', + algologURL: 'http://localhost:8001', + outputsURL: 'http://localhost:8001', + stopRequested: false, + algorithm, + assets: [dataset], + isRunning: false, + isStarted: false, + containerImage: 'some container image', + resources: [], + environment: 'some environment', + agreementId: '0xe2DD09d719Da89e5a3D0F2549c7E24566e947260fdc', + payment: { + token: '0x123', + lockTx: '0xe2DD09d719Da89e5a3D0F2549c7E24566e947260fdc', + claimTx: '0xe2DD09d719Da89e5a3D0F2549c7E24566e947260fdc', + chainId: 8996, + cost: 0 + }, + isFree: false, + algoStartTimestamp: '0', + algoStopTimestamp: '0', + algoDuration: 0, + queueMaxWaitTime: 0 + } + + jobId = await db.newJob(job) + assert(jobId, 'Missing jobId identifier') + }) + + it('should get job by jobId', async () => { + const jobs = await db.getJob(jobId) + assert(jobs.length === 1, 'Could not get any job') + assert(jobs[0], 'Job should not be null') + assert(jobs[0].jobId === jobId, 'JobId mismatches') + assert(jobs[0].maxJobDuration === jobDuration, 'Job duration mismatches') + }) + it('should update job', async () => { + const jobs = await db.getJob(jobId) + const job = jobs[0] + // will update some fields + job.status = C2DStatusNumber.PullImage + job.isRunning = true + job.statusText = C2DStatusText.PullImage + + // update on DB + const updates = await db.updateJob(job) + expect(updates).to.be.equal(1) // updated 1 row + const updatedJobs = await db.getJob(jobId) + const updatedJob = updatedJobs[0] + assert(updatedJob, 'Job should not be null') + expect(updatedJob.status).to.be.equal(C2DStatusNumber.PullImage) + expect(updatedJob.isRunning).to.be.equal(true) + expect(updatedJob.statusText).to.be.equal(C2DStatusText.PullImage) + }) + + it('should get running jobs', async () => { + const job: DBComputeJob = { + owner: '0xe2DD09d719Da89e5a3D0F2549c7E24566e947261', + jobId: null, + dateCreated: null, + dateFinished: null, + status: C2DStatusNumber.JobStarted, + statusText: C2DStatusText.JobStarted, + results: null, + inputDID: ['did:op:1', 'did:op:2'], + maxJobDuration: 1, + + // internal structure + clusterHash: 'clusterHash', + configlogURL: 'http://localhost:8000', + publishlogURL: 'http://localhost:8000', + algologURL: 'http://localhost:8000', + outputsURL: 'http://localhost:8000', + stopRequested: false, + algorithm, + assets: [dataset], + environment: 'some environment', + isRunning: false, + isStarted: false, + containerImage: 'another container image', + resources: [], + agreementId: '0xe2DD09d719Da89e5a3D0F2549c7E24566e947260fdc', + payment: { + token: '0x123', + lockTx: '0xe2DD09d719Da89e5a3D0F2549c7E24566e947260fdc', + claimTx: '0xe2DD09d719Da89e5a3D0F2549c7E24566e947260fdc', + chainId: 8996, + cost: 0 + }, + isFree: false, + algoStartTimestamp: '0', + algoStopTimestamp: '0', + algoDuration: 0, + queueMaxWaitTime: 0 + } + + const jobId = await db.newJob(job) + assert(jobId, 'Missing jobId identifier') + const existing = await db.getRunningJobs() + expect(existing.length === 2, 'No running jobs were found!') + + // Create a filter + const withEnv = await db.getRunningJobs(null, 'some environment') + expect(withEnv.length === 0, 'No running jobs were found for this environment') + // delete it + const deleted = await db.deleteJob(jobId) + expect(deleted === true, `Job ${jobId} was not deleted!`) + }) + + it('should delete the job by jobId', async () => { + const deleted = await db.deleteJob(jobId) + expect(deleted === true, `Job ${jobId} was not deleted!`) + }) + + it('should convert array of strings to a string', () => { + const inputDID = ['did:op:1', 'did:op:2', 'did:op:3'] + const expectedStr = + 'did:op:1' + STRING_SEPARATOR + 'did:op:2' + STRING_SEPARATOR + 'did:op:3' + expect(convertArrayToString(inputDID)).to.equal(expectedStr) + }) + + it('should convert concatenated string to a string array', () => { + const expectedArray = ['did:op:1', 'did:op:2', 'did:op:3'] + const str = 'did:op:1' + STRING_SEPARATOR + 'did:op:2' + STRING_SEPARATOR + 'did:op:3' + expect(convertStringToArray(str)).to.deep.equal(expectedArray) + }) + + // it('should convert DBComputeJob to ComputeJob and omit internal DB data', () => { + // const source: any = completeDBComputeJob + // const output: ComputeJob = omitDBComputeFieldsFromComputeJob(source as DBComputeJob) + + // expect(Object.prototype.hasOwnProperty.call(output, 'clusterHash')).to.be.equal(false) + // expect(Object.prototype.hasOwnProperty.call(output, 'configlogURL')).to.be.equal( + // false + // ) + // expect(Object.prototype.hasOwnProperty.call(output, 'publishlogURL')).to.be.equal( + // false + // ) + // expect(Object.prototype.hasOwnProperty.call(output, 'algologURL')).to.be.equal(false) + // expect(Object.prototype.hasOwnProperty.call(output, 'outputsURL')).to.be.equal(false) + // expect(Object.prototype.hasOwnProperty.call(output, 'algorithm')).to.be.equal(false) + // expect(Object.prototype.hasOwnProperty.call(output, 'assets')).to.be.equal(false) + // expect(Object.prototype.hasOwnProperty.call(output, 'isRunning')).to.be.equal(false) + // expect(Object.prototype.hasOwnProperty.call(output, 'isStarted')).to.be.equal(false) + // expect(Object.prototype.hasOwnProperty.call(output, 'containerImage')).to.be.equal( + // false + // ) + // }) + + it('should check manifest platform against local platform env', () => { + const arch = os.machine() // ex: arm + const platform = os.platform() // ex: linux + const env: RunningPlatform = { + architecture: arch, + os: platform + } + const result: boolean = checkManifestPlatform(dockerImageManifest.platform, env) + // if all defined and a match its OK + if ( + dockerImageManifest.platform.os === env.os && + dockerImageManifest.platform.architecture === env.architecture + ) { + expect(result).to.be.equal(true) + } else { + // oterwise its NOT + expect(result).to.be.equal(false) + } + + // all good anyway, nothing on the manifest + expect(checkManifestPlatform(null, env)).to.be.equal(true) + }) + + it('testing checkAndFillMissingResources', async function () { + // TO DO + }) + it('testing checkIfResourcesAreAvailable', async function () { + // TO DO + }) + + after(async () => { + await tearDownEnvironment(envOverrides) + }) +}) diff --git a/src/test/unit/config.test.ts b/src/test/unit/config.test.ts new file mode 100644 index 000000000..8a2b028ad --- /dev/null +++ b/src/test/unit/config.test.ts @@ -0,0 +1,119 @@ +import { expect } from 'chai' +import { OceanNodeConfig } from '../../@types/OceanNode.js' +import { getConfiguration, loadConfigFromFile } from '../../utils/config.js' +import { + OverrideEnvConfig, + TEST_ENV_CONFIG_PATH, + buildEnvOverrideConfig, + setupEnvironment +} from '../utils/utils.js' +import { ENVIRONMENT_VARIABLES } from '../../utils/constants.js' + +let config: OceanNodeConfig +describe('Should validate configuration from JSON', () => { + let envOverrides: OverrideEnvConfig[] + before(async () => { + envOverrides = buildEnvOverrideConfig( + [ENVIRONMENT_VARIABLES.DB_TYPE, ENVIRONMENT_VARIABLES.DB_URL], + ['typesense', 'http://localhost:8108/?apiKey=xyz'] + ) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_PATH, envOverrides) + config = await getConfiguration(true) + }) + + it('should get indexer networks from config', () => { + expect(Object.keys(config.indexingNetworks).length).to.be.equal(1) + expect(config.indexingNetworks['8996']).to.not.equal(undefined) + expect(config.indexingNetworks['8996'].chainId).to.be.equal(8996) + expect(config.indexingNetworks['8996'].rpc).to.be.equal('http://127.0.0.1:8545') + expect(config.indexingNetworks['8996'].network).to.be.equal('development') + expect(config.indexingNetworks['8996'].chunkSize).to.be.equal(100) + }) + + it('should have indexer', () => { + expect(config.hasIndexer).to.be.equal(true) + expect(config.dbConfig).to.not.be.equal(null) + // it is exported in the env vars, so it should overwrite the config.json + expect(config.dbConfig.dbType).to.be.equal('typesense') + const configFile = loadConfigFromFile(process.env.CONFIG_PATH) + expect(config.dbConfig.dbType).to.not.be.equal(configFile.dbConfig.dbType) + expect(config.dbConfig.url).to.be.equal('http://localhost:8108/?apiKey=xyz') + }) + + it('should have HTTP', () => { + expect(config.hasHttp).to.be.equal(true) + expect(config.httpPort).to.be.equal(8001) + }) + + it('should have P2P', () => { + expect(config.hasP2P).to.be.equal(true) + expect(config.p2pConfig).to.not.be.equal(null) + expect(config.p2pConfig.bootstrapNodes).to.not.be.equal(null) + expect(config.p2pConfig.bootstrapNodes.length).to.be.equal(0) + }) + it('should have defaults set', () => { + expect(config.isBootstrap).to.be.equal(false) + expect(config.validateUnsignedDDO).to.be.equal(true) + }) + after(() => { + delete process.env.CONFIG_PATH + delete process.env.PRIVATE_KEY + }) +}) + +describe('Should validate P2P config from environment variables', () => { + let config: OceanNodeConfig + let envOverrides: OverrideEnvConfig[] + + before(async () => { + envOverrides = buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.DB_TYPE, + ENVIRONMENT_VARIABLES.DB_URL, + ENVIRONMENT_VARIABLES.P2P_ipV4BindAddress, + ENVIRONMENT_VARIABLES.P2P_ipV4BindTcpPort, + ENVIRONMENT_VARIABLES.P2P_ipV6BindAddress, + ENVIRONMENT_VARIABLES.P2P_MIN_CONNECTIONS, + ENVIRONMENT_VARIABLES.P2P_MAX_CONNECTIONS + ], + [ + 'typesense', + 'http://localhost:8108/?apiKey=xyz', + '127.0.0.1', + '9999', + '::2', + '5', + '500' + ] + ) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_PATH, envOverrides) + config = await getConfiguration(true) + }) + + it('should override P2P config values from environment variables', () => { + expect(config.p2pConfig).to.not.be.equal(null) + expect(config.p2pConfig.ipV4BindAddress).to.be.equal('127.0.0.1') + expect(config.p2pConfig.ipV4BindTcpPort).to.be.equal(9999) + expect(config.p2pConfig.ipV6BindAddress).to.be.equal('::2') + expect(config.p2pConfig.minConnections).to.be.equal(5) + expect(config.p2pConfig.maxConnections).to.be.equal(500) + }) + + it('should maintain non-overridden P2P config values from config.json', () => { + expect(config.p2pConfig.enableIPV4).to.be.equal(true) + expect(config.p2pConfig.enableIPV6).to.be.equal(true) + expect(config.p2pConfig.upnp).to.be.equal(true) + expect(config.p2pConfig.autoNat).to.be.equal(true) + expect(config.p2pConfig.bootstrapNodes).to.not.be.equal(null) + }) + + after(() => { + delete process.env.CONFIG_PATH + delete process.env.PRIVATE_KEY + delete process.env[ENVIRONMENT_VARIABLES.P2P_ipV4BindAddress.name] + delete process.env[ENVIRONMENT_VARIABLES.P2P_ipV4BindTcpPort.name] + delete process.env[ENVIRONMENT_VARIABLES.P2P_ipV6BindAddress.name] + delete process.env[ENVIRONMENT_VARIABLES.P2P_MIN_CONNECTIONS.name] + delete process.env[ENVIRONMENT_VARIABLES.P2P_MAX_CONNECTIONS.name] + }) +}) diff --git a/src/test/unit/credentials.test.ts b/src/test/unit/credentials.test.ts index 1a41890cc..3fa2e7664 100644 --- a/src/test/unit/credentials.test.ts +++ b/src/test/unit/credentials.test.ts @@ -1,114 +1,207 @@ import { expect } from 'chai' import { checkCredentials } from '../../utils/credentials.js' -import { Credentials } from '../../@types/DDO/Credentials.js' +import { + buildEnvOverrideConfig, + OverrideEnvConfig, + setupEnvironment, + tearDownEnvironment, + TEST_ENV_CONFIG_FILE +} from '../utils/utils.js' +import { KeyManager } from '../../components/KeyManager/index.js' +import { BlockchainRegistry } from '../../components/BlockchainRegistry/index.js' +import { ENVIRONMENT_VARIABLES } from '../../utils/constants.js' +import { homedir } from 'os' +import { Credentials } from '@oceanprotocol/ddo-js' +import { CREDENTIALS_TYPES } from '../../@types/DDO/Credentials.js' +import { Blockchain } from '../../utils/blockchain.js' +import { Signer } from 'ethers' +import { getConfiguration } from '../../utils/index.js' +import { DEVELOPMENT_CHAIN_ID } from '../../utils/address.js' + +let envOverrides: OverrideEnvConfig[] +let blockchain: Blockchain +let signer: Signer describe('credentials', () => { - it('should allow access with undefined or empty credentials', () => { + before(async () => { + envOverrides = buildEnvOverrideConfig( + [ENVIRONMENT_VARIABLES.RPCS, ENVIRONMENT_VARIABLES.ADDRESS_FILE], + [ + '{ "8996":{ "rpc":"http://127.0.0.1:8545", "chainId": 8996, "network": "development", "chunkSize": 100 }}', + `${homedir}/.ocean/ocean-contracts/artifacts/address.json` + ] + ) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) + const config = await getConfiguration() + // Initialize blockchain for tests + const keyManager = new KeyManager(config) + const blockchains = new BlockchainRegistry(keyManager, config) + blockchain = blockchains.getBlockchain(DEVELOPMENT_CHAIN_ID) + // force usage of known bad provider + await blockchain.getProvider(true) + signer = await blockchain.getSigner() + }) + + it('should allow access with undefined or empty credentials', async () => { const credentialsUndefined: Credentials = undefined const consumerAddress = '0x123' - const accessGranted1 = checkCredentials(credentialsUndefined, consumerAddress) + const accessGranted1 = await checkCredentials( + consumerAddress, + credentialsUndefined, + signer + ) expect(accessGranted1).to.equal(true) const credentialsEmapty = {} as Credentials - const accessGranted2 = checkCredentials(credentialsEmapty, consumerAddress) + const accessGranted2 = await checkCredentials( + consumerAddress, + credentialsEmapty, + signer + ) expect(accessGranted2).to.equal(true) }) - it('should allow access with empty allow and deny lists', () => { + it('should allow access with empty allow and deny lists', async () => { const credentials: Credentials = { allow: [], deny: [] } const consumerAddress = '0x123' - const accessGranted = checkCredentials(credentials, consumerAddress) + const accessGranted = await checkCredentials(consumerAddress, credentials, signer) expect(accessGranted).to.equal(true) }) - it('should allow access with empty values in deny lists', () => { + it('should allow access with empty values in deny lists', async () => { const credentials: Credentials = { + allow: [], deny: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: [] } ] } const consumerAddress = '0x123' - const accessGranted = checkCredentials(credentials, consumerAddress) + const accessGranted = await checkCredentials(consumerAddress, credentials, signer) + expect(accessGranted).to.equal(true) + }) + + it('should allow access with "accessList" credentials type', async () => { + const consumerAddress = '0x123' + const credentials: Credentials = { + allow: [], + deny: [ + { + type: CREDENTIALS_TYPES.ACCESS_LIST, + chainId: 8996, + accessList: '0x0000000000000000000000000000000000000000' + } + ] + } + + const accessGranted = await checkCredentials(consumerAddress, credentials, signer) expect(accessGranted).to.equal(true) }) - it('should deny access with empty values in allow lists', () => { + + it('should deny access with empty values in allow lists', async () => { const credentials: Credentials = { + deny: [], allow: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: [] } ] } const consumerAddress = '0x123' - const accessGranted = checkCredentials(credentials, consumerAddress) + const accessGranted = await checkCredentials(consumerAddress, credentials, signer) expect(accessGranted).to.equal(false) }) - it('should allow access with address in allow list', () => { + it('should allow access with address in allow list', async () => { const credentials: Credentials = { + deny: [], allow: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: ['0x123'] } ] } const consumerAddress = '0x123' - const accessGranted = checkCredentials(credentials, consumerAddress) + const accessGranted = await checkCredentials(consumerAddress, credentials, signer) expect(accessGranted).to.equal(true) }) - it('should allow access with address not in deny list', () => { + it('should allow access with address not in deny list', async () => { const credentials: Credentials = { + allow: [], deny: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: ['0x456'] } ] } const consumerAddress = '0x123' - const accessGranted = checkCredentials(credentials, consumerAddress) + const accessGranted = await checkCredentials(consumerAddress, credentials, signer) expect(accessGranted).to.equal(true) }) - it('should deny access with address in deny list', () => { + it('should deny access with address in deny list', async () => { const credentials: Credentials = { allow: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: [] } ], deny: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: ['0x123'] } ] } const consumerAddress = '0x123' - const accessGranted = checkCredentials(credentials, consumerAddress) + const accessGranted = await checkCredentials(consumerAddress, credentials, signer) expect(accessGranted).to.equal(false) }) - it('should deny access with address not in allow list', () => { + it('should deny access with address not in allow list', async () => { const credentials: Credentials = { allow: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: ['0x456'] } ], deny: [ { - type: 'address', + type: CREDENTIALS_TYPES.ADDRESS, values: [] } ] } const consumerAddress = '0x123' - const accessGranted = checkCredentials(credentials, consumerAddress) + const accessGranted = await checkCredentials(consumerAddress, credentials, signer) expect(accessGranted).to.equal(false) }) + + it('should check match all (*) rules', async () => { + const credentials: Credentials = { + allow: [ + { + type: CREDENTIALS_TYPES.ADDRESS, + values: ['*'] + } + ], + deny: [ + { + type: CREDENTIALS_TYPES.ADDRESS, + values: ['0x2222', '0x333'] + } + ] + } + + const accessGranted = await checkCredentials('0x123', credentials, signer) + expect(accessGranted).to.equal(true) + }) + + after(async () => { + await tearDownEnvironment(envOverrides) + }) }) diff --git a/src/test/unit/crypt.test.ts b/src/test/unit/crypt.test.ts index d6f1f10ad..5fb349ab8 100644 --- a/src/test/unit/crypt.test.ts +++ b/src/test/unit/crypt.test.ts @@ -1,18 +1,45 @@ import { expect } from 'chai' -import { decrypt, encrypt } from '../../utils/crypt.js' import { EncryptMethod } from '../../@types/fileObject.js' +import { + buildEnvOverrideConfig, + OverrideEnvConfig, + setupEnvironment, + tearDownEnvironment, + TEST_ENV_CONFIG_FILE +} from '../utils/utils.js' +import { getConfiguration } from '../../utils/index.js' +import { ENVIRONMENT_VARIABLES } from '../../utils/constants.js' +import { homedir } from 'os' +import { KeyManager } from '../../components/KeyManager/index.js' describe('crypt', () => { + let envOverrides: OverrideEnvConfig[] + let keyManager: KeyManager + before(async () => { + envOverrides = buildEnvOverrideConfig( + [ENVIRONMENT_VARIABLES.RPCS, ENVIRONMENT_VARIABLES.ADDRESS_FILE], + [ + '{ "8996":{ "rpc":"http://127.0.0.1:8545", "chainId": 8996, "network": "development", "chunkSize": 100 }}', + `${homedir}/.ocean/ocean-contracts/artifacts/address.json` + ] + ) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) + const config = await getConfiguration() + keyManager = new KeyManager(config) + }) it('should encrypt/decrypt AES', async () => { const data = Uint8Array.from(Buffer.from('ocean')) - const encryptedData = await encrypt(data, EncryptMethod.AES) - const decryptedData = await decrypt(encryptedData, EncryptMethod.AES) + const encryptedData = await keyManager.encrypt(data, EncryptMethod.AES) + const decryptedData = await keyManager.decrypt(encryptedData, EncryptMethod.AES) expect(Uint8Array.from(decryptedData)).to.deep.equal(data) }) it('should encrypt/decrypt ECIES', async () => { const data = Uint8Array.from(Buffer.from('ocean')) - const encryptedData = await encrypt(data, EncryptMethod.ECIES) - const decryptedData = await decrypt(encryptedData, EncryptMethod.ECIES) + const encryptedData = await keyManager.encrypt(data, EncryptMethod.ECIES) + const decryptedData = await keyManager.decrypt(encryptedData, EncryptMethod.ECIES) expect(Uint8Array.from(decryptedData)).to.deep.equal(data) }) + after(async () => { + await tearDownEnvironment(envOverrides) + }) }) diff --git a/src/test/unit/download.test.ts b/src/test/unit/download.test.ts index 49cfd178f..21a0c1c27 100644 --- a/src/test/unit/download.test.ts +++ b/src/test/unit/download.test.ts @@ -10,16 +10,16 @@ import { Readable } from 'stream' import { streamToString } from '../../utils/util.js' import { OverrideEnvConfig, + TEST_ENV_CONFIG_FILE, buildEnvOverrideConfig, setupEnvironment, tearDownEnvironment } from '../utils/utils.js' -import { decrypt } from '../../utils/crypt.js' import { validateFilesStructure } from '../../components/core/handler/downloadHandler.js' import { AssetUtils, isConfidentialChainDDO } from '../../utils/asset.js' -import { DDO } from '../../@types/DDO/DDO.js' -import { Service } from '../../@types/DDO/Service.js' import { DEVELOPMENT_CHAIN_ID, KNOWN_CONFIDENTIAL_EVMS } from '../../utils/address.js' +import { DDO } from '@oceanprotocol/ddo-js' +import { Wallet, ethers } from 'ethers' let envOverrides: OverrideEnvConfig[] let config: OceanNodeConfig @@ -27,15 +27,17 @@ let db: Database let oceanNode: OceanNode describe('Should validate files structure for download', () => { + let consumerAccount: Wallet before(async () => { envOverrides = buildEnvOverrideConfig( [ENVIRONMENT_VARIABLES.PRIVATE_KEY], ['0x3634cc4a3d2694a1186a7ce545f149e022eea103cc254d18d08675104bb4b5ac'] ) - envOverrides = await setupEnvironment(null, envOverrides) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) config = await getConfiguration(true) - db = await new Database(config.dbConfig) - oceanNode = OceanNode.getInstance(db) + db = await Database.init(config.dbConfig) + oceanNode = OceanNode.getInstance(config, db) + consumerAccount = new Wallet(process.env.PRIVATE_KEY) }) const ddoObj: DDO = { @@ -65,8 +67,7 @@ describe('Should validate files structure for download', () => { serviceEndpoint: 'http://127.0.0.1:8001', timeout: 86400 } - ], - event: {} + ] } const assetURL = { @@ -83,13 +84,25 @@ describe('Should validate files structure for download', () => { // encrypts the assetURL using the encrypt handler (what goes into services files at publish time), // and decrypts the data back to the original format const getDecryptedData = async function () { + const nonce = Date.now().toString() + const message = String(nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await consumerAccount.signMessage(messageHashBytes) + console.log('signature', signature) const result = await new EncryptHandler(oceanNode).handle({ blob: JSON.stringify(assetURL), encoding: 'string', encryptionType: EncryptMethod.ECIES, - command: PROTOCOL_COMMANDS.ENCRYPT + command: PROTOCOL_COMMANDS.ENCRYPT, + nonce, + consumerAddress: await consumerAccount.getAddress(), + signature }) - + console.log('result', result) const encryptedData: string = await streamToString(result.stream as Readable) const serviceData = { files: encryptedData @@ -97,7 +110,9 @@ describe('Should validate files structure for download', () => { const data = Uint8Array.from(Buffer.from(serviceData.files.slice(2), 'hex')) - const decryptedUrlBytes = await decrypt(data, EncryptMethod.ECIES) + const decryptedUrlBytes = await oceanNode + .getKeyManager() + .decrypt(data, EncryptMethod.ECIES) // Convert the decrypted bytes back to a string const decryptedFilesString = Buffer.from(decryptedUrlBytes).toString() // back to JSON representation @@ -107,10 +122,10 @@ describe('Should validate files structure for download', () => { it('should validate "nftAddress" and "datatokenAddress" from files', async () => { const decryptedFileArray = await getDecryptedData() - const decriptedFileObject: any = decryptedFileArray.files - expect(decriptedFileObject[0]).to.be.deep.equal(assetURL.files[0]) + const decryptedFileObject: any = decryptedFileArray.files + expect(decryptedFileObject[0]).to.be.deep.equal(assetURL.files[0]) // validate the structure of the files object - const service: Service = AssetUtils.getServiceByIndex(ddoObj, 0) + const service = AssetUtils.getServiceByIndex(ddoObj, 0) expect(validateFilesStructure(ddoObj, service, decryptedFileArray)).to.be.equal(true) }) @@ -118,12 +133,12 @@ describe('Should validate files structure for download', () => { const otherNFTAddress = '0x3b7aE751aBA144e9A0ffc5A5C1D00bB4055A7bDc' const otherDatatokenAddress = '0x32b24528675172841d89BBA7504A930B049aBd30' const decryptedFileArray = await getDecryptedData() - const otherDDOSameFiles: DDO = ddoObj + const otherDDOSameFiles = structuredClone(ddoObj) // just change nft address otherDDOSameFiles.nftAddress = otherNFTAddress otherDDOSameFiles.services[0].datatokenAddress = otherDatatokenAddress - const service: Service = AssetUtils.getServiceByIndex(otherDDOSameFiles, 0) + const service = AssetUtils.getServiceByIndex(otherDDOSameFiles, 0) // its the same service files structure (same encrypted data), // but its not the same ddo so there is no matching expect( @@ -131,8 +146,28 @@ describe('Should validate files structure for download', () => { ).to.be.equal(false) // this encrypted file data if for assetURL with otherNFTAddress and otherDatatokenAddress above - const encryptedFilesData = - '0x04a8e18eb64ec339ec4438b7dea0155630928c2bbcec707589adb42b9359e8baf97a9eab822e47195599105909573d294de0f68125a38a47ca583e8171d5e636f6f710687363e65e62932457a8d0e4825dbbb7fb047a4b6013655d2925ae3756015040348d327bca02d12cede80d6d024cc7a690d4976635225a27fe6d8ca85354e72c5034c62962f3cdfe186460a84205bd14b71041d8b915bc9f94eae89a07210c12198afca09e3ba9d7c7df394c00a090b9e3631609de434b8f45adce16fa7f86dd0ac71168eefd819b6fb226a6a7371d3fab88def9ee1454b96e22fa0e9408bdc0ec38cd6bd067476cc0a33af3fb8ed4e4675b45e452bb687f485ce94f8e4e72ebb816c76fae5c9408e66fd89d0251ac6b9a34deaac8dbd22439a90ea9cc4bf80028e3e93259d468820ddf18f83e68781422d20bc19a2a3c2a0d93426cff6a8d13270e75732e1dd9ec8a8d4621b9f9c9c136e9ae48336da1844b1826' + const newAssetURL = structuredClone(assetURL) + newAssetURL.nftAddress = otherNFTAddress + newAssetURL.datatokenAddress = otherDatatokenAddress + const nonce = Date.now().toString() + const message = String(nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await consumerAccount.signMessage(messageHashBytes) + const result = await new EncryptHandler(oceanNode).handle({ + blob: JSON.stringify(newAssetURL), + encoding: 'string', + encryptionType: EncryptMethod.ECIES, + command: PROTOCOL_COMMANDS.ENCRYPT, + nonce, + consumerAddress: await consumerAccount.getAddress(), + signature + }) + + const encryptedFilesData: string = await streamToString(result.stream as Readable) const sameDDOOtherFiles = ddoObj sameDDOOtherFiles.services[0].files = encryptedFilesData expect( @@ -141,7 +176,9 @@ describe('Should validate files structure for download', () => { const data = Uint8Array.from(Buffer.from(encryptedFilesData.slice(2), 'hex')) - const decryptedUrlBytes = await decrypt(data, EncryptMethod.ECIES) + const decryptedUrlBytes = await oceanNode + .getKeyManager() + .decrypt(data, EncryptMethod.ECIES) // Convert the decrypted bytes back to a string const decryptedFilesString = Buffer.from(decryptedUrlBytes).toString() // back to JSON representation @@ -154,7 +191,7 @@ describe('Should validate files structure for download', () => { }) it('should check if DDO service files is missing or empty (exected for confidential EVM, dt4)', () => { - const otherDDOConfidential: DDO = structuredClone(ddoObj) + const otherDDOConfidential = structuredClone(ddoObj) expect( isConfidentialChainDDO(KNOWN_CONFIDENTIAL_EVMS[0], otherDDOConfidential.services[0]) ).to.be.equal(false) @@ -168,7 +205,10 @@ describe('Should validate files structure for download', () => { // not confidential evm anymore expect( - isConfidentialChainDDO(DEVELOPMENT_CHAIN_ID, otherDDOConfidential.services[0]) + isConfidentialChainDDO( + BigInt(DEVELOPMENT_CHAIN_ID), + otherDDOConfidential.services[0] + ) ).to.be.equal(false) }) diff --git a/src/test/unit/indexer/indexer.test.ts b/src/test/unit/indexer/indexer.test.ts deleted file mode 100644 index 3a172a506..000000000 --- a/src/test/unit/indexer/indexer.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { assert, expect } from 'chai' -import { describe, it } from 'mocha' -import { OceanIndexer } from '../../../components/Indexer/index.js' -import { getConfiguration } from '../../../utils/index.js' -import { Database } from '../../../components/database/index.js' -import { OceanNodeConfig } from '../../../@types/OceanNode.js' -import { - hasValidDBConfiguration, - isReachableConnection -} from '../../../utils/database.js' - -describe('OceanIndexer', () => { - let oceanIndexer: OceanIndexer - let mockDatabase: Database - let config: OceanNodeConfig - before(async () => { - config = await getConfiguration(true) - mockDatabase = await new Database(config.dbConfig) - }) - - it('should start threads and handle worker events', async () => { - oceanIndexer = new OceanIndexer(mockDatabase, config.supportedNetworks) - assert(oceanIndexer, 'indexer should not be null') - expect(oceanIndexer.getDatabase().getConfig()).to.be.equal(mockDatabase.getConfig()) - expect(oceanIndexer.getIndexingQueue().length).to.be.equal(0) - expect(oceanIndexer.getJobsPool().length).to.be.equal(0) - - if ( - hasValidDBConfiguration(mockDatabase.getConfig()) && - (await isReachableConnection(mockDatabase.getConfig().url)) - ) { - // should be fine, if we have a valid RPC as well - expect(await oceanIndexer.startThreads()).to.be.equal(true) - } else { - // cannot start threads without DB connection - expect(await oceanIndexer.startThreads()).to.be.equal(false) - } - - // there are no worker threads available - expect(oceanIndexer.stopAllThreads()).to.be.equal(false) - }) -}) diff --git a/src/test/unit/indexer/validation.test.ts b/src/test/unit/indexer/validation.test.ts index dda552f0b..956668b4e 100644 --- a/src/test/unit/indexer/validation.test.ts +++ b/src/test/unit/indexer/validation.test.ts @@ -1,35 +1,80 @@ import { DDOExample, ddov5, ddov7, ddoValidationSignature } from '../../data/ddo.js' -import { - getValidationSignature, - validateObject -} from '../../../components/core/utils/validateDdoHandler.js' -import { ENVIRONMENT_VARIABLES } from '../../../utils/index.js' - +import { getValidationSignature } from '../../../components/core/utils/validateDdoHandler.js' +import { ENVIRONMENT_VARIABLES, getConfiguration } from '../../../utils/index.js' import { expect } from 'chai' import { setupEnvironment, tearDownEnvironment, buildEnvOverrideConfig, - OverrideEnvConfig + OverrideEnvConfig, + getMockSupportedNetworks, + TEST_ENV_CONFIG_FILE } from '../../utils/utils.js' +import { DDOManager, DDO } from '@oceanprotocol/ddo-js' +import { ValidateDDOHandler } from '../../../components/core/handler/ddoHandler.js' +import { OceanNode } from '../../../OceanNode.js' +import { PROTOCOL_COMMANDS } from '../../../utils/constants.js' +import { RPCS } from '../../../@types/blockchain.js' +import { Database } from '../../../components/database/index.js' +import { OceanNodeConfig } from '../../../@types/OceanNode.js' +// import sinon, { SinonSandbox } from 'sinon' +import { ethers } from 'ethers' +import { Readable } from 'stream' + +describe('Schema validation tests', () => { + const mockSupportedNetworks: RPCS = getMockSupportedNetworks() -describe('Schema validation tests', async () => { let envOverrides: OverrideEnvConfig[] - envOverrides = buildEnvOverrideConfig( - [ - ENVIRONMENT_VARIABLES.PRIVATE_KEY, - ENVIRONMENT_VARIABLES.IPFS_GATEWAY, - ENVIRONMENT_VARIABLES.ARWEAVE_GATEWAY, - ENVIRONMENT_VARIABLES.RPCS - ], - [ - '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', - 'https://ipfs.io/', - 'https://arweave.net/', - '{ "1": "https://rpc.eth.gateway.fm", "137": "https://polygon.meowrpc.com" }' - ] - ) - envOverrides = await setupEnvironment(null, envOverrides) + let mockDatabase: Database + let config: OceanNodeConfig + let oceanNode: OceanNode + // let sandbox: SinonSandbox + + // For token validation, please check integration test cases + before(async () => { + envOverrides = buildEnvOverrideConfig( + [ + ENVIRONMENT_VARIABLES.VALIDATE_UNSIGNED_DDO, + ENVIRONMENT_VARIABLES.PRIVATE_KEY, + ENVIRONMENT_VARIABLES.IPFS_GATEWAY, + ENVIRONMENT_VARIABLES.ARWEAVE_GATEWAY, + ENVIRONMENT_VARIABLES.RPCS + ], + [ + 'false', + '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', + 'https://ipfs.io/', + 'https://arweave.net/', + JSON.stringify(mockSupportedNetworks) + ] + ) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) + config = await getConfiguration(true) + /* sandbox = sinon.createSandbox() + sandbox.stub(Database, 'init').resolves({ + nonce: {}, + c2d: {}, + authToken: {}, + sqliteConfig: {}, + ddo: {}, + indexer: {}, + logs: {}, + order: {}, + ddoState: {} + } as any) + */ + mockDatabase = await Database.init(config.dbConfig) + oceanNode = await OceanNode.getInstance( + config, + mockDatabase, + undefined, + undefined, + undefined, + undefined, + undefined, + true + ) + }) after(() => { // Restore original local setup / env variables after test @@ -37,29 +82,32 @@ describe('Schema validation tests', async () => { }) it('should pass the validation on version 4.1.0', async () => { - const validationResult = await validateObject(DDOExample, 137, DDOExample.nftAddress) + const ddoInstance = DDOManager.getDDOClass(DDOExample) + const validationResult = await ddoInstance.validate() expect(validationResult[0]).to.eql(true) expect(validationResult[1]).to.eql({}) }) + it('should not pass due to invalid metadata.created on version 4.1.0', async () => { const copy = JSON.parse(JSON.stringify(DDOExample)) copy['@context'] = ['https://w3id.org/did/v1'] delete copy.metadata.created - const validationResult = await validateObject(copy, 137, copy.nftAddress) + const ddoInstance = DDOManager.getDDOClass(copy) + const validationResult = await ddoInstance.validate() expect(validationResult[0]).to.eql(false) }) // TO DO after fixing regex for created & updated: it('should not pass due to invalid ISO timestamp on version 4.1.0', async () => { + it('4.5.0 should pass the validation without service', async () => { - const validationResult = await validateObject(ddov5, 137, ddov5.nftAddress) + const ddoInstance = DDOManager.getDDOClass(ddov5) + const validationResult = await ddoInstance.validate() expect(validationResult[0]).to.eql(true) expect(validationResult[1]).to.eql({}) }) + it('should pass the validation and return signature', async () => { - const validationResult = await validateObject( - ddoValidationSignature, - 137, - ddov5.nftAddress - ) + const ddoInstance = DDOManager.getDDOClass(ddoValidationSignature) + const validationResult = await ddoInstance.validate() expect(validationResult[0]).to.eql(true) expect(validationResult[1]).to.eql({}) const signatureResult = await getValidationSignature( @@ -75,7 +123,8 @@ describe('Schema validation tests', async () => { }) it('should pass the validation on version 4.7.0', async () => { - const validationResult = await validateObject(ddov7, 137, ddov7.nftAddress) + const ddoInstance = DDOManager.getDDOClass(ddov7) + const validationResult = await ddoInstance.validate() console.log('Validation 4.7.0 result: ', validationResult) expect(validationResult[0]).to.eql(true) expect(validationResult[1]).to.eql({}) @@ -84,8 +133,73 @@ describe('Schema validation tests', async () => { it('should pass the validation on version 4.7.0 without credentials', async () => { const newDDO = structuredClone(ddov7) delete newDDO.services[0].credentials - const validationResult = await validateObject(newDDO, 137, newDDO.nftAddress) + const ddoInstance = DDOManager.getDDOClass(newDDO) + const validationResult = await ddoInstance.validate() expect(validationResult[0]).to.eql(true) expect(validationResult[1]).to.eql({}) }) + + it('should fail validation when signature is missing', async () => { + const handler = new ValidateDDOHandler(oceanNode) + const ddoInstance = DDOManager.getDDOClass(DDOExample) + const task = { + ddo: ddoInstance.getDDOData() as DDO, + publisherAddress: '0x8F292046bb73595A978F4e7A131b4EBd03A15e8a', + nonce: '123456', + command: PROTOCOL_COMMANDS.VALIDATE_DDO + } + + const result = await handler.handle(task) + expect(result.status.httpStatus).to.equal(401) + }) + + it('should fail validation when signature is invalid', async () => { + const handler = new ValidateDDOHandler(oceanNode) + const ddoInstance = DDOManager.getDDOClass(DDOExample) + const ddo: DDO = { + ...(ddoInstance.getDDOData() as DDO) + } + const task = { + ddo, + publisherAddress: '0x8F292046bb73595A978F4e7A131b4EBd03A15e8a', + nonce: '123456', + signature: '0xInvalidSignature', + command: PROTOCOL_COMMANDS.VALIDATE_DDO + } + + const result = await handler.handle(task) + + expect(result.status.httpStatus).to.equal(401) + }) + + it('should have node signature for valid user', async () => { + const handler = new ValidateDDOHandler(oceanNode) + const ddoInstance = DDOManager.getDDOClass(DDOExample) + const ddo: DDO = { + ...(ddoInstance.getDDOData() as DDO) + } + const wallet = new ethers.Wallet( + '0xef4b441145c1d0f3b4bc6d61d29f5c6e502359481152f869247c7a4244d45209' + ) + const nonce = Date.now().toString() + const message = String((await wallet.getAddress()) + nonce) + const consumerMessage = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(consumerMessage) + const signature = await wallet.signMessage(messageHashBytes) + const task = { + ddo, + publisherAddress: await wallet.getAddress(), + nonce, + signature, + command: PROTOCOL_COMMANDS.VALIDATE_DDO + } + + const result = await handler.handle(task) + + expect(result.status.httpStatus).to.equal(200) + expect(result.stream).to.be.instanceOf(Readable) + }) }) diff --git a/src/test/unit/indexer/version.test.ts b/src/test/unit/indexer/version.test.ts new file mode 100644 index 000000000..a2055ccf4 --- /dev/null +++ b/src/test/unit/indexer/version.test.ts @@ -0,0 +1,60 @@ +import { assert, expect } from 'chai' +import { describe, it } from 'mocha' +import { + compareVersions, + isReindexingNeeded +} from '../../../components/Indexer/version.js' + +describe('Version utilities', () => { + describe('compareVersions', () => { + it('should return 0 for equal versions', () => { + expect(compareVersions('1.0.0', '1.0.0')).to.equal(0) + expect(compareVersions('2.3.1', '2.3.1')).to.equal(0) + }) + + it('should return -1 when first version is less than second', () => { + expect(compareVersions('1.0.0', '1.0.1')).to.equal(-1) + expect(compareVersions('1.9.9', '2.0.0')).to.equal(-1) + expect(compareVersions('2.3.0', '2.3.1')).to.equal(-1) + expect(compareVersions('0.2.1', '0.2.2')).to.equal(-1) + }) + + it('should return 1 when first version is greater than second', () => { + expect(compareVersions('1.0.1', '1.0.0')).to.equal(1) + expect(compareVersions('2.0.0', '1.9.9')).to.equal(1) + expect(compareVersions('2.3.1', '2.3.0')).to.equal(1) + }) + + it('should handle versions with different number of segments', () => { + expect(compareVersions('1.0', '1.0.0')).to.equal(0) + expect(compareVersions('1.0.0.0', '1.0.0')).to.equal(0) + expect(compareVersions('1.0', '1.0.1')).to.equal(-1) + expect(compareVersions('1.1', '1.0.9')).to.equal(1) + }) + }) + + describe('isReindexingNeeded', () => { + it('should return true if dbVersion is null', () => { + assert(isReindexingNeeded('1.0.0', null, '0.9.0') === true) + }) + + it('should return true if dbVersion is less than minVersion', () => { + assert(isReindexingNeeded('1.0.0', '0.1.0', '0.2.0') === true) + assert(isReindexingNeeded('0.3.0', '0.2.1', '0.2.2') === true) + }) + + it('should return false if dbVersion is equal to minVersion', () => { + assert(isReindexingNeeded('1.0.0', '0.2.0', '0.2.0') === false) + }) + + it('should return false if dbVersion is greater than minVersion', () => { + assert(isReindexingNeeded('1.0.0', '0.3.0', '0.2.0') === false) + }) + + it('should throw error if currentVersion is less than minVersion', () => { + expect(() => isReindexingNeeded('0.1.0', '0.2.0', '0.2.0')).to.throw( + 'Current version 0.1.0 is less than minimum required version 0.2.0' + ) + }) + }) +}) diff --git a/src/test/unit/logging.test.ts b/src/test/unit/logging.test.ts index 0d2942ffd..89fd35923 100644 --- a/src/test/unit/logging.test.ts +++ b/src/test/unit/logging.test.ts @@ -5,6 +5,7 @@ import { expect } from 'chai' import { DEFAULT_TEST_TIMEOUT, OverrideEnvConfig, + TEST_ENV_CONFIG_FILE, buildEnvOverrideConfig, setupEnvironment, tearDownEnvironment @@ -25,7 +26,7 @@ describe('Logger instances and transports tests', async () => { before(() => {}) // need to do it first envOverrides = await setupEnvironment( - null, + TEST_ENV_CONFIG_FILE, buildEnvOverrideConfig( [ ENVIRONMENT_VARIABLES.NODE_ENV, @@ -58,7 +59,7 @@ describe('Logger instances and transports tests', async () => { // will build the DB transport layer const config = await getConfiguration(true) // eslint-disable-next-line no-unused-vars - const DB = await new Database(config.dbConfig) + const DB = await Database.init(config.dbConfig) // Could generate Typesene error if DB is not running, but does not matter for this test OCEAN_NODE_LOGGER.logMessage('Should build DB transport layer') diff --git a/src/test/unit/networking.test.ts b/src/test/unit/networking.test.ts index 36e4a2a19..8a88b2bda 100644 --- a/src/test/unit/networking.test.ts +++ b/src/test/unit/networking.test.ts @@ -1,19 +1,24 @@ import { - DEFAULT_RATE_LIMIT_PER_SECOND, + DEFAULT_RATE_LIMIT_PER_MINUTE, + // DEFAULT_MAX_CONNECTIONS_PER_MINUTE, ENVIRONMENT_VARIABLES, PROTOCOL_COMMANDS, - getConfiguration + getConfiguration, + CONNECTION_HISTORY_DELETE_THRESHOLD } from '../../utils/index.js' import { expect } from 'chai' import { + DEFAULT_TEST_TIMEOUT, OverrideEnvConfig, + TEST_ENV_CONFIG_FILE, buildEnvOverrideConfig, setupEnvironment, tearDownEnvironment } from '../utils/utils.js' import { OceanNode } from '../../OceanNode.js' import { StatusHandler } from '../../components/core/handler/statusHandler.js' -import { CoreHandlersRegistry } from '../../components/core/handler/coreHandlersRegistry.js' +import { KeyManager } from '../../components/KeyManager/index.js' +import { OceanP2P } from '../../components/P2P/index.js' let envOverrides: OverrideEnvConfig[] @@ -68,7 +73,7 @@ describe('Test available network interfaces', () => { null, buildEnvOverrideConfig( [ENVIRONMENT_VARIABLES.INTERFACES], - [JSON.stringify(['p2p'])] + [JSON.stringify(['P2P'])] ) ) const interfaces = JSON.parse(process.env.INTERFACES) as string[] @@ -84,7 +89,7 @@ describe('Test available network interfaces', () => { null, buildEnvOverrideConfig( [ENVIRONMENT_VARIABLES.INTERFACES], - [JSON.stringify(['http'])] + [JSON.stringify(['HTTP'])] ) ) const interfaces = JSON.parse(process.env.INTERFACES) as string[] @@ -105,7 +110,7 @@ describe('Test rate limitations and deny list defaults', () => { // const node: OceanNode = OceanNode.getInstance() before(async () => { envOverrides = buildEnvOverrideConfig( - [ENVIRONMENT_VARIABLES.RATE_DENY_LIST, ENVIRONMENT_VARIABLES.MAX_REQ_PER_SECOND], + [ENVIRONMENT_VARIABLES.RATE_DENY_LIST, ENVIRONMENT_VARIABLES.MAX_REQ_PER_MINUTE], [undefined, undefined] ) await setupEnvironment(null, envOverrides) @@ -115,7 +120,7 @@ describe('Test rate limitations and deny list defaults', () => { const config = await getConfiguration(true) expect(config.denyList.ips).to.be.length(0) expect(config.denyList.peers).to.be.length(0) - expect(config.rateLimit).to.be.equal(DEFAULT_RATE_LIMIT_PER_SECOND) + expect(config.rateLimit).to.be.equal(DEFAULT_RATE_LIMIT_PER_MINUTE) }) // put it back @@ -125,14 +130,13 @@ describe('Test rate limitations and deny list defaults', () => { }) describe('Test rate limitations and deny list settings', () => { - const node: OceanNode = OceanNode.getInstance() - + let node: OceanNode before(async () => { envOverrides = buildEnvOverrideConfig( [ ENVIRONMENT_VARIABLES.PRIVATE_KEY, ENVIRONMENT_VARIABLES.RATE_DENY_LIST, - ENVIRONMENT_VARIABLES.MAX_REQ_PER_SECOND + ENVIRONMENT_VARIABLES.MAX_REQ_PER_MINUTE ], [ '0xcb345bd2b11264d523ddaf383094e2675c420a17511c3102a53817f13474a7ff', @@ -143,7 +147,12 @@ describe('Test rate limitations and deny list settings', () => { 3 ] ) - await setupEnvironment(null, envOverrides) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) + const config = await getConfiguration(true) + const keyManager = new KeyManager(config) + const p2pNode = new OceanP2P(config, keyManager) + await p2pNode.start() + node = OceanNode.getInstance(config, null, p2pNode, null, null, null, null, true) }) it('should read deny list of other peers and ips', async () => { @@ -160,17 +169,17 @@ describe('Test rate limitations and deny list settings', () => { it('Test rate limit per IP, on handler', async () => { // need to set it here, on a running node is done at request/middleware level - node.setRemoteCaller('127.0.0.1') - const statusHandler: StatusHandler = CoreHandlersRegistry.getInstance( - node - ).getHandler(PROTOCOL_COMMANDS.STATUS) + const statusHandler: StatusHandler = node + .getP2PNode() + .getCoreHandlers() + .getHandler(PROTOCOL_COMMANDS.STATUS) - const rate = await statusHandler.checkRateLimit() + const rate = await statusHandler.checkRateLimit('127.0.0.2') const rateLimitResponses = [] expect(rate).to.be.equal(true) for (let i = 0; i < 4; i++) { // 4 responses, at least one should be blocked - const rateResp = await statusHandler.checkRateLimit() + const rateResp = await statusHandler.checkRateLimit('127.0.0.2') rateLimitResponses.push(rateResp) } const filtered = rateLimitResponses.filter((r) => r === false) @@ -180,23 +189,52 @@ describe('Test rate limitations and deny list settings', () => { it('Test rate limit per IP, on handler, different IPs', async () => { // need to set it here, on a running node is done at request/middleware level // none will be blocked, since its always another caller - const ips = ['127.0.0.2', '127.0.0.3', '127.0.0.4', '127.0.0.5'] - + const ips = ['127.0.0.3', '127.0.0.4', '127.0.0.5', '127.0.0.6'] const rateLimitResponses = [] + const statusHandler: StatusHandler = node + .getP2PNode() + .getCoreHandlers() + .getHandler(PROTOCOL_COMMANDS.STATUS) for (let i = 0; i < ips.length; i++) { - node.setRemoteCaller(ips[i]) - const statusHandler: StatusHandler = CoreHandlersRegistry.getInstance( - node - ).getHandler(PROTOCOL_COMMANDS.STATUS) - - const rateResp = await statusHandler.checkRateLimit() + const rateResp = await statusHandler.checkRateLimit(ips[i]) rateLimitResponses.push(rateResp) } const filtered = rateLimitResponses.filter((r) => r === true) // should have 4 valid responses expect(filtered.length).to.be.equal(ips.length) }) + + it('Test global rate limit, clear map after MAX (handler level) ', async function () { + // after more than CONNECTION_HISTORY_DELETE_THRESHOLD connections the map will be cleared + this.timeout(DEFAULT_TEST_TIMEOUT * 3) + let originalIPPiece = '127.0.' + + const rateLimitResponses = [] + + const statusHandler: StatusHandler = node + .getP2PNode() + .getCoreHandlers() + .getHandler(PROTOCOL_COMMANDS.STATUS) + + const aboveLimit = 20 + for (let i = 0, x = 0; i < CONNECTION_HISTORY_DELETE_THRESHOLD + aboveLimit; i++) { + const ip = originalIPPiece + x // start at 127.0.0.2 + const rateResp = await statusHandler.checkRateLimit(ip) + rateLimitResponses.push(rateResp) + x++ + // start back + if (x > 254) { + x = 0 + originalIPPiece = '127.0.0.' // next piece + } + } + // it should clear the history after CONNECTION_HISTORY_DELETE_THRESHOLD + expect(statusHandler.getOceanNode().getRequestMapSize()).to.be.lessThanOrEqual( + aboveLimit + ) + }) + after(async () => { await tearDownEnvironment(envOverrides) }) diff --git a/src/test/unit/ocean.test.ts b/src/test/unit/ocean.test.ts index 3da38e0be..2de2f9dd8 100644 --- a/src/test/unit/ocean.test.ts +++ b/src/test/unit/ocean.test.ts @@ -1,6 +1,8 @@ import { OceanNode } from '../../OceanNode.js' import { OceanIndexer } from '../../components/Indexer/index.js' import { OceanP2P } from '../../components/P2P/index.js' +import { KeyManager } from '../../components/KeyManager/index.js' +import { BlockchainRegistry } from '../../components/BlockchainRegistry/index.js' import { OceanProvider } from '../../components/Provider/index.js' import { Database } from '../../components/database/index.js' import { ENVIRONMENT_VARIABLES, getConfiguration } from '../../utils/index.js' @@ -8,10 +10,12 @@ import { ENVIRONMENT_VARIABLES, getConfiguration } from '../../utils/index.js' import { expect } from 'chai' import { OverrideEnvConfig, + TEST_ENV_CONFIG_FILE, buildEnvOverrideConfig, setupEnvironment, tearDownEnvironment } from '../utils/utils.js' +import { sleep } from '../../utils/util.js' let envOverrides: OverrideEnvConfig[] @@ -33,22 +37,25 @@ describe('Status command tests', async () => { JSON.stringify([1, 137]) ] ) - envOverrides = await setupEnvironment(null, envOverrides) + envOverrides = await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) // because of this const config = await getConfiguration(true) - const db = await new Database(config.dbConfig) - const oceanP2P = new OceanP2P(config, db) - const oceanIndexer = new OceanIndexer(db, config.indexingNetworks) + const db = await Database.init(config.dbConfig) + const keyManager = new KeyManager(config) + const blockchainRegistry = new BlockchainRegistry(keyManager, config) + const oceanP2P = new OceanP2P(config, keyManager, db) + const oceanIndexer = new OceanIndexer(db, config.indexingNetworks, blockchainRegistry) const oceanProvider = new OceanProvider(db) - const oceanNode = OceanNode.getInstance(db, oceanP2P) + const oceanNode = OceanNode.getInstance(config, db, oceanP2P) after(async () => { // Restore original local setup / env variables after test await tearDownEnvironment(envOverrides) - await oceanIndexer.stopAllThreads() + await oceanIndexer.stopAllChainIndexers() }) - it('Ocean Node instance', () => { + it('Ocean Node instance', async () => { + await sleep(3000) expect(oceanNode).to.be.instanceOf(OceanNode) expect(config.supportedNetworks).to.eql({ '1': 'https://rpc.eth.gateway.fm', @@ -60,7 +67,7 @@ describe('Status command tests', async () => { }) it('Ocean P2P should be initialized correctly', () => { expect(oceanNode.getP2PNode()).to.not.eql(null) - expect(OceanNode.getInstance(db).getP2PNode()).to.not.eql(null) + expect(OceanNode.getInstance(config, db).getP2PNode()).to.not.eql(null) }) it('Ocean Indexer should be initialized correctly', () => { oceanNode.addIndexer(oceanIndexer) diff --git a/src/test/unit/oceanP2P.test.ts b/src/test/unit/oceanP2P.test.ts index 7eff298fa..3c0cf82aa 100644 --- a/src/test/unit/oceanP2P.test.ts +++ b/src/test/unit/oceanP2P.test.ts @@ -1,6 +1,7 @@ import { assert } from 'chai' import { getConfiguration } from '../../utils/config.js' import { OceanP2P } from '../../components/P2P/index.js' +import { KeyManager } from '../../components/KeyManager/index.js' import { delay } from '../integration/testUtils.js' import { ENVIRONMENT_VARIABLES } from '../../utils/constants.js' import { @@ -9,12 +10,15 @@ import { setupEnvironment, tearDownEnvironment } from '../utils/utils.js' +import { OceanNodeConfig } from '../../@types/OceanNode.js' describe('OceanP2P Test', () => { let node1: OceanP2P let node2: OceanP2P - let config1: any - let config2: any + let config1: OceanNodeConfig + let config2: OceanNodeConfig + let peerId1: string + let peerId2: string const mDNSInterval: number = 1 const envOverrides = buildEnvOverrideConfig( @@ -29,21 +33,27 @@ describe('OceanP2P Test', () => { '0x3634cc4a3d2694a1186a7ce545f149e022eea103cc254d18d08675104bb4b5ac' ] ) - before(() => { - setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) + before(async () => { + await setupEnvironment(TEST_ENV_CONFIG_FILE, envOverrides) }) it('Start instance of OceanP2P node1', async () => { process.env.PRIVATE_KEY = process.env.NODE1_PRIVATE_KEY config1 = await getConfiguration(true) config1.p2pConfig.ipV4BindTcpPort = 0 + config1.p2pConfig.ipV6BindTcpPort = 0 + config1.p2pConfig.ipV4BindWsPort = 0 + config1.p2pConfig.ipV4BindWssPort = 0 + config1.p2pConfig.ipV6BindWsPort = 0 // we don't need bootstrap nodes, we rely on Multicast DNS config1.p2pConfig.mDNSInterval = mDNSInterval * 1e3 config1.p2pConfig.bootstrapNodes = [] // enable private IP config1.p2pConfig.announcePrivateIp = true config1.p2pConfig.filterAnnouncedAddresses = ['172.15.0.0/24'] - node1 = new OceanP2P(config1, null) + const keyManager = new KeyManager(config1) + node1 = new OceanP2P(config1, keyManager) + peerId1 = keyManager.getPeerIdString() await node1.start() assert(node1, 'Failed to create P2P Node instance') }) @@ -51,52 +61,40 @@ describe('OceanP2P Test', () => { process.env.PRIVATE_KEY = process.env.NODE2_PRIVATE_KEY config2 = await getConfiguration(true) config2.p2pConfig.ipV4BindTcpPort = 0 + config2.p2pConfig.ipV4BindWsPort = 0 + config2.p2pConfig.ipV4BindWssPort = 0 + config2.p2pConfig.ipV6BindTcpPort = 0 + config2.p2pConfig.ipV6BindWsPort = 0 // we don't need bootstrap nodes, we rely on Multicast DNS config2.p2pConfig.mDNSInterval = mDNSInterval * 1e3 config2.p2pConfig.bootstrapNodes = [] // enable private IP config2.p2pConfig.announcePrivateIp = true config2.p2pConfig.filterAnnouncedAddresses = ['172.15.0.0/24'] // allow nodes to see each other locally for tests - node2 = new OceanP2P(config2, null) + const keyManager2 = new KeyManager(config2) + node2 = new OceanP2P(config2, keyManager2) + peerId2 = keyManager2.getPeerIdString() await node2.start() assert(node2, 'Failed to create P2P Node instance') }) it('Start check peerID of each node', () => { - assert( - config1.keys.peerId.toString() === node1._libp2p.peerId.toString(), - 'Peer missmatch for node1' - ) - assert( - config2.keys.peerId.toString() === node2._libp2p.peerId.toString(), - 'Peer missmatch for node2' - ) + assert(peerId1 === node1._libp2p.peerId.toString(), 'Peer missmatch for node1') + assert(peerId2 === node2._libp2p.peerId.toString(), 'Peer missmatch for node2') }) delay(mDNSInterval * 1e3 * 2) it('Start check if nodes are connected', async () => { const allPeers1 = await node1.getAllPeerStore() const peers1 = allPeers1.map((a: any) => a.id.toString()) - assert( - peers1.includes(config2.keys.peerId.toString()), - 'Node2 not found in node1 peer list' - ) + assert(peers1.includes(peerId2), 'Node2 not found in node1 peer list') const allPeers2 = await node2.getAllPeerStore() const peers2 = allPeers2.map((a: any) => a.id.toString()) - assert( - peers2.includes(config1.keys.peerId.toString()), - 'Node1 not found in node2 peer list' - ) + assert(peers2.includes(peerId1), 'Node1 not found in node2 peer list') }) it('Start check if nodes are connected with pubsub', async () => { let peers = await node1.getOceanPeers() - assert( - peers.includes(config2.keys.peerId.toString()), - 'Node2 not found in node1 peer list' - ) + assert(peers.includes(peerId2), 'Node2 not found in node1 peer list') peers = await node2.getOceanPeers() - assert( - peers.includes(config1.keys.peerId.toString()), - 'Node1 not found in node2 peer list' - ) + assert(peers.includes(peerId1), 'Node1 not found in node2 peer list') }) after(() => { @@ -111,7 +109,8 @@ describe('OceanP2P Test without DB_URL set', () => { config.dbConfig.url = '' config.dbConfig.dbType = null // assert(config.dbConfig.url === '', 'DB URL should not be set') - const p2pNode = new OceanP2P(config) + const keyManager = new KeyManager(config) + const p2pNode = new OceanP2P(config, keyManager) assert(p2pNode, 'Failed to create P2P Node instance') assert(config.p2pConfig, 'Failed to get P2P Node config') // This is not testing P2P Node at all, just checking configuration diff --git a/src/test/unit/storage.test.ts b/src/test/unit/storage.test.ts index 4ef9fa174..43ad6cbab 100644 --- a/src/test/unit/storage.test.ts +++ b/src/test/unit/storage.test.ts @@ -19,24 +19,21 @@ import { } from '../utils/utils.js' import { ENVIRONMENT_VARIABLES } from '../../utils/constants.js' import { getConfiguration } from '../../utils/index.js' -import { Readable } from 'stream' -import fs from 'fs' import { expectedTimeoutFailure } from '../integration/testUtils.js' -let nodeId: string - +// let nodeId: string +const nodeId = '16Uiu2HAmUWwsSj39eAfi3GG9U2niNKi3FVxh3eTwyRxbs8cwCq72' +const nodeId2 = '16Uiu2HAmQWwsSj39eAfi3GG9U2niNKi3FVxh3eTwyRxbs8cwCq73' describe('URL Storage tests', () => { let file: any = { type: 'url', url: 'http://someUrl.com/file.json', method: 'get', - headers: [ - { - 'Content-Type': 'application/json', - Authorization: 'Bearer auth_token_X' - } - ], - encryptedBy: '16Uiu2HAmUWwsSj39eAfi3GG9U2niNKi3FVxh3eTwyRxbs8cwCq72', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer auth_token_X' + }, + encryptedBy: nodeId, encryptMethod: EncryptMethod.AES } let storage: Storage @@ -58,11 +55,7 @@ describe('URL Storage tests', () => { }) it('canDecrypt should return true for the correct nodeId', () => { - assert( - storage.canDecrypt('16Uiu2HAmUWwsSj39eAfi3GG9U2niNKi3FVxh3eTwyRxbs8cwCq72') === - true, - "can't decrypt with the correct nodeId" - ) + assert(storage.canDecrypt(nodeId) === true, "can't decrypt with the correct nodeId") }) it('canDecrypt should return false for an incorrect nodeId', () => { @@ -75,12 +68,10 @@ describe('URL Storage tests', () => { file = { type: 'url', method: 'get', - headers: [ - { - 'Content-Type': 'application/json', - Authorization: 'Bearer auth_token_X' - } - ] + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer auth_token_X' + } } try { Storage.getStorageClass(file, config) @@ -88,17 +79,15 @@ describe('URL Storage tests', () => { error = err } expect(error.message).to.eql( - 'Error validationg the URL file: URL or method are missing' + 'Error validating the URL file: URL or method are missing' ) file = { type: 'url', url: 'http://someUrl.com/file.json', - headers: [ - { - 'Content-Type': 'application/json', - Authorization: 'Bearer auth_token_X' - } - ] + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer auth_token_X' + } } try { Storage.getStorageClass(file, config) @@ -106,7 +95,7 @@ describe('URL Storage tests', () => { error = err } expect(error.message).to.eql( - 'Error validationg the URL file: URL or method are missing' + 'Error validating the URL file: URL or method are missing' ) }) it('URL validation fails on invalid method', () => { @@ -114,19 +103,17 @@ describe('URL Storage tests', () => { type: 'url', url: 'http://someUrl.com/file.json', method: 'put', - headers: [ - { - 'Content-Type': 'application/json', - Authorization: 'Bearer auth_token_X' - } - ] + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer auth_token_X' + } } try { Storage.getStorageClass(file, config) } catch (err) { error = err } - expect(error.message).to.eql('Error validationg the URL file: Invalid method for URL') + expect(error.message).to.eql('Error validating the URL file: Invalid method for URL') }) it('URL validation fails on filename', () => { @@ -134,12 +121,10 @@ describe('URL Storage tests', () => { type: 'url', url: './../dir/file.json', method: 'get', - headers: [ - { - 'Content-Type': 'application/json', - Authorization: 'Bearer auth_token_X' - } - ] + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer auth_token_X' + } } try { Storage.getStorageClass(file, config) @@ -147,7 +132,7 @@ describe('URL Storage tests', () => { error = err } expect(error.message).to.eql( - 'Error validationg the URL file: URL looks like a file path' + 'Error validating the URL file: URL looks like a file path' ) }) it('Gets download URL', () => { @@ -155,12 +140,10 @@ describe('URL Storage tests', () => { type: 'url', url: 'http://someUrl.com/file.json', method: 'get', - headers: [ - { - 'Content-Type': 'application/json', - Authorization: 'Bearer auth_token_X' - } - ] + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer auth_token_X' + } } storage = Storage.getStorageClass(file, config) expect(storage.getDownloadUrl()).to.eql('http://someUrl.com/file.json') @@ -176,6 +159,18 @@ describe('URL Storage tests', () => { const stream = await storage.getReadableStream() expect(stream).not.to.eql(null) }) + + it('Gets readable stream with headers as plain object', async () => { + file = { + type: 'url', + url: 'https://stock-api.oceanprotocol.com/stock/stock.json', + method: 'get', + headers: { 'X-Test-Header': 'test' } + } + const storage = Storage.getStorageClass(file, config) + const stream = await storage.getReadableStream() + expect(stream).not.to.eql(null) + }) }) describe('Unsafe URL tests', () => { @@ -205,9 +200,7 @@ describe('Unsafe URL tests', () => { } catch (err) { error = err } - expect(error.message).to.eql( - 'Error validationg the URL file: URL is marked as unsafe' - ) + expect(error.message).to.eql('Error validating the URL file: URL is marked as unsafe') }) it('Should allow safe URL', () => { file = { @@ -254,7 +247,7 @@ describe('IPFS Storage tests', () => { } catch (err) { error = err } - expect(error.message).to.eql('Error validationg the IPFS file: Missing CID') + expect(error.message).to.eql('Error validating the IPFS file: Missing CID') }) after(() => { @@ -296,7 +289,7 @@ describe('Arweave Storage tests', () => { error = err } expect(error.message).to.eql( - 'Error validationg the Arweave file: Missing transaction ID' + 'Error validating the Arweave file: Missing transaction ID' ) }) @@ -376,7 +369,7 @@ describe('URL Storage with malformed URL', () => { error = err } expect(error.message).to.equal( - 'Error validationg the URL file: URL looks like a file path' + 'Error validating the URL file: URL looks like a file path' ) }) }) @@ -442,7 +435,7 @@ describe('Arweave Storage with malformed transaction ID', () => { error = err } expect(error.message).to.equal( - 'Error validationg the Arweave file: Transaction ID looks like an URL. Please specify URL storage instead.' + 'Error validating the Arweave file: Transaction ID looks like an URL. Please specify URL storage instead.' ) }) @@ -460,7 +453,7 @@ describe('Arweave Storage with malformed transaction ID', () => { error = err } expect(error.message).to.equal( - 'Error validationg the Arweave file: Transaction ID looks like a file path' + 'Error validating the Arweave file: Transaction ID looks like a file path' ) }) }) @@ -485,7 +478,7 @@ describe('Arweave Storage with malformed transaction ID', () => { error = err } expect(error.message).to.equal( - 'Error validationg the IPFS file: CID looks like an URL. Please specify URL storage instead.' + 'Error validating the IPFS file: CID looks like an URL. Please specify URL storage instead.' ) }) @@ -503,7 +496,7 @@ describe('Arweave Storage with malformed transaction ID', () => { error = err } expect(error.message).to.equal( - 'Error validationg the IPFS file: CID looks like a file path' + 'Error validating the IPFS file: CID looks like a file path' ) }) }) @@ -586,37 +579,10 @@ describe('URL Storage encryption tests', () => { it('canDecrypt should return false when the file is not encrypted', () => { assert( - storage.canDecrypt('16Uiu2HAmUWwsSj39eAfi3GG9U2niNKi3FVxh3eTwyRxbs8cwCq72') === - false, + storage.canDecrypt(nodeId) === false, 'Wrong response from canDecrypt() for an unencrypted file' ) }) - - it('encrypt method should correctly encrypt data', async () => { - const { keys } = config - nodeId = keys.peerId.toString() - // Perform encryption - const encryptResponse = await storage.encrypt(EncryptMethod.AES) - assert(encryptResponse.httpStatus === 200, 'Response is not 200') - assert(encryptResponse.stream, 'Stream is not null') - assert(encryptResponse.stream instanceof Readable, 'Stream is not a ReadableStream') - - // Create a writable stream for the output file - const fileStream = fs.createWriteStream('src/test/data/organizations-100.aes') - - // Use the 'finish' event to know when the file has been fully written - fileStream.on('finish', () => { - console.log('Encrypted file has been written successfully') - }) - - // Handle errors in the stream - encryptResponse.stream.on('error', (err) => { - console.error('Stream encountered an error:', err) - }) - - // Pipe the encrypted content stream to the file stream - encryptResponse.stream.pipe(fileStream) - }) }) describe('URL Storage encryption tests', function () { @@ -679,8 +645,11 @@ describe('URL Storage encryption tests', function () { it('canDecrypt should return false when called from an unauthorised node', () => { assert( - storage.canDecrypt('16Uiu2HAmUWwsSj39eAfi3GG9U2niNKi3FVxh3eTwyRxbs8cwCq72') === - false, + storage.canDecrypt(nodeId) === true, + 'Wrong response from canDecrypt() for an unencrypted file' + ) + assert( + storage.canDecrypt(nodeId2) === false, 'Wrong response from canDecrypt() for an unencrypted file' ) }) diff --git a/src/test/utils/assets.ts b/src/test/utils/assets.ts index c58efe5d5..f10490fad 100644 --- a/src/test/utils/assets.ts +++ b/src/test/utils/assets.ts @@ -10,30 +10,26 @@ import { import { Readable } from 'stream' import { createHash } from 'crypto' import { EncryptMethod } from '../../@types/fileObject.js' -import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' assert { type: 'json' } -import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' } +import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' with { type: 'json' } +import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' with { type: 'json' } import { DEVELOPMENT_CHAIN_ID, getOceanArtifactsAdresses, getOceanArtifactsAdressesByChainId } from '../../utils/address.js' -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' assert { type: 'json' } +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } import { getEventFromTx, streamToObject } from '../../utils/util.js' -import { encrypt } from '../../utils/crypt.js' import { AssetUtils } from '../../utils/asset.js' -import { - DDO_IDENTIFIER_PREFIX, - PROTOCOL_COMMANDS, - getConfiguration -} from '../../utils/index.js' +import { DDO_IDENTIFIER_PREFIX, PROTOCOL_COMMANDS } from '../../utils/index.js' import { FeesHandler } from '../../components/core/handler/feesHandler.js' import { OceanNode } from '../../OceanNode.js' import { ProviderFees } from '../../@types/Fees.js' export async function publishAsset(asset: any, publisherAccount: Signer) { const genericAsset = JSON.parse(JSON.stringify(asset)) + const oceanNode = OceanNode.getInstance() try { let network = getOceanArtifactsAdressesByChainId(DEVELOPMENT_CHAIN_ID) if (!network) { @@ -78,12 +74,16 @@ export async function publishAsset(asset: any, publisherAccount: Signer) { genericAsset.services[0].files.datatokenAddress = datatokenAddress genericAsset.services[0].files.nftAddress = nftAddress + genericAsset.services[0].datatokenAddress = datatokenAddress + genericAsset.nftAddress = nftAddress // let's call node to encrypt const data = Uint8Array.from( Buffer.from(JSON.stringify(genericAsset.services[0].files)) ) - const encryptedData = await encrypt(data, EncryptMethod.ECIES) + const encryptedData = await oceanNode + .getKeyManager() + .encrypt(data, EncryptMethod.ECIES) const encryptedDataString = encryptedData.toString('hex') const nftContract = new ethers.Contract( @@ -182,15 +182,14 @@ export async function orderAsset( ) if (!providerFees) { - const oceanNodeConfig = await getConfiguration(true) - const statusCommand = { + const getFeesCommand = { command: PROTOCOL_COMMANDS.GET_FEES, ddoId: genericAsset.id, serviceId: service.id, consumerAddress, - node: oceanNodeConfig.keys.peerId.toString() + node: oceanNode.getKeyManager().getPeerId().toString() } - const response = await new FeesHandler(oceanNode).handle(statusCommand) + const response = await new FeesHandler(oceanNode).handle(getFeesCommand) const fees = await streamToObject(response.stream as Readable) providerFees = fees.providerFee } @@ -268,13 +267,12 @@ export async function reOrderAsset( ) if (!providerFees) { - const oceanNodeConfig = await getConfiguration(true) const statusCommand = { command: PROTOCOL_COMMANDS.GET_FEES, ddoId: genericAsset.id, serviceId: service.id, consumerAddress, - node: oceanNodeConfig.keys.peerId.toString() + node: oceanNode.getKeyManager().getPeerId().toString() } const response = await new FeesHandler(oceanNode).handle(statusCommand) const fees = await streamToObject(response.stream as Readable) diff --git a/src/test/utils/contracts.ts b/src/test/utils/contracts.ts new file mode 100644 index 000000000..ba1c4112b --- /dev/null +++ b/src/test/utils/contracts.ts @@ -0,0 +1,146 @@ +import { Contract, ethers, JsonRpcProvider, Signer } from 'ethers' +import { AccessListContract } from '../../@types' +import { + getOceanArtifactsAdressesByChainId, + DEVELOPMENT_CHAIN_ID, + getOceanArtifactsAdresses +} from '../../utils/address.js' +import AccessListFactory from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessListFactory.sol/AccessListFactory.json' with { type: 'json' } +import AccessList from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessList.sol/AccessList.json' with { type: 'json' } + +export const EXISTING_ACCESSLISTS: Map = new Map< + string, + AccessListContract +>() +/** + * Returns a contract instance for the given address + * @param {string} address - The address of the contract + * @param {AbiItem[]} [abi] - The ABI of the contract + * @returns {Contract} - The contract instance + */ +export function getContract(address: string, abi: any, signer: Signer): Contract { + const contract = new ethers.Contract(address, abi, signer) + return contract +} + +export function getEventFromTx(txReceipt: { logs: any[] }, eventName: string) { + return txReceipt?.logs?.filter((log) => { + return log.fragment?.name === eventName + })[0] +} +/** + * Create new Access List Contract + * @param {Signer} signer The signer of the transaction. + * @param {string} contractFactoryAddress The AccessListFactory address. + * @param {any} contractFactoryAbi The AccessListFactory ABI. + * @param {string} nameAccessList The name for access list. + * @param {string} symbolAccessList The symbol for access list. + * @param {boolean} transferable Default false, to be soulbound. + * @param {string} owner Owner of the access list. + * @param {string[]} user Users of the access lists as addresses. + * @param {string[]} tokenURI Token URIs list. + * @return {Promise} The transaction hash or null if no transaction + */ +export async function deployAccessListContract( + signer: Signer, + contractFactoryAddress: string, + contractFactoryAbi: any, + nameAccessList: string, + symbolAccessList: string, + transferable: boolean = false, + owner: string, + user: string[], + tokenURI: string[] +): Promise { + if (!nameAccessList || !symbolAccessList) { + throw new Error(`Access list symbol and name are required`) + } + + const contract = getContract(contractFactoryAddress, contractFactoryAbi, signer) + + try { + // Get the current nonce to ensure we're using the correct one + const signerAddress = await signer.getAddress() + const currentNonce = await signer.provider.getTransactionCount( + signerAddress, + 'pending' + ) + + const tx = await contract.deployAccessListContract( + nameAccessList, + symbolAccessList, + transferable, + owner, + user, + tokenURI, + { nonce: currentNonce } + ) + + if (!tx) { + const e = 'Tx for deploying new access list was not processed on chain.' + console.error(e) + throw e + } + const trxReceipt = await tx.wait(1) + const events = getEventFromTx(trxReceipt, 'NewAccessList') + return events.args[0] + } catch (e) { + console.error(`Creation of AccessList failed: ${e}`) + return null + } +} + +export async function deployAndGetAccessListConfig( + owner: Signer, + provider?: ethers.JsonRpcProvider, + wallets?: ethers.Signer[] +): Promise { + provider = provider || new JsonRpcProvider('http://127.0.0.1:8545') + let networkArtifacts = getOceanArtifactsAdressesByChainId(DEVELOPMENT_CHAIN_ID) + if (!networkArtifacts) { + networkArtifacts = getOceanArtifactsAdresses().development + } + + wallets = wallets || [ + (await provider.getSigner(0)) as Signer, + (await provider.getSigner(1)) as Signer, + (await provider.getSigner(2)) as Signer, + (await provider.getSigner(3)) as Signer + ] + + // Add small delay to ensure previous transactions are settled + await new Promise((resolve) => setTimeout(resolve, 100)) + + const txAddress = await deployAccessListContract( + owner, // owner is first account + networkArtifacts.AccessListFactory, + AccessListFactory.abi, + 'AllowList', + 'ALLOW', + false, + await owner.getAddress(), + [ + await wallets[0].getAddress(), + await wallets[1].getAddress(), + await wallets[2].getAddress(), + await wallets[3].getAddress() + ], + ['https://oceanprotocol.com/nft/'] + ) + + if (!txAddress) { + console.error('Failed to deploy AccessList - no address returned') + return null + } + + console.log('Successfully deployed AccessList at address: ', txAddress) + + const contractAcessList = getContract(txAddress, AccessList.abi, owner) + if (contractAcessList) { + const result: AccessListContract = { + '8996': [txAddress] + } + return result + } + return null +} diff --git a/src/test/utils/hooks.ts b/src/test/utils/hooks.ts index 7e2d1032d..88acc1a72 100644 --- a/src/test/utils/hooks.ts +++ b/src/test/utils/hooks.ts @@ -39,7 +39,7 @@ function getEnvOverrides(): OverrideEnvConfig[] { [ 'http://localhost:5005/', 'https://arweave.net/', - '{ "1": {"rpc": "https://rpc.eth.gateway.fm", "chainId": 1, "network": "mainet", "chunkSize": 100}, "137": {"rpc": "https://polygon.meowrpc.com", "chainId": 137, "network": "polygon", "chunkSize": 100 }}', + '{ "8996": {"rpc": "http://127.0.0.1:8545", "chainId": 8996, "network": "development", "chunkSize": 100}, "137": {"rpc": "https://polygon.meowrpc.com", "chainId": 137, "network": "polygon", "chunkSize": 100 }}', '0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58', SELECTED_RUN_DATABASE, SELECTED_RUN_DATABASE === DB_TYPES.ELASTIC_SEARCH @@ -53,6 +53,7 @@ export const mochaHooks = { beforeAll() { // get stuff we want to override envOverrides = getEnvOverrides() + // if it exists will use it, otherwise nothing happens // in any case it WILL NOT override the existing configuration // it returns the original object with the original value preserved to be restored later @@ -60,7 +61,9 @@ export const mochaHooks = { envOverrides = overrides }) initialSetupDone = true - CONFIG_LOGGER.debug(`(Hook) Initial test setup: ${JSON.stringify(envOverrides)} `) + CONFIG_LOGGER.debug( + `(Hook) Initial test setup: ${JSON.stringify(envOverrides, null, 4)} ` + ) // just in case the configuration value fails this.timeout(DEFAULT_TEST_TIMEOUT) diff --git a/src/test/utils/utils.ts b/src/test/utils/utils.ts index dfcacfee3..8376d6ae1 100644 --- a/src/test/utils/utils.ts +++ b/src/test/utils/utils.ts @@ -13,6 +13,7 @@ const __dirname = path.dirname(__filename) // relative to test/utils (default value, but can use other paths) export const TEST_ENV_CONFIG_FILE = '../.env.test' +export const TEST_ENV_CONFIG_PATH = '../.env.test2' // use this if we need to override the default configuration while testing export interface OverrideEnvConfig { name: string // name of the var diff --git a/src/utils/accessList.ts b/src/utils/accessList.ts new file mode 100644 index 000000000..fbecbe462 --- /dev/null +++ b/src/utils/accessList.ts @@ -0,0 +1,42 @@ +import AccessListJson from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessList.sol/AccessList.json' with { type: 'json' } +import { ethers, Signer } from 'ethers' +import { CORE_LOGGER } from './logging/common.js' + +/** + * @param accessList the access list contract address + * @param chainId the chain id to check + * @param addressToCheck the account address to check on the access list + * @param signer signer for the contract part + * @returns true if the account has balanceOf > 0 OR if the accessList is empty OR does not contain info for this chain, false otherwise + */ +export async function checkAddressOnAccessList( + accessListContractAddress: string, + addressToCheck: string, + signer: Signer +): Promise { + if (!accessListContractAddress) { + return true + } + const accessListContract = new ethers.Contract( + accessListContractAddress, + AccessListJson.abi, + signer + ) + try { + // if has at least 1 token than is is authorized + const balance = await accessListContract.balanceOf(addressToCheck) + if (Number(balance) > 0) { + return true + } else { + CORE_LOGGER.error( + `Account ${addressToCheck} is NOT part of the given access list group.` + ) + return false + } + } catch (error) { + CORE_LOGGER.error( + `Failed to check access list ${accessListContractAddress}: ${error.message}` + ) + return false + } +} diff --git a/src/utils/address.ts b/src/utils/address.ts index 66d6adbba..9760ed3b5 100644 --- a/src/utils/address.ts +++ b/src/utils/address.ts @@ -1,7 +1,7 @@ import fs from 'fs' -import addresses from '@oceanprotocol/contracts/addresses/address.json' assert { type: 'json' } +import addresses from '@oceanprotocol/contracts/addresses/address.json' with { type: 'json' } import { CORE_LOGGER } from './logging/common.js' -import { ENVIRONMENT_VARIABLES, existsEnvironmentVariable } from './index.js' +import { isDefined } from './index.js' /** * Get the artifacts address from the address.json file @@ -10,9 +10,9 @@ import { ENVIRONMENT_VARIABLES, existsEnvironmentVariable } from './index.js' */ export function getOceanArtifactsAdresses(): any { try { - if (existsEnvironmentVariable(ENVIRONMENT_VARIABLES.ADDRESS_FILE)) { + if (isDefined(process.env.ADDRESS_FILE)) { // eslint-disable-next-line security/detect-non-literal-fs-filename - const data = fs.readFileSync(ENVIRONMENT_VARIABLES.ADDRESS_FILE.value, 'utf8') + const data = fs.readFileSync(process.env.ADDRESS_FILE, 'utf8') return JSON.parse(data) } return addresses @@ -30,7 +30,6 @@ export function getOceanArtifactsAdresses(): any { */ export function getOceanArtifactsAdressesByChainId(chain: number): any { try { - // eslint-disable-next-line security/detect-non-literal-fs-filename const data = getOceanArtifactsAdresses() if (data) { const networks = Object.keys(data) @@ -41,10 +40,7 @@ export function getOceanArtifactsAdressesByChainId(chain: number): any { } } // just warn about this missing configuration if running locally - if ( - chain === DEVELOPMENT_CHAIN_ID && - !existsEnvironmentVariable(ENVIRONMENT_VARIABLES.ADDRESS_FILE, true) - ) { + if (chain === DEVELOPMENT_CHAIN_ID && !isDefined(process.env.ADDRESS_FILE)) { CORE_LOGGER.warn( 'Cannot find contract artifacts addresses for "development" chain. Please set the "ADDRESS_FILE" environmental variable!' ) @@ -55,11 +51,18 @@ export function getOceanArtifactsAdressesByChainId(chain: number): any { return null } +// eslint-disable-next-line require-await +export function getOceanTokenAddressForChain(chainId: number): string | null { + const addresses = getOceanArtifactsAdressesByChainId(chainId) + if (addresses && addresses.Ocean) return addresses.Ocean + return null +} + // default token addresses per chain export const OCEAN_ARTIFACTS_ADDRESSES_PER_CHAIN = addresses export const DEVELOPMENT_CHAIN_ID = 8996 export const KNOWN_CONFIDENTIAL_EVMS = [ - 23294, // mainnet oasis_sapphire, - 23295 // oasis_sapphire_testnet + BigInt(23294), // mainnet oasis_sapphire, + BigInt(23295) // oasis_sapphire_testnet ] diff --git a/src/utils/asset.ts b/src/utils/asset.ts index 44eeddb51..7407e1594 100644 --- a/src/utils/asset.ts +++ b/src/utils/asset.ts @@ -1,41 +1,48 @@ import axios from 'axios' -import { DDO } from '../@types/DDO/DDO' -import { Service } from '../@types/DDO/Service' +import { Service, DDOManager, DDO } from '@oceanprotocol/ddo-js' import { DDO_IDENTIFIER_PREFIX } from './constants.js' import { CORE_LOGGER } from './logging/common.js' +import { GENERIC_EMOJIS, LOG_LEVELS_STR } from './logging/Logger.js' import { createHash } from 'crypto' import { ethers, getAddress, Signer } from 'ethers' import { KNOWN_CONFIDENTIAL_EVMS } from './address.js' -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/interfaces/IERC20Template.sol/IERC20Template.json' assert { type: 'json' } -import ERC20Template4 from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template4.sol/ERC20Template4.json' assert { type: 'json' } +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/interfaces/IERC20Template.sol/IERC20Template.json' with { type: 'json' } +import ERC20Template4 from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template4.sol/ERC20Template4.json' with { type: 'json' } import { getContractAddress, getNFTFactory } from '../components/Indexer/utils.js' +import { HeadersObject } from '../@types/fileObject.js' // Notes: // Asset as per asset.py on provider, is a class there, while on ocean.Js we only have a type // this is an utility to extract information from the Asset services export const AssetUtils = { - getServiceIndexById(asset: DDO, id: string): number | null { - for (let c = 0; c < asset.services.length; c++) - if (asset.services[c].id === id) return c + getServiceIndexById(asset: DDO | Record, id: string): number | null { + const ddoInstance = DDOManager.getDDOClass(asset) + const { services } = ddoInstance.getDDOFields() + for (let c = 0; c < services.length; c++) if (services[c].id === id) return c return null }, - getServiceByIndex(asset: DDO, index: number): Service | null { - if (index >= 0 && index < asset.services.length) { - return asset.services[index] + getServiceByIndex(asset: DDO | Record, index: number): any | null { + const ddoInstance = DDOManager.getDDOClass(asset) + const { services } = ddoInstance.getDDOFields() + if (index >= 0 && index < services.length) { + return services[index] } return null }, - getServiceById(asset: DDO, id: string): Service | null { - const services = asset.services.filter((service: Service) => service.id === id) - return services.length ? services[0] : null + getServiceById(asset: DDO | Record, id: string): any | null { + const ddoInstance = DDOManager.getDDOClass(asset) + const { services } = ddoInstance.getDDOFields() as any + const filteredServices = services.filter((service: any) => service.id === id) + return filteredServices.length ? filteredServices[0] : null } } export async function fetchFileMetadata( url: string, method: string, - forceChecksum: boolean + forceChecksum: boolean, + headers?: HeadersObject ): Promise<{ contentLength: string; contentType: string; contentChecksum: string }> { let contentType: string = '' let contentLength: number = 0 @@ -47,7 +54,9 @@ export async function fetchFileMetadata( const response = await axios({ url, method: method || 'get', - responseType: 'stream' + headers, + responseType: 'stream', + timeout: 30000 }) contentType = response.headers['content-type'] let totalSize = 0 @@ -91,6 +100,15 @@ export function validateDDOHash( return ddoID === hashAddressAndChain } +export function deleteIndexedMetadataIfExists(ddo: DDO): DDO { + const ddoCopy: DDO = structuredClone(ddo) + if ('indexedMetadata' in ddoCopy) { + delete ddoCopy.indexedMetadata + return ddoCopy + } + return ddo +} + /** * Generates DDO Id given the chain and nft address provided * @param nftAddress the nft address @@ -114,7 +132,7 @@ export function generateDDOHash(nftAddress: string, chainId: number): string | n * @param network name or chain id * @returns true if confidential evm */ -export function isConfidentialEVM(network: number): boolean { +export function isConfidentialEVM(network: bigint): boolean { return KNOWN_CONFIDENTIAL_EVMS.includes(network) } @@ -124,7 +142,7 @@ export async function isERC20Template4Active( ): Promise { try { const nftFactoryAddress = getContractAddress(network, 'ERC721Factory') - const factoryERC721 = await getNFTFactory(owner, nftFactoryAddress) + const factoryERC721 = getNFTFactory(owner, nftFactoryAddress) const currentTokenCount = await factoryERC721.getCurrentTemplateCount() for (let i = 1; i <= currentTokenCount; i++) { @@ -171,7 +189,7 @@ export async function isDataTokenTemplate4( } } -export function isConfidentialChainDDO(ddoChain: number, ddoService: Service): boolean { +export function isConfidentialChainDDO(ddoChain: bigint, ddoService: Service): boolean { const isConfidential = isConfidentialEVM(ddoChain) return isConfidential && (!ddoService.files || ddoService.files.length === 0) } @@ -192,7 +210,10 @@ export async function getFilesObjectFromConfidentialEVM( signer: Signer, consumerAddress: string, consumerSignature: string, - consumerData: string // ddo id + nonce + consumerData: string + // NOTE about signatures consume data: + // ddo id + nonce (for downloading) + // consumerAddress + datasets[0].documentId + nonce (for start/init compute) ): Promise { try { const currentProviderAddress = await signer.getAddress() @@ -228,3 +249,34 @@ export async function getFilesObjectFromConfidentialEVM( return null } } + +export async function validateDDO(ddo: Record): Promise { + const ddoInstance = DDOManager.getDDOClass(ddo) + const ddoData = ddoInstance.getDDOData() + if ('indexedMetadata' in ddoData && ddoData.indexedMetadata?.nft?.state !== 0) { + // Skipping validation for short DDOs as it currently doesn't work + // TODO: DDO validation needs to be updated to consider the fields required by the schema + // See github issue: https://github.com/oceanprotocol/ocean-node/issues/256 + return true + } + + const validation = await ddoInstance.validate() + if (validation[0] === true) { + CORE_LOGGER.logMessageWithEmoji( + `Validation of DDO with did: ${ddo.id} has passed`, + true, + GENERIC_EMOJIS.EMOJI_OCEAN_WAVE, + LOG_LEVELS_STR.LEVEL_DEBUG + ) + return true + } else { + CORE_LOGGER.logMessageWithEmoji( + `Validation of DDO with schema version ${ddo.version} failed with errors: ` + + JSON.stringify(validation[1]), + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_WARN + ) + return false + } +} diff --git a/src/utils/auth.ts b/src/utils/auth.ts index b3790456b..e3ccc3b4b 100644 --- a/src/utils/auth.ts +++ b/src/utils/auth.ts @@ -1,36 +1,75 @@ -import { ethers } from 'ethers' +import { ethers, isAddress } from 'ethers' import { CORE_LOGGER } from './logging/common.js' -import { getAllowedAdmins } from './index.js' -import { CommonValidation } from '../components/httpRoutes/requestValidator.js' - -export function validateAdminSignature( +import { getConfiguration } from './index.js' +import { AccessListContract, OceanNodeConfig } from '../@types/OceanNode.js' +import { CommonValidation } from './validators.js' +import { isERC1271Valid } from '../components/core/utils/nonceHandler.js' +import { checkSingleCredential } from './credentials.js' +import { CREDENTIALS_TYPES } from '../@types/DDO/Credentials.js' +export async function validateAdminSignature( expiryTimestamp: number, - signature: string -): CommonValidation { + signature: string, + address?: string +): Promise { + const message = expiryTimestamp.toString() + let signerAddress + try { - const message = expiryTimestamp.toString() - const signerAddress = ethers.verifyMessage(message, signature)?.toLowerCase() - CORE_LOGGER.logMessage(`Resolved signer address: ${signerAddress}`) - const allowedAdmins = getAllowedAdmins() - if (allowedAdmins.length === 0) { - const errorMsg = "Allowed admins list is empty. Please add admins' addresses." - CORE_LOGGER.logMessage(errorMsg) - return { valid: false, error: errorMsg } + const config = await getConfiguration() + if (address) { + const hexMessage = ethers.hashMessage(message) + const firstChainId = Object.keys(config?.supportedNetworks || {})[0] + if (firstChainId) { + const provider = new ethers.JsonRpcProvider( + config.supportedNetworks[firstChainId].rpc + ) + + if (!(await isERC1271Valid(address, hexMessage, signature, provider))) { + return { valid: false, error: 'Invalid ERC1271 signature' } + } + signerAddress = address + } else { + return { valid: false, error: 'No network configured in node config' } + } + } else { + signerAddress = ethers.verifyMessage(message, signature)?.toLowerCase() + CORE_LOGGER.logMessage(`Resolved signer address: ${signerAddress}`) } + const currentTimestamp = new Date().getTime() if (currentTimestamp > expiryTimestamp) { const errorMsg = `The expiryTimestamp ${expiryTimestamp} sent for validation is in the past. Therefore signature ${signature} is rejected` CORE_LOGGER.logMessage(errorMsg) return { valid: false, error: errorMsg } } - for (const address of allowedAdmins) { - if ( - ethers.getAddress(address)?.toLowerCase() === - ethers.getAddress(signerAddress)?.toLowerCase() - ) { - return { valid: true, error: '' } + const allowedAdmins = await getAdminAddresses(config) + + const { addresses, accessLists } = allowedAdmins + let allowed = await checkSingleCredential( + { type: CREDENTIALS_TYPES.ADDRESS, values: addresses }, + signerAddress, + null + ) + if (allowed) { + return { valid: true, error: '' } + } + if (accessLists) { + for (const chainId of Object.keys(accessLists)) { + allowed = await checkSingleCredential( + { + type: CREDENTIALS_TYPES.ACCESS_LIST, + chainId: parseInt(chainId), + accessList: accessLists[chainId] + }, + signerAddress, + null + ) + if (allowed) { + return { valid: true, error: '' } + } } } + const errorMsg = `The address which signed the message is not on the allowed admins list. Therefore signature ${signature} is rejected` CORE_LOGGER.logMessage(errorMsg) return { valid: false, error: errorMsg } @@ -40,3 +79,28 @@ export function validateAdminSignature( return { valid: false, error: errorMsg } } } + +export async function getAdminAddresses( + existingConfig?: OceanNodeConfig +): Promise<{ addresses: string[]; accessLists: any }> { + let config: OceanNodeConfig + const ret = { + addresses: [] as string[], + accessLists: undefined as AccessListContract | undefined + } + if (!existingConfig) { + config = await getConfiguration() + } else { + config = existingConfig + } + + if (config.allowedAdmins && config.allowedAdmins.length > 0) { + for (const admin of config.allowedAdmins) { + if (isAddress(admin) === true) { + ret.addresses.push(admin) + } + } + } + ret.accessLists = config.allowedAdminsList + return ret +} diff --git a/src/utils/blockchain.ts b/src/utils/blockchain.ts index bfafb5665..11edf4473 100644 --- a/src/utils/blockchain.ts +++ b/src/utils/blockchain.ts @@ -1,67 +1,110 @@ -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' assert { type: 'json' } +import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' with { type: 'json' } import { ethers, Signer, Contract, JsonRpcApiProvider, JsonRpcProvider, + FallbackProvider, isAddress, - Network, parseUnits, Wallet, TransactionReceipt } from 'ethers' import { getConfiguration } from './config.js' import { CORE_LOGGER } from './logging/common.js' -import { sleep } from './util.js' import { ConnectionStatus } from '../@types/blockchain.js' import { ValidateChainId } from '../@types/commands.js' +import { KNOWN_CONFIDENTIAL_EVMS } from '../utils/address.js' +import { OceanNodeConfig } from '../@types/OceanNode.js' +import { KeyManager } from '../components/KeyManager/index.js' + +const MIN_GAS_FEE_POLYGON = 30000000000 // minimum recommended 30 gwei polygon main and mumbai fees +const MIN_GAS_FEE_SEPOLIA = 4000000000 // minimum 4 gwei for eth sepolia testnet +const MIN_GAS_FEE_SAPPHIRE = 10000000000 // recommended for mainnet and testnet 10 gwei +const POLYGON_NETWORK_ID = 137 +const MUMBAI_NETWORK_ID = 80001 +const SEPOLIA_NETWORK_ID = 11155111 export class Blockchain { + private config?: OceanNodeConfig // Optional for new constructor + private static signers: Map = new Map() + private static providers: Map = new Map() + private keyManager: KeyManager private signer: Signer - private provider: JsonRpcApiProvider + private provider: FallbackProvider + private providers: JsonRpcProvider[] = [] private chainId: number private knownRPCs: string[] = [] - private network: Network - private networkAvailable: boolean = false + /** + * Constructor overloads: + * 1. New pattern: (rpc, chainId, signer, fallbackRPCs?) - signer provided by KeyManager + * 2. Old pattern: (rpc, chainId, config, fallbackRPCs?) - for backward compatibility + */ public constructor( + keyManager: KeyManager, rpc: string, - chainName: string, chainId: number, fallbackRPCs?: string[] ) { this.chainId = chainId + this.keyManager = keyManager this.knownRPCs.push(rpc) if (fallbackRPCs && fallbackRPCs.length > 0) { this.knownRPCs.push(...fallbackRPCs) } - this.network = new ethers.Network(chainName, chainId) - // this.provider = new ethers.JsonRpcProvider(rpc, this.network) - this.provider = new ethers.JsonRpcProvider(rpc, null, { - staticNetwork: ethers.Network.from(chainId) - }) - this.registerForNetworkEvents() - // always use this signer, not simply provider.getSigner(0) for instance (as we do on many tests) - this.signer = new ethers.Wallet(process.env.PRIVATE_KEY, this.provider) + this.provider = undefined as undefined as FallbackProvider + this.signer = undefined as unknown as Signer } - public getSigner(): Signer { - return this.signer + public getSupportedChain(): number { + return this.chainId + } + + public getWallet(): Wallet { + return this.keyManager.getEthWallet() + } + + public async getWalletAddress(): Promise { + return await this.signer.getAddress() } - public getProvider(): JsonRpcApiProvider { + public async getProvider(force: boolean = false): Promise { + if (!this.provider) { + for (const rpc of this.knownRPCs) { + const rpcProvider = new JsonRpcProvider(rpc) + // filter wrong chains or broken RPCs + if (!force) { + try { + const { chainId } = await rpcProvider.getNetwork() + if (chainId.toString() === this.chainId.toString()) { + this.providers.push(rpcProvider) + break + } + } catch (error) { + CORE_LOGGER.error(`Error getting network for RPC ${rpc}: ${error}`) + } + } else { + this.providers.push(new JsonRpcProvider(rpc)) + } + } + this.provider = new FallbackProvider(this.providers) + } return this.provider } - public getSupportedChain(): number { - return this.chainId + public async getSigner(): Promise { + if (!this.signer) { + if (!this.provider) { + await this.getProvider() + } + this.signer = await this.keyManager.getEvmSigner(this.provider, this.chainId) + } + return this.signer } public async isNetworkReady(): Promise { - if (this.networkAvailable && this.provider.ready) { - return { ready: true } - } return await this.detectNetwork() } @@ -70,7 +113,7 @@ export class Blockchain { } public async calculateGasCost(to: string, amount: bigint): Promise { - const provider = this.getProvider() + const provider = await this.getProvider() const estimatedGas = await provider.estimateGas({ to, value: amount @@ -86,11 +129,11 @@ export class Blockchain { } public async sendTransaction( - wallet: Wallet, + signer: Signer, to: string, amount: bigint ): Promise { - const tx = await wallet.sendTransaction({ + const tx = await signer.sendTransaction({ to, value: amount }) @@ -99,15 +142,15 @@ export class Blockchain { return receipt } - private detectNetwork(): Promise { + private async detectNetwork(): Promise { + const provider = await this.getProvider() return new Promise((resolve) => { const timeout = setTimeout(() => { // timeout, hanging or invalid connection CORE_LOGGER.error(`Unable to detect provider network: (TIMEOUT)`) resolve({ ready: false, error: 'TIMEOUT' }) }, 3000) - - this.provider + provider .getBlock('latest') .then((block) => { clearTimeout(timeout) @@ -121,28 +164,7 @@ export class Blockchain { }) } - // try other rpc options, if available - public async tryFallbackRPCs(): Promise { - let response: ConnectionStatus = { ready: false, error: '' } - // we also retry the original one again after all the fallbacks - for (let i = this.knownRPCs.length - 1; i >= 0; i--) { - this.provider.off('network') - CORE_LOGGER.warn(`Retrying new provider connection with RPC: ${this.knownRPCs[i]}`) - this.provider = new JsonRpcProvider(this.knownRPCs[i]) - this.signer = new ethers.Wallet(process.env.PRIVATE_KEY, this.provider) - // try them 1 by 1 and wait a couple of secs for network detection - this.registerForNetworkEvents() - await sleep(2000) - response = await this.isNetworkReady() - // return as soon as we have a valid one - if (response.ready) { - return response - } - } - return response - } - - private registerForNetworkEvents() { + /* private registerForNetworkEvents() { this.provider.on('network', this.networkChanged) } @@ -151,12 +173,77 @@ export class Blockchain { // event with a null oldNetwork along with the newNetwork. So, if the // oldNetwork exists, it represents a changing network this.networkAvailable = newNetwork instanceof Network + } */ + + public async getFairGasPrice(gasFeeMultiplier: number): Promise { + const signer = await this.getSigner() + const price = (await signer.provider.getFeeData()).gasPrice + const x = BigInt(price.toString()) + if (gasFeeMultiplier) { + const res = BigInt(price.toString()) * BigInt(gasFeeMultiplier) + return res.toString(10) + } else return x.toString() + } + + public async getGasOptions(estGas: bigint, gasFeeMultiplier: number): Promise<{}> { + const { chainId } = await this.signer.provider.getNetwork() + const feeHistory = await this.signer.provider.getFeeData() + const gasLimit = estGas + BigInt(20000) + + if (feeHistory.maxPriorityFeePerGas) { + let aggressiveFeePriorityFeePerGas = feeHistory.maxPriorityFeePerGas.toString() + let aggressiveFeePerGas = feeHistory.maxFeePerGas.toString() + if (gasFeeMultiplier > 1) { + aggressiveFeePriorityFeePerGas = ( + (feeHistory.maxPriorityFeePerGas * BigInt(gasFeeMultiplier * 100)) / + BigInt(100) + ).toString() + aggressiveFeePerGas = ( + (feeHistory.maxFeePerGas * BigInt(gasFeeMultiplier * 100)) / + BigInt(100) + ).toString() + } + const overrides = { + gasLimit, + maxPriorityFeePerGas: + (chainId === BigInt(MUMBAI_NETWORK_ID) || + chainId === BigInt(POLYGON_NETWORK_ID)) && + Number(aggressiveFeePriorityFeePerGas) < MIN_GAS_FEE_POLYGON + ? MIN_GAS_FEE_POLYGON + : chainId === BigInt(SEPOLIA_NETWORK_ID) && + Number(aggressiveFeePriorityFeePerGas) < MIN_GAS_FEE_SEPOLIA + ? MIN_GAS_FEE_SEPOLIA + : KNOWN_CONFIDENTIAL_EVMS.includes(chainId) && + Number(aggressiveFeePriorityFeePerGas) < MIN_GAS_FEE_SAPPHIRE + ? MIN_GAS_FEE_SAPPHIRE + : Number(aggressiveFeePriorityFeePerGas), + maxFeePerGas: + (chainId === BigInt(MUMBAI_NETWORK_ID) || + chainId === BigInt(POLYGON_NETWORK_ID)) && + Number(aggressiveFeePerGas) < MIN_GAS_FEE_POLYGON + ? MIN_GAS_FEE_POLYGON + : chainId === BigInt(SEPOLIA_NETWORK_ID) && + Number(aggressiveFeePerGas) < MIN_GAS_FEE_SEPOLIA + ? MIN_GAS_FEE_SEPOLIA + : KNOWN_CONFIDENTIAL_EVMS.includes(chainId) && + Number(aggressiveFeePerGas) < MIN_GAS_FEE_SAPPHIRE + ? MIN_GAS_FEE_SAPPHIRE + : Number(aggressiveFeePerGas) + } + return overrides + } else { + const overrides = { + gasLimit, + gasPrice: feeHistory.gasPrice + } + return overrides + } } } export async function getDatatokenDecimals( datatokenAddress: string, - provider: JsonRpcProvider + provider: ethers.Provider ): Promise { const datatokenContract = new Contract(datatokenAddress, ERC20Template.abi, provider) try { @@ -174,7 +261,7 @@ export async function getDatatokenDecimals( * @param signature to validate * @returns boolean */ -export async function verifyMessage( +export function verifyMessage( message: string | Uint8Array, address: string, signature: string @@ -184,7 +271,7 @@ export async function verifyMessage( CORE_LOGGER.error(`${address} is not a valid web3 address`) return false } - const signerAddr = await ethers.verifyMessage(message, signature) + const signerAddr = ethers.verifyMessage(message, signature) if (signerAddr?.toLowerCase() !== address?.toLowerCase()) { return false } @@ -194,6 +281,15 @@ export async function verifyMessage( } } +export function getMessageHash(message: string): Uint8Array { + const messageHash = ethers.solidityPackedKeccak256( + ['bytes'], + [ethers.hexlify(ethers.toUtf8Bytes(message))] + ) + const messageHashBytes = ethers.toBeArray(messageHash) + return messageHashBytes +} + export async function checkSupportedChainId(chainId: number): Promise { const config = await getConfiguration() if (!chainId || !(`${chainId.toString()}` in config.supportedNetworks)) { diff --git a/src/utils/config.ts b/src/utils/config.ts index 9e85d0f48..f8a538302 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -1,628 +1,10 @@ -import type { - DenyList, - OceanNodeConfig, - OceanNodeKeys, - OceanNodeDockerConfig -} from '../@types/OceanNode' -import type { C2DClusterInfo } from '../@types/C2D.js' -import { C2DClusterType } from '../@types/C2D.js' -import { createFromPrivKey } from '@libp2p/peer-id-factory' -import { keys } from '@libp2p/crypto' -import { - DEFAULT_RATE_LIMIT_PER_SECOND, - ENVIRONMENT_VARIABLES, - EnvVariable, - hexStringToByteArray -} from '../utils/index.js' -import { defaultBootstrapAddresses, knownUnsafeURLs } from '../utils/constants.js' +import { isDefined } from './util.js' +import { getConfiguration } from './config/builder.js' -import { LOG_LEVELS_STR, GENERIC_EMOJIS, getLoggerLevelEmoji } from './logging/Logger.js' -import { RPCS } from '../@types/blockchain' -import { getAddress, Wallet } from 'ethers' -import { FeeAmount, FeeStrategy, FeeTokens } from '../@types/Fees' -import { - getOceanArtifactsAdresses, - OCEAN_ARTIFACTS_ADDRESSES_PER_CHAIN -} from '../utils/address.js' -import { CONFIG_LOGGER } from './logging/common.js' -import { create256Hash } from './crypt.js' +export * from './config/index.js' -// usefull for lazy loading and avoid boilerplate on other places -let previousConfiguration: OceanNodeConfig = null - -export async function getPeerIdFromPrivateKey( - privateKey: string -): Promise { - const key = new keys.supportedKeys.secp256k1.Secp256k1PrivateKey( - hexStringToByteArray(privateKey.slice(2)) - ) - - return { - peerId: await createFromPrivKey(key), - publicKey: key.public.bytes, - // Notes: - // using 'key.public.bytes' gives extra 4 bytes: 08021221 - // using (key as any)._publicKey is stripping this same 4 bytes at the beginning: 08021221 - // when getting the peer details with 'peerIdFromString(peerName)' it returns the version with the 4 extra bytes - // and we also need to send that to the client, so he can uncompress the public key correctly and perform the check and the encryption - // so it would make more sense to use this value on the configuration - privateKey: (key as any)._key, - ethAddress: new Wallet(privateKey.substring(2)).address - } -} - -function getEnvValue(env: any, defaultValue: any) { - /* Gets value for an ENV var, returning defaultValue if not defined */ - return env != null ? (env as string) : defaultValue -} - -function getIntEnvValue(env: any, defaultValue: number) { - /* Gets int value for an ENV var, returning defaultValue if not defined */ - const num = parseInt(env, 10) - return isNaN(num) ? defaultValue : num -} - -export function getBoolEnvValue(envName: string, defaultValue: boolean): boolean { - if (!(envName in process.env)) { - return defaultValue - } - if ( - process.env[envName] === 'true' || - process.env[envName] === '1' || - process.env[envName]?.toLowerCase() === 'yes' - ) { - return true - } - return false -} - -function getSupportedChains(): RPCS | null { - const logError = function (): null { - // missing or invalid RPC list - CONFIG_LOGGER.logMessageWithEmoji( - 'Missing or Invalid RPCS env variable format, Running node without the Indexer component...', - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - return null - } - if (!process.env.RPCS) { - return logError() - } - let supportedNetworks: RPCS = null - try { - supportedNetworks = JSON.parse(process.env.RPCS) - } catch (e) { - return logError() - } - - return supportedNetworks -} - -function getIndexingNetworks(supportedNetworks: RPCS): RPCS | null { - const indexerNetworksEnv = process.env.INDEXER_NETWORKS - if (!indexerNetworksEnv) { - CONFIG_LOGGER.logMessageWithEmoji( - 'INDEXER_NETWORKS is not defined, running Indexer with all supported networks defined in RPCS env variable ...', - true, - GENERIC_EMOJIS.EMOJI_CHECK_MARK, - LOG_LEVELS_STR.LEVEL_INFO - ) - return supportedNetworks - } - try { - const indexerNetworks: number[] = JSON.parse(indexerNetworksEnv) - - if (indexerNetworks.length === 0) { - CONFIG_LOGGER.logMessageWithEmoji( - 'INDEXER_NETWORKS is an empty array, Running node without the Indexer component...', - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - return null - } - - // Use reduce to filter supportedNetworks - const filteredNetworks = indexerNetworks.reduce((acc: RPCS, chainId) => { - if (supportedNetworks[chainId]) { - acc[chainId] = supportedNetworks[chainId] - } - return acc - }, {}) - - return filteredNetworks - } catch (e) { - CONFIG_LOGGER.logMessageWithEmoji( - 'Missing or Invalid INDEXER_NETWORKS env variable format,running Indexer with all supported networks defined in RPCS env variable ...', - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - return supportedNetworks - } -} -// valid decrypthers -function getAuthorizedDecrypters(isStartup?: boolean): string[] { - return readAddressListFromEnvVariable( - ENVIRONMENT_VARIABLES.AUTHORIZED_DECRYPTERS, - isStartup - ) -} -// allowed validators -export function getAllowedValidators(isStartup?: boolean): string[] { - return readAddressListFromEnvVariable( - ENVIRONMENT_VARIABLES.ALLOWED_VALIDATORS, - isStartup - ) -} -// valid node admins -export function getAllowedAdmins(isStartup?: boolean): string[] { - return readAddressListFromEnvVariable(ENVIRONMENT_VARIABLES.ALLOWED_ADMINS, isStartup) -} - -// whenever we want to read an array of strings from an env variable, use this common function -function readListFromEnvVariable( - envVariable: any, - isStartup?: boolean, - defaultValue: string[] = [] -): string[] { - const { name } = envVariable - try { - if (!existsEnvironmentVariable(envVariable, isStartup)) { - return defaultValue - } - const addressesRaw: string[] = JSON.parse(process.env[name]) - if (!Array.isArray(addressesRaw)) { - CONFIG_LOGGER.logMessageWithEmoji( - `Invalid ${name} env variable format`, - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - return defaultValue - } - return addressesRaw - } catch (error) { - CONFIG_LOGGER.logMessageWithEmoji( - `Missing or Invalid address(es) in ${name} env variable`, - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - return defaultValue - } -} - -// whenever we want to read an array of addresses from an env variable, use this common function -function readAddressListFromEnvVariable(envVariable: any, isStartup?: boolean): string[] { - const addressesRaw: string[] = readListFromEnvVariable(envVariable, isStartup) - return addressesRaw.map((address) => getAddress(address)) -} -/** - * get default values for provider fee tokens - * @param supportedNetworks chains that we support - * @returns ocean fees token - */ -function getDefaultFeeTokens(supportedNetworks: RPCS): FeeTokens[] { - const nodeFeesTokens: FeeTokens[] = [] - let addressesData: any = getOceanArtifactsAdresses() - if (!addressesData) { - addressesData = OCEAN_ARTIFACTS_ADDRESSES_PER_CHAIN - } - // check if we have configured anything ourselves - const hasSupportedNetworks = - supportedNetworks && Object.keys(supportedNetworks).length > 0 - // check if we have it supported - Object.keys(addressesData).forEach((chain: any) => { - const chainName = chain as string - const { chainId, Ocean } = addressesData[chainName] - - // if we have set the supported chains, we use those chains/tokens - if (hasSupportedNetworks) { - // check if exists the correct one to add - const keyId: string = chainId as string - const chainInfo: any = supportedNetworks[keyId] - if (chainInfo) { - nodeFeesTokens.push({ - chain: keyId, - token: Ocean - }) - } - } else { - // otherwise, we add all we know about - nodeFeesTokens.push({ - chain: chainId as string, - token: Ocean - }) - } - }) - return nodeFeesTokens -} - -// parse fees structure from .env -/** - * - * @param supportedNetworks networks supported - * @param isStartup boolean to avoid logging too much - * @returns Fees structure - */ -function getOceanNodeFees(supportedNetworks: RPCS, isStartup?: boolean): FeeStrategy { - const logError = () => { - CONFIG_LOGGER.logMessageWithEmoji( - 'Error parsing Fee Strategy! Please check "FEE_TOKENS" and "FEE_AMOUNT" env variables. Will use defaults...', - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - } - let nodeFeesAmount: FeeAmount - let nodeFeesTokens: FeeTokens[] = [] - try { - // if not exists, just use defaults - if (!existsEnvironmentVariable(ENVIRONMENT_VARIABLES.FEE_AMOUNT)) { - if (isStartup) { - logMissingVariableWithDefault(ENVIRONMENT_VARIABLES.FEE_AMOUNT) - } - - nodeFeesAmount = { amount: 0, unit: 'MB' } - } else { - nodeFeesAmount = JSON.parse(process.env.FEE_AMOUNT) as FeeAmount - } - if (!existsEnvironmentVariable(ENVIRONMENT_VARIABLES.FEE_TOKENS)) { - // try to get first for artifacts address if available - if (isStartup) { - logMissingVariableWithDefault(ENVIRONMENT_VARIABLES.FEE_TOKENS) - } - - nodeFeesTokens = getDefaultFeeTokens(supportedNetworks) - } else { - const tokens = JSON.parse(ENVIRONMENT_VARIABLES.FEE_TOKENS.value) - Object.keys(tokens).forEach((key: any) => { - nodeFeesTokens.push({ - chain: key as string, - token: tokens[key] - }) - }) - } - - return { - feeTokens: nodeFeesTokens, - feeAmount: nodeFeesAmount - } - } catch (error) { - if (isStartup) { - logError() - } - // make sure we always return something usable - return { - feeTokens: nodeFeesTokens.length - ? nodeFeesTokens - : getDefaultFeeTokens(supportedNetworks), - feeAmount: nodeFeesAmount || { amount: 0, unit: 'MB' } - } - } -} - -function getC2DDockerConfig(isStartup?: boolean): OceanNodeDockerConfig { - const config = { - socketPath: getEnvValue(process.env.DOCKER_SOCKET_PATH, null), - protocol: getEnvValue(process.env.DOCKER_PROTOCOL, null), - host: getEnvValue(process.env.DOCKER_HOST, null), - port: getIntEnvValue(process.env.DOCKER_PORT, 0), - caPath: getEnvValue(process.env.DOCKER_CA_PATH, null), - certPath: getEnvValue(process.env.DOCKER_CERT_PATH, null), - keyPath: getEnvValue(process.env.DOCKER_KEY_PATH, null) - } - return config -} -// get C2D environments -function getC2DClusterEnvironment(isStartup?: boolean): C2DClusterInfo[] { - const clusters: C2DClusterInfo[] = [] - // avoid log too much (too much noise on tests as well), this is not even required - if (existsEnvironmentVariable(ENVIRONMENT_VARIABLES.OPERATOR_SERVICE_URL, isStartup)) { - try { - const clustersURLS: string[] = JSON.parse( - process.env.OPERATOR_SERVICE_URL - ) as string[] - - for (const theURL of clustersURLS) { - clusters.push({ - connection: theURL, - hash: create256Hash(theURL), - type: C2DClusterType.OPF_K8 - }) - } - } catch (error) { - CONFIG_LOGGER.logMessageWithEmoji( - `Invalid or missing "${ENVIRONMENT_VARIABLES.OPERATOR_SERVICE_URL.name}" env variable => ${process.env.OPERATOR_SERVICE_URL}...`, - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - } - } - - return clusters -} - -// connect interfaces (p2p or/and http) -function getNodeInterfaces(isStartup: boolean = false) { - let interfaces: string[] = ['P2P', 'HTTP'] - if (!existsEnvironmentVariable(ENVIRONMENT_VARIABLES.INTERFACES)) { - if (isStartup) { - logMissingVariableWithDefault(ENVIRONMENT_VARIABLES.INTERFACES) - } - } else { - try { - interfaces = JSON.parse(process.env.INTERFACES) as string[] - if (interfaces.length === 0) { - return ['P2P', 'HTTP'] - } - } catch (err) { - CONFIG_LOGGER.logMessageWithEmoji( - `Invalid "${ENVIRONMENT_VARIABLES.INTERFACES.name}" env variable => ${process.env.INTERFACES}. Will use defaults...`, - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - } - } - // make it case insensitive - return interfaces.map((iface: string) => { - return iface.toUpperCase() - }) -} - -/** - * checks if a var is defined on env - * @param envVariable check utils/constants ENVIRONMENT_VARIABLES - * @param hasDefault if true we ignore if not set - * @returns boolean - */ -export function existsEnvironmentVariable(envVariable: any, log = false): boolean { - let { name, value, required } = envVariable - // extra check in case we change environment with tests (get the latest) - if (process.env[name] !== value) { - value = process.env[name] - } - if (!value) { - if (log) { - CONFIG_LOGGER.logMessageWithEmoji( - `Invalid or missing "${name}" env variable...`, - true, - required - ? GENERIC_EMOJIS.EMOJI_CROSS_MARK - : getLoggerLevelEmoji(LOG_LEVELS_STR.LEVEL_WARN), - required ? LOG_LEVELS_STR.LEVEL_ERROR : LOG_LEVELS_STR.LEVEL_WARN - ) - } - - return false - } - return true -} - -function logMissingVariableWithDefault(envVariable: EnvVariable) { - CONFIG_LOGGER.log( - LOG_LEVELS_STR.LEVEL_WARN, - `Missing "${envVariable.name}" env variable. Will use defaults...`, - true - ) -} -// have a rate limit for handler calls -function getRateLimit(isStartup: boolean = false) { - if (!existsEnvironmentVariable(ENVIRONMENT_VARIABLES.MAX_REQ_PER_SECOND)) { - if (isStartup) { - logMissingVariableWithDefault(ENVIRONMENT_VARIABLES.MAX_REQ_PER_SECOND) - } - return DEFAULT_RATE_LIMIT_PER_SECOND - } else { - try { - return getIntEnvValue(process.env.MAX_REQ_PER_SECOND, DEFAULT_RATE_LIMIT_PER_SECOND) - } catch (err) { - CONFIG_LOGGER.error( - `Invalid "${ENVIRONMENT_VARIABLES.MAX_REQ_PER_SECOND.name}" env variable...` - ) - return DEFAULT_RATE_LIMIT_PER_SECOND - } - } -} - -// get blocked ips and peer ids -function getDenyList(isStartup: boolean = false): DenyList { - const defaultDenyList: DenyList = { - peers: [], - ips: [] - } - if (!existsEnvironmentVariable(ENVIRONMENT_VARIABLES.RATE_DENY_LIST, isStartup)) { - return defaultDenyList - } else { - try { - const list: DenyList = JSON.parse(process.env.RATE_DENY_LIST) as DenyList - return list - } catch (err) { - CONFIG_LOGGER.error( - `Invalid "${ENVIRONMENT_VARIABLES.RATE_DENY_LIST.name}" env variable...` - ) - return defaultDenyList - } - } -} - -// lazy access ocean node config, when we don't need updated values from process.env -// this only goes through .env processing once (more suitable for a running node instance) -export async function getConfiguration( - forceReload: boolean = false, - isStartup: boolean = false -): Promise { - if (!previousConfiguration || forceReload) { - previousConfiguration = await getEnvConfig(isStartup) - } - return previousConfiguration -} - -// we can just use the lazy version above "getConfiguration()" and specify if we want to reload from .env variables -async function getEnvConfig(isStartup?: boolean): Promise { - const privateKey = process.env.PRIVATE_KEY - if (!privateKey || privateKey.length !== 66) { - // invalid private key - CONFIG_LOGGER.logMessageWithEmoji( - 'Invalid PRIVATE_KEY env variable..', - true, - GENERIC_EMOJIS.EMOJI_CROSS_MARK, - LOG_LEVELS_STR.LEVEL_ERROR - ) - return null - } - - const supportedNetworks = getSupportedChains() - const indexingNetworks = supportedNetworks - ? getIndexingNetworks(supportedNetworks) - : null - // Notes: we need to have this config on the class and use always that, otherwise we're processing - // all this info every time we call getConfig(), and also loggin too much - - const keys = await getPeerIdFromPrivateKey(privateKey) - // do not log this information everytime we call getConfig() - if (isStartup) { - CONFIG_LOGGER.logMessageWithEmoji( - 'Starting node with peerID: ' + keys.peerId, - true, - GENERIC_EMOJIS.EMOJI_CHECK_MARK - ) - } - - // http and/or p2p connections - const interfaces = getNodeInterfaces(isStartup) - let bootstrapTtl = getIntEnvValue(process.env.P2P_BOOTSTRAP_TTL, 120000) - if (bootstrapTtl === 0) bootstrapTtl = Infinity - const config: OceanNodeConfig = { - authorizedDecrypters: getAuthorizedDecrypters(isStartup), - allowedValidators: getAllowedValidators(isStartup), - keys, - // Only enable indexer if we have a DB_URL and supportedNetworks - hasIndexer: !!(!!getEnvValue(process.env.DB_URL, '') && !!indexingNetworks), - hasHttp: interfaces.includes('HTTP'), - hasP2P: interfaces.includes('P2P'), - p2pConfig: { - bootstrapNodes: readListFromEnvVariable( - ENVIRONMENT_VARIABLES.P2P_BOOTSTRAP_NODES, - isStartup, - defaultBootstrapAddresses - ), - bootstrapTimeout: getIntEnvValue(process.env.P2P_BOOTSTRAP_TIMEOUT, 20000), - bootstrapTagName: getEnvValue(process.env.P2P_BOOTSTRAP_TAGNAME, 'bootstrap'), - bootstrapTagValue: getIntEnvValue(process.env.P2P_BOOTSTRAP_TAGVALUE, 50), - bootstrapTTL: bootstrapTtl, - enableIPV4: getBoolEnvValue('P2P_ENABLE_IPV4', true), - enableIPV6: getBoolEnvValue('P2P_ENABLE_IPV6', true), - ipV4BindAddress: getEnvValue(process.env.P2P_ipV4BindAddress, '0.0.0.0'), - ipV4BindTcpPort: getIntEnvValue(process.env.P2P_ipV4BindTcpPort, 0), - ipV4BindWsPort: getIntEnvValue(process.env.P2P_ipV4BindWsPort, 0), - ipV6BindAddress: getEnvValue(process.env.P2P_ipV6BindAddress, '::1'), - ipV6BindTcpPort: getIntEnvValue(process.env.P2P_ipV6BindTcpPort, 0), - ipV6BindWsPort: getIntEnvValue(process.env.P2P_ipV6BindWsPort, 0), - announceAddresses: readListFromEnvVariable( - ENVIRONMENT_VARIABLES.P2P_ANNOUNCE_ADDRESSES, - isStartup - ), - pubsubPeerDiscoveryInterval: getIntEnvValue( - process.env.P2P_pubsubPeerDiscoveryInterval, - 10000 // every 10 seconds - ), - dhtMaxInboundStreams: getIntEnvValue(process.env.P2P_dhtMaxInboundStreams, 500), - dhtMaxOutboundStreams: getIntEnvValue(process.env.P2P_dhtMaxOutboundStreams, 500), - enableDHTServer: getBoolEnvValue(process.env.P2P_ENABLE_DHT_SERVER, false), - mDNSInterval: getIntEnvValue(process.env.P2P_mDNSInterval, 20e3), // 20 seconds - connectionsMaxParallelDials: getIntEnvValue( - process.env.P2P_connectionsMaxParallelDials, - 15 - ), - connectionsDialTimeout: getIntEnvValue( - process.env.P2P_connectionsDialTimeout, - 30e3 - ), // 10 seconds, - upnp: getBoolEnvValue('P2P_ENABLE_UPNP', true), - autoNat: getBoolEnvValue('P2P_ENABLE_AUTONAT', true), - enableCircuitRelayServer: getBoolEnvValue('P2P_ENABLE_CIRCUIT_RELAY_SERVER', false), - enableCircuitRelayClient: getBoolEnvValue('P2P_ENABLE_CIRCUIT_RELAY_CLIENT', false), - circuitRelays: getIntEnvValue(process.env.P2P_CIRCUIT_RELAYS, 0), - announcePrivateIp: getBoolEnvValue('P2P_ANNOUNCE_PRIVATE', false), - filterAnnouncedAddresses: readListFromEnvVariable( - ENVIRONMENT_VARIABLES.P2P_FILTER_ANNOUNCED_ADDRESSES, - isStartup, - [ - '127.0.0.0/8', - '10.0.0.0/8', - '172.16.0.0/12', - '192.168.0.0/16', - '100.64.0.0/10', - '169.254.0.0/16', - '192.0.0.0/24', - '192.0.2.0/24', - '198.51.100.0/24', - '203.0.113.0/24', - '224.0.0.0/4', - '240.0.0.0/4' - ] // list of all non-routable IP addresses, not availabe from public internet, private networks or specific reserved use - ), - minConnections: getIntEnvValue(process.env.P2P_MIN_CONNECTIONS, 1), - maxConnections: getIntEnvValue(process.env.P2P_MAX_CONNECTIONS, 300), - autoDialPeerRetryThreshold: getIntEnvValue( - process.env.P2P_AUTODIALPEERRETRYTHRESHOLD, - 1000 * 120 - ), - autoDialConcurrency: getIntEnvValue(process.env.P2P_AUTODIALCONCURRENCY, 5), - maxPeerAddrsToDial: getIntEnvValue(process.env.P2P_MAXPEERADDRSTODIAL, 5), - autoDialInterval: getIntEnvValue(process.env.P2P_AUTODIALINTERVAL, 5000) - }, - hasDashboard: process.env.DASHBOARD !== 'false', - httpPort: getIntEnvValue(process.env.HTTP_API_PORT, 8000), - dbConfig: { - url: getEnvValue(process.env.DB_URL, ''), - username: getEnvValue(process.env.DB_USERNAME, ''), - password: getEnvValue(process.env.DB_PASSWORD, ''), - dbType: getEnvValue(process.env.DB_TYPE, null) - }, - supportedNetworks, - indexingNetworks, - feeStrategy: getOceanNodeFees(supportedNetworks, isStartup), - c2dClusters: getC2DClusterEnvironment(isStartup), - dockerConfig: getC2DDockerConfig(isStartup), - c2dNodeUri: getEnvValue(process.env.C2D_NODE_URI, ''), - accountPurgatoryUrl: getEnvValue(process.env.ACCOUNT_PURGATORY_URL, ''), - assetPurgatoryUrl: getEnvValue(process.env.ASSET_PURGATORY_URL, ''), - allowedAdmins: getAllowedAdmins(isStartup), - rateLimit: getRateLimit(isStartup), - denyList: getDenyList(isStartup), - unsafeURLs: readListFromEnvVariable( - ENVIRONMENT_VARIABLES.UNSAFE_URLS, - isStartup, - knownUnsafeURLs - ) - } - - if (!previousConfiguration) { - previousConfiguration = config - } else if (configChanged(previousConfiguration, config)) { - CONFIG_LOGGER.warn( - 'Detected Ocean Node Configuration change... This might have unintended effects' - ) - } - return config -} - -function configChanged(previous: OceanNodeConfig, current: OceanNodeConfig): boolean { - return JSON.stringify(previous) !== JSON.stringify(current) -} - -// useful for debugging purposes -export async function printCurrentConfig() { - const conf = await getConfiguration(true) - console.log(JSON.stringify(conf, null, 4)) +export function isPolicyServerConfigured(): boolean { + return isDefined(process.env.POLICY_SERVER_URL) } -// P2P routes related export const hasP2PInterface = (await (await getConfiguration())?.hasP2P) || false diff --git a/src/utils/config/builder.ts b/src/utils/config/builder.ts new file mode 100644 index 000000000..1c56bce04 --- /dev/null +++ b/src/utils/config/builder.ts @@ -0,0 +1,302 @@ +import type { OceanNodeConfig, OceanNodeKeys } from '../../@types/OceanNode.js' +import type { C2DClusterInfo, C2DDockerConfig } from '../../@types/C2D/C2D.js' +import type { RPCS } from '../../@types/blockchain.js' +import type { FeeTokens } from '../../@types/Fees.js' +import { C2DClusterType } from '../../@types/C2D/C2D.js' +import { privateKeyFromRaw } from '@libp2p/crypto/keys' +import { peerIdFromPrivateKey } from '@libp2p/peer-id' +import { Wallet } from 'ethers' +import fs from 'fs' +import os from 'os' +import path from 'path' +import { hexStringToByteArray, computeCodebaseHash } from '../index.js' +import { + getOceanArtifactsAdresses, + OCEAN_ARTIFACTS_ADDRESSES_PER_CHAIN +} from '../address.js' +import { create256Hash } from '../crypt.js' +import { CONFIG_LOGGER } from '../logging/common.js' +import { LOG_LEVELS_STR, GENERIC_EMOJIS } from '../logging/Logger.js' +import { OceanNodeConfigSchema } from './schemas.js' +import { ENV_TO_CONFIG_MAPPING } from './constants.js' +import { fileURLToPath } from 'url' +import lodash from 'lodash' + +let previousConfiguration: OceanNodeConfig = null + +function mapEnvToConfig( + env: NodeJS.ProcessEnv, + mapping: Record +): Record { + const result: Record = {} + for (const [envKey, configKey] of Object.entries(mapping)) { + const value = env[envKey] + if (value !== undefined && value !== 'undefined') { + lodash.set(result, configKey, value) + } + } + return result +} + +function preprocessConfigData(data: any): void { + if (data.INTERFACES) { + try { + const interfaces = JSON.parse(data.INTERFACES).map((i: string) => i.toUpperCase()) + if (interfaces.length > 0) { + data.hasHttp = interfaces.includes('HTTP') + data.hasP2P = interfaces.includes('P2P') + } + } catch (error) { + CONFIG_LOGGER.warn(`Failed to parse INTERFACES: ${error.message}`) + } + delete data.INTERFACES + } + + // Transform DB_* env vars to dbConfig + if (data.DB_URL) { + data.dbConfig = { + url: data.DB_URL, + username: data.DB_USERNAME, + password: data.DB_PASSWORD, + dbType: data.DB_TYPE || 'elasticsearch' + } + delete data.DB_URL + delete data.DB_USERNAME + delete data.DB_PASSWORD + delete data.DB_TYPE + } + + // Transform FEE_* env vars to feeStrategy + if (data.FEE_AMOUNT && data.FEE_TOKENS) { + try { + const feeAmount = JSON.parse(data.FEE_AMOUNT) + const tokens = JSON.parse(data.FEE_TOKENS) + const feeTokens = Object.keys(tokens).map((key) => ({ + chain: key, + token: tokens[key] + })) + data.feeStrategy = { feeAmount, feeTokens } + } catch (error) { + CONFIG_LOGGER.error(`Failed to parse fee strategy: ${error.message}`) + } + delete data.FEE_AMOUNT + delete data.FEE_TOKENS + } +} + +export function getPeerIdFromPrivateKey(privateKey: string): OceanNodeKeys { + const key = privateKeyFromRaw(hexStringToByteArray(privateKey.slice(2))) + + return { + peerId: peerIdFromPrivateKey(key), + publicKey: key.publicKey.raw, + privateKey: key, + ethAddress: new Wallet(privateKey.substring(2)).address + } +} + +export function getDefaultFeeTokens(supportedNetworks?: RPCS): FeeTokens[] { + const nodeFeesTokens: FeeTokens[] = [] + let addressesData: any = getOceanArtifactsAdresses() + if (!addressesData) { + addressesData = OCEAN_ARTIFACTS_ADDRESSES_PER_CHAIN + } + + const hasSupportedNetworks = + supportedNetworks && Object.keys(supportedNetworks).length > 0 + + Object.keys(addressesData).forEach((chain: any) => { + const chainName = chain as string + const { chainId, Ocean } = addressesData[chainName] + + if (hasSupportedNetworks) { + const keyId: string = chainId as string + const chainInfo: any = supportedNetworks[keyId] + if (chainInfo) { + nodeFeesTokens.push({ + chain: keyId, + token: Ocean + }) + } + } else { + nodeFeesTokens.push({ + chain: chainId as string, + token: Ocean + }) + } + }) + return nodeFeesTokens +} + +export function buildC2DClusters( + dockerComputeEnvironments: C2DDockerConfig[] +): C2DClusterInfo[] { + const clusters: C2DClusterInfo[] = [] + + if (process.env.OPERATOR_SERVICE_URL) { + try { + const clustersURLS: string[] = JSON.parse(process.env.OPERATOR_SERVICE_URL) + for (const theURL of clustersURLS) { + clusters.push({ + connection: theURL, + hash: create256Hash(theURL), + type: C2DClusterType.OPF_K8 + }) + } + } catch (error) { + CONFIG_LOGGER.error(`Failed to parse OPERATOR_SERVICE_URL: ${error.message}`) + } + } + + if (dockerComputeEnvironments) { + for (const dockerC2d of dockerComputeEnvironments) { + if (dockerC2d.socketPath || dockerC2d.host) { + const hash = create256Hash(JSON.stringify(dockerC2d)) + clusters.push({ + connection: dockerC2d, + hash, + type: C2DClusterType.DOCKER, + tempFolder: './c2d_storage/' + hash + }) + } + } + } + + return clusters +} + +export function getConfigFilePath(configPath?: string): string { + if (!configPath) { + configPath = process.env.CONFIG_PATH || path.join(process.cwd(), 'config.json') + } + return configPath +} + +export function loadConfigFromFile(configPath?: string): OceanNodeConfig { + configPath = getConfigFilePath(configPath) + + if (configPath.startsWith('$HOME')) { + const home = process.env.HOME || os.homedir() + if (!home) { + throw new Error( + 'Config path contains $HOME but HOME is not set in the environment.' + ) + } + configPath = path.join(home, configPath.slice('$HOME'.length)) + } + + if ( + configPath !== path.join(process.cwd(), 'config.json') && + !path.isAbsolute(configPath) + ) { + throw new Error(`Config path must be absolute. Got: ${configPath}`) + } + + if (!fs.existsSync(configPath)) { + throw new Error(`Config file not found at path: ${configPath}`) + } + + const rawData = fs.readFileSync(configPath, 'utf-8') + let config: OceanNodeConfig + + try { + config = JSON.parse(rawData) + } catch (err) { + throw new Error(`Invalid JSON in config file: ${configPath}. Error: ${err.message}`) + } + + return config +} + +export function buildMergedConfig(): OceanNodeConfig { + const baseConfig = loadConfigFromFile() + const privateKey = process.env.PRIVATE_KEY + if (!privateKey || privateKey.length !== 66) { + CONFIG_LOGGER.logMessageWithEmoji( + 'Invalid or missing PRIVATE_KEY env variable. Must be 66 characters (0x + 64 hex chars).', + true, + GENERIC_EMOJIS.EMOJI_CROSS_MARK, + LOG_LEVELS_STR.LEVEL_ERROR + ) + throw new Error('Invalid PRIVATE_KEY') + } + + // const keys = getPeerIdFromPrivateKey(privateKey) + // Set key provider type and raw private key for KeyManager + // Type will be validated by KeyManager when initializing + const over = { + privateKey + } + + const { env } = process + const envOverrides: Record = { over } + + Object.assign(envOverrides, mapEnvToConfig(env, ENV_TO_CONFIG_MAPPING)) + + const merged = lodash.merge({}, baseConfig, envOverrides) + + preprocessConfigData(merged) + const parsed = OceanNodeConfigSchema.safeParse(merged) + + if (!parsed.success) { + console.error('\n❌ Invalid Ocean Node configuration:') + for (const issue of parsed.error.issues) { + console.error(` • ${issue.path.join('.')}: ${issue.message}`) + } + throw new Error('Configuration validation failed') + } + + const config = parsed.data as any + + // Post-processing transformations + if (!config.indexingNetworks) { + config.indexingNetworks = config.supportedNetworks + } + + if (Array.isArray(config.indexingNetworks) && config.supportedNetworks) { + const filteredNetworks: RPCS = {} + for (const chainId of config.indexingNetworks) { + const chainIdStr = String(chainId) + if (config.supportedNetworks[chainIdStr]) { + filteredNetworks[chainIdStr] = config.supportedNetworks[chainIdStr] + } + } + config.indexingNetworks = filteredNetworks + } + + if (!config.feeStrategy) { + config.feeStrategy = { + feeAmount: { amount: 0, unit: 'MB' }, + feeTokens: getDefaultFeeTokens(config.supportedNetworks as RPCS) + } + } + + config.c2dClusters = buildC2DClusters( + config.dockerComputeEnvironments as C2DDockerConfig[] + ) + + return config as OceanNodeConfig +} + +export async function getConfiguration( + forceReload: boolean = false, + isStartup: boolean = false +): Promise { + if (!previousConfiguration || forceReload) { + previousConfiguration = buildMergedConfig() + } + + if (!previousConfiguration.codeHash) { + const __filename = fileURLToPath(import.meta.url) + const __dirname = path.dirname(__filename.replace('utils/config', 'utils')) + previousConfiguration.codeHash = await computeCodebaseHash(__dirname) + } + + return previousConfiguration +} + +export async function printCurrentConfig() { + const conf = await getConfiguration(true) + conf.keys.privateKey = '[*** HIDDEN CONTENT ***]' + console.log(JSON.stringify(conf, null, 4)) +} diff --git a/src/utils/config/constants.ts b/src/utils/config/constants.ts new file mode 100644 index 000000000..8f99b8bb4 --- /dev/null +++ b/src/utils/config/constants.ts @@ -0,0 +1,131 @@ +export const ENV_TO_CONFIG_MAPPING = { + PRIVATE_KEY: 'keys.privateKey', + INTERFACES: 'INTERFACES', + DB_URL: 'DB_URL', + DB_USERNAME: 'DB_USERNAME', + DB_PASSWORD: 'DB_PASSWORD', + DB_TYPE: 'DB_TYPE', + FEE_AMOUNT: 'FEE_AMOUNT', + FEE_TOKENS: 'FEE_TOKENS', + HTTP_API_PORT: 'httpPort', + CONTROL_PANEL: 'hasControlPanel', + RPCS: 'supportedNetworks', + IPFS_GATEWAY: 'ipfsGateway', + ARWEAVE_GATEWAY: 'arweaveGateway', + ACCOUNT_PURGATORY_URL: 'accountPurgatoryUrl', + ASSET_PURGATORY_URL: 'assetPurgatoryUrl', + UNSAFE_URLS: 'unsafeURLs', + IS_BOOTSTRAP: 'isBootstrap', + ESCROW_CLAIM_TIMEOUT: 'claimDurationTimeout', + VALIDATE_UNSIGNED_DDO: 'validateUnsignedDDO', + JWT_SECRET: 'jwtSecret', + MAX_REQ_PER_MINUTE: 'rateLimit', + MAX_CONNECTIONS_PER_MINUTE: 'maxConnections', + RATE_DENY_LIST: 'denyList', + AUTHORIZED_DECRYPTERS: 'authorizedDecrypters', + AUTHORIZED_DECRYPTERS_LIST: 'authorizedDecryptersList', + ALLOWED_VALIDATORS: 'allowedValidators', + ALLOWED_VALIDATORS_LIST: 'allowedValidatorsList', + AUTHORIZED_PUBLISHERS: 'authorizedPublishers', + AUTHORIZED_PUBLISHERS_LIST: 'authorizedPublishersList', + ALLOWED_ADMINS: 'allowedAdmins', + ALLOWED_ADMINS_LIST: 'allowedAdminsList', + DOCKER_COMPUTE_ENVIRONMENTS: 'dockerComputeEnvironments', + P2P_BOOTSTRAP_NODES: 'p2pConfig.bootstrapNodes', + P2P_BOOTSTRAP_TIMEOUT: 'p2pConfig.bootstrapTimeout', + P2P_BOOTSTRAP_TAGNAME: 'p2pConfig.bootstrapTagName', + P2P_BOOTSTRAP_TAGVALUE: 'p2pConfig.bootstrapTagValue', + P2P_BOOTSTRAP_TTL: 'p2pConfig.bootstrapTTL', + P2P_ENABLE_IPV4: 'p2pConfig.enableIPV4', + P2P_ENABLE_IPV6: 'p2pConfig.enableIPV6', + P2P_ipV4BindAddress: 'p2pConfig.ipV4BindAddress', + P2P_ipV4BindTcpPort: 'p2pConfig.ipV4BindTcpPort', + P2P_ipV4BindWsPort: 'p2pConfig.ipV4BindWsPort', + P2P_ipV4BindWssPort: 'p2pConfig.ipV4BindWssPort', + P2P_ipV6BindAddress: 'p2pConfig.ipV6BindAddress', + P2P_ipV6BindTcpPort: 'p2pConfig.ipV6BindTcpPort', + P2P_ipV6BindWsPort: 'p2pConfig.ipV6BindWsPort', + P2P_ANNOUNCE_ADDRESSES: 'p2pConfig.announceAddresses', + P2P_pubsubPeerDiscoveryInterval: 'p2pConfig.pubsubPeerDiscoveryInterval', + P2P_dhtMaxInboundStreams: 'p2pConfig.dhtMaxInboundStreams', + P2P_dhtMaxOutboundStreams: 'p2pConfig.dhtMaxOutboundStreams', + P2P_DHT_FILTER: 'p2pConfig.dhtFilter', + P2P_mDNSInterval: 'p2pConfig.mDNSInterval', + P2P_connectionsMaxParallelDials: 'p2pConfig.connectionsMaxParallelDials', + P2P_connectionsDialTimeout: 'p2pConfig.connectionsDialTimeout', + P2P_ENABLE_UPNP: 'p2pConfig.upnp', + P2P_ENABLE_AUTONAT: 'p2pConfig.autoNat', + P2P_ENABLE_CIRCUIT_RELAY_SERVER: 'p2pConfig.enableCircuitRelayServer', + P2P_ENABLE_CIRCUIT_RELAY_CLIENT: 'p2pConfig.enableCircuitRelayClient', + P2P_CIRCUIT_RELAYS: 'p2pConfig.circuitRelays', + P2P_ANNOUNCE_PRIVATE: 'p2pConfig.announcePrivateIp', + P2P_FILTER_ANNOUNCED_ADDRESSES: 'p2pConfig.filterAnnouncedAddresses', + P2P_MIN_CONNECTIONS: 'p2pConfig.minConnections', + P2P_MAX_CONNECTIONS: 'p2pConfig.maxConnections', + P2P_AUTODIALPEERRETRYTHRESHOLD: 'p2pConfig.autoDialPeerRetryThreshold', + P2P_AUTODIALCONCURRENCY: 'p2pConfig.autoDialConcurrency', + P2P_MAXPEERADDRSTODIAL: 'p2pConfig.maxPeerAddrsToDial', + P2P_AUTODIALINTERVAL: 'p2pConfig.autoDialInterval', + P2P_ENABLE_NETWORK_STATS: 'p2pConfig.enableNetworkStats', + HTTP_CERT_PATH: 'httpCertPath', + HTTP_KEY_PATH: 'httpKeyPath' +} as const + +// Configuration defaults +export const DEFAULT_RATE_LIMIT_PER_MINUTE = 30 +export const DEFAULT_MAX_CONNECTIONS_PER_MINUTE = 60 * 2 // 120 requests per minute + +export const DEFAULT_BOOTSTRAP_ADDRESSES = [ + // OPF nodes + // node1 + '/dns4/node1.oceanprotocol.com/tcp/9000/p2p/16Uiu2HAmLhRDqfufZiQnxvQs2XHhd6hwkLSPfjAQg1gH8wgRixiP', + '/dns4/node1.oceanprotocol.com/tcp/9001/ws/p2p/16Uiu2HAmLhRDqfufZiQnxvQs2XHhd6hwkLSPfjAQg1gH8wgRixiP', + '/dns6/node1.oceanprotocol.com/tcp/9002/p2p/16Uiu2HAmLhRDqfufZiQnxvQs2XHhd6hwkLSPfjAQg1gH8wgRixiP', + '/dns6/node1.oceanprotocol.com/tcp/9003/ws/p2p/16Uiu2HAmLhRDqfufZiQnxvQs2XHhd6hwkLSPfjAQg1gH8wgRixiP', + // node 2 + '/dns4/node2.oceanprotocol.com/tcp/9000/p2p/16Uiu2HAmHwzeVw7RpGopjZe6qNBJbzDDBdqtrSk7Gcx1emYsfgL4', + '/dns4/node2.oceanprotocol.com/tcp/9001/ws/p2p/16Uiu2HAmHwzeVw7RpGopjZe6qNBJbzDDBdqtrSk7Gcx1emYsfgL4', + '/dns6/node2.oceanprotocol.com/tcp/9002/p2p/16Uiu2HAmHwzeVw7RpGopjZe6qNBJbzDDBdqtrSk7Gcx1emYsfgL4', + '/dns6/node2.oceanprotocol.com/tcp/9003/ws/p2p/16Uiu2HAmHwzeVw7RpGopjZe6qNBJbzDDBdqtrSk7Gcx1emYsfgL4', + // node 3 + '/dns4/node3.oceanprotocol.com/tcp/9000/p2p/16Uiu2HAmBKSeEP3v4tYEPsZsZv9VELinyMCsrVTJW9BvQeFXx28U', + '/dns4/node3.oceanprotocol.com/tcp/9001/ws/p2p/16Uiu2HAmBKSeEP3v4tYEPsZsZv9VELinyMCsrVTJW9BvQeFXx28U', + '/dns6/node3.oceanprotocol.com/tcp/9002/p2p/16Uiu2HAmBKSeEP3v4tYEPsZsZv9VELinyMCsrVTJW9BvQeFXx28U', + '/dns6/node3.oceanprotocol.com/tcp/9003/ws/p2p/16Uiu2HAmBKSeEP3v4tYEPsZsZv9VELinyMCsrVTJW9BvQeFXx28U', + // node 4 + '/dns4/node4.oceanprotocol.com/tcp/9000/p2p/16Uiu2HAmSTVTArioKm2wVcyeASHYEsnx2ZNq467Z4GMDU4ErEPom', + '/dns4/node4.oceanprotocol.com/tcp/9001/ws/p2p/16Uiu2HAmSTVTArioKm2wVcyeASHYEsnx2ZNq467Z4GMDU4ErEPom', + '/dns6/node4.oceanprotocol.com/tcp/9002/p2p/16Uiu2HAmSTVTArioKm2wVcyeASHYEsnx2ZNq467Z4GMDU4ErEPom', + '/dns6/node4.oceanprotocol.com/tcp/9003/ws/p2p/16Uiu2HAmSTVTArioKm2wVcyeASHYEsnx2ZNq467Z4GMDU4ErEPom' +] as const + +export const DEFAULT_UNSAFE_URLS = [ + // AWS and GCP + '^.*(169.254.169.254).*', + // GCP + '^.*(metadata.google.internal).*', + '^.*(http://metadata).*', + // Azure + '^.*(http://169.254.169.254).*', + // Oracle Cloud + '^.*(http://192.0.0.192).*', + // Alibaba Cloud + '^.*(http://100.100.100.200).*', + // k8s ETCD + '^.*(127.0.0.1).*' +] as const + +export const DEFAULT_FILTER_ANNOUNCED_ADDRESSES = [ + '127.0.0.0/8', + '10.0.0.0/8', + '172.16.0.0/12', + '192.168.0.0/16', + '100.64.0.0/10', + '169.254.0.0/16', + '192.0.0.0/24', + '192.0.2.0/24', + '198.51.100.0/24', + '203.0.113.0/24', + '224.0.0.0/4', + '240.0.0.0/4' +] as const diff --git a/src/utils/config/index.ts b/src/utils/config/index.ts new file mode 100644 index 000000000..276c92be9 --- /dev/null +++ b/src/utils/config/index.ts @@ -0,0 +1,6 @@ +export * from './schemas.js' +export * from './transforms.js' +export * from './constants.js' +export * from './builder.js' + +export { getConfiguration, getConfigFilePath, printCurrentConfig } from './builder.js' diff --git a/src/utils/config/schemas.ts b/src/utils/config/schemas.ts new file mode 100644 index 000000000..1139b69c5 --- /dev/null +++ b/src/utils/config/schemas.ts @@ -0,0 +1,348 @@ +import { z } from 'zod' +import { getAddress } from 'ethers' +import { dhtFilterMethod } from '../../@types/OceanNode.js' +import { C2DClusterType } from '../../@types/C2D/C2D.js' +import { CONFIG_LOGGER } from '../logging/common.js' +import { booleanFromString, jsonFromString } from './transforms.js' +import { + DEFAULT_BOOTSTRAP_ADDRESSES, + DEFAULT_RATE_LIMIT_PER_MINUTE, + DEFAULT_UNSAFE_URLS, + DEFAULT_FILTER_ANNOUNCED_ADDRESSES +} from './constants.js' + +function isValidUrl(urlString: string): boolean { + try { + // eslint-disable-next-line no-new + new URL(urlString) + return true + } catch { + return false + } +} + +export const SupportedNetworkSchema = z.object({ + chainId: z.number(), + rpc: z.string(), + network: z.string().optional(), + chunkSize: z.number().optional(), + startBlock: z.number().optional(), + fallbackRPCs: z.array(z.string()).optional() +}) + +export const RPCSSchema = z.record(z.string(), SupportedNetworkSchema) + +export const AccessListContractSchema = z.preprocess( + (val) => { + // If it's not a plain object, normalize to null + if (val === null) return null + // If it's a JSON string, try to parse it + if (typeof val === 'string') { + try { + val = JSON.parse(val) + } catch { + return null + } + } + + if (typeof val !== 'object' || Array.isArray(val)) return null + + return val + }, + z.record(z.string(), z.array(z.string())).nullable() +) + +export const OceanNodeConfigKeysSchema = z.object({ + privateKey: z.any().optional().nullable(), + type: z.string().optional().default('raw') +}) + +export const DenyListSchema = z.object({ + peers: z.array(z.string()).default([]), + ips: z.array(z.string()).default([]) +}) + +export const FeeAmountSchema = z.object({ + amount: z.number(), + unit: z.string() +}) + +export const FeeTokensSchema = z.object({ + chain: z.string(), + token: z.string() +}) + +export const FeeStrategySchema = z.object({ + feeTokens: z.array(FeeTokensSchema).optional(), + feeAmount: FeeAmountSchema.optional() +}) + +export const OceanNodeDBConfigSchema = z.object({ + url: z.string().nullable(), + username: z.string().optional(), + password: z.string().optional(), + dbType: z.string().nullable() +}) + +export const ComputeResourceSchema = z.object({ + id: z.string(), + total: z.number().optional(), + description: z.string().optional(), + type: z.string().optional(), + kind: z.string().optional(), + min: z.number().optional(), + max: z.number().optional(), + inUse: z.number().optional(), + init: z.any().optional() +}) + +export const ComputeResourcesPricingInfoSchema = z.object({ + id: z.string(), + price: z.number() +}) + +export const ComputeEnvFeesSchema = z.object({ + feeToken: z.string().optional(), + prices: z.array(ComputeResourcesPricingInfoSchema).optional() +}) + +export const ComputeEnvironmentFreeOptionsSchema = z.object({ + maxJobDuration: z.number().int().optional().default(3600), + maxJobs: z.number().int().optional().default(3), + resources: z.array(ComputeResourceSchema).optional(), + access: z + .object({ + addresses: z.array(z.string()), + accessLists: z.array(z.string()) + }) + .optional() +}) + +export const C2DDockerConfigSchema = z.array( + z + .object({ + socketPath: z.string().optional(), + protocol: z.string().optional(), + host: z.string().optional(), + port: z.number().optional(), + caPath: z.string().optional(), + certPath: z.string().optional(), + keyPath: z.string().optional(), + resources: z.array(ComputeResourceSchema).optional(), + storageExpiry: z.number().int().optional().default(604800), + maxJobDuration: z.number().int().optional().default(3600), + minJobDuration: z.number().int().optional().default(60), + access: z + .object({ + addresses: z.array(z.string()), + accessLists: z.array(z.string()) + }) + .optional(), + fees: z.record(z.string(), z.array(ComputeEnvFeesSchema)), + free: ComputeEnvironmentFreeOptionsSchema.optional(), + imageRetentionDays: z.number().int().min(1).optional().default(7), + imageCleanupInterval: z.number().int().min(3600).optional().default(86400) // min 1 hour, default 24 hours + }) + .refine((data) => data.fees !== undefined && Object.keys(data.fees).length > 0, { + message: 'There is no fees configuration!' + }) + .refine((data) => data.storageExpiry >= data.maxJobDuration, { + message: '"storageExpiry" should be greater than "maxJobDuration"' + }) + .refine( + (data) => { + if (!data.resources) return false + return data.resources.some((r) => r.id === 'disk' && r.total) + }, + { message: 'There is no "disk" resource configured. This is mandatory' } + ) + .transform((data) => { + if (data.resources) { + for (const resource of data.resources) { + if (resource.id === 'disk' && resource.total) { + resource.type = 'disk' + } + } + } + return data + }) +) + +export const C2DClusterInfoSchema = z.object({ + type: z.nativeEnum(C2DClusterType), + hash: z.string(), + connection: z.any().optional(), + tempFolder: z.string().optional() +}) + +export const OceanNodeP2PConfigSchema = z.object({ + bootstrapNodes: jsonFromString(z.array(z.string())).default([ + ...DEFAULT_BOOTSTRAP_ADDRESSES + ]), + bootstrapTimeout: z.coerce.number().optional().default(10000), + bootstrapTagName: z.string().optional().default('bootstrap'), + bootstrapTagValue: z.coerce.number().optional().default(50), + bootstrapTTL: z.coerce.number().optional(), + enableIPV4: booleanFromString.optional().default(true), + enableIPV6: booleanFromString.optional().default(true), + ipV4BindAddress: z.string().nullable().optional().default('0.0.0.0'), + ipV4BindTcpPort: z.coerce.number().nullable().optional().default(9000), + ipV4BindWsPort: z.coerce.number().nullable().optional().default(9001), + ipV4BindWssPort: z.coerce.number().nullable().optional().default(9005), + ipV6BindAddress: z.string().nullable().optional().default('::'), + ipV6BindTcpPort: z.coerce.number().nullable().optional().default(9002), + ipV6BindWsPort: z.coerce.number().nullable().optional().default(9003), + pubsubPeerDiscoveryInterval: z.coerce.number().optional().default(1000), + dhtMaxInboundStreams: z.coerce.number().optional().default(500), + dhtMaxOutboundStreams: z.coerce.number().optional().default(500), + dhtFilter: z + .union([z.nativeEnum(dhtFilterMethod), z.string(), z.number(), z.null()]) + .transform((v) => { + if (v === null) { + return dhtFilterMethod.filterNone + } + if (typeof v === 'number' || typeof v === 'string') { + const filterValue = typeof v === 'string' ? parseInt(v, 10) : v + switch (filterValue) { + case 1: + return dhtFilterMethod.filterPrivate + case 2: + return dhtFilterMethod.filterPublic + default: + return dhtFilterMethod.filterNone + } + } + return v + }) + .optional() + .default(dhtFilterMethod.filterNone), + mDNSInterval: z.coerce.number().optional().default(20e3), + connectionsMaxParallelDials: z.coerce.number().optional().default(15), + connectionsDialTimeout: z.coerce.number().optional().default(30e3), + upnp: booleanFromString.optional().default(true), + autoNat: booleanFromString.optional().default(true), + enableCircuitRelayServer: booleanFromString.optional().default(false), + enableCircuitRelayClient: booleanFromString.optional().default(false), + circuitRelays: z.coerce.number().optional().default(0), + announcePrivateIp: booleanFromString.optional().default(false), + announceAddresses: jsonFromString(z.array(z.string())).optional().default([]), + filterAnnouncedAddresses: jsonFromString(z.array(z.string())) + .optional() + .default([...DEFAULT_FILTER_ANNOUNCED_ADDRESSES]), + minConnections: z.coerce.number().optional().default(1), + maxConnections: z.coerce.number().optional().default(300), + autoDialPeerRetryThreshold: z.coerce.number().optional().default(120000), + autoDialConcurrency: z.coerce.number().optional().default(5), + maxPeerAddrsToDial: z.coerce.number().optional().default(5), + autoDialInterval: z.coerce.number().optional().default(5000), + enableNetworkStats: booleanFromString.optional().default(false) +}) + +const addressArrayFromString = jsonFromString(z.array(z.string())).transform( + (addresses) => { + if (!Array.isArray(addresses)) return [] + try { + return addresses.map((addr) => getAddress(addr)) + } catch (error) { + CONFIG_LOGGER.error(`Invalid address in list: ${error.message}`) + return [] + } + } +) + +export const OceanNodeConfigSchema = z + .object({ + dockerComputeEnvironments: jsonFromString(C2DDockerConfigSchema) + .optional() + .default([]), + + authorizedDecrypters: addressArrayFromString.optional().default([]), + authorizedDecryptersList: jsonFromString(AccessListContractSchema).optional(), + + allowedValidators: addressArrayFromString.optional().default([]), + allowedValidatorsList: jsonFromString(AccessListContractSchema).optional(), + + authorizedPublishers: addressArrayFromString.optional().default([]), + authorizedPublishersList: jsonFromString(AccessListContractSchema).optional(), + + keys: OceanNodeConfigKeysSchema.optional(), + + INTERFACES: z.string().optional(), + hasP2P: booleanFromString.optional().default(true), + hasHttp: booleanFromString.optional().default(true), + + p2pConfig: OceanNodeP2PConfigSchema.nullable().optional(), + hasIndexer: booleanFromString.default(true), + hasControlPanel: booleanFromString.default(true), + + DB_URL: z.string().optional(), + DB_USERNAME: z.string().optional(), + DB_PASSWORD: z.string().optional(), + DB_TYPE: z.string().optional(), + dbConfig: OceanNodeDBConfigSchema.optional(), + + FEE_AMOUNT: z.string().optional(), + FEE_TOKENS: z.string().optional(), + feeStrategy: FeeStrategySchema.optional(), + + httpPort: z.coerce.number().optional().default(3000), + rateLimit: z.coerce.number().optional().default(DEFAULT_RATE_LIMIT_PER_MINUTE), + + ipfsGateway: z.string().nullable().optional(), + arweaveGateway: z.string().nullable().optional(), + + supportedNetworks: jsonFromString(RPCSSchema).optional(), + + claimDurationTimeout: z.coerce.number().default(3600), + indexingNetworks: z + .union([jsonFromString(RPCSSchema), z.array(z.union([z.string(), z.number()]))]) + .optional(), + + c2dClusters: z.array(C2DClusterInfoSchema).optional(), + accountPurgatoryUrl: z + .string() + .nullable() + .refine((url) => !url || isValidUrl(url), { + message: 'accountPurgatoryUrl must be a valid URL' + }), + assetPurgatoryUrl: z + .string() + .nullable() + .refine((url) => !url || isValidUrl(url), { + message: 'assetPurgatoryUrl must be a valid URL' + }), + allowedAdmins: addressArrayFromString.optional(), + allowedAdminsList: jsonFromString(AccessListContractSchema).optional(), + + codeHash: z.string().optional(), + maxConnections: z.coerce.number().optional(), + denyList: jsonFromString(DenyListSchema).optional().default({ peers: [], ips: [] }), + unsafeURLs: jsonFromString(z.array(z.string())) + .optional() + .default([...DEFAULT_UNSAFE_URLS]), + isBootstrap: booleanFromString.optional().default(false), + validateUnsignedDDO: booleanFromString.optional().default(true), + jwtSecret: z.string(), + httpCertPath: z.string().optional(), + httpKeyPath: z.string().optional() + }) + .passthrough() + .superRefine((data, ctx) => { + if (!data.hasHttp && !data.hasP2P) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'At least one interface (HTTP or P2P) must be enabled', + path: ['hasHttp'] + }) + } + + if (data.hasP2P && !data.p2pConfig) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'P2P configuration is required when hasP2P is true', + path: ['p2pConfig'] + }) + } + }) + +export type OceanNodeConfigParsed = z.infer diff --git a/src/utils/config/transforms.ts b/src/utils/config/transforms.ts new file mode 100644 index 000000000..20d0f8f13 --- /dev/null +++ b/src/utils/config/transforms.ts @@ -0,0 +1,25 @@ +import { z } from 'zod' +import { CONFIG_LOGGER } from '../logging/common.js' + +export const booleanFromString = z.union([z.boolean(), z.string()]).transform((v) => { + if (typeof v === 'string') { + return v === 'true' || v === '1' || v.toLowerCase() === 'yes' + } + return v +}) + +export const jsonFromString = (schema: z.ZodType) => + z.union([schema, z.string(), z.undefined()]).transform((v) => { + if (v === undefined || v === 'undefined') { + return undefined + } + if (typeof v === 'string') { + try { + return JSON.parse(v) + } catch (error) { + CONFIG_LOGGER.warn(`Failed to parse JSON: ${error.message}`) + return v + } + } + return v + }) diff --git a/src/utils/constants.ts b/src/utils/constants.ts index b1acee704..632efb277 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -4,7 +4,6 @@ import { Hashes } from '../@types/blockchain' export const PROTOCOL_COMMANDS = { DOWNLOAD: 'download', DOWNLOAD_URL: 'downloadURL', // we still use this - ECHO: 'echo', ENCRYPT: 'encrypt', ENCRYPT_FILE: 'encryptFile', DECRYPT_DDO: 'decryptDDO', @@ -19,8 +18,10 @@ export const PROTOCOL_COMMANDS = { VALIDATE_DDO: 'validateDDO', COMPUTE_GET_ENVIRONMENTS: 'getComputeEnvironments', COMPUTE_START: 'startCompute', + FREE_COMPUTE_START: 'freeStartCompute', COMPUTE_STOP: 'stopCompute', COMPUTE_GET_STATUS: 'getComputeStatus', + COMPUTE_GET_STREAMABLE_LOGS: 'getComputeStreamableLogs', COMPUTE_GET_RESULT: 'getComputeResult', COMPUTE_INITIALIZE: 'initializeCompute', STOP_NODE: 'stopNode', @@ -28,12 +29,20 @@ export const PROTOCOL_COMMANDS = { REINDEX_CHAIN: 'reindexChain', HANDLE_INDEXING_THREAD: 'handleIndexingThread', COLLECT_FEES: 'collectFees', - POLICY_SERVER_PASSTHROUGH: 'PolicyServerPassthrough' + POLICY_SERVER_PASSTHROUGH: 'PolicyServerPassthrough', + GET_P2P_PEER: 'getP2PPeer', + GET_P2P_PEERS: 'getP2PPeers', + GET_P2P_NETWORK_STATS: 'getP2PNetworkStats', + FIND_PEER: 'findPeer', + CREATE_AUTH_TOKEN: 'createAuthToken', + INVALIDATE_AUTH_TOKEN: 'invalidateAuthToken', + FETCH_CONFIG: 'fetchConfig', + PUSH_CONFIG: 'pushConfig', + JOBS: 'jobs' } // more visible, keep then close to make sure we always update both export const SUPPORTED_PROTOCOL_COMMANDS: string[] = [ PROTOCOL_COMMANDS.DOWNLOAD, - PROTOCOL_COMMANDS.ECHO, PROTOCOL_COMMANDS.ENCRYPT, PROTOCOL_COMMANDS.ENCRYPT_FILE, PROTOCOL_COMMANDS.NONCE, @@ -48,16 +57,27 @@ export const SUPPORTED_PROTOCOL_COMMANDS: string[] = [ PROTOCOL_COMMANDS.VALIDATE_DDO, PROTOCOL_COMMANDS.COMPUTE_GET_ENVIRONMENTS, PROTOCOL_COMMANDS.COMPUTE_START, + PROTOCOL_COMMANDS.FREE_COMPUTE_START, PROTOCOL_COMMANDS.COMPUTE_STOP, PROTOCOL_COMMANDS.COMPUTE_GET_STATUS, PROTOCOL_COMMANDS.COMPUTE_GET_RESULT, + PROTOCOL_COMMANDS.COMPUTE_GET_STREAMABLE_LOGS, PROTOCOL_COMMANDS.COMPUTE_INITIALIZE, PROTOCOL_COMMANDS.STOP_NODE, PROTOCOL_COMMANDS.REINDEX_TX, PROTOCOL_COMMANDS.REINDEX_CHAIN, PROTOCOL_COMMANDS.HANDLE_INDEXING_THREAD, PROTOCOL_COMMANDS.COLLECT_FEES, - PROTOCOL_COMMANDS.POLICY_SERVER_PASSTHROUGH + PROTOCOL_COMMANDS.POLICY_SERVER_PASSTHROUGH, + PROTOCOL_COMMANDS.GET_P2P_PEER, + PROTOCOL_COMMANDS.GET_P2P_PEERS, + PROTOCOL_COMMANDS.GET_P2P_NETWORK_STATS, + PROTOCOL_COMMANDS.FIND_PEER, + PROTOCOL_COMMANDS.CREATE_AUTH_TOKEN, + PROTOCOL_COMMANDS.INVALIDATE_AUTH_TOKEN, + PROTOCOL_COMMANDS.FETCH_CONFIG, + PROTOCOL_COMMANDS.PUSH_CONFIG, + PROTOCOL_COMMANDS.JOBS ] export const MetadataStates = { @@ -78,7 +98,11 @@ export const EVENTS = { TOKEN_URI_UPDATE: 'TokenURIUpdate', EXCHANGE_CREATED: 'ExchangeCreated', EXCHANGE_RATE_CHANGED: 'ExchangeRateChanged', - DISPENSER_CREATED: 'DispenserCreated' + DISPENSER_CREATED: 'DispenserCreated', + DISPENSER_ACTIVATED: 'DispenserActivated', + DISPENSER_DEACTIVATED: 'DispenserDeactivated', + EXCHANGE_ACTIVATED: 'ExchangeActivated', + EXCHANGE_DEACTIVATED: 'ExchangeDeactivated' } export const INDEXER_CRAWLING_EVENTS = { @@ -132,6 +156,22 @@ export const EVENT_HASHES: Hashes = { '0x7d0aa581e6eb87e15f58588ff20c39ff6622fc796ec9bb664df6ed3eb02442c9': { type: EVENTS.DISPENSER_CREATED, text: 'DispenserCreated(address,address,uint256,uint256,address)' + }, + '0xe9372084cb52c5392afee4b9d79d131e04b1e65676088d50a8f39fffb16a8745': { + type: EVENTS.DISPENSER_ACTIVATED, + text: 'DispenserActivated(address)' + }, + '0x393f01061139648745ea000bb047bbe1785bd3a19d3a9c90f6747e1d2357d2b8': { + type: EVENTS.DISPENSER_DEACTIVATED, + text: 'DispenserDeactivated(address)' + }, + '0xc7344c45124818d1d3a4c24ccb9b86d8b88d3bd05209b2a42b494cb32a503529': { + type: EVENTS.EXCHANGE_ACTIVATED, + text: 'ExchangeActivated(bytes32,address)' + }, + '0x03da9148e1de78fba22de63c573465562ebf6ef878a1d3ea83790a560229984c': { + type: EVENTS.EXCHANGE_DEACTIVATED, + text: 'ExchangeDeactivated(bytes32,address)' } } @@ -156,7 +196,12 @@ export const ENVIRONMENT_VARIABLES: Record = { value: process.env.HTTP_API_PORT, required: false }, - PRIVATE_KEY: { name: 'PRIVATE_KEY', value: process.env.PRIVATE_KEY, required: true }, + CONFIG_PATH: { + name: 'CONFIG_PATH', + value: process.env.CONFIG_PATH, + required: false + }, + PRIVATE_KEY: { name: 'PRIVATE_KEY', value: process.env.PRIVATE_KEY, required: true }, // required for now as we support only raw private keys // used on test environments (ci) NODE1_PRIVATE_KEY: { name: 'NODE1_PRIVATE_KEY', @@ -221,6 +266,11 @@ export const ENVIRONMENT_VARIABLES: Record = { value: process.env.AUTHORIZED_DECRYPTERS, required: false }, + AUTHORIZED_DECRYPTERS_LIST: { + name: 'AUTHORIZED_DECRYPTERS_LIST', + value: process.env.AUTHORIZED_DECRYPTERS_LIST, + required: false + }, OPERATOR_SERVICE_URL: { name: 'OPERATOR_SERVICE_URL', value: process.env.OPERATOR_SERVICE_URL, @@ -236,6 +286,11 @@ export const ENVIRONMENT_VARIABLES: Record = { value: process.env.ALLOWED_VALIDATORS, required: false }, + ALLOWED_VALIDATORS_LIST: { + name: 'ALLOWED_VALIDATORS_LIST', + value: process.env.ALLOWED_VALIDATORS_LIST, + required: false + }, INDEXER_INTERVAL: { name: 'INDEXER_INTERVAL', value: process.env.INDEXER_INTERVAL, @@ -251,6 +306,11 @@ export const ENVIRONMENT_VARIABLES: Record = { value: process.env.ALLOWED_ADMINS, required: false }, + ALLOWED_ADMINS_LIST: { + name: 'ALLOWED_ADMINS_LIST', + value: process.env.ALLOWED_ADMINS_LIST, + required: false + }, ASSET_PURGATORY_URL: { name: 'ASSET_PURGATORY_URL', value: process.env.ASSET_PURGATORY_URL, @@ -261,15 +321,22 @@ export const ENVIRONMENT_VARIABLES: Record = { value: process.env.ACCOUNT_PURGATORY_URL, required: false }, - DASHBOARD: { - name: 'DASHBOARD', - value: process.env.DASHBOARD, + CONTROL_PANEL: { + name: 'CONTROL_PANEL', + // keep this for backwards compatibility for now + value: process.env.CONTROL_PANEL || process.env.DASHBOARD, + required: false + }, + MAX_REQ_PER_MINUTE: { + // rate limit per minute (MAX requests per minute for a given IP or peer ID) + name: 'MAX_REQ_PER_MINUTE', + value: process.env.MAX_REQ_PER_MINUTE, required: false }, - MAX_REQ_PER_SECOND: { - // rate limit per second - name: 'MAX_REQ_PER_SECOND', - value: process.env.MAX_REQ_PER_SECOND, + MAX_CONNECTIONS_PER_MINUTE: { + // rate connections limit per minute (MAX requests per minute that the node will process) + name: 'MAX_CONNECTIONS_PER_MINUTE', + value: process.env.MAX_CONNECTIONS_PER_MINUTE, required: false }, RATE_DENY_LIST: { @@ -317,57 +384,143 @@ export const ENVIRONMENT_VARIABLES: Record = { name: 'DB_TYPE', value: process.env.DB_TYPE, required: false + }, + CRON_DELETE_DB_LOGS: { + name: 'CRON_DELETE_DB_LOGS', + value: process.env.CRON_DELETE_DB_LOGS, + required: false + }, + CRON_CLEANUP_C2D_STORAGE: { + name: 'CRON_CLEANUP_C2D_STORAGE', + value: process.env.CRON_CLEANUP_C2D_STORAGE, + required: false + }, + DOCKER_COMPUTE_ENVIRONMENTS: { + name: 'DOCKER_COMPUTE_ENVIRONMENTS', + value: process.env.DOCKER_COMPUTE_ENVIRONMENTS, + required: false + }, + DOCKER_SOCKET_PATH: { + name: 'DOCKER_SOCKET_PATH', + value: process.env.DOCKER_SOCKET_PATH, + required: false + }, + DOCKER_PROTOCOL: { + name: 'DOCKER_PROTOCOL', + value: process.env.DOCKER_PROTOCOL, + required: false + }, + DOCKER_HOST: { + name: 'DOCKER_HOST', + value: process.env.DOCKER_HOST, + required: false + }, + DOCKER_PORT: { + name: 'DOCKER_PORT', + value: process.env.DOCKER_PORT, + required: false + }, + DOCKER_CA_PATH: { + name: 'DOCKER_CA_PATH', + value: process.env.DOCKER_CA_PATH, + required: false + }, + DOCKER_CERT_PATH: { + name: 'DOCKER_CERT_PATH', + value: process.env.DOCKER_CERT_PATH, + required: false + }, + DOCKER_KEY_PATH: { + name: 'DOCKER_KEY_PATH', + value: process.env.DOCKER_KEY_PATH, + required: false + }, + IS_BOOTSTRAP: { + name: 'IS_BOOTSTRAP', + value: process.env.IS_BOOTSTRAP, + required: false + }, + AUTHORIZED_PUBLISHERS: { + name: 'AUTHORIZED_PUBLISHERS', + value: process.env.AUTHORIZED_PUBLISHERS, + required: false + }, + AUTHORIZED_PUBLISHERS_LIST: { + name: 'AUTHORIZED_PUBLISHERS_LIST', + value: process.env.AUTHORIZED_PUBLISHERS_LIST, + required: false + }, + POLICY_SERVER_URL: { + name: 'POLICY_SERVER_URL', + value: process.env.POLICY_SERVER_URL, + required: false + }, + VALIDATE_UNSIGNED_DDO: { + name: 'VALIDATE_UNSIGNED_DDO', + value: process.env.VALIDATE_UNSIGNED_DDO, + required: false + }, + P2P_ipV4BindAddress: { + name: 'P2P_ipV4BindAddress', + value: process.env.P2P_ipV4BindAddress, + required: false + }, + P2P_ipV4BindTcpPort: { + name: 'P2P_ipV4BindTcpPort', + value: process.env.P2P_ipV4BindTcpPort, + required: false + }, + P2P_ipV4BindWsPort: { + name: 'P2P_ipV4BindWsPort', + value: process.env.P2P_ipV4BindWsPort, + required: false + }, + P2P_ipV4BindWssPort: { + name: 'P2P_ipV4BindWssPort', + value: process.env.P2P_ipV4BindWssPort, + required: false + }, + P2P_ipV6BindAddress: { + name: 'P2P_ipV6BindAddress', + value: process.env.P2P_ipV6BindAddress, + required: false + }, + P2P_ipV6BindTcpPort: { + name: 'P2P_ipV6BindTcpPort', + value: process.env.P2P_ipV6BindTcpPort, + required: false + }, + P2P_ipV6BindWsPort: { + name: 'P2P_ipV6BindWsPort', + value: process.env.P2P_ipV6BindWsPort, + required: false + }, + P2P_MIN_CONNECTIONS: { + name: 'P2P_MIN_CONNECTIONS', + value: process.env.P2P_MIN_CONNECTIONS, + required: false + }, + P2P_MAX_CONNECTIONS: { + name: 'P2P_MAX_CONNECTIONS', + value: process.env.P2P_MAX_CONNECTIONS, + required: false + }, + HTTP_CERT_PATH: { + name: 'HTTP_CERT_PATH', + value: process.env.HTTP_CERT_PATH, + required: false + }, + HTTP_KEY_PATH: { + name: 'HTTP_KEY_PATH', + value: process.env.HTTP_KEY_PATH, + required: false } } - -// default to 3 requests per second (configurable) -export const DEFAULT_RATE_LIMIT_PER_SECOND = 3 +export const CONNECTION_HISTORY_DELETE_THRESHOLD = 300 +// 1 minute +export const CONNECTIONS_RATE_INTERVAL = 60 * 1000 // Typesense's maximum limit to send 250 hits at a time export const TYPESENSE_HITS_CAP = 250 export const DDO_IDENTIFIER_PREFIX = 'did:op:' // global ocean node API services path export const SERVICES_API_BASE_PATH = '/api/services' - -export const defaultBootstrapAddresses = [ - // Public IPFS bootstraps - // '/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ', - // '/dnsaddr/bootstrap.libp2p.io/ipfs/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN', - // '/dnsaddr/bootstrap.libp2p.io/ipfs/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa', - // OPF nodes - // node1 - '/dns4/node1.oceanprotocol.com/tcp/9000/p2p/16Uiu2HAmLhRDqfufZiQnxvQs2XHhd6hwkLSPfjAQg1gH8wgRixiP', - '/dns4/node1.oceanprotocol.com/tcp/9001/ws/p2p/16Uiu2HAmLhRDqfufZiQnxvQs2XHhd6hwkLSPfjAQg1gH8wgRixiP', - '/dns6/node1.oceanprotocol.com/tcp/9002/p2p/16Uiu2HAmLhRDqfufZiQnxvQs2XHhd6hwkLSPfjAQg1gH8wgRixiP', - '/dns6/node1.oceanprotocol.com/tcp/9003/ws/p2p/16Uiu2HAmLhRDqfufZiQnxvQs2XHhd6hwkLSPfjAQg1gH8wgRixiP', - // node 2 - '/dns4/node2.oceanprotocol.com/tcp/9000/p2p/16Uiu2HAmHwzeVw7RpGopjZe6qNBJbzDDBdqtrSk7Gcx1emYsfgL4', - '/dns4/node2.oceanprotocol.com/tcp/9001/ws/p2p/16Uiu2HAmHwzeVw7RpGopjZe6qNBJbzDDBdqtrSk7Gcx1emYsfgL4', - '/dns6/node2.oceanprotocol.com/tcp/9002/p2p/16Uiu2HAmHwzeVw7RpGopjZe6qNBJbzDDBdqtrSk7Gcx1emYsfgL4', - '/dns6/node2.oceanprotocol.com/tcp/9003/ws/p2p/16Uiu2HAmHwzeVw7RpGopjZe6qNBJbzDDBdqtrSk7Gcx1emYsfgL4', - // node 3 - '/dns4/node3.oceanprotocol.com/tcp/9000/p2p/16Uiu2HAmBKSeEP3v4tYEPsZsZv9VELinyMCsrVTJW9BvQeFXx28U', - '/dns4/node3.oceanprotocol.com/tcp/9001/ws/p2p/16Uiu2HAmBKSeEP3v4tYEPsZsZv9VELinyMCsrVTJW9BvQeFXx28U', - '/dns6/node3.oceanprotocol.com/tcp/9002/p2p/16Uiu2HAmBKSeEP3v4tYEPsZsZv9VELinyMCsrVTJW9BvQeFXx28U', - '/dns6/node3.oceanprotocol.com/tcp/9003/ws/p2p/16Uiu2HAmBKSeEP3v4tYEPsZsZv9VELinyMCsrVTJW9BvQeFXx28U', - // node 4 - '/dns4/node4.oceanprotocol.com/tcp/9000/p2p/16Uiu2HAmSTVTArioKm2wVcyeASHYEsnx2ZNq467Z4GMDU4ErEPom', - '/dns4/node4.oceanprotocol.com/tcp/9001/ws/p2p/16Uiu2HAmSTVTArioKm2wVcyeASHYEsnx2ZNq467Z4GMDU4ErEPom', - '/dns6/node4.oceanprotocol.com/tcp/9002/p2p/16Uiu2HAmSTVTArioKm2wVcyeASHYEsnx2ZNq467Z4GMDU4ErEPom', - '/dns6/node4.oceanprotocol.com/tcp/9003/ws/p2p/16Uiu2HAmSTVTArioKm2wVcyeASHYEsnx2ZNq467Z4GMDU4ErEPom' -] - -export const knownUnsafeURLs: string[] = [ - // AWS and GCP - '^.*(169.254.169.254).*', - // GCP - '^.*(metadata.google.internal).*', - '^.*(http://metadata).*', - // Azure - '^.*(http://169.254.169.254).*', - // Oracle Cloud - '^.*(http://192.0.0.192).*', - // Alibaba Cloud - '^.*(http://100.100.100.200).*', - // k8s ETCD - '^.*(127.0.0.1).*' -] diff --git a/src/utils/credentials.ts b/src/utils/credentials.ts index aeaccf3c3..d54692b4f 100644 --- a/src/utils/credentials.ts +++ b/src/utils/credentials.ts @@ -1,47 +1,320 @@ -import { Credential, Credentials } from '../@types/DDO/Credentials' - -export function findCredential( - credentials: Credential[], - consumerCredentials: Credential -) { - return credentials.find((credential) => { - if (Array.isArray(credential?.values)) { - if (credential.values.length > 0) { - const credentialType = String(credential?.type)?.toLowerCase() - const credentialValues = credential.values.map((v) => String(v)?.toLowerCase()) - return ( - credentialType === consumerCredentials.type && - credentialValues.includes(consumerCredentials.values[0]) +import { Signer } from 'ethers' +import { AccessListContract } from '../@types/OceanNode.js' +import { CORE_LOGGER } from './logging/common.js' +import { Credential, Credentials, MATCH_RULES } from '@oceanprotocol/ddo-js' +import { CREDENTIALS_TYPES } from '../@types/DDO/Credentials.js' +import { checkAddressOnAccessList } from './accessList.js' +import { isDefined } from './util.js' + +/** + * Main credential checking function with blockchain support for accessList checks + * + * @param consumerAddress The consumer address to check + * @param credentials The credentials object containing allow/deny rules + * @param blockchain Blockchain instance to get signer for on-chain checks + * @returns Promise - true if access is granted, false otherwise + * + * Logic: + * 1. If credentials are undefined/empty, allow access + * 2. Check DENY list first with match_deny strategy (default 'any'): + * - If match_deny='any' and ANY rule matches, DENY access + * - If match_deny='all' and ALL rules match, DENY access + * - Unknown types with match_deny='all' are ignored + * 3. Check ALLOW list with match_allow strategy (default 'all'): + * - If match_allow='any' and ANY rule matches, ALLOW access + * - If match_allow='all' and ALL rules match, ALLOW access + * - Unknown types with match_allow='all' cause DENY + * 4. If no allow list specified, ALLOW access + */ +export async function checkCredentials( + consumerAddress: string, + credentials: Credentials, + signer: Signer +): Promise { + // If credentials are undefined or empty, allow access + if (!isDefined(credentials)) { + return true + } + + const normalizedAddress = consumerAddress.toLowerCase() + // Get matching strategies (with defaults) + const matchDeny: MATCH_RULES = credentials.match_deny || 'any' + const matchAllow: MATCH_RULES = credentials.match_allow || 'all' + + // ======================================== + // STEP 1: Check DENY list (checked first) + // ======================================== + if (isDefined(credentials.deny) && credentials.deny.length > 0) { + const denyResult = await evaluateCredentialList( + credentials.deny, + normalizedAddress, + signer, + matchDeny, + 'deny' + ) + + // If evaluation says to deny, return false + if (denyResult.shouldDeny) { + CORE_LOGGER.logMessage( + `Access denied: Consumer address ${consumerAddress} matched deny rule(s)` + ) + return false + } + } + + // ======================================== + // STEP 2: Check ALLOW list + // ======================================== + if (isDefined(credentials.allow) && credentials.allow.length > 0) { + const allowResult = await evaluateCredentialList( + credentials.allow, + normalizedAddress, + signer, + matchAllow, + 'allow' + ) + + return allowResult.shouldAllow + } + + // No allow list specified, grant access by default + return true +} + +/** + * Evaluates a list of credentials (either allow or deny) + */ +async function evaluateCredentialList( + credentialList: Credential[], + consumerAddress: string, + signer: Signer, + matchRule: MATCH_RULES, + listType: 'allow' | 'deny' +): Promise<{ shouldAllow: boolean; shouldDeny: boolean }> { + const matchResults: boolean[] = [] + for (const credential of credentialList) { + const matchResult = await checkSingleCredential(credential, consumerAddress, signer) + + if (matchResult === null) { + // Unknown or unsupported credential type + + if (listType === 'allow' && matchRule === 'all') { + // Unknown type in allow list with match_all='all' -> DENY + CORE_LOGGER.warn( + `Unknown credential type '${credential.type}' in allow list with match_allow='all'. Access denied.` ) + return { shouldAllow: false, shouldDeny: false } } + // For deny list with match_all='all', unknown types are ignored + // For 'any' match, unknown types don't contribute to matching + } else { + matchResults.push(matchResult) } - return false - }) + } + + // No valid credential checks were performed + if (matchResults.length === 0) { + if (listType === 'allow') { + // No valid allow rules means deny + return { shouldAllow: false, shouldDeny: false } + } else { + // No valid deny rules means don't deny + return { shouldAllow: false, shouldDeny: false } + } + } + + // Apply matching strategy + if (listType === 'deny') { + let shouldDeny = false + if (matchRule === 'any') { + // If ANY rule matches, deny + shouldDeny = matchResults.some((r) => r === true) + } else { + // matchRule === 'all' + // If ALL rules match, deny + shouldDeny = matchResults.every((r) => r === true) + } + return { shouldAllow: false, shouldDeny } + } else { + // listType === 'allow' + let shouldAllow = false + if (matchRule === 'any') { + // If ANY rule matches, allow + shouldAllow = matchResults.some((r) => r === true) + } else { + // matchRule === 'all' + // ALL rules must match + shouldAllow = matchResults.every((r) => r === true) + } + return { shouldAllow, shouldDeny: false } + } } /** - * This method checks credentials - * @param credentials credentials - * @param consumerAddress consumer address + * Checks if a consumer address matches a single credential rule + * + * @param credential The credential rule to check + * @param consumerAddress The consumer address (already normalized) + * @param signer Signer for blockchain checks + * @returns Promise - true if matches, false if doesn't match, null if unknown type */ -export function checkCredentials(credentials: Credentials, consumerAddress: string) { - const consumerCredentials = { - type: 'address', - values: [String(consumerAddress)?.toLowerCase()] - } - // check deny access - if (Array.isArray(credentials?.deny) && credentials.deny.length > 0) { - const accessDeny = findCredential(credentials.deny, consumerCredentials) - if (accessDeny) { +export async function checkSingleCredential( + credential: Credential, + consumerAddress: string, + signer: Signer | null +): Promise { + const credentialType = credential.type.toLowerCase() + + // ======================================== + // Handle ADDRESS-based credentials + // ======================================== + if (credentialType === CREDENTIALS_TYPES.ADDRESS.toLowerCase()) { + // Type assertion since we know it's address type + const addressCredential = credential as any + + if (!isDefined(addressCredential.values) || addressCredential.values.length === 0) { return false } + + // Check for wildcard (*) + const hasWildcard = addressCredential.values.some( + (value: string) => value.toLowerCase() === '*' + ) + if (hasWildcard) { + return true + } + + // Check if address is in the list + const normalizedValues = addressCredential.values.map((v: string) => v.toLowerCase()) + return normalizedValues.includes(consumerAddress.toLowerCase()) } - // check allow access - if (Array.isArray(credentials?.allow) && credentials.allow.length > 0) { - const accessAllow = findCredential(credentials.allow, consumerCredentials) - if (!accessAllow) { + + // ======================================== + // Handle ACCESSLIST-based credentials + // ======================================== + if (credentialType === CREDENTIALS_TYPES.ACCESS_LIST.toLowerCase()) { + const accessListCredential = credential as any + + // AccessList credentials need a contract address to check + if (!isDefined(accessListCredential.accessList)) { + CORE_LOGGER.warn('AccessList credential missing accessList contract address') return false } + + try { + // Check if the consumer address has tokens in the access list contract + const hasAccess = await checkAddressOnAccessList( + accessListCredential.accessList, + consumerAddress, + signer + ) + return hasAccess + } catch (error) { + CORE_LOGGER.error(`Error checking accessList credential: ${error.message}`) + return false + } + } + + // ======================================== + // Handle VERIFIABLE CREDENTIAL (future support) + // ======================================== + if (credentialType === 'verifiablecredential') { + CORE_LOGGER.warn('VerifiableCredential type is not yet supported') + return null // Unknown/unsupported type + } + + // ======================================== + // Unknown credential type + // ======================================== + CORE_LOGGER.warn(`Unknown credential type: ${credential.type}`) + return null +} + +/** + * Checks credential on multi-chain access list + * @param accessList the access list contract addresses by chain + * @param chainId the chain id to check + * @param addressToCheck the account address to check on the access list + * @param signer signer for the contract part + * @returns true if the account has balanceOf > 0 OR if the accessList is empty OR does not contain info for this chain, false otherwise + */ +export async function checkCredentialOnAccessList( + accessList: AccessListContract, + chainId: string, + addressToCheck: string, + signer: Signer +): Promise { + if (!accessList) { + return true + } + const chainsListed = Object.keys(accessList) + // check the access lists for this chain + if (chainsListed.length > 0 && chainsListed.includes(chainId)) { + let isAuthorized = false + for (const accessListAddress of accessList[chainId]) { + const result = await checkAddressOnAccessList( + accessListAddress, + addressToCheck, + signer + ) + if (result) { + isAuthorized = true + break + } + } + if (!isAuthorized) { + CORE_LOGGER.error( + `Account ${addressToCheck} is NOT part of the given access list group.` + ) + } + return isAuthorized } return true } + +/** + * Gets all addresses present on the contract access list (the ones with balanceOf >= 1) + * @param contractAcessList The access list contract + * @param chainId The chain ID + * @param startBlock Optional start block + * @param endBlock Optional end block + * @returns Array of addresses that have access + +export async function getAccountsFromAccessList( + contractAcessList: Contract, + chainId: number, + startBlock?: number, + endBlock?: number +): Promise { + const resultAccounts: string[] = [] + const networkArtifacts = getOceanArtifactsAdressesByChainId(chainId) + // some basic extra checks + if (!networkArtifacts || (startBlock && endBlock && endBlock < startBlock)) { + return resultAccounts + } + + try { + const eventLogs: Array = (await contractAcessList.queryFilter( + 'AddressAdded', + startBlock || networkArtifacts.startBlock, + endBlock || 'latest' + )) as Array + for (const log of eventLogs) { + // check the account address + if (log.args.length === 2 && Number(log.args[1]) >= 1) { + const address: string = log.args[0] + // still has it? + const balance = await contractAcessList.balanceOf(address) + if (Number(balance) >= 1) { + resultAccounts.push(address) + } + } + } + } catch (e) { + CORE_LOGGER.error( + `Cannot get accounts from accessList ${contractAcessList}: \n${e.message}` + ) + } + return resultAccounts +} + */ diff --git a/src/utils/cronjobs/p2pAnnounceC2D.ts b/src/utils/cronjobs/p2pAnnounceC2D.ts new file mode 100644 index 000000000..b1142b6b0 --- /dev/null +++ b/src/utils/cronjobs/p2pAnnounceC2D.ts @@ -0,0 +1,100 @@ +import { OceanNode } from '../../OceanNode.js' +// import { P2P_LOGGER } from '../logging/common.js' +const GB = 1024 * 1024 * 1024 // 1 GB in bytes + +export async function p2pAnnounceC2D(node: OceanNode) { + const announce: any[] = [] + const computeEngines = node.getC2DEngines() + const result = await computeEngines.fetchEnvironments() + for (const env of result) { + for (const resource of env.resources) { + switch (resource.type) { + case 'cpu': + case 'gpu': + // For CPU and GPU, we assume the min and max are in terms of cores + // and we generate announcements for each core count in the range + for (let i = resource.min ? resource.min : 1; i <= resource.max; i++) { + const obj: Record = {} + obj.free = false + obj[resource.type] = i + if (!announce.includes(obj)) { + announce.push(obj) + } + if (resource.type === 'gpu' && resource.kind) { + obj.description = resource.description // add kind if available + if (!announce.includes(obj)) { + announce.push(obj) + } + } + } + break + case 'ram': + case 'disk': + for (let i = resource.min; i <= resource.max; i += GB) { + const obj: Record = {} + obj.free = false + obj[resource.type] = Math.round(i / GB) + if (!announce.includes(obj) && obj[resource.type] > 0) { + announce.push(obj) + } + } + break + } + } + for (const resource of env.free.resources) { + let min = 0 + let kind = null + let type = null + // we need to get the min from resources + for (const res of env.resources) { + if (res.id === resource.id) { + ;({ min } = res) + ;({ kind } = res) + ;({ type } = res) + } + } + + switch (type) { + case 'cpu': + case 'gpu': + // For CPU and GPU, we assume the min and max are in terms of cores + // and we generate announcements for each core count in the range + // if min is not defined, we assume it is 1 + for (let i = min || 1; i <= resource.max; i++) { + const obj: Record = {} + obj.free = true + obj[type] = i + if (!announce.includes(obj)) { + announce.push(obj) + } + if (type === 'gpu' && kind) { + obj.kind = kind // add kind if available + if (!announce.includes(obj)) { + announce.push(obj) + } + } + } + break + + case 'ram': + case 'disk': + for (let i = min; i <= resource.max; i += GB) { + const obj: Record = {} + obj.free = true + obj[type] = Math.round(i / GB) + if (!announce.includes(obj) && obj[type] > 0) { + announce.push(obj) + } + } + break + } + } + } + // now announce all resources to p2p network + for (const obj of announce) { + const res = { + c2d: obj + } + node.getP2PNode().advertiseString(JSON.stringify(res)) + } +} diff --git a/src/utils/cronjobs/p2pAnnounceDDOS.ts b/src/utils/cronjobs/p2pAnnounceDDOS.ts new file mode 100644 index 000000000..30cf716de --- /dev/null +++ b/src/utils/cronjobs/p2pAnnounceDDOS.ts @@ -0,0 +1,39 @@ +// republish the ddos we have +// related: https://github.com/libp2p/go-libp2p-kad-dht/issues/323 + +import { OceanNode } from '../../OceanNode.js' +import { P2P_LOGGER } from '../logging/common.js' + +export async function p2pAnnounceDDOS(node: OceanNode) { + try { + const db = node.getDatabase() + const p2pNode = node.getP2PNode() + if (!db || !db.ddo) { + P2P_LOGGER.info( + `republishStoredDDOS() attempt aborted because there is no database!` + ) + return + } + const ddoDb = db.ddo + const searchParameters = { + q: '*' + } + + const result: any = await ddoDb.search(searchParameters) + if (result && result.length > 0 && result[0].found) { + P2P_LOGGER.logMessage(`Will republish cid for ${result[0].found} documents`, true) + result[0].hits.forEach((hit: any) => { + const ddo = hit.document + p2pNode.advertiseString(ddo.id) + p2pNode.cacheDDO(ddo) + + // todo check stuff like purgatory + }) + // update time + } else { + P2P_LOGGER.logMessage('There is nothing to republish, skipping...', true) + } + } catch (err) { + P2P_LOGGER.error(`Caught "${err.message}" on republishStoredDDOS()`) + } +} diff --git a/src/utils/cronjobs/scheduleCronJobs.ts b/src/utils/cronjobs/scheduleCronJobs.ts new file mode 100644 index 000000000..776edc451 --- /dev/null +++ b/src/utils/cronjobs/scheduleCronJobs.ts @@ -0,0 +1,82 @@ +// scheduleCronJobs.ts + +import { Database } from '../../components/database/index.js' +import { OceanNode } from '../../OceanNode.js' +import { ENVIRONMENT_VARIABLES } from '../constants.js' +import { OCEAN_NODE_LOGGER } from '../logging/common.js' +import * as cron from 'node-cron' +import { p2pAnnounceDDOS } from './p2pAnnounceDDOS.js' +import { p2pAnnounceC2D } from './p2pAnnounceC2D.js' +import { sleep } from '../util.js' + +// republish any ddos we are providing to the network every 4 hours +// (we can put smaller interval for testing purposes) +const REPUBLISH_INTERVAL_HOURS = 1000 * 60 * 60 * 4 // 4 hours + +export async function scheduleCronJobs(node: OceanNode) { + await sleep(2000) // wait for 2 seconds to ensure the node is fully initialized + try { + scheduleDeleteLogsJob(node.getDatabase()) + } catch (e) { + OCEAN_NODE_LOGGER.error(`Error when deleting old logs: ${e.message}`) + } + try { + scheduleCleanExpiredC2DJobs(node.getDatabase()) + } catch (e) { + OCEAN_NODE_LOGGER.error(`Error when deleting expired c2d jobs: ${e.message}`) + } + // execute p2pAnnounceDDOS immediately on startup + // and then every REPUBLISH_INTERVAL_HOURS + p2pAnnounceDDOS(node) + setInterval(() => p2pAnnounceDDOS(node), REPUBLISH_INTERVAL_HOURS) + + // execute p2pAnnounceC2D immediately on startup + // and then every REPUBLISH_INTERVAL_HOURS + p2pAnnounceC2D(node) + setInterval(() => p2pAnnounceC2D(node), REPUBLISH_INTERVAL_HOURS) +} + +function scheduleDeleteLogsJob(dbconn: Database | null) { + // Schedule the cron job to run daily at midnight + + if (dbconn && dbconn.logs) { + const expression = + process.env[ENVIRONMENT_VARIABLES.CRON_DELETE_DB_LOGS.name] || '0 0 * * *' + cron.schedule(expression, async () => { + try { + const deletedLogsNum = await dbconn.logs.deleteOldLogs() + OCEAN_NODE_LOGGER.logMessage( + `${deletedLogsNum} old logs deleted successfully.`, + true + ) + } catch (err) { + OCEAN_NODE_LOGGER.error(`Error deleting old logs: ${err.message}`) + } + }) + } else { + OCEAN_NODE_LOGGER.warn( + 'Logs CronJob: Database connection not established or logs instance not available (skipped).' + ) + } +} + +function scheduleCleanExpiredC2DJobs(dbconn: Database | null) { + // Schedule the cron job to run every 5 minutes or whatever specified + + if (dbconn && dbconn.c2d) { + const expression = + process.env[ENVIRONMENT_VARIABLES.CRON_CLEANUP_C2D_STORAGE.name] || '*/5 * * * *' + cron.schedule(expression, async () => { + try { + const deleted = await dbconn.c2d.cleanStorageExpiredJobs() + OCEAN_NODE_LOGGER.info(`${deleted} expired C2D jobs cleaned successfully.`) + } catch (err) { + OCEAN_NODE_LOGGER.error(`Error deleting expired jobs: ${err.message}`) + } + }) + } else { + OCEAN_NODE_LOGGER.warn( + 'C2D CronJob: Database connection not established or C2D instance not available (skipped).' + ) + } +} diff --git a/src/utils/crypt.ts b/src/utils/crypt.ts index daa755b2f..7e9f3f37d 100644 --- a/src/utils/crypt.ts +++ b/src/utils/crypt.ts @@ -1,7 +1,7 @@ import eciesjs from 'eciesjs' +import { EncryptMethod } from '../@types/fileObject.js' import crypto from 'crypto' import { getConfiguration } from './config.js' -import { EncryptMethod } from '../@types/fileObject.js' /** * This method encrypts data according to a given algorithm using node keys @@ -19,11 +19,11 @@ export async function encrypt( // use first 16 bytes of public key as an initialisation vector const initVector = publicKey.subarray(0, 16) // creates cipher object, with the given algorithm, key and initialization vector - const cipher = crypto.createCipheriv('aes-256-cbc', privateKey, initVector) + const cipher = crypto.createCipheriv('aes-256-cbc', privateKey.raw, initVector) // encoding is ignored because we are working with bytes and want to return a buffer encryptedData = Buffer.concat([cipher.update(data), cipher.final()]) } else if (algorithm === EncryptMethod.ECIES) { - const sk = new eciesjs.PrivateKey(privateKey) + const sk = new eciesjs.PrivateKey(privateKey.raw) // get public key from Elliptic curve encryptedData = eciesjs.encrypt(sk.publicKey.toHex(), data) } @@ -47,16 +47,17 @@ export async function decrypt( const initVector = publicKey.subarray(0, 16) // creates decipher object, with the given algorithm, key and initialization vector - const decipher = crypto.createDecipheriv('aes-256-cbc', privateKey, initVector) + const decipher = crypto.createDecipheriv('aes-256-cbc', privateKey.raw, initVector) // encoding is ignored because we are working with bytes and want to return a buffer decryptedData = Buffer.concat([decipher.update(data), decipher.final()]) } else if (algorithm === EncryptMethod.ECIES) { - const sk = new eciesjs.PrivateKey(privateKey) + const sk = new eciesjs.PrivateKey(privateKey.raw) decryptedData = eciesjs.decrypt(sk.secret, data) } return decryptedData } + // this can be handy as we do this kind of hash in multiple places export function create256Hash(input: string): string { const result = crypto.createHash('sha256').update(input).digest('hex') diff --git a/src/utils/database.ts b/src/utils/database.ts index 1d3a5ec60..b87de11a8 100644 --- a/src/utils/database.ts +++ b/src/utils/database.ts @@ -13,7 +13,7 @@ export async function getDatabase(forceReload: boolean = false): Promise `${info.timestamp} ${info.level}: ${info.message.trim()}` + (info) => `${info.timestamp} ${info.level}: ${(info.message as string).trim()}` ) ) const consoleColorFormatting: winston.Logform.Format | Record = { diff --git a/src/utils/logging/logDeleteCron.ts b/src/utils/logging/logDeleteCron.ts deleted file mode 100644 index 80bc7d49a..000000000 --- a/src/utils/logging/logDeleteCron.ts +++ /dev/null @@ -1,23 +0,0 @@ -// scheduleCronJobs.ts - -import { Database } from '../../components/database/index.js' -import { OCEAN_NODE_LOGGER } from './common.js' -import * as cron from 'node-cron' - -export function scheduleCronJobs(dbconn: Database | null) { - // Schedule the cron job to run daily at midnight - cron.schedule('0 0 * * *', async () => { - if (dbconn && dbconn.logs) { - const deletedLogsNum = await dbconn.logs.deleteOldLogs() - OCEAN_NODE_LOGGER.logMessage( - `${deletedLogsNum} old logs deleted successfully.`, - true - ) - } else { - OCEAN_NODE_LOGGER.logMessage( - 'Database connection not established or logs instance not available.', - true - ) - } - }) -} diff --git a/src/utils/util.ts b/src/utils/util.ts index e16351c7f..16c73fb85 100644 --- a/src/utils/util.ts +++ b/src/utils/util.ts @@ -81,6 +81,14 @@ export function fetchEventFromTransaction( } } +export async function streamToUint8Array(stream: Readable): Promise { + const chunks: Buffer[] = [] + for await (const chunk of stream) { + chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)) + } + return new Uint8Array(Buffer.concat(chunks)) +} + // Helper function to read from a stream export function readStream(stream: Stream): Promise { return new Promise((resolve, reject) => { @@ -145,3 +153,22 @@ export function asyncCallWithTimeout( export function isDefined(something: any): boolean { return something !== undefined && something !== null } + +export function deleteKeysFromObject(source: any, keys: string[]): any { + keys.forEach((keyName) => { + if (keyName in source) { + delete source[keyName] + } + }) + return source +} + +export function convertGigabytesToBytes(gigabytes: number): number { + if (gigabytes < 0) { + throw new Error('Input must be a non-negative number') + } + + const bytesInAGigabyte = 1024 ** 3 // 1 gigabyte = 1024^3 bytes + const bytes = gigabytes * bytesInAGigabyte + return bytes +} diff --git a/src/utils/validators.ts b/src/utils/validators.ts index 7c45f15c1..d99d45d12 100644 --- a/src/utils/validators.ts +++ b/src/utils/validators.ts @@ -1,6 +1,20 @@ import { ConsumerParameter } from '../@types/DDO/ConsumerParameter.js' +import { OceanNodeConfig } from '../@types/OceanNode.js' import { ValidateParams } from '../components/httpRoutes/validateCommands.js' +import { RequestLimiter } from '../OceanNode.js' import { CORE_LOGGER } from './logging/common.js' +import { CONNECTIONS_RATE_INTERVAL } from './constants.js' +import { DEFAULT_MAX_CONNECTIONS_PER_MINUTE } from './index.js' + +// TODO we should group common stuff, +// we have multiple similar validation interfaces +export interface CommonValidation { + valid: boolean + error?: string +} + +// hold data about last request made +const connectionsData = new Map() function checkString(value: any) { return typeof value === 'string' || value instanceof String @@ -18,6 +32,68 @@ function checkObject(value: any) { return typeof value === 'object' && value !== null && !Array.isArray(value) } +export function checkRequestsRateLimit( + requestIP: string, + configuration: OceanNodeConfig, + now: number +): CommonValidation { + const limit = configuration.rateLimit + let clientData = connectionsData.get(requestIP) + + if (!clientData || clientData === undefined) { + clientData = { + lastRequestTime: now, + requester: requestIP, + numRequests: 1 + } + connectionsData.set(requestIP, clientData) + return { valid: true, error: '' } + } + + const timeSinceLastRequest = now - clientData.lastRequestTime + const windowExpired = timeSinceLastRequest > CONNECTIONS_RATE_INTERVAL + + if (clientData.numRequests >= limit && !windowExpired) { + const waitTime = Math.ceil((CONNECTIONS_RATE_INTERVAL - timeSinceLastRequest) / 1000) + return { + valid: false, + error: `Rate limit exceeded. Try again in ${waitTime} seconds.` + } + } + + if (windowExpired) { + clientData.numRequests = 1 + clientData.lastRequestTime = now + return { valid: true, error: '' } + } + + clientData.numRequests += 1 + return { valid: true, error: '' } +} + +export function checkGlobalConnectionsRateLimit( + configuration: OceanNodeConfig, + now: number +): CommonValidation { + const maxConnections = + configuration.maxConnections || DEFAULT_MAX_CONNECTIONS_PER_MINUTE + let activeRequesters = 0 + + for (const [, clientData] of connectionsData.entries()) { + if (now - clientData.lastRequestTime <= CONNECTIONS_RATE_INTERVAL) { + activeRequesters += 1 + } + } + const valid = activeRequesters <= maxConnections + + return { + valid, + error: valid + ? '' + : `Too many active connections (${activeRequesters}/${maxConnections}) in the last minute.` + } +} + export function validateConsumerParameters( ddoConsumerParameters: ConsumerParameter | ConsumerParameter[], userSentObject: any | any[] diff --git a/tsconfig.json b/tsconfig.json index 0014e9e08..405c8ef30 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "esnext", - "target": "ES2022", + "target": "es2022", "moduleResolution": "node", "esModuleInterop": true, "resolveJsonModule": true,