From cddecc915ba3af3081862520fcd557989c66bbcc Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 9 Jan 2026 21:55:09 -0600 Subject: [PATCH 01/77] feat(ertp-ledgerguise): scaffold package with failing ERTP test --- packages/ertp-ledgerguise/AGENTS.md | 1 + packages/ertp-ledgerguise/CONTRIBUTING.md | 74 + packages/ertp-ledgerguise/README.md | 23 + packages/ertp-ledgerguise/package-lock.json | 3124 +++++++++++++++++ packages/ertp-ledgerguise/package.json | 31 + packages/ertp-ledgerguise/src/index.ts | 10 + .../ertp-ledgerguise/test/ledgerguise.test.ts | 31 + packages/ertp-ledgerguise/tsconfig.json | 14 + .../ertp-ledgerguise/tsconfig.tsbuildinfo | 1 + 9 files changed, 3309 insertions(+) create mode 120000 packages/ertp-ledgerguise/AGENTS.md create mode 100644 packages/ertp-ledgerguise/CONTRIBUTING.md create mode 100644 packages/ertp-ledgerguise/README.md create mode 100644 packages/ertp-ledgerguise/package-lock.json create mode 100644 packages/ertp-ledgerguise/package.json create mode 100644 packages/ertp-ledgerguise/src/index.ts create mode 100644 packages/ertp-ledgerguise/test/ledgerguise.test.ts create mode 100644 packages/ertp-ledgerguise/tsconfig.json create mode 100644 packages/ertp-ledgerguise/tsconfig.tsbuildinfo diff --git a/packages/ertp-ledgerguise/AGENTS.md b/packages/ertp-ledgerguise/AGENTS.md new file mode 120000 index 0000000..eada936 --- /dev/null +++ b/packages/ertp-ledgerguise/AGENTS.md @@ -0,0 +1 @@ +CONTRIBUTING.md \ No newline at end of file diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md new file mode 100644 index 0000000..14ffe09 --- /dev/null +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -0,0 +1,74 @@ +# CONTRIBUTING + +Thanks for your interest in contributing! This package provides an ERTP facade over a GnuCash SQLite database. These notes apply to contributors, including agents. + +## Background + +- Agoric PR: "SPIKE: toward correct-by-construction Zoe2 escrow" (#8184) https://github.com/Agoric/agoric-sdk/pull/8184 + - Relevant ERTP note: mint/purse patterns and amount math are treated as stable, foundational properties for escrow reasoning. +- Vbank bridge flow: `packages/cosmic-swingset/README-bridge.md` in agoric-sdk (ERTP transfer via vbank). + +## Scope + +- Keep changes limited to this package unless the user asks for cross-package updates. +- Prefer small, targeted edits; avoid refactors unless explicitly requested. + +## Data and DB safety + +- Treat the GnuCash SQLite file as production-like data; do not run destructive SQL. +- When inspecting schema/data, use read-only queries. +- Do not migrate or alter schemas unless explicitly requested. +- TODO: set migrations aside for now; start with in-memory databases. + +## Code style + +- Follow existing patterns in this package. +- Add succinct comments only when logic is non-obvious. +- Keep files ASCII unless the file already uses Unicode. + +## Testing + +- If tests exist, prefer the smallest relevant test(s). +- Never create or modify real ledger data during tests; use fixtures or in-memory DBs when possible. + +## Tooling + +- Use `rg` for searches. +- Avoid network access unless explicitly requested. + +## Agent Tactics + +- Always check for static errors before running tests. +- Always run all tests relevant to any code changes before asking the user for further input. +- Prefer avoiding mutable `let` for tests; use an IIFE or other pattern so types can be inferred. +- Freeze API surface before use: any object literal, array literal, or function literal that escapes its creation context should be frozen (use `const { freeze } = Object;` and `freeze(...)`). Source: Jessie README, "Must freeze API Surface Before Use": https://github.com/endojs/Jessie/blob/main/README.md +- Only freeze values you create (literals/functions). Do not freeze objects you receive from elsewhere (e.g., kit or purse objects returned by libraries); treat them as already-sealed API surfaces. +- TODO: add static analysis to enforce API surface freezing. + +## IBIS: Sync vs async DB access + +Issue: Should the GnuCash-backed ERTP facade use synchronous or asynchronous DB access? + +Position A (sync DB access): +- Closer to ERTP's synchronous semantics (e.g., brand/purse/amount operations are typically sync). +- Easier to reason about atomicity in a single vat/turn; fewer interleavings. +- Aligns with Node bindings like `better-sqlite3` and some WASM in-memory modes. + +Position B (async DB access): +- Required in many environments (Cloudflare Workers/D1, OPFS-backed WASM, remote sqlite). +- Matches vbank's observed split: synchronous "grab/give" bridge calls, but asynchronous balance updates (end_block). +- Avoids blocking the event loop in hosted environments; better scalability. + +Discussion: +- ERTP APIs are sync, but can be backed by async IO by pushing IO to injected capabilities and keeping synchronous facade operations limited to preloaded or cached data. +- A hybrid model is possible: sync for hot reads/derived state, async for persistence and reconciliation, similar to vbank's immediate bridge actions plus later balance update notifications. + +Decision: Start with synchronous DB access, but keep IO injected so async backends can be added later. + +Consequences: +- Tests should allow in-memory sync adapters first, with async-capable adapters introduced later. +- The facade should avoid hidden filesystem opens; pass DB capabilities explicitly (ocap discipline). + +## Documentation + +- Update package docs or README when behavior or public API changes. diff --git a/packages/ertp-ledgerguise/README.md b/packages/ertp-ledgerguise/README.md new file mode 100644 index 0000000..6b78703 --- /dev/null +++ b/packages/ertp-ledgerguise/README.md @@ -0,0 +1,23 @@ +# ertp-ledgerguise + +ERTP-compatible facade over a GnuCash SQLite database. + +## Goals + +- Provide ERTP-like interfaces (issuer, brand, purse, payment, amount) backed by GnuCash data. +- Keep persistence in the GnuCash sqlite file without introducing a separate durable store. +- Make it feasible to swap an ERTP surface onto existing GnuCash ledgers. + +## Non-goals + +- Schema migrations or destructive DB changes. +- A new UI or a full GnuCash replacement. +- Automated bank/card syncing (handled elsewhere in finquick). + +## Status + +Early sketch; API surface and mappings are expected to evolve. + +## Name + +"Ledgerguise" hints at an ERTP exterior wrapping a GnuCash ledger interior. diff --git a/packages/ertp-ledgerguise/package-lock.json b/packages/ertp-ledgerguise/package-lock.json new file mode 100644 index 0000000..b31383b --- /dev/null +++ b/packages/ertp-ledgerguise/package-lock.json @@ -0,0 +1,3124 @@ +{ + "name": "@finquick/ertp-ledgerguise", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@finquick/ertp-ledgerguise", + "version": "0.0.1", + "dependencies": { + "@agoric/ertp": "*", + "better-sqlite3": "^12.6.0" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.1", + "ava": "^5.3.1", + "ts-node": "^10.9.2", + "typescript": "~5.9.3" + } + }, + "node_modules/@agoric/base-zone": { + "version": "0.2.0-u22.1", + "resolved": "https://registry.npmjs.org/@agoric/base-zone/-/base-zone-0.2.0-u22.1.tgz", + "integrity": "sha512-8NTFVvpgbNxYY4CU3iaRBXR1TOJ/qoz1zJW8on10wxmxSZF1/upPRX7vYOXSnfNa6RXnKYtQuF7Ub56i2xualQ==", + "license": "Apache-2.0", + "dependencies": { + "@agoric/store": "0.10.0-u22.1", + "@endo/common": "^1.2.13", + "@endo/errors": "^1.2.13", + "@endo/exo": "^1.5.12", + "@endo/far": "^1.1.14", + "@endo/pass-style": "^1.6.3", + "@endo/patterns": "^1.7.0" + }, + "engines": { + "node": "^20.9 || ^22.11" + } + }, + "node_modules/@agoric/ertp": { + "version": "0.17.0-u22.2", + "resolved": "https://registry.npmjs.org/@agoric/ertp/-/ertp-0.17.0-u22.2.tgz", + "integrity": "sha512-GuAeA1Stzo/TBYVyZIV/E+Jdhhv1/17H1n76tuN73Ab+Q04CZKC3ynHIHz4T60wQv+3OLyyJ7qA3LVGGBCMZRw==", + "license": "Apache-2.0", + "dependencies": { + "@agoric/notifier": "0.7.0-u22.2", + "@agoric/store": "0.10.0-u22.1", + "@agoric/vat-data": "0.6.0-u22.2", + "@agoric/zone": "0.3.0-u22.2", + "@endo/errors": "^1.2.13", + "@endo/eventual-send": "^1.3.4", + "@endo/far": "^1.1.14", + "@endo/marshal": "^1.8.0", + "@endo/nat": "^5.1.3", + "@endo/patterns": "^1.7.0", + "@endo/promise-kit": "^1.1.13" + }, + "engines": { + "node": "^20.9 || ^22.11" + } + }, + "node_modules/@agoric/internal": { + "version": "0.4.0-u22.2", + "resolved": "https://registry.npmjs.org/@agoric/internal/-/internal-0.4.0-u22.2.tgz", + "integrity": "sha512-AthCoZpId1RSAibdi1+PnFeQ3T4Zy2TjdaResfWdAge5fEBMa3NLNnYJhMFV6ijrYFyLr/XbhVO20crRje+5Kw==", + "license": "Apache-2.0", + "dependencies": { + "@agoric/base-zone": "0.2.0-u22.1", + "@endo/common": "^1.2.13", + "@endo/compartment-mapper": "^1.6.3", + "@endo/errors": "^1.2.13", + "@endo/eventual-send": "^1.3.4", + "@endo/far": "^1.1.14", + "@endo/init": "^1.1.12", + "@endo/marshal": "^1.8.0", + "@endo/nat": "^5.1.3", + "@endo/pass-style": "^1.6.3", + "@endo/patterns": "^1.7.0", + "@endo/promise-kit": "^1.1.13", + "@endo/stream": "^1.2.13", + "anylogger": "^0.21.0", + "jessie.js": "^0.3.4" + }, + "engines": { + "node": "^20.9 || ^22.11" + } + }, + "node_modules/@agoric/notifier": { + "version": "0.7.0-u22.2", + "resolved": "https://registry.npmjs.org/@agoric/notifier/-/notifier-0.7.0-u22.2.tgz", + "integrity": "sha512-Rpp5V/MdW4YLwyBoN/Mie0Rd9wMHMobYFtXiqHZCqGmukRjd+srl0u7B27gE2pMiGAPAjNXKILyVAc1838gyPw==", + "license": "Apache-2.0", + "dependencies": { + "@agoric/internal": "0.4.0-u22.2", + "@agoric/vat-data": "0.6.0-u22.2", + "@endo/errors": "^1.2.13", + "@endo/far": "^1.1.14", + "@endo/marshal": "^1.8.0", + "@endo/patterns": "^1.7.0", + "@endo/promise-kit": "^1.1.13" + }, + "engines": { + "node": "^20.9 || ^22.11" + } + }, + "node_modules/@agoric/store": { + "version": "0.10.0-u22.1", + "resolved": "https://registry.npmjs.org/@agoric/store/-/store-0.10.0-u22.1.tgz", + "integrity": "sha512-Ff2/AvwYEnx2VTavZlN+OgmcOSXtsHgrS+UjxfU+hTpblrgGlnjHl9MFRKbOx5j23yZ5QXJ7rFuZfpPm85hwZg==", + "license": "Apache-2.0", + "dependencies": { + "@endo/errors": "^1.2.13", + "@endo/exo": "^1.5.12", + "@endo/marshal": "^1.8.0", + "@endo/pass-style": "^1.6.3", + "@endo/patterns": "^1.7.0" + }, + "engines": { + "node": "^20.9 || ^22.11" + } + }, + "node_modules/@agoric/swingset-liveslots": { + "version": "0.11.0-u22.2", + "resolved": "https://registry.npmjs.org/@agoric/swingset-liveslots/-/swingset-liveslots-0.11.0-u22.2.tgz", + "integrity": "sha512-/3lGNtpAx5nsu9NchiNa5uG1Fj5+eV10GlZIk7lD0CE/cUwUm1l7Ky6wOq44Ku8FbdS3pBtK1wcTsmA3M+gJSA==", + "license": "Apache-2.0", + "dependencies": { + "@agoric/internal": "0.4.0-u22.2", + "@agoric/store": "0.10.0-u22.1", + "@endo/env-options": "^1.1.11", + "@endo/errors": "^1.2.13", + "@endo/eventual-send": "^1.3.4", + "@endo/exo": "^1.5.12", + "@endo/far": "^1.1.14", + "@endo/init": "^1.1.12", + "@endo/marshal": "^1.8.0", + "@endo/nat": "^5.1.3", + "@endo/pass-style": "^1.6.3", + "@endo/patterns": "^1.7.0", + "@endo/promise-kit": "^1.1.13" + }, + "engines": { + "node": "^20.9 || ^22.11" + } + }, + "node_modules/@agoric/vat-data": { + "version": "0.6.0-u22.2", + "resolved": "https://registry.npmjs.org/@agoric/vat-data/-/vat-data-0.6.0-u22.2.tgz", + "integrity": "sha512-oqaNq6hNNFJEuUXHFop/HDQI3LS9px1nvcRQjKbkHT4rTdnoAkePwT8QPCQ+83V+FS3TfsSFUIAFQoKyEYvaAg==", + "license": "Apache-2.0", + "dependencies": { + "@agoric/base-zone": "0.2.0-u22.1", + "@agoric/store": "0.10.0-u22.1", + "@agoric/swingset-liveslots": "0.11.0-u22.2", + "@endo/errors": "^1.2.13", + "@endo/exo": "^1.5.12", + "@endo/patterns": "^1.7.0" + }, + "engines": { + "node": "^20.9 || ^22.11" + } + }, + "node_modules/@agoric/zone": { + "version": "0.3.0-u22.2", + "resolved": "https://registry.npmjs.org/@agoric/zone/-/zone-0.3.0-u22.2.tgz", + "integrity": "sha512-YUO8LSedS4rPdvFIuljdVW+PRIygrtjvnVfCcAjIY+8uY1xn7+7I4+TVnB0XBmqxvcwS/5Ffcc1KuVcjBlqnIw==", + "license": "Apache-2.0", + "dependencies": { + "@agoric/base-zone": "0.2.0-u22.1", + "@agoric/vat-data": "0.6.0-u22.2", + "@endo/errors": "^1.2.13", + "@endo/far": "^1.1.14", + "@endo/pass-style": "^1.6.3" + }, + "engines": { + "node": "^20.9 || ^22.11" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.10" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@endo/base64": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@endo/base64/-/base64-1.0.12.tgz", + "integrity": "sha512-opxoUVA4GuibR5S3CVFo8iyrYrXjN0XWJQSr9EKj4A8viQAcRm/7IQtyoF26F9PFgY3r11ihBswBMZUySnfXkg==", + "license": "Apache-2.0" + }, + "node_modules/@endo/cache-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@endo/cache-map/-/cache-map-1.1.0.tgz", + "integrity": "sha512-owFGshs/97PDw9oguZqU/px8Lv1d0KjAUtDUiPwKHNXRVUE/jyettEbRoTbNJR1OaI8biMn6bHr9kVJsOh6dXw==", + "license": "Apache-2.0" + }, + "node_modules/@endo/cjs-module-analyzer": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@endo/cjs-module-analyzer/-/cjs-module-analyzer-1.0.11.tgz", + "integrity": "sha512-zS+SjeUN4y7Ry7l0DSME05gUekLrfIZnhZ66q+1674BkQc4dk1eub2ZLgPDGoXOrBLtcadc7yxHwazilmMoQLQ==", + "license": "Apache-2.0" + }, + "node_modules/@endo/common": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@endo/common/-/common-1.2.13.tgz", + "integrity": "sha512-DUO8u5U4+7GaOpnQHWR3dNRsWFF4WsllI3kB7bzOzhj6lqBYOBGavTDjI69N/9vJQ5X2DJ0f2OEYtf6jQCjYwg==", + "license": "Apache-2.0", + "dependencies": { + "@endo/errors": "^1.2.13", + "@endo/eventual-send": "^1.3.4", + "@endo/promise-kit": "^1.1.13" + } + }, + "node_modules/@endo/compartment-mapper": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@endo/compartment-mapper/-/compartment-mapper-1.6.3.tgz", + "integrity": "sha512-jo8g684OMXXsBne8exczjwcN2FK+IHDq/SL/B+y2QPk+fdRtqBH9tTaD1KV7yCJ4mJSbNGaUllkw/qtbeo9y1Q==", + "license": "Apache-2.0", + "dependencies": { + "@endo/cjs-module-analyzer": "^1.0.11", + "@endo/module-source": "^1.3.3", + "@endo/path-compare": "^1.1.0", + "@endo/trampoline": "^1.0.5", + "@endo/zip": "^1.0.11", + "ses": "^1.14.0" + } + }, + "node_modules/@endo/env-options": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@endo/env-options/-/env-options-1.1.11.tgz", + "integrity": "sha512-p9OnAPsdqoX4YJsE98e3NBVhIr2iW9gNZxHhAI2/Ul5TdRfoOViItzHzTqrgUVopw6XxA1u1uS6CykLMDUxarA==", + "license": "Apache-2.0" + }, + "node_modules/@endo/errors": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@endo/errors/-/errors-1.2.13.tgz", + "integrity": "sha512-cRRfsVTWfAnw/B2tT+OgN6oZ8JVZM06QVPyKD6Oo12qJX39oonJfyuf3SKFo7Ii4lh5mt5v+5iHqzsQ4xHjvIQ==", + "license": "Apache-2.0", + "dependencies": { + "ses": "^1.14.0" + } + }, + "node_modules/@endo/eventual-send": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@endo/eventual-send/-/eventual-send-1.3.4.tgz", + "integrity": "sha512-Pn3ArDN2ar1rJ6VYmtMJFYtihSJCUymKYWq17kvKqS+PlFvoP69M3UYP2ly5Dz+nOnW14Kvdhkui6/hcwB0n0w==", + "license": "Apache-2.0", + "dependencies": { + "@endo/env-options": "^1.1.11" + } + }, + "node_modules/@endo/exo": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@endo/exo/-/exo-1.5.12.tgz", + "integrity": "sha512-UhFoYIQ9mJIc4xE1SQPRCNvZ+kIpVuWUSt8SpjvXCpiuYd/M9fpT3o1SClfu/yvj6v6cUtFmcvqk7HYREtFPjQ==", + "license": "Apache-2.0", + "dependencies": { + "@endo/common": "^1.2.13", + "@endo/env-options": "^1.1.11", + "@endo/errors": "^1.2.13", + "@endo/eventual-send": "^1.3.4", + "@endo/far": "^1.1.14", + "@endo/pass-style": "^1.6.3", + "@endo/patterns": "^1.7.0" + } + }, + "node_modules/@endo/far": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@endo/far/-/far-1.1.14.tgz", + "integrity": "sha512-OlM+yCNWVqhwSZa6MyjkVB0oQSTAQ15KoiDGL1qowtnTnhuGUbOXuaUAsDf4eAJZ4L+h2KsJOUdyYEuhNsDPLg==", + "license": "Apache-2.0", + "dependencies": { + "@endo/errors": "^1.2.13", + "@endo/eventual-send": "^1.3.4", + "@endo/pass-style": "^1.6.3" + } + }, + "node_modules/@endo/immutable-arraybuffer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@endo/immutable-arraybuffer/-/immutable-arraybuffer-1.1.2.tgz", + "integrity": "sha512-u+NaYB2aqEugQ3u7w3c5QNkPogf8q/xGgsPaqdY6pUiGWtYiTiFspKFcha6+oeZhWXWQ23rf0KrUq0kfuzqYyQ==", + "license": "Apache-2.0" + }, + "node_modules/@endo/init": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@endo/init/-/init-1.1.12.tgz", + "integrity": "sha512-6Q0IhmL8NPh1ATnLULO03X6hEqFpkO97ms1pmAdyJg0+vrPuTcRHULP9oRVghVY12o/yDGg8tumDk4+CUUv6zw==", + "license": "Apache-2.0", + "dependencies": { + "@endo/base64": "^1.0.12", + "@endo/eventual-send": "^1.3.4", + "@endo/lockdown": "^1.0.18", + "@endo/promise-kit": "^1.1.13" + } + }, + "node_modules/@endo/lockdown": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/@endo/lockdown/-/lockdown-1.0.18.tgz", + "integrity": "sha512-dv9gpnEM5VdOW1WkY6dwQSqlTuNgkZMHOPNcEGZmpzYcT+0U6VjfSjo0wumxyej+T4K7Y6FwgSPLXwHqGXFANw==", + "license": "Apache-2.0", + "dependencies": { + "ses": "^1.14.0" + } + }, + "node_modules/@endo/marshal": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@endo/marshal/-/marshal-1.8.0.tgz", + "integrity": "sha512-TsjZUAYo6BwewNFvv1rzgLkogee3f2Z+xIF5d4TQOBVcgtOR/uvDhx7XmmtFwYDnq90UzPo/f0ffmR47micduA==", + "license": "Apache-2.0", + "dependencies": { + "@endo/common": "^1.2.13", + "@endo/env-options": "^1.1.11", + "@endo/errors": "^1.2.13", + "@endo/eventual-send": "^1.3.4", + "@endo/nat": "^5.1.3", + "@endo/pass-style": "^1.6.3", + "@endo/promise-kit": "^1.1.13" + } + }, + "node_modules/@endo/module-source": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@endo/module-source/-/module-source-1.3.3.tgz", + "integrity": "sha512-BsnzQDVxHVdE5otMextsqZvXEko1N+djde1Y/lrbZp+/gn0x9O9x30ZUG8Yt84Vob4sxjL9I7piTVE/px5cuog==", + "license": "Apache-2.0", + "dependencies": { + "@babel/generator": "^7.26.3", + "@babel/parser": "~7.26.2", + "@babel/traverse": "~7.25.9", + "@babel/types": "~7.26.0", + "ses": "^1.14.0" + } + }, + "node_modules/@endo/nat": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@endo/nat/-/nat-5.1.3.tgz", + "integrity": "sha512-+uRT6/hrAxEup2SOZYD2GJpnVaQQ6bx4Txxv9n+Whr1yVM8fL15fAY2NUTwpAJpGAPZA0uwreW+Wf4lmePq0Nw==", + "license": "Apache-2.0" + }, + "node_modules/@endo/pass-style": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@endo/pass-style/-/pass-style-1.6.3.tgz", + "integrity": "sha512-dVcLC0+ApxoI4T+kaEsbuS/u4ai7zXDw831otd3pYGn7la/eJ9Lu6g2qOduE1vtY2BFOI46N91/dtIBni7R6yg==", + "license": "Apache-2.0", + "dependencies": { + "@endo/common": "^1.2.13", + "@endo/env-options": "^1.1.11", + "@endo/errors": "^1.2.13", + "@endo/eventual-send": "^1.3.4", + "@endo/promise-kit": "^1.1.13" + } + }, + "node_modules/@endo/path-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@endo/path-compare/-/path-compare-1.1.0.tgz", + "integrity": "sha512-dKBykUBpZPLvvxB8CqOzSl1kJ9Bv4gzig34E5n2LQRj2xULaUjdgBm8DtMkORpIOPLrvJKWMoispwSlRXL/7OA==", + "license": "Apache-2.0" + }, + "node_modules/@endo/patterns": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@endo/patterns/-/patterns-1.7.0.tgz", + "integrity": "sha512-jf/4sq8psz+E9CGLyU99J0zz9Y3xRod7XpcQ7TIC0vjTRfEoIMhNTKZWCYoDQKpIuvtEdgnL3ixikrtS2QILKA==", + "license": "Apache-2.0", + "dependencies": { + "@endo/common": "^1.2.13", + "@endo/errors": "^1.2.13", + "@endo/eventual-send": "^1.3.4", + "@endo/marshal": "^1.8.0", + "@endo/pass-style": "^1.6.3", + "@endo/promise-kit": "^1.1.13" + } + }, + "node_modules/@endo/promise-kit": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@endo/promise-kit/-/promise-kit-1.1.13.tgz", + "integrity": "sha512-2hPhjy8sG+C9gg2XJMSVpQW5PqidAf0SfjciR3eLXzA/2gpqxotSbA/9TvvuHIR4zGKTXfUrk53lQAHYq+96ug==", + "license": "Apache-2.0", + "dependencies": { + "ses": "^1.14.0" + }, + "engines": { + "node": ">=11.0" + } + }, + "node_modules/@endo/stream": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@endo/stream/-/stream-1.2.13.tgz", + "integrity": "sha512-ZXkmEjH4i750jd1WJEq50ruVFjAFbIDoABQRUGGQCfwlFHCwz5mU9t7Gs0dvyl3LCNbbX3dtRuSqqMMrpkfbCA==", + "license": "Apache-2.0", + "dependencies": { + "@endo/eventual-send": "^1.3.4", + "@endo/promise-kit": "^1.1.13", + "ses": "^1.14.0" + } + }, + "node_modules/@endo/trampoline": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@endo/trampoline/-/trampoline-1.0.5.tgz", + "integrity": "sha512-75sXj6cvvJ7qpD8UVoUVTEQRay/X6y5OrFYH48iFEmTg1SJcEQlldjMI4mrvOyuHjtr+KnVlNr+zmrhAUtLm0w==", + "license": "Apache-2.0" + }, + "node_modules/@endo/zip": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@endo/zip/-/zip-1.0.11.tgz", + "integrity": "sha512-gx73xEyRFH3V/63eZAhrw1+t4tnpLG9n5RYzBwl3LR5mrtbrguGvx7fPoFww+oxjmkAgvGQUMVuJuqf11alAcg==", + "license": "Apache-2.0" + }, + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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": { + "@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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.13", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", + "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "25.0.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.5.tgz", + "integrity": "sha512-FuLxeLuSVOqHPxSN1fkcD8DLU21gAP7nCKqGRJ/FglbCUBs0NYN6TpHcdmyLeh8C0KwGIaZQJSv+OYG+KZz+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "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", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/chalk/ansi-regex?sponsor=1" + } + }, + "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": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anylogger": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/anylogger/-/anylogger-0.21.0.tgz", + "integrity": "sha512-XJVplwflEff43l7aE48lW9gNoS0fpb1Ha4WttzjfTFlN3uJUIKALZ5oNWtwgRXPm/Q2dbp1EIddMbQ/AGHVX1A==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrgv": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", + "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ava/-/ava-5.3.1.tgz", + "integrity": "sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.8.2", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.2.1", + "arrgv": "^1.0.2", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.2.0", + "chokidar": "^3.5.3", + "chunkd": "^2.0.1", + "ci-info": "^3.8.0", + "ci-parallel-vars": "^1.0.1", + "clean-yaml-object": "^0.1.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.4", + "currently-unhandled": "^0.4.1", + "debug": "^4.3.4", + "emittery": "^1.0.1", + "figures": "^5.0.0", + "globby": "^13.1.4", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", + "is-error": "^2.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", + "ms": "^2.1.3", + "p-event": "^5.0.1", + "p-map": "^5.5.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", + "pretty-ms": "^8.0.0", + "resolve-cwd": "^3.0.0", + "stack-utils": "^2.0.6", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", + "temp-dir": "^3.0.0", + "write-file-atomic": "^5.0.1", + "yargs": "^17.7.2" + }, + "bin": { + "ava": "entrypoints/cli.mjs" + }, + "engines": { + "node": ">=14.19 <15 || >=16.15 <17 || >=18" + }, + "peerDependencies": { + "@ava/typescript": "*" + }, + "peerDependenciesMeta": { + "@ava/typescript": { + "optional": true + } + } + }, + "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/better-sqlite3": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.6.0.tgz", + "integrity": "sha512-FXI191x+D6UPWSze5IzZjhz+i9MK9nsuHsmTX9bXVl52k06AfZ2xql0lrgIUuzsMsJ7Vgl5kIptvDgBLIV3ZSQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x" + } + }, + "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==", + "dev": true, + "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/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/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "dev": true, + "license": "MIT" + }, + "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": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/callsites": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", + "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "license": "MIT", + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/chunkd": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", + "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ci-parallel-vars": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", + "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "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==", + "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/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true, + "license": "ISC" + }, + "node_modules/concordance": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", + "well-known-symbols": "^2.0.0" + }, + "engines": { + "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" + } + }, + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/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/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": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "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-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/emittery": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.2.0.tgz", + "integrity": "sha512-KxdRyyFcS85pH3dnU8Y5yFUm2YJdaHwcBZWrfG8o89ZY9a13/f9itbN+YG3ELbBo9Pg5zvIozstmuV8bX13q6g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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/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": { + "once": "^1.4.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": ">=4" + } + }, + "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": ">=0.10.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": ">=6" + } + }, + "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": { + "@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": ">=8.6.0" + } + }, + "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": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/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-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "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" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10 <11 || >=12 <13 || >=14" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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": ">=0.12.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jessie.js": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/jessie.js/-/jessie.js-0.3.4.tgz", + "integrity": "sha512-JYJm6nXuFIO/X6OWLBatorgqmFVYbenqnFP0UDalO2OQ6sn58VeJ3cKtMQ0l0TM0JnCx4wKhyO4BQQ/ilxjd6g==", + "license": "Apache-2.0", + "dependencies": { + "@endo/far": "^1.0.0" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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": "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", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/matcher": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "dev": true, + "license": "MIT", + "dependencies": { + "blueimp-md5": "^2.10.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mem": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/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/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/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/node-abi": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz", + "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.19" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.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/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-timeout": "^5.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/plur": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "irregular-plurals": "^3.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": { + "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": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-ms": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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/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" + } + }, + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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": { + "iojs": ">=1.0.0", + "node": ">=0.10.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==", + "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": { + "queue-microtask": "^1.2.2" + } + }, + "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/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" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ses": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/ses/-/ses-1.14.0.tgz", + "integrity": "sha512-T07hNgOfVRTLZGwSS50RnhqrG3foWP+rM+Q5Du4KUQyMLFI3A8YA4RKl0jjZzhihC1ZvDGrWi/JMn4vqbgr/Jg==", + "license": "Apache-2.0", + "dependencies": { + "@endo/cache-map": "^1.1.0", + "@endo/env-options": "^1.1.11", + "@endo/immutable-arraybuffer": "^1.1.2" + } + }, + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sprintf-js": { + "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/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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/chalk/strip-ansi?sponsor=1" + } + }, + "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", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supertap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "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": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "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/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/packages/ertp-ledgerguise/package.json b/packages/ertp-ledgerguise/package.json new file mode 100644 index 0000000..f1f8d3b --- /dev/null +++ b/packages/ertp-ledgerguise/package.json @@ -0,0 +1,31 @@ +{ + "name": "@finquick/ertp-ledgerguise", + "version": "0.0.1", + "private": true, + "scripts": { + "lint:types": "tsc -p tsconfig.json --noEmit --incremental", + "test": "ava", + "check": "npm run lint:types && npm run test" + }, + "ava": { + "files": [ + "test/**/*.test.ts" + ], + "extensions": [ + "ts" + ], + "require": [ + "ts-node/register/transpile-only" + ] + }, + "dependencies": { + "@agoric/ertp": "*", + "better-sqlite3": "^12.6.0" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.1", + "ava": "^5.3.1", + "ts-node": "^10.9.2", + "typescript": "~5.9.3" + } +} diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts new file mode 100644 index 0000000..4747c5c --- /dev/null +++ b/packages/ertp-ledgerguise/src/index.ts @@ -0,0 +1,10 @@ +import type { IssuerKit } from '@agoric/ertp'; +import type { Database } from 'better-sqlite3'; + +export type LedgerguiseConfig = { + db: Database; +}; + +export const makeLedgerguiseKit = (_config: LedgerguiseConfig): IssuerKit => { + throw new Error('Not implemented'); +}; diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts new file mode 100644 index 0000000..015c664 --- /dev/null +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -0,0 +1,31 @@ +import test from 'ava'; +import type { IssuerKit } from '@agoric/ertp'; +import Database from 'better-sqlite3'; +import type { Brand, NatAmount } from '@agoric/ertp'; +import { makeLedgerguiseKit } from '../src/index'; + +test('makeLedgerguiseKit returns an ERTP issuer kit backed by sqlite', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + + const kit = makeLedgerguiseKit(freeze({ db })); + + t.truthy(kit.issuer); + t.truthy(kit.brand); + t.truthy(kit.mint); + + const brand = kit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + const alicePurse = kit.issuer.makeEmptyPurse(); + const bobPurse = kit.issuer.makeEmptyPurse(); + + const payment = kit.mint.mintPayment(bucks(10n)); + alicePurse.deposit(payment); + + const paymentToBob = alicePurse.withdraw(bucks(10n)); + bobPurse.deposit(paymentToBob); + + t.is(alicePurse.getCurrentAmount().value, 0n); + t.is(bobPurse.getCurrentAmount().value, 10n); +}); diff --git a/packages/ertp-ledgerguise/tsconfig.json b/packages/ertp-ledgerguise/tsconfig.json new file mode 100644 index 0000000..94a16fd --- /dev/null +++ b/packages/ertp-ledgerguise/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "CommonJS", + "moduleResolution": "Node", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ] +} diff --git a/packages/ertp-ledgerguise/tsconfig.tsbuildinfo b/packages/ertp-ledgerguise/tsconfig.tsbuildinfo new file mode 100644 index 0000000..9f74c42 --- /dev/null +++ b/packages/ertp-ledgerguise/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2020.full.d.ts","./node_modules/@endo/eventual-send/src/E.d.ts","./node_modules/@endo/eventual-send/src/handled-promise.d.ts","./node_modules/@endo/eventual-send/src/track-turns.d.ts","./node_modules/@endo/eventual-send/src/types.d.ts","./node_modules/@endo/eventual-send/src/exports.d.ts","./node_modules/@endo/eventual-send/src/no-shim.d.ts","./node_modules/@endo/far/src/exports.d.ts","./node_modules/@endo/pass-style/src/passStyle-helpers.d.ts","./node_modules/ses/types.d.ts","./node_modules/@endo/pass-style/src/types.d.ts","./node_modules/@endo/pass-style/src/makeTagged.d.ts","./node_modules/@endo/pass-style/src/deeplyFulfilled.d.ts","./node_modules/@endo/pass-style/src/iter-helpers.d.ts","./node_modules/@endo/pass-style/src/internal-types.d.ts","./node_modules/@endo/pass-style/src/error.d.ts","./node_modules/@endo/pass-style/src/remotable.d.ts","./node_modules/@endo/pass-style/src/symbol.d.ts","./node_modules/@endo/pass-style/src/string.d.ts","./node_modules/@endo/pass-style/src/passStyleOf.d.ts","./node_modules/@endo/pass-style/src/make-far.d.ts","./node_modules/@endo/pass-style/src/typeGuards.d.ts","./node_modules/@endo/pass-style/index.d.ts","./node_modules/@endo/far/src/index.d.ts","./node_modules/@endo/marshal/src/types.d.ts","./node_modules/@endo/marshal/src/encodeToCapData.d.ts","./node_modules/@endo/marshal/src/marshal.d.ts","./node_modules/@endo/marshal/src/marshal-stringify.d.ts","./node_modules/@endo/marshal/src/marshal-justin.d.ts","./node_modules/@endo/marshal/src/encodePassable.d.ts","./node_modules/@endo/marshal/src/rankOrder.d.ts","./node_modules/@endo/marshal/index.d.ts","./node_modules/@endo/patterns/src/types.d.ts","./node_modules/@endo/patterns/src/keys/copySet.d.ts","./node_modules/@endo/patterns/src/keys/copyBag.d.ts","./node_modules/@endo/common/list-difference.d.ts","./node_modules/@endo/common/object-map.d.ts","./node_modules/@endo/patterns/src/keys/checkKey.d.ts","./node_modules/@endo/patterns/src/keys/compareKeys.d.ts","./node_modules/@endo/patterns/src/keys/merge-set-operators.d.ts","./node_modules/@endo/patterns/src/keys/merge-bag-operators.d.ts","./node_modules/@endo/patterns/src/patterns/patternMatchers.d.ts","./node_modules/@endo/patterns/src/patterns/getGuardPayloads.d.ts","./node_modules/@endo/patterns/index.d.ts","./node_modules/@endo/common/object-meta-map.d.ts","./node_modules/@endo/common/from-unique-entries.d.ts","./node_modules/@agoric/internal/src/js-utils.d.ts","./node_modules/@agoric/internal/src/ses-utils.d.ts","./node_modules/@agoric/internal/src/types.ts","./node_modules/@endo/exo/src/get-interface.d.ts","./node_modules/@endo/exo/src/types.d.ts","./node_modules/@endo/exo/src/exo-makers.d.ts","./node_modules/@endo/exo/index.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakSetStore.d.ts","./node_modules/@agoric/store/src/types.d.ts","./node_modules/@agoric/store/src/stores/scalarSetStore.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakMapStore.d.ts","./node_modules/@agoric/store/src/stores/scalarMapStore.d.ts","./node_modules/@agoric/store/src/legacy/legacyMap.d.ts","./node_modules/@agoric/store/src/legacy/legacyWeakMap.d.ts","./node_modules/@agoric/internal/src/cli-utils.d.ts","./node_modules/@agoric/internal/src/config.d.ts","./node_modules/@agoric/internal/src/debug.d.ts","./node_modules/@agoric/internal/src/errors.d.ts","./node_modules/@agoric/internal/src/method-tools.d.ts","./node_modules/@agoric/internal/src/metrics.d.ts","./node_modules/@agoric/internal/src/natural-sort.d.ts","./node_modules/@agoric/internal/src/tmpDir.d.ts","./node_modules/@agoric/internal/src/typeCheck.d.ts","./node_modules/@agoric/internal/src/typeGuards.d.ts","./node_modules/@agoric/internal/src/types-index.d.ts","./node_modules/@agoric/internal/src/marshal.d.ts","./node_modules/@agoric/internal/src/index.d.ts","./node_modules/@agoric/store/src/stores/store-utils.d.ts","./node_modules/@agoric/store/src/index.d.ts","./node_modules/@agoric/base-zone/src/watch-promise.d.ts","./node_modules/@agoric/base-zone/src/types.d.ts","./node_modules/@agoric/base-zone/src/exports.d.ts","./node_modules/@agoric/swingset-liveslots/src/types.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualReferences.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualObjectManager.d.ts","./node_modules/@agoric/swingset-liveslots/src/watchedPromises.d.ts","./node_modules/@agoric/swingset-liveslots/src/vatDataTypes.ts","./node_modules/@agoric/swingset-liveslots/src/types-index.d.ts","./node_modules/@agoric/swingset-liveslots/src/liveslots.d.ts","./node_modules/@agoric/swingset-liveslots/src/message.d.ts","./node_modules/@agoric/swingset-liveslots/src/index.d.ts","./node_modules/@agoric/base-zone/src/make-once.d.ts","./node_modules/@agoric/base-zone/src/keys.d.ts","./node_modules/@agoric/base-zone/src/is-passable.d.ts","./node_modules/@agoric/base-zone/src/index.d.ts","./node_modules/@agoric/internal/src/lib-chainStorage.d.ts","./node_modules/@agoric/notifier/src/types.ts","./node_modules/@agoric/notifier/src/topic.d.ts","./node_modules/@agoric/notifier/src/storesub.d.ts","./node_modules/@agoric/notifier/src/stored-notifier.d.ts","./node_modules/@agoric/notifier/src/types-index.d.ts","./node_modules/@agoric/notifier/src/publish-kit.d.ts","./node_modules/@agoric/notifier/src/subscribe.d.ts","./node_modules/@agoric/notifier/src/notifier.d.ts","./node_modules/@agoric/notifier/src/subscriber.d.ts","./node_modules/@agoric/notifier/src/asyncIterableAdaptor.d.ts","./node_modules/@agoric/notifier/src/index.d.ts","./node_modules/@agoric/internal/src/tagged.d.ts","./node_modules/@agoric/ertp/src/types.ts","./node_modules/@agoric/ertp/src/amountMath.d.ts","./node_modules/@agoric/ertp/src/issuerKit.d.ts","./node_modules/@agoric/ertp/src/typeGuards.d.ts","./node_modules/@agoric/ertp/src/types-index.d.ts","./node_modules/@agoric/ertp/src/index.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/better-sqlite3/index.d.ts","./src/index.ts","./node_modules/ava/types/assertions.d.cts","./node_modules/ava/types/subscribable.d.cts","./node_modules/ava/types/try-fn.d.cts","./node_modules/ava/types/test-fn.d.cts","./node_modules/ava/entrypoints/main.d.cts","./node_modules/ava/index.d.ts","./test/ledgerguise.test.ts"],"fileIdsList":[[129,165,228,236,240,243,245,246,247,259],[128,130,140,141,142,165,228,236,240,243,245,246,247,259],[75,165,228,236,240,243,245,246,247,259],[129,139,165,228,236,240,243,245,246,247,259],[105,127,128,165,228,236,240,243,245,246,247,259],[96,165,228,236,240,243,245,246,247,259],[96,157,165,228,236,240,243,245,246,247,259],[158,159,160,161,165,228,236,240,243,245,246,247,259],[96,125,157,158,165,228,236,240,243,245,246,247,259],[96,125,157,165,228,236,240,243,245,246,247,259],[157,165,228,236,240,243,245,246,247,259],[75,76,96,155,156,158,165,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259],[99,100,113,114,115,116,117,118,119,120,121,122,123,124,165,228,236,240,243,245,246,247,259],[76,84,101,105,143,165,228,236,240,243,245,246,247,259],[84,101,165,228,236,240,243,245,246,247,259],[76,89,97,98,99,101,165,228,236,240,243,245,246,247,259],[101,165,228,236,240,243,245,246,247,259],[96,101,165,228,236,240,243,245,246,247,259],[59,75,96,100,165,228,236,240,243,245,246,247,259],[59,75,76,145,149,165,228,236,240,243,245,246,247,259],[146,147,148,149,150,151,152,153,154,165,228,236,240,243,245,246,247,259],[125,145,165,228,236,240,243,245,246,247,259],[96,139,145,165,228,236,240,243,245,246,247,259],[75,76,144,145,165,228,236,240,243,245,246,247,259],[76,84,144,145,165,228,236,240,243,245,246,247,259],[59,75,76,145,165,228,236,240,243,245,246,247,259],[145,165,228,236,240,243,245,246,247,259],[84,144,165,228,236,240,243,245,246,247,259],[96,105,106,107,108,109,110,111,112,125,126,165,228,236,240,243,245,246,247,259],[107,165,228,236,240,243,245,246,247,259],[75,96,107,165,228,236,240,243,245,246,247,259],[96,107,165,228,236,240,243,245,246,247,259],[96,127,165,228,236,240,243,245,246,247,259],[75,84,96,107,165,228,236,240,243,245,246,247,259],[75,96,165,228,236,240,243,245,246,247,259],[136,137,138,165,228,236,240,243,245,246,247,259],[99,131,165,228,236,240,243,245,246,247,259],[131,165,228,236,240,243,245,246,247,259],[131,135,165,228,236,240,243,245,246,247,259],[84,165,228,236,240,243,245,246,247,259],[59,75,96,105,127,134,165,228,236,240,243,245,246,247,259],[84,131,132,139,165,228,236,240,243,245,246,247,259],[84,131,132,133,135,165,228,236,240,243,245,246,247,259],[57,165,228,236,240,243,245,246,247,259],[54,55,58,165,228,236,240,243,245,246,247,259],[54,55,56,165,228,236,240,243,245,246,247,259],[102,103,104,165,228,236,240,243,245,246,247,259],[96,103,165,228,236,240,243,245,246,247,259],[59,75,96,102,165,228,236,240,243,245,246,247,259],[59,165,228,236,240,243,245,246,247,259],[59,60,75,165,228,236,240,243,245,246,247,259],[75,77,78,79,80,81,82,83,165,228,236,240,243,245,246,247,259],[75,77,165,228,236,240,243,245,246,247,259],[62,75,77,165,228,236,240,243,245,246,247,259],[77,165,228,236,240,243,245,246,247,259],[61,63,64,65,66,68,69,70,71,72,73,74,165,228,236,240,243,245,246,247,259],[62,63,67,165,228,236,240,243,245,246,247,259],[63,165,228,236,240,243,245,246,247,259],[59,63,165,228,236,240,243,245,246,247,259],[63,67,165,228,236,240,243,245,246,247,259],[61,62,165,228,236,240,243,245,246,247,259],[85,86,87,88,89,90,91,92,93,94,95,165,228,236,240,243,245,246,247,259],[75,85,165,228,236,240,243,245,246,247,259],[85,165,228,236,240,243,245,246,247,259],[75,84,85,165,228,236,240,243,245,246,247,259],[75,84,165,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,284],[165,225,226,228,236,240,243,245,246,247,259],[165,227,228,236,240,243,245,246,247,259],[228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,267],[165,228,229,234,236,239,240,243,245,246,247,249,259,264,276],[165,228,229,230,236,239,240,243,245,246,247,259],[165,228,231,236,240,243,245,246,247,259,277],[165,228,232,233,236,240,243,245,246,247,250,259],[165,228,233,236,240,243,245,246,247,259,264,273],[165,228,234,236,239,240,243,245,246,247,249,259],[165,227,228,235,236,240,243,245,246,247,259],[165,228,236,237,240,243,245,246,247,259],[165,228,236,238,239,240,243,245,246,247,259],[165,227,228,236,239,240,243,245,246,247,259],[165,228,236,239,240,241,243,245,246,247,259,264,276],[165,228,236,239,240,241,243,245,246,247,259,264,267],[165,215,228,236,239,240,242,243,245,246,247,249,259,264,276],[165,228,236,239,240,242,243,245,246,247,249,259,264,273,276],[165,228,236,240,242,243,244,245,246,247,259,264,273,276],[163,164,165,166,167,168,169,170,171,172,173,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283],[165,228,236,239,240,243,245,246,247,259],[165,228,236,240,243,245,247,259],[165,228,236,240,243,245,246,247,248,259,276],[165,228,236,239,240,243,245,246,247,249,259,264],[165,228,236,240,243,245,246,247,250,259],[165,228,236,240,243,245,246,247,251,259],[165,228,236,239,240,243,245,246,247,254,259],[165,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283],[165,228,236,240,243,245,246,247,256,259],[165,228,236,240,243,245,246,247,257,259],[165,228,233,236,240,243,245,246,247,249,259,267],[165,228,236,239,240,243,245,246,247,259,260],[165,228,236,240,243,245,246,247,259,261,277,280],[165,228,236,239,240,243,245,246,247,259,264,266,267],[165,228,236,240,243,245,246,247,259,265,267],[165,228,236,240,243,245,246,247,259,267,277],[165,228,236,240,243,245,246,247,259,268],[165,225,228,236,240,243,245,246,247,259,264,270],[165,228,236,240,243,245,246,247,259,264,269],[165,228,236,239,240,243,245,246,247,259,271,272],[165,228,236,240,243,245,246,247,259,271,272],[165,228,233,236,240,243,245,246,247,249,259,264,273],[165,228,236,240,243,245,246,247,259,274],[165,228,236,240,243,245,246,247,249,259,275],[165,228,236,240,242,243,245,246,247,257,259,276],[165,228,236,240,243,245,246,247,259,277,278],[165,228,233,236,240,243,245,246,247,259,278],[165,228,236,240,243,245,246,247,259,264,279],[165,228,236,240,243,245,246,247,248,259,280],[165,228,236,240,243,245,246,247,259,281],[165,228,231,236,240,243,245,246,247,259],[165,228,233,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,277],[165,215,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,259,282],[165,228,236,240,243,245,246,247,254,259],[165,228,236,240,243,245,246,247,259,272],[165,215,228,236,239,240,241,243,245,246,247,254,259,264,267,276,279,280,282],[165,228,236,240,243,245,246,247,259,264,283],[165,228,236,240,243,245,246,247,259,287,288,289,290],[165,228,236,240,243,245,246,247,259,291],[165,228,236,240,243,245,246,247,259,287,288,289],[165,228,236,240,243,245,246,247,259,290],[165,181,184,187,188,228,236,240,243,245,246,247,259,276],[165,184,228,236,240,243,245,246,247,259,264,276],[165,184,188,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,259,264],[165,178,228,236,240,243,245,246,247,259],[165,182,228,236,240,243,245,246,247,259],[165,180,181,184,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,249,259,273],[165,178,228,236,240,243,245,246,247,259,284],[165,180,184,228,236,240,243,245,246,247,249,259,276],[165,175,176,177,179,183,228,236,239,240,243,245,246,247,259,264,276],[165,184,192,200,228,236,240,243,245,246,247,259],[165,176,182,228,236,240,243,245,246,247,259],[165,184,209,210,228,236,240,243,245,246,247,259],[165,176,179,184,228,236,240,243,245,246,247,259,267,276,284],[165,184,228,236,240,243,245,246,247,259],[165,180,184,228,236,240,243,245,246,247,259,276],[165,175,228,236,240,243,245,246,247,259],[165,178,179,180,182,183,184,185,186,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,210,211,212,213,214,228,236,240,243,245,246,247,259],[165,184,202,205,228,236,240,243,245,246,247,259],[165,184,192,193,194,228,236,240,243,245,246,247,259],[165,182,184,193,195,228,236,240,243,245,246,247,259],[165,183,228,236,240,243,245,246,247,259],[165,176,178,184,228,236,240,243,245,246,247,259],[165,184,188,193,195,228,236,240,243,245,246,247,259],[165,188,228,236,240,243,245,246,247,259],[165,182,184,187,228,236,240,243,245,246,247,259,276],[165,176,180,184,192,228,236,240,243,245,246,247,259],[165,184,202,228,236,240,243,245,246,247,259],[165,195,228,236,240,243,245,246,247,259],[165,178,184,209,228,236,240,243,245,246,247,259,267,282,284],[162,165,228,236,240,243,245,246,247,259,285],[162,165,228,236,240,243,245,246,247,259,285,286,292]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"2cd4b702eb44058636981ad2a53ab0152417c8f36b224e459aa5404d5786166e","impliedFormat":99},{"version":"64a95727716d7a159ff916085eb5df4dd67f1ff9c6f7e35ce2aff8a4ed4e6d31","impliedFormat":99},{"version":"93340c70128cbf56acb9eba0146f9cae83b5ef8f4b02f380fff0b77a6b7cf113","impliedFormat":99},{"version":"eb10902fb118057f367f63a703af037ea92a1f8e6161b9b128c29d934539d9a5","impliedFormat":99},{"version":"6b9c704b9febb76cdf74f8f1e3ac199c5b4708e5be2afe257320411ec2c8a3a1","affectsGlobalScope":true,"impliedFormat":99},{"version":"614fa8a4693c632333c354af80562633c8aaf0d552e7ed90f191a6ace24abe9d","impliedFormat":99},{"version":"d221c15d4aae13d314072f859de2ccec2c600a3addc9f2b71b397c83a157e71f","impliedFormat":99},{"version":"dc8a5014726788b50b968d67404dbc7713009040720a04b39c784b43dd8fdacb","impliedFormat":99},{"version":"ea5d08724831aab137fab28195dadf65667aec35acc0f2a5e517271d8c3082d3","affectsGlobalScope":true,"impliedFormat":99},{"version":"009b62c055096dfb3291f2667b8f0984ce480abef01c646e9675868fcec5ac60","impliedFormat":99},{"version":"d86a646352434aa51e337e64e234eab2d28af156bb5931d25c789d0c5dfbcd08","impliedFormat":99},{"version":"d15ab66050babcbb3858c785c437230bd984943b9b2080cd16fe1f0007b4802b","impliedFormat":99},{"version":"d5dc3c765037bfc7bd118be91ad280801f8c01fe41e8b7c8c1d8b96f6a0dc489","impliedFormat":99},{"version":"c6af1103d816d17451bc1a18cb9889fc9a282966383b695927d3ead99d958da0","impliedFormat":99},{"version":"d34287eb61f4689723448d33f50a047769dadee66ec8cb8609b41b17a5b3df40","impliedFormat":99},{"version":"22f52ade1934d26b5db4d5558be99097a82417c0247958527336535930d5a288","impliedFormat":99},{"version":"717d656e46e34696d072f2cee99ca045e69350f3c5ede3193337f884ccbc2a3b","impliedFormat":99},{"version":"b5a53985100fa348fcfb06bad4ee86367168e018998cbf95394a01b2dac92bb7","impliedFormat":99},{"version":"cadea2f7c33f255e142da3b0fefee54fa3985a12471cf9c5c51a221b3844f976","impliedFormat":99},{"version":"46f09e6b30f4301674d1c685934bd4ad2b594085d2545d6f063c175b1dcfd5af","impliedFormat":99},{"version":"25cd3d5fecfed6af5903170b67e8b3531591633e14c5b6735aac0d49e93d7cf0","impliedFormat":99},{"version":"f9fdd230ece877f4bcd8d35240426bcb1482f44faf813e6a336c2cc1b034e58d","impliedFormat":99},{"version":"bcbe66e540446c7fb8b34afe764dae60b28ef929cafe26402594f41a377fac41","impliedFormat":99},{"version":"428ef8df7e77bd4731faa19ef7430823f42bc95abd99368351411541ee08d2f7","impliedFormat":99},{"version":"a8a953cb8cf0b05c91086bd15a383afdfbddbf0cda5ed67d2c55542a5064b69d","impliedFormat":99},{"version":"f5a00483d6aa997ffedb1e802df7c7dcd048e43deab8f75c2c754f4ee3f97b41","impliedFormat":99},{"version":"14da43cd38f32c3b6349d1667937579820f1a3ddb40f3187caa727d4d451dcd4","impliedFormat":99},{"version":"2b77e2bc5350c160c53c767c8e6325ee61da47eda437c1d3156e16df94a64257","impliedFormat":99},{"version":"b0c5a13c0ec9074cdd2f8ed15e6734ba49231eb773330b221083e79e558badb4","impliedFormat":99},{"version":"a2d30f97dcc401dad445fb4f0667a167d1b9c0fdb1132001cc37d379e8946e3c","impliedFormat":99},{"version":"81c859cff06ee38d6f6b8015faa04722b535bb644ea386919d570e0e1f052430","impliedFormat":99},{"version":"05e938c1bc8cc5d2f3b9bb87dc09da7ab8e8e8436f17af7f1672f9b42ab5307d","impliedFormat":99},{"version":"061020cd9bc920fc08a8817160c5cb97b8c852c5961509ed15aab0c5a4faddb3","impliedFormat":99},{"version":"e33bbc0d740e4db63b20fa80933eb78cd305258ebb02b2c21b7932c8df118d3b","impliedFormat":99},{"version":"6795c049a6aaaaeb25ae95e0b9a4c75c8a325bd2b3b40aee7e8f5225533334d4","impliedFormat":99},{"version":"e6081f90b9dc3ff16bcc3fdab32aa361800dc749acc78097870228d8f8fd9920","impliedFormat":99},{"version":"6274539c679f0c9bcd2dbf9e85c5116db6acf91b3b9e1084ce8a17db56a0259a","impliedFormat":99},{"version":"f472753504df7760ad34eafa357007e90c59040e6f6882aae751de7b134b8713","impliedFormat":99},{"version":"dba70304db331da707d5c771e492b9c1db7545eb29a949050a65d0d4fa4a000d","impliedFormat":99},{"version":"a520f33e8a5a92d3847223b2ae2d8244cdb7a6d3d8dfdcc756c5650a38fc30f4","impliedFormat":99},{"version":"76aec992df433e1e56b9899183b4cf8f8216e00e098659dbfbc4d0cbf9054725","impliedFormat":99},{"version":"28fbf5d3fdff7c1dad9e3fd71d4e60077f14134b06253cb62e0eb3ba46f628e3","impliedFormat":99},{"version":"c5340ac3565038735dbf82f6f151a75e8b95b9b1d5664b4fddf0168e4dd9c2f3","impliedFormat":99},{"version":"9481179c799a61aa282d5d48b22421d4d9f592c892f2c6ae2cda7b78595a173e","impliedFormat":99},{"version":"00de25621f1acd5ed68e04bb717a418150779459c0df27843e5a3145ab6aa13d","impliedFormat":99},{"version":"3b0a6f0e693745a8f6fd35bafb8d69f334f3c782a91c8f3344733e2e55ba740d","impliedFormat":99},{"version":"83576f4e2a788f59c217da41b5b7eb67912a400a5ff20aa0622a5c902d23eb75","impliedFormat":99},{"version":"039ee0312b31c74b8fcf0d55b24ef9350b17da57572648580acd70d2e79c0d84","impliedFormat":99},{"version":"6a437bd627ddcb418741f1a279a9db2828cc63c24b4f8586b0473e04f314bee5","impliedFormat":99},{"version":"bb1a27e42875da4a6ff036a9bbe8fca33f88225d9ee5f3c18619bfeabc37c4f4","impliedFormat":99},{"version":"56e07c29328f54e68cf4f6a81bc657ae6b2bbd31c2f53a00f4f0a902fa095ea1","impliedFormat":99},{"version":"ce29026a1ee122328dc9f1b40bff4cf424643fddf8dc6c046f4c71bf97ecf5b5","impliedFormat":99},{"version":"386a071f8e7ca44b094aba364286b65e6daceba25347afb3b7d316a109800393","impliedFormat":99},{"version":"6ba3f7fc791e73109b8c59ae17b1e013ab269629a973e78812e0143e4eab48b2","impliedFormat":99},{"version":"042dbb277282e4cb651b7a5cde8a07c01a7286d41f585808afa98c2c5adae7e0","impliedFormat":99},{"version":"0952d2faef01544f6061dd15d81ae53bfb9d3789b9def817f0019731e139bda8","impliedFormat":99},{"version":"8ec4b0ca2590204f6ef4a26d77c5c8b0bba222a5cd80b2cb3aa3016e3867f9ce","impliedFormat":99},{"version":"15d389a1ee1f700a49260e38736c8757339e5d5e06ca1409634242c1a7b0602e","impliedFormat":99},{"version":"f868b2a12bbe4356e2fd57057ba0619d88f1496d2b884a4f22d8bab3e253dbf5","impliedFormat":99},{"version":"a474bc8c71919a09c0d27ad0cba92e5e3e754dc957bec9c269728c9a4a4cf754","impliedFormat":99},{"version":"e732c6a46c6624dbbd56d3f164d6afdfe2b6007c6709bb64189ce057d03d30fd","impliedFormat":99},{"version":"5c425f77a2867b5d7026875328f13736e3478b0cc6c092787ac3a8dcc8ff0d42","impliedFormat":99},{"version":"b6d1738ae0dd427debbb3605ba03c30ceb76d4cefc7bd5f437004f6f4c622e38","impliedFormat":99},{"version":"6629357b7dd05ee4367a71962a234d508fa0fb99fbbad83fdbf3e64aa6e77104","impliedFormat":99},{"version":"5f8b299ecc1852b7b6eb9682a05f2dbfaae087e3363ecfbb9430350be32a97dc","impliedFormat":99},{"version":"6e304bbf3302fb015164bb3a7c7dfca6b3fdf57b1d56809173fed3663b42ced4","impliedFormat":99},{"version":"cd6aab42fef5395a16795cf23bbc9645dc9786af2c08dac3d61234948f72c67d","impliedFormat":99},{"version":"fe1f9b28ceb4ff76facbe0c363888d33d8265a0beb6fb5532a6e7a291490c795","impliedFormat":99},{"version":"b1d6ee25d690d99f44fd9c1c831bcdb9c0354f23dab49e14cdcfe5d0212bcba0","impliedFormat":99},{"version":"488958cf5865bce05ac5343cf1607ad7af72486a351c3afc7756fdd9fdafa233","impliedFormat":99},{"version":"424a44fb75e76db02794cf0e26c61510daf8bf4d4b43ebbeb6adc70be1dd68b4","impliedFormat":99},{"version":"519f0d3b64727722e5b188c679c1f741997be640fdcd30435a2c7ba006667d6e","impliedFormat":99},{"version":"49324b7e03d2c9081d66aef8b0a8129f0244ecac4fb11378520c9816d693ce7a","impliedFormat":99},{"version":"bbe31d874c9a2ac21ea0c5cee6ded26697f30961dca6f18470145b1c8cd66b21","impliedFormat":99},{"version":"38a5641908bc748e9829ab1d6147239a3797918fab932f0aa81543d409732990","impliedFormat":99},{"version":"125da449b5464b2873f7642e57452ac045a0219f0cb6a5d3391a15cc4336c471","impliedFormat":99},{"version":"d1cacc1ae76a3698129f4289657a18de22057bb6c00e7bf36aa2e9c5365eec66","impliedFormat":99},{"version":"0468caf7769824cd6ddd202c5f37c574bcc3f5c158ef401b71ca3ece8de5462f","impliedFormat":99},{"version":"966a181ee1c0cecd2aaa9cf8281f3b8036d159db7963788a7bfae78937c62717","impliedFormat":99},{"version":"8d11b30c4b66b9524db822608d279dc5e2b576d22ee21ee735a9b9a604524873","impliedFormat":99},{"version":"dac1ccee916195518aa964a933af099be396eaca9791dab44af01eb3209b9930","impliedFormat":99},{"version":"f95e4d1e6d3c5cbbbf6e216ea4742138e52402337eb3416170eabb2fdbe5c762","impliedFormat":99},{"version":"22b43e7fd932e3aa63e5bee8247d408ad1e5a29fe8008123dc6a4bd35ea49ded","impliedFormat":99},{"version":"aeea49091e71d123a471642c74a5dc4d8703476fd6254002d27c75728aa13691","impliedFormat":99},{"version":"0d4db4b482d5dec495943683ba3b6bb4026747a351c614fafdbaf54c00c5adab","impliedFormat":99},{"version":"45ac0268333f7bf8098595cda739764c429cd5d182ae4a127b3ca33405f81431","impliedFormat":99},{"version":"253c3549b055ad942ee115bef4c586c0c56e6b11aeb6353f171c7f0ffec8df07","impliedFormat":99},{"version":"0f1791a8891729f010e49f29b921b05afd45e5ba8430663c8ece4edeee748b1b","impliedFormat":99},{"version":"dfa585104fc407014e2a9ceafb748a50284fb282a561e9d8eb08562e64b1cb24","impliedFormat":99},{"version":"51130d85941585df457441c29e8f157ddc01e4978573a02a806a04c687b6748a","impliedFormat":99},{"version":"40f0d41f453dc614b2a3c552e7aca5ce723bb84d6e6bca8a6dcad1dca4cd9449","impliedFormat":99},{"version":"404627849c9714a78663bd299480dd94e75e457f5322caf0c7e169e5adab0a18","impliedFormat":99},{"version":"208306f454635e47d72092763c801f0ffcb7e6cba662d553eee945bd50987bb1","impliedFormat":99},{"version":"8b5a27971e8ede37415e42f24aae6fd227c2a1d2a93d6b8c7791a13abcde0f0b","impliedFormat":99},{"version":"1c106d58790bab5e144b35eeb31186f2be215d651e4000586fc021140cd324b9","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"c140653685b9af4f01e4283dd9d759126cb15f1c41721270c0bdbb55fd72673f","impliedFormat":99},{"version":"5844202ecdcea1f8612a826905623d93add56c9c1988df6471dff9999d92c0a7","impliedFormat":99},{"version":"b268ce0a7f489c27d8bf748c2563fd81092ead98e4c30f673670297250b774bd","impliedFormat":99},{"version":"9b0ca5de920ec607eecea5b40402fca8e705dfb3ff5e72cc91e2ac6d8f390985","impliedFormat":99},{"version":"efad5849e64223db373bbabc5eb6b2566d16e3bd34c0fd29ccf8bbe8a8a655e7","impliedFormat":99},{"version":"4c1c9ab197c2596bace50281bacf3ce3276f22aaef1c8398af0137779b577f24","impliedFormat":99},{"version":"a1acd535289b4cca0466376c1af5a99d887c91483792346be3b0b58d5f72eead","impliedFormat":99},{"version":"cdb6a1ed879f191ad45615cb4b7e7935237de0cfb8d410c7eb1fd9707d9c17ac","impliedFormat":99},{"version":"ca1debd87d50ade2eba2d0594eb47ab98e050a9fa08f879c750d80863dd3ce4c","impliedFormat":99},{"version":"dc01a3cc4787313606d58b1c6f3a4c5bf0d3fe4e3789dfdcde28d59bfd9b7c59","impliedFormat":99},{"version":"73ab9b053ad2a5ddee2f4c9b8cd36a436974dd5fa5a7c74940dd6b92e4d8e02d","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"fbf43977fd4aead581f1ef81146a4ff6fafe6bec7fac2b4cbd5a00577ab0c1c7","impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"961cf7535b9c521cd634055b1b6ac49b94d055f0b573ce7fdc4cfaddab080b7c","impliedFormat":1},{"version":"806a8c6daae69e5695e7200d9eca6bc1e4298f38d90edda3ce67a794da31a24f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"5e0c66763bda6ad4efe2ff62b2ca3a8af0b8d5b58a09429bbf9e433706c32f49","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"cd9189eacf0f9143b8830e9d6769335aa6d902c04195f04145bcbf19e7f26fcb","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"c2a6a737189ced24ffe0634e9239b087e4c26378d0490f95141b9b9b042b746c","impliedFormat":1},{"version":"b417ebd02808fde5eb1cd840ac76037bc59f97fec7873bee8f7f5682b879df80","signature":"a4b893ceddb74f1fd12c50ea85def9b0039bd0ed244616aac2f9a8cc33df420f"},{"version":"465f1ca1f11e6a1b01b043a93196b7f8fc09c985b8e3084804d9a3938aad588d","impliedFormat":1},{"version":"00b72e597dcd6ff7bf772918c78c41dc7c68e239af658cf452bff645ebdc485d","impliedFormat":1},{"version":"17b183b69a3dd3cca2505cee7ff70501c574343ad49a385c9acb5b5299e1ba73","impliedFormat":1},{"version":"b26d3fa6859459f64c93e0c154bfc7a8b216b4cf1e241ca6b67e67ee8248626b","impliedFormat":1},{"version":"91cab3f4d6ab131c74ea8772a8c182bdb9c52500fb0388ef9fd2828c084b8087","impliedFormat":1},{"version":"13b8acfead5a8519fad35e43f58c62b946a24f2a1311254250b840b15b2051cd","impliedFormat":99},{"version":"f451e74f5439b1155d452482d2118cc26b5809a16512ef46a02fc940dcd4703e","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"}],"root":[286,293],"options":{"esModuleInterop":true,"module":1,"skipLibCheck":true,"strict":true,"target":7},"referencedMap":[[130,1],[143,2],[142,3],[141,1],[140,4],[129,5],[128,6],[158,7],[162,8],[159,9],[160,10],[161,11],[157,12],[113,13],[114,13],[115,13],[116,13],[125,14],[99,13],[144,15],[124,16],[117,13],[118,13],[119,13],[100,17],[156,13],[120,13],[121,18],[122,19],[123,18],[101,20],[154,21],[155,22],[152,23],[150,24],[148,25],[147,26],[151,27],[153,28],[146,28],[149,28],[145,29],[127,30],[111,31],[112,31],[110,32],[108,33],[109,32],[106,34],[126,35],[107,36],[139,37],[137,38],[138,39],[136,40],[131,41],[135,42],[133,43],[132,13],[134,44],[98,13],[88,13],[89,13],[97,13],[54,45],[58,45],[55,13],[59,46],[56,13],[57,47],[105,48],[104,49],[102,36],[103,50],[60,51],[76,52],[84,53],[82,3],[78,54],[81,55],[80,3],[79,56],[83,54],[77,3],[75,57],[65,3],[68,58],[67,59],[66,13],[73,60],[64,59],[61,59],[72,59],[69,61],[71,13],[70,13],[74,59],[63,62],[96,63],[90,64],[91,65],[87,66],[86,66],[93,65],[92,65],[95,64],[94,64],[85,67],[285,68],[225,69],[226,69],[227,70],[165,71],[228,72],[229,73],[230,74],[163,13],[231,75],[232,76],[233,77],[234,78],[235,79],[236,80],[237,80],[238,81],[239,82],[240,83],[241,84],[166,13],[164,13],[242,85],[243,86],[244,87],[284,88],[245,89],[246,90],[247,89],[248,91],[249,92],[250,93],[251,94],[252,94],[253,94],[254,95],[255,96],[256,97],[257,98],[258,99],[259,100],[260,100],[261,101],[262,13],[263,13],[264,102],[265,103],[266,102],[267,104],[268,105],[269,106],[270,107],[271,108],[272,109],[273,110],[274,111],[275,112],[276,113],[277,114],[278,115],[279,116],[280,117],[281,118],[167,89],[168,13],[169,119],[170,120],[171,13],[172,121],[173,13],[216,122],[217,123],[218,124],[219,124],[220,125],[221,13],[222,72],[223,126],[224,123],[282,127],[283,128],[291,129],[292,130],[287,13],[288,13],[290,131],[289,132],[174,13],[62,13],[51,13],[52,13],[10,13],[8,13],[9,13],[14,13],[13,13],[2,13],[15,13],[16,13],[17,13],[18,13],[19,13],[20,13],[21,13],[22,13],[3,13],[23,13],[24,13],[4,13],[25,13],[29,13],[26,13],[27,13],[28,13],[30,13],[31,13],[32,13],[5,13],[33,13],[34,13],[35,13],[36,13],[6,13],[40,13],[37,13],[38,13],[39,13],[41,13],[7,13],[42,13],[53,13],[47,13],[48,13],[43,13],[44,13],[45,13],[46,13],[1,13],[49,13],[50,13],[12,13],[11,13],[192,133],[204,134],[190,135],[205,136],[214,137],[181,138],[182,139],[180,140],[213,68],[208,141],[212,142],[184,143],[201,144],[183,145],[211,146],[178,147],[179,141],[185,148],[186,13],[191,149],[189,148],[176,150],[215,151],[206,152],[195,153],[194,148],[196,154],[199,155],[193,156],[197,157],[209,68],[187,158],[188,159],[200,160],[177,136],[203,161],[202,148],[198,162],[207,13],[175,13],[210,163],[286,164],[293,165]],"affectedFilesPendingEmit":[286,293],"version":"5.9.3"} \ No newline at end of file From 42fd3a0883b6a8905207c6a95880e9bba96bbca8 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 9 Jan 2026 23:36:48 -0600 Subject: [PATCH 02/77] feat(ertp-ledgerguise): add db-backed issuer kit and persistence --- packages/ertp-ledgerguise/CONTRIBUTING.md | 6 + packages/ertp-ledgerguise/package.json | 1 + .../ertp-ledgerguise/scripts/codegen-sql.mjs | 17 ++ packages/ertp-ledgerguise/sql/gc_empty.sql | 64 ++++ packages/ertp-ledgerguise/src/index.ts | 275 +++++++++++++++++- packages/ertp-ledgerguise/src/jessie-tools.ts | 10 + packages/ertp-ledgerguise/src/sql/gc_empty.ts | 4 + .../ertp-ledgerguise/test/ledgerguise.test.ts | 97 +++++- .../ertp-ledgerguise/tsconfig.tsbuildinfo | 2 +- 9 files changed, 457 insertions(+), 19 deletions(-) create mode 100644 packages/ertp-ledgerguise/scripts/codegen-sql.mjs create mode 100644 packages/ertp-ledgerguise/sql/gc_empty.sql create mode 100644 packages/ertp-ledgerguise/src/jessie-tools.ts create mode 100644 packages/ertp-ledgerguise/src/sql/gc_empty.ts diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index 14ffe09..222c1d8 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -35,9 +35,15 @@ Thanks for your interest in contributing! This package provides an ERTP facade o - Use `rg` for searches. - Avoid network access unless explicitly requested. +- Use `npm run codegen:sql` to regenerate `src/sql/gc_empty.ts` from `sql/gc_empty.sql`. Keep codegen scripts ESM (no `.cjs`). +- No CommonJS in this package (source, tests, scripts). Use ESM everywhere. +- TODO: use full extensions in module specifiers. ## Agent Tactics +the mutable let point is not agent tactics; it's code style. likewise API + surface stuff. make a new subsection for the API surface freezing stuff. + - Always check for static errors before running tests. - Always run all tests relevant to any code changes before asking the user for further input. - Prefer avoiding mutable `let` for tests; use an IIFE or other pattern so types can be inferred. diff --git a/packages/ertp-ledgerguise/package.json b/packages/ertp-ledgerguise/package.json index f1f8d3b..6ef9100 100644 --- a/packages/ertp-ledgerguise/package.json +++ b/packages/ertp-ledgerguise/package.json @@ -3,6 +3,7 @@ "version": "0.0.1", "private": true, "scripts": { + "codegen:sql": "node scripts/codegen-sql.mjs", "lint:types": "tsc -p tsconfig.json --noEmit --incremental", "test": "ava", "check": "npm run lint:types && npm run test" diff --git a/packages/ertp-ledgerguise/scripts/codegen-sql.mjs b/packages/ertp-ledgerguise/scripts/codegen-sql.mjs new file mode 100644 index 0000000..a3d676f --- /dev/null +++ b/packages/ertp-ledgerguise/scripts/codegen-sql.mjs @@ -0,0 +1,17 @@ +import { readFile, writeFile } from 'node:fs/promises'; +import { createRequire } from 'node:module'; + +const require = createRequire(import.meta.url); +const inputPath = require.resolve('../sql/gc_empty.sql'); +const outputUrl = new URL('../src/sql/gc_empty.ts', import.meta.url); + +const sql = await readFile(inputPath, 'utf8'); + +const contents = `// This file is generated by scripts/codegen-sql.mjs. Do not edit. +const { freeze } = Object; + +export const gcEmptySql = freeze(${JSON.stringify(sql)}); +`; + +await writeFile(outputUrl, contents); +console.log(`wrote ${outputUrl.pathname}`); diff --git a/packages/ertp-ledgerguise/sql/gc_empty.sql b/packages/ertp-ledgerguise/sql/gc_empty.sql new file mode 100644 index 0000000..4d568b6 --- /dev/null +++ b/packages/ertp-ledgerguise/sql/gc_empty.sql @@ -0,0 +1,64 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE gnclock ( Hostname varchar(255), PID int ); +CREATE TABLE versions(table_name text(50) PRIMARY KEY NOT NULL, table_version integer NOT NULL); +INSERT INTO versions VALUES('Gnucash',4000008); +INSERT INTO versions VALUES('Gnucash-Resave',19920); +INSERT INTO versions VALUES('books',1); +INSERT INTO versions VALUES('commodities',1); +INSERT INTO versions VALUES('accounts',1); +INSERT INTO versions VALUES('budgets',1); +INSERT INTO versions VALUES('budget_amounts',1); +INSERT INTO versions VALUES('prices',3); +INSERT INTO versions VALUES('transactions',4); +INSERT INTO versions VALUES('splits',5); +INSERT INTO versions VALUES('slots',4); +INSERT INTO versions VALUES('recurrences',2); +INSERT INTO versions VALUES('schedxactions',1); +INSERT INTO versions VALUES('lots',2); +INSERT INTO versions VALUES('billterms',2); +INSERT INTO versions VALUES('customers',2); +INSERT INTO versions VALUES('employees',2); +INSERT INTO versions VALUES('entries',4); +INSERT INTO versions VALUES('invoices',4); +INSERT INTO versions VALUES('jobs',1); +INSERT INTO versions VALUES('orders',1); +INSERT INTO versions VALUES('taxtables',2); +INSERT INTO versions VALUES('taxtable_entries',3); +INSERT INTO versions VALUES('vendors',1); +CREATE TABLE books(guid text(32) PRIMARY KEY NOT NULL, root_account_guid text(32) NOT NULL, root_template_guid text(32) NOT NULL); +INSERT INTO books VALUES('ee639113a5b947afb3a47eb59fa9f81b','c3b805a829d64f168c3fe7ee18a10171','ae72669b9c264a8f9082cd0a042e7c76'); +CREATE TABLE commodities(guid text(32) PRIMARY KEY NOT NULL, namespace text(2048) NOT NULL, mnemonic text(2048) NOT NULL, fullname text(2048), cusip text(2048), fraction integer NOT NULL, quote_flag integer NOT NULL, quote_source text(2048), quote_tz text(2048)); +INSERT INTO commodities VALUES('c7577e521c7f4f8dbf8e6a4ac2063429','CURRENCY','USD','US Dollar','840',100,1,'currency',''); +CREATE TABLE accounts(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, account_type text(2048) NOT NULL, commodity_guid text(32), commodity_scu integer NOT NULL, non_std_scu integer NOT NULL, parent_guid text(32), code text(2048), description text(2048), hidden integer, placeholder integer); +INSERT INTO accounts VALUES('c3b805a829d64f168c3fe7ee18a10171','Root Account','ROOT','c7577e521c7f4f8dbf8e6a4ac2063429',100,0,NULL,'','',0,0); +INSERT INTO accounts VALUES('ae72669b9c264a8f9082cd0a042e7c76','Template Root','ROOT',NULL,0,0,NULL,'','',0,0); +CREATE TABLE budgets(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, description text(2048), num_periods integer NOT NULL); +CREATE TABLE budget_amounts(id integer PRIMARY KEY AUTOINCREMENT NOT NULL, budget_guid text(32) NOT NULL, account_guid text(32) NOT NULL, period_num integer NOT NULL, amount_num bigint NOT NULL, amount_denom bigint NOT NULL); +CREATE TABLE prices(guid text(32) PRIMARY KEY NOT NULL, commodity_guid text(32) NOT NULL, currency_guid text(32) NOT NULL, date text(19) NOT NULL, source text(2048), type text(2048), value_num bigint NOT NULL, value_denom bigint NOT NULL); +CREATE TABLE transactions(guid text(32) PRIMARY KEY NOT NULL, currency_guid text(32) NOT NULL, num text(2048) NOT NULL, post_date text(19), enter_date text(19), description text(2048)); +CREATE TABLE splits(guid text(32) PRIMARY KEY NOT NULL, tx_guid text(32) NOT NULL, account_guid text(32) NOT NULL, memo text(2048) NOT NULL, action text(2048) NOT NULL, reconcile_state text(1) NOT NULL, reconcile_date text(19), value_num bigint NOT NULL, value_denom bigint NOT NULL, quantity_num bigint NOT NULL, quantity_denom bigint NOT NULL, lot_guid text(32)); +CREATE TABLE slots(id integer PRIMARY KEY AUTOINCREMENT NOT NULL, obj_guid text(32) NOT NULL, name text(4096) NOT NULL, slot_type integer NOT NULL, int64_val bigint, string_val text(4096), double_val float8, timespec_val text(19), guid_val text(32), numeric_val_num bigint, numeric_val_denom bigint, gdate_val text(8)); +INSERT INTO slots VALUES(1,'ee639113a5b947afb3a47eb59fa9f81b','counter_formats',9,0,NULL,NULL,'1970-01-01 00:00:00','7c6d852d3ce64c94ba85d24aca1b196a',0,1,NULL); +INSERT INTO slots VALUES(2,'ee639113a5b947afb3a47eb59fa9f81b','options',9,0,NULL,NULL,'1970-01-01 00:00:00','b1eae9c563504c828e0dbf71dcf1a05b',0,1,NULL); +INSERT INTO slots VALUES(3,'b1eae9c563504c828e0dbf71dcf1a05b','options/Budgeting',9,0,NULL,NULL,'1970-01-01 00:00:00','21086f80c3c64a9fa3dad10f6ba71901',0,1,NULL); +CREATE TABLE recurrences(id integer PRIMARY KEY AUTOINCREMENT NOT NULL, obj_guid text(32) NOT NULL, recurrence_mult integer NOT NULL, recurrence_period_type text(2048) NOT NULL, recurrence_period_start text(8) NOT NULL, recurrence_weekend_adjust text(2048) NOT NULL); +CREATE TABLE schedxactions(guid text(32) PRIMARY KEY NOT NULL, name text(2048), enabled integer NOT NULL, start_date text(8), end_date text(8), last_occur text(8), num_occur integer NOT NULL, rem_occur integer NOT NULL, auto_create integer NOT NULL, auto_notify integer NOT NULL, adv_creation integer NOT NULL, adv_notify integer NOT NULL, instance_count integer NOT NULL, template_act_guid text(32) NOT NULL); +CREATE TABLE lots(guid text(32) PRIMARY KEY NOT NULL, account_guid text(32), is_closed integer NOT NULL); +CREATE TABLE billterms(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, description text(2048) NOT NULL, refcount integer NOT NULL, invisible integer NOT NULL, parent text(32), type text(2048) NOT NULL, duedays integer, discountdays integer, discount_num bigint, discount_denom bigint, cutoff integer); +CREATE TABLE customers(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, id text(2048) NOT NULL, notes text(2048) NOT NULL, active integer NOT NULL, discount_num bigint NOT NULL, discount_denom bigint NOT NULL, credit_num bigint NOT NULL, credit_denom bigint NOT NULL, currency text(32) NOT NULL, tax_override integer NOT NULL, addr_name text(1024), addr_addr1 text(1024), addr_addr2 text(1024), addr_addr3 text(1024), addr_addr4 text(1024), addr_phone text(128), addr_fax text(128), addr_email text(256), shipaddr_name text(1024), shipaddr_addr1 text(1024), shipaddr_addr2 text(1024), shipaddr_addr3 text(1024), shipaddr_addr4 text(1024), shipaddr_phone text(128), shipaddr_fax text(128), shipaddr_email text(256), terms text(32), tax_included integer, taxtable text(32)); +CREATE TABLE employees(guid text(32) PRIMARY KEY NOT NULL, username text(2048) NOT NULL, id text(2048) NOT NULL, language text(2048) NOT NULL, acl text(2048) NOT NULL, active integer NOT NULL, currency text(32) NOT NULL, ccard_guid text(32), workday_num bigint NOT NULL, workday_denom bigint NOT NULL, rate_num bigint NOT NULL, rate_denom bigint NOT NULL, addr_name text(1024), addr_addr1 text(1024), addr_addr2 text(1024), addr_addr3 text(1024), addr_addr4 text(1024), addr_phone text(128), addr_fax text(128), addr_email text(256)); +CREATE TABLE entries(guid text(32) PRIMARY KEY NOT NULL, date text(19) NOT NULL, date_entered text(19), description text(2048), action text(2048), notes text(2048), quantity_num bigint, quantity_denom bigint, i_acct text(32), i_price_num bigint, i_price_denom bigint, i_discount_num bigint, i_discount_denom bigint, invoice text(32), i_disc_type text(2048), i_disc_how text(2048), i_taxable integer, i_taxincluded integer, i_taxtable text(32), b_acct text(32), b_price_num bigint, b_price_denom bigint, bill text(32), b_taxable integer, b_taxincluded integer, b_taxtable text(32), b_paytype integer, billable integer, billto_type integer, billto_guid text(32), order_guid text(32)); +CREATE TABLE invoices(guid text(32) PRIMARY KEY NOT NULL, id text(2048) NOT NULL, date_opened text(19), date_posted text(19), notes text(2048) NOT NULL, active integer NOT NULL, currency text(32) NOT NULL, owner_type integer, owner_guid text(32), terms text(32), billing_id text(2048), post_txn text(32), post_lot text(32), post_acc text(32), billto_type integer, billto_guid text(32), charge_amt_num bigint, charge_amt_denom bigint); +CREATE TABLE jobs(guid text(32) PRIMARY KEY NOT NULL, id text(2048) NOT NULL, name text(2048) NOT NULL, reference text(2048) NOT NULL, active integer NOT NULL, owner_type integer, owner_guid text(32)); +CREATE TABLE orders(guid text(32) PRIMARY KEY NOT NULL, id text(2048) NOT NULL, notes text(2048) NOT NULL, reference text(2048) NOT NULL, active integer NOT NULL, date_opened text(19) NOT NULL, date_closed text(19) NOT NULL, owner_type integer NOT NULL, owner_guid text(32) NOT NULL); +CREATE TABLE taxtables(guid text(32) PRIMARY KEY NOT NULL, name text(50) NOT NULL, refcount bigint NOT NULL, invisible integer NOT NULL, parent text(32)); +CREATE TABLE taxtable_entries(id integer PRIMARY KEY AUTOINCREMENT NOT NULL, taxtable text(32) NOT NULL, account text(32) NOT NULL, amount_num bigint NOT NULL, amount_denom bigint NOT NULL, type integer NOT NULL); +CREATE TABLE vendors(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, id text(2048) NOT NULL, notes text(2048) NOT NULL, currency text(32) NOT NULL, active integer NOT NULL, tax_override integer NOT NULL, addr_name text(1024), addr_addr1 text(1024), addr_addr2 text(1024), addr_addr3 text(1024), addr_addr4 text(1024), addr_phone text(128), addr_fax text(128), addr_email text(256), terms text(32), tax_inc text(2048), tax_table text(32)); +DELETE FROM sqlite_sequence; +INSERT INTO sqlite_sequence VALUES('slots',3); +CREATE INDEX tx_post_date_index ON transactions(post_date); +CREATE INDEX splits_tx_guid_index ON splits(tx_guid); +CREATE INDEX splits_account_guid_index ON splits(account_guid); +CREATE INDEX slots_guid_index ON slots(obj_guid); +COMMIT; diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 4747c5c..a05d8b1 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -1,10 +1,279 @@ +/** + * @file ERTP facade backed by a GnuCash sqlite database. + * + * Table of contents (entry points): + * @see initGnuCashSchema + * @see createIssuerKit + * @see openIssuerKit + */ + +import { createHash } from 'node:crypto'; import type { IssuerKit } from '@agoric/ertp'; import type { Database } from 'better-sqlite3'; +import { gcEmptySql } from './sql/gc_empty'; +import { freezeProps } from './jessie-tools'; + +export type Guid = string & { __guidBrand: 'Guid' }; +// TODO: consider a template-literal Guid type like `${hex}${hex}${string}`. + +export const asGuid = (value: string): Guid => value as Guid; + +export type CommoditySpec = { + namespace?: string; + mnemonic: string; + fullname?: string; + fraction?: number; + quoteFlag?: number; +}; + +export type CreateIssuerConfig = { + db: Database; + commodity: CommoditySpec; + /** + * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. + */ + makeGuid: () => Guid; +}; -export type LedgerguiseConfig = { +export type OpenIssuerConfig = { db: Database; + commodityGuid: Guid; + /** + * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. + */ + makeGuid: () => Guid; +}; + +/** + * Initialize an empty sqlite database with the GnuCash schema. + * @see ./sql/gc_empty.sql + */ +export const initGnuCashSchema = (db: Database): void => { + db.exec(gcEmptySql); +}; + +const ensureCommodityRow = ( + db: Database, + guid: Guid, + commodity: CommoditySpec, +): void => { + const { + namespace = 'COMMODITY', + mnemonic, + fullname = mnemonic, + fraction = 1, + quoteFlag = 0, + } = commodity; + const insert = db.prepare( + [ + 'INSERT OR IGNORE INTO commodities(', + 'guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz', + ') VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL)', + ].join(' '), + ); + insert.run(guid, namespace, mnemonic, fullname, fraction, quoteFlag); +}; + +const makeDeterministicGuid = (seed: string): Guid => + asGuid(createHash('sha256').update(seed).digest('hex').slice(0, 32)); + +const ensureAccountRow = ( + db: Database, + accountGuid: Guid, + name: string, + commodityGuid: Guid, + accountType = 'ASSET', +): void => { + db.prepare( + [ + 'INSERT OR IGNORE INTO accounts(', + 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', + ') VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0)', + ].join(' '), + ).run(accountGuid, name, accountType, commodityGuid, 1, 0); +}; + +type AmountLike = { value: bigint }; + +type AccountPurse = { + deposit: (payment: object) => unknown; + withdraw: (amount: AmountLike) => object; + getCurrentAmount: () => AmountLike; +}; + +type AccountPurseAccess = { + makeAccountPurse: (accountGuid: Guid) => AccountPurse; + openAccountPurse: (accountGuid: Guid) => AccountPurse; +}; + +type IssuerKitForCommodity = { + kit: IssuerKit; + accounts: AccountPurseAccess; + purseGuids: WeakMap; +}; + +const makeIssuerKitForCommodity = ( + db: Database, + commodityGuid: Guid, + makeGuid: () => Guid, +): IssuerKitForCommodity => { + const { freeze } = Object; + // TODO: consider validation of DB capability and schema. + const displayInfo = freeze({ assetKind: 'nat' as const }); + const amountShape = freeze({}); + const paymentRecords = new WeakMap(); + const makeAmount = (value: bigint) => freeze({ brand, value }); + const makePayment = (amount: bigint) => { + const payment = freeze({}); + paymentRecords.set(payment, { amount, live: true }); + return payment; + }; + const getAllegedName = () => { + const row = db + .prepare<[string], { fullname: string | null; mnemonic: string }>( + 'SELECT fullname, mnemonic FROM commodities WHERE guid = ?', + ) + .get(commodityGuid); + return row?.fullname || row?.mnemonic || 'GnuCash'; + }; + const balanceAccountGuid = makeDeterministicGuid(`ledgerguise-balance:${commodityGuid}`); + ensureAccountRow(db, balanceAccountGuid, 'Ledgerguise Balance', commodityGuid, 'EQUITY'); + const getBalance = (accountGuid: Guid) => { + const row = db + .prepare<[string], { qty: string }>( + 'SELECT COALESCE(SUM(quantity_num), 0) AS qty FROM splits WHERE account_guid = ?', + ) + .get(accountGuid); + return row ? BigInt(row.qty) : 0n; + }; + const recordSplit = (txGuid: Guid, accountGuid: Guid, amount: bigint) => { + const splitGuid = makeGuid(); + db.prepare( + [ + 'INSERT INTO splits(', + 'guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date,', + 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', + ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', + ].join(' '), + ).run(splitGuid, txGuid, accountGuid, '', '', 'n', amount.toString(), 1, amount.toString(), 1); + }; + const recordTransaction = (txGuid: Guid, amount: bigint) => { + const now = new Date().toISOString().slice(0, 19); + db.prepare( + [ + 'INSERT INTO transactions(', + 'guid, currency_guid, num, post_date, enter_date, description', + ') VALUES (?, ?, ?, ?, ?, ?)', + ].join(' '), + ).run(txGuid, commodityGuid, '', now, now, `ledgerguise ${amount.toString()}`); + }; + const applyTransfer = (accountGuid: Guid, amount: bigint) => { + const txGuid = makeGuid(); + recordTransaction(txGuid, amount); + recordSplit(txGuid, accountGuid, amount); + recordSplit(txGuid, balanceAccountGuid, -amount); + }; + const purseGuids = new WeakMap(); + const makePurse = (accountGuid: Guid, name: string): AccountPurse => { + ensureAccountRow(db, accountGuid, name, commodityGuid); + const deposit = (payment: object) => { + const record = paymentRecords.get(payment); + if (!record?.live) throw new Error('payment not live'); + record.live = false; + applyTransfer(accountGuid, record.amount); + return makeAmount(getBalance(accountGuid)); + }; + const withdraw = (amount: AmountLike) => { + const balance = getBalance(accountGuid); + if (amount.value > balance) throw new Error('insufficient funds'); + applyTransfer(accountGuid, -amount.value); + return makePayment(amount.value); + }; + const getCurrentAmount = () => makeAmount(getBalance(accountGuid)); + const purse = freezeProps({ deposit, withdraw, getCurrentAmount }); + purseGuids.set(purse, accountGuid); + return purse; + }; + const brand = freezeProps({ + isMyIssuer: async () => false, + getAllegedName: () => getAllegedName(), + getDisplayInfo: () => displayInfo, + getAmountShape: () => amountShape, + }); + const issuer = freezeProps({ + getBrand: () => brand, + getAllegedName: () => getAllegedName(), + getAssetKind: () => 'nat' as const, + getDisplayInfo: () => displayInfo, + makeEmptyPurse: () => { + const accountGuid = makeGuid(); + return makePurse(accountGuid, accountGuid); + }, + isLive: async (payment: object) => paymentRecords.get(payment)?.live ?? false, + getAmountOf: async (payment: object) => makeAmount(paymentRecords.get(payment)?.amount ?? 0n), + burn: async (payment: object) => { + const record = paymentRecords.get(payment); + if (!record?.live) throw new Error('payment not live'); + record.live = false; + return makeAmount(record.amount); + }, + }); + const mint = freezeProps({ + getIssuer: () => issuer, + mintPayment: (amount: { value: bigint }) => makePayment(amount.value), + }); + const mintRecoveryPurse = makePurse( + makeDeterministicGuid(`ledgerguise:recovery:${commodityGuid}`), + '__mintRecovery', + ); + const kit = freeze({ + brand, + issuer, + mint, + mintRecoveryPurse, + displayInfo, + }) as unknown as IssuerKit; + const accounts = freezeProps({ + makeAccountPurse: (accountGuid: Guid) => makePurse(accountGuid, accountGuid), + openAccountPurse: (accountGuid: Guid) => makePurse(accountGuid, accountGuid), + }); + return freezeProps({ kit, accounts, purseGuids }); +}; + +export type IssuerKitWithGuid = IssuerKit & { commodityGuid: Guid }; +export type IssuerKitWithPurseGuids = IssuerKitWithGuid & { + purses: { + getGuid: (purse: unknown) => Guid; + }; +}; + +/** + * Create a new GnuCash commodity entry and return an ERTP kit bound to it. + * The returned kit includes `commodityGuid` and a `purses.getGuid()` facet. + */ +export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseGuids => { + const { db, commodity, makeGuid } = config; + // TODO: consider validation of DB capability and schema. + const commodityGuid = makeGuid(); + ensureCommodityRow(db, commodityGuid, commodity); + const { kit, purseGuids } = makeIssuerKitForCommodity(db, commodityGuid, makeGuid); + const purses = freezeProps({ + getGuid: (purse: unknown) => { + const guid = purseGuids.get(purse as AccountPurse); + if (!guid) throw new Error('unknown purse'); + return guid; + }, + }); + return freezeProps({ ...kit, commodityGuid, purses }) as IssuerKitWithPurseGuids; }; -export const makeLedgerguiseKit = (_config: LedgerguiseConfig): IssuerKit => { - throw new Error('Not implemented'); +/** + * Open an existing commodity by GUID and return the kit plus account access. + */ +export const openIssuerKit = (config: OpenIssuerConfig): IssuerKitForCommodity => { + const { db, commodityGuid, makeGuid } = config; + // TODO: consider validation of DB capability and schema. + // TODO: verify commodity record matches expected issuer/brand metadata. + // TODO: add a commodity-vs-currency option (namespace, fraction defaults, and naming rules). + return makeIssuerKitForCommodity(db, commodityGuid, makeGuid); }; diff --git a/packages/ertp-ledgerguise/src/jessie-tools.ts b/packages/ertp-ledgerguise/src/jessie-tools.ts new file mode 100644 index 0000000..0f24784 --- /dev/null +++ b/packages/ertp-ledgerguise/src/jessie-tools.ts @@ -0,0 +1,10 @@ +export const freezeProps = >( + obj: T, +): Readonly => { + for (const value of Object.values(obj)) { + if (typeof value === 'function') { + Object.freeze(value); + } + } + return Object.freeze(obj); +}; diff --git a/packages/ertp-ledgerguise/src/sql/gc_empty.ts b/packages/ertp-ledgerguise/src/sql/gc_empty.ts new file mode 100644 index 0000000..0becabc --- /dev/null +++ b/packages/ertp-ledgerguise/src/sql/gc_empty.ts @@ -0,0 +1,4 @@ +// This file is generated by scripts/codegen-sql.mjs. Do not edit. +const { freeze } = Object; + +export const gcEmptySql = freeze("PRAGMA foreign_keys=OFF;\nBEGIN TRANSACTION;\nCREATE TABLE gnclock ( Hostname varchar(255), PID int );\nCREATE TABLE versions(table_name text(50) PRIMARY KEY NOT NULL, table_version integer NOT NULL);\nINSERT INTO versions VALUES('Gnucash',4000008);\nINSERT INTO versions VALUES('Gnucash-Resave',19920);\nINSERT INTO versions VALUES('books',1);\nINSERT INTO versions VALUES('commodities',1);\nINSERT INTO versions VALUES('accounts',1);\nINSERT INTO versions VALUES('budgets',1);\nINSERT INTO versions VALUES('budget_amounts',1);\nINSERT INTO versions VALUES('prices',3);\nINSERT INTO versions VALUES('transactions',4);\nINSERT INTO versions VALUES('splits',5);\nINSERT INTO versions VALUES('slots',4);\nINSERT INTO versions VALUES('recurrences',2);\nINSERT INTO versions VALUES('schedxactions',1);\nINSERT INTO versions VALUES('lots',2);\nINSERT INTO versions VALUES('billterms',2);\nINSERT INTO versions VALUES('customers',2);\nINSERT INTO versions VALUES('employees',2);\nINSERT INTO versions VALUES('entries',4);\nINSERT INTO versions VALUES('invoices',4);\nINSERT INTO versions VALUES('jobs',1);\nINSERT INTO versions VALUES('orders',1);\nINSERT INTO versions VALUES('taxtables',2);\nINSERT INTO versions VALUES('taxtable_entries',3);\nINSERT INTO versions VALUES('vendors',1);\nCREATE TABLE books(guid text(32) PRIMARY KEY NOT NULL, root_account_guid text(32) NOT NULL, root_template_guid text(32) NOT NULL);\nINSERT INTO books VALUES('ee639113a5b947afb3a47eb59fa9f81b','c3b805a829d64f168c3fe7ee18a10171','ae72669b9c264a8f9082cd0a042e7c76');\nCREATE TABLE commodities(guid text(32) PRIMARY KEY NOT NULL, namespace text(2048) NOT NULL, mnemonic text(2048) NOT NULL, fullname text(2048), cusip text(2048), fraction integer NOT NULL, quote_flag integer NOT NULL, quote_source text(2048), quote_tz text(2048));\nINSERT INTO commodities VALUES('c7577e521c7f4f8dbf8e6a4ac2063429','CURRENCY','USD','US Dollar','840',100,1,'currency','');\nCREATE TABLE accounts(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, account_type text(2048) NOT NULL, commodity_guid text(32), commodity_scu integer NOT NULL, non_std_scu integer NOT NULL, parent_guid text(32), code text(2048), description text(2048), hidden integer, placeholder integer);\nINSERT INTO accounts VALUES('c3b805a829d64f168c3fe7ee18a10171','Root Account','ROOT','c7577e521c7f4f8dbf8e6a4ac2063429',100,0,NULL,'','',0,0);\nINSERT INTO accounts VALUES('ae72669b9c264a8f9082cd0a042e7c76','Template Root','ROOT',NULL,0,0,NULL,'','',0,0);\nCREATE TABLE budgets(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, description text(2048), num_periods integer NOT NULL);\nCREATE TABLE budget_amounts(id integer PRIMARY KEY AUTOINCREMENT NOT NULL, budget_guid text(32) NOT NULL, account_guid text(32) NOT NULL, period_num integer NOT NULL, amount_num bigint NOT NULL, amount_denom bigint NOT NULL);\nCREATE TABLE prices(guid text(32) PRIMARY KEY NOT NULL, commodity_guid text(32) NOT NULL, currency_guid text(32) NOT NULL, date text(19) NOT NULL, source text(2048), type text(2048), value_num bigint NOT NULL, value_denom bigint NOT NULL);\nCREATE TABLE transactions(guid text(32) PRIMARY KEY NOT NULL, currency_guid text(32) NOT NULL, num text(2048) NOT NULL, post_date text(19), enter_date text(19), description text(2048));\nCREATE TABLE splits(guid text(32) PRIMARY KEY NOT NULL, tx_guid text(32) NOT NULL, account_guid text(32) NOT NULL, memo text(2048) NOT NULL, action text(2048) NOT NULL, reconcile_state text(1) NOT NULL, reconcile_date text(19), value_num bigint NOT NULL, value_denom bigint NOT NULL, quantity_num bigint NOT NULL, quantity_denom bigint NOT NULL, lot_guid text(32));\nCREATE TABLE slots(id integer PRIMARY KEY AUTOINCREMENT NOT NULL, obj_guid text(32) NOT NULL, name text(4096) NOT NULL, slot_type integer NOT NULL, int64_val bigint, string_val text(4096), double_val float8, timespec_val text(19), guid_val text(32), numeric_val_num bigint, numeric_val_denom bigint, gdate_val text(8));\nINSERT INTO slots VALUES(1,'ee639113a5b947afb3a47eb59fa9f81b','counter_formats',9,0,NULL,NULL,'1970-01-01 00:00:00','7c6d852d3ce64c94ba85d24aca1b196a',0,1,NULL);\nINSERT INTO slots VALUES(2,'ee639113a5b947afb3a47eb59fa9f81b','options',9,0,NULL,NULL,'1970-01-01 00:00:00','b1eae9c563504c828e0dbf71dcf1a05b',0,1,NULL);\nINSERT INTO slots VALUES(3,'b1eae9c563504c828e0dbf71dcf1a05b','options/Budgeting',9,0,NULL,NULL,'1970-01-01 00:00:00','21086f80c3c64a9fa3dad10f6ba71901',0,1,NULL);\nCREATE TABLE recurrences(id integer PRIMARY KEY AUTOINCREMENT NOT NULL, obj_guid text(32) NOT NULL, recurrence_mult integer NOT NULL, recurrence_period_type text(2048) NOT NULL, recurrence_period_start text(8) NOT NULL, recurrence_weekend_adjust text(2048) NOT NULL);\nCREATE TABLE schedxactions(guid text(32) PRIMARY KEY NOT NULL, name text(2048), enabled integer NOT NULL, start_date text(8), end_date text(8), last_occur text(8), num_occur integer NOT NULL, rem_occur integer NOT NULL, auto_create integer NOT NULL, auto_notify integer NOT NULL, adv_creation integer NOT NULL, adv_notify integer NOT NULL, instance_count integer NOT NULL, template_act_guid text(32) NOT NULL);\nCREATE TABLE lots(guid text(32) PRIMARY KEY NOT NULL, account_guid text(32), is_closed integer NOT NULL);\nCREATE TABLE billterms(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, description text(2048) NOT NULL, refcount integer NOT NULL, invisible integer NOT NULL, parent text(32), type text(2048) NOT NULL, duedays integer, discountdays integer, discount_num bigint, discount_denom bigint, cutoff integer);\nCREATE TABLE customers(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, id text(2048) NOT NULL, notes text(2048) NOT NULL, active integer NOT NULL, discount_num bigint NOT NULL, discount_denom bigint NOT NULL, credit_num bigint NOT NULL, credit_denom bigint NOT NULL, currency text(32) NOT NULL, tax_override integer NOT NULL, addr_name text(1024), addr_addr1 text(1024), addr_addr2 text(1024), addr_addr3 text(1024), addr_addr4 text(1024), addr_phone text(128), addr_fax text(128), addr_email text(256), shipaddr_name text(1024), shipaddr_addr1 text(1024), shipaddr_addr2 text(1024), shipaddr_addr3 text(1024), shipaddr_addr4 text(1024), shipaddr_phone text(128), shipaddr_fax text(128), shipaddr_email text(256), terms text(32), tax_included integer, taxtable text(32));\nCREATE TABLE employees(guid text(32) PRIMARY KEY NOT NULL, username text(2048) NOT NULL, id text(2048) NOT NULL, language text(2048) NOT NULL, acl text(2048) NOT NULL, active integer NOT NULL, currency text(32) NOT NULL, ccard_guid text(32), workday_num bigint NOT NULL, workday_denom bigint NOT NULL, rate_num bigint NOT NULL, rate_denom bigint NOT NULL, addr_name text(1024), addr_addr1 text(1024), addr_addr2 text(1024), addr_addr3 text(1024), addr_addr4 text(1024), addr_phone text(128), addr_fax text(128), addr_email text(256));\nCREATE TABLE entries(guid text(32) PRIMARY KEY NOT NULL, date text(19) NOT NULL, date_entered text(19), description text(2048), action text(2048), notes text(2048), quantity_num bigint, quantity_denom bigint, i_acct text(32), i_price_num bigint, i_price_denom bigint, i_discount_num bigint, i_discount_denom bigint, invoice text(32), i_disc_type text(2048), i_disc_how text(2048), i_taxable integer, i_taxincluded integer, i_taxtable text(32), b_acct text(32), b_price_num bigint, b_price_denom bigint, bill text(32), b_taxable integer, b_taxincluded integer, b_taxtable text(32), b_paytype integer, billable integer, billto_type integer, billto_guid text(32), order_guid text(32));\nCREATE TABLE invoices(guid text(32) PRIMARY KEY NOT NULL, id text(2048) NOT NULL, date_opened text(19), date_posted text(19), notes text(2048) NOT NULL, active integer NOT NULL, currency text(32) NOT NULL, owner_type integer, owner_guid text(32), terms text(32), billing_id text(2048), post_txn text(32), post_lot text(32), post_acc text(32), billto_type integer, billto_guid text(32), charge_amt_num bigint, charge_amt_denom bigint);\nCREATE TABLE jobs(guid text(32) PRIMARY KEY NOT NULL, id text(2048) NOT NULL, name text(2048) NOT NULL, reference text(2048) NOT NULL, active integer NOT NULL, owner_type integer, owner_guid text(32));\nCREATE TABLE orders(guid text(32) PRIMARY KEY NOT NULL, id text(2048) NOT NULL, notes text(2048) NOT NULL, reference text(2048) NOT NULL, active integer NOT NULL, date_opened text(19) NOT NULL, date_closed text(19) NOT NULL, owner_type integer NOT NULL, owner_guid text(32) NOT NULL);\nCREATE TABLE taxtables(guid text(32) PRIMARY KEY NOT NULL, name text(50) NOT NULL, refcount bigint NOT NULL, invisible integer NOT NULL, parent text(32));\nCREATE TABLE taxtable_entries(id integer PRIMARY KEY AUTOINCREMENT NOT NULL, taxtable text(32) NOT NULL, account text(32) NOT NULL, amount_num bigint NOT NULL, amount_denom bigint NOT NULL, type integer NOT NULL);\nCREATE TABLE vendors(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, id text(2048) NOT NULL, notes text(2048) NOT NULL, currency text(32) NOT NULL, active integer NOT NULL, tax_override integer NOT NULL, addr_name text(1024), addr_addr1 text(1024), addr_addr2 text(1024), addr_addr3 text(1024), addr_addr4 text(1024), addr_phone text(128), addr_fax text(128), addr_email text(256), terms text(32), tax_inc text(2048), tax_table text(32));\nDELETE FROM sqlite_sequence;\nINSERT INTO sqlite_sequence VALUES('slots',3);\nCREATE INDEX tx_post_date_index ON transactions(post_date);\nCREATE INDEX splits_tx_guid_index ON splits(tx_guid);\nCREATE INDEX splits_account_guid_index ON splits(account_guid);\nCREATE INDEX slots_guid_index ON slots(obj_guid);\nCOMMIT;\n"); diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index 015c664..fac62c7 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -1,31 +1,98 @@ +/** + * @file Ledgerguise persistence and transfer tests. + * @see ../src/index.ts + */ + import test from 'ava'; -import type { IssuerKit } from '@agoric/ertp'; import Database from 'better-sqlite3'; import type { Brand, NatAmount } from '@agoric/ertp'; -import { makeLedgerguiseKit } from '../src/index'; +import { asGuid, createIssuerKit, initGnuCashSchema, openIssuerKit } from '../src/index'; -test('makeLedgerguiseKit returns an ERTP issuer kit backed by sqlite', t => { - const { freeze } = Object; +test('initGnuCashSchema creates GnuCash tables', t => { const db = new Database(':memory:'); t.teardown(() => db.close()); - const kit = makeLedgerguiseKit(freeze({ db })); + initGnuCashSchema(db); - t.truthy(kit.issuer); - t.truthy(kit.brand); - t.truthy(kit.mint); + const row = db + .prepare<[], { name: string }>( + "select name from sqlite_master where type='table' and name='accounts'", + ) + .get(); + t.is(row?.name, 'accounts'); +}); - const brand = kit.brand as Brand<'nat'>; +test('alice sends 10 to bob', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid })); + const brand = issuedKit.brand as Brand<'nat'>; const bucks = (value: bigint): NatAmount => freeze({ brand, value }); - const alicePurse = kit.issuer.makeEmptyPurse(); - const bobPurse = kit.issuer.makeEmptyPurse(); + const alicePurse = issuedKit.issuer.makeEmptyPurse(); + const bobPurse = issuedKit.issuer.makeEmptyPurse(); - const payment = kit.mint.mintPayment(bucks(10n)); + const payment = issuedKit.mint.mintPayment(bucks(10n)); alicePurse.deposit(payment); - - const paymentToBob = alicePurse.withdraw(bucks(10n)); - bobPurse.deposit(paymentToBob); + bobPurse.deposit(alicePurse.withdraw(bucks(10n))); t.is(alicePurse.getCurrentAmount().value, 0n); t.is(bobPurse.getCurrentAmount().value, 10n); }); + +test('createIssuerKit persists balances across re-open', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + + const [aliceGuid, bobGuid, createdCommodityGuid] = (() => { + const created = createIssuerKit(freeze({ db, commodity, makeGuid })); + t.truthy(created.issuer); + t.truthy(created.brand); + t.truthy(created.mint); + const brand = created.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + const alicePurse = created.issuer.makeEmptyPurse(); + const bobPurse = created.issuer.makeEmptyPurse(); + + const payment = created.mint.mintPayment(bucks(10n)); + alicePurse.deposit(payment); + bobPurse.deposit(alicePurse.withdraw(bucks(10n))); + + t.is(alicePurse.getCurrentAmount().value, 0n); + t.is(bobPurse.getCurrentAmount().value, 10n); + return [ + created.purses.getGuid(alicePurse), + created.purses.getGuid(bobPurse), + created.commodityGuid, + ]; + })(); + + const reopened = openIssuerKit(freeze({ db, commodityGuid: createdCommodityGuid, makeGuid })); + t.is(reopened.accounts.openAccountPurse(aliceGuid).getCurrentAmount().value, 0n); + t.is(reopened.accounts.openAccountPurse(bobGuid).getCurrentAmount().value, 10n); +}); diff --git a/packages/ertp-ledgerguise/tsconfig.tsbuildinfo b/packages/ertp-ledgerguise/tsconfig.tsbuildinfo index 9f74c42..5a774ff 100644 --- a/packages/ertp-ledgerguise/tsconfig.tsbuildinfo +++ b/packages/ertp-ledgerguise/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2020.full.d.ts","./node_modules/@endo/eventual-send/src/E.d.ts","./node_modules/@endo/eventual-send/src/handled-promise.d.ts","./node_modules/@endo/eventual-send/src/track-turns.d.ts","./node_modules/@endo/eventual-send/src/types.d.ts","./node_modules/@endo/eventual-send/src/exports.d.ts","./node_modules/@endo/eventual-send/src/no-shim.d.ts","./node_modules/@endo/far/src/exports.d.ts","./node_modules/@endo/pass-style/src/passStyle-helpers.d.ts","./node_modules/ses/types.d.ts","./node_modules/@endo/pass-style/src/types.d.ts","./node_modules/@endo/pass-style/src/makeTagged.d.ts","./node_modules/@endo/pass-style/src/deeplyFulfilled.d.ts","./node_modules/@endo/pass-style/src/iter-helpers.d.ts","./node_modules/@endo/pass-style/src/internal-types.d.ts","./node_modules/@endo/pass-style/src/error.d.ts","./node_modules/@endo/pass-style/src/remotable.d.ts","./node_modules/@endo/pass-style/src/symbol.d.ts","./node_modules/@endo/pass-style/src/string.d.ts","./node_modules/@endo/pass-style/src/passStyleOf.d.ts","./node_modules/@endo/pass-style/src/make-far.d.ts","./node_modules/@endo/pass-style/src/typeGuards.d.ts","./node_modules/@endo/pass-style/index.d.ts","./node_modules/@endo/far/src/index.d.ts","./node_modules/@endo/marshal/src/types.d.ts","./node_modules/@endo/marshal/src/encodeToCapData.d.ts","./node_modules/@endo/marshal/src/marshal.d.ts","./node_modules/@endo/marshal/src/marshal-stringify.d.ts","./node_modules/@endo/marshal/src/marshal-justin.d.ts","./node_modules/@endo/marshal/src/encodePassable.d.ts","./node_modules/@endo/marshal/src/rankOrder.d.ts","./node_modules/@endo/marshal/index.d.ts","./node_modules/@endo/patterns/src/types.d.ts","./node_modules/@endo/patterns/src/keys/copySet.d.ts","./node_modules/@endo/patterns/src/keys/copyBag.d.ts","./node_modules/@endo/common/list-difference.d.ts","./node_modules/@endo/common/object-map.d.ts","./node_modules/@endo/patterns/src/keys/checkKey.d.ts","./node_modules/@endo/patterns/src/keys/compareKeys.d.ts","./node_modules/@endo/patterns/src/keys/merge-set-operators.d.ts","./node_modules/@endo/patterns/src/keys/merge-bag-operators.d.ts","./node_modules/@endo/patterns/src/patterns/patternMatchers.d.ts","./node_modules/@endo/patterns/src/patterns/getGuardPayloads.d.ts","./node_modules/@endo/patterns/index.d.ts","./node_modules/@endo/common/object-meta-map.d.ts","./node_modules/@endo/common/from-unique-entries.d.ts","./node_modules/@agoric/internal/src/js-utils.d.ts","./node_modules/@agoric/internal/src/ses-utils.d.ts","./node_modules/@agoric/internal/src/types.ts","./node_modules/@endo/exo/src/get-interface.d.ts","./node_modules/@endo/exo/src/types.d.ts","./node_modules/@endo/exo/src/exo-makers.d.ts","./node_modules/@endo/exo/index.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakSetStore.d.ts","./node_modules/@agoric/store/src/types.d.ts","./node_modules/@agoric/store/src/stores/scalarSetStore.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakMapStore.d.ts","./node_modules/@agoric/store/src/stores/scalarMapStore.d.ts","./node_modules/@agoric/store/src/legacy/legacyMap.d.ts","./node_modules/@agoric/store/src/legacy/legacyWeakMap.d.ts","./node_modules/@agoric/internal/src/cli-utils.d.ts","./node_modules/@agoric/internal/src/config.d.ts","./node_modules/@agoric/internal/src/debug.d.ts","./node_modules/@agoric/internal/src/errors.d.ts","./node_modules/@agoric/internal/src/method-tools.d.ts","./node_modules/@agoric/internal/src/metrics.d.ts","./node_modules/@agoric/internal/src/natural-sort.d.ts","./node_modules/@agoric/internal/src/tmpDir.d.ts","./node_modules/@agoric/internal/src/typeCheck.d.ts","./node_modules/@agoric/internal/src/typeGuards.d.ts","./node_modules/@agoric/internal/src/types-index.d.ts","./node_modules/@agoric/internal/src/marshal.d.ts","./node_modules/@agoric/internal/src/index.d.ts","./node_modules/@agoric/store/src/stores/store-utils.d.ts","./node_modules/@agoric/store/src/index.d.ts","./node_modules/@agoric/base-zone/src/watch-promise.d.ts","./node_modules/@agoric/base-zone/src/types.d.ts","./node_modules/@agoric/base-zone/src/exports.d.ts","./node_modules/@agoric/swingset-liveslots/src/types.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualReferences.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualObjectManager.d.ts","./node_modules/@agoric/swingset-liveslots/src/watchedPromises.d.ts","./node_modules/@agoric/swingset-liveslots/src/vatDataTypes.ts","./node_modules/@agoric/swingset-liveslots/src/types-index.d.ts","./node_modules/@agoric/swingset-liveslots/src/liveslots.d.ts","./node_modules/@agoric/swingset-liveslots/src/message.d.ts","./node_modules/@agoric/swingset-liveslots/src/index.d.ts","./node_modules/@agoric/base-zone/src/make-once.d.ts","./node_modules/@agoric/base-zone/src/keys.d.ts","./node_modules/@agoric/base-zone/src/is-passable.d.ts","./node_modules/@agoric/base-zone/src/index.d.ts","./node_modules/@agoric/internal/src/lib-chainStorage.d.ts","./node_modules/@agoric/notifier/src/types.ts","./node_modules/@agoric/notifier/src/topic.d.ts","./node_modules/@agoric/notifier/src/storesub.d.ts","./node_modules/@agoric/notifier/src/stored-notifier.d.ts","./node_modules/@agoric/notifier/src/types-index.d.ts","./node_modules/@agoric/notifier/src/publish-kit.d.ts","./node_modules/@agoric/notifier/src/subscribe.d.ts","./node_modules/@agoric/notifier/src/notifier.d.ts","./node_modules/@agoric/notifier/src/subscriber.d.ts","./node_modules/@agoric/notifier/src/asyncIterableAdaptor.d.ts","./node_modules/@agoric/notifier/src/index.d.ts","./node_modules/@agoric/internal/src/tagged.d.ts","./node_modules/@agoric/ertp/src/types.ts","./node_modules/@agoric/ertp/src/amountMath.d.ts","./node_modules/@agoric/ertp/src/issuerKit.d.ts","./node_modules/@agoric/ertp/src/typeGuards.d.ts","./node_modules/@agoric/ertp/src/types-index.d.ts","./node_modules/@agoric/ertp/src/index.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/better-sqlite3/index.d.ts","./src/index.ts","./node_modules/ava/types/assertions.d.cts","./node_modules/ava/types/subscribable.d.cts","./node_modules/ava/types/try-fn.d.cts","./node_modules/ava/types/test-fn.d.cts","./node_modules/ava/entrypoints/main.d.cts","./node_modules/ava/index.d.ts","./test/ledgerguise.test.ts"],"fileIdsList":[[129,165,228,236,240,243,245,246,247,259],[128,130,140,141,142,165,228,236,240,243,245,246,247,259],[75,165,228,236,240,243,245,246,247,259],[129,139,165,228,236,240,243,245,246,247,259],[105,127,128,165,228,236,240,243,245,246,247,259],[96,165,228,236,240,243,245,246,247,259],[96,157,165,228,236,240,243,245,246,247,259],[158,159,160,161,165,228,236,240,243,245,246,247,259],[96,125,157,158,165,228,236,240,243,245,246,247,259],[96,125,157,165,228,236,240,243,245,246,247,259],[157,165,228,236,240,243,245,246,247,259],[75,76,96,155,156,158,165,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259],[99,100,113,114,115,116,117,118,119,120,121,122,123,124,165,228,236,240,243,245,246,247,259],[76,84,101,105,143,165,228,236,240,243,245,246,247,259],[84,101,165,228,236,240,243,245,246,247,259],[76,89,97,98,99,101,165,228,236,240,243,245,246,247,259],[101,165,228,236,240,243,245,246,247,259],[96,101,165,228,236,240,243,245,246,247,259],[59,75,96,100,165,228,236,240,243,245,246,247,259],[59,75,76,145,149,165,228,236,240,243,245,246,247,259],[146,147,148,149,150,151,152,153,154,165,228,236,240,243,245,246,247,259],[125,145,165,228,236,240,243,245,246,247,259],[96,139,145,165,228,236,240,243,245,246,247,259],[75,76,144,145,165,228,236,240,243,245,246,247,259],[76,84,144,145,165,228,236,240,243,245,246,247,259],[59,75,76,145,165,228,236,240,243,245,246,247,259],[145,165,228,236,240,243,245,246,247,259],[84,144,165,228,236,240,243,245,246,247,259],[96,105,106,107,108,109,110,111,112,125,126,165,228,236,240,243,245,246,247,259],[107,165,228,236,240,243,245,246,247,259],[75,96,107,165,228,236,240,243,245,246,247,259],[96,107,165,228,236,240,243,245,246,247,259],[96,127,165,228,236,240,243,245,246,247,259],[75,84,96,107,165,228,236,240,243,245,246,247,259],[75,96,165,228,236,240,243,245,246,247,259],[136,137,138,165,228,236,240,243,245,246,247,259],[99,131,165,228,236,240,243,245,246,247,259],[131,165,228,236,240,243,245,246,247,259],[131,135,165,228,236,240,243,245,246,247,259],[84,165,228,236,240,243,245,246,247,259],[59,75,96,105,127,134,165,228,236,240,243,245,246,247,259],[84,131,132,139,165,228,236,240,243,245,246,247,259],[84,131,132,133,135,165,228,236,240,243,245,246,247,259],[57,165,228,236,240,243,245,246,247,259],[54,55,58,165,228,236,240,243,245,246,247,259],[54,55,56,165,228,236,240,243,245,246,247,259],[102,103,104,165,228,236,240,243,245,246,247,259],[96,103,165,228,236,240,243,245,246,247,259],[59,75,96,102,165,228,236,240,243,245,246,247,259],[59,165,228,236,240,243,245,246,247,259],[59,60,75,165,228,236,240,243,245,246,247,259],[75,77,78,79,80,81,82,83,165,228,236,240,243,245,246,247,259],[75,77,165,228,236,240,243,245,246,247,259],[62,75,77,165,228,236,240,243,245,246,247,259],[77,165,228,236,240,243,245,246,247,259],[61,63,64,65,66,68,69,70,71,72,73,74,165,228,236,240,243,245,246,247,259],[62,63,67,165,228,236,240,243,245,246,247,259],[63,165,228,236,240,243,245,246,247,259],[59,63,165,228,236,240,243,245,246,247,259],[63,67,165,228,236,240,243,245,246,247,259],[61,62,165,228,236,240,243,245,246,247,259],[85,86,87,88,89,90,91,92,93,94,95,165,228,236,240,243,245,246,247,259],[75,85,165,228,236,240,243,245,246,247,259],[85,165,228,236,240,243,245,246,247,259],[75,84,85,165,228,236,240,243,245,246,247,259],[75,84,165,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,284],[165,225,226,228,236,240,243,245,246,247,259],[165,227,228,236,240,243,245,246,247,259],[228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,267],[165,228,229,234,236,239,240,243,245,246,247,249,259,264,276],[165,228,229,230,236,239,240,243,245,246,247,259],[165,228,231,236,240,243,245,246,247,259,277],[165,228,232,233,236,240,243,245,246,247,250,259],[165,228,233,236,240,243,245,246,247,259,264,273],[165,228,234,236,239,240,243,245,246,247,249,259],[165,227,228,235,236,240,243,245,246,247,259],[165,228,236,237,240,243,245,246,247,259],[165,228,236,238,239,240,243,245,246,247,259],[165,227,228,236,239,240,243,245,246,247,259],[165,228,236,239,240,241,243,245,246,247,259,264,276],[165,228,236,239,240,241,243,245,246,247,259,264,267],[165,215,228,236,239,240,242,243,245,246,247,249,259,264,276],[165,228,236,239,240,242,243,245,246,247,249,259,264,273,276],[165,228,236,240,242,243,244,245,246,247,259,264,273,276],[163,164,165,166,167,168,169,170,171,172,173,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283],[165,228,236,239,240,243,245,246,247,259],[165,228,236,240,243,245,247,259],[165,228,236,240,243,245,246,247,248,259,276],[165,228,236,239,240,243,245,246,247,249,259,264],[165,228,236,240,243,245,246,247,250,259],[165,228,236,240,243,245,246,247,251,259],[165,228,236,239,240,243,245,246,247,254,259],[165,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283],[165,228,236,240,243,245,246,247,256,259],[165,228,236,240,243,245,246,247,257,259],[165,228,233,236,240,243,245,246,247,249,259,267],[165,228,236,239,240,243,245,246,247,259,260],[165,228,236,240,243,245,246,247,259,261,277,280],[165,228,236,239,240,243,245,246,247,259,264,266,267],[165,228,236,240,243,245,246,247,259,265,267],[165,228,236,240,243,245,246,247,259,267,277],[165,228,236,240,243,245,246,247,259,268],[165,225,228,236,240,243,245,246,247,259,264,270],[165,228,236,240,243,245,246,247,259,264,269],[165,228,236,239,240,243,245,246,247,259,271,272],[165,228,236,240,243,245,246,247,259,271,272],[165,228,233,236,240,243,245,246,247,249,259,264,273],[165,228,236,240,243,245,246,247,259,274],[165,228,236,240,243,245,246,247,249,259,275],[165,228,236,240,242,243,245,246,247,257,259,276],[165,228,236,240,243,245,246,247,259,277,278],[165,228,233,236,240,243,245,246,247,259,278],[165,228,236,240,243,245,246,247,259,264,279],[165,228,236,240,243,245,246,247,248,259,280],[165,228,236,240,243,245,246,247,259,281],[165,228,231,236,240,243,245,246,247,259],[165,228,233,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,277],[165,215,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,259,282],[165,228,236,240,243,245,246,247,254,259],[165,228,236,240,243,245,246,247,259,272],[165,215,228,236,239,240,241,243,245,246,247,254,259,264,267,276,279,280,282],[165,228,236,240,243,245,246,247,259,264,283],[165,228,236,240,243,245,246,247,259,287,288,289,290],[165,228,236,240,243,245,246,247,259,291],[165,228,236,240,243,245,246,247,259,287,288,289],[165,228,236,240,243,245,246,247,259,290],[165,181,184,187,188,228,236,240,243,245,246,247,259,276],[165,184,228,236,240,243,245,246,247,259,264,276],[165,184,188,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,259,264],[165,178,228,236,240,243,245,246,247,259],[165,182,228,236,240,243,245,246,247,259],[165,180,181,184,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,249,259,273],[165,178,228,236,240,243,245,246,247,259,284],[165,180,184,228,236,240,243,245,246,247,249,259,276],[165,175,176,177,179,183,228,236,239,240,243,245,246,247,259,264,276],[165,184,192,200,228,236,240,243,245,246,247,259],[165,176,182,228,236,240,243,245,246,247,259],[165,184,209,210,228,236,240,243,245,246,247,259],[165,176,179,184,228,236,240,243,245,246,247,259,267,276,284],[165,184,228,236,240,243,245,246,247,259],[165,180,184,228,236,240,243,245,246,247,259,276],[165,175,228,236,240,243,245,246,247,259],[165,178,179,180,182,183,184,185,186,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,210,211,212,213,214,228,236,240,243,245,246,247,259],[165,184,202,205,228,236,240,243,245,246,247,259],[165,184,192,193,194,228,236,240,243,245,246,247,259],[165,182,184,193,195,228,236,240,243,245,246,247,259],[165,183,228,236,240,243,245,246,247,259],[165,176,178,184,228,236,240,243,245,246,247,259],[165,184,188,193,195,228,236,240,243,245,246,247,259],[165,188,228,236,240,243,245,246,247,259],[165,182,184,187,228,236,240,243,245,246,247,259,276],[165,176,180,184,192,228,236,240,243,245,246,247,259],[165,184,202,228,236,240,243,245,246,247,259],[165,195,228,236,240,243,245,246,247,259],[165,178,184,209,228,236,240,243,245,246,247,259,267,282,284],[162,165,228,236,240,243,245,246,247,259,285],[162,165,228,236,240,243,245,246,247,259,285,286,292]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"2cd4b702eb44058636981ad2a53ab0152417c8f36b224e459aa5404d5786166e","impliedFormat":99},{"version":"64a95727716d7a159ff916085eb5df4dd67f1ff9c6f7e35ce2aff8a4ed4e6d31","impliedFormat":99},{"version":"93340c70128cbf56acb9eba0146f9cae83b5ef8f4b02f380fff0b77a6b7cf113","impliedFormat":99},{"version":"eb10902fb118057f367f63a703af037ea92a1f8e6161b9b128c29d934539d9a5","impliedFormat":99},{"version":"6b9c704b9febb76cdf74f8f1e3ac199c5b4708e5be2afe257320411ec2c8a3a1","affectsGlobalScope":true,"impliedFormat":99},{"version":"614fa8a4693c632333c354af80562633c8aaf0d552e7ed90f191a6ace24abe9d","impliedFormat":99},{"version":"d221c15d4aae13d314072f859de2ccec2c600a3addc9f2b71b397c83a157e71f","impliedFormat":99},{"version":"dc8a5014726788b50b968d67404dbc7713009040720a04b39c784b43dd8fdacb","impliedFormat":99},{"version":"ea5d08724831aab137fab28195dadf65667aec35acc0f2a5e517271d8c3082d3","affectsGlobalScope":true,"impliedFormat":99},{"version":"009b62c055096dfb3291f2667b8f0984ce480abef01c646e9675868fcec5ac60","impliedFormat":99},{"version":"d86a646352434aa51e337e64e234eab2d28af156bb5931d25c789d0c5dfbcd08","impliedFormat":99},{"version":"d15ab66050babcbb3858c785c437230bd984943b9b2080cd16fe1f0007b4802b","impliedFormat":99},{"version":"d5dc3c765037bfc7bd118be91ad280801f8c01fe41e8b7c8c1d8b96f6a0dc489","impliedFormat":99},{"version":"c6af1103d816d17451bc1a18cb9889fc9a282966383b695927d3ead99d958da0","impliedFormat":99},{"version":"d34287eb61f4689723448d33f50a047769dadee66ec8cb8609b41b17a5b3df40","impliedFormat":99},{"version":"22f52ade1934d26b5db4d5558be99097a82417c0247958527336535930d5a288","impliedFormat":99},{"version":"717d656e46e34696d072f2cee99ca045e69350f3c5ede3193337f884ccbc2a3b","impliedFormat":99},{"version":"b5a53985100fa348fcfb06bad4ee86367168e018998cbf95394a01b2dac92bb7","impliedFormat":99},{"version":"cadea2f7c33f255e142da3b0fefee54fa3985a12471cf9c5c51a221b3844f976","impliedFormat":99},{"version":"46f09e6b30f4301674d1c685934bd4ad2b594085d2545d6f063c175b1dcfd5af","impliedFormat":99},{"version":"25cd3d5fecfed6af5903170b67e8b3531591633e14c5b6735aac0d49e93d7cf0","impliedFormat":99},{"version":"f9fdd230ece877f4bcd8d35240426bcb1482f44faf813e6a336c2cc1b034e58d","impliedFormat":99},{"version":"bcbe66e540446c7fb8b34afe764dae60b28ef929cafe26402594f41a377fac41","impliedFormat":99},{"version":"428ef8df7e77bd4731faa19ef7430823f42bc95abd99368351411541ee08d2f7","impliedFormat":99},{"version":"a8a953cb8cf0b05c91086bd15a383afdfbddbf0cda5ed67d2c55542a5064b69d","impliedFormat":99},{"version":"f5a00483d6aa997ffedb1e802df7c7dcd048e43deab8f75c2c754f4ee3f97b41","impliedFormat":99},{"version":"14da43cd38f32c3b6349d1667937579820f1a3ddb40f3187caa727d4d451dcd4","impliedFormat":99},{"version":"2b77e2bc5350c160c53c767c8e6325ee61da47eda437c1d3156e16df94a64257","impliedFormat":99},{"version":"b0c5a13c0ec9074cdd2f8ed15e6734ba49231eb773330b221083e79e558badb4","impliedFormat":99},{"version":"a2d30f97dcc401dad445fb4f0667a167d1b9c0fdb1132001cc37d379e8946e3c","impliedFormat":99},{"version":"81c859cff06ee38d6f6b8015faa04722b535bb644ea386919d570e0e1f052430","impliedFormat":99},{"version":"05e938c1bc8cc5d2f3b9bb87dc09da7ab8e8e8436f17af7f1672f9b42ab5307d","impliedFormat":99},{"version":"061020cd9bc920fc08a8817160c5cb97b8c852c5961509ed15aab0c5a4faddb3","impliedFormat":99},{"version":"e33bbc0d740e4db63b20fa80933eb78cd305258ebb02b2c21b7932c8df118d3b","impliedFormat":99},{"version":"6795c049a6aaaaeb25ae95e0b9a4c75c8a325bd2b3b40aee7e8f5225533334d4","impliedFormat":99},{"version":"e6081f90b9dc3ff16bcc3fdab32aa361800dc749acc78097870228d8f8fd9920","impliedFormat":99},{"version":"6274539c679f0c9bcd2dbf9e85c5116db6acf91b3b9e1084ce8a17db56a0259a","impliedFormat":99},{"version":"f472753504df7760ad34eafa357007e90c59040e6f6882aae751de7b134b8713","impliedFormat":99},{"version":"dba70304db331da707d5c771e492b9c1db7545eb29a949050a65d0d4fa4a000d","impliedFormat":99},{"version":"a520f33e8a5a92d3847223b2ae2d8244cdb7a6d3d8dfdcc756c5650a38fc30f4","impliedFormat":99},{"version":"76aec992df433e1e56b9899183b4cf8f8216e00e098659dbfbc4d0cbf9054725","impliedFormat":99},{"version":"28fbf5d3fdff7c1dad9e3fd71d4e60077f14134b06253cb62e0eb3ba46f628e3","impliedFormat":99},{"version":"c5340ac3565038735dbf82f6f151a75e8b95b9b1d5664b4fddf0168e4dd9c2f3","impliedFormat":99},{"version":"9481179c799a61aa282d5d48b22421d4d9f592c892f2c6ae2cda7b78595a173e","impliedFormat":99},{"version":"00de25621f1acd5ed68e04bb717a418150779459c0df27843e5a3145ab6aa13d","impliedFormat":99},{"version":"3b0a6f0e693745a8f6fd35bafb8d69f334f3c782a91c8f3344733e2e55ba740d","impliedFormat":99},{"version":"83576f4e2a788f59c217da41b5b7eb67912a400a5ff20aa0622a5c902d23eb75","impliedFormat":99},{"version":"039ee0312b31c74b8fcf0d55b24ef9350b17da57572648580acd70d2e79c0d84","impliedFormat":99},{"version":"6a437bd627ddcb418741f1a279a9db2828cc63c24b4f8586b0473e04f314bee5","impliedFormat":99},{"version":"bb1a27e42875da4a6ff036a9bbe8fca33f88225d9ee5f3c18619bfeabc37c4f4","impliedFormat":99},{"version":"56e07c29328f54e68cf4f6a81bc657ae6b2bbd31c2f53a00f4f0a902fa095ea1","impliedFormat":99},{"version":"ce29026a1ee122328dc9f1b40bff4cf424643fddf8dc6c046f4c71bf97ecf5b5","impliedFormat":99},{"version":"386a071f8e7ca44b094aba364286b65e6daceba25347afb3b7d316a109800393","impliedFormat":99},{"version":"6ba3f7fc791e73109b8c59ae17b1e013ab269629a973e78812e0143e4eab48b2","impliedFormat":99},{"version":"042dbb277282e4cb651b7a5cde8a07c01a7286d41f585808afa98c2c5adae7e0","impliedFormat":99},{"version":"0952d2faef01544f6061dd15d81ae53bfb9d3789b9def817f0019731e139bda8","impliedFormat":99},{"version":"8ec4b0ca2590204f6ef4a26d77c5c8b0bba222a5cd80b2cb3aa3016e3867f9ce","impliedFormat":99},{"version":"15d389a1ee1f700a49260e38736c8757339e5d5e06ca1409634242c1a7b0602e","impliedFormat":99},{"version":"f868b2a12bbe4356e2fd57057ba0619d88f1496d2b884a4f22d8bab3e253dbf5","impliedFormat":99},{"version":"a474bc8c71919a09c0d27ad0cba92e5e3e754dc957bec9c269728c9a4a4cf754","impliedFormat":99},{"version":"e732c6a46c6624dbbd56d3f164d6afdfe2b6007c6709bb64189ce057d03d30fd","impliedFormat":99},{"version":"5c425f77a2867b5d7026875328f13736e3478b0cc6c092787ac3a8dcc8ff0d42","impliedFormat":99},{"version":"b6d1738ae0dd427debbb3605ba03c30ceb76d4cefc7bd5f437004f6f4c622e38","impliedFormat":99},{"version":"6629357b7dd05ee4367a71962a234d508fa0fb99fbbad83fdbf3e64aa6e77104","impliedFormat":99},{"version":"5f8b299ecc1852b7b6eb9682a05f2dbfaae087e3363ecfbb9430350be32a97dc","impliedFormat":99},{"version":"6e304bbf3302fb015164bb3a7c7dfca6b3fdf57b1d56809173fed3663b42ced4","impliedFormat":99},{"version":"cd6aab42fef5395a16795cf23bbc9645dc9786af2c08dac3d61234948f72c67d","impliedFormat":99},{"version":"fe1f9b28ceb4ff76facbe0c363888d33d8265a0beb6fb5532a6e7a291490c795","impliedFormat":99},{"version":"b1d6ee25d690d99f44fd9c1c831bcdb9c0354f23dab49e14cdcfe5d0212bcba0","impliedFormat":99},{"version":"488958cf5865bce05ac5343cf1607ad7af72486a351c3afc7756fdd9fdafa233","impliedFormat":99},{"version":"424a44fb75e76db02794cf0e26c61510daf8bf4d4b43ebbeb6adc70be1dd68b4","impliedFormat":99},{"version":"519f0d3b64727722e5b188c679c1f741997be640fdcd30435a2c7ba006667d6e","impliedFormat":99},{"version":"49324b7e03d2c9081d66aef8b0a8129f0244ecac4fb11378520c9816d693ce7a","impliedFormat":99},{"version":"bbe31d874c9a2ac21ea0c5cee6ded26697f30961dca6f18470145b1c8cd66b21","impliedFormat":99},{"version":"38a5641908bc748e9829ab1d6147239a3797918fab932f0aa81543d409732990","impliedFormat":99},{"version":"125da449b5464b2873f7642e57452ac045a0219f0cb6a5d3391a15cc4336c471","impliedFormat":99},{"version":"d1cacc1ae76a3698129f4289657a18de22057bb6c00e7bf36aa2e9c5365eec66","impliedFormat":99},{"version":"0468caf7769824cd6ddd202c5f37c574bcc3f5c158ef401b71ca3ece8de5462f","impliedFormat":99},{"version":"966a181ee1c0cecd2aaa9cf8281f3b8036d159db7963788a7bfae78937c62717","impliedFormat":99},{"version":"8d11b30c4b66b9524db822608d279dc5e2b576d22ee21ee735a9b9a604524873","impliedFormat":99},{"version":"dac1ccee916195518aa964a933af099be396eaca9791dab44af01eb3209b9930","impliedFormat":99},{"version":"f95e4d1e6d3c5cbbbf6e216ea4742138e52402337eb3416170eabb2fdbe5c762","impliedFormat":99},{"version":"22b43e7fd932e3aa63e5bee8247d408ad1e5a29fe8008123dc6a4bd35ea49ded","impliedFormat":99},{"version":"aeea49091e71d123a471642c74a5dc4d8703476fd6254002d27c75728aa13691","impliedFormat":99},{"version":"0d4db4b482d5dec495943683ba3b6bb4026747a351c614fafdbaf54c00c5adab","impliedFormat":99},{"version":"45ac0268333f7bf8098595cda739764c429cd5d182ae4a127b3ca33405f81431","impliedFormat":99},{"version":"253c3549b055ad942ee115bef4c586c0c56e6b11aeb6353f171c7f0ffec8df07","impliedFormat":99},{"version":"0f1791a8891729f010e49f29b921b05afd45e5ba8430663c8ece4edeee748b1b","impliedFormat":99},{"version":"dfa585104fc407014e2a9ceafb748a50284fb282a561e9d8eb08562e64b1cb24","impliedFormat":99},{"version":"51130d85941585df457441c29e8f157ddc01e4978573a02a806a04c687b6748a","impliedFormat":99},{"version":"40f0d41f453dc614b2a3c552e7aca5ce723bb84d6e6bca8a6dcad1dca4cd9449","impliedFormat":99},{"version":"404627849c9714a78663bd299480dd94e75e457f5322caf0c7e169e5adab0a18","impliedFormat":99},{"version":"208306f454635e47d72092763c801f0ffcb7e6cba662d553eee945bd50987bb1","impliedFormat":99},{"version":"8b5a27971e8ede37415e42f24aae6fd227c2a1d2a93d6b8c7791a13abcde0f0b","impliedFormat":99},{"version":"1c106d58790bab5e144b35eeb31186f2be215d651e4000586fc021140cd324b9","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"c140653685b9af4f01e4283dd9d759126cb15f1c41721270c0bdbb55fd72673f","impliedFormat":99},{"version":"5844202ecdcea1f8612a826905623d93add56c9c1988df6471dff9999d92c0a7","impliedFormat":99},{"version":"b268ce0a7f489c27d8bf748c2563fd81092ead98e4c30f673670297250b774bd","impliedFormat":99},{"version":"9b0ca5de920ec607eecea5b40402fca8e705dfb3ff5e72cc91e2ac6d8f390985","impliedFormat":99},{"version":"efad5849e64223db373bbabc5eb6b2566d16e3bd34c0fd29ccf8bbe8a8a655e7","impliedFormat":99},{"version":"4c1c9ab197c2596bace50281bacf3ce3276f22aaef1c8398af0137779b577f24","impliedFormat":99},{"version":"a1acd535289b4cca0466376c1af5a99d887c91483792346be3b0b58d5f72eead","impliedFormat":99},{"version":"cdb6a1ed879f191ad45615cb4b7e7935237de0cfb8d410c7eb1fd9707d9c17ac","impliedFormat":99},{"version":"ca1debd87d50ade2eba2d0594eb47ab98e050a9fa08f879c750d80863dd3ce4c","impliedFormat":99},{"version":"dc01a3cc4787313606d58b1c6f3a4c5bf0d3fe4e3789dfdcde28d59bfd9b7c59","impliedFormat":99},{"version":"73ab9b053ad2a5ddee2f4c9b8cd36a436974dd5fa5a7c74940dd6b92e4d8e02d","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"fbf43977fd4aead581f1ef81146a4ff6fafe6bec7fac2b4cbd5a00577ab0c1c7","impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"961cf7535b9c521cd634055b1b6ac49b94d055f0b573ce7fdc4cfaddab080b7c","impliedFormat":1},{"version":"806a8c6daae69e5695e7200d9eca6bc1e4298f38d90edda3ce67a794da31a24f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"5e0c66763bda6ad4efe2ff62b2ca3a8af0b8d5b58a09429bbf9e433706c32f49","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"cd9189eacf0f9143b8830e9d6769335aa6d902c04195f04145bcbf19e7f26fcb","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"c2a6a737189ced24ffe0634e9239b087e4c26378d0490f95141b9b9b042b746c","impliedFormat":1},{"version":"b417ebd02808fde5eb1cd840ac76037bc59f97fec7873bee8f7f5682b879df80","signature":"a4b893ceddb74f1fd12c50ea85def9b0039bd0ed244616aac2f9a8cc33df420f"},{"version":"465f1ca1f11e6a1b01b043a93196b7f8fc09c985b8e3084804d9a3938aad588d","impliedFormat":1},{"version":"00b72e597dcd6ff7bf772918c78c41dc7c68e239af658cf452bff645ebdc485d","impliedFormat":1},{"version":"17b183b69a3dd3cca2505cee7ff70501c574343ad49a385c9acb5b5299e1ba73","impliedFormat":1},{"version":"b26d3fa6859459f64c93e0c154bfc7a8b216b4cf1e241ca6b67e67ee8248626b","impliedFormat":1},{"version":"91cab3f4d6ab131c74ea8772a8c182bdb9c52500fb0388ef9fd2828c084b8087","impliedFormat":1},{"version":"13b8acfead5a8519fad35e43f58c62b946a24f2a1311254250b840b15b2051cd","impliedFormat":99},{"version":"f451e74f5439b1155d452482d2118cc26b5809a16512ef46a02fc940dcd4703e","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"}],"root":[286,293],"options":{"esModuleInterop":true,"module":1,"skipLibCheck":true,"strict":true,"target":7},"referencedMap":[[130,1],[143,2],[142,3],[141,1],[140,4],[129,5],[128,6],[158,7],[162,8],[159,9],[160,10],[161,11],[157,12],[113,13],[114,13],[115,13],[116,13],[125,14],[99,13],[144,15],[124,16],[117,13],[118,13],[119,13],[100,17],[156,13],[120,13],[121,18],[122,19],[123,18],[101,20],[154,21],[155,22],[152,23],[150,24],[148,25],[147,26],[151,27],[153,28],[146,28],[149,28],[145,29],[127,30],[111,31],[112,31],[110,32],[108,33],[109,32],[106,34],[126,35],[107,36],[139,37],[137,38],[138,39],[136,40],[131,41],[135,42],[133,43],[132,13],[134,44],[98,13],[88,13],[89,13],[97,13],[54,45],[58,45],[55,13],[59,46],[56,13],[57,47],[105,48],[104,49],[102,36],[103,50],[60,51],[76,52],[84,53],[82,3],[78,54],[81,55],[80,3],[79,56],[83,54],[77,3],[75,57],[65,3],[68,58],[67,59],[66,13],[73,60],[64,59],[61,59],[72,59],[69,61],[71,13],[70,13],[74,59],[63,62],[96,63],[90,64],[91,65],[87,66],[86,66],[93,65],[92,65],[95,64],[94,64],[85,67],[285,68],[225,69],[226,69],[227,70],[165,71],[228,72],[229,73],[230,74],[163,13],[231,75],[232,76],[233,77],[234,78],[235,79],[236,80],[237,80],[238,81],[239,82],[240,83],[241,84],[166,13],[164,13],[242,85],[243,86],[244,87],[284,88],[245,89],[246,90],[247,89],[248,91],[249,92],[250,93],[251,94],[252,94],[253,94],[254,95],[255,96],[256,97],[257,98],[258,99],[259,100],[260,100],[261,101],[262,13],[263,13],[264,102],[265,103],[266,102],[267,104],[268,105],[269,106],[270,107],[271,108],[272,109],[273,110],[274,111],[275,112],[276,113],[277,114],[278,115],[279,116],[280,117],[281,118],[167,89],[168,13],[169,119],[170,120],[171,13],[172,121],[173,13],[216,122],[217,123],[218,124],[219,124],[220,125],[221,13],[222,72],[223,126],[224,123],[282,127],[283,128],[291,129],[292,130],[287,13],[288,13],[290,131],[289,132],[174,13],[62,13],[51,13],[52,13],[10,13],[8,13],[9,13],[14,13],[13,13],[2,13],[15,13],[16,13],[17,13],[18,13],[19,13],[20,13],[21,13],[22,13],[3,13],[23,13],[24,13],[4,13],[25,13],[29,13],[26,13],[27,13],[28,13],[30,13],[31,13],[32,13],[5,13],[33,13],[34,13],[35,13],[36,13],[6,13],[40,13],[37,13],[38,13],[39,13],[41,13],[7,13],[42,13],[53,13],[47,13],[48,13],[43,13],[44,13],[45,13],[46,13],[1,13],[49,13],[50,13],[12,13],[11,13],[192,133],[204,134],[190,135],[205,136],[214,137],[181,138],[182,139],[180,140],[213,68],[208,141],[212,142],[184,143],[201,144],[183,145],[211,146],[178,147],[179,141],[185,148],[186,13],[191,149],[189,148],[176,150],[215,151],[206,152],[195,153],[194,148],[196,154],[199,155],[193,156],[197,157],[209,68],[187,158],[188,159],[200,160],[177,136],[203,161],[202,148],[198,162],[207,13],[175,13],[210,163],[286,164],[293,165]],"affectedFilesPendingEmit":[286,293],"version":"5.9.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2020.full.d.ts","./node_modules/@endo/eventual-send/src/E.d.ts","./node_modules/@endo/eventual-send/src/handled-promise.d.ts","./node_modules/@endo/eventual-send/src/track-turns.d.ts","./node_modules/@endo/eventual-send/src/types.d.ts","./node_modules/@endo/eventual-send/src/exports.d.ts","./node_modules/@endo/eventual-send/src/no-shim.d.ts","./node_modules/@endo/far/src/exports.d.ts","./node_modules/@endo/pass-style/src/passStyle-helpers.d.ts","./node_modules/ses/types.d.ts","./node_modules/@endo/pass-style/src/types.d.ts","./node_modules/@endo/pass-style/src/makeTagged.d.ts","./node_modules/@endo/pass-style/src/deeplyFulfilled.d.ts","./node_modules/@endo/pass-style/src/iter-helpers.d.ts","./node_modules/@endo/pass-style/src/internal-types.d.ts","./node_modules/@endo/pass-style/src/error.d.ts","./node_modules/@endo/pass-style/src/remotable.d.ts","./node_modules/@endo/pass-style/src/symbol.d.ts","./node_modules/@endo/pass-style/src/string.d.ts","./node_modules/@endo/pass-style/src/passStyleOf.d.ts","./node_modules/@endo/pass-style/src/make-far.d.ts","./node_modules/@endo/pass-style/src/typeGuards.d.ts","./node_modules/@endo/pass-style/index.d.ts","./node_modules/@endo/far/src/index.d.ts","./node_modules/@endo/marshal/src/types.d.ts","./node_modules/@endo/marshal/src/encodeToCapData.d.ts","./node_modules/@endo/marshal/src/marshal.d.ts","./node_modules/@endo/marshal/src/marshal-stringify.d.ts","./node_modules/@endo/marshal/src/marshal-justin.d.ts","./node_modules/@endo/marshal/src/encodePassable.d.ts","./node_modules/@endo/marshal/src/rankOrder.d.ts","./node_modules/@endo/marshal/index.d.ts","./node_modules/@endo/patterns/src/types.d.ts","./node_modules/@endo/patterns/src/keys/copySet.d.ts","./node_modules/@endo/patterns/src/keys/copyBag.d.ts","./node_modules/@endo/common/list-difference.d.ts","./node_modules/@endo/common/object-map.d.ts","./node_modules/@endo/patterns/src/keys/checkKey.d.ts","./node_modules/@endo/patterns/src/keys/compareKeys.d.ts","./node_modules/@endo/patterns/src/keys/merge-set-operators.d.ts","./node_modules/@endo/patterns/src/keys/merge-bag-operators.d.ts","./node_modules/@endo/patterns/src/patterns/patternMatchers.d.ts","./node_modules/@endo/patterns/src/patterns/getGuardPayloads.d.ts","./node_modules/@endo/patterns/index.d.ts","./node_modules/@endo/common/object-meta-map.d.ts","./node_modules/@endo/common/from-unique-entries.d.ts","./node_modules/@agoric/internal/src/js-utils.d.ts","./node_modules/@agoric/internal/src/ses-utils.d.ts","./node_modules/@agoric/internal/src/types.ts","./node_modules/@endo/exo/src/get-interface.d.ts","./node_modules/@endo/exo/src/types.d.ts","./node_modules/@endo/exo/src/exo-makers.d.ts","./node_modules/@endo/exo/index.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakSetStore.d.ts","./node_modules/@agoric/store/src/types.d.ts","./node_modules/@agoric/store/src/stores/scalarSetStore.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakMapStore.d.ts","./node_modules/@agoric/store/src/stores/scalarMapStore.d.ts","./node_modules/@agoric/store/src/legacy/legacyMap.d.ts","./node_modules/@agoric/store/src/legacy/legacyWeakMap.d.ts","./node_modules/@agoric/internal/src/cli-utils.d.ts","./node_modules/@agoric/internal/src/config.d.ts","./node_modules/@agoric/internal/src/debug.d.ts","./node_modules/@agoric/internal/src/errors.d.ts","./node_modules/@agoric/internal/src/method-tools.d.ts","./node_modules/@agoric/internal/src/metrics.d.ts","./node_modules/@agoric/internal/src/natural-sort.d.ts","./node_modules/@agoric/internal/src/tmpDir.d.ts","./node_modules/@agoric/internal/src/typeCheck.d.ts","./node_modules/@agoric/internal/src/typeGuards.d.ts","./node_modules/@agoric/internal/src/types-index.d.ts","./node_modules/@agoric/internal/src/marshal.d.ts","./node_modules/@agoric/internal/src/index.d.ts","./node_modules/@agoric/store/src/stores/store-utils.d.ts","./node_modules/@agoric/store/src/index.d.ts","./node_modules/@agoric/base-zone/src/watch-promise.d.ts","./node_modules/@agoric/base-zone/src/types.d.ts","./node_modules/@agoric/base-zone/src/exports.d.ts","./node_modules/@agoric/swingset-liveslots/src/types.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualReferences.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualObjectManager.d.ts","./node_modules/@agoric/swingset-liveslots/src/watchedPromises.d.ts","./node_modules/@agoric/swingset-liveslots/src/vatDataTypes.ts","./node_modules/@agoric/swingset-liveslots/src/types-index.d.ts","./node_modules/@agoric/swingset-liveslots/src/liveslots.d.ts","./node_modules/@agoric/swingset-liveslots/src/message.d.ts","./node_modules/@agoric/swingset-liveslots/src/index.d.ts","./node_modules/@agoric/base-zone/src/make-once.d.ts","./node_modules/@agoric/base-zone/src/keys.d.ts","./node_modules/@agoric/base-zone/src/is-passable.d.ts","./node_modules/@agoric/base-zone/src/index.d.ts","./node_modules/@agoric/internal/src/lib-chainStorage.d.ts","./node_modules/@agoric/notifier/src/types.ts","./node_modules/@agoric/notifier/src/topic.d.ts","./node_modules/@agoric/notifier/src/storesub.d.ts","./node_modules/@agoric/notifier/src/stored-notifier.d.ts","./node_modules/@agoric/notifier/src/types-index.d.ts","./node_modules/@agoric/notifier/src/publish-kit.d.ts","./node_modules/@agoric/notifier/src/subscribe.d.ts","./node_modules/@agoric/notifier/src/notifier.d.ts","./node_modules/@agoric/notifier/src/subscriber.d.ts","./node_modules/@agoric/notifier/src/asyncIterableAdaptor.d.ts","./node_modules/@agoric/notifier/src/index.d.ts","./node_modules/@agoric/internal/src/tagged.d.ts","./node_modules/@agoric/ertp/src/types.ts","./node_modules/@agoric/ertp/src/amountMath.d.ts","./node_modules/@agoric/ertp/src/issuerKit.d.ts","./node_modules/@agoric/ertp/src/typeGuards.d.ts","./node_modules/@agoric/ertp/src/types-index.d.ts","./node_modules/@agoric/ertp/src/index.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/better-sqlite3/index.d.ts","./src/sql/gc_empty.ts","./src/jessie-tools.ts","./src/index.ts","./node_modules/ava/types/assertions.d.cts","./node_modules/ava/types/subscribable.d.cts","./node_modules/ava/types/try-fn.d.cts","./node_modules/ava/types/test-fn.d.cts","./node_modules/ava/entrypoints/main.d.cts","./node_modules/ava/index.d.ts","./test/ledgerguise.test.ts"],"fileIdsList":[[129,165,228,236,240,243,245,246,247,259],[128,130,140,141,142,165,228,236,240,243,245,246,247,259],[75,165,228,236,240,243,245,246,247,259],[129,139,165,228,236,240,243,245,246,247,259],[105,127,128,165,228,236,240,243,245,246,247,259],[96,165,228,236,240,243,245,246,247,259],[96,157,165,228,236,240,243,245,246,247,259],[158,159,160,161,165,228,236,240,243,245,246,247,259],[96,125,157,158,165,228,236,240,243,245,246,247,259],[96,125,157,165,228,236,240,243,245,246,247,259],[157,165,228,236,240,243,245,246,247,259],[75,76,96,155,156,158,165,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259],[99,100,113,114,115,116,117,118,119,120,121,122,123,124,165,228,236,240,243,245,246,247,259],[76,84,101,105,143,165,228,236,240,243,245,246,247,259],[84,101,165,228,236,240,243,245,246,247,259],[76,89,97,98,99,101,165,228,236,240,243,245,246,247,259],[101,165,228,236,240,243,245,246,247,259],[96,101,165,228,236,240,243,245,246,247,259],[59,75,96,100,165,228,236,240,243,245,246,247,259],[59,75,76,145,149,165,228,236,240,243,245,246,247,259],[146,147,148,149,150,151,152,153,154,165,228,236,240,243,245,246,247,259],[125,145,165,228,236,240,243,245,246,247,259],[96,139,145,165,228,236,240,243,245,246,247,259],[75,76,144,145,165,228,236,240,243,245,246,247,259],[76,84,144,145,165,228,236,240,243,245,246,247,259],[59,75,76,145,165,228,236,240,243,245,246,247,259],[145,165,228,236,240,243,245,246,247,259],[84,144,165,228,236,240,243,245,246,247,259],[96,105,106,107,108,109,110,111,112,125,126,165,228,236,240,243,245,246,247,259],[107,165,228,236,240,243,245,246,247,259],[75,96,107,165,228,236,240,243,245,246,247,259],[96,107,165,228,236,240,243,245,246,247,259],[96,127,165,228,236,240,243,245,246,247,259],[75,84,96,107,165,228,236,240,243,245,246,247,259],[75,96,165,228,236,240,243,245,246,247,259],[136,137,138,165,228,236,240,243,245,246,247,259],[99,131,165,228,236,240,243,245,246,247,259],[131,165,228,236,240,243,245,246,247,259],[131,135,165,228,236,240,243,245,246,247,259],[84,165,228,236,240,243,245,246,247,259],[59,75,96,105,127,134,165,228,236,240,243,245,246,247,259],[84,131,132,139,165,228,236,240,243,245,246,247,259],[84,131,132,133,135,165,228,236,240,243,245,246,247,259],[57,165,228,236,240,243,245,246,247,259],[54,55,58,165,228,236,240,243,245,246,247,259],[54,55,56,165,228,236,240,243,245,246,247,259],[102,103,104,165,228,236,240,243,245,246,247,259],[96,103,165,228,236,240,243,245,246,247,259],[59,75,96,102,165,228,236,240,243,245,246,247,259],[59,165,228,236,240,243,245,246,247,259],[59,60,75,165,228,236,240,243,245,246,247,259],[75,77,78,79,80,81,82,83,165,228,236,240,243,245,246,247,259],[75,77,165,228,236,240,243,245,246,247,259],[62,75,77,165,228,236,240,243,245,246,247,259],[77,165,228,236,240,243,245,246,247,259],[61,63,64,65,66,68,69,70,71,72,73,74,165,228,236,240,243,245,246,247,259],[62,63,67,165,228,236,240,243,245,246,247,259],[63,165,228,236,240,243,245,246,247,259],[59,63,165,228,236,240,243,245,246,247,259],[63,67,165,228,236,240,243,245,246,247,259],[61,62,165,228,236,240,243,245,246,247,259],[85,86,87,88,89,90,91,92,93,94,95,165,228,236,240,243,245,246,247,259],[75,85,165,228,236,240,243,245,246,247,259],[85,165,228,236,240,243,245,246,247,259],[75,84,85,165,228,236,240,243,245,246,247,259],[75,84,165,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,284],[165,225,226,228,236,240,243,245,246,247,259],[165,227,228,236,240,243,245,246,247,259],[228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,267],[165,228,229,234,236,239,240,243,245,246,247,249,259,264,276],[165,228,229,230,236,239,240,243,245,246,247,259],[165,228,231,236,240,243,245,246,247,259,277],[165,228,232,233,236,240,243,245,246,247,250,259],[165,228,233,236,240,243,245,246,247,259,264,273],[165,228,234,236,239,240,243,245,246,247,249,259],[165,227,228,235,236,240,243,245,246,247,259],[165,228,236,237,240,243,245,246,247,259],[165,228,236,238,239,240,243,245,246,247,259],[165,227,228,236,239,240,243,245,246,247,259],[165,228,236,239,240,241,243,245,246,247,259,264,276],[165,228,236,239,240,241,243,245,246,247,259,264,267],[165,215,228,236,239,240,242,243,245,246,247,249,259,264,276],[165,228,236,239,240,242,243,245,246,247,249,259,264,273,276],[165,228,236,240,242,243,244,245,246,247,259,264,273,276],[163,164,165,166,167,168,169,170,171,172,173,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283],[165,228,236,239,240,243,245,246,247,259],[165,228,236,240,243,245,247,259],[165,228,236,240,243,245,246,247,248,259,276],[165,228,236,239,240,243,245,246,247,249,259,264],[165,228,236,240,243,245,246,247,250,259],[165,228,236,240,243,245,246,247,251,259],[165,228,236,239,240,243,245,246,247,254,259],[165,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283],[165,228,236,240,243,245,246,247,256,259],[165,228,236,240,243,245,246,247,257,259],[165,228,233,236,240,243,245,246,247,249,259,267],[165,228,236,239,240,243,245,246,247,259,260],[165,228,236,240,243,245,246,247,259,261,277,280],[165,228,236,239,240,243,245,246,247,259,264,266,267],[165,228,236,240,243,245,246,247,259,265,267],[165,228,236,240,243,245,246,247,259,267,277],[165,228,236,240,243,245,246,247,259,268],[165,225,228,236,240,243,245,246,247,259,264,270],[165,228,236,240,243,245,246,247,259,264,269],[165,228,236,239,240,243,245,246,247,259,271,272],[165,228,236,240,243,245,246,247,259,271,272],[165,228,233,236,240,243,245,246,247,249,259,264,273],[165,228,236,240,243,245,246,247,259,274],[165,228,236,240,243,245,246,247,249,259,275],[165,228,236,240,242,243,245,246,247,257,259,276],[165,228,236,240,243,245,246,247,259,277,278],[165,228,233,236,240,243,245,246,247,259,278],[165,228,236,240,243,245,246,247,259,264,279],[165,228,236,240,243,245,246,247,248,259,280],[165,228,236,240,243,245,246,247,259,281],[165,228,231,236,240,243,245,246,247,259],[165,228,233,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,277],[165,215,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,259,282],[165,228,236,240,243,245,246,247,254,259],[165,228,236,240,243,245,246,247,259,272],[165,215,228,236,239,240,241,243,245,246,247,254,259,264,267,276,279,280,282],[165,228,236,240,243,245,246,247,259,264,283],[165,228,236,240,243,245,246,247,259,289,290,291,292],[165,228,236,240,243,245,246,247,259,293],[165,228,236,240,243,245,246,247,259,289,290,291],[165,228,236,240,243,245,246,247,259,292],[165,181,184,187,188,228,236,240,243,245,246,247,259,276],[165,184,228,236,240,243,245,246,247,259,264,276],[165,184,188,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,259,264],[165,178,228,236,240,243,245,246,247,259],[165,182,228,236,240,243,245,246,247,259],[165,180,181,184,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,249,259,273],[165,178,228,236,240,243,245,246,247,259,284],[165,180,184,228,236,240,243,245,246,247,249,259,276],[165,175,176,177,179,183,228,236,239,240,243,245,246,247,259,264,276],[165,184,192,200,228,236,240,243,245,246,247,259],[165,176,182,228,236,240,243,245,246,247,259],[165,184,209,210,228,236,240,243,245,246,247,259],[165,176,179,184,228,236,240,243,245,246,247,259,267,276,284],[165,184,228,236,240,243,245,246,247,259],[165,180,184,228,236,240,243,245,246,247,259,276],[165,175,228,236,240,243,245,246,247,259],[165,178,179,180,182,183,184,185,186,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,210,211,212,213,214,228,236,240,243,245,246,247,259],[165,184,202,205,228,236,240,243,245,246,247,259],[165,184,192,193,194,228,236,240,243,245,246,247,259],[165,182,184,193,195,228,236,240,243,245,246,247,259],[165,183,228,236,240,243,245,246,247,259],[165,176,178,184,228,236,240,243,245,246,247,259],[165,184,188,193,195,228,236,240,243,245,246,247,259],[165,188,228,236,240,243,245,246,247,259],[165,182,184,187,228,236,240,243,245,246,247,259,276],[165,176,180,184,192,228,236,240,243,245,246,247,259],[165,184,202,228,236,240,243,245,246,247,259],[165,195,228,236,240,243,245,246,247,259],[165,178,184,209,228,236,240,243,245,246,247,259,267,282,284],[162,165,228,233,236,240,243,245,246,247,259,285,286,287],[162,165,228,236,240,243,245,246,247,259,285,288,294]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"2cd4b702eb44058636981ad2a53ab0152417c8f36b224e459aa5404d5786166e","impliedFormat":99},{"version":"64a95727716d7a159ff916085eb5df4dd67f1ff9c6f7e35ce2aff8a4ed4e6d31","impliedFormat":99},{"version":"93340c70128cbf56acb9eba0146f9cae83b5ef8f4b02f380fff0b77a6b7cf113","impliedFormat":99},{"version":"eb10902fb118057f367f63a703af037ea92a1f8e6161b9b128c29d934539d9a5","impliedFormat":99},{"version":"6b9c704b9febb76cdf74f8f1e3ac199c5b4708e5be2afe257320411ec2c8a3a1","affectsGlobalScope":true,"impliedFormat":99},{"version":"614fa8a4693c632333c354af80562633c8aaf0d552e7ed90f191a6ace24abe9d","impliedFormat":99},{"version":"d221c15d4aae13d314072f859de2ccec2c600a3addc9f2b71b397c83a157e71f","impliedFormat":99},{"version":"dc8a5014726788b50b968d67404dbc7713009040720a04b39c784b43dd8fdacb","impliedFormat":99},{"version":"ea5d08724831aab137fab28195dadf65667aec35acc0f2a5e517271d8c3082d3","affectsGlobalScope":true,"impliedFormat":99},{"version":"009b62c055096dfb3291f2667b8f0984ce480abef01c646e9675868fcec5ac60","impliedFormat":99},{"version":"d86a646352434aa51e337e64e234eab2d28af156bb5931d25c789d0c5dfbcd08","impliedFormat":99},{"version":"d15ab66050babcbb3858c785c437230bd984943b9b2080cd16fe1f0007b4802b","impliedFormat":99},{"version":"d5dc3c765037bfc7bd118be91ad280801f8c01fe41e8b7c8c1d8b96f6a0dc489","impliedFormat":99},{"version":"c6af1103d816d17451bc1a18cb9889fc9a282966383b695927d3ead99d958da0","impliedFormat":99},{"version":"d34287eb61f4689723448d33f50a047769dadee66ec8cb8609b41b17a5b3df40","impliedFormat":99},{"version":"22f52ade1934d26b5db4d5558be99097a82417c0247958527336535930d5a288","impliedFormat":99},{"version":"717d656e46e34696d072f2cee99ca045e69350f3c5ede3193337f884ccbc2a3b","impliedFormat":99},{"version":"b5a53985100fa348fcfb06bad4ee86367168e018998cbf95394a01b2dac92bb7","impliedFormat":99},{"version":"cadea2f7c33f255e142da3b0fefee54fa3985a12471cf9c5c51a221b3844f976","impliedFormat":99},{"version":"46f09e6b30f4301674d1c685934bd4ad2b594085d2545d6f063c175b1dcfd5af","impliedFormat":99},{"version":"25cd3d5fecfed6af5903170b67e8b3531591633e14c5b6735aac0d49e93d7cf0","impliedFormat":99},{"version":"f9fdd230ece877f4bcd8d35240426bcb1482f44faf813e6a336c2cc1b034e58d","impliedFormat":99},{"version":"bcbe66e540446c7fb8b34afe764dae60b28ef929cafe26402594f41a377fac41","impliedFormat":99},{"version":"428ef8df7e77bd4731faa19ef7430823f42bc95abd99368351411541ee08d2f7","impliedFormat":99},{"version":"a8a953cb8cf0b05c91086bd15a383afdfbddbf0cda5ed67d2c55542a5064b69d","impliedFormat":99},{"version":"f5a00483d6aa997ffedb1e802df7c7dcd048e43deab8f75c2c754f4ee3f97b41","impliedFormat":99},{"version":"14da43cd38f32c3b6349d1667937579820f1a3ddb40f3187caa727d4d451dcd4","impliedFormat":99},{"version":"2b77e2bc5350c160c53c767c8e6325ee61da47eda437c1d3156e16df94a64257","impliedFormat":99},{"version":"b0c5a13c0ec9074cdd2f8ed15e6734ba49231eb773330b221083e79e558badb4","impliedFormat":99},{"version":"a2d30f97dcc401dad445fb4f0667a167d1b9c0fdb1132001cc37d379e8946e3c","impliedFormat":99},{"version":"81c859cff06ee38d6f6b8015faa04722b535bb644ea386919d570e0e1f052430","impliedFormat":99},{"version":"05e938c1bc8cc5d2f3b9bb87dc09da7ab8e8e8436f17af7f1672f9b42ab5307d","impliedFormat":99},{"version":"061020cd9bc920fc08a8817160c5cb97b8c852c5961509ed15aab0c5a4faddb3","impliedFormat":99},{"version":"e33bbc0d740e4db63b20fa80933eb78cd305258ebb02b2c21b7932c8df118d3b","impliedFormat":99},{"version":"6795c049a6aaaaeb25ae95e0b9a4c75c8a325bd2b3b40aee7e8f5225533334d4","impliedFormat":99},{"version":"e6081f90b9dc3ff16bcc3fdab32aa361800dc749acc78097870228d8f8fd9920","impliedFormat":99},{"version":"6274539c679f0c9bcd2dbf9e85c5116db6acf91b3b9e1084ce8a17db56a0259a","impliedFormat":99},{"version":"f472753504df7760ad34eafa357007e90c59040e6f6882aae751de7b134b8713","impliedFormat":99},{"version":"dba70304db331da707d5c771e492b9c1db7545eb29a949050a65d0d4fa4a000d","impliedFormat":99},{"version":"a520f33e8a5a92d3847223b2ae2d8244cdb7a6d3d8dfdcc756c5650a38fc30f4","impliedFormat":99},{"version":"76aec992df433e1e56b9899183b4cf8f8216e00e098659dbfbc4d0cbf9054725","impliedFormat":99},{"version":"28fbf5d3fdff7c1dad9e3fd71d4e60077f14134b06253cb62e0eb3ba46f628e3","impliedFormat":99},{"version":"c5340ac3565038735dbf82f6f151a75e8b95b9b1d5664b4fddf0168e4dd9c2f3","impliedFormat":99},{"version":"9481179c799a61aa282d5d48b22421d4d9f592c892f2c6ae2cda7b78595a173e","impliedFormat":99},{"version":"00de25621f1acd5ed68e04bb717a418150779459c0df27843e5a3145ab6aa13d","impliedFormat":99},{"version":"3b0a6f0e693745a8f6fd35bafb8d69f334f3c782a91c8f3344733e2e55ba740d","impliedFormat":99},{"version":"83576f4e2a788f59c217da41b5b7eb67912a400a5ff20aa0622a5c902d23eb75","impliedFormat":99},{"version":"039ee0312b31c74b8fcf0d55b24ef9350b17da57572648580acd70d2e79c0d84","impliedFormat":99},{"version":"6a437bd627ddcb418741f1a279a9db2828cc63c24b4f8586b0473e04f314bee5","impliedFormat":99},{"version":"bb1a27e42875da4a6ff036a9bbe8fca33f88225d9ee5f3c18619bfeabc37c4f4","impliedFormat":99},{"version":"56e07c29328f54e68cf4f6a81bc657ae6b2bbd31c2f53a00f4f0a902fa095ea1","impliedFormat":99},{"version":"ce29026a1ee122328dc9f1b40bff4cf424643fddf8dc6c046f4c71bf97ecf5b5","impliedFormat":99},{"version":"386a071f8e7ca44b094aba364286b65e6daceba25347afb3b7d316a109800393","impliedFormat":99},{"version":"6ba3f7fc791e73109b8c59ae17b1e013ab269629a973e78812e0143e4eab48b2","impliedFormat":99},{"version":"042dbb277282e4cb651b7a5cde8a07c01a7286d41f585808afa98c2c5adae7e0","impliedFormat":99},{"version":"0952d2faef01544f6061dd15d81ae53bfb9d3789b9def817f0019731e139bda8","impliedFormat":99},{"version":"8ec4b0ca2590204f6ef4a26d77c5c8b0bba222a5cd80b2cb3aa3016e3867f9ce","impliedFormat":99},{"version":"15d389a1ee1f700a49260e38736c8757339e5d5e06ca1409634242c1a7b0602e","impliedFormat":99},{"version":"f868b2a12bbe4356e2fd57057ba0619d88f1496d2b884a4f22d8bab3e253dbf5","impliedFormat":99},{"version":"a474bc8c71919a09c0d27ad0cba92e5e3e754dc957bec9c269728c9a4a4cf754","impliedFormat":99},{"version":"e732c6a46c6624dbbd56d3f164d6afdfe2b6007c6709bb64189ce057d03d30fd","impliedFormat":99},{"version":"5c425f77a2867b5d7026875328f13736e3478b0cc6c092787ac3a8dcc8ff0d42","impliedFormat":99},{"version":"b6d1738ae0dd427debbb3605ba03c30ceb76d4cefc7bd5f437004f6f4c622e38","impliedFormat":99},{"version":"6629357b7dd05ee4367a71962a234d508fa0fb99fbbad83fdbf3e64aa6e77104","impliedFormat":99},{"version":"5f8b299ecc1852b7b6eb9682a05f2dbfaae087e3363ecfbb9430350be32a97dc","impliedFormat":99},{"version":"6e304bbf3302fb015164bb3a7c7dfca6b3fdf57b1d56809173fed3663b42ced4","impliedFormat":99},{"version":"cd6aab42fef5395a16795cf23bbc9645dc9786af2c08dac3d61234948f72c67d","impliedFormat":99},{"version":"fe1f9b28ceb4ff76facbe0c363888d33d8265a0beb6fb5532a6e7a291490c795","impliedFormat":99},{"version":"b1d6ee25d690d99f44fd9c1c831bcdb9c0354f23dab49e14cdcfe5d0212bcba0","impliedFormat":99},{"version":"488958cf5865bce05ac5343cf1607ad7af72486a351c3afc7756fdd9fdafa233","impliedFormat":99},{"version":"424a44fb75e76db02794cf0e26c61510daf8bf4d4b43ebbeb6adc70be1dd68b4","impliedFormat":99},{"version":"519f0d3b64727722e5b188c679c1f741997be640fdcd30435a2c7ba006667d6e","impliedFormat":99},{"version":"49324b7e03d2c9081d66aef8b0a8129f0244ecac4fb11378520c9816d693ce7a","impliedFormat":99},{"version":"bbe31d874c9a2ac21ea0c5cee6ded26697f30961dca6f18470145b1c8cd66b21","impliedFormat":99},{"version":"38a5641908bc748e9829ab1d6147239a3797918fab932f0aa81543d409732990","impliedFormat":99},{"version":"125da449b5464b2873f7642e57452ac045a0219f0cb6a5d3391a15cc4336c471","impliedFormat":99},{"version":"d1cacc1ae76a3698129f4289657a18de22057bb6c00e7bf36aa2e9c5365eec66","impliedFormat":99},{"version":"0468caf7769824cd6ddd202c5f37c574bcc3f5c158ef401b71ca3ece8de5462f","impliedFormat":99},{"version":"966a181ee1c0cecd2aaa9cf8281f3b8036d159db7963788a7bfae78937c62717","impliedFormat":99},{"version":"8d11b30c4b66b9524db822608d279dc5e2b576d22ee21ee735a9b9a604524873","impliedFormat":99},{"version":"dac1ccee916195518aa964a933af099be396eaca9791dab44af01eb3209b9930","impliedFormat":99},{"version":"f95e4d1e6d3c5cbbbf6e216ea4742138e52402337eb3416170eabb2fdbe5c762","impliedFormat":99},{"version":"22b43e7fd932e3aa63e5bee8247d408ad1e5a29fe8008123dc6a4bd35ea49ded","impliedFormat":99},{"version":"aeea49091e71d123a471642c74a5dc4d8703476fd6254002d27c75728aa13691","impliedFormat":99},{"version":"0d4db4b482d5dec495943683ba3b6bb4026747a351c614fafdbaf54c00c5adab","impliedFormat":99},{"version":"45ac0268333f7bf8098595cda739764c429cd5d182ae4a127b3ca33405f81431","impliedFormat":99},{"version":"253c3549b055ad942ee115bef4c586c0c56e6b11aeb6353f171c7f0ffec8df07","impliedFormat":99},{"version":"0f1791a8891729f010e49f29b921b05afd45e5ba8430663c8ece4edeee748b1b","impliedFormat":99},{"version":"dfa585104fc407014e2a9ceafb748a50284fb282a561e9d8eb08562e64b1cb24","impliedFormat":99},{"version":"51130d85941585df457441c29e8f157ddc01e4978573a02a806a04c687b6748a","impliedFormat":99},{"version":"40f0d41f453dc614b2a3c552e7aca5ce723bb84d6e6bca8a6dcad1dca4cd9449","impliedFormat":99},{"version":"404627849c9714a78663bd299480dd94e75e457f5322caf0c7e169e5adab0a18","impliedFormat":99},{"version":"208306f454635e47d72092763c801f0ffcb7e6cba662d553eee945bd50987bb1","impliedFormat":99},{"version":"8b5a27971e8ede37415e42f24aae6fd227c2a1d2a93d6b8c7791a13abcde0f0b","impliedFormat":99},{"version":"1c106d58790bab5e144b35eeb31186f2be215d651e4000586fc021140cd324b9","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"c140653685b9af4f01e4283dd9d759126cb15f1c41721270c0bdbb55fd72673f","impliedFormat":99},{"version":"5844202ecdcea1f8612a826905623d93add56c9c1988df6471dff9999d92c0a7","impliedFormat":99},{"version":"b268ce0a7f489c27d8bf748c2563fd81092ead98e4c30f673670297250b774bd","impliedFormat":99},{"version":"9b0ca5de920ec607eecea5b40402fca8e705dfb3ff5e72cc91e2ac6d8f390985","impliedFormat":99},{"version":"efad5849e64223db373bbabc5eb6b2566d16e3bd34c0fd29ccf8bbe8a8a655e7","impliedFormat":99},{"version":"4c1c9ab197c2596bace50281bacf3ce3276f22aaef1c8398af0137779b577f24","impliedFormat":99},{"version":"a1acd535289b4cca0466376c1af5a99d887c91483792346be3b0b58d5f72eead","impliedFormat":99},{"version":"cdb6a1ed879f191ad45615cb4b7e7935237de0cfb8d410c7eb1fd9707d9c17ac","impliedFormat":99},{"version":"ca1debd87d50ade2eba2d0594eb47ab98e050a9fa08f879c750d80863dd3ce4c","impliedFormat":99},{"version":"dc01a3cc4787313606d58b1c6f3a4c5bf0d3fe4e3789dfdcde28d59bfd9b7c59","impliedFormat":99},{"version":"73ab9b053ad2a5ddee2f4c9b8cd36a436974dd5fa5a7c74940dd6b92e4d8e02d","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"fbf43977fd4aead581f1ef81146a4ff6fafe6bec7fac2b4cbd5a00577ab0c1c7","impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"961cf7535b9c521cd634055b1b6ac49b94d055f0b573ce7fdc4cfaddab080b7c","impliedFormat":1},{"version":"806a8c6daae69e5695e7200d9eca6bc1e4298f38d90edda3ce67a794da31a24f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"5e0c66763bda6ad4efe2ff62b2ca3a8af0b8d5b58a09429bbf9e433706c32f49","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"cd9189eacf0f9143b8830e9d6769335aa6d902c04195f04145bcbf19e7f26fcb","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"c2a6a737189ced24ffe0634e9239b087e4c26378d0490f95141b9b9b042b746c","impliedFormat":1},{"version":"c189c903a1eb9620083188f005016fafef46ec9f65a6c93b356122251e7c83a8","signature":"a66b08d5957056956a73d0da1f1a25d94a8deee8fc0dda21b2426949651918d3"},{"version":"aa33f2f6c925e57e552e0fe8874fb6a6decbb4b2bd34e2beaac825b17e6cac2d","signature":"82908493d1cb77532ce657dc02cbac73e795d0dc2ea22b7c1063f74ba1630ecb"},{"version":"67e9411bdf74f85a76ca326bc39e440c5ad9ee328cd2740cc541dc826d123cde","signature":"8ea24a9df910b0945e88a92aee6869013873801fe5d885594c7b5cff33263d4b"},{"version":"465f1ca1f11e6a1b01b043a93196b7f8fc09c985b8e3084804d9a3938aad588d","impliedFormat":1},{"version":"00b72e597dcd6ff7bf772918c78c41dc7c68e239af658cf452bff645ebdc485d","impliedFormat":1},{"version":"17b183b69a3dd3cca2505cee7ff70501c574343ad49a385c9acb5b5299e1ba73","impliedFormat":1},{"version":"b26d3fa6859459f64c93e0c154bfc7a8b216b4cf1e241ca6b67e67ee8248626b","impliedFormat":1},{"version":"91cab3f4d6ab131c74ea8772a8c182bdb9c52500fb0388ef9fd2828c084b8087","impliedFormat":1},{"version":"13b8acfead5a8519fad35e43f58c62b946a24f2a1311254250b840b15b2051cd","impliedFormat":99},{"version":"a239d8967339d47496c56564629b37f021d2c76516d30660ede4167a1000b378","signature":"eff01d2bd4cee37bf7a0690ab7d9d17b258ce2b6570e2dd5276214e939760d6b"}],"root":[[286,288],295],"options":{"esModuleInterop":true,"module":1,"skipLibCheck":true,"strict":true,"target":7},"referencedMap":[[130,1],[143,2],[142,3],[141,1],[140,4],[129,5],[128,6],[158,7],[162,8],[159,9],[160,10],[161,11],[157,12],[113,13],[114,13],[115,13],[116,13],[125,14],[99,13],[144,15],[124,16],[117,13],[118,13],[119,13],[100,17],[156,13],[120,13],[121,18],[122,19],[123,18],[101,20],[154,21],[155,22],[152,23],[150,24],[148,25],[147,26],[151,27],[153,28],[146,28],[149,28],[145,29],[127,30],[111,31],[112,31],[110,32],[108,33],[109,32],[106,34],[126,35],[107,36],[139,37],[137,38],[138,39],[136,40],[131,41],[135,42],[133,43],[132,13],[134,44],[98,13],[88,13],[89,13],[97,13],[54,45],[58,45],[55,13],[59,46],[56,13],[57,47],[105,48],[104,49],[102,36],[103,50],[60,51],[76,52],[84,53],[82,3],[78,54],[81,55],[80,3],[79,56],[83,54],[77,3],[75,57],[65,3],[68,58],[67,59],[66,13],[73,60],[64,59],[61,59],[72,59],[69,61],[71,13],[70,13],[74,59],[63,62],[96,63],[90,64],[91,65],[87,66],[86,66],[93,65],[92,65],[95,64],[94,64],[85,67],[285,68],[225,69],[226,69],[227,70],[165,71],[228,72],[229,73],[230,74],[163,13],[231,75],[232,76],[233,77],[234,78],[235,79],[236,80],[237,80],[238,81],[239,82],[240,83],[241,84],[166,13],[164,13],[242,85],[243,86],[244,87],[284,88],[245,89],[246,90],[247,89],[248,91],[249,92],[250,93],[251,94],[252,94],[253,94],[254,95],[255,96],[256,97],[257,98],[258,99],[259,100],[260,100],[261,101],[262,13],[263,13],[264,102],[265,103],[266,102],[267,104],[268,105],[269,106],[270,107],[271,108],[272,109],[273,110],[274,111],[275,112],[276,113],[277,114],[278,115],[279,116],[280,117],[281,118],[167,89],[168,13],[169,119],[170,120],[171,13],[172,121],[173,13],[216,122],[217,123],[218,124],[219,124],[220,125],[221,13],[222,72],[223,126],[224,123],[282,127],[283,128],[293,129],[294,130],[289,13],[290,13],[292,131],[291,132],[174,13],[62,13],[51,13],[52,13],[10,13],[8,13],[9,13],[14,13],[13,13],[2,13],[15,13],[16,13],[17,13],[18,13],[19,13],[20,13],[21,13],[22,13],[3,13],[23,13],[24,13],[4,13],[25,13],[29,13],[26,13],[27,13],[28,13],[30,13],[31,13],[32,13],[5,13],[33,13],[34,13],[35,13],[36,13],[6,13],[40,13],[37,13],[38,13],[39,13],[41,13],[7,13],[42,13],[53,13],[47,13],[48,13],[43,13],[44,13],[45,13],[46,13],[1,13],[49,13],[50,13],[12,13],[11,13],[192,133],[204,134],[190,135],[205,136],[214,137],[181,138],[182,139],[180,140],[213,68],[208,141],[212,142],[184,143],[201,144],[183,145],[211,146],[178,147],[179,141],[185,148],[186,13],[191,149],[189,148],[176,150],[215,151],[206,152],[195,153],[194,148],[196,154],[199,155],[193,156],[197,157],[209,68],[187,158],[188,159],[200,160],[177,136],[203,161],[202,148],[198,162],[207,13],[175,13],[210,163],[288,164],[287,13],[286,13],[295,165]],"affectedFilesPendingEmit":[288,287,286,295],"version":"5.9.3"} \ No newline at end of file From 3dd656bd3c571964d114397abf93c5d3aaccea52 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 9 Jan 2026 23:48:07 -0600 Subject: [PATCH 03/77] refactor(ertp-ledgerguise): split issuer kit helpers --- packages/ertp-ledgerguise/src/db-helpers.ts | 95 ++++++++ packages/ertp-ledgerguise/src/guids.ts | 9 + packages/ertp-ledgerguise/src/index.ts | 202 ++++-------------- packages/ertp-ledgerguise/src/purse.ts | 46 ++++ packages/ertp-ledgerguise/src/types.ts | 58 +++++ .../ertp-ledgerguise/tsconfig.tsbuildinfo | 2 +- 6 files changed, 248 insertions(+), 164 deletions(-) create mode 100644 packages/ertp-ledgerguise/src/db-helpers.ts create mode 100644 packages/ertp-ledgerguise/src/guids.ts create mode 100644 packages/ertp-ledgerguise/src/purse.ts create mode 100644 packages/ertp-ledgerguise/src/types.ts diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts new file mode 100644 index 0000000..086a66c --- /dev/null +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -0,0 +1,95 @@ +import type { Database } from 'better-sqlite3'; +import type { CommoditySpec, Guid } from './types'; + +export const ensureCommodityRow = ( + db: Database, + guid: Guid, + commodity: CommoditySpec, +): void => { + const { + namespace = 'COMMODITY', + mnemonic, + fullname = mnemonic, + fraction = 1, + quoteFlag = 0, + } = commodity; + const insert = db.prepare( + [ + 'INSERT OR IGNORE INTO commodities(', + 'guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz', + ') VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL)', + ].join(' '), + ); + insert.run(guid, namespace, mnemonic, fullname, fraction, quoteFlag); +}; + +export const ensureAccountRow = ( + db: Database, + accountGuid: Guid, + name: string, + commodityGuid: Guid, + accountType = 'ASSET', +): void => { + db.prepare( + [ + 'INSERT OR IGNORE INTO accounts(', + 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', + ') VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0)', + ].join(' '), + ).run(accountGuid, name, accountType, commodityGuid, 1, 0); +}; + +export const getCommodityAllegedName = (db: Database, commodityGuid: Guid): string => { + const row = db + .prepare<[string], { fullname: string | null; mnemonic: string }>( + 'SELECT fullname, mnemonic FROM commodities WHERE guid = ?', + ) + .get(commodityGuid); + return row?.fullname || row?.mnemonic || 'GnuCash'; +}; + +export const getAccountBalance = (db: Database, accountGuid: Guid): bigint => { + const row = db + .prepare<[string], { qty: string }>( + 'SELECT COALESCE(SUM(quantity_num), 0) AS qty FROM splits WHERE account_guid = ?', + ) + .get(accountGuid); + return row ? BigInt(row.qty) : 0n; +}; + +export const makeTransferRecorder = ( + db: Database, + commodityGuid: Guid, + balanceAccountGuid: Guid, + makeGuid: () => Guid, +) => { + const recordSplit = (txGuid: Guid, accountGuid: Guid, amount: bigint) => { + const splitGuid = makeGuid(); + db.prepare( + [ + 'INSERT INTO splits(', + 'guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date,', + 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', + ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', + ].join(' '), + ).run(splitGuid, txGuid, accountGuid, '', '', 'n', amount.toString(), 1, amount.toString(), 1); + }; + + const recordTransaction = (txGuid: Guid, amount: bigint) => { + const now = new Date().toISOString().slice(0, 19); + db.prepare( + [ + 'INSERT INTO transactions(', + 'guid, currency_guid, num, post_date, enter_date, description', + ') VALUES (?, ?, ?, ?, ?, ?)', + ].join(' '), + ).run(txGuid, commodityGuid, '', now, now, `ledgerguise ${amount.toString()}`); + }; + + return (accountGuid: Guid, amount: bigint) => { + const txGuid = makeGuid(); + recordTransaction(txGuid, amount); + recordSplit(txGuid, accountGuid, amount); + recordSplit(txGuid, balanceAccountGuid, -amount); + }; +}; diff --git a/packages/ertp-ledgerguise/src/guids.ts b/packages/ertp-ledgerguise/src/guids.ts new file mode 100644 index 0000000..d24cf97 --- /dev/null +++ b/packages/ertp-ledgerguise/src/guids.ts @@ -0,0 +1,9 @@ +import { createHash } from 'node:crypto'; + +export type Guid = string & { __guidBrand: 'Guid' }; +// TODO: consider a template-literal Guid type like `${hex}${hex}${string}`. + +export const asGuid = (value: string): Guid => value as Guid; + +export const makeDeterministicGuid = (seed: string): Guid => + asGuid(createHash('sha256').update(seed).digest('hex').slice(0, 32)); diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index a05d8b1..5f48de1 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -7,42 +7,34 @@ * @see openIssuerKit */ -import { createHash } from 'node:crypto'; import type { IssuerKit } from '@agoric/ertp'; import type { Database } from 'better-sqlite3'; import { gcEmptySql } from './sql/gc_empty'; import { freezeProps } from './jessie-tools'; - -export type Guid = string & { __guidBrand: 'Guid' }; -// TODO: consider a template-literal Guid type like `${hex}${hex}${string}`. - -export const asGuid = (value: string): Guid => value as Guid; - -export type CommoditySpec = { - namespace?: string; - mnemonic: string; - fullname?: string; - fraction?: number; - quoteFlag?: number; -}; - -export type CreateIssuerConfig = { - db: Database; - commodity: CommoditySpec; - /** - * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. - */ - makeGuid: () => Guid; -}; - -export type OpenIssuerConfig = { - db: Database; - commodityGuid: Guid; - /** - * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. - */ - makeGuid: () => Guid; -}; +import { makeDeterministicGuid } from './guids'; +import type { + AccountPurse, + CreateIssuerConfig, + Guid, + IssuerKitForCommodity, + IssuerKitWithPurseGuids, + OpenIssuerConfig, +} from './types'; +import { + ensureAccountRow, + ensureCommodityRow, + getCommodityAllegedName, + makeTransferRecorder, +} from './db-helpers'; +import { makePurseFactory } from './purse'; + +export type { + CommoditySpec, + IssuerKitForCommodity, + IssuerKitWithGuid, + IssuerKitWithPurseGuids, +} from './types'; +export { asGuid } from './guids'; /** * Initialize an empty sqlite database with the GnuCash schema. @@ -52,66 +44,6 @@ export const initGnuCashSchema = (db: Database): void => { db.exec(gcEmptySql); }; -const ensureCommodityRow = ( - db: Database, - guid: Guid, - commodity: CommoditySpec, -): void => { - const { - namespace = 'COMMODITY', - mnemonic, - fullname = mnemonic, - fraction = 1, - quoteFlag = 0, - } = commodity; - const insert = db.prepare( - [ - 'INSERT OR IGNORE INTO commodities(', - 'guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz', - ') VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL)', - ].join(' '), - ); - insert.run(guid, namespace, mnemonic, fullname, fraction, quoteFlag); -}; - -const makeDeterministicGuid = (seed: string): Guid => - asGuid(createHash('sha256').update(seed).digest('hex').slice(0, 32)); - -const ensureAccountRow = ( - db: Database, - accountGuid: Guid, - name: string, - commodityGuid: Guid, - accountType = 'ASSET', -): void => { - db.prepare( - [ - 'INSERT OR IGNORE INTO accounts(', - 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', - ') VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0)', - ].join(' '), - ).run(accountGuid, name, accountType, commodityGuid, 1, 0); -}; - -type AmountLike = { value: bigint }; - -type AccountPurse = { - deposit: (payment: object) => unknown; - withdraw: (amount: AmountLike) => object; - getCurrentAmount: () => AmountLike; -}; - -type AccountPurseAccess = { - makeAccountPurse: (accountGuid: Guid) => AccountPurse; - openAccountPurse: (accountGuid: Guid) => AccountPurse; -}; - -type IssuerKitForCommodity = { - kit: IssuerKit; - accounts: AccountPurseAccess; - purseGuids: WeakMap; -}; - const makeIssuerKitForCommodity = ( db: Database, commodityGuid: Guid, @@ -128,72 +60,23 @@ const makeIssuerKitForCommodity = ( paymentRecords.set(payment, { amount, live: true }); return payment; }; - const getAllegedName = () => { - const row = db - .prepare<[string], { fullname: string | null; mnemonic: string }>( - 'SELECT fullname, mnemonic FROM commodities WHERE guid = ?', - ) - .get(commodityGuid); - return row?.fullname || row?.mnemonic || 'GnuCash'; - }; + const getAllegedName = () => getCommodityAllegedName(db, commodityGuid); const balanceAccountGuid = makeDeterministicGuid(`ledgerguise-balance:${commodityGuid}`); ensureAccountRow(db, balanceAccountGuid, 'Ledgerguise Balance', commodityGuid, 'EQUITY'); - const getBalance = (accountGuid: Guid) => { - const row = db - .prepare<[string], { qty: string }>( - 'SELECT COALESCE(SUM(quantity_num), 0) AS qty FROM splits WHERE account_guid = ?', - ) - .get(accountGuid); - return row ? BigInt(row.qty) : 0n; - }; - const recordSplit = (txGuid: Guid, accountGuid: Guid, amount: bigint) => { - const splitGuid = makeGuid(); - db.prepare( - [ - 'INSERT INTO splits(', - 'guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date,', - 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', - ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', - ].join(' '), - ).run(splitGuid, txGuid, accountGuid, '', '', 'n', amount.toString(), 1, amount.toString(), 1); - }; - const recordTransaction = (txGuid: Guid, amount: bigint) => { - const now = new Date().toISOString().slice(0, 19); - db.prepare( - [ - 'INSERT INTO transactions(', - 'guid, currency_guid, num, post_date, enter_date, description', - ') VALUES (?, ?, ?, ?, ?, ?)', - ].join(' '), - ).run(txGuid, commodityGuid, '', now, now, `ledgerguise ${amount.toString()}`); - }; - const applyTransfer = (accountGuid: Guid, amount: bigint) => { - const txGuid = makeGuid(); - recordTransaction(txGuid, amount); - recordSplit(txGuid, accountGuid, amount); - recordSplit(txGuid, balanceAccountGuid, -amount); - }; - const purseGuids = new WeakMap(); - const makePurse = (accountGuid: Guid, name: string): AccountPurse => { - ensureAccountRow(db, accountGuid, name, commodityGuid); - const deposit = (payment: object) => { - const record = paymentRecords.get(payment); - if (!record?.live) throw new Error('payment not live'); - record.live = false; - applyTransfer(accountGuid, record.amount); - return makeAmount(getBalance(accountGuid)); - }; - const withdraw = (amount: AmountLike) => { - const balance = getBalance(accountGuid); - if (amount.value > balance) throw new Error('insufficient funds'); - applyTransfer(accountGuid, -amount.value); - return makePayment(amount.value); - }; - const getCurrentAmount = () => makeAmount(getBalance(accountGuid)); - const purse = freezeProps({ deposit, withdraw, getCurrentAmount }); - purseGuids.set(purse, accountGuid); - return purse; - }; + const applyTransfer = makeTransferRecorder( + db, + commodityGuid, + balanceAccountGuid, + makeGuid, + ); + const { makePurse, purseGuids } = makePurseFactory({ + db, + commodityGuid, + makeAmount, + makePayment, + paymentRecords, + applyTransfer, + }); const brand = freezeProps({ isMyIssuer: async () => false, getAllegedName: () => getAllegedName(), @@ -240,13 +123,6 @@ const makeIssuerKitForCommodity = ( return freezeProps({ kit, accounts, purseGuids }); }; -export type IssuerKitWithGuid = IssuerKit & { commodityGuid: Guid }; -export type IssuerKitWithPurseGuids = IssuerKitWithGuid & { - purses: { - getGuid: (purse: unknown) => Guid; - }; -}; - /** * Create a new GnuCash commodity entry and return an ERTP kit bound to it. * The returned kit includes `commodityGuid` and a `purses.getGuid()` facet. diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts new file mode 100644 index 0000000..af949b2 --- /dev/null +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -0,0 +1,46 @@ +import { freezeProps } from './jessie-tools'; +import { ensureAccountRow, getAccountBalance } from './db-helpers'; +import type { AccountPurse, AmountLike, Guid } from './types'; + +type PurseFactoryOptions = { + db: import('better-sqlite3').Database; + commodityGuid: Guid; + makeAmount: (value: bigint) => AmountLike; + makePayment: (amount: bigint) => object; + paymentRecords: WeakMap; + applyTransfer: (accountGuid: Guid, amount: bigint) => void; +}; + +export const makePurseFactory = ({ + db, + commodityGuid, + makeAmount, + makePayment, + paymentRecords, + applyTransfer, +}: PurseFactoryOptions) => { + const purseGuids = new WeakMap(); + + const makePurse = (accountGuid: Guid, name: string): AccountPurse => { + ensureAccountRow(db, accountGuid, name, commodityGuid); + const deposit = (payment: object) => { + const record = paymentRecords.get(payment); + if (!record?.live) throw new Error('payment not live'); + record.live = false; + applyTransfer(accountGuid, record.amount); + return makeAmount(getAccountBalance(db, accountGuid)); + }; + const withdraw = (amount: AmountLike) => { + const balance = getAccountBalance(db, accountGuid); + if (amount.value > balance) throw new Error('insufficient funds'); + applyTransfer(accountGuid, -amount.value); + return makePayment(amount.value); + }; + const getCurrentAmount = () => makeAmount(getAccountBalance(db, accountGuid)); + const purse = freezeProps({ deposit, withdraw, getCurrentAmount }); + purseGuids.set(purse, accountGuid); + return purse; + }; + + return { makePurse, purseGuids }; +}; diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts new file mode 100644 index 0000000..15e33a5 --- /dev/null +++ b/packages/ertp-ledgerguise/src/types.ts @@ -0,0 +1,58 @@ +import type { IssuerKit } from '@agoric/ertp'; +import type { Database } from 'better-sqlite3'; +import type { Guid } from './guids'; + +export type CommoditySpec = { + namespace?: string; + mnemonic: string; + fullname?: string; + fraction?: number; + quoteFlag?: number; +}; + +export type CreateIssuerConfig = { + db: Database; + commodity: CommoditySpec; + /** + * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. + */ + makeGuid: () => Guid; +}; + +export type OpenIssuerConfig = { + db: Database; + commodityGuid: Guid; + /** + * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. + */ + makeGuid: () => Guid; +}; + +export type AmountLike = { value: bigint }; + +export type AccountPurse = { + deposit: (payment: object) => unknown; + withdraw: (amount: AmountLike) => object; + getCurrentAmount: () => AmountLike; +}; + +export type AccountPurseAccess = { + makeAccountPurse: (accountGuid: Guid) => AccountPurse; + openAccountPurse: (accountGuid: Guid) => AccountPurse; +}; + +export type IssuerKitForCommodity = { + kit: IssuerKit; + accounts: AccountPurseAccess; + purseGuids: WeakMap; +}; + +export type IssuerKitWithGuid = IssuerKit & { commodityGuid: Guid }; + +export type IssuerKitWithPurseGuids = IssuerKitWithGuid & { + purses: { + getGuid: (purse: unknown) => Guid; + }; +}; + +export type { Guid } from './guids'; diff --git a/packages/ertp-ledgerguise/tsconfig.tsbuildinfo b/packages/ertp-ledgerguise/tsconfig.tsbuildinfo index 5a774ff..c01eaa3 100644 --- a/packages/ertp-ledgerguise/tsconfig.tsbuildinfo +++ b/packages/ertp-ledgerguise/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2020.full.d.ts","./node_modules/@endo/eventual-send/src/E.d.ts","./node_modules/@endo/eventual-send/src/handled-promise.d.ts","./node_modules/@endo/eventual-send/src/track-turns.d.ts","./node_modules/@endo/eventual-send/src/types.d.ts","./node_modules/@endo/eventual-send/src/exports.d.ts","./node_modules/@endo/eventual-send/src/no-shim.d.ts","./node_modules/@endo/far/src/exports.d.ts","./node_modules/@endo/pass-style/src/passStyle-helpers.d.ts","./node_modules/ses/types.d.ts","./node_modules/@endo/pass-style/src/types.d.ts","./node_modules/@endo/pass-style/src/makeTagged.d.ts","./node_modules/@endo/pass-style/src/deeplyFulfilled.d.ts","./node_modules/@endo/pass-style/src/iter-helpers.d.ts","./node_modules/@endo/pass-style/src/internal-types.d.ts","./node_modules/@endo/pass-style/src/error.d.ts","./node_modules/@endo/pass-style/src/remotable.d.ts","./node_modules/@endo/pass-style/src/symbol.d.ts","./node_modules/@endo/pass-style/src/string.d.ts","./node_modules/@endo/pass-style/src/passStyleOf.d.ts","./node_modules/@endo/pass-style/src/make-far.d.ts","./node_modules/@endo/pass-style/src/typeGuards.d.ts","./node_modules/@endo/pass-style/index.d.ts","./node_modules/@endo/far/src/index.d.ts","./node_modules/@endo/marshal/src/types.d.ts","./node_modules/@endo/marshal/src/encodeToCapData.d.ts","./node_modules/@endo/marshal/src/marshal.d.ts","./node_modules/@endo/marshal/src/marshal-stringify.d.ts","./node_modules/@endo/marshal/src/marshal-justin.d.ts","./node_modules/@endo/marshal/src/encodePassable.d.ts","./node_modules/@endo/marshal/src/rankOrder.d.ts","./node_modules/@endo/marshal/index.d.ts","./node_modules/@endo/patterns/src/types.d.ts","./node_modules/@endo/patterns/src/keys/copySet.d.ts","./node_modules/@endo/patterns/src/keys/copyBag.d.ts","./node_modules/@endo/common/list-difference.d.ts","./node_modules/@endo/common/object-map.d.ts","./node_modules/@endo/patterns/src/keys/checkKey.d.ts","./node_modules/@endo/patterns/src/keys/compareKeys.d.ts","./node_modules/@endo/patterns/src/keys/merge-set-operators.d.ts","./node_modules/@endo/patterns/src/keys/merge-bag-operators.d.ts","./node_modules/@endo/patterns/src/patterns/patternMatchers.d.ts","./node_modules/@endo/patterns/src/patterns/getGuardPayloads.d.ts","./node_modules/@endo/patterns/index.d.ts","./node_modules/@endo/common/object-meta-map.d.ts","./node_modules/@endo/common/from-unique-entries.d.ts","./node_modules/@agoric/internal/src/js-utils.d.ts","./node_modules/@agoric/internal/src/ses-utils.d.ts","./node_modules/@agoric/internal/src/types.ts","./node_modules/@endo/exo/src/get-interface.d.ts","./node_modules/@endo/exo/src/types.d.ts","./node_modules/@endo/exo/src/exo-makers.d.ts","./node_modules/@endo/exo/index.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakSetStore.d.ts","./node_modules/@agoric/store/src/types.d.ts","./node_modules/@agoric/store/src/stores/scalarSetStore.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakMapStore.d.ts","./node_modules/@agoric/store/src/stores/scalarMapStore.d.ts","./node_modules/@agoric/store/src/legacy/legacyMap.d.ts","./node_modules/@agoric/store/src/legacy/legacyWeakMap.d.ts","./node_modules/@agoric/internal/src/cli-utils.d.ts","./node_modules/@agoric/internal/src/config.d.ts","./node_modules/@agoric/internal/src/debug.d.ts","./node_modules/@agoric/internal/src/errors.d.ts","./node_modules/@agoric/internal/src/method-tools.d.ts","./node_modules/@agoric/internal/src/metrics.d.ts","./node_modules/@agoric/internal/src/natural-sort.d.ts","./node_modules/@agoric/internal/src/tmpDir.d.ts","./node_modules/@agoric/internal/src/typeCheck.d.ts","./node_modules/@agoric/internal/src/typeGuards.d.ts","./node_modules/@agoric/internal/src/types-index.d.ts","./node_modules/@agoric/internal/src/marshal.d.ts","./node_modules/@agoric/internal/src/index.d.ts","./node_modules/@agoric/store/src/stores/store-utils.d.ts","./node_modules/@agoric/store/src/index.d.ts","./node_modules/@agoric/base-zone/src/watch-promise.d.ts","./node_modules/@agoric/base-zone/src/types.d.ts","./node_modules/@agoric/base-zone/src/exports.d.ts","./node_modules/@agoric/swingset-liveslots/src/types.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualReferences.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualObjectManager.d.ts","./node_modules/@agoric/swingset-liveslots/src/watchedPromises.d.ts","./node_modules/@agoric/swingset-liveslots/src/vatDataTypes.ts","./node_modules/@agoric/swingset-liveslots/src/types-index.d.ts","./node_modules/@agoric/swingset-liveslots/src/liveslots.d.ts","./node_modules/@agoric/swingset-liveslots/src/message.d.ts","./node_modules/@agoric/swingset-liveslots/src/index.d.ts","./node_modules/@agoric/base-zone/src/make-once.d.ts","./node_modules/@agoric/base-zone/src/keys.d.ts","./node_modules/@agoric/base-zone/src/is-passable.d.ts","./node_modules/@agoric/base-zone/src/index.d.ts","./node_modules/@agoric/internal/src/lib-chainStorage.d.ts","./node_modules/@agoric/notifier/src/types.ts","./node_modules/@agoric/notifier/src/topic.d.ts","./node_modules/@agoric/notifier/src/storesub.d.ts","./node_modules/@agoric/notifier/src/stored-notifier.d.ts","./node_modules/@agoric/notifier/src/types-index.d.ts","./node_modules/@agoric/notifier/src/publish-kit.d.ts","./node_modules/@agoric/notifier/src/subscribe.d.ts","./node_modules/@agoric/notifier/src/notifier.d.ts","./node_modules/@agoric/notifier/src/subscriber.d.ts","./node_modules/@agoric/notifier/src/asyncIterableAdaptor.d.ts","./node_modules/@agoric/notifier/src/index.d.ts","./node_modules/@agoric/internal/src/tagged.d.ts","./node_modules/@agoric/ertp/src/types.ts","./node_modules/@agoric/ertp/src/amountMath.d.ts","./node_modules/@agoric/ertp/src/issuerKit.d.ts","./node_modules/@agoric/ertp/src/typeGuards.d.ts","./node_modules/@agoric/ertp/src/types-index.d.ts","./node_modules/@agoric/ertp/src/index.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/better-sqlite3/index.d.ts","./src/sql/gc_empty.ts","./src/jessie-tools.ts","./src/index.ts","./node_modules/ava/types/assertions.d.cts","./node_modules/ava/types/subscribable.d.cts","./node_modules/ava/types/try-fn.d.cts","./node_modules/ava/types/test-fn.d.cts","./node_modules/ava/entrypoints/main.d.cts","./node_modules/ava/index.d.ts","./test/ledgerguise.test.ts"],"fileIdsList":[[129,165,228,236,240,243,245,246,247,259],[128,130,140,141,142,165,228,236,240,243,245,246,247,259],[75,165,228,236,240,243,245,246,247,259],[129,139,165,228,236,240,243,245,246,247,259],[105,127,128,165,228,236,240,243,245,246,247,259],[96,165,228,236,240,243,245,246,247,259],[96,157,165,228,236,240,243,245,246,247,259],[158,159,160,161,165,228,236,240,243,245,246,247,259],[96,125,157,158,165,228,236,240,243,245,246,247,259],[96,125,157,165,228,236,240,243,245,246,247,259],[157,165,228,236,240,243,245,246,247,259],[75,76,96,155,156,158,165,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259],[99,100,113,114,115,116,117,118,119,120,121,122,123,124,165,228,236,240,243,245,246,247,259],[76,84,101,105,143,165,228,236,240,243,245,246,247,259],[84,101,165,228,236,240,243,245,246,247,259],[76,89,97,98,99,101,165,228,236,240,243,245,246,247,259],[101,165,228,236,240,243,245,246,247,259],[96,101,165,228,236,240,243,245,246,247,259],[59,75,96,100,165,228,236,240,243,245,246,247,259],[59,75,76,145,149,165,228,236,240,243,245,246,247,259],[146,147,148,149,150,151,152,153,154,165,228,236,240,243,245,246,247,259],[125,145,165,228,236,240,243,245,246,247,259],[96,139,145,165,228,236,240,243,245,246,247,259],[75,76,144,145,165,228,236,240,243,245,246,247,259],[76,84,144,145,165,228,236,240,243,245,246,247,259],[59,75,76,145,165,228,236,240,243,245,246,247,259],[145,165,228,236,240,243,245,246,247,259],[84,144,165,228,236,240,243,245,246,247,259],[96,105,106,107,108,109,110,111,112,125,126,165,228,236,240,243,245,246,247,259],[107,165,228,236,240,243,245,246,247,259],[75,96,107,165,228,236,240,243,245,246,247,259],[96,107,165,228,236,240,243,245,246,247,259],[96,127,165,228,236,240,243,245,246,247,259],[75,84,96,107,165,228,236,240,243,245,246,247,259],[75,96,165,228,236,240,243,245,246,247,259],[136,137,138,165,228,236,240,243,245,246,247,259],[99,131,165,228,236,240,243,245,246,247,259],[131,165,228,236,240,243,245,246,247,259],[131,135,165,228,236,240,243,245,246,247,259],[84,165,228,236,240,243,245,246,247,259],[59,75,96,105,127,134,165,228,236,240,243,245,246,247,259],[84,131,132,139,165,228,236,240,243,245,246,247,259],[84,131,132,133,135,165,228,236,240,243,245,246,247,259],[57,165,228,236,240,243,245,246,247,259],[54,55,58,165,228,236,240,243,245,246,247,259],[54,55,56,165,228,236,240,243,245,246,247,259],[102,103,104,165,228,236,240,243,245,246,247,259],[96,103,165,228,236,240,243,245,246,247,259],[59,75,96,102,165,228,236,240,243,245,246,247,259],[59,165,228,236,240,243,245,246,247,259],[59,60,75,165,228,236,240,243,245,246,247,259],[75,77,78,79,80,81,82,83,165,228,236,240,243,245,246,247,259],[75,77,165,228,236,240,243,245,246,247,259],[62,75,77,165,228,236,240,243,245,246,247,259],[77,165,228,236,240,243,245,246,247,259],[61,63,64,65,66,68,69,70,71,72,73,74,165,228,236,240,243,245,246,247,259],[62,63,67,165,228,236,240,243,245,246,247,259],[63,165,228,236,240,243,245,246,247,259],[59,63,165,228,236,240,243,245,246,247,259],[63,67,165,228,236,240,243,245,246,247,259],[61,62,165,228,236,240,243,245,246,247,259],[85,86,87,88,89,90,91,92,93,94,95,165,228,236,240,243,245,246,247,259],[75,85,165,228,236,240,243,245,246,247,259],[85,165,228,236,240,243,245,246,247,259],[75,84,85,165,228,236,240,243,245,246,247,259],[75,84,165,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,284],[165,225,226,228,236,240,243,245,246,247,259],[165,227,228,236,240,243,245,246,247,259],[228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,267],[165,228,229,234,236,239,240,243,245,246,247,249,259,264,276],[165,228,229,230,236,239,240,243,245,246,247,259],[165,228,231,236,240,243,245,246,247,259,277],[165,228,232,233,236,240,243,245,246,247,250,259],[165,228,233,236,240,243,245,246,247,259,264,273],[165,228,234,236,239,240,243,245,246,247,249,259],[165,227,228,235,236,240,243,245,246,247,259],[165,228,236,237,240,243,245,246,247,259],[165,228,236,238,239,240,243,245,246,247,259],[165,227,228,236,239,240,243,245,246,247,259],[165,228,236,239,240,241,243,245,246,247,259,264,276],[165,228,236,239,240,241,243,245,246,247,259,264,267],[165,215,228,236,239,240,242,243,245,246,247,249,259,264,276],[165,228,236,239,240,242,243,245,246,247,249,259,264,273,276],[165,228,236,240,242,243,244,245,246,247,259,264,273,276],[163,164,165,166,167,168,169,170,171,172,173,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283],[165,228,236,239,240,243,245,246,247,259],[165,228,236,240,243,245,247,259],[165,228,236,240,243,245,246,247,248,259,276],[165,228,236,239,240,243,245,246,247,249,259,264],[165,228,236,240,243,245,246,247,250,259],[165,228,236,240,243,245,246,247,251,259],[165,228,236,239,240,243,245,246,247,254,259],[165,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283],[165,228,236,240,243,245,246,247,256,259],[165,228,236,240,243,245,246,247,257,259],[165,228,233,236,240,243,245,246,247,249,259,267],[165,228,236,239,240,243,245,246,247,259,260],[165,228,236,240,243,245,246,247,259,261,277,280],[165,228,236,239,240,243,245,246,247,259,264,266,267],[165,228,236,240,243,245,246,247,259,265,267],[165,228,236,240,243,245,246,247,259,267,277],[165,228,236,240,243,245,246,247,259,268],[165,225,228,236,240,243,245,246,247,259,264,270],[165,228,236,240,243,245,246,247,259,264,269],[165,228,236,239,240,243,245,246,247,259,271,272],[165,228,236,240,243,245,246,247,259,271,272],[165,228,233,236,240,243,245,246,247,249,259,264,273],[165,228,236,240,243,245,246,247,259,274],[165,228,236,240,243,245,246,247,249,259,275],[165,228,236,240,242,243,245,246,247,257,259,276],[165,228,236,240,243,245,246,247,259,277,278],[165,228,233,236,240,243,245,246,247,259,278],[165,228,236,240,243,245,246,247,259,264,279],[165,228,236,240,243,245,246,247,248,259,280],[165,228,236,240,243,245,246,247,259,281],[165,228,231,236,240,243,245,246,247,259],[165,228,233,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,277],[165,215,228,236,240,243,245,246,247,259],[165,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,259,282],[165,228,236,240,243,245,246,247,254,259],[165,228,236,240,243,245,246,247,259,272],[165,215,228,236,239,240,241,243,245,246,247,254,259,264,267,276,279,280,282],[165,228,236,240,243,245,246,247,259,264,283],[165,228,236,240,243,245,246,247,259,289,290,291,292],[165,228,236,240,243,245,246,247,259,293],[165,228,236,240,243,245,246,247,259,289,290,291],[165,228,236,240,243,245,246,247,259,292],[165,181,184,187,188,228,236,240,243,245,246,247,259,276],[165,184,228,236,240,243,245,246,247,259,264,276],[165,184,188,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,259,264],[165,178,228,236,240,243,245,246,247,259],[165,182,228,236,240,243,245,246,247,259],[165,180,181,184,228,236,240,243,245,246,247,259,276],[165,228,236,240,243,245,246,247,249,259,273],[165,178,228,236,240,243,245,246,247,259,284],[165,180,184,228,236,240,243,245,246,247,249,259,276],[165,175,176,177,179,183,228,236,239,240,243,245,246,247,259,264,276],[165,184,192,200,228,236,240,243,245,246,247,259],[165,176,182,228,236,240,243,245,246,247,259],[165,184,209,210,228,236,240,243,245,246,247,259],[165,176,179,184,228,236,240,243,245,246,247,259,267,276,284],[165,184,228,236,240,243,245,246,247,259],[165,180,184,228,236,240,243,245,246,247,259,276],[165,175,228,236,240,243,245,246,247,259],[165,178,179,180,182,183,184,185,186,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,210,211,212,213,214,228,236,240,243,245,246,247,259],[165,184,202,205,228,236,240,243,245,246,247,259],[165,184,192,193,194,228,236,240,243,245,246,247,259],[165,182,184,193,195,228,236,240,243,245,246,247,259],[165,183,228,236,240,243,245,246,247,259],[165,176,178,184,228,236,240,243,245,246,247,259],[165,184,188,193,195,228,236,240,243,245,246,247,259],[165,188,228,236,240,243,245,246,247,259],[165,182,184,187,228,236,240,243,245,246,247,259,276],[165,176,180,184,192,228,236,240,243,245,246,247,259],[165,184,202,228,236,240,243,245,246,247,259],[165,195,228,236,240,243,245,246,247,259],[165,178,184,209,228,236,240,243,245,246,247,259,267,282,284],[162,165,228,233,236,240,243,245,246,247,259,285,286,287],[162,165,228,236,240,243,245,246,247,259,285,288,294]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"2cd4b702eb44058636981ad2a53ab0152417c8f36b224e459aa5404d5786166e","impliedFormat":99},{"version":"64a95727716d7a159ff916085eb5df4dd67f1ff9c6f7e35ce2aff8a4ed4e6d31","impliedFormat":99},{"version":"93340c70128cbf56acb9eba0146f9cae83b5ef8f4b02f380fff0b77a6b7cf113","impliedFormat":99},{"version":"eb10902fb118057f367f63a703af037ea92a1f8e6161b9b128c29d934539d9a5","impliedFormat":99},{"version":"6b9c704b9febb76cdf74f8f1e3ac199c5b4708e5be2afe257320411ec2c8a3a1","affectsGlobalScope":true,"impliedFormat":99},{"version":"614fa8a4693c632333c354af80562633c8aaf0d552e7ed90f191a6ace24abe9d","impliedFormat":99},{"version":"d221c15d4aae13d314072f859de2ccec2c600a3addc9f2b71b397c83a157e71f","impliedFormat":99},{"version":"dc8a5014726788b50b968d67404dbc7713009040720a04b39c784b43dd8fdacb","impliedFormat":99},{"version":"ea5d08724831aab137fab28195dadf65667aec35acc0f2a5e517271d8c3082d3","affectsGlobalScope":true,"impliedFormat":99},{"version":"009b62c055096dfb3291f2667b8f0984ce480abef01c646e9675868fcec5ac60","impliedFormat":99},{"version":"d86a646352434aa51e337e64e234eab2d28af156bb5931d25c789d0c5dfbcd08","impliedFormat":99},{"version":"d15ab66050babcbb3858c785c437230bd984943b9b2080cd16fe1f0007b4802b","impliedFormat":99},{"version":"d5dc3c765037bfc7bd118be91ad280801f8c01fe41e8b7c8c1d8b96f6a0dc489","impliedFormat":99},{"version":"c6af1103d816d17451bc1a18cb9889fc9a282966383b695927d3ead99d958da0","impliedFormat":99},{"version":"d34287eb61f4689723448d33f50a047769dadee66ec8cb8609b41b17a5b3df40","impliedFormat":99},{"version":"22f52ade1934d26b5db4d5558be99097a82417c0247958527336535930d5a288","impliedFormat":99},{"version":"717d656e46e34696d072f2cee99ca045e69350f3c5ede3193337f884ccbc2a3b","impliedFormat":99},{"version":"b5a53985100fa348fcfb06bad4ee86367168e018998cbf95394a01b2dac92bb7","impliedFormat":99},{"version":"cadea2f7c33f255e142da3b0fefee54fa3985a12471cf9c5c51a221b3844f976","impliedFormat":99},{"version":"46f09e6b30f4301674d1c685934bd4ad2b594085d2545d6f063c175b1dcfd5af","impliedFormat":99},{"version":"25cd3d5fecfed6af5903170b67e8b3531591633e14c5b6735aac0d49e93d7cf0","impliedFormat":99},{"version":"f9fdd230ece877f4bcd8d35240426bcb1482f44faf813e6a336c2cc1b034e58d","impliedFormat":99},{"version":"bcbe66e540446c7fb8b34afe764dae60b28ef929cafe26402594f41a377fac41","impliedFormat":99},{"version":"428ef8df7e77bd4731faa19ef7430823f42bc95abd99368351411541ee08d2f7","impliedFormat":99},{"version":"a8a953cb8cf0b05c91086bd15a383afdfbddbf0cda5ed67d2c55542a5064b69d","impliedFormat":99},{"version":"f5a00483d6aa997ffedb1e802df7c7dcd048e43deab8f75c2c754f4ee3f97b41","impliedFormat":99},{"version":"14da43cd38f32c3b6349d1667937579820f1a3ddb40f3187caa727d4d451dcd4","impliedFormat":99},{"version":"2b77e2bc5350c160c53c767c8e6325ee61da47eda437c1d3156e16df94a64257","impliedFormat":99},{"version":"b0c5a13c0ec9074cdd2f8ed15e6734ba49231eb773330b221083e79e558badb4","impliedFormat":99},{"version":"a2d30f97dcc401dad445fb4f0667a167d1b9c0fdb1132001cc37d379e8946e3c","impliedFormat":99},{"version":"81c859cff06ee38d6f6b8015faa04722b535bb644ea386919d570e0e1f052430","impliedFormat":99},{"version":"05e938c1bc8cc5d2f3b9bb87dc09da7ab8e8e8436f17af7f1672f9b42ab5307d","impliedFormat":99},{"version":"061020cd9bc920fc08a8817160c5cb97b8c852c5961509ed15aab0c5a4faddb3","impliedFormat":99},{"version":"e33bbc0d740e4db63b20fa80933eb78cd305258ebb02b2c21b7932c8df118d3b","impliedFormat":99},{"version":"6795c049a6aaaaeb25ae95e0b9a4c75c8a325bd2b3b40aee7e8f5225533334d4","impliedFormat":99},{"version":"e6081f90b9dc3ff16bcc3fdab32aa361800dc749acc78097870228d8f8fd9920","impliedFormat":99},{"version":"6274539c679f0c9bcd2dbf9e85c5116db6acf91b3b9e1084ce8a17db56a0259a","impliedFormat":99},{"version":"f472753504df7760ad34eafa357007e90c59040e6f6882aae751de7b134b8713","impliedFormat":99},{"version":"dba70304db331da707d5c771e492b9c1db7545eb29a949050a65d0d4fa4a000d","impliedFormat":99},{"version":"a520f33e8a5a92d3847223b2ae2d8244cdb7a6d3d8dfdcc756c5650a38fc30f4","impliedFormat":99},{"version":"76aec992df433e1e56b9899183b4cf8f8216e00e098659dbfbc4d0cbf9054725","impliedFormat":99},{"version":"28fbf5d3fdff7c1dad9e3fd71d4e60077f14134b06253cb62e0eb3ba46f628e3","impliedFormat":99},{"version":"c5340ac3565038735dbf82f6f151a75e8b95b9b1d5664b4fddf0168e4dd9c2f3","impliedFormat":99},{"version":"9481179c799a61aa282d5d48b22421d4d9f592c892f2c6ae2cda7b78595a173e","impliedFormat":99},{"version":"00de25621f1acd5ed68e04bb717a418150779459c0df27843e5a3145ab6aa13d","impliedFormat":99},{"version":"3b0a6f0e693745a8f6fd35bafb8d69f334f3c782a91c8f3344733e2e55ba740d","impliedFormat":99},{"version":"83576f4e2a788f59c217da41b5b7eb67912a400a5ff20aa0622a5c902d23eb75","impliedFormat":99},{"version":"039ee0312b31c74b8fcf0d55b24ef9350b17da57572648580acd70d2e79c0d84","impliedFormat":99},{"version":"6a437bd627ddcb418741f1a279a9db2828cc63c24b4f8586b0473e04f314bee5","impliedFormat":99},{"version":"bb1a27e42875da4a6ff036a9bbe8fca33f88225d9ee5f3c18619bfeabc37c4f4","impliedFormat":99},{"version":"56e07c29328f54e68cf4f6a81bc657ae6b2bbd31c2f53a00f4f0a902fa095ea1","impliedFormat":99},{"version":"ce29026a1ee122328dc9f1b40bff4cf424643fddf8dc6c046f4c71bf97ecf5b5","impliedFormat":99},{"version":"386a071f8e7ca44b094aba364286b65e6daceba25347afb3b7d316a109800393","impliedFormat":99},{"version":"6ba3f7fc791e73109b8c59ae17b1e013ab269629a973e78812e0143e4eab48b2","impliedFormat":99},{"version":"042dbb277282e4cb651b7a5cde8a07c01a7286d41f585808afa98c2c5adae7e0","impliedFormat":99},{"version":"0952d2faef01544f6061dd15d81ae53bfb9d3789b9def817f0019731e139bda8","impliedFormat":99},{"version":"8ec4b0ca2590204f6ef4a26d77c5c8b0bba222a5cd80b2cb3aa3016e3867f9ce","impliedFormat":99},{"version":"15d389a1ee1f700a49260e38736c8757339e5d5e06ca1409634242c1a7b0602e","impliedFormat":99},{"version":"f868b2a12bbe4356e2fd57057ba0619d88f1496d2b884a4f22d8bab3e253dbf5","impliedFormat":99},{"version":"a474bc8c71919a09c0d27ad0cba92e5e3e754dc957bec9c269728c9a4a4cf754","impliedFormat":99},{"version":"e732c6a46c6624dbbd56d3f164d6afdfe2b6007c6709bb64189ce057d03d30fd","impliedFormat":99},{"version":"5c425f77a2867b5d7026875328f13736e3478b0cc6c092787ac3a8dcc8ff0d42","impliedFormat":99},{"version":"b6d1738ae0dd427debbb3605ba03c30ceb76d4cefc7bd5f437004f6f4c622e38","impliedFormat":99},{"version":"6629357b7dd05ee4367a71962a234d508fa0fb99fbbad83fdbf3e64aa6e77104","impliedFormat":99},{"version":"5f8b299ecc1852b7b6eb9682a05f2dbfaae087e3363ecfbb9430350be32a97dc","impliedFormat":99},{"version":"6e304bbf3302fb015164bb3a7c7dfca6b3fdf57b1d56809173fed3663b42ced4","impliedFormat":99},{"version":"cd6aab42fef5395a16795cf23bbc9645dc9786af2c08dac3d61234948f72c67d","impliedFormat":99},{"version":"fe1f9b28ceb4ff76facbe0c363888d33d8265a0beb6fb5532a6e7a291490c795","impliedFormat":99},{"version":"b1d6ee25d690d99f44fd9c1c831bcdb9c0354f23dab49e14cdcfe5d0212bcba0","impliedFormat":99},{"version":"488958cf5865bce05ac5343cf1607ad7af72486a351c3afc7756fdd9fdafa233","impliedFormat":99},{"version":"424a44fb75e76db02794cf0e26c61510daf8bf4d4b43ebbeb6adc70be1dd68b4","impliedFormat":99},{"version":"519f0d3b64727722e5b188c679c1f741997be640fdcd30435a2c7ba006667d6e","impliedFormat":99},{"version":"49324b7e03d2c9081d66aef8b0a8129f0244ecac4fb11378520c9816d693ce7a","impliedFormat":99},{"version":"bbe31d874c9a2ac21ea0c5cee6ded26697f30961dca6f18470145b1c8cd66b21","impliedFormat":99},{"version":"38a5641908bc748e9829ab1d6147239a3797918fab932f0aa81543d409732990","impliedFormat":99},{"version":"125da449b5464b2873f7642e57452ac045a0219f0cb6a5d3391a15cc4336c471","impliedFormat":99},{"version":"d1cacc1ae76a3698129f4289657a18de22057bb6c00e7bf36aa2e9c5365eec66","impliedFormat":99},{"version":"0468caf7769824cd6ddd202c5f37c574bcc3f5c158ef401b71ca3ece8de5462f","impliedFormat":99},{"version":"966a181ee1c0cecd2aaa9cf8281f3b8036d159db7963788a7bfae78937c62717","impliedFormat":99},{"version":"8d11b30c4b66b9524db822608d279dc5e2b576d22ee21ee735a9b9a604524873","impliedFormat":99},{"version":"dac1ccee916195518aa964a933af099be396eaca9791dab44af01eb3209b9930","impliedFormat":99},{"version":"f95e4d1e6d3c5cbbbf6e216ea4742138e52402337eb3416170eabb2fdbe5c762","impliedFormat":99},{"version":"22b43e7fd932e3aa63e5bee8247d408ad1e5a29fe8008123dc6a4bd35ea49ded","impliedFormat":99},{"version":"aeea49091e71d123a471642c74a5dc4d8703476fd6254002d27c75728aa13691","impliedFormat":99},{"version":"0d4db4b482d5dec495943683ba3b6bb4026747a351c614fafdbaf54c00c5adab","impliedFormat":99},{"version":"45ac0268333f7bf8098595cda739764c429cd5d182ae4a127b3ca33405f81431","impliedFormat":99},{"version":"253c3549b055ad942ee115bef4c586c0c56e6b11aeb6353f171c7f0ffec8df07","impliedFormat":99},{"version":"0f1791a8891729f010e49f29b921b05afd45e5ba8430663c8ece4edeee748b1b","impliedFormat":99},{"version":"dfa585104fc407014e2a9ceafb748a50284fb282a561e9d8eb08562e64b1cb24","impliedFormat":99},{"version":"51130d85941585df457441c29e8f157ddc01e4978573a02a806a04c687b6748a","impliedFormat":99},{"version":"40f0d41f453dc614b2a3c552e7aca5ce723bb84d6e6bca8a6dcad1dca4cd9449","impliedFormat":99},{"version":"404627849c9714a78663bd299480dd94e75e457f5322caf0c7e169e5adab0a18","impliedFormat":99},{"version":"208306f454635e47d72092763c801f0ffcb7e6cba662d553eee945bd50987bb1","impliedFormat":99},{"version":"8b5a27971e8ede37415e42f24aae6fd227c2a1d2a93d6b8c7791a13abcde0f0b","impliedFormat":99},{"version":"1c106d58790bab5e144b35eeb31186f2be215d651e4000586fc021140cd324b9","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"c140653685b9af4f01e4283dd9d759126cb15f1c41721270c0bdbb55fd72673f","impliedFormat":99},{"version":"5844202ecdcea1f8612a826905623d93add56c9c1988df6471dff9999d92c0a7","impliedFormat":99},{"version":"b268ce0a7f489c27d8bf748c2563fd81092ead98e4c30f673670297250b774bd","impliedFormat":99},{"version":"9b0ca5de920ec607eecea5b40402fca8e705dfb3ff5e72cc91e2ac6d8f390985","impliedFormat":99},{"version":"efad5849e64223db373bbabc5eb6b2566d16e3bd34c0fd29ccf8bbe8a8a655e7","impliedFormat":99},{"version":"4c1c9ab197c2596bace50281bacf3ce3276f22aaef1c8398af0137779b577f24","impliedFormat":99},{"version":"a1acd535289b4cca0466376c1af5a99d887c91483792346be3b0b58d5f72eead","impliedFormat":99},{"version":"cdb6a1ed879f191ad45615cb4b7e7935237de0cfb8d410c7eb1fd9707d9c17ac","impliedFormat":99},{"version":"ca1debd87d50ade2eba2d0594eb47ab98e050a9fa08f879c750d80863dd3ce4c","impliedFormat":99},{"version":"dc01a3cc4787313606d58b1c6f3a4c5bf0d3fe4e3789dfdcde28d59bfd9b7c59","impliedFormat":99},{"version":"73ab9b053ad2a5ddee2f4c9b8cd36a436974dd5fa5a7c74940dd6b92e4d8e02d","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"fbf43977fd4aead581f1ef81146a4ff6fafe6bec7fac2b4cbd5a00577ab0c1c7","impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"961cf7535b9c521cd634055b1b6ac49b94d055f0b573ce7fdc4cfaddab080b7c","impliedFormat":1},{"version":"806a8c6daae69e5695e7200d9eca6bc1e4298f38d90edda3ce67a794da31a24f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"5e0c66763bda6ad4efe2ff62b2ca3a8af0b8d5b58a09429bbf9e433706c32f49","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"cd9189eacf0f9143b8830e9d6769335aa6d902c04195f04145bcbf19e7f26fcb","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"c2a6a737189ced24ffe0634e9239b087e4c26378d0490f95141b9b9b042b746c","impliedFormat":1},{"version":"c189c903a1eb9620083188f005016fafef46ec9f65a6c93b356122251e7c83a8","signature":"a66b08d5957056956a73d0da1f1a25d94a8deee8fc0dda21b2426949651918d3"},{"version":"aa33f2f6c925e57e552e0fe8874fb6a6decbb4b2bd34e2beaac825b17e6cac2d","signature":"82908493d1cb77532ce657dc02cbac73e795d0dc2ea22b7c1063f74ba1630ecb"},{"version":"67e9411bdf74f85a76ca326bc39e440c5ad9ee328cd2740cc541dc826d123cde","signature":"8ea24a9df910b0945e88a92aee6869013873801fe5d885594c7b5cff33263d4b"},{"version":"465f1ca1f11e6a1b01b043a93196b7f8fc09c985b8e3084804d9a3938aad588d","impliedFormat":1},{"version":"00b72e597dcd6ff7bf772918c78c41dc7c68e239af658cf452bff645ebdc485d","impliedFormat":1},{"version":"17b183b69a3dd3cca2505cee7ff70501c574343ad49a385c9acb5b5299e1ba73","impliedFormat":1},{"version":"b26d3fa6859459f64c93e0c154bfc7a8b216b4cf1e241ca6b67e67ee8248626b","impliedFormat":1},{"version":"91cab3f4d6ab131c74ea8772a8c182bdb9c52500fb0388ef9fd2828c084b8087","impliedFormat":1},{"version":"13b8acfead5a8519fad35e43f58c62b946a24f2a1311254250b840b15b2051cd","impliedFormat":99},{"version":"a239d8967339d47496c56564629b37f021d2c76516d30660ede4167a1000b378","signature":"eff01d2bd4cee37bf7a0690ab7d9d17b258ce2b6570e2dd5276214e939760d6b"}],"root":[[286,288],295],"options":{"esModuleInterop":true,"module":1,"skipLibCheck":true,"strict":true,"target":7},"referencedMap":[[130,1],[143,2],[142,3],[141,1],[140,4],[129,5],[128,6],[158,7],[162,8],[159,9],[160,10],[161,11],[157,12],[113,13],[114,13],[115,13],[116,13],[125,14],[99,13],[144,15],[124,16],[117,13],[118,13],[119,13],[100,17],[156,13],[120,13],[121,18],[122,19],[123,18],[101,20],[154,21],[155,22],[152,23],[150,24],[148,25],[147,26],[151,27],[153,28],[146,28],[149,28],[145,29],[127,30],[111,31],[112,31],[110,32],[108,33],[109,32],[106,34],[126,35],[107,36],[139,37],[137,38],[138,39],[136,40],[131,41],[135,42],[133,43],[132,13],[134,44],[98,13],[88,13],[89,13],[97,13],[54,45],[58,45],[55,13],[59,46],[56,13],[57,47],[105,48],[104,49],[102,36],[103,50],[60,51],[76,52],[84,53],[82,3],[78,54],[81,55],[80,3],[79,56],[83,54],[77,3],[75,57],[65,3],[68,58],[67,59],[66,13],[73,60],[64,59],[61,59],[72,59],[69,61],[71,13],[70,13],[74,59],[63,62],[96,63],[90,64],[91,65],[87,66],[86,66],[93,65],[92,65],[95,64],[94,64],[85,67],[285,68],[225,69],[226,69],[227,70],[165,71],[228,72],[229,73],[230,74],[163,13],[231,75],[232,76],[233,77],[234,78],[235,79],[236,80],[237,80],[238,81],[239,82],[240,83],[241,84],[166,13],[164,13],[242,85],[243,86],[244,87],[284,88],[245,89],[246,90],[247,89],[248,91],[249,92],[250,93],[251,94],[252,94],[253,94],[254,95],[255,96],[256,97],[257,98],[258,99],[259,100],[260,100],[261,101],[262,13],[263,13],[264,102],[265,103],[266,102],[267,104],[268,105],[269,106],[270,107],[271,108],[272,109],[273,110],[274,111],[275,112],[276,113],[277,114],[278,115],[279,116],[280,117],[281,118],[167,89],[168,13],[169,119],[170,120],[171,13],[172,121],[173,13],[216,122],[217,123],[218,124],[219,124],[220,125],[221,13],[222,72],[223,126],[224,123],[282,127],[283,128],[293,129],[294,130],[289,13],[290,13],[292,131],[291,132],[174,13],[62,13],[51,13],[52,13],[10,13],[8,13],[9,13],[14,13],[13,13],[2,13],[15,13],[16,13],[17,13],[18,13],[19,13],[20,13],[21,13],[22,13],[3,13],[23,13],[24,13],[4,13],[25,13],[29,13],[26,13],[27,13],[28,13],[30,13],[31,13],[32,13],[5,13],[33,13],[34,13],[35,13],[36,13],[6,13],[40,13],[37,13],[38,13],[39,13],[41,13],[7,13],[42,13],[53,13],[47,13],[48,13],[43,13],[44,13],[45,13],[46,13],[1,13],[49,13],[50,13],[12,13],[11,13],[192,133],[204,134],[190,135],[205,136],[214,137],[181,138],[182,139],[180,140],[213,68],[208,141],[212,142],[184,143],[201,144],[183,145],[211,146],[178,147],[179,141],[185,148],[186,13],[191,149],[189,148],[176,150],[215,151],[206,152],[195,153],[194,148],[196,154],[199,155],[193,156],[197,157],[209,68],[187,158],[188,159],[200,160],[177,136],[203,161],[202,148],[198,162],[207,13],[175,13],[210,163],[288,164],[287,13],[286,13],[295,165]],"affectedFilesPendingEmit":[288,287,286,295],"version":"5.9.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2020.full.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/better-sqlite3/index.d.ts","./node_modules/@endo/eventual-send/src/E.d.ts","./node_modules/@endo/eventual-send/src/handled-promise.d.ts","./node_modules/@endo/eventual-send/src/track-turns.d.ts","./node_modules/@endo/eventual-send/src/types.d.ts","./node_modules/@endo/eventual-send/src/exports.d.ts","./node_modules/@endo/eventual-send/src/no-shim.d.ts","./node_modules/@endo/far/src/exports.d.ts","./node_modules/@endo/pass-style/src/passStyle-helpers.d.ts","./node_modules/ses/types.d.ts","./node_modules/@endo/pass-style/src/types.d.ts","./node_modules/@endo/pass-style/src/makeTagged.d.ts","./node_modules/@endo/pass-style/src/deeplyFulfilled.d.ts","./node_modules/@endo/pass-style/src/iter-helpers.d.ts","./node_modules/@endo/pass-style/src/internal-types.d.ts","./node_modules/@endo/pass-style/src/error.d.ts","./node_modules/@endo/pass-style/src/remotable.d.ts","./node_modules/@endo/pass-style/src/symbol.d.ts","./node_modules/@endo/pass-style/src/string.d.ts","./node_modules/@endo/pass-style/src/passStyleOf.d.ts","./node_modules/@endo/pass-style/src/make-far.d.ts","./node_modules/@endo/pass-style/src/typeGuards.d.ts","./node_modules/@endo/pass-style/index.d.ts","./node_modules/@endo/far/src/index.d.ts","./node_modules/@endo/marshal/src/types.d.ts","./node_modules/@endo/marshal/src/encodeToCapData.d.ts","./node_modules/@endo/marshal/src/marshal.d.ts","./node_modules/@endo/marshal/src/marshal-stringify.d.ts","./node_modules/@endo/marshal/src/marshal-justin.d.ts","./node_modules/@endo/marshal/src/encodePassable.d.ts","./node_modules/@endo/marshal/src/rankOrder.d.ts","./node_modules/@endo/marshal/index.d.ts","./node_modules/@endo/patterns/src/types.d.ts","./node_modules/@endo/patterns/src/keys/copySet.d.ts","./node_modules/@endo/patterns/src/keys/copyBag.d.ts","./node_modules/@endo/common/list-difference.d.ts","./node_modules/@endo/common/object-map.d.ts","./node_modules/@endo/patterns/src/keys/checkKey.d.ts","./node_modules/@endo/patterns/src/keys/compareKeys.d.ts","./node_modules/@endo/patterns/src/keys/merge-set-operators.d.ts","./node_modules/@endo/patterns/src/keys/merge-bag-operators.d.ts","./node_modules/@endo/patterns/src/patterns/patternMatchers.d.ts","./node_modules/@endo/patterns/src/patterns/getGuardPayloads.d.ts","./node_modules/@endo/patterns/index.d.ts","./node_modules/@endo/common/object-meta-map.d.ts","./node_modules/@endo/common/from-unique-entries.d.ts","./node_modules/@agoric/internal/src/js-utils.d.ts","./node_modules/@agoric/internal/src/ses-utils.d.ts","./node_modules/@agoric/internal/src/types.ts","./node_modules/@endo/exo/src/get-interface.d.ts","./node_modules/@endo/exo/src/types.d.ts","./node_modules/@endo/exo/src/exo-makers.d.ts","./node_modules/@endo/exo/index.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakSetStore.d.ts","./node_modules/@agoric/store/src/types.d.ts","./node_modules/@agoric/store/src/stores/scalarSetStore.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakMapStore.d.ts","./node_modules/@agoric/store/src/stores/scalarMapStore.d.ts","./node_modules/@agoric/store/src/legacy/legacyMap.d.ts","./node_modules/@agoric/store/src/legacy/legacyWeakMap.d.ts","./node_modules/@agoric/internal/src/cli-utils.d.ts","./node_modules/@agoric/internal/src/config.d.ts","./node_modules/@agoric/internal/src/debug.d.ts","./node_modules/@agoric/internal/src/errors.d.ts","./node_modules/@agoric/internal/src/method-tools.d.ts","./node_modules/@agoric/internal/src/metrics.d.ts","./node_modules/@agoric/internal/src/natural-sort.d.ts","./node_modules/@agoric/internal/src/tmpDir.d.ts","./node_modules/@agoric/internal/src/typeCheck.d.ts","./node_modules/@agoric/internal/src/typeGuards.d.ts","./node_modules/@agoric/internal/src/types-index.d.ts","./node_modules/@agoric/internal/src/marshal.d.ts","./node_modules/@agoric/internal/src/index.d.ts","./node_modules/@agoric/store/src/stores/store-utils.d.ts","./node_modules/@agoric/store/src/index.d.ts","./node_modules/@agoric/base-zone/src/watch-promise.d.ts","./node_modules/@agoric/base-zone/src/types.d.ts","./node_modules/@agoric/base-zone/src/exports.d.ts","./node_modules/@agoric/swingset-liveslots/src/types.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualReferences.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualObjectManager.d.ts","./node_modules/@agoric/swingset-liveslots/src/watchedPromises.d.ts","./node_modules/@agoric/swingset-liveslots/src/vatDataTypes.ts","./node_modules/@agoric/swingset-liveslots/src/types-index.d.ts","./node_modules/@agoric/swingset-liveslots/src/liveslots.d.ts","./node_modules/@agoric/swingset-liveslots/src/message.d.ts","./node_modules/@agoric/swingset-liveslots/src/index.d.ts","./node_modules/@agoric/base-zone/src/make-once.d.ts","./node_modules/@agoric/base-zone/src/keys.d.ts","./node_modules/@agoric/base-zone/src/is-passable.d.ts","./node_modules/@agoric/base-zone/src/index.d.ts","./node_modules/@agoric/internal/src/lib-chainStorage.d.ts","./node_modules/@agoric/notifier/src/types.ts","./node_modules/@agoric/notifier/src/topic.d.ts","./node_modules/@agoric/notifier/src/storesub.d.ts","./node_modules/@agoric/notifier/src/stored-notifier.d.ts","./node_modules/@agoric/notifier/src/types-index.d.ts","./node_modules/@agoric/notifier/src/publish-kit.d.ts","./node_modules/@agoric/notifier/src/subscribe.d.ts","./node_modules/@agoric/notifier/src/notifier.d.ts","./node_modules/@agoric/notifier/src/subscriber.d.ts","./node_modules/@agoric/notifier/src/asyncIterableAdaptor.d.ts","./node_modules/@agoric/notifier/src/index.d.ts","./node_modules/@agoric/internal/src/tagged.d.ts","./node_modules/@agoric/ertp/src/types.ts","./node_modules/@agoric/ertp/src/amountMath.d.ts","./node_modules/@agoric/ertp/src/issuerKit.d.ts","./node_modules/@agoric/ertp/src/typeGuards.d.ts","./node_modules/@agoric/ertp/src/types-index.d.ts","./node_modules/@agoric/ertp/src/index.d.ts","./src/guids.ts","./src/types.ts","./src/db-helpers.ts","./src/sql/gc_empty.ts","./src/jessie-tools.ts","./src/purse.ts","./src/index.ts","./node_modules/ava/types/assertions.d.cts","./node_modules/ava/types/subscribable.d.cts","./node_modules/ava/types/try-fn.d.cts","./node_modules/ava/types/test-fn.d.cts","./node_modules/ava/entrypoints/main.d.cts","./node_modules/ava/index.d.ts","./test/ledgerguise.test.ts"],"fileIdsList":[[56,119,127,131,134,136,137,138,150,252],[56,119,127,131,134,136,137,138,150,251,253,263,264,265],[56,119,127,131,134,136,137,138,150,198],[56,119,127,131,134,136,137,138,150,252,262],[56,119,127,131,134,136,137,138,150,228,250,251],[56,119,127,131,134,136,137,138,150,219],[56,119,127,131,134,136,137,138,150,219,280],[56,119,127,131,134,136,137,138,150,281,282,283,284],[56,119,127,131,134,136,137,138,150,219,248,280,281],[56,119,127,131,134,136,137,138,150,219,248,280],[56,119,127,131,134,136,137,138,150,280],[56,119,127,131,134,136,137,138,150,198,199,219,278,279,281],[56,119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,222,223,236,237,238,239,240,241,242,243,244,245,246,247],[56,119,127,131,134,136,137,138,150,199,207,224,228,266],[56,119,127,131,134,136,137,138,150,207,224],[56,119,127,131,134,136,137,138,150,199,212,220,221,222,224],[56,119,127,131,134,136,137,138,150,224],[56,119,127,131,134,136,137,138,150,219,224],[56,119,127,131,134,136,137,138,150,182,198,219,223],[56,119,127,131,134,136,137,138,150,182,198,199,268,272],[56,119,127,131,134,136,137,138,150,269,270,271,272,273,274,275,276,277],[56,119,127,131,134,136,137,138,150,248,268],[56,119,127,131,134,136,137,138,150,219,262,268],[56,119,127,131,134,136,137,138,150,198,199,267,268],[56,119,127,131,134,136,137,138,150,199,207,267,268],[56,119,127,131,134,136,137,138,150,182,198,199,268],[56,119,127,131,134,136,137,138,150,268],[56,119,127,131,134,136,137,138,150,207,267],[56,119,127,131,134,136,137,138,150,219,228,229,230,231,232,233,234,235,248,249],[56,119,127,131,134,136,137,138,150,230],[56,119,127,131,134,136,137,138,150,198,219,230],[56,119,127,131,134,136,137,138,150,219,230],[56,119,127,131,134,136,137,138,150,219,250],[56,119,127,131,134,136,137,138,150,198,207,219,230],[56,119,127,131,134,136,137,138,150,198,219],[56,119,127,131,134,136,137,138,150,259,260,261],[56,119,127,131,134,136,137,138,150,222,254],[56,119,127,131,134,136,137,138,150,254],[56,119,127,131,134,136,137,138,150,254,258],[56,119,127,131,134,136,137,138,150,207],[56,119,127,131,134,136,137,138,150,182,198,219,228,250,257],[56,119,127,131,134,136,137,138,150,207,254,255,262],[56,119,127,131,134,136,137,138,150,207,254,255,256,258],[56,119,127,131,134,136,137,138,150,180],[56,119,127,131,134,136,137,138,150,177,178,181],[56,119,127,131,134,136,137,138,150,177,178,179],[56,119,127,131,134,136,137,138,150,225,226,227],[56,119,127,131,134,136,137,138,150,219,226],[56,119,127,131,134,136,137,138,150,182,198,219,225],[56,119,127,131,134,136,137,138,150,182],[56,119,127,131,134,136,137,138,150,182,183,198],[56,119,127,131,134,136,137,138,150,198,200,201,202,203,204,205,206],[56,119,127,131,134,136,137,138,150,198,200],[56,119,127,131,134,136,137,138,150,185,198,200],[56,119,127,131,134,136,137,138,150,200],[56,119,127,131,134,136,137,138,150,184,186,187,188,189,191,192,193,194,195,196,197],[56,119,127,131,134,136,137,138,150,185,186,190],[56,119,127,131,134,136,137,138,150,186],[56,119,127,131,134,136,137,138,150,182,186],[56,119,127,131,134,136,137,138,150,186,190],[56,119,127,131,134,136,137,138,150,184,185],[56,119,127,131,134,136,137,138,150,208,209,210,211,212,213,214,215,216,217,218],[56,119,127,131,134,136,137,138,150,198,208],[56,119,127,131,134,136,137,138,150,208],[56,119,127,131,134,136,137,138,150,198,207,208],[56,119,127,131,134,136,137,138,150,198,207],[56,119,127,131,134,136,137,138,150,175],[56,116,117,119,127,131,134,136,137,138,150],[56,118,119,127,131,134,136,137,138,150],[119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,158],[56,119,120,125,127,130,131,134,136,137,138,140,150,155,167],[56,119,120,121,127,130,131,134,136,137,138,150],[56,119,122,127,131,134,136,137,138,150,168],[56,119,123,124,127,131,134,136,137,138,141,150],[56,119,124,127,131,134,136,137,138,150,155,164],[56,119,125,127,130,131,134,136,137,138,140,150],[56,118,119,126,127,131,134,136,137,138,150],[56,119,127,128,131,134,136,137,138,150],[56,119,127,129,130,131,134,136,137,138,150],[56,118,119,127,130,131,134,136,137,138,150],[56,119,127,130,131,132,134,136,137,138,150,155,167],[56,119,127,130,131,132,134,136,137,138,150,155,158],[56,106,119,127,130,131,133,134,136,137,138,140,150,155,167],[56,119,127,130,131,133,134,136,137,138,140,150,155,164,167],[56,119,127,131,133,134,135,136,137,138,150,155,164,167],[54,55,56,57,58,59,60,61,62,63,64,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174],[56,119,127,130,131,134,136,137,138,150],[56,119,127,131,134,136,138,150],[56,119,127,131,134,136,137,138,139,150,167],[56,119,127,130,131,134,136,137,138,140,150,155],[56,119,127,131,134,136,137,138,141,150],[56,119,127,131,134,136,137,138,142,150],[56,119,127,130,131,134,136,137,138,145,150],[56,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174],[56,119,127,131,134,136,137,138,147,150],[56,119,127,131,134,136,137,138,148,150],[56,119,124,127,131,134,136,137,138,140,150,158],[56,119,127,130,131,134,136,137,138,150,151],[56,119,127,131,134,136,137,138,150,152,168,171],[56,119,127,130,131,134,136,137,138,150,155,157,158],[56,119,127,131,134,136,137,138,150,156,158],[56,119,127,131,134,136,137,138,150,158,168],[56,119,127,131,134,136,137,138,150,159],[56,116,119,127,131,134,136,137,138,150,155,161],[56,119,127,131,134,136,137,138,150,155,160],[56,119,127,130,131,134,136,137,138,150,162,163],[56,119,127,131,134,136,137,138,150,162,163],[56,119,124,127,131,134,136,137,138,140,150,155,164],[56,119,127,131,134,136,137,138,150,165],[56,119,127,131,134,136,137,138,140,150,166],[56,119,127,131,133,134,136,137,138,148,150,167],[56,119,127,131,134,136,137,138,150,168,169],[56,119,124,127,131,134,136,137,138,150,169],[56,119,127,131,134,136,137,138,150,155,170],[56,119,127,131,134,136,137,138,139,150,171],[56,119,127,131,134,136,137,138,150,172],[56,119,122,127,131,134,136,137,138,150],[56,119,124,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,168],[56,106,119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,150,173],[56,119,127,131,134,136,137,138,145,150],[56,119,127,131,134,136,137,138,150,163],[56,106,119,127,130,131,132,134,136,137,138,145,150,155,158,167,170,171,173],[56,119,127,131,134,136,137,138,150,155,174],[56,119,127,131,134,136,137,138,150,293,294,295,296],[56,119,127,131,134,136,137,138,150,297],[56,119,127,131,134,136,137,138,150,293,294,295],[56,119,127,131,134,136,137,138,150,296],[56,72,75,78,79,119,127,131,134,136,137,138,150,167],[56,75,119,127,131,134,136,137,138,150,155,167],[56,75,79,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,150,155],[56,69,119,127,131,134,136,137,138,150],[56,73,119,127,131,134,136,137,138,150],[56,71,72,75,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,140,150,164],[56,69,119,127,131,134,136,137,138,150,175],[56,71,75,119,127,131,134,136,137,138,140,150,167],[56,66,67,68,70,74,119,127,130,131,134,136,137,138,150,155,167],[56,75,83,91,119,127,131,134,136,137,138,150],[56,67,73,119,127,131,134,136,137,138,150],[56,75,100,101,119,127,131,134,136,137,138,150],[56,67,70,75,119,127,131,134,136,137,138,150,158,167,175],[56,75,119,127,131,134,136,137,138,150],[56,71,75,119,127,131,134,136,137,138,150,167],[56,66,119,127,131,134,136,137,138,150],[56,69,70,71,73,74,75,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,119,127,131,134,136,137,138,150],[56,75,93,96,119,127,131,134,136,137,138,150],[56,75,83,84,85,119,127,131,134,136,137,138,150],[56,73,75,84,86,119,127,131,134,136,137,138,150],[56,74,119,127,131,134,136,137,138,150],[56,67,69,75,119,127,131,134,136,137,138,150],[56,75,79,84,86,119,127,131,134,136,137,138,150],[56,79,119,127,131,134,136,137,138,150],[56,73,75,78,119,127,131,134,136,137,138,150,167],[56,67,71,75,83,119,127,131,134,136,137,138,150],[56,75,93,119,127,131,134,136,137,138,150],[56,86,119,127,131,134,136,137,138,150],[56,69,75,100,119,127,131,134,136,137,138,150,158,173,175],[56,119,127,131,134,136,137,138,150,176,287],[56,119,127,131,134,136,137,138,150,176,285,286,287,288,289,290,291],[56,119,127,131,134,136,137,138,150,176,287,288,290],[56,119,127,131,134,136,137,138,150,176,285,286],[56,119,127,131,134,136,137,138,150,176,285,292,298]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"961cf7535b9c521cd634055b1b6ac49b94d055f0b573ce7fdc4cfaddab080b7c","impliedFormat":1},{"version":"806a8c6daae69e5695e7200d9eca6bc1e4298f38d90edda3ce67a794da31a24f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"5e0c66763bda6ad4efe2ff62b2ca3a8af0b8d5b58a09429bbf9e433706c32f49","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"cd9189eacf0f9143b8830e9d6769335aa6d902c04195f04145bcbf19e7f26fcb","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"c2a6a737189ced24ffe0634e9239b087e4c26378d0490f95141b9b9b042b746c","impliedFormat":1},{"version":"2cd4b702eb44058636981ad2a53ab0152417c8f36b224e459aa5404d5786166e","impliedFormat":99},{"version":"64a95727716d7a159ff916085eb5df4dd67f1ff9c6f7e35ce2aff8a4ed4e6d31","impliedFormat":99},{"version":"93340c70128cbf56acb9eba0146f9cae83b5ef8f4b02f380fff0b77a6b7cf113","impliedFormat":99},{"version":"eb10902fb118057f367f63a703af037ea92a1f8e6161b9b128c29d934539d9a5","impliedFormat":99},{"version":"6b9c704b9febb76cdf74f8f1e3ac199c5b4708e5be2afe257320411ec2c8a3a1","affectsGlobalScope":true,"impliedFormat":99},{"version":"614fa8a4693c632333c354af80562633c8aaf0d552e7ed90f191a6ace24abe9d","impliedFormat":99},{"version":"d221c15d4aae13d314072f859de2ccec2c600a3addc9f2b71b397c83a157e71f","impliedFormat":99},{"version":"dc8a5014726788b50b968d67404dbc7713009040720a04b39c784b43dd8fdacb","impliedFormat":99},{"version":"ea5d08724831aab137fab28195dadf65667aec35acc0f2a5e517271d8c3082d3","affectsGlobalScope":true,"impliedFormat":99},{"version":"009b62c055096dfb3291f2667b8f0984ce480abef01c646e9675868fcec5ac60","impliedFormat":99},{"version":"d86a646352434aa51e337e64e234eab2d28af156bb5931d25c789d0c5dfbcd08","impliedFormat":99},{"version":"d15ab66050babcbb3858c785c437230bd984943b9b2080cd16fe1f0007b4802b","impliedFormat":99},{"version":"d5dc3c765037bfc7bd118be91ad280801f8c01fe41e8b7c8c1d8b96f6a0dc489","impliedFormat":99},{"version":"c6af1103d816d17451bc1a18cb9889fc9a282966383b695927d3ead99d958da0","impliedFormat":99},{"version":"d34287eb61f4689723448d33f50a047769dadee66ec8cb8609b41b17a5b3df40","impliedFormat":99},{"version":"22f52ade1934d26b5db4d5558be99097a82417c0247958527336535930d5a288","impliedFormat":99},{"version":"717d656e46e34696d072f2cee99ca045e69350f3c5ede3193337f884ccbc2a3b","impliedFormat":99},{"version":"b5a53985100fa348fcfb06bad4ee86367168e018998cbf95394a01b2dac92bb7","impliedFormat":99},{"version":"cadea2f7c33f255e142da3b0fefee54fa3985a12471cf9c5c51a221b3844f976","impliedFormat":99},{"version":"46f09e6b30f4301674d1c685934bd4ad2b594085d2545d6f063c175b1dcfd5af","impliedFormat":99},{"version":"25cd3d5fecfed6af5903170b67e8b3531591633e14c5b6735aac0d49e93d7cf0","impliedFormat":99},{"version":"f9fdd230ece877f4bcd8d35240426bcb1482f44faf813e6a336c2cc1b034e58d","impliedFormat":99},{"version":"bcbe66e540446c7fb8b34afe764dae60b28ef929cafe26402594f41a377fac41","impliedFormat":99},{"version":"428ef8df7e77bd4731faa19ef7430823f42bc95abd99368351411541ee08d2f7","impliedFormat":99},{"version":"a8a953cb8cf0b05c91086bd15a383afdfbddbf0cda5ed67d2c55542a5064b69d","impliedFormat":99},{"version":"f5a00483d6aa997ffedb1e802df7c7dcd048e43deab8f75c2c754f4ee3f97b41","impliedFormat":99},{"version":"14da43cd38f32c3b6349d1667937579820f1a3ddb40f3187caa727d4d451dcd4","impliedFormat":99},{"version":"2b77e2bc5350c160c53c767c8e6325ee61da47eda437c1d3156e16df94a64257","impliedFormat":99},{"version":"b0c5a13c0ec9074cdd2f8ed15e6734ba49231eb773330b221083e79e558badb4","impliedFormat":99},{"version":"a2d30f97dcc401dad445fb4f0667a167d1b9c0fdb1132001cc37d379e8946e3c","impliedFormat":99},{"version":"81c859cff06ee38d6f6b8015faa04722b535bb644ea386919d570e0e1f052430","impliedFormat":99},{"version":"05e938c1bc8cc5d2f3b9bb87dc09da7ab8e8e8436f17af7f1672f9b42ab5307d","impliedFormat":99},{"version":"061020cd9bc920fc08a8817160c5cb97b8c852c5961509ed15aab0c5a4faddb3","impliedFormat":99},{"version":"e33bbc0d740e4db63b20fa80933eb78cd305258ebb02b2c21b7932c8df118d3b","impliedFormat":99},{"version":"6795c049a6aaaaeb25ae95e0b9a4c75c8a325bd2b3b40aee7e8f5225533334d4","impliedFormat":99},{"version":"e6081f90b9dc3ff16bcc3fdab32aa361800dc749acc78097870228d8f8fd9920","impliedFormat":99},{"version":"6274539c679f0c9bcd2dbf9e85c5116db6acf91b3b9e1084ce8a17db56a0259a","impliedFormat":99},{"version":"f472753504df7760ad34eafa357007e90c59040e6f6882aae751de7b134b8713","impliedFormat":99},{"version":"dba70304db331da707d5c771e492b9c1db7545eb29a949050a65d0d4fa4a000d","impliedFormat":99},{"version":"a520f33e8a5a92d3847223b2ae2d8244cdb7a6d3d8dfdcc756c5650a38fc30f4","impliedFormat":99},{"version":"76aec992df433e1e56b9899183b4cf8f8216e00e098659dbfbc4d0cbf9054725","impliedFormat":99},{"version":"28fbf5d3fdff7c1dad9e3fd71d4e60077f14134b06253cb62e0eb3ba46f628e3","impliedFormat":99},{"version":"c5340ac3565038735dbf82f6f151a75e8b95b9b1d5664b4fddf0168e4dd9c2f3","impliedFormat":99},{"version":"9481179c799a61aa282d5d48b22421d4d9f592c892f2c6ae2cda7b78595a173e","impliedFormat":99},{"version":"00de25621f1acd5ed68e04bb717a418150779459c0df27843e5a3145ab6aa13d","impliedFormat":99},{"version":"3b0a6f0e693745a8f6fd35bafb8d69f334f3c782a91c8f3344733e2e55ba740d","impliedFormat":99},{"version":"83576f4e2a788f59c217da41b5b7eb67912a400a5ff20aa0622a5c902d23eb75","impliedFormat":99},{"version":"039ee0312b31c74b8fcf0d55b24ef9350b17da57572648580acd70d2e79c0d84","impliedFormat":99},{"version":"6a437bd627ddcb418741f1a279a9db2828cc63c24b4f8586b0473e04f314bee5","impliedFormat":99},{"version":"bb1a27e42875da4a6ff036a9bbe8fca33f88225d9ee5f3c18619bfeabc37c4f4","impliedFormat":99},{"version":"56e07c29328f54e68cf4f6a81bc657ae6b2bbd31c2f53a00f4f0a902fa095ea1","impliedFormat":99},{"version":"ce29026a1ee122328dc9f1b40bff4cf424643fddf8dc6c046f4c71bf97ecf5b5","impliedFormat":99},{"version":"386a071f8e7ca44b094aba364286b65e6daceba25347afb3b7d316a109800393","impliedFormat":99},{"version":"6ba3f7fc791e73109b8c59ae17b1e013ab269629a973e78812e0143e4eab48b2","impliedFormat":99},{"version":"042dbb277282e4cb651b7a5cde8a07c01a7286d41f585808afa98c2c5adae7e0","impliedFormat":99},{"version":"0952d2faef01544f6061dd15d81ae53bfb9d3789b9def817f0019731e139bda8","impliedFormat":99},{"version":"8ec4b0ca2590204f6ef4a26d77c5c8b0bba222a5cd80b2cb3aa3016e3867f9ce","impliedFormat":99},{"version":"15d389a1ee1f700a49260e38736c8757339e5d5e06ca1409634242c1a7b0602e","impliedFormat":99},{"version":"f868b2a12bbe4356e2fd57057ba0619d88f1496d2b884a4f22d8bab3e253dbf5","impliedFormat":99},{"version":"a474bc8c71919a09c0d27ad0cba92e5e3e754dc957bec9c269728c9a4a4cf754","impliedFormat":99},{"version":"e732c6a46c6624dbbd56d3f164d6afdfe2b6007c6709bb64189ce057d03d30fd","impliedFormat":99},{"version":"5c425f77a2867b5d7026875328f13736e3478b0cc6c092787ac3a8dcc8ff0d42","impliedFormat":99},{"version":"b6d1738ae0dd427debbb3605ba03c30ceb76d4cefc7bd5f437004f6f4c622e38","impliedFormat":99},{"version":"6629357b7dd05ee4367a71962a234d508fa0fb99fbbad83fdbf3e64aa6e77104","impliedFormat":99},{"version":"5f8b299ecc1852b7b6eb9682a05f2dbfaae087e3363ecfbb9430350be32a97dc","impliedFormat":99},{"version":"6e304bbf3302fb015164bb3a7c7dfca6b3fdf57b1d56809173fed3663b42ced4","impliedFormat":99},{"version":"cd6aab42fef5395a16795cf23bbc9645dc9786af2c08dac3d61234948f72c67d","impliedFormat":99},{"version":"fe1f9b28ceb4ff76facbe0c363888d33d8265a0beb6fb5532a6e7a291490c795","impliedFormat":99},{"version":"b1d6ee25d690d99f44fd9c1c831bcdb9c0354f23dab49e14cdcfe5d0212bcba0","impliedFormat":99},{"version":"488958cf5865bce05ac5343cf1607ad7af72486a351c3afc7756fdd9fdafa233","impliedFormat":99},{"version":"424a44fb75e76db02794cf0e26c61510daf8bf4d4b43ebbeb6adc70be1dd68b4","impliedFormat":99},{"version":"519f0d3b64727722e5b188c679c1f741997be640fdcd30435a2c7ba006667d6e","impliedFormat":99},{"version":"49324b7e03d2c9081d66aef8b0a8129f0244ecac4fb11378520c9816d693ce7a","impliedFormat":99},{"version":"bbe31d874c9a2ac21ea0c5cee6ded26697f30961dca6f18470145b1c8cd66b21","impliedFormat":99},{"version":"38a5641908bc748e9829ab1d6147239a3797918fab932f0aa81543d409732990","impliedFormat":99},{"version":"125da449b5464b2873f7642e57452ac045a0219f0cb6a5d3391a15cc4336c471","impliedFormat":99},{"version":"d1cacc1ae76a3698129f4289657a18de22057bb6c00e7bf36aa2e9c5365eec66","impliedFormat":99},{"version":"0468caf7769824cd6ddd202c5f37c574bcc3f5c158ef401b71ca3ece8de5462f","impliedFormat":99},{"version":"966a181ee1c0cecd2aaa9cf8281f3b8036d159db7963788a7bfae78937c62717","impliedFormat":99},{"version":"8d11b30c4b66b9524db822608d279dc5e2b576d22ee21ee735a9b9a604524873","impliedFormat":99},{"version":"dac1ccee916195518aa964a933af099be396eaca9791dab44af01eb3209b9930","impliedFormat":99},{"version":"f95e4d1e6d3c5cbbbf6e216ea4742138e52402337eb3416170eabb2fdbe5c762","impliedFormat":99},{"version":"22b43e7fd932e3aa63e5bee8247d408ad1e5a29fe8008123dc6a4bd35ea49ded","impliedFormat":99},{"version":"aeea49091e71d123a471642c74a5dc4d8703476fd6254002d27c75728aa13691","impliedFormat":99},{"version":"0d4db4b482d5dec495943683ba3b6bb4026747a351c614fafdbaf54c00c5adab","impliedFormat":99},{"version":"45ac0268333f7bf8098595cda739764c429cd5d182ae4a127b3ca33405f81431","impliedFormat":99},{"version":"253c3549b055ad942ee115bef4c586c0c56e6b11aeb6353f171c7f0ffec8df07","impliedFormat":99},{"version":"0f1791a8891729f010e49f29b921b05afd45e5ba8430663c8ece4edeee748b1b","impliedFormat":99},{"version":"dfa585104fc407014e2a9ceafb748a50284fb282a561e9d8eb08562e64b1cb24","impliedFormat":99},{"version":"51130d85941585df457441c29e8f157ddc01e4978573a02a806a04c687b6748a","impliedFormat":99},{"version":"40f0d41f453dc614b2a3c552e7aca5ce723bb84d6e6bca8a6dcad1dca4cd9449","impliedFormat":99},{"version":"404627849c9714a78663bd299480dd94e75e457f5322caf0c7e169e5adab0a18","impliedFormat":99},{"version":"208306f454635e47d72092763c801f0ffcb7e6cba662d553eee945bd50987bb1","impliedFormat":99},{"version":"8b5a27971e8ede37415e42f24aae6fd227c2a1d2a93d6b8c7791a13abcde0f0b","impliedFormat":99},{"version":"1c106d58790bab5e144b35eeb31186f2be215d651e4000586fc021140cd324b9","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"c140653685b9af4f01e4283dd9d759126cb15f1c41721270c0bdbb55fd72673f","impliedFormat":99},{"version":"5844202ecdcea1f8612a826905623d93add56c9c1988df6471dff9999d92c0a7","impliedFormat":99},{"version":"b268ce0a7f489c27d8bf748c2563fd81092ead98e4c30f673670297250b774bd","impliedFormat":99},{"version":"9b0ca5de920ec607eecea5b40402fca8e705dfb3ff5e72cc91e2ac6d8f390985","impliedFormat":99},{"version":"efad5849e64223db373bbabc5eb6b2566d16e3bd34c0fd29ccf8bbe8a8a655e7","impliedFormat":99},{"version":"4c1c9ab197c2596bace50281bacf3ce3276f22aaef1c8398af0137779b577f24","impliedFormat":99},{"version":"a1acd535289b4cca0466376c1af5a99d887c91483792346be3b0b58d5f72eead","impliedFormat":99},{"version":"cdb6a1ed879f191ad45615cb4b7e7935237de0cfb8d410c7eb1fd9707d9c17ac","impliedFormat":99},{"version":"ca1debd87d50ade2eba2d0594eb47ab98e050a9fa08f879c750d80863dd3ce4c","impliedFormat":99},{"version":"dc01a3cc4787313606d58b1c6f3a4c5bf0d3fe4e3789dfdcde28d59bfd9b7c59","impliedFormat":99},{"version":"73ab9b053ad2a5ddee2f4c9b8cd36a436974dd5fa5a7c74940dd6b92e4d8e02d","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"fbf43977fd4aead581f1ef81146a4ff6fafe6bec7fac2b4cbd5a00577ab0c1c7","impliedFormat":99},{"version":"2ae4378b3e906557e1b319ca96b23978ee517a71f830be14c99d3a8f23c961b0","signature":"999142549785919344c29d95c5beeab0df338cd9ef20c5a8e039b6d48c115c43"},{"version":"fb380a470b6457adcdf883f05888ea83f378f47a17b775851190cf2160fdfee2","signature":"a2e6dfa4b803a333e731d8a788e65f450254958209ac445a8ed160d7f80b08b1"},{"version":"fc8e720e22b8f9ba80bdcdd3b140a641dc0de4aa647715175dab6422f6992859","signature":"b5287a80d647fb84acefa319a409b6da2da1be86bfcaeaabfc2a1d10218b5565"},{"version":"c189c903a1eb9620083188f005016fafef46ec9f65a6c93b356122251e7c83a8","signature":"a66b08d5957056956a73d0da1f1a25d94a8deee8fc0dda21b2426949651918d3"},{"version":"aa33f2f6c925e57e552e0fe8874fb6a6decbb4b2bd34e2beaac825b17e6cac2d","signature":"82908493d1cb77532ce657dc02cbac73e795d0dc2ea22b7c1063f74ba1630ecb"},{"version":"73b9b29841e031dc8c816b5d1d1621c593a698a9ad0a26c207c455291ef7b207","signature":"f3715d591e74f76c70a85952c3202591fc8ade3b5387b52eb54a9a4ccab18230"},{"version":"9fb9d94e5e54c62e91404b70df8e02a8d450ec1140fd00c785f45a71fcecfacc","signature":"a18e6dc5937faa74052fdf06c72bce89458199c01fe144ec7fa05bd54f42d959"},{"version":"465f1ca1f11e6a1b01b043a93196b7f8fc09c985b8e3084804d9a3938aad588d","impliedFormat":1},{"version":"00b72e597dcd6ff7bf772918c78c41dc7c68e239af658cf452bff645ebdc485d","impliedFormat":1},{"version":"17b183b69a3dd3cca2505cee7ff70501c574343ad49a385c9acb5b5299e1ba73","impliedFormat":1},{"version":"b26d3fa6859459f64c93e0c154bfc7a8b216b4cf1e241ca6b67e67ee8248626b","impliedFormat":1},{"version":"91cab3f4d6ab131c74ea8772a8c182bdb9c52500fb0388ef9fd2828c084b8087","impliedFormat":1},{"version":"13b8acfead5a8519fad35e43f58c62b946a24f2a1311254250b840b15b2051cd","impliedFormat":99},{"version":"a239d8967339d47496c56564629b37f021d2c76516d30660ede4167a1000b378","signature":"eff01d2bd4cee37bf7a0690ab7d9d17b258ce2b6570e2dd5276214e939760d6b"}],"root":[[286,292],299],"options":{"esModuleInterop":true,"module":1,"skipLibCheck":true,"strict":true,"target":7},"referencedMap":[[253,1],[266,2],[265,3],[264,1],[263,4],[252,5],[251,6],[281,7],[285,8],[282,9],[283,10],[284,11],[280,12],[236,13],[237,13],[238,13],[239,13],[248,14],[222,13],[267,15],[247,16],[240,13],[241,13],[242,13],[223,17],[279,13],[243,13],[244,18],[245,19],[246,18],[224,20],[277,21],[278,22],[275,23],[273,24],[271,25],[270,26],[274,27],[276,28],[269,28],[272,28],[268,29],[250,30],[234,31],[235,31],[233,32],[231,33],[232,32],[229,34],[249,35],[230,36],[262,37],[260,38],[261,39],[259,40],[254,41],[258,42],[256,43],[255,13],[257,44],[221,13],[211,13],[212,13],[220,13],[177,45],[181,45],[178,13],[182,46],[179,13],[180,47],[228,48],[227,49],[225,36],[226,50],[183,51],[199,52],[207,53],[205,3],[201,54],[204,55],[203,3],[202,56],[206,54],[200,3],[198,57],[188,3],[191,58],[190,59],[189,13],[196,60],[187,59],[184,59],[195,59],[192,61],[194,13],[193,13],[197,59],[186,62],[219,63],[213,64],[214,65],[210,66],[209,66],[216,65],[215,65],[218,64],[217,64],[208,67],[176,68],[116,69],[117,69],[118,70],[56,71],[119,72],[120,73],[121,74],[54,13],[122,75],[123,76],[124,77],[125,78],[126,79],[127,80],[128,80],[129,81],[130,82],[131,83],[132,84],[57,13],[55,13],[133,85],[134,86],[135,87],[175,88],[136,89],[137,90],[138,89],[139,91],[140,92],[141,93],[142,94],[143,94],[144,94],[145,95],[146,96],[147,97],[148,98],[149,99],[150,100],[151,100],[152,101],[153,13],[154,13],[155,102],[156,103],[157,102],[158,104],[159,105],[160,106],[161,107],[162,108],[163,109],[164,110],[165,111],[166,112],[167,113],[168,114],[169,115],[170,116],[171,117],[172,118],[58,89],[59,13],[60,119],[61,120],[62,13],[63,121],[64,13],[107,122],[108,123],[109,124],[110,124],[111,125],[112,13],[113,72],[114,126],[115,123],[173,127],[174,128],[297,129],[298,130],[293,13],[294,13],[296,131],[295,132],[65,13],[185,13],[51,13],[52,13],[10,13],[8,13],[9,13],[14,13],[13,13],[2,13],[15,13],[16,13],[17,13],[18,13],[19,13],[20,13],[21,13],[22,13],[3,13],[23,13],[24,13],[4,13],[25,13],[29,13],[26,13],[27,13],[28,13],[30,13],[31,13],[32,13],[5,13],[33,13],[34,13],[35,13],[36,13],[6,13],[40,13],[37,13],[38,13],[39,13],[41,13],[7,13],[42,13],[53,13],[47,13],[48,13],[43,13],[44,13],[45,13],[46,13],[1,13],[49,13],[50,13],[12,13],[11,13],[83,133],[95,134],[81,135],[96,136],[105,137],[72,138],[73,139],[71,140],[104,68],[99,141],[103,142],[75,143],[92,144],[74,145],[102,146],[69,147],[70,141],[76,148],[77,13],[82,149],[80,148],[67,150],[106,151],[97,152],[86,153],[85,148],[87,154],[90,155],[84,156],[88,157],[100,68],[78,158],[79,159],[91,160],[68,136],[94,161],[93,148],[89,162],[98,13],[66,13],[101,163],[288,164],[286,120],[292,165],[290,13],[291,166],[289,13],[287,167],[299,168]],"affectedFilesPendingEmit":[288,286,292,290,291,289,287,299],"version":"5.9.3"} \ No newline at end of file From 4a178de6e6652b7ae85397bf2fa3fa90db37f7f9 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 9 Jan 2026 23:53:59 -0600 Subject: [PATCH 04/77] fix(ertp-ledgerguise): make isMyIssuer verify issuer identity --- packages/ertp-ledgerguise/src/index.ts | 2 +- .../ertp-ledgerguise/test/ledgerguise.test.ts | 23 +++++++++++++++++++ .../ertp-ledgerguise/tsconfig.tsbuildinfo | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 5f48de1..3d92320 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -78,7 +78,7 @@ const makeIssuerKitForCommodity = ( applyTransfer, }); const brand = freezeProps({ - isMyIssuer: async () => false, + isMyIssuer: async (allegedIssuer: object) => allegedIssuer === issuer, getAllegedName: () => getAllegedName(), getDisplayInfo: () => displayInfo, getAmountShape: () => amountShape, diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index fac62c7..59ef0d6 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -22,6 +22,29 @@ test('initGnuCashSchema creates GnuCash tables', t => { t.is(row?.name, 'accounts'); }); +test('brand.isMyIssuer rejects unrelated issuers', async t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const kit = createIssuerKit(freeze({ db, commodity, makeGuid })); + const other = createIssuerKit(freeze({ db, commodity, makeGuid })); + + t.true(await kit.brand.isMyIssuer(kit.issuer)); + t.false(await kit.brand.isMyIssuer(other.issuer)); +}); + test('alice sends 10 to bob', t => { const { freeze } = Object; const db = new Database(':memory:'); diff --git a/packages/ertp-ledgerguise/tsconfig.tsbuildinfo b/packages/ertp-ledgerguise/tsconfig.tsbuildinfo index c01eaa3..0013a2b 100644 --- a/packages/ertp-ledgerguise/tsconfig.tsbuildinfo +++ b/packages/ertp-ledgerguise/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2020.full.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/better-sqlite3/index.d.ts","./node_modules/@endo/eventual-send/src/E.d.ts","./node_modules/@endo/eventual-send/src/handled-promise.d.ts","./node_modules/@endo/eventual-send/src/track-turns.d.ts","./node_modules/@endo/eventual-send/src/types.d.ts","./node_modules/@endo/eventual-send/src/exports.d.ts","./node_modules/@endo/eventual-send/src/no-shim.d.ts","./node_modules/@endo/far/src/exports.d.ts","./node_modules/@endo/pass-style/src/passStyle-helpers.d.ts","./node_modules/ses/types.d.ts","./node_modules/@endo/pass-style/src/types.d.ts","./node_modules/@endo/pass-style/src/makeTagged.d.ts","./node_modules/@endo/pass-style/src/deeplyFulfilled.d.ts","./node_modules/@endo/pass-style/src/iter-helpers.d.ts","./node_modules/@endo/pass-style/src/internal-types.d.ts","./node_modules/@endo/pass-style/src/error.d.ts","./node_modules/@endo/pass-style/src/remotable.d.ts","./node_modules/@endo/pass-style/src/symbol.d.ts","./node_modules/@endo/pass-style/src/string.d.ts","./node_modules/@endo/pass-style/src/passStyleOf.d.ts","./node_modules/@endo/pass-style/src/make-far.d.ts","./node_modules/@endo/pass-style/src/typeGuards.d.ts","./node_modules/@endo/pass-style/index.d.ts","./node_modules/@endo/far/src/index.d.ts","./node_modules/@endo/marshal/src/types.d.ts","./node_modules/@endo/marshal/src/encodeToCapData.d.ts","./node_modules/@endo/marshal/src/marshal.d.ts","./node_modules/@endo/marshal/src/marshal-stringify.d.ts","./node_modules/@endo/marshal/src/marshal-justin.d.ts","./node_modules/@endo/marshal/src/encodePassable.d.ts","./node_modules/@endo/marshal/src/rankOrder.d.ts","./node_modules/@endo/marshal/index.d.ts","./node_modules/@endo/patterns/src/types.d.ts","./node_modules/@endo/patterns/src/keys/copySet.d.ts","./node_modules/@endo/patterns/src/keys/copyBag.d.ts","./node_modules/@endo/common/list-difference.d.ts","./node_modules/@endo/common/object-map.d.ts","./node_modules/@endo/patterns/src/keys/checkKey.d.ts","./node_modules/@endo/patterns/src/keys/compareKeys.d.ts","./node_modules/@endo/patterns/src/keys/merge-set-operators.d.ts","./node_modules/@endo/patterns/src/keys/merge-bag-operators.d.ts","./node_modules/@endo/patterns/src/patterns/patternMatchers.d.ts","./node_modules/@endo/patterns/src/patterns/getGuardPayloads.d.ts","./node_modules/@endo/patterns/index.d.ts","./node_modules/@endo/common/object-meta-map.d.ts","./node_modules/@endo/common/from-unique-entries.d.ts","./node_modules/@agoric/internal/src/js-utils.d.ts","./node_modules/@agoric/internal/src/ses-utils.d.ts","./node_modules/@agoric/internal/src/types.ts","./node_modules/@endo/exo/src/get-interface.d.ts","./node_modules/@endo/exo/src/types.d.ts","./node_modules/@endo/exo/src/exo-makers.d.ts","./node_modules/@endo/exo/index.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakSetStore.d.ts","./node_modules/@agoric/store/src/types.d.ts","./node_modules/@agoric/store/src/stores/scalarSetStore.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakMapStore.d.ts","./node_modules/@agoric/store/src/stores/scalarMapStore.d.ts","./node_modules/@agoric/store/src/legacy/legacyMap.d.ts","./node_modules/@agoric/store/src/legacy/legacyWeakMap.d.ts","./node_modules/@agoric/internal/src/cli-utils.d.ts","./node_modules/@agoric/internal/src/config.d.ts","./node_modules/@agoric/internal/src/debug.d.ts","./node_modules/@agoric/internal/src/errors.d.ts","./node_modules/@agoric/internal/src/method-tools.d.ts","./node_modules/@agoric/internal/src/metrics.d.ts","./node_modules/@agoric/internal/src/natural-sort.d.ts","./node_modules/@agoric/internal/src/tmpDir.d.ts","./node_modules/@agoric/internal/src/typeCheck.d.ts","./node_modules/@agoric/internal/src/typeGuards.d.ts","./node_modules/@agoric/internal/src/types-index.d.ts","./node_modules/@agoric/internal/src/marshal.d.ts","./node_modules/@agoric/internal/src/index.d.ts","./node_modules/@agoric/store/src/stores/store-utils.d.ts","./node_modules/@agoric/store/src/index.d.ts","./node_modules/@agoric/base-zone/src/watch-promise.d.ts","./node_modules/@agoric/base-zone/src/types.d.ts","./node_modules/@agoric/base-zone/src/exports.d.ts","./node_modules/@agoric/swingset-liveslots/src/types.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualReferences.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualObjectManager.d.ts","./node_modules/@agoric/swingset-liveslots/src/watchedPromises.d.ts","./node_modules/@agoric/swingset-liveslots/src/vatDataTypes.ts","./node_modules/@agoric/swingset-liveslots/src/types-index.d.ts","./node_modules/@agoric/swingset-liveslots/src/liveslots.d.ts","./node_modules/@agoric/swingset-liveslots/src/message.d.ts","./node_modules/@agoric/swingset-liveslots/src/index.d.ts","./node_modules/@agoric/base-zone/src/make-once.d.ts","./node_modules/@agoric/base-zone/src/keys.d.ts","./node_modules/@agoric/base-zone/src/is-passable.d.ts","./node_modules/@agoric/base-zone/src/index.d.ts","./node_modules/@agoric/internal/src/lib-chainStorage.d.ts","./node_modules/@agoric/notifier/src/types.ts","./node_modules/@agoric/notifier/src/topic.d.ts","./node_modules/@agoric/notifier/src/storesub.d.ts","./node_modules/@agoric/notifier/src/stored-notifier.d.ts","./node_modules/@agoric/notifier/src/types-index.d.ts","./node_modules/@agoric/notifier/src/publish-kit.d.ts","./node_modules/@agoric/notifier/src/subscribe.d.ts","./node_modules/@agoric/notifier/src/notifier.d.ts","./node_modules/@agoric/notifier/src/subscriber.d.ts","./node_modules/@agoric/notifier/src/asyncIterableAdaptor.d.ts","./node_modules/@agoric/notifier/src/index.d.ts","./node_modules/@agoric/internal/src/tagged.d.ts","./node_modules/@agoric/ertp/src/types.ts","./node_modules/@agoric/ertp/src/amountMath.d.ts","./node_modules/@agoric/ertp/src/issuerKit.d.ts","./node_modules/@agoric/ertp/src/typeGuards.d.ts","./node_modules/@agoric/ertp/src/types-index.d.ts","./node_modules/@agoric/ertp/src/index.d.ts","./src/guids.ts","./src/types.ts","./src/db-helpers.ts","./src/sql/gc_empty.ts","./src/jessie-tools.ts","./src/purse.ts","./src/index.ts","./node_modules/ava/types/assertions.d.cts","./node_modules/ava/types/subscribable.d.cts","./node_modules/ava/types/try-fn.d.cts","./node_modules/ava/types/test-fn.d.cts","./node_modules/ava/entrypoints/main.d.cts","./node_modules/ava/index.d.ts","./test/ledgerguise.test.ts"],"fileIdsList":[[56,119,127,131,134,136,137,138,150,252],[56,119,127,131,134,136,137,138,150,251,253,263,264,265],[56,119,127,131,134,136,137,138,150,198],[56,119,127,131,134,136,137,138,150,252,262],[56,119,127,131,134,136,137,138,150,228,250,251],[56,119,127,131,134,136,137,138,150,219],[56,119,127,131,134,136,137,138,150,219,280],[56,119,127,131,134,136,137,138,150,281,282,283,284],[56,119,127,131,134,136,137,138,150,219,248,280,281],[56,119,127,131,134,136,137,138,150,219,248,280],[56,119,127,131,134,136,137,138,150,280],[56,119,127,131,134,136,137,138,150,198,199,219,278,279,281],[56,119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,222,223,236,237,238,239,240,241,242,243,244,245,246,247],[56,119,127,131,134,136,137,138,150,199,207,224,228,266],[56,119,127,131,134,136,137,138,150,207,224],[56,119,127,131,134,136,137,138,150,199,212,220,221,222,224],[56,119,127,131,134,136,137,138,150,224],[56,119,127,131,134,136,137,138,150,219,224],[56,119,127,131,134,136,137,138,150,182,198,219,223],[56,119,127,131,134,136,137,138,150,182,198,199,268,272],[56,119,127,131,134,136,137,138,150,269,270,271,272,273,274,275,276,277],[56,119,127,131,134,136,137,138,150,248,268],[56,119,127,131,134,136,137,138,150,219,262,268],[56,119,127,131,134,136,137,138,150,198,199,267,268],[56,119,127,131,134,136,137,138,150,199,207,267,268],[56,119,127,131,134,136,137,138,150,182,198,199,268],[56,119,127,131,134,136,137,138,150,268],[56,119,127,131,134,136,137,138,150,207,267],[56,119,127,131,134,136,137,138,150,219,228,229,230,231,232,233,234,235,248,249],[56,119,127,131,134,136,137,138,150,230],[56,119,127,131,134,136,137,138,150,198,219,230],[56,119,127,131,134,136,137,138,150,219,230],[56,119,127,131,134,136,137,138,150,219,250],[56,119,127,131,134,136,137,138,150,198,207,219,230],[56,119,127,131,134,136,137,138,150,198,219],[56,119,127,131,134,136,137,138,150,259,260,261],[56,119,127,131,134,136,137,138,150,222,254],[56,119,127,131,134,136,137,138,150,254],[56,119,127,131,134,136,137,138,150,254,258],[56,119,127,131,134,136,137,138,150,207],[56,119,127,131,134,136,137,138,150,182,198,219,228,250,257],[56,119,127,131,134,136,137,138,150,207,254,255,262],[56,119,127,131,134,136,137,138,150,207,254,255,256,258],[56,119,127,131,134,136,137,138,150,180],[56,119,127,131,134,136,137,138,150,177,178,181],[56,119,127,131,134,136,137,138,150,177,178,179],[56,119,127,131,134,136,137,138,150,225,226,227],[56,119,127,131,134,136,137,138,150,219,226],[56,119,127,131,134,136,137,138,150,182,198,219,225],[56,119,127,131,134,136,137,138,150,182],[56,119,127,131,134,136,137,138,150,182,183,198],[56,119,127,131,134,136,137,138,150,198,200,201,202,203,204,205,206],[56,119,127,131,134,136,137,138,150,198,200],[56,119,127,131,134,136,137,138,150,185,198,200],[56,119,127,131,134,136,137,138,150,200],[56,119,127,131,134,136,137,138,150,184,186,187,188,189,191,192,193,194,195,196,197],[56,119,127,131,134,136,137,138,150,185,186,190],[56,119,127,131,134,136,137,138,150,186],[56,119,127,131,134,136,137,138,150,182,186],[56,119,127,131,134,136,137,138,150,186,190],[56,119,127,131,134,136,137,138,150,184,185],[56,119,127,131,134,136,137,138,150,208,209,210,211,212,213,214,215,216,217,218],[56,119,127,131,134,136,137,138,150,198,208],[56,119,127,131,134,136,137,138,150,208],[56,119,127,131,134,136,137,138,150,198,207,208],[56,119,127,131,134,136,137,138,150,198,207],[56,119,127,131,134,136,137,138,150,175],[56,116,117,119,127,131,134,136,137,138,150],[56,118,119,127,131,134,136,137,138,150],[119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,158],[56,119,120,125,127,130,131,134,136,137,138,140,150,155,167],[56,119,120,121,127,130,131,134,136,137,138,150],[56,119,122,127,131,134,136,137,138,150,168],[56,119,123,124,127,131,134,136,137,138,141,150],[56,119,124,127,131,134,136,137,138,150,155,164],[56,119,125,127,130,131,134,136,137,138,140,150],[56,118,119,126,127,131,134,136,137,138,150],[56,119,127,128,131,134,136,137,138,150],[56,119,127,129,130,131,134,136,137,138,150],[56,118,119,127,130,131,134,136,137,138,150],[56,119,127,130,131,132,134,136,137,138,150,155,167],[56,119,127,130,131,132,134,136,137,138,150,155,158],[56,106,119,127,130,131,133,134,136,137,138,140,150,155,167],[56,119,127,130,131,133,134,136,137,138,140,150,155,164,167],[56,119,127,131,133,134,135,136,137,138,150,155,164,167],[54,55,56,57,58,59,60,61,62,63,64,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174],[56,119,127,130,131,134,136,137,138,150],[56,119,127,131,134,136,138,150],[56,119,127,131,134,136,137,138,139,150,167],[56,119,127,130,131,134,136,137,138,140,150,155],[56,119,127,131,134,136,137,138,141,150],[56,119,127,131,134,136,137,138,142,150],[56,119,127,130,131,134,136,137,138,145,150],[56,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174],[56,119,127,131,134,136,137,138,147,150],[56,119,127,131,134,136,137,138,148,150],[56,119,124,127,131,134,136,137,138,140,150,158],[56,119,127,130,131,134,136,137,138,150,151],[56,119,127,131,134,136,137,138,150,152,168,171],[56,119,127,130,131,134,136,137,138,150,155,157,158],[56,119,127,131,134,136,137,138,150,156,158],[56,119,127,131,134,136,137,138,150,158,168],[56,119,127,131,134,136,137,138,150,159],[56,116,119,127,131,134,136,137,138,150,155,161],[56,119,127,131,134,136,137,138,150,155,160],[56,119,127,130,131,134,136,137,138,150,162,163],[56,119,127,131,134,136,137,138,150,162,163],[56,119,124,127,131,134,136,137,138,140,150,155,164],[56,119,127,131,134,136,137,138,150,165],[56,119,127,131,134,136,137,138,140,150,166],[56,119,127,131,133,134,136,137,138,148,150,167],[56,119,127,131,134,136,137,138,150,168,169],[56,119,124,127,131,134,136,137,138,150,169],[56,119,127,131,134,136,137,138,150,155,170],[56,119,127,131,134,136,137,138,139,150,171],[56,119,127,131,134,136,137,138,150,172],[56,119,122,127,131,134,136,137,138,150],[56,119,124,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,168],[56,106,119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,150,173],[56,119,127,131,134,136,137,138,145,150],[56,119,127,131,134,136,137,138,150,163],[56,106,119,127,130,131,132,134,136,137,138,145,150,155,158,167,170,171,173],[56,119,127,131,134,136,137,138,150,155,174],[56,119,127,131,134,136,137,138,150,293,294,295,296],[56,119,127,131,134,136,137,138,150,297],[56,119,127,131,134,136,137,138,150,293,294,295],[56,119,127,131,134,136,137,138,150,296],[56,72,75,78,79,119,127,131,134,136,137,138,150,167],[56,75,119,127,131,134,136,137,138,150,155,167],[56,75,79,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,150,155],[56,69,119,127,131,134,136,137,138,150],[56,73,119,127,131,134,136,137,138,150],[56,71,72,75,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,140,150,164],[56,69,119,127,131,134,136,137,138,150,175],[56,71,75,119,127,131,134,136,137,138,140,150,167],[56,66,67,68,70,74,119,127,130,131,134,136,137,138,150,155,167],[56,75,83,91,119,127,131,134,136,137,138,150],[56,67,73,119,127,131,134,136,137,138,150],[56,75,100,101,119,127,131,134,136,137,138,150],[56,67,70,75,119,127,131,134,136,137,138,150,158,167,175],[56,75,119,127,131,134,136,137,138,150],[56,71,75,119,127,131,134,136,137,138,150,167],[56,66,119,127,131,134,136,137,138,150],[56,69,70,71,73,74,75,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,119,127,131,134,136,137,138,150],[56,75,93,96,119,127,131,134,136,137,138,150],[56,75,83,84,85,119,127,131,134,136,137,138,150],[56,73,75,84,86,119,127,131,134,136,137,138,150],[56,74,119,127,131,134,136,137,138,150],[56,67,69,75,119,127,131,134,136,137,138,150],[56,75,79,84,86,119,127,131,134,136,137,138,150],[56,79,119,127,131,134,136,137,138,150],[56,73,75,78,119,127,131,134,136,137,138,150,167],[56,67,71,75,83,119,127,131,134,136,137,138,150],[56,75,93,119,127,131,134,136,137,138,150],[56,86,119,127,131,134,136,137,138,150],[56,69,75,100,119,127,131,134,136,137,138,150,158,173,175],[56,119,127,131,134,136,137,138,150,176,287],[56,119,127,131,134,136,137,138,150,176,285,286,287,288,289,290,291],[56,119,127,131,134,136,137,138,150,176,287,288,290],[56,119,127,131,134,136,137,138,150,176,285,286],[56,119,127,131,134,136,137,138,150,176,285,292,298]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"961cf7535b9c521cd634055b1b6ac49b94d055f0b573ce7fdc4cfaddab080b7c","impliedFormat":1},{"version":"806a8c6daae69e5695e7200d9eca6bc1e4298f38d90edda3ce67a794da31a24f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"5e0c66763bda6ad4efe2ff62b2ca3a8af0b8d5b58a09429bbf9e433706c32f49","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"cd9189eacf0f9143b8830e9d6769335aa6d902c04195f04145bcbf19e7f26fcb","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"c2a6a737189ced24ffe0634e9239b087e4c26378d0490f95141b9b9b042b746c","impliedFormat":1},{"version":"2cd4b702eb44058636981ad2a53ab0152417c8f36b224e459aa5404d5786166e","impliedFormat":99},{"version":"64a95727716d7a159ff916085eb5df4dd67f1ff9c6f7e35ce2aff8a4ed4e6d31","impliedFormat":99},{"version":"93340c70128cbf56acb9eba0146f9cae83b5ef8f4b02f380fff0b77a6b7cf113","impliedFormat":99},{"version":"eb10902fb118057f367f63a703af037ea92a1f8e6161b9b128c29d934539d9a5","impliedFormat":99},{"version":"6b9c704b9febb76cdf74f8f1e3ac199c5b4708e5be2afe257320411ec2c8a3a1","affectsGlobalScope":true,"impliedFormat":99},{"version":"614fa8a4693c632333c354af80562633c8aaf0d552e7ed90f191a6ace24abe9d","impliedFormat":99},{"version":"d221c15d4aae13d314072f859de2ccec2c600a3addc9f2b71b397c83a157e71f","impliedFormat":99},{"version":"dc8a5014726788b50b968d67404dbc7713009040720a04b39c784b43dd8fdacb","impliedFormat":99},{"version":"ea5d08724831aab137fab28195dadf65667aec35acc0f2a5e517271d8c3082d3","affectsGlobalScope":true,"impliedFormat":99},{"version":"009b62c055096dfb3291f2667b8f0984ce480abef01c646e9675868fcec5ac60","impliedFormat":99},{"version":"d86a646352434aa51e337e64e234eab2d28af156bb5931d25c789d0c5dfbcd08","impliedFormat":99},{"version":"d15ab66050babcbb3858c785c437230bd984943b9b2080cd16fe1f0007b4802b","impliedFormat":99},{"version":"d5dc3c765037bfc7bd118be91ad280801f8c01fe41e8b7c8c1d8b96f6a0dc489","impliedFormat":99},{"version":"c6af1103d816d17451bc1a18cb9889fc9a282966383b695927d3ead99d958da0","impliedFormat":99},{"version":"d34287eb61f4689723448d33f50a047769dadee66ec8cb8609b41b17a5b3df40","impliedFormat":99},{"version":"22f52ade1934d26b5db4d5558be99097a82417c0247958527336535930d5a288","impliedFormat":99},{"version":"717d656e46e34696d072f2cee99ca045e69350f3c5ede3193337f884ccbc2a3b","impliedFormat":99},{"version":"b5a53985100fa348fcfb06bad4ee86367168e018998cbf95394a01b2dac92bb7","impliedFormat":99},{"version":"cadea2f7c33f255e142da3b0fefee54fa3985a12471cf9c5c51a221b3844f976","impliedFormat":99},{"version":"46f09e6b30f4301674d1c685934bd4ad2b594085d2545d6f063c175b1dcfd5af","impliedFormat":99},{"version":"25cd3d5fecfed6af5903170b67e8b3531591633e14c5b6735aac0d49e93d7cf0","impliedFormat":99},{"version":"f9fdd230ece877f4bcd8d35240426bcb1482f44faf813e6a336c2cc1b034e58d","impliedFormat":99},{"version":"bcbe66e540446c7fb8b34afe764dae60b28ef929cafe26402594f41a377fac41","impliedFormat":99},{"version":"428ef8df7e77bd4731faa19ef7430823f42bc95abd99368351411541ee08d2f7","impliedFormat":99},{"version":"a8a953cb8cf0b05c91086bd15a383afdfbddbf0cda5ed67d2c55542a5064b69d","impliedFormat":99},{"version":"f5a00483d6aa997ffedb1e802df7c7dcd048e43deab8f75c2c754f4ee3f97b41","impliedFormat":99},{"version":"14da43cd38f32c3b6349d1667937579820f1a3ddb40f3187caa727d4d451dcd4","impliedFormat":99},{"version":"2b77e2bc5350c160c53c767c8e6325ee61da47eda437c1d3156e16df94a64257","impliedFormat":99},{"version":"b0c5a13c0ec9074cdd2f8ed15e6734ba49231eb773330b221083e79e558badb4","impliedFormat":99},{"version":"a2d30f97dcc401dad445fb4f0667a167d1b9c0fdb1132001cc37d379e8946e3c","impliedFormat":99},{"version":"81c859cff06ee38d6f6b8015faa04722b535bb644ea386919d570e0e1f052430","impliedFormat":99},{"version":"05e938c1bc8cc5d2f3b9bb87dc09da7ab8e8e8436f17af7f1672f9b42ab5307d","impliedFormat":99},{"version":"061020cd9bc920fc08a8817160c5cb97b8c852c5961509ed15aab0c5a4faddb3","impliedFormat":99},{"version":"e33bbc0d740e4db63b20fa80933eb78cd305258ebb02b2c21b7932c8df118d3b","impliedFormat":99},{"version":"6795c049a6aaaaeb25ae95e0b9a4c75c8a325bd2b3b40aee7e8f5225533334d4","impliedFormat":99},{"version":"e6081f90b9dc3ff16bcc3fdab32aa361800dc749acc78097870228d8f8fd9920","impliedFormat":99},{"version":"6274539c679f0c9bcd2dbf9e85c5116db6acf91b3b9e1084ce8a17db56a0259a","impliedFormat":99},{"version":"f472753504df7760ad34eafa357007e90c59040e6f6882aae751de7b134b8713","impliedFormat":99},{"version":"dba70304db331da707d5c771e492b9c1db7545eb29a949050a65d0d4fa4a000d","impliedFormat":99},{"version":"a520f33e8a5a92d3847223b2ae2d8244cdb7a6d3d8dfdcc756c5650a38fc30f4","impliedFormat":99},{"version":"76aec992df433e1e56b9899183b4cf8f8216e00e098659dbfbc4d0cbf9054725","impliedFormat":99},{"version":"28fbf5d3fdff7c1dad9e3fd71d4e60077f14134b06253cb62e0eb3ba46f628e3","impliedFormat":99},{"version":"c5340ac3565038735dbf82f6f151a75e8b95b9b1d5664b4fddf0168e4dd9c2f3","impliedFormat":99},{"version":"9481179c799a61aa282d5d48b22421d4d9f592c892f2c6ae2cda7b78595a173e","impliedFormat":99},{"version":"00de25621f1acd5ed68e04bb717a418150779459c0df27843e5a3145ab6aa13d","impliedFormat":99},{"version":"3b0a6f0e693745a8f6fd35bafb8d69f334f3c782a91c8f3344733e2e55ba740d","impliedFormat":99},{"version":"83576f4e2a788f59c217da41b5b7eb67912a400a5ff20aa0622a5c902d23eb75","impliedFormat":99},{"version":"039ee0312b31c74b8fcf0d55b24ef9350b17da57572648580acd70d2e79c0d84","impliedFormat":99},{"version":"6a437bd627ddcb418741f1a279a9db2828cc63c24b4f8586b0473e04f314bee5","impliedFormat":99},{"version":"bb1a27e42875da4a6ff036a9bbe8fca33f88225d9ee5f3c18619bfeabc37c4f4","impliedFormat":99},{"version":"56e07c29328f54e68cf4f6a81bc657ae6b2bbd31c2f53a00f4f0a902fa095ea1","impliedFormat":99},{"version":"ce29026a1ee122328dc9f1b40bff4cf424643fddf8dc6c046f4c71bf97ecf5b5","impliedFormat":99},{"version":"386a071f8e7ca44b094aba364286b65e6daceba25347afb3b7d316a109800393","impliedFormat":99},{"version":"6ba3f7fc791e73109b8c59ae17b1e013ab269629a973e78812e0143e4eab48b2","impliedFormat":99},{"version":"042dbb277282e4cb651b7a5cde8a07c01a7286d41f585808afa98c2c5adae7e0","impliedFormat":99},{"version":"0952d2faef01544f6061dd15d81ae53bfb9d3789b9def817f0019731e139bda8","impliedFormat":99},{"version":"8ec4b0ca2590204f6ef4a26d77c5c8b0bba222a5cd80b2cb3aa3016e3867f9ce","impliedFormat":99},{"version":"15d389a1ee1f700a49260e38736c8757339e5d5e06ca1409634242c1a7b0602e","impliedFormat":99},{"version":"f868b2a12bbe4356e2fd57057ba0619d88f1496d2b884a4f22d8bab3e253dbf5","impliedFormat":99},{"version":"a474bc8c71919a09c0d27ad0cba92e5e3e754dc957bec9c269728c9a4a4cf754","impliedFormat":99},{"version":"e732c6a46c6624dbbd56d3f164d6afdfe2b6007c6709bb64189ce057d03d30fd","impliedFormat":99},{"version":"5c425f77a2867b5d7026875328f13736e3478b0cc6c092787ac3a8dcc8ff0d42","impliedFormat":99},{"version":"b6d1738ae0dd427debbb3605ba03c30ceb76d4cefc7bd5f437004f6f4c622e38","impliedFormat":99},{"version":"6629357b7dd05ee4367a71962a234d508fa0fb99fbbad83fdbf3e64aa6e77104","impliedFormat":99},{"version":"5f8b299ecc1852b7b6eb9682a05f2dbfaae087e3363ecfbb9430350be32a97dc","impliedFormat":99},{"version":"6e304bbf3302fb015164bb3a7c7dfca6b3fdf57b1d56809173fed3663b42ced4","impliedFormat":99},{"version":"cd6aab42fef5395a16795cf23bbc9645dc9786af2c08dac3d61234948f72c67d","impliedFormat":99},{"version":"fe1f9b28ceb4ff76facbe0c363888d33d8265a0beb6fb5532a6e7a291490c795","impliedFormat":99},{"version":"b1d6ee25d690d99f44fd9c1c831bcdb9c0354f23dab49e14cdcfe5d0212bcba0","impliedFormat":99},{"version":"488958cf5865bce05ac5343cf1607ad7af72486a351c3afc7756fdd9fdafa233","impliedFormat":99},{"version":"424a44fb75e76db02794cf0e26c61510daf8bf4d4b43ebbeb6adc70be1dd68b4","impliedFormat":99},{"version":"519f0d3b64727722e5b188c679c1f741997be640fdcd30435a2c7ba006667d6e","impliedFormat":99},{"version":"49324b7e03d2c9081d66aef8b0a8129f0244ecac4fb11378520c9816d693ce7a","impliedFormat":99},{"version":"bbe31d874c9a2ac21ea0c5cee6ded26697f30961dca6f18470145b1c8cd66b21","impliedFormat":99},{"version":"38a5641908bc748e9829ab1d6147239a3797918fab932f0aa81543d409732990","impliedFormat":99},{"version":"125da449b5464b2873f7642e57452ac045a0219f0cb6a5d3391a15cc4336c471","impliedFormat":99},{"version":"d1cacc1ae76a3698129f4289657a18de22057bb6c00e7bf36aa2e9c5365eec66","impliedFormat":99},{"version":"0468caf7769824cd6ddd202c5f37c574bcc3f5c158ef401b71ca3ece8de5462f","impliedFormat":99},{"version":"966a181ee1c0cecd2aaa9cf8281f3b8036d159db7963788a7bfae78937c62717","impliedFormat":99},{"version":"8d11b30c4b66b9524db822608d279dc5e2b576d22ee21ee735a9b9a604524873","impliedFormat":99},{"version":"dac1ccee916195518aa964a933af099be396eaca9791dab44af01eb3209b9930","impliedFormat":99},{"version":"f95e4d1e6d3c5cbbbf6e216ea4742138e52402337eb3416170eabb2fdbe5c762","impliedFormat":99},{"version":"22b43e7fd932e3aa63e5bee8247d408ad1e5a29fe8008123dc6a4bd35ea49ded","impliedFormat":99},{"version":"aeea49091e71d123a471642c74a5dc4d8703476fd6254002d27c75728aa13691","impliedFormat":99},{"version":"0d4db4b482d5dec495943683ba3b6bb4026747a351c614fafdbaf54c00c5adab","impliedFormat":99},{"version":"45ac0268333f7bf8098595cda739764c429cd5d182ae4a127b3ca33405f81431","impliedFormat":99},{"version":"253c3549b055ad942ee115bef4c586c0c56e6b11aeb6353f171c7f0ffec8df07","impliedFormat":99},{"version":"0f1791a8891729f010e49f29b921b05afd45e5ba8430663c8ece4edeee748b1b","impliedFormat":99},{"version":"dfa585104fc407014e2a9ceafb748a50284fb282a561e9d8eb08562e64b1cb24","impliedFormat":99},{"version":"51130d85941585df457441c29e8f157ddc01e4978573a02a806a04c687b6748a","impliedFormat":99},{"version":"40f0d41f453dc614b2a3c552e7aca5ce723bb84d6e6bca8a6dcad1dca4cd9449","impliedFormat":99},{"version":"404627849c9714a78663bd299480dd94e75e457f5322caf0c7e169e5adab0a18","impliedFormat":99},{"version":"208306f454635e47d72092763c801f0ffcb7e6cba662d553eee945bd50987bb1","impliedFormat":99},{"version":"8b5a27971e8ede37415e42f24aae6fd227c2a1d2a93d6b8c7791a13abcde0f0b","impliedFormat":99},{"version":"1c106d58790bab5e144b35eeb31186f2be215d651e4000586fc021140cd324b9","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"c140653685b9af4f01e4283dd9d759126cb15f1c41721270c0bdbb55fd72673f","impliedFormat":99},{"version":"5844202ecdcea1f8612a826905623d93add56c9c1988df6471dff9999d92c0a7","impliedFormat":99},{"version":"b268ce0a7f489c27d8bf748c2563fd81092ead98e4c30f673670297250b774bd","impliedFormat":99},{"version":"9b0ca5de920ec607eecea5b40402fca8e705dfb3ff5e72cc91e2ac6d8f390985","impliedFormat":99},{"version":"efad5849e64223db373bbabc5eb6b2566d16e3bd34c0fd29ccf8bbe8a8a655e7","impliedFormat":99},{"version":"4c1c9ab197c2596bace50281bacf3ce3276f22aaef1c8398af0137779b577f24","impliedFormat":99},{"version":"a1acd535289b4cca0466376c1af5a99d887c91483792346be3b0b58d5f72eead","impliedFormat":99},{"version":"cdb6a1ed879f191ad45615cb4b7e7935237de0cfb8d410c7eb1fd9707d9c17ac","impliedFormat":99},{"version":"ca1debd87d50ade2eba2d0594eb47ab98e050a9fa08f879c750d80863dd3ce4c","impliedFormat":99},{"version":"dc01a3cc4787313606d58b1c6f3a4c5bf0d3fe4e3789dfdcde28d59bfd9b7c59","impliedFormat":99},{"version":"73ab9b053ad2a5ddee2f4c9b8cd36a436974dd5fa5a7c74940dd6b92e4d8e02d","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"fbf43977fd4aead581f1ef81146a4ff6fafe6bec7fac2b4cbd5a00577ab0c1c7","impliedFormat":99},{"version":"2ae4378b3e906557e1b319ca96b23978ee517a71f830be14c99d3a8f23c961b0","signature":"999142549785919344c29d95c5beeab0df338cd9ef20c5a8e039b6d48c115c43"},{"version":"fb380a470b6457adcdf883f05888ea83f378f47a17b775851190cf2160fdfee2","signature":"a2e6dfa4b803a333e731d8a788e65f450254958209ac445a8ed160d7f80b08b1"},{"version":"fc8e720e22b8f9ba80bdcdd3b140a641dc0de4aa647715175dab6422f6992859","signature":"b5287a80d647fb84acefa319a409b6da2da1be86bfcaeaabfc2a1d10218b5565"},{"version":"c189c903a1eb9620083188f005016fafef46ec9f65a6c93b356122251e7c83a8","signature":"a66b08d5957056956a73d0da1f1a25d94a8deee8fc0dda21b2426949651918d3"},{"version":"aa33f2f6c925e57e552e0fe8874fb6a6decbb4b2bd34e2beaac825b17e6cac2d","signature":"82908493d1cb77532ce657dc02cbac73e795d0dc2ea22b7c1063f74ba1630ecb"},{"version":"73b9b29841e031dc8c816b5d1d1621c593a698a9ad0a26c207c455291ef7b207","signature":"f3715d591e74f76c70a85952c3202591fc8ade3b5387b52eb54a9a4ccab18230"},{"version":"9fb9d94e5e54c62e91404b70df8e02a8d450ec1140fd00c785f45a71fcecfacc","signature":"a18e6dc5937faa74052fdf06c72bce89458199c01fe144ec7fa05bd54f42d959"},{"version":"465f1ca1f11e6a1b01b043a93196b7f8fc09c985b8e3084804d9a3938aad588d","impliedFormat":1},{"version":"00b72e597dcd6ff7bf772918c78c41dc7c68e239af658cf452bff645ebdc485d","impliedFormat":1},{"version":"17b183b69a3dd3cca2505cee7ff70501c574343ad49a385c9acb5b5299e1ba73","impliedFormat":1},{"version":"b26d3fa6859459f64c93e0c154bfc7a8b216b4cf1e241ca6b67e67ee8248626b","impliedFormat":1},{"version":"91cab3f4d6ab131c74ea8772a8c182bdb9c52500fb0388ef9fd2828c084b8087","impliedFormat":1},{"version":"13b8acfead5a8519fad35e43f58c62b946a24f2a1311254250b840b15b2051cd","impliedFormat":99},{"version":"a239d8967339d47496c56564629b37f021d2c76516d30660ede4167a1000b378","signature":"eff01d2bd4cee37bf7a0690ab7d9d17b258ce2b6570e2dd5276214e939760d6b"}],"root":[[286,292],299],"options":{"esModuleInterop":true,"module":1,"skipLibCheck":true,"strict":true,"target":7},"referencedMap":[[253,1],[266,2],[265,3],[264,1],[263,4],[252,5],[251,6],[281,7],[285,8],[282,9],[283,10],[284,11],[280,12],[236,13],[237,13],[238,13],[239,13],[248,14],[222,13],[267,15],[247,16],[240,13],[241,13],[242,13],[223,17],[279,13],[243,13],[244,18],[245,19],[246,18],[224,20],[277,21],[278,22],[275,23],[273,24],[271,25],[270,26],[274,27],[276,28],[269,28],[272,28],[268,29],[250,30],[234,31],[235,31],[233,32],[231,33],[232,32],[229,34],[249,35],[230,36],[262,37],[260,38],[261,39],[259,40],[254,41],[258,42],[256,43],[255,13],[257,44],[221,13],[211,13],[212,13],[220,13],[177,45],[181,45],[178,13],[182,46],[179,13],[180,47],[228,48],[227,49],[225,36],[226,50],[183,51],[199,52],[207,53],[205,3],[201,54],[204,55],[203,3],[202,56],[206,54],[200,3],[198,57],[188,3],[191,58],[190,59],[189,13],[196,60],[187,59],[184,59],[195,59],[192,61],[194,13],[193,13],[197,59],[186,62],[219,63],[213,64],[214,65],[210,66],[209,66],[216,65],[215,65],[218,64],[217,64],[208,67],[176,68],[116,69],[117,69],[118,70],[56,71],[119,72],[120,73],[121,74],[54,13],[122,75],[123,76],[124,77],[125,78],[126,79],[127,80],[128,80],[129,81],[130,82],[131,83],[132,84],[57,13],[55,13],[133,85],[134,86],[135,87],[175,88],[136,89],[137,90],[138,89],[139,91],[140,92],[141,93],[142,94],[143,94],[144,94],[145,95],[146,96],[147,97],[148,98],[149,99],[150,100],[151,100],[152,101],[153,13],[154,13],[155,102],[156,103],[157,102],[158,104],[159,105],[160,106],[161,107],[162,108],[163,109],[164,110],[165,111],[166,112],[167,113],[168,114],[169,115],[170,116],[171,117],[172,118],[58,89],[59,13],[60,119],[61,120],[62,13],[63,121],[64,13],[107,122],[108,123],[109,124],[110,124],[111,125],[112,13],[113,72],[114,126],[115,123],[173,127],[174,128],[297,129],[298,130],[293,13],[294,13],[296,131],[295,132],[65,13],[185,13],[51,13],[52,13],[10,13],[8,13],[9,13],[14,13],[13,13],[2,13],[15,13],[16,13],[17,13],[18,13],[19,13],[20,13],[21,13],[22,13],[3,13],[23,13],[24,13],[4,13],[25,13],[29,13],[26,13],[27,13],[28,13],[30,13],[31,13],[32,13],[5,13],[33,13],[34,13],[35,13],[36,13],[6,13],[40,13],[37,13],[38,13],[39,13],[41,13],[7,13],[42,13],[53,13],[47,13],[48,13],[43,13],[44,13],[45,13],[46,13],[1,13],[49,13],[50,13],[12,13],[11,13],[83,133],[95,134],[81,135],[96,136],[105,137],[72,138],[73,139],[71,140],[104,68],[99,141],[103,142],[75,143],[92,144],[74,145],[102,146],[69,147],[70,141],[76,148],[77,13],[82,149],[80,148],[67,150],[106,151],[97,152],[86,153],[85,148],[87,154],[90,155],[84,156],[88,157],[100,68],[78,158],[79,159],[91,160],[68,136],[94,161],[93,148],[89,162],[98,13],[66,13],[101,163],[288,164],[286,120],[292,165],[290,13],[291,166],[289,13],[287,167],[299,168]],"affectedFilesPendingEmit":[288,286,292,290,291,289,287,299],"version":"5.9.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2020.full.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/better-sqlite3/index.d.ts","./node_modules/@endo/eventual-send/src/E.d.ts","./node_modules/@endo/eventual-send/src/handled-promise.d.ts","./node_modules/@endo/eventual-send/src/track-turns.d.ts","./node_modules/@endo/eventual-send/src/types.d.ts","./node_modules/@endo/eventual-send/src/exports.d.ts","./node_modules/@endo/eventual-send/src/no-shim.d.ts","./node_modules/@endo/far/src/exports.d.ts","./node_modules/@endo/pass-style/src/passStyle-helpers.d.ts","./node_modules/ses/types.d.ts","./node_modules/@endo/pass-style/src/types.d.ts","./node_modules/@endo/pass-style/src/makeTagged.d.ts","./node_modules/@endo/pass-style/src/deeplyFulfilled.d.ts","./node_modules/@endo/pass-style/src/iter-helpers.d.ts","./node_modules/@endo/pass-style/src/internal-types.d.ts","./node_modules/@endo/pass-style/src/error.d.ts","./node_modules/@endo/pass-style/src/remotable.d.ts","./node_modules/@endo/pass-style/src/symbol.d.ts","./node_modules/@endo/pass-style/src/string.d.ts","./node_modules/@endo/pass-style/src/passStyleOf.d.ts","./node_modules/@endo/pass-style/src/make-far.d.ts","./node_modules/@endo/pass-style/src/typeGuards.d.ts","./node_modules/@endo/pass-style/index.d.ts","./node_modules/@endo/far/src/index.d.ts","./node_modules/@endo/marshal/src/types.d.ts","./node_modules/@endo/marshal/src/encodeToCapData.d.ts","./node_modules/@endo/marshal/src/marshal.d.ts","./node_modules/@endo/marshal/src/marshal-stringify.d.ts","./node_modules/@endo/marshal/src/marshal-justin.d.ts","./node_modules/@endo/marshal/src/encodePassable.d.ts","./node_modules/@endo/marshal/src/rankOrder.d.ts","./node_modules/@endo/marshal/index.d.ts","./node_modules/@endo/patterns/src/types.d.ts","./node_modules/@endo/patterns/src/keys/copySet.d.ts","./node_modules/@endo/patterns/src/keys/copyBag.d.ts","./node_modules/@endo/common/list-difference.d.ts","./node_modules/@endo/common/object-map.d.ts","./node_modules/@endo/patterns/src/keys/checkKey.d.ts","./node_modules/@endo/patterns/src/keys/compareKeys.d.ts","./node_modules/@endo/patterns/src/keys/merge-set-operators.d.ts","./node_modules/@endo/patterns/src/keys/merge-bag-operators.d.ts","./node_modules/@endo/patterns/src/patterns/patternMatchers.d.ts","./node_modules/@endo/patterns/src/patterns/getGuardPayloads.d.ts","./node_modules/@endo/patterns/index.d.ts","./node_modules/@endo/common/object-meta-map.d.ts","./node_modules/@endo/common/from-unique-entries.d.ts","./node_modules/@agoric/internal/src/js-utils.d.ts","./node_modules/@agoric/internal/src/ses-utils.d.ts","./node_modules/@agoric/internal/src/types.ts","./node_modules/@endo/exo/src/get-interface.d.ts","./node_modules/@endo/exo/src/types.d.ts","./node_modules/@endo/exo/src/exo-makers.d.ts","./node_modules/@endo/exo/index.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakSetStore.d.ts","./node_modules/@agoric/store/src/types.d.ts","./node_modules/@agoric/store/src/stores/scalarSetStore.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakMapStore.d.ts","./node_modules/@agoric/store/src/stores/scalarMapStore.d.ts","./node_modules/@agoric/store/src/legacy/legacyMap.d.ts","./node_modules/@agoric/store/src/legacy/legacyWeakMap.d.ts","./node_modules/@agoric/internal/src/cli-utils.d.ts","./node_modules/@agoric/internal/src/config.d.ts","./node_modules/@agoric/internal/src/debug.d.ts","./node_modules/@agoric/internal/src/errors.d.ts","./node_modules/@agoric/internal/src/method-tools.d.ts","./node_modules/@agoric/internal/src/metrics.d.ts","./node_modules/@agoric/internal/src/natural-sort.d.ts","./node_modules/@agoric/internal/src/tmpDir.d.ts","./node_modules/@agoric/internal/src/typeCheck.d.ts","./node_modules/@agoric/internal/src/typeGuards.d.ts","./node_modules/@agoric/internal/src/types-index.d.ts","./node_modules/@agoric/internal/src/marshal.d.ts","./node_modules/@agoric/internal/src/index.d.ts","./node_modules/@agoric/store/src/stores/store-utils.d.ts","./node_modules/@agoric/store/src/index.d.ts","./node_modules/@agoric/base-zone/src/watch-promise.d.ts","./node_modules/@agoric/base-zone/src/types.d.ts","./node_modules/@agoric/base-zone/src/exports.d.ts","./node_modules/@agoric/swingset-liveslots/src/types.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualReferences.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualObjectManager.d.ts","./node_modules/@agoric/swingset-liveslots/src/watchedPromises.d.ts","./node_modules/@agoric/swingset-liveslots/src/vatDataTypes.ts","./node_modules/@agoric/swingset-liveslots/src/types-index.d.ts","./node_modules/@agoric/swingset-liveslots/src/liveslots.d.ts","./node_modules/@agoric/swingset-liveslots/src/message.d.ts","./node_modules/@agoric/swingset-liveslots/src/index.d.ts","./node_modules/@agoric/base-zone/src/make-once.d.ts","./node_modules/@agoric/base-zone/src/keys.d.ts","./node_modules/@agoric/base-zone/src/is-passable.d.ts","./node_modules/@agoric/base-zone/src/index.d.ts","./node_modules/@agoric/internal/src/lib-chainStorage.d.ts","./node_modules/@agoric/notifier/src/types.ts","./node_modules/@agoric/notifier/src/topic.d.ts","./node_modules/@agoric/notifier/src/storesub.d.ts","./node_modules/@agoric/notifier/src/stored-notifier.d.ts","./node_modules/@agoric/notifier/src/types-index.d.ts","./node_modules/@agoric/notifier/src/publish-kit.d.ts","./node_modules/@agoric/notifier/src/subscribe.d.ts","./node_modules/@agoric/notifier/src/notifier.d.ts","./node_modules/@agoric/notifier/src/subscriber.d.ts","./node_modules/@agoric/notifier/src/asyncIterableAdaptor.d.ts","./node_modules/@agoric/notifier/src/index.d.ts","./node_modules/@agoric/internal/src/tagged.d.ts","./node_modules/@agoric/ertp/src/types.ts","./node_modules/@agoric/ertp/src/amountMath.d.ts","./node_modules/@agoric/ertp/src/issuerKit.d.ts","./node_modules/@agoric/ertp/src/typeGuards.d.ts","./node_modules/@agoric/ertp/src/types-index.d.ts","./node_modules/@agoric/ertp/src/index.d.ts","./src/guids.ts","./src/types.ts","./src/db-helpers.ts","./src/sql/gc_empty.ts","./src/jessie-tools.ts","./src/purse.ts","./src/index.ts","./node_modules/ava/types/assertions.d.cts","./node_modules/ava/types/subscribable.d.cts","./node_modules/ava/types/try-fn.d.cts","./node_modules/ava/types/test-fn.d.cts","./node_modules/ava/entrypoints/main.d.cts","./node_modules/ava/index.d.ts","./test/ledgerguise.test.ts"],"fileIdsList":[[56,119,127,131,134,136,137,138,150,252],[56,119,127,131,134,136,137,138,150,251,253,263,264,265],[56,119,127,131,134,136,137,138,150,198],[56,119,127,131,134,136,137,138,150,252,262],[56,119,127,131,134,136,137,138,150,228,250,251],[56,119,127,131,134,136,137,138,150,219],[56,119,127,131,134,136,137,138,150,219,280],[56,119,127,131,134,136,137,138,150,281,282,283,284],[56,119,127,131,134,136,137,138,150,219,248,280,281],[56,119,127,131,134,136,137,138,150,219,248,280],[56,119,127,131,134,136,137,138,150,280],[56,119,127,131,134,136,137,138,150,198,199,219,278,279,281],[56,119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,222,223,236,237,238,239,240,241,242,243,244,245,246,247],[56,119,127,131,134,136,137,138,150,199,207,224,228,266],[56,119,127,131,134,136,137,138,150,207,224],[56,119,127,131,134,136,137,138,150,199,212,220,221,222,224],[56,119,127,131,134,136,137,138,150,224],[56,119,127,131,134,136,137,138,150,219,224],[56,119,127,131,134,136,137,138,150,182,198,219,223],[56,119,127,131,134,136,137,138,150,182,198,199,268,272],[56,119,127,131,134,136,137,138,150,269,270,271,272,273,274,275,276,277],[56,119,127,131,134,136,137,138,150,248,268],[56,119,127,131,134,136,137,138,150,219,262,268],[56,119,127,131,134,136,137,138,150,198,199,267,268],[56,119,127,131,134,136,137,138,150,199,207,267,268],[56,119,127,131,134,136,137,138,150,182,198,199,268],[56,119,127,131,134,136,137,138,150,268],[56,119,127,131,134,136,137,138,150,207,267],[56,119,127,131,134,136,137,138,150,219,228,229,230,231,232,233,234,235,248,249],[56,119,127,131,134,136,137,138,150,230],[56,119,127,131,134,136,137,138,150,198,219,230],[56,119,127,131,134,136,137,138,150,219,230],[56,119,127,131,134,136,137,138,150,219,250],[56,119,127,131,134,136,137,138,150,198,207,219,230],[56,119,127,131,134,136,137,138,150,198,219],[56,119,127,131,134,136,137,138,150,259,260,261],[56,119,127,131,134,136,137,138,150,222,254],[56,119,127,131,134,136,137,138,150,254],[56,119,127,131,134,136,137,138,150,254,258],[56,119,127,131,134,136,137,138,150,207],[56,119,127,131,134,136,137,138,150,182,198,219,228,250,257],[56,119,127,131,134,136,137,138,150,207,254,255,262],[56,119,127,131,134,136,137,138,150,207,254,255,256,258],[56,119,127,131,134,136,137,138,150,180],[56,119,127,131,134,136,137,138,150,177,178,181],[56,119,127,131,134,136,137,138,150,177,178,179],[56,119,127,131,134,136,137,138,150,225,226,227],[56,119,127,131,134,136,137,138,150,219,226],[56,119,127,131,134,136,137,138,150,182,198,219,225],[56,119,127,131,134,136,137,138,150,182],[56,119,127,131,134,136,137,138,150,182,183,198],[56,119,127,131,134,136,137,138,150,198,200,201,202,203,204,205,206],[56,119,127,131,134,136,137,138,150,198,200],[56,119,127,131,134,136,137,138,150,185,198,200],[56,119,127,131,134,136,137,138,150,200],[56,119,127,131,134,136,137,138,150,184,186,187,188,189,191,192,193,194,195,196,197],[56,119,127,131,134,136,137,138,150,185,186,190],[56,119,127,131,134,136,137,138,150,186],[56,119,127,131,134,136,137,138,150,182,186],[56,119,127,131,134,136,137,138,150,186,190],[56,119,127,131,134,136,137,138,150,184,185],[56,119,127,131,134,136,137,138,150,208,209,210,211,212,213,214,215,216,217,218],[56,119,127,131,134,136,137,138,150,198,208],[56,119,127,131,134,136,137,138,150,208],[56,119,127,131,134,136,137,138,150,198,207,208],[56,119,127,131,134,136,137,138,150,198,207],[56,119,127,131,134,136,137,138,150,175],[56,116,117,119,127,131,134,136,137,138,150],[56,118,119,127,131,134,136,137,138,150],[119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,158],[56,119,120,125,127,130,131,134,136,137,138,140,150,155,167],[56,119,120,121,127,130,131,134,136,137,138,150],[56,119,122,127,131,134,136,137,138,150,168],[56,119,123,124,127,131,134,136,137,138,141,150],[56,119,124,127,131,134,136,137,138,150,155,164],[56,119,125,127,130,131,134,136,137,138,140,150],[56,118,119,126,127,131,134,136,137,138,150],[56,119,127,128,131,134,136,137,138,150],[56,119,127,129,130,131,134,136,137,138,150],[56,118,119,127,130,131,134,136,137,138,150],[56,119,127,130,131,132,134,136,137,138,150,155,167],[56,119,127,130,131,132,134,136,137,138,150,155,158],[56,106,119,127,130,131,133,134,136,137,138,140,150,155,167],[56,119,127,130,131,133,134,136,137,138,140,150,155,164,167],[56,119,127,131,133,134,135,136,137,138,150,155,164,167],[54,55,56,57,58,59,60,61,62,63,64,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174],[56,119,127,130,131,134,136,137,138,150],[56,119,127,131,134,136,138,150],[56,119,127,131,134,136,137,138,139,150,167],[56,119,127,130,131,134,136,137,138,140,150,155],[56,119,127,131,134,136,137,138,141,150],[56,119,127,131,134,136,137,138,142,150],[56,119,127,130,131,134,136,137,138,145,150],[56,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174],[56,119,127,131,134,136,137,138,147,150],[56,119,127,131,134,136,137,138,148,150],[56,119,124,127,131,134,136,137,138,140,150,158],[56,119,127,130,131,134,136,137,138,150,151],[56,119,127,131,134,136,137,138,150,152,168,171],[56,119,127,130,131,134,136,137,138,150,155,157,158],[56,119,127,131,134,136,137,138,150,156,158],[56,119,127,131,134,136,137,138,150,158,168],[56,119,127,131,134,136,137,138,150,159],[56,116,119,127,131,134,136,137,138,150,155,161],[56,119,127,131,134,136,137,138,150,155,160],[56,119,127,130,131,134,136,137,138,150,162,163],[56,119,127,131,134,136,137,138,150,162,163],[56,119,124,127,131,134,136,137,138,140,150,155,164],[56,119,127,131,134,136,137,138,150,165],[56,119,127,131,134,136,137,138,140,150,166],[56,119,127,131,133,134,136,137,138,148,150,167],[56,119,127,131,134,136,137,138,150,168,169],[56,119,124,127,131,134,136,137,138,150,169],[56,119,127,131,134,136,137,138,150,155,170],[56,119,127,131,134,136,137,138,139,150,171],[56,119,127,131,134,136,137,138,150,172],[56,119,122,127,131,134,136,137,138,150],[56,119,124,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,168],[56,106,119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,150,173],[56,119,127,131,134,136,137,138,145,150],[56,119,127,131,134,136,137,138,150,163],[56,106,119,127,130,131,132,134,136,137,138,145,150,155,158,167,170,171,173],[56,119,127,131,134,136,137,138,150,155,174],[56,119,127,131,134,136,137,138,150,293,294,295,296],[56,119,127,131,134,136,137,138,150,297],[56,119,127,131,134,136,137,138,150,293,294,295],[56,119,127,131,134,136,137,138,150,296],[56,72,75,78,79,119,127,131,134,136,137,138,150,167],[56,75,119,127,131,134,136,137,138,150,155,167],[56,75,79,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,150,155],[56,69,119,127,131,134,136,137,138,150],[56,73,119,127,131,134,136,137,138,150],[56,71,72,75,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,140,150,164],[56,69,119,127,131,134,136,137,138,150,175],[56,71,75,119,127,131,134,136,137,138,140,150,167],[56,66,67,68,70,74,119,127,130,131,134,136,137,138,150,155,167],[56,75,83,91,119,127,131,134,136,137,138,150],[56,67,73,119,127,131,134,136,137,138,150],[56,75,100,101,119,127,131,134,136,137,138,150],[56,67,70,75,119,127,131,134,136,137,138,150,158,167,175],[56,75,119,127,131,134,136,137,138,150],[56,71,75,119,127,131,134,136,137,138,150,167],[56,66,119,127,131,134,136,137,138,150],[56,69,70,71,73,74,75,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,119,127,131,134,136,137,138,150],[56,75,93,96,119,127,131,134,136,137,138,150],[56,75,83,84,85,119,127,131,134,136,137,138,150],[56,73,75,84,86,119,127,131,134,136,137,138,150],[56,74,119,127,131,134,136,137,138,150],[56,67,69,75,119,127,131,134,136,137,138,150],[56,75,79,84,86,119,127,131,134,136,137,138,150],[56,79,119,127,131,134,136,137,138,150],[56,73,75,78,119,127,131,134,136,137,138,150,167],[56,67,71,75,83,119,127,131,134,136,137,138,150],[56,75,93,119,127,131,134,136,137,138,150],[56,86,119,127,131,134,136,137,138,150],[56,69,75,100,119,127,131,134,136,137,138,150,158,173,175],[56,119,127,131,134,136,137,138,150,176,287],[56,119,127,131,134,136,137,138,150,176,285,286,287,288,289,290,291],[56,119,127,131,134,136,137,138,150,176,287,288,290],[56,119,127,131,134,136,137,138,150,176,285,286],[56,119,127,131,134,136,137,138,150,176,285,292,298]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"961cf7535b9c521cd634055b1b6ac49b94d055f0b573ce7fdc4cfaddab080b7c","impliedFormat":1},{"version":"806a8c6daae69e5695e7200d9eca6bc1e4298f38d90edda3ce67a794da31a24f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"5e0c66763bda6ad4efe2ff62b2ca3a8af0b8d5b58a09429bbf9e433706c32f49","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"cd9189eacf0f9143b8830e9d6769335aa6d902c04195f04145bcbf19e7f26fcb","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"c2a6a737189ced24ffe0634e9239b087e4c26378d0490f95141b9b9b042b746c","impliedFormat":1},{"version":"2cd4b702eb44058636981ad2a53ab0152417c8f36b224e459aa5404d5786166e","impliedFormat":99},{"version":"64a95727716d7a159ff916085eb5df4dd67f1ff9c6f7e35ce2aff8a4ed4e6d31","impliedFormat":99},{"version":"93340c70128cbf56acb9eba0146f9cae83b5ef8f4b02f380fff0b77a6b7cf113","impliedFormat":99},{"version":"eb10902fb118057f367f63a703af037ea92a1f8e6161b9b128c29d934539d9a5","impliedFormat":99},{"version":"6b9c704b9febb76cdf74f8f1e3ac199c5b4708e5be2afe257320411ec2c8a3a1","affectsGlobalScope":true,"impliedFormat":99},{"version":"614fa8a4693c632333c354af80562633c8aaf0d552e7ed90f191a6ace24abe9d","impliedFormat":99},{"version":"d221c15d4aae13d314072f859de2ccec2c600a3addc9f2b71b397c83a157e71f","impliedFormat":99},{"version":"dc8a5014726788b50b968d67404dbc7713009040720a04b39c784b43dd8fdacb","impliedFormat":99},{"version":"ea5d08724831aab137fab28195dadf65667aec35acc0f2a5e517271d8c3082d3","affectsGlobalScope":true,"impliedFormat":99},{"version":"009b62c055096dfb3291f2667b8f0984ce480abef01c646e9675868fcec5ac60","impliedFormat":99},{"version":"d86a646352434aa51e337e64e234eab2d28af156bb5931d25c789d0c5dfbcd08","impliedFormat":99},{"version":"d15ab66050babcbb3858c785c437230bd984943b9b2080cd16fe1f0007b4802b","impliedFormat":99},{"version":"d5dc3c765037bfc7bd118be91ad280801f8c01fe41e8b7c8c1d8b96f6a0dc489","impliedFormat":99},{"version":"c6af1103d816d17451bc1a18cb9889fc9a282966383b695927d3ead99d958da0","impliedFormat":99},{"version":"d34287eb61f4689723448d33f50a047769dadee66ec8cb8609b41b17a5b3df40","impliedFormat":99},{"version":"22f52ade1934d26b5db4d5558be99097a82417c0247958527336535930d5a288","impliedFormat":99},{"version":"717d656e46e34696d072f2cee99ca045e69350f3c5ede3193337f884ccbc2a3b","impliedFormat":99},{"version":"b5a53985100fa348fcfb06bad4ee86367168e018998cbf95394a01b2dac92bb7","impliedFormat":99},{"version":"cadea2f7c33f255e142da3b0fefee54fa3985a12471cf9c5c51a221b3844f976","impliedFormat":99},{"version":"46f09e6b30f4301674d1c685934bd4ad2b594085d2545d6f063c175b1dcfd5af","impliedFormat":99},{"version":"25cd3d5fecfed6af5903170b67e8b3531591633e14c5b6735aac0d49e93d7cf0","impliedFormat":99},{"version":"f9fdd230ece877f4bcd8d35240426bcb1482f44faf813e6a336c2cc1b034e58d","impliedFormat":99},{"version":"bcbe66e540446c7fb8b34afe764dae60b28ef929cafe26402594f41a377fac41","impliedFormat":99},{"version":"428ef8df7e77bd4731faa19ef7430823f42bc95abd99368351411541ee08d2f7","impliedFormat":99},{"version":"a8a953cb8cf0b05c91086bd15a383afdfbddbf0cda5ed67d2c55542a5064b69d","impliedFormat":99},{"version":"f5a00483d6aa997ffedb1e802df7c7dcd048e43deab8f75c2c754f4ee3f97b41","impliedFormat":99},{"version":"14da43cd38f32c3b6349d1667937579820f1a3ddb40f3187caa727d4d451dcd4","impliedFormat":99},{"version":"2b77e2bc5350c160c53c767c8e6325ee61da47eda437c1d3156e16df94a64257","impliedFormat":99},{"version":"b0c5a13c0ec9074cdd2f8ed15e6734ba49231eb773330b221083e79e558badb4","impliedFormat":99},{"version":"a2d30f97dcc401dad445fb4f0667a167d1b9c0fdb1132001cc37d379e8946e3c","impliedFormat":99},{"version":"81c859cff06ee38d6f6b8015faa04722b535bb644ea386919d570e0e1f052430","impliedFormat":99},{"version":"05e938c1bc8cc5d2f3b9bb87dc09da7ab8e8e8436f17af7f1672f9b42ab5307d","impliedFormat":99},{"version":"061020cd9bc920fc08a8817160c5cb97b8c852c5961509ed15aab0c5a4faddb3","impliedFormat":99},{"version":"e33bbc0d740e4db63b20fa80933eb78cd305258ebb02b2c21b7932c8df118d3b","impliedFormat":99},{"version":"6795c049a6aaaaeb25ae95e0b9a4c75c8a325bd2b3b40aee7e8f5225533334d4","impliedFormat":99},{"version":"e6081f90b9dc3ff16bcc3fdab32aa361800dc749acc78097870228d8f8fd9920","impliedFormat":99},{"version":"6274539c679f0c9bcd2dbf9e85c5116db6acf91b3b9e1084ce8a17db56a0259a","impliedFormat":99},{"version":"f472753504df7760ad34eafa357007e90c59040e6f6882aae751de7b134b8713","impliedFormat":99},{"version":"dba70304db331da707d5c771e492b9c1db7545eb29a949050a65d0d4fa4a000d","impliedFormat":99},{"version":"a520f33e8a5a92d3847223b2ae2d8244cdb7a6d3d8dfdcc756c5650a38fc30f4","impliedFormat":99},{"version":"76aec992df433e1e56b9899183b4cf8f8216e00e098659dbfbc4d0cbf9054725","impliedFormat":99},{"version":"28fbf5d3fdff7c1dad9e3fd71d4e60077f14134b06253cb62e0eb3ba46f628e3","impliedFormat":99},{"version":"c5340ac3565038735dbf82f6f151a75e8b95b9b1d5664b4fddf0168e4dd9c2f3","impliedFormat":99},{"version":"9481179c799a61aa282d5d48b22421d4d9f592c892f2c6ae2cda7b78595a173e","impliedFormat":99},{"version":"00de25621f1acd5ed68e04bb717a418150779459c0df27843e5a3145ab6aa13d","impliedFormat":99},{"version":"3b0a6f0e693745a8f6fd35bafb8d69f334f3c782a91c8f3344733e2e55ba740d","impliedFormat":99},{"version":"83576f4e2a788f59c217da41b5b7eb67912a400a5ff20aa0622a5c902d23eb75","impliedFormat":99},{"version":"039ee0312b31c74b8fcf0d55b24ef9350b17da57572648580acd70d2e79c0d84","impliedFormat":99},{"version":"6a437bd627ddcb418741f1a279a9db2828cc63c24b4f8586b0473e04f314bee5","impliedFormat":99},{"version":"bb1a27e42875da4a6ff036a9bbe8fca33f88225d9ee5f3c18619bfeabc37c4f4","impliedFormat":99},{"version":"56e07c29328f54e68cf4f6a81bc657ae6b2bbd31c2f53a00f4f0a902fa095ea1","impliedFormat":99},{"version":"ce29026a1ee122328dc9f1b40bff4cf424643fddf8dc6c046f4c71bf97ecf5b5","impliedFormat":99},{"version":"386a071f8e7ca44b094aba364286b65e6daceba25347afb3b7d316a109800393","impliedFormat":99},{"version":"6ba3f7fc791e73109b8c59ae17b1e013ab269629a973e78812e0143e4eab48b2","impliedFormat":99},{"version":"042dbb277282e4cb651b7a5cde8a07c01a7286d41f585808afa98c2c5adae7e0","impliedFormat":99},{"version":"0952d2faef01544f6061dd15d81ae53bfb9d3789b9def817f0019731e139bda8","impliedFormat":99},{"version":"8ec4b0ca2590204f6ef4a26d77c5c8b0bba222a5cd80b2cb3aa3016e3867f9ce","impliedFormat":99},{"version":"15d389a1ee1f700a49260e38736c8757339e5d5e06ca1409634242c1a7b0602e","impliedFormat":99},{"version":"f868b2a12bbe4356e2fd57057ba0619d88f1496d2b884a4f22d8bab3e253dbf5","impliedFormat":99},{"version":"a474bc8c71919a09c0d27ad0cba92e5e3e754dc957bec9c269728c9a4a4cf754","impliedFormat":99},{"version":"e732c6a46c6624dbbd56d3f164d6afdfe2b6007c6709bb64189ce057d03d30fd","impliedFormat":99},{"version":"5c425f77a2867b5d7026875328f13736e3478b0cc6c092787ac3a8dcc8ff0d42","impliedFormat":99},{"version":"b6d1738ae0dd427debbb3605ba03c30ceb76d4cefc7bd5f437004f6f4c622e38","impliedFormat":99},{"version":"6629357b7dd05ee4367a71962a234d508fa0fb99fbbad83fdbf3e64aa6e77104","impliedFormat":99},{"version":"5f8b299ecc1852b7b6eb9682a05f2dbfaae087e3363ecfbb9430350be32a97dc","impliedFormat":99},{"version":"6e304bbf3302fb015164bb3a7c7dfca6b3fdf57b1d56809173fed3663b42ced4","impliedFormat":99},{"version":"cd6aab42fef5395a16795cf23bbc9645dc9786af2c08dac3d61234948f72c67d","impliedFormat":99},{"version":"fe1f9b28ceb4ff76facbe0c363888d33d8265a0beb6fb5532a6e7a291490c795","impliedFormat":99},{"version":"b1d6ee25d690d99f44fd9c1c831bcdb9c0354f23dab49e14cdcfe5d0212bcba0","impliedFormat":99},{"version":"488958cf5865bce05ac5343cf1607ad7af72486a351c3afc7756fdd9fdafa233","impliedFormat":99},{"version":"424a44fb75e76db02794cf0e26c61510daf8bf4d4b43ebbeb6adc70be1dd68b4","impliedFormat":99},{"version":"519f0d3b64727722e5b188c679c1f741997be640fdcd30435a2c7ba006667d6e","impliedFormat":99},{"version":"49324b7e03d2c9081d66aef8b0a8129f0244ecac4fb11378520c9816d693ce7a","impliedFormat":99},{"version":"bbe31d874c9a2ac21ea0c5cee6ded26697f30961dca6f18470145b1c8cd66b21","impliedFormat":99},{"version":"38a5641908bc748e9829ab1d6147239a3797918fab932f0aa81543d409732990","impliedFormat":99},{"version":"125da449b5464b2873f7642e57452ac045a0219f0cb6a5d3391a15cc4336c471","impliedFormat":99},{"version":"d1cacc1ae76a3698129f4289657a18de22057bb6c00e7bf36aa2e9c5365eec66","impliedFormat":99},{"version":"0468caf7769824cd6ddd202c5f37c574bcc3f5c158ef401b71ca3ece8de5462f","impliedFormat":99},{"version":"966a181ee1c0cecd2aaa9cf8281f3b8036d159db7963788a7bfae78937c62717","impliedFormat":99},{"version":"8d11b30c4b66b9524db822608d279dc5e2b576d22ee21ee735a9b9a604524873","impliedFormat":99},{"version":"dac1ccee916195518aa964a933af099be396eaca9791dab44af01eb3209b9930","impliedFormat":99},{"version":"f95e4d1e6d3c5cbbbf6e216ea4742138e52402337eb3416170eabb2fdbe5c762","impliedFormat":99},{"version":"22b43e7fd932e3aa63e5bee8247d408ad1e5a29fe8008123dc6a4bd35ea49ded","impliedFormat":99},{"version":"aeea49091e71d123a471642c74a5dc4d8703476fd6254002d27c75728aa13691","impliedFormat":99},{"version":"0d4db4b482d5dec495943683ba3b6bb4026747a351c614fafdbaf54c00c5adab","impliedFormat":99},{"version":"45ac0268333f7bf8098595cda739764c429cd5d182ae4a127b3ca33405f81431","impliedFormat":99},{"version":"253c3549b055ad942ee115bef4c586c0c56e6b11aeb6353f171c7f0ffec8df07","impliedFormat":99},{"version":"0f1791a8891729f010e49f29b921b05afd45e5ba8430663c8ece4edeee748b1b","impliedFormat":99},{"version":"dfa585104fc407014e2a9ceafb748a50284fb282a561e9d8eb08562e64b1cb24","impliedFormat":99},{"version":"51130d85941585df457441c29e8f157ddc01e4978573a02a806a04c687b6748a","impliedFormat":99},{"version":"40f0d41f453dc614b2a3c552e7aca5ce723bb84d6e6bca8a6dcad1dca4cd9449","impliedFormat":99},{"version":"404627849c9714a78663bd299480dd94e75e457f5322caf0c7e169e5adab0a18","impliedFormat":99},{"version":"208306f454635e47d72092763c801f0ffcb7e6cba662d553eee945bd50987bb1","impliedFormat":99},{"version":"8b5a27971e8ede37415e42f24aae6fd227c2a1d2a93d6b8c7791a13abcde0f0b","impliedFormat":99},{"version":"1c106d58790bab5e144b35eeb31186f2be215d651e4000586fc021140cd324b9","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"c140653685b9af4f01e4283dd9d759126cb15f1c41721270c0bdbb55fd72673f","impliedFormat":99},{"version":"5844202ecdcea1f8612a826905623d93add56c9c1988df6471dff9999d92c0a7","impliedFormat":99},{"version":"b268ce0a7f489c27d8bf748c2563fd81092ead98e4c30f673670297250b774bd","impliedFormat":99},{"version":"9b0ca5de920ec607eecea5b40402fca8e705dfb3ff5e72cc91e2ac6d8f390985","impliedFormat":99},{"version":"efad5849e64223db373bbabc5eb6b2566d16e3bd34c0fd29ccf8bbe8a8a655e7","impliedFormat":99},{"version":"4c1c9ab197c2596bace50281bacf3ce3276f22aaef1c8398af0137779b577f24","impliedFormat":99},{"version":"a1acd535289b4cca0466376c1af5a99d887c91483792346be3b0b58d5f72eead","impliedFormat":99},{"version":"cdb6a1ed879f191ad45615cb4b7e7935237de0cfb8d410c7eb1fd9707d9c17ac","impliedFormat":99},{"version":"ca1debd87d50ade2eba2d0594eb47ab98e050a9fa08f879c750d80863dd3ce4c","impliedFormat":99},{"version":"dc01a3cc4787313606d58b1c6f3a4c5bf0d3fe4e3789dfdcde28d59bfd9b7c59","impliedFormat":99},{"version":"73ab9b053ad2a5ddee2f4c9b8cd36a436974dd5fa5a7c74940dd6b92e4d8e02d","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"fbf43977fd4aead581f1ef81146a4ff6fafe6bec7fac2b4cbd5a00577ab0c1c7","impliedFormat":99},{"version":"2ae4378b3e906557e1b319ca96b23978ee517a71f830be14c99d3a8f23c961b0","signature":"999142549785919344c29d95c5beeab0df338cd9ef20c5a8e039b6d48c115c43"},{"version":"fb380a470b6457adcdf883f05888ea83f378f47a17b775851190cf2160fdfee2","signature":"a2e6dfa4b803a333e731d8a788e65f450254958209ac445a8ed160d7f80b08b1"},{"version":"fc8e720e22b8f9ba80bdcdd3b140a641dc0de4aa647715175dab6422f6992859","signature":"b5287a80d647fb84acefa319a409b6da2da1be86bfcaeaabfc2a1d10218b5565"},{"version":"c189c903a1eb9620083188f005016fafef46ec9f65a6c93b356122251e7c83a8","signature":"a66b08d5957056956a73d0da1f1a25d94a8deee8fc0dda21b2426949651918d3"},{"version":"aa33f2f6c925e57e552e0fe8874fb6a6decbb4b2bd34e2beaac825b17e6cac2d","signature":"82908493d1cb77532ce657dc02cbac73e795d0dc2ea22b7c1063f74ba1630ecb"},{"version":"73b9b29841e031dc8c816b5d1d1621c593a698a9ad0a26c207c455291ef7b207","signature":"f3715d591e74f76c70a85952c3202591fc8ade3b5387b52eb54a9a4ccab18230"},{"version":"9f4f4abe3cbc04061e888728f4d5b974205a456f07c4681e7b13f24b58d53a93","signature":"a18e6dc5937faa74052fdf06c72bce89458199c01fe144ec7fa05bd54f42d959"},{"version":"465f1ca1f11e6a1b01b043a93196b7f8fc09c985b8e3084804d9a3938aad588d","impliedFormat":1},{"version":"00b72e597dcd6ff7bf772918c78c41dc7c68e239af658cf452bff645ebdc485d","impliedFormat":1},{"version":"17b183b69a3dd3cca2505cee7ff70501c574343ad49a385c9acb5b5299e1ba73","impliedFormat":1},{"version":"b26d3fa6859459f64c93e0c154bfc7a8b216b4cf1e241ca6b67e67ee8248626b","impliedFormat":1},{"version":"91cab3f4d6ab131c74ea8772a8c182bdb9c52500fb0388ef9fd2828c084b8087","impliedFormat":1},{"version":"13b8acfead5a8519fad35e43f58c62b946a24f2a1311254250b840b15b2051cd","impliedFormat":99},{"version":"ef8d3fb4ff7fc7cb05c14d56d1d5432564b5a4abe32aab5a65a4c5bb0fa87533","signature":"eff01d2bd4cee37bf7a0690ab7d9d17b258ce2b6570e2dd5276214e939760d6b"}],"root":[[286,292],299],"options":{"esModuleInterop":true,"module":1,"skipLibCheck":true,"strict":true,"target":7},"referencedMap":[[253,1],[266,2],[265,3],[264,1],[263,4],[252,5],[251,6],[281,7],[285,8],[282,9],[283,10],[284,11],[280,12],[236,13],[237,13],[238,13],[239,13],[248,14],[222,13],[267,15],[247,16],[240,13],[241,13],[242,13],[223,17],[279,13],[243,13],[244,18],[245,19],[246,18],[224,20],[277,21],[278,22],[275,23],[273,24],[271,25],[270,26],[274,27],[276,28],[269,28],[272,28],[268,29],[250,30],[234,31],[235,31],[233,32],[231,33],[232,32],[229,34],[249,35],[230,36],[262,37],[260,38],[261,39],[259,40],[254,41],[258,42],[256,43],[255,13],[257,44],[221,13],[211,13],[212,13],[220,13],[177,45],[181,45],[178,13],[182,46],[179,13],[180,47],[228,48],[227,49],[225,36],[226,50],[183,51],[199,52],[207,53],[205,3],[201,54],[204,55],[203,3],[202,56],[206,54],[200,3],[198,57],[188,3],[191,58],[190,59],[189,13],[196,60],[187,59],[184,59],[195,59],[192,61],[194,13],[193,13],[197,59],[186,62],[219,63],[213,64],[214,65],[210,66],[209,66],[216,65],[215,65],[218,64],[217,64],[208,67],[176,68],[116,69],[117,69],[118,70],[56,71],[119,72],[120,73],[121,74],[54,13],[122,75],[123,76],[124,77],[125,78],[126,79],[127,80],[128,80],[129,81],[130,82],[131,83],[132,84],[57,13],[55,13],[133,85],[134,86],[135,87],[175,88],[136,89],[137,90],[138,89],[139,91],[140,92],[141,93],[142,94],[143,94],[144,94],[145,95],[146,96],[147,97],[148,98],[149,99],[150,100],[151,100],[152,101],[153,13],[154,13],[155,102],[156,103],[157,102],[158,104],[159,105],[160,106],[161,107],[162,108],[163,109],[164,110],[165,111],[166,112],[167,113],[168,114],[169,115],[170,116],[171,117],[172,118],[58,89],[59,13],[60,119],[61,120],[62,13],[63,121],[64,13],[107,122],[108,123],[109,124],[110,124],[111,125],[112,13],[113,72],[114,126],[115,123],[173,127],[174,128],[297,129],[298,130],[293,13],[294,13],[296,131],[295,132],[65,13],[185,13],[51,13],[52,13],[10,13],[8,13],[9,13],[14,13],[13,13],[2,13],[15,13],[16,13],[17,13],[18,13],[19,13],[20,13],[21,13],[22,13],[3,13],[23,13],[24,13],[4,13],[25,13],[29,13],[26,13],[27,13],[28,13],[30,13],[31,13],[32,13],[5,13],[33,13],[34,13],[35,13],[36,13],[6,13],[40,13],[37,13],[38,13],[39,13],[41,13],[7,13],[42,13],[53,13],[47,13],[48,13],[43,13],[44,13],[45,13],[46,13],[1,13],[49,13],[50,13],[12,13],[11,13],[83,133],[95,134],[81,135],[96,136],[105,137],[72,138],[73,139],[71,140],[104,68],[99,141],[103,142],[75,143],[92,144],[74,145],[102,146],[69,147],[70,141],[76,148],[77,13],[82,149],[80,148],[67,150],[106,151],[97,152],[86,153],[85,148],[87,154],[90,155],[84,156],[88,157],[100,68],[78,158],[79,159],[91,160],[68,136],[94,161],[93,148],[89,162],[98,13],[66,13],[101,163],[288,164],[286,120],[292,165],[290,13],[291,166],[289,13],[287,167],[299,168]],"affectedFilesPendingEmit":[288,286,292,290,291,289,287,299],"version":"5.9.3"} \ No newline at end of file From 2231f39d2bb64d6d8e9179b59b1f2eaf8f50eb44 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 00:01:52 -0600 Subject: [PATCH 05/77] fix(ertp-ledgerguise): inject clock for transfer timestamps --- packages/ertp-ledgerguise/src/db-helpers.ts | 3 ++- packages/ertp-ledgerguise/src/index.ts | 15 +++++++++++---- packages/ertp-ledgerguise/src/types.ts | 8 ++++++++ .../ertp-ledgerguise/test/ledgerguise.test.ts | 15 ++++++++++----- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index 086a66c..a95d7a7 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -62,6 +62,7 @@ export const makeTransferRecorder = ( commodityGuid: Guid, balanceAccountGuid: Guid, makeGuid: () => Guid, + nowMs: () => number, ) => { const recordSplit = (txGuid: Guid, accountGuid: Guid, amount: bigint) => { const splitGuid = makeGuid(); @@ -76,7 +77,7 @@ export const makeTransferRecorder = ( }; const recordTransaction = (txGuid: Guid, amount: bigint) => { - const now = new Date().toISOString().slice(0, 19); + const now = new Date(nowMs()).toISOString().slice(0, 19); db.prepare( [ 'INSERT INTO transactions(', diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 3d92320..2ec6dfb 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -48,6 +48,7 @@ const makeIssuerKitForCommodity = ( db: Database, commodityGuid: Guid, makeGuid: () => Guid, + nowMs: () => number, ): IssuerKitForCommodity => { const { freeze } = Object; // TODO: consider validation of DB capability and schema. @@ -68,6 +69,7 @@ const makeIssuerKitForCommodity = ( commodityGuid, balanceAccountGuid, makeGuid, + nowMs, ); const { makePurse, purseGuids } = makePurseFactory({ db, @@ -128,11 +130,16 @@ const makeIssuerKitForCommodity = ( * The returned kit includes `commodityGuid` and a `purses.getGuid()` facet. */ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseGuids => { - const { db, commodity, makeGuid } = config; + const { db, commodity, makeGuid, nowMs } = config; // TODO: consider validation of DB capability and schema. const commodityGuid = makeGuid(); ensureCommodityRow(db, commodityGuid, commodity); - const { kit, purseGuids } = makeIssuerKitForCommodity(db, commodityGuid, makeGuid); + const { kit, purseGuids } = makeIssuerKitForCommodity( + db, + commodityGuid, + makeGuid, + nowMs, + ); const purses = freezeProps({ getGuid: (purse: unknown) => { const guid = purseGuids.get(purse as AccountPurse); @@ -147,9 +154,9 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG * Open an existing commodity by GUID and return the kit plus account access. */ export const openIssuerKit = (config: OpenIssuerConfig): IssuerKitForCommodity => { - const { db, commodityGuid, makeGuid } = config; + const { db, commodityGuid, makeGuid, nowMs } = config; // TODO: consider validation of DB capability and schema. // TODO: verify commodity record matches expected issuer/brand metadata. // TODO: add a commodity-vs-currency option (namespace, fraction defaults, and naming rules). - return makeIssuerKitForCommodity(db, commodityGuid, makeGuid); + return makeIssuerKitForCommodity(db, commodityGuid, makeGuid, nowMs); }; diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index 15e33a5..243054b 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -17,6 +17,10 @@ export type CreateIssuerConfig = { * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. */ makeGuid: () => Guid; + /** + * Injected clock returning milliseconds since epoch. + */ + nowMs: () => number; }; export type OpenIssuerConfig = { @@ -26,6 +30,10 @@ export type OpenIssuerConfig = { * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. */ makeGuid: () => Guid; + /** + * Injected clock returning milliseconds since epoch. + */ + nowMs: () => number; }; export type AmountLike = { value: bigint }; diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index 59ef0d6..01226f6 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -38,8 +38,9 @@ test('brand.isMyIssuer rejects unrelated issuers', async t => { namespace: 'COMMODITY', mnemonic: 'BUCKS', }); - const kit = createIssuerKit(freeze({ db, commodity, makeGuid })); - const other = createIssuerKit(freeze({ db, commodity, makeGuid })); + const nowMs = () => 0; + const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const other = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); t.true(await kit.brand.isMyIssuer(kit.issuer)); t.false(await kit.brand.isMyIssuer(other.issuer)); @@ -61,7 +62,8 @@ test('alice sends 10 to bob', t => { namespace: 'COMMODITY', mnemonic: 'BUCKS', }); - const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid })); + const nowMs = () => 0; + const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); const brand = issuedKit.brand as Brand<'nat'>; const bucks = (value: bigint): NatAmount => freeze({ brand, value }); const alicePurse = issuedKit.issuer.makeEmptyPurse(); @@ -93,7 +95,8 @@ test('createIssuerKit persists balances across re-open', t => { }); const [aliceGuid, bobGuid, createdCommodityGuid] = (() => { - const created = createIssuerKit(freeze({ db, commodity, makeGuid })); + const nowMs = () => 0; + const created = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); t.truthy(created.issuer); t.truthy(created.brand); t.truthy(created.mint); @@ -115,7 +118,9 @@ test('createIssuerKit persists balances across re-open', t => { ]; })(); - const reopened = openIssuerKit(freeze({ db, commodityGuid: createdCommodityGuid, makeGuid })); + const reopened = openIssuerKit( + freeze({ db, commodityGuid: createdCommodityGuid, makeGuid, nowMs: () => 0 }), + ); t.is(reopened.accounts.openAccountPurse(aliceGuid).getCurrentAmount().value, 0n); t.is(reopened.accounts.openAccountPurse(bobGuid).getCurrentAmount().value, 10n); }); From cc3ad0ceab349b55e0e2dc2165abc335f1d4b432 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 00:07:47 -0600 Subject: [PATCH 06/77] refactor(ertp-ledgerguise): prefer options objects - refactor helper APIs to use options objects instead of >3 positional args - update call sites to match new helper signatures - document bug-fix and argument-count guidance in CONTRIBUTING --- packages/ertp-ledgerguise/CONTRIBUTING.md | 2 ++ packages/ertp-ledgerguise/src/db-helpers.ts | 38 ++++++++++++++------- packages/ertp-ledgerguise/src/index.ts | 35 ++++++++++++------- packages/ertp-ledgerguise/src/purse.ts | 2 +- 4 files changed, 51 insertions(+), 26 deletions(-) diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index 222c1d8..714a7e2 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -25,6 +25,7 @@ Thanks for your interest in contributing! This package provides an ERTP facade o - Follow existing patterns in this package. - Add succinct comments only when logic is non-obvious. - Keep files ASCII unless the file already uses Unicode. +- Avoid functions with more than 3 positional arguments; prefer a single options/config object with named properties. ## Testing @@ -46,6 +47,7 @@ the mutable let point is not agent tactics; it's code style. likewise API - Always check for static errors before running tests. - Always run all tests relevant to any code changes before asking the user for further input. +- When fixing a bug, capture it with a failing test before applying the fix. - Prefer avoiding mutable `let` for tests; use an IIFE or other pattern so types can be inferred. - Freeze API surface before use: any object literal, array literal, or function literal that escapes its creation context should be frozen (use `const { freeze } = Object;` and `freeze(...)`). Source: Jessie README, "Must freeze API Surface Before Use": https://github.com/endojs/Jessie/blob/main/README.md - Only freeze values you create (literals/functions). Do not freeze objects you receive from elsewhere (e.g., kit or purse objects returned by libraries); treat them as already-sealed API surfaces. diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index a95d7a7..a3f327a 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -23,13 +23,19 @@ export const ensureCommodityRow = ( insert.run(guid, namespace, mnemonic, fullname, fraction, quoteFlag); }; -export const ensureAccountRow = ( - db: Database, - accountGuid: Guid, - name: string, - commodityGuid: Guid, +export const ensureAccountRow = ({ + db, + accountGuid, + name, + commodityGuid, accountType = 'ASSET', -): void => { +}: { + db: Database; + accountGuid: Guid; + name: string; + commodityGuid: Guid; + accountType?: string; +}): void => { db.prepare( [ 'INSERT OR IGNORE INTO accounts(', @@ -57,13 +63,19 @@ export const getAccountBalance = (db: Database, accountGuid: Guid): bigint => { return row ? BigInt(row.qty) : 0n; }; -export const makeTransferRecorder = ( - db: Database, - commodityGuid: Guid, - balanceAccountGuid: Guid, - makeGuid: () => Guid, - nowMs: () => number, -) => { +export const makeTransferRecorder = ({ + db, + commodityGuid, + balanceAccountGuid, + makeGuid, + nowMs, +}: { + db: Database; + commodityGuid: Guid; + balanceAccountGuid: Guid; + makeGuid: () => Guid; + nowMs: () => number; +}) => { const recordSplit = (txGuid: Guid, accountGuid: Guid, amount: bigint) => { const splitGuid = makeGuid(); db.prepare( diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 2ec6dfb..9de528b 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -44,12 +44,17 @@ export const initGnuCashSchema = (db: Database): void => { db.exec(gcEmptySql); }; -const makeIssuerKitForCommodity = ( - db: Database, - commodityGuid: Guid, - makeGuid: () => Guid, - nowMs: () => number, -): IssuerKitForCommodity => { +const makeIssuerKitForCommodity = ({ + db, + commodityGuid, + makeGuid, + nowMs, +}: { + db: Database; + commodityGuid: Guid; + makeGuid: () => Guid; + nowMs: () => number; +}): IssuerKitForCommodity => { const { freeze } = Object; // TODO: consider validation of DB capability and schema. const displayInfo = freeze({ assetKind: 'nat' as const }); @@ -63,14 +68,20 @@ const makeIssuerKitForCommodity = ( }; const getAllegedName = () => getCommodityAllegedName(db, commodityGuid); const balanceAccountGuid = makeDeterministicGuid(`ledgerguise-balance:${commodityGuid}`); - ensureAccountRow(db, balanceAccountGuid, 'Ledgerguise Balance', commodityGuid, 'EQUITY'); - const applyTransfer = makeTransferRecorder( + ensureAccountRow({ + db, + accountGuid: balanceAccountGuid, + name: 'Ledgerguise Balance', + commodityGuid, + accountType: 'EQUITY', + }); + const applyTransfer = makeTransferRecorder({ db, commodityGuid, balanceAccountGuid, makeGuid, nowMs, - ); + }); const { makePurse, purseGuids } = makePurseFactory({ db, commodityGuid, @@ -134,12 +145,12 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG // TODO: consider validation of DB capability and schema. const commodityGuid = makeGuid(); ensureCommodityRow(db, commodityGuid, commodity); - const { kit, purseGuids } = makeIssuerKitForCommodity( + const { kit, purseGuids } = makeIssuerKitForCommodity({ db, commodityGuid, makeGuid, nowMs, - ); + }); const purses = freezeProps({ getGuid: (purse: unknown) => { const guid = purseGuids.get(purse as AccountPurse); @@ -158,5 +169,5 @@ export const openIssuerKit = (config: OpenIssuerConfig): IssuerKitForCommodity = // TODO: consider validation of DB capability and schema. // TODO: verify commodity record matches expected issuer/brand metadata. // TODO: add a commodity-vs-currency option (namespace, fraction defaults, and naming rules). - return makeIssuerKitForCommodity(db, commodityGuid, makeGuid, nowMs); + return makeIssuerKitForCommodity({ db, commodityGuid, makeGuid, nowMs }); }; diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index af949b2..d1b86d6 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -22,7 +22,7 @@ export const makePurseFactory = ({ const purseGuids = new WeakMap(); const makePurse = (accountGuid: Guid, name: string): AccountPurse => { - ensureAccountRow(db, accountGuid, name, commodityGuid); + ensureAccountRow({ db, accountGuid, name, commodityGuid }); const deposit = (payment: object) => { const record = paymentRecords.get(payment); if (!record?.live) throw new Error('payment not live'); From 1bf2c7e004c051f2eca7d910fb90d111356650e8 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 00:15:29 -0600 Subject: [PATCH 07/77] fix(ertp-ledgerguise): enforce Nat amounts - reject negative or non-bigint amounts - add regression test for negative withdraw --- packages/ertp-ledgerguise/src/index.ts | 13 +++++++++- packages/ertp-ledgerguise/src/purse.ts | 4 +++ .../ertp-ledgerguise/test/ledgerguise.test.ts | 26 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 9de528b..4052201 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -56,12 +56,22 @@ const makeIssuerKitForCommodity = ({ nowMs: () => number; }): IssuerKitForCommodity => { const { freeze } = Object; + const Nat = (specimen: bigint) => { + if (typeof specimen !== 'bigint') { + throw new Error('amount must be bigint'); + } + if (specimen < 0n) { + throw new Error('amount must be non-negative'); + } + return specimen; + }; // TODO: consider validation of DB capability and schema. const displayInfo = freeze({ assetKind: 'nat' as const }); const amountShape = freeze({}); const paymentRecords = new WeakMap(); - const makeAmount = (value: bigint) => freeze({ brand, value }); + const makeAmount = (value: bigint) => freeze({ brand, value: Nat(value) }); const makePayment = (amount: bigint) => { + Nat(amount); const payment = freeze({}); paymentRecords.set(payment, { amount, live: true }); return payment; @@ -89,6 +99,7 @@ const makeIssuerKitForCommodity = ({ makePayment, paymentRecords, applyTransfer, + Nat, }); const brand = freezeProps({ isMyIssuer: async (allegedIssuer: object) => allegedIssuer === issuer, diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index d1b86d6..304fbb8 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -9,6 +9,7 @@ type PurseFactoryOptions = { makePayment: (amount: bigint) => object; paymentRecords: WeakMap; applyTransfer: (accountGuid: Guid, amount: bigint) => void; + Nat: (specimen: bigint) => bigint; }; export const makePurseFactory = ({ @@ -18,6 +19,7 @@ export const makePurseFactory = ({ makePayment, paymentRecords, applyTransfer, + Nat, }: PurseFactoryOptions) => { const purseGuids = new WeakMap(); @@ -26,11 +28,13 @@ export const makePurseFactory = ({ const deposit = (payment: object) => { const record = paymentRecords.get(payment); if (!record?.live) throw new Error('payment not live'); + Nat(record.amount); record.live = false; applyTransfer(accountGuid, record.amount); return makeAmount(getAccountBalance(db, accountGuid)); }; const withdraw = (amount: AmountLike) => { + Nat(amount.value); const balance = getAccountBalance(db, accountGuid); if (amount.value > balance) throw new Error('insufficient funds'); applyTransfer(accountGuid, -amount.value); diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index 01226f6..a95dca8 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -77,6 +77,32 @@ test('alice sends 10 to bob', t => { t.is(bobPurse.getCurrentAmount().value, 10n); }); +test('rejects negative withdraw amounts', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const nowMs = () => 0; + const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const brand = issuedKit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + const alicePurse = issuedKit.issuer.makeEmptyPurse(); + + t.throws(() => alicePurse.withdraw(bucks(-10n)), { message: /non-negative/ }); + t.is(alicePurse.getCurrentAmount().value, 0n); +}); + test('createIssuerKit persists balances across re-open', t => { const { freeze } = Object; const db = new Database(':memory:'); From efe02ac3fc0eafc556acf4fe85b2844a5292d960 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 00:15:46 -0600 Subject: [PATCH 08/77] chore: ignore tsbuildinfo artifacts --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index be24838..015be69 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ node_modules/ *.code-workspace *~ .clasp.json +*.tsbuildinfo From 89f735695523e3a1e7a38e62b7d4518363bdc4d2 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 00:28:19 -0600 Subject: [PATCH 09/77] fix(ertp-ledgerguise): prevent account GUID collisions - fail makeEmptyPurse when GUID already exists - add regression test for GUID collision attack --- packages/ertp-ledgerguise/src/db-helpers.ts | 37 +++++++++++++ packages/ertp-ledgerguise/src/index.ts | 10 ++-- packages/ertp-ledgerguise/src/purse.ts | 27 ++++++++-- .../ertp-ledgerguise/test/ledgerguise.test.ts | 52 +++++++++++++++++++ 4 files changed, 117 insertions(+), 9 deletions(-) diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index a3f327a..0b193e0 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -45,6 +45,43 @@ export const ensureAccountRow = ({ ).run(accountGuid, name, accountType, commodityGuid, 1, 0); }; +export const createAccountRow = ({ + db, + accountGuid, + name, + commodityGuid, + accountType = 'ASSET', +}: { + db: Database; + accountGuid: Guid; + name: string; + commodityGuid: Guid; + accountType?: string; +}): void => { + const row = db + .prepare<[string], { guid: string }>('SELECT guid FROM accounts WHERE guid = ?') + .get(accountGuid); + if (row) { + throw new Error('account already exists'); + } + db.prepare( + [ + 'INSERT INTO accounts(', + 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', + ') VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0)', + ].join(' '), + ).run(accountGuid, name, accountType, commodityGuid, 1, 0); +}; + +export const requireAccountRow = (db: Database, accountGuid: Guid): void => { + const row = db + .prepare<[string], { guid: string }>('SELECT guid FROM accounts WHERE guid = ?') + .get(accountGuid); + if (!row) { + throw new Error('account not found'); + } +}; + export const getCommodityAllegedName = (db: Database, commodityGuid: Guid): string => { const row = db .prepare<[string], { fullname: string | null; mnemonic: string }>( diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 4052201..380ea0a 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -92,7 +92,7 @@ const makeIssuerKitForCommodity = ({ makeGuid, nowMs, }); - const { makePurse, purseGuids } = makePurseFactory({ + const { ensurePurse, makeNewPurse, openPurse, purseGuids } = makePurseFactory({ db, commodityGuid, makeAmount, @@ -114,7 +114,7 @@ const makeIssuerKitForCommodity = ({ getDisplayInfo: () => displayInfo, makeEmptyPurse: () => { const accountGuid = makeGuid(); - return makePurse(accountGuid, accountGuid); + return makeNewPurse(accountGuid, accountGuid); }, isLive: async (payment: object) => paymentRecords.get(payment)?.live ?? false, getAmountOf: async (payment: object) => makeAmount(paymentRecords.get(payment)?.amount ?? 0n), @@ -129,7 +129,7 @@ const makeIssuerKitForCommodity = ({ getIssuer: () => issuer, mintPayment: (amount: { value: bigint }) => makePayment(amount.value), }); - const mintRecoveryPurse = makePurse( + const mintRecoveryPurse = ensurePurse( makeDeterministicGuid(`ledgerguise:recovery:${commodityGuid}`), '__mintRecovery', ); @@ -141,8 +141,8 @@ const makeIssuerKitForCommodity = ({ displayInfo, }) as unknown as IssuerKit; const accounts = freezeProps({ - makeAccountPurse: (accountGuid: Guid) => makePurse(accountGuid, accountGuid), - openAccountPurse: (accountGuid: Guid) => makePurse(accountGuid, accountGuid), + makeAccountPurse: (accountGuid: Guid) => makeNewPurse(accountGuid, accountGuid), + openAccountPurse: (accountGuid: Guid) => openPurse(accountGuid, accountGuid), }); return freezeProps({ kit, accounts, purseGuids }); }; diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index 304fbb8..13dd606 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -1,5 +1,10 @@ import { freezeProps } from './jessie-tools'; -import { ensureAccountRow, getAccountBalance } from './db-helpers'; +import { + createAccountRow, + ensureAccountRow, + getAccountBalance, + requireAccountRow, +} from './db-helpers'; import type { AccountPurse, AmountLike, Guid } from './types'; type PurseFactoryOptions = { @@ -23,8 +28,7 @@ export const makePurseFactory = ({ }: PurseFactoryOptions) => { const purseGuids = new WeakMap(); - const makePurse = (accountGuid: Guid, name: string): AccountPurse => { - ensureAccountRow({ db, accountGuid, name, commodityGuid }); + const buildPurse = (accountGuid: Guid, name: string): AccountPurse => { const deposit = (payment: object) => { const record = paymentRecords.get(payment); if (!record?.live) throw new Error('payment not live'); @@ -46,5 +50,20 @@ export const makePurseFactory = ({ return purse; }; - return { makePurse, purseGuids }; + const ensurePurse = (accountGuid: Guid, name: string): AccountPurse => { + ensureAccountRow({ db, accountGuid, name, commodityGuid }); + return buildPurse(accountGuid, name); + }; + + const makeNewPurse = (accountGuid: Guid, name: string): AccountPurse => { + createAccountRow({ db, accountGuid, name, commodityGuid }); + return buildPurse(accountGuid, name); + }; + + const openPurse = (accountGuid: Guid, name: string): AccountPurse => { + requireAccountRow(db, accountGuid); + return buildPurse(accountGuid, name); + }; + + return { ensurePurse, makeNewPurse, openPurse, purseGuids }; }; diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index a95dca8..248f2a4 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -103,6 +103,58 @@ test('rejects negative withdraw amounts', t => { t.is(alicePurse.getCurrentAmount().value, 0n); }); +test('makeEmptyPurse rejects account GUID collisions', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + const commodityGuid = asGuid('a'.repeat(32)); + const victimAccountGuid = asGuid('b'.repeat(32)); + const guidSeq = [commodityGuid, victimAccountGuid]; + const makeGuid = () => { + const guid = guidSeq.shift(); + if (!guid) throw new Error('no more guids'); + return guid; + }; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const nowMs = () => 0; + const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + + const seedAccountBalance = (accountGuid: string, amount: bigint) => { + db.prepare( + [ + 'INSERT INTO accounts(', + 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', + ') VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0)', + ].join(' '), + ).run(accountGuid, 'Victim', 'ASSET', issuedKit.commodityGuid, 1, 0); + const txGuid = asGuid('c'.repeat(32)); + db.prepare( + [ + 'INSERT INTO transactions(', + 'guid, currency_guid, num, post_date, enter_date, description', + ') VALUES (?, ?, ?, ?, ?, ?)', + ].join(' '), + ).run(txGuid, issuedKit.commodityGuid, '', '1970-01-01 00:00:00', '1970-01-01 00:00:00', 'seed'); + db.prepare( + [ + 'INSERT INTO splits(', + 'guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date,', + 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', + ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', + ].join(' '), + ).run(asGuid('d'.repeat(32)), txGuid, accountGuid, '', '', 'n', amount.toString(), 1, amount.toString(), 1); + }; + + seedAccountBalance(victimAccountGuid, 25n); + + t.throws(() => issuedKit.issuer.makeEmptyPurse(), { message: /account/i }); +}); + test('createIssuerKit persists balances across re-open', t => { const { freeze } = Object; const db = new Database(':memory:'); From 5ab097decdfdee58226fd1221ca75e8e68bff2cd Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 00:35:24 -0600 Subject: [PATCH 10/77] docs: planning --- packages/ertp-ledgerguise/CONTRIBUTING.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index 714a7e2..fe212d3 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -8,6 +8,14 @@ Thanks for your interest in contributing! This package provides an ERTP facade o - Relevant ERTP note: mint/purse patterns and amount math are treated as stable, foundational properties for escrow reasoning. - Vbank bridge flow: `packages/cosmic-swingset/README-bridge.md` in agoric-sdk (ERTP transfer via vbank). +## Planning + +- Brainstorm and write down the initial motivation (ERTP + GnuCash insight). +- Scaffold the canonical “Alice sends Bob $10” ERTP test so it fails. +- Make the test pass (starting with the simplest implementation, even if it is not DB-backed yet). +- Capture each new design constraint as a failing test, then make it pass. +- Design adversarial tests that probe for theft, destruction, or misdirection of funds. + ## Scope - Keep changes limited to this package unless the user asks for cross-package updates. From b8b120da47249dc6273e4656edcd26ee655df8d1 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 00:40:45 -0600 Subject: [PATCH 11/77] test(ertp-ledgerguise): add adversarial suite - move attack tests into dedicated file - assert commodity GUID collisions are rejected - fix createIssuerKit to fail on existing commodity --- packages/ertp-ledgerguise/src/db-helpers.ts | 32 +++++ packages/ertp-ledgerguise/src/index.ts | 4 +- .../ertp-ledgerguise/test/adversarial.test.ts | 119 ++++++++++++++++++ .../ertp-ledgerguise/test/ledgerguise.test.ts | 78 ------------ 4 files changed, 153 insertions(+), 80 deletions(-) create mode 100644 packages/ertp-ledgerguise/test/adversarial.test.ts diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index 0b193e0..d5e0e36 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -23,6 +23,38 @@ export const ensureCommodityRow = ( insert.run(guid, namespace, mnemonic, fullname, fraction, quoteFlag); }; +export const createCommodityRow = ({ + db, + guid, + commodity, +}: { + db: Database; + guid: Guid; + commodity: CommoditySpec; +}): void => { + const row = db + .prepare<[string], { guid: string }>('SELECT guid FROM commodities WHERE guid = ?') + .get(guid); + if (row) { + throw new Error('commodity already exists'); + } + const { + namespace = 'COMMODITY', + mnemonic, + fullname = mnemonic, + fraction = 1, + quoteFlag = 0, + } = commodity; + const insert = db.prepare( + [ + 'INSERT INTO commodities(', + 'guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz', + ') VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL)', + ].join(' '), + ); + insert.run(guid, namespace, mnemonic, fullname, fraction, quoteFlag); +}; + export const ensureAccountRow = ({ db, accountGuid, diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 380ea0a..3dc181f 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -21,8 +21,8 @@ import type { OpenIssuerConfig, } from './types'; import { + createCommodityRow, ensureAccountRow, - ensureCommodityRow, getCommodityAllegedName, makeTransferRecorder, } from './db-helpers'; @@ -155,7 +155,7 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG const { db, commodity, makeGuid, nowMs } = config; // TODO: consider validation of DB capability and schema. const commodityGuid = makeGuid(); - ensureCommodityRow(db, commodityGuid, commodity); + createCommodityRow({ db, guid: commodityGuid, commodity }); const { kit, purseGuids } = makeIssuerKitForCommodity({ db, commodityGuid, diff --git a/packages/ertp-ledgerguise/test/adversarial.test.ts b/packages/ertp-ledgerguise/test/adversarial.test.ts new file mode 100644 index 0000000..58eb634 --- /dev/null +++ b/packages/ertp-ledgerguise/test/adversarial.test.ts @@ -0,0 +1,119 @@ +/** + * @file Adversarial tests for authority boundaries. + * @see ../src/index.ts + */ + +import test from 'ava'; +import Database from 'better-sqlite3'; +import type { Brand, NatAmount } from '@agoric/ertp'; +import { asGuid, createIssuerKit, initGnuCashSchema } from '../src/index'; + +const seedAccountBalance = ( + db: import('better-sqlite3').Database, + accountGuid: string, + commodityGuid: string, + amount: bigint, +) => { + db.prepare( + [ + 'INSERT INTO accounts(', + 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', + ') VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0)', + ].join(' '), + ).run(accountGuid, 'Victim', 'ASSET', commodityGuid, 1, 0); + const txGuid = asGuid('c'.repeat(32)); + db.prepare( + [ + 'INSERT INTO transactions(', + 'guid, currency_guid, num, post_date, enter_date, description', + ') VALUES (?, ?, ?, ?, ?, ?)', + ].join(' '), + ).run(txGuid, commodityGuid, '', '1970-01-01 00:00:00', '1970-01-01 00:00:00', 'seed'); + db.prepare( + [ + 'INSERT INTO splits(', + 'guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date,', + 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', + ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', + ].join(' '), + ).run(asGuid('d'.repeat(32)), txGuid, accountGuid, '', '', 'n', amount.toString(), 1, amount.toString(), 1); +}; + +test('rejects negative withdraw amounts', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const nowMs = () => 0; + const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const brand = issuedKit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + const alicePurse = issuedKit.issuer.makeEmptyPurse(); + + t.throws(() => alicePurse.withdraw(bucks(-10n)), { message: /non-negative/ }); + t.is(alicePurse.getCurrentAmount().value, 0n); +}); + +test('makeEmptyPurse rejects account GUID collisions', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + const commodityGuid = asGuid('a'.repeat(32)); + const victimAccountGuid = asGuid('b'.repeat(32)); + const guidSeq = [commodityGuid, victimAccountGuid]; + const makeGuid = () => { + const guid = guidSeq.shift(); + if (!guid) throw new Error('no more guids'); + return guid; + }; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const nowMs = () => 0; + const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + + seedAccountBalance(db, victimAccountGuid, issuedKit.commodityGuid, 25n); + + t.throws(() => issuedKit.issuer.makeEmptyPurse(), { message: /account/i }); +}); + +test('createIssuerKit rejects commodity GUID collisions', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + const existingGuid = asGuid('f'.repeat(32)); + db.prepare( + [ + 'INSERT INTO commodities(', + 'guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz', + ') VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL)', + ].join(' '), + ).run(existingGuid, 'COMMODITY', 'BUCKS', 'BUCKS', 1, 0); + + const makeGuid = () => existingGuid; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const nowMs = () => 0; + + t.throws(() => createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })), { + message: /commodity/i, + }); +}); diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index 248f2a4..01226f6 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -77,84 +77,6 @@ test('alice sends 10 to bob', t => { t.is(bobPurse.getCurrentAmount().value, 10n); }); -test('rejects negative withdraw amounts', t => { - const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); - initGnuCashSchema(db); - - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; - const commodity = freeze({ - namespace: 'COMMODITY', - mnemonic: 'BUCKS', - }); - const nowMs = () => 0; - const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); - const brand = issuedKit.brand as Brand<'nat'>; - const bucks = (value: bigint): NatAmount => freeze({ brand, value }); - const alicePurse = issuedKit.issuer.makeEmptyPurse(); - - t.throws(() => alicePurse.withdraw(bucks(-10n)), { message: /non-negative/ }); - t.is(alicePurse.getCurrentAmount().value, 0n); -}); - -test('makeEmptyPurse rejects account GUID collisions', t => { - const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); - initGnuCashSchema(db); - - const commodityGuid = asGuid('a'.repeat(32)); - const victimAccountGuid = asGuid('b'.repeat(32)); - const guidSeq = [commodityGuid, victimAccountGuid]; - const makeGuid = () => { - const guid = guidSeq.shift(); - if (!guid) throw new Error('no more guids'); - return guid; - }; - const commodity = freeze({ - namespace: 'COMMODITY', - mnemonic: 'BUCKS', - }); - const nowMs = () => 0; - const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); - - const seedAccountBalance = (accountGuid: string, amount: bigint) => { - db.prepare( - [ - 'INSERT INTO accounts(', - 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', - ') VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0)', - ].join(' '), - ).run(accountGuid, 'Victim', 'ASSET', issuedKit.commodityGuid, 1, 0); - const txGuid = asGuid('c'.repeat(32)); - db.prepare( - [ - 'INSERT INTO transactions(', - 'guid, currency_guid, num, post_date, enter_date, description', - ') VALUES (?, ?, ?, ?, ?, ?)', - ].join(' '), - ).run(txGuid, issuedKit.commodityGuid, '', '1970-01-01 00:00:00', '1970-01-01 00:00:00', 'seed'); - db.prepare( - [ - 'INSERT INTO splits(', - 'guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date,', - 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', - ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', - ].join(' '), - ).run(asGuid('d'.repeat(32)), txGuid, accountGuid, '', '', 'n', amount.toString(), 1, amount.toString(), 1); - }; - - seedAccountBalance(victimAccountGuid, 25n); - - t.throws(() => issuedKit.issuer.makeEmptyPurse(), { message: /account/i }); -}); - test('createIssuerKit persists balances across re-open', t => { const { freeze } = Object; const db = new Database(':memory:'); From e7c30667ba8ada53316a43eaa2c8eb5a031417ad Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 00:44:35 -0600 Subject: [PATCH 12/77] fix(ertp-ledgerguise): enforce brand/commodity boundaries - reject withdraw amounts with mismatched brands - reject openAccountPurse for wrong commodity - add adversarial tests for both cases --- packages/ertp-ledgerguise/src/db-helpers.ts | 17 ++++- packages/ertp-ledgerguise/src/index.ts | 13 ++-- packages/ertp-ledgerguise/src/purse.ts | 14 ++-- packages/ertp-ledgerguise/src/types.ts | 2 +- .../ertp-ledgerguise/test/adversarial.test.ts | 65 ++++++++++++++++++- 5 files changed, 99 insertions(+), 12 deletions(-) diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index d5e0e36..6855c3d 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -105,13 +105,26 @@ export const createAccountRow = ({ ).run(accountGuid, name, accountType, commodityGuid, 1, 0); }; -export const requireAccountRow = (db: Database, accountGuid: Guid): void => { +export const requireAccountCommodity = ({ + db, + accountGuid, + commodityGuid, +}: { + db: Database; + accountGuid: Guid; + commodityGuid: Guid; +}): void => { const row = db - .prepare<[string], { guid: string }>('SELECT guid FROM accounts WHERE guid = ?') + .prepare<[string], { commodity_guid: string }>( + 'SELECT commodity_guid FROM accounts WHERE guid = ?', + ) .get(accountGuid); if (!row) { throw new Error('account not found'); } + if (row.commodity_guid !== commodityGuid) { + throw new Error('account commodity mismatch'); + } }; export const getCommodityAllegedName = (db: Database, commodityGuid: Guid): string => { diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 3dc181f..97ae243 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -14,6 +14,7 @@ import { freezeProps } from './jessie-tools'; import { makeDeterministicGuid } from './guids'; import type { AccountPurse, + AmountLike, CreateIssuerConfig, Guid, IssuerKitForCommodity, @@ -70,10 +71,13 @@ const makeIssuerKitForCommodity = ({ const amountShape = freeze({}); const paymentRecords = new WeakMap(); const makeAmount = (value: bigint) => freeze({ brand, value: Nat(value) }); - const makePayment = (amount: bigint) => { - Nat(amount); + const makePayment = (amount: AmountLike) => { + if (amount.brand !== brand) { + throw new Error('amount brand mismatch'); + } + Nat(amount.value); const payment = freeze({}); - paymentRecords.set(payment, { amount, live: true }); + paymentRecords.set(payment, { amount: amount.value, live: true }); return payment; }; const getAllegedName = () => getCommodityAllegedName(db, commodityGuid); @@ -100,6 +104,7 @@ const makeIssuerKitForCommodity = ({ paymentRecords, applyTransfer, Nat, + getBrand: () => brand, }); const brand = freezeProps({ isMyIssuer: async (allegedIssuer: object) => allegedIssuer === issuer, @@ -127,7 +132,7 @@ const makeIssuerKitForCommodity = ({ }); const mint = freezeProps({ getIssuer: () => issuer, - mintPayment: (amount: { value: bigint }) => makePayment(amount.value), + mintPayment: (amount: AmountLike) => makePayment(amount), }); const mintRecoveryPurse = ensurePurse( makeDeterministicGuid(`ledgerguise:recovery:${commodityGuid}`), diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index 13dd606..2978aa0 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -3,7 +3,7 @@ import { createAccountRow, ensureAccountRow, getAccountBalance, - requireAccountRow, + requireAccountCommodity, } from './db-helpers'; import type { AccountPurse, AmountLike, Guid } from './types'; @@ -11,10 +11,11 @@ type PurseFactoryOptions = { db: import('better-sqlite3').Database; commodityGuid: Guid; makeAmount: (value: bigint) => AmountLike; - makePayment: (amount: bigint) => object; + makePayment: (amount: AmountLike) => object; paymentRecords: WeakMap; applyTransfer: (accountGuid: Guid, amount: bigint) => void; Nat: (specimen: bigint) => bigint; + getBrand: () => unknown; }; export const makePurseFactory = ({ @@ -25,10 +26,12 @@ export const makePurseFactory = ({ paymentRecords, applyTransfer, Nat, + getBrand, }: PurseFactoryOptions) => { const purseGuids = new WeakMap(); const buildPurse = (accountGuid: Guid, name: string): AccountPurse => { + const brand = getBrand(); const deposit = (payment: object) => { const record = paymentRecords.get(payment); if (!record?.live) throw new Error('payment not live'); @@ -38,11 +41,14 @@ export const makePurseFactory = ({ return makeAmount(getAccountBalance(db, accountGuid)); }; const withdraw = (amount: AmountLike) => { + if (amount.brand !== brand) { + throw new Error('amount brand mismatch'); + } Nat(amount.value); const balance = getAccountBalance(db, accountGuid); if (amount.value > balance) throw new Error('insufficient funds'); applyTransfer(accountGuid, -amount.value); - return makePayment(amount.value); + return makePayment(amount); }; const getCurrentAmount = () => makeAmount(getAccountBalance(db, accountGuid)); const purse = freezeProps({ deposit, withdraw, getCurrentAmount }); @@ -61,7 +67,7 @@ export const makePurseFactory = ({ }; const openPurse = (accountGuid: Guid, name: string): AccountPurse => { - requireAccountRow(db, accountGuid); + requireAccountCommodity({ db, accountGuid, commodityGuid }); return buildPurse(accountGuid, name); }; diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index 243054b..59d0afb 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -36,7 +36,7 @@ export type OpenIssuerConfig = { nowMs: () => number; }; -export type AmountLike = { value: bigint }; +export type AmountLike = { brand: unknown; value: bigint }; export type AccountPurse = { deposit: (payment: object) => unknown; diff --git a/packages/ertp-ledgerguise/test/adversarial.test.ts b/packages/ertp-ledgerguise/test/adversarial.test.ts index 58eb634..f12274f 100644 --- a/packages/ertp-ledgerguise/test/adversarial.test.ts +++ b/packages/ertp-ledgerguise/test/adversarial.test.ts @@ -6,7 +6,7 @@ import test from 'ava'; import Database from 'better-sqlite3'; import type { Brand, NatAmount } from '@agoric/ertp'; -import { asGuid, createIssuerKit, initGnuCashSchema } from '../src/index'; +import { asGuid, createIssuerKit, initGnuCashSchema, openIssuerKit } from '../src/index'; const seedAccountBalance = ( db: import('better-sqlite3').Database, @@ -117,3 +117,66 @@ test('createIssuerKit rejects commodity GUID collisions', t => { message: /commodity/i, }); }); + +test('withdraw rejects wrong-brand amounts', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const nowMs = () => 0; + const bucks = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); + const credits = freeze({ namespace: 'COMMODITY', mnemonic: 'CREDITS' }); + + const bucksKit = createIssuerKit(freeze({ db, commodity: bucks, makeGuid, nowMs })); + const creditsKit = createIssuerKit(freeze({ db, commodity: credits, makeGuid, nowMs })); + + const bucksBrand = bucksKit.brand as Brand<'nat'>; + const bucksAmount = (value: bigint): NatAmount => freeze({ brand: bucksBrand, value }); + const creditsBrand = creditsKit.brand as Brand<'nat'>; + const creditsAmount = (value: bigint): NatAmount => freeze({ brand: creditsBrand, value }); + + const purse = bucksKit.issuer.makeEmptyPurse(); + const payment = bucksKit.mint.mintPayment(bucksAmount(10n)); + purse.deposit(payment); + + t.throws(() => purse.withdraw(creditsAmount(1n)), { message: /brand/i }); +}); + +test('openAccountPurse rejects wrong-commodity accounts', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const nowMs = () => 0; + const bucks = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); + const credits = freeze({ namespace: 'COMMODITY', mnemonic: 'CREDITS' }); + + const bucksKit = createIssuerKit(freeze({ db, commodity: bucks, makeGuid, nowMs })); + const creditsKit = createIssuerKit(freeze({ db, commodity: credits, makeGuid, nowMs })); + const accountGuid = (() => { + const purse = bucksKit.issuer.makeEmptyPurse(); + return bucksKit.purses.getGuid(purse); + })(); + + const creditsAccess = openIssuerKit( + freeze({ db, commodityGuid: creditsKit.commodityGuid, makeGuid, nowMs }), + ); + + t.throws(() => creditsAccess.accounts.openAccountPurse(accountGuid), { + message: /commodity/i, + }); +}); From cd5d4280ba47680d46d81874f9b422e0692e4cbc Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 01:42:14 -0600 Subject: [PATCH 13/77] feat(ertp-ledgerguise): hold-and-finalize transfers - model payments as hold txs retargeted on deposit - assert single-tx split behavior and holding guard - document hold decision in IBIS --- packages/ertp-ledgerguise/CONTRIBUTING.md | 21 ++++++ packages/ertp-ledgerguise/src/db-helpers.ts | 62 +++++++++++++++-- packages/ertp-ledgerguise/src/index.ts | 68 ++++++++++++++++--- packages/ertp-ledgerguise/src/purse.ts | 32 ++++++--- .../ertp-ledgerguise/test/adversarial.test.ts | 31 +++++++++ .../ertp-ledgerguise/test/ledgerguise.test.ts | 56 +++++++++++++++ 6 files changed, 244 insertions(+), 26 deletions(-) diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index fe212d3..1bc96e8 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -34,6 +34,7 @@ Thanks for your interest in contributing! This package provides an ERTP facade o - Add succinct comments only when logic is non-obvious. - Keep files ASCII unless the file already uses Unicode. - Avoid functions with more than 3 positional arguments; prefer a single options/config object with named properties. +- Use JSDoc docstrings when attaching documentation to declarations or parameters; reserve `//` comments for implementation details. ## Testing @@ -85,6 +86,26 @@ Consequences: - Tests should allow in-memory sync adapters first, with async-capable adapters introduced later. - The facade should avoid hidden filesystem opens; pass DB capabilities explicitly (ocap discipline). +## IBIS: Payment holds vs immediate transfers + +Issue: How should in-flight payments be represented in the GnuCash ledger? + +Position A (account-to-account only, no holds): +- Only record direct account-to-account transfers at deposit time. +- Avoids “hold” rows but loses in-flight payment durability and makes GC destroy value. +- Requires deferred ledger writes, which hides exposure windows. + +Position B (mutable hold transaction): +- Record a hold transaction at withdraw time from source to a holding account. +- On deposit, update the holding split to the destination account and mark splits cleared. +- Preserves a single transaction per payment while keeping a durable record. + +Decision: Use the mutable hold transaction approach with a holding account and reconcile-state updates. + +Consequences: +- Transfers remain auditable via a single tx with two splits after deposit. +- We accept that split destination mutation is part of the model and must be tested. + ## Documentation - Update package docs or README when behavior or public API changes. diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index 6855c3d..08377ba 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -145,20 +145,32 @@ export const getAccountBalance = (db: Database, accountGuid: Guid): bigint => { return row ? BigInt(row.qty) : 0n; }; +/** + * Create a recorder that writes a balanced transaction for an account transfer. + * + * The returned recorder creates a hold transaction (source -> holding) and can + * later finalize it by retargeting the holding split to the destination and + * marking the splits cleared. + */ export const makeTransferRecorder = ({ db, commodityGuid, - balanceAccountGuid, + holdingAccountGuid, makeGuid, nowMs, }: { db: Database; commodityGuid: Guid; - balanceAccountGuid: Guid; + holdingAccountGuid: Guid; makeGuid: () => Guid; nowMs: () => number; }) => { - const recordSplit = (txGuid: Guid, accountGuid: Guid, amount: bigint) => { + const recordSplit = ( + txGuid: Guid, + accountGuid: Guid, + amount: bigint, + reconcileState = 'n', + ) => { const splitGuid = makeGuid(); db.prepare( [ @@ -167,7 +179,19 @@ export const makeTransferRecorder = ({ 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', ].join(' '), - ).run(splitGuid, txGuid, accountGuid, '', '', 'n', amount.toString(), 1, amount.toString(), 1); + ).run( + splitGuid, + txGuid, + accountGuid, + '', + '', + reconcileState, + amount.toString(), + 1, + amount.toString(), + 1, + ); + return splitGuid; }; const recordTransaction = (txGuid: Guid, amount: bigint) => { @@ -181,10 +205,34 @@ export const makeTransferRecorder = ({ ).run(txGuid, commodityGuid, '', now, now, `ledgerguise ${amount.toString()}`); }; - return (accountGuid: Guid, amount: bigint) => { + const createHold = ({ + fromAccountGuid, + amount, + }: { + fromAccountGuid: Guid; + amount: bigint; + }) => { const txGuid = makeGuid(); recordTransaction(txGuid, amount); - recordSplit(txGuid, accountGuid, amount); - recordSplit(txGuid, balanceAccountGuid, -amount); + const holdingSplitGuid = recordSplit(txGuid, holdingAccountGuid, amount, 'n'); + recordSplit(txGuid, fromAccountGuid, -amount, 'n'); + return { txGuid, holdingSplitGuid }; }; + + const finalizeHold = ({ + txGuid, + holdingSplitGuid, + toAccountGuid, + }: { + txGuid: Guid; + holdingSplitGuid: Guid; + toAccountGuid: Guid; + }) => { + db.prepare( + 'UPDATE splits SET account_guid = ?, reconcile_state = ? WHERE guid = ?', + ).run(toAccountGuid, 'c', holdingSplitGuid); + db.prepare('UPDATE splits SET reconcile_state = ? WHERE tx_guid = ?').run('c', txGuid); + }; + + return { createHold, finalizeHold }; }; diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 97ae243..cf90c36 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -24,6 +24,7 @@ import type { import { createCommodityRow, ensureAccountRow, + getAccountBalance, getCommodityAllegedName, makeTransferRecorder, } from './db-helpers'; @@ -69,15 +70,38 @@ const makeIssuerKitForCommodity = ({ // TODO: consider validation of DB capability and schema. const displayInfo = freeze({ assetKind: 'nat' as const }); const amountShape = freeze({}); - const paymentRecords = new WeakMap(); - const makeAmount = (value: bigint) => freeze({ brand, value: Nat(value) }); - const makePayment = (amount: AmountLike) => { + const paymentRecords = new WeakMap< + object, + { + amount: bigint; + live: boolean; + sourceAccountGuid: Guid; + txGuid: Guid; + holdingSplitGuid: Guid; + } + >(); + const assertAmount = (amount: AmountLike) => { if (amount.brand !== brand) { throw new Error('amount brand mismatch'); } - Nat(amount.value); + return Nat(amount.value); + }; + const makeAmount = (value: bigint) => freeze({ brand, value: Nat(value) }); + const makePayment = ( + amount: AmountLike, + sourceAccountGuid: Guid, + txGuid: Guid, + holdingSplitGuid: Guid, + ) => { + const amountValue = assertAmount(amount); const payment = freeze({}); - paymentRecords.set(payment, { amount: amount.value, live: true }); + paymentRecords.set(payment, { + amount: amountValue, + live: true, + sourceAccountGuid, + txGuid, + holdingSplitGuid, + }); return payment; }; const getAllegedName = () => getCommodityAllegedName(db, commodityGuid); @@ -89,10 +113,10 @@ const makeIssuerKitForCommodity = ({ commodityGuid, accountType: 'EQUITY', }); - const applyTransfer = makeTransferRecorder({ + const transferRecorder = makeTransferRecorder({ db, commodityGuid, - balanceAccountGuid, + holdingAccountGuid: balanceAccountGuid, makeGuid, nowMs, }); @@ -102,7 +126,7 @@ const makeIssuerKitForCommodity = ({ makeAmount, makePayment, paymentRecords, - applyTransfer, + transferRecorder, Nat, getBrand: () => brand, }); @@ -127,12 +151,24 @@ const makeIssuerKitForCommodity = ({ const record = paymentRecords.get(payment); if (!record?.live) throw new Error('payment not live'); record.live = false; + transferRecorder.finalizeHold({ + txGuid: record.txGuid, + holdingSplitGuid: record.holdingSplitGuid, + toAccountGuid: balanceAccountGuid, + }); return makeAmount(record.amount); }, }); const mint = freezeProps({ getIssuer: () => issuer, - mintPayment: (amount: AmountLike) => makePayment(amount), + mintPayment: (amount: AmountLike) => { + const amountValue = assertAmount(amount); + const { txGuid, holdingSplitGuid } = transferRecorder.createHold({ + fromAccountGuid: balanceAccountGuid, + amount: amountValue, + }); + return makePayment(amount, balanceAccountGuid, txGuid, holdingSplitGuid); + }, }); const mintRecoveryPurse = ensurePurse( makeDeterministicGuid(`ledgerguise:recovery:${commodityGuid}`), @@ -146,8 +182,18 @@ const makeIssuerKitForCommodity = ({ displayInfo, }) as unknown as IssuerKit; const accounts = freezeProps({ - makeAccountPurse: (accountGuid: Guid) => makeNewPurse(accountGuid, accountGuid), - openAccountPurse: (accountGuid: Guid) => openPurse(accountGuid, accountGuid), + makeAccountPurse: (accountGuid: Guid) => { + if (accountGuid === balanceAccountGuid) { + throw new Error('holding account is not externally accessible'); + } + return makeNewPurse(accountGuid, accountGuid); + }, + openAccountPurse: (accountGuid: Guid) => { + if (accountGuid === balanceAccountGuid) { + throw new Error('holding account is not externally accessible'); + } + return openPurse(accountGuid, accountGuid); + }, }); return freezeProps({ kit, accounts, purseGuids }); }; diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index 2978aa0..53ea08c 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -3,6 +3,7 @@ import { createAccountRow, ensureAccountRow, getAccountBalance, + makeTransferRecorder, requireAccountCommodity, } from './db-helpers'; import type { AccountPurse, AmountLike, Guid } from './types'; @@ -11,20 +12,28 @@ type PurseFactoryOptions = { db: import('better-sqlite3').Database; commodityGuid: Guid; makeAmount: (value: bigint) => AmountLike; - makePayment: (amount: AmountLike) => object; - paymentRecords: WeakMap; - applyTransfer: (accountGuid: Guid, amount: bigint) => void; + makePayment: ( + amount: AmountLike, + sourceAccountGuid: Guid, + txGuid: Guid, + holdingSplitGuid: Guid, + ) => object; + paymentRecords: WeakMap< + object, + { amount: bigint; live: boolean; sourceAccountGuid: Guid; txGuid: Guid; holdingSplitGuid: Guid } + >; + /** @see makeTransferRecorder */ + transferRecorder: ReturnType; Nat: (specimen: bigint) => bigint; getBrand: () => unknown; }; - export const makePurseFactory = ({ db, commodityGuid, makeAmount, makePayment, paymentRecords, - applyTransfer, + transferRecorder, Nat, getBrand, }: PurseFactoryOptions) => { @@ -37,7 +46,11 @@ export const makePurseFactory = ({ if (!record?.live) throw new Error('payment not live'); Nat(record.amount); record.live = false; - applyTransfer(accountGuid, record.amount); + transferRecorder.finalizeHold({ + txGuid: record.txGuid, + holdingSplitGuid: record.holdingSplitGuid, + toAccountGuid: accountGuid, + }); return makeAmount(getAccountBalance(db, accountGuid)); }; const withdraw = (amount: AmountLike) => { @@ -47,8 +60,11 @@ export const makePurseFactory = ({ Nat(amount.value); const balance = getAccountBalance(db, accountGuid); if (amount.value > balance) throw new Error('insufficient funds'); - applyTransfer(accountGuid, -amount.value); - return makePayment(amount); + const { txGuid, holdingSplitGuid } = transferRecorder.createHold({ + fromAccountGuid: accountGuid, + amount: amount.value, + }); + return makePayment(amount, accountGuid, txGuid, holdingSplitGuid); }; const getCurrentAmount = () => makeAmount(getAccountBalance(db, accountGuid)); const purse = freezeProps({ deposit, withdraw, getCurrentAmount }); diff --git a/packages/ertp-ledgerguise/test/adversarial.test.ts b/packages/ertp-ledgerguise/test/adversarial.test.ts index f12274f..4f81147 100644 --- a/packages/ertp-ledgerguise/test/adversarial.test.ts +++ b/packages/ertp-ledgerguise/test/adversarial.test.ts @@ -180,3 +180,34 @@ test('openAccountPurse rejects wrong-commodity accounts', t => { message: /commodity/i, }); }); + +test('openAccountPurse rejects the holding account', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const nowMs = () => 0; + const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); + const created = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const reopened = openIssuerKit( + freeze({ db, commodityGuid: created.commodityGuid, makeGuid, nowMs }), + ); + + const row = db + .prepare<[string, string], { guid: string }>( + 'SELECT guid FROM accounts WHERE name = ? AND commodity_guid = ?', + ) + .get('Ledgerguise Balance', created.commodityGuid); + t.truthy(row?.guid); + + t.throws(() => reopened.accounts.openAccountPurse(asGuid(row!.guid)), { + message: /holding/i, + }); +}); diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index 01226f6..b46811e 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -77,6 +77,62 @@ test('alice sends 10 to bob', t => { t.is(bobPurse.getCurrentAmount().value, 10n); }); +test('alice-to-bob transfer records a single transaction', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const nowMs = () => 0; + const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const brand = issuedKit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + const alicePurse = issuedKit.issuer.makeEmptyPurse(); + const bobPurse = issuedKit.issuer.makeEmptyPurse(); + const aliceGuid = issuedKit.purses.getGuid(alicePurse); + const bobGuid = issuedKit.purses.getGuid(bobPurse); + + const payment = issuedKit.mint.mintPayment(bucks(10n)); + alicePurse.deposit(payment); + bobPurse.deposit(alicePurse.withdraw(bucks(10n))); + + const txRows = db + .prepare< + [string, string], + { tx_guid: string; alice_count: number; bob_count: number; split_count: number } + >( + [ + 'SELECT tx_guid,', + 'SUM(CASE WHEN account_guid = ? THEN 1 ELSE 0 END) AS alice_count,', + 'SUM(CASE WHEN account_guid = ? THEN 1 ELSE 0 END) AS bob_count,', + 'COUNT(*) AS split_count', + 'FROM splits', + 'GROUP BY tx_guid', + 'HAVING alice_count > 0 AND bob_count > 0', + ].join(' '), + ) + .all(aliceGuid, bobGuid); + t.is(txRows.length, 1); + t.is(txRows[0].split_count, 2); + const splits = db + .prepare<[string], { reconcile_state: string }>( + 'SELECT reconcile_state FROM splits WHERE tx_guid = ?', + ) + .all(txRows[0].tx_guid); + t.is(splits.length, 2); + t.true(splits.every(split => split.reconcile_state === 'c')); +}); + test('createIssuerKit persists balances across re-open', t => { const { freeze } = Object; const db = new Database(':memory:'); From 3adff1b0ae189c29b3d3b216545dad549d103c3b Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 01:51:14 -0600 Subject: [PATCH 14/77] feat(ertp-ledgerguise): reify payments by check number - store check numbers in transactions and payment records - add payments facet with getCheckNumber/openPayment - test payment reification across reopen --- packages/ertp-ledgerguise/src/db-helpers.ts | 11 ++- packages/ertp-ledgerguise/src/index.ts | 74 +++++++++++++++++-- packages/ertp-ledgerguise/src/purse.ts | 14 +++- packages/ertp-ledgerguise/src/types.ts | 7 ++ .../ertp-ledgerguise/test/ledgerguise.test.ts | 42 +++++++++++ 5 files changed, 136 insertions(+), 12 deletions(-) diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index 08377ba..1f5ef0b 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -194,7 +194,7 @@ export const makeTransferRecorder = ({ return splitGuid; }; - const recordTransaction = (txGuid: Guid, amount: bigint) => { + const recordTransaction = (txGuid: Guid, amount: bigint, checkNumber: string) => { const now = new Date(nowMs()).toISOString().slice(0, 19); db.prepare( [ @@ -202,21 +202,24 @@ export const makeTransferRecorder = ({ 'guid, currency_guid, num, post_date, enter_date, description', ') VALUES (?, ?, ?, ?, ?, ?)', ].join(' '), - ).run(txGuid, commodityGuid, '', now, now, `ledgerguise ${amount.toString()}`); + ).run(txGuid, commodityGuid, checkNumber, now, now, `ledgerguise ${amount.toString()}`); }; const createHold = ({ fromAccountGuid, amount, + checkNumber, }: { fromAccountGuid: Guid; amount: bigint; + checkNumber?: string; }) => { const txGuid = makeGuid(); - recordTransaction(txGuid, amount); + const resolvedCheckNumber = checkNumber ?? txGuid; + recordTransaction(txGuid, amount, resolvedCheckNumber); const holdingSplitGuid = recordSplit(txGuid, holdingAccountGuid, amount, 'n'); recordSplit(txGuid, fromAccountGuid, -amount, 'n'); - return { txGuid, holdingSplitGuid }; + return { txGuid, holdingSplitGuid, checkNumber: resolvedCheckNumber }; }; const finalizeHold = ({ diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index cf90c36..24683c3 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -78,6 +78,7 @@ const makeIssuerKitForCommodity = ({ sourceAccountGuid: Guid; txGuid: Guid; holdingSplitGuid: Guid; + checkNumber: string; } >(); const assertAmount = (amount: AmountLike) => { @@ -92,6 +93,7 @@ const makeIssuerKitForCommodity = ({ sourceAccountGuid: Guid, txGuid: Guid, holdingSplitGuid: Guid, + checkNumber: string, ) => { const amountValue = assertAmount(amount); const payment = freeze({}); @@ -101,6 +103,7 @@ const makeIssuerKitForCommodity = ({ sourceAccountGuid, txGuid, holdingSplitGuid, + checkNumber, }); return payment; }; @@ -163,11 +166,11 @@ const makeIssuerKitForCommodity = ({ getIssuer: () => issuer, mintPayment: (amount: AmountLike) => { const amountValue = assertAmount(amount); - const { txGuid, holdingSplitGuid } = transferRecorder.createHold({ + const { txGuid, holdingSplitGuid, checkNumber } = transferRecorder.createHold({ fromAccountGuid: balanceAccountGuid, amount: amountValue, }); - return makePayment(amount, balanceAccountGuid, txGuid, holdingSplitGuid); + return makePayment(amount, balanceAccountGuid, txGuid, holdingSplitGuid, checkNumber); }, }); const mintRecoveryPurse = ensurePurse( @@ -181,6 +184,67 @@ const makeIssuerKitForCommodity = ({ mintRecoveryPurse, displayInfo, }) as unknown as IssuerKit; + const payments = freezeProps({ + getCheckNumber: (payment: unknown) => { + const record = paymentRecords.get(payment as object); + if (!record) throw new Error('unknown payment'); + return record.checkNumber; + }, + openPayment: (checkNumber: string) => { + const rows = db + .prepare<[string], { guid: string }>('SELECT guid FROM transactions WHERE num = ?') + .all(checkNumber); + if (rows.length !== 1) { + throw new Error('payment check number not unique'); + } + const txGuid = rows[0]?.guid as Guid | undefined; + if (!txGuid) { + throw new Error('payment not found'); + } + const holdingSplit = db + .prepare< + [string, string], + { guid: string; account_guid: string; quantity_num: string; reconcile_state: string } + >( + [ + 'SELECT guid, account_guid, quantity_num, reconcile_state', + 'FROM splits', + 'WHERE tx_guid = ? AND account_guid = ?', + ].join(' '), + ) + .get(txGuid, balanceAccountGuid); + if (!holdingSplit) { + throw new Error('payment not live'); + } + if (holdingSplit.reconcile_state !== 'n') { + throw new Error('payment not live'); + } + const sourceSplit = db + .prepare< + [string, string], + { account_guid: string } + >( + [ + 'SELECT account_guid', + 'FROM splits', + 'WHERE tx_guid = ? AND account_guid != ?', + ].join(' '), + ) + .get(txGuid, balanceAccountGuid); + if (!sourceSplit) { + throw new Error('payment missing source split'); + } + const amountValue = BigInt(holdingSplit.quantity_num); + const amount = makeAmount(amountValue); + return makePayment( + amount, + sourceSplit.account_guid as Guid, + txGuid, + holdingSplit.guid as Guid, + checkNumber, + ); + }, + }); const accounts = freezeProps({ makeAccountPurse: (accountGuid: Guid) => { if (accountGuid === balanceAccountGuid) { @@ -195,7 +259,7 @@ const makeIssuerKitForCommodity = ({ return openPurse(accountGuid, accountGuid); }, }); - return freezeProps({ kit, accounts, purseGuids }); + return freezeProps({ kit, accounts, purseGuids, payments }); }; /** @@ -207,7 +271,7 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG // TODO: consider validation of DB capability and schema. const commodityGuid = makeGuid(); createCommodityRow({ db, guid: commodityGuid, commodity }); - const { kit, purseGuids } = makeIssuerKitForCommodity({ + const { kit, purseGuids, payments } = makeIssuerKitForCommodity({ db, commodityGuid, makeGuid, @@ -220,7 +284,7 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG return guid; }, }); - return freezeProps({ ...kit, commodityGuid, purses }) as IssuerKitWithPurseGuids; + return freezeProps({ ...kit, commodityGuid, purses, payments }) as IssuerKitWithPurseGuids; }; /** diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index 53ea08c..817fe8a 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -17,10 +17,18 @@ type PurseFactoryOptions = { sourceAccountGuid: Guid, txGuid: Guid, holdingSplitGuid: Guid, + checkNumber: string, ) => object; paymentRecords: WeakMap< object, - { amount: bigint; live: boolean; sourceAccountGuid: Guid; txGuid: Guid; holdingSplitGuid: Guid } + { + amount: bigint; + live: boolean; + sourceAccountGuid: Guid; + txGuid: Guid; + holdingSplitGuid: Guid; + checkNumber: string; + } >; /** @see makeTransferRecorder */ transferRecorder: ReturnType; @@ -60,11 +68,11 @@ export const makePurseFactory = ({ Nat(amount.value); const balance = getAccountBalance(db, accountGuid); if (amount.value > balance) throw new Error('insufficient funds'); - const { txGuid, holdingSplitGuid } = transferRecorder.createHold({ + const { txGuid, holdingSplitGuid, checkNumber } = transferRecorder.createHold({ fromAccountGuid: accountGuid, amount: amount.value, }); - return makePayment(amount, accountGuid, txGuid, holdingSplitGuid); + return makePayment(amount, accountGuid, txGuid, holdingSplitGuid, checkNumber); }; const getCurrentAmount = () => makeAmount(getAccountBalance(db, accountGuid)); const purse = freezeProps({ deposit, withdraw, getCurrentAmount }); diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index 59d0afb..7219cdb 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -53,6 +53,7 @@ export type IssuerKitForCommodity = { kit: IssuerKit; accounts: AccountPurseAccess; purseGuids: WeakMap; + payments: PaymentAccess; }; export type IssuerKitWithGuid = IssuerKit & { commodityGuid: Guid }; @@ -61,6 +62,12 @@ export type IssuerKitWithPurseGuids = IssuerKitWithGuid & { purses: { getGuid: (purse: unknown) => Guid; }; + payments: PaymentAccess; +}; + +export type PaymentAccess = { + getCheckNumber: (payment: unknown) => string; + openPayment: (checkNumber: string) => object; }; export type { Guid } from './guids'; diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index b46811e..bb1fc32 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -133,6 +133,48 @@ test('alice-to-bob transfer records a single transaction', t => { t.true(splits.every(split => split.reconcile_state === 'c')); }); +test('payments can be reified by check number', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const nowMs = () => 0; + const created = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const brand = created.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + const alicePurse = created.issuer.makeEmptyPurse(); + const bobPurse = created.issuer.makeEmptyPurse(); + const bobGuid = created.purses.getGuid(bobPurse); + + const payment = created.mint.mintPayment(bucks(10n)); + alicePurse.deposit(payment); + const checkNumber = created.payments.getCheckNumber( + alicePurse.withdraw(bucks(10n)), + ); + + const reopened = openIssuerKit( + freeze({ db, commodityGuid: created.commodityGuid, makeGuid, nowMs }), + ); + const reified = reopened.payments.openPayment( + checkNumber, + ) as ReturnType; + const reopenedBob = reopened.accounts.openAccountPurse(bobGuid); + reopenedBob.deposit(reified); + + t.is(reopenedBob.getCurrentAmount().value, 10n); +}); + test('createIssuerKit persists balances across re-open', t => { const { freeze } = Object; const db = new Database(':memory:'); From da83df82c5aeaf49b9f216e677017e8256810542 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 02:37:53 -0600 Subject: [PATCH 15/77] feat(ertp-ledgerguise): add chart facet and community scenario - add chart facet for placing purse accounts - add serial community chart test with statements - document flow B and periodic minting TODOs --- packages/ertp-ledgerguise/CONTRIBUTING.md | 5 + packages/ertp-ledgerguise/src/chart.ts | 50 +++++ packages/ertp-ledgerguise/src/index.ts | 2 + packages/ertp-ledgerguise/src/types.ts | 9 + .../ertp-ledgerguise/test/community.test.ts | 176 ++++++++++++++++++ 5 files changed, 242 insertions(+) create mode 100644 packages/ertp-ledgerguise/src/chart.ts create mode 100644 packages/ertp-ledgerguise/test/community.test.ts diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index 1bc96e8..e514aad 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -109,3 +109,8 @@ Consequences: ## Documentation - Update package docs or README when behavior or public API changes. + +## TODO + +- Consider Flow B (accrual then payout): record contributor payable before minting. +- Consider periodic minting (budgeted supply) vs per-contribution minting. diff --git a/packages/ertp-ledgerguise/src/chart.ts b/packages/ertp-ledgerguise/src/chart.ts new file mode 100644 index 0000000..b2f39f7 --- /dev/null +++ b/packages/ertp-ledgerguise/src/chart.ts @@ -0,0 +1,50 @@ +import { freezeProps } from './jessie-tools'; +import type { ChartFacet, Guid } from './types'; +import { requireAccountCommodity } from './db-helpers'; + +/** + * @file Chart facet for placing purse accounts into a community chart of accounts. + */ + +/** + * Create a chart facet that can place purse accounts into the account tree. + */ +export const makeChartFacet = ({ + db, + commodityGuid, + getPurseGuid, +}: { + db: import('better-sqlite3').Database; + commodityGuid: Guid; + getPurseGuid: (purse: unknown) => Guid; +}): ChartFacet => + freezeProps({ + placePurse: ({ + purse, + name, + parentGuid = null, + accountType = 'ASSET', + }: { + purse: unknown; + name: string; + parentGuid?: Guid | null; + accountType?: string; + }) => { + const purseGuid = getPurseGuid(purse); + requireAccountCommodity({ db, accountGuid: purseGuid, commodityGuid }); + if (parentGuid !== null) { + const row = db + .prepare<[string], { guid: string }>('SELECT guid FROM accounts WHERE guid = ?') + .get(parentGuid); + if (!row) { + throw new Error('parent account not found'); + } + } + db.prepare( + [ + 'UPDATE accounts SET name = ?, account_type = ?, parent_guid = ?', + 'WHERE guid = ?', + ].join(' '), + ).run(name, accountType, parentGuid, purseGuid); + }, + }); diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 24683c3..00bbc18 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -21,6 +21,7 @@ import type { IssuerKitWithPurseGuids, OpenIssuerConfig, } from './types'; +import { makeChartFacet } from './chart'; import { createCommodityRow, ensureAccountRow, @@ -37,6 +38,7 @@ export type { IssuerKitWithPurseGuids, } from './types'; export { asGuid } from './guids'; +export { makeChartFacet } from './chart'; /** * Initialize an empty sqlite database with the GnuCash schema. diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index 7219cdb..baf1e34 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -70,4 +70,13 @@ export type PaymentAccess = { openPayment: (checkNumber: string) => object; }; +export type ChartFacet = { + placePurse: (args: { + purse: unknown; + name: string; + parentGuid?: Guid | null; + accountType?: string; + }) => void; +}; + export type { Guid } from './guids'; diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts new file mode 100644 index 0000000..6d015f9 --- /dev/null +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -0,0 +1,176 @@ +/** + * @file Community chart scenario for contributor awards. + * + * Story: a small community awards contribution tokens and wants member names + * in the ledger. Each member gets a purse (asset account) placed under a + * community root account; expenses remain a later refinement. See CONTRIBUTING + * for chart evolution ideas (Flow B, periodic minting). + * + * If ERTP_DB is set, the test writes the sqlite database at that path. + */ + +import test, { TestFn } from 'ava'; +import Database from 'better-sqlite3'; +import type { Brand, NatAmount } from '@agoric/ertp'; +import type { Guid } from '../src/types'; +import { asGuid, createIssuerKit, initGnuCashSchema, makeChartFacet } from '../src/index'; + +type PurseLike = ReturnType['issuer']['makeEmptyPurse']>; + +type CommunityContext = { + db: import('better-sqlite3').Database; + kit: ReturnType; + chart: ReturnType; + brand: Brand<'nat'>; + bucks: (value: bigint) => NatAmount; + members: Map; +}; + +const state: { + rootPurse?: PurseLike; + rootGuid?: Guid; + members: Map; +} = { members: new Map() }; + +const serial = test.serial as TestFn; + +serial.before(t => { + const { freeze } = Object; + const dbPath = process.env.ERTP_DB ?? ':memory:'; + const db = new Database(dbPath); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const nowMs = () => 0; + const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); + const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const chart = makeChartFacet({ + db, + commodityGuid: kit.commodityGuid, + getPurseGuid: kit.purses.getGuid, + }); + const brand = kit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + + t.context = { + db, + kit, + chart, + brand, + bucks, + members: state.members, + }; +}); + +serial.after(t => { + t.context.db.close(); +}); + +serial('stage 1: create the community root account', t => { + const { chart, kit } = t.context as CommunityContext; + const rootPurse = kit.issuer.makeEmptyPurse(); + const gnucashRoot = t.context.db + .prepare<[], { root_account_guid: string }>( + 'SELECT root_account_guid FROM books LIMIT 1', + ) + .get(); + t.truthy(gnucashRoot?.root_account_guid); + chart.placePurse({ + purse: rootPurse, + name: 'Community Root', + parentGuid: gnucashRoot!.root_account_guid as Guid, + accountType: 'EQUITY', + }); + const rootGuid = kit.purses.getGuid(rootPurse); + state.rootPurse = rootPurse; + state.rootGuid = rootGuid; + + const row = t.context.db + .prepare<[string], { name: string; account_type: string }>( + 'SELECT name, account_type FROM accounts WHERE guid = ?', + ) + .get(rootGuid); + t.is(row?.name, 'Community Root'); + t.is(row?.account_type, 'EQUITY'); +}); + +serial('stage 2: add member purses to the chart', t => { + const { chart, kit } = t.context as CommunityContext; + t.truthy(state.rootGuid); + const members = ['Alice', 'Bob', 'Carol']; + for (const name of members) { + const purse = kit.issuer.makeEmptyPurse(); + chart.placePurse({ + purse, + name, + parentGuid: state.rootGuid, + accountType: 'ASSET', + }); + state.members.set(name, purse); + } + + const aliceGuid = kit.purses.getGuid(state.members.get('Alice')!); + const row = t.context.db + .prepare<[string], { name: string; parent_guid: string | null }>( + 'SELECT name, parent_guid FROM accounts WHERE guid = ?', + ) + .get(aliceGuid); + t.is(row?.name, 'Alice'); + t.is(row?.parent_guid, state.rootGuid); +}); + +serial('stage 3: award contributions to members', t => { + const { kit, bucks } = t.context as CommunityContext; + const alice = state.members.get('Alice')!; + const bob = state.members.get('Bob')!; + const carol = state.members.get('Carol')!; + + alice.deposit(kit.mint.mintPayment(bucks(10n))); + bob.deposit(kit.mint.mintPayment(bucks(7n))); + carol.deposit(kit.mint.mintPayment(bucks(3n))); + bob.deposit(kit.mint.mintPayment(bucks(5n))); + + t.is(alice.getCurrentAmount().value, 10n); + t.is(bob.getCurrentAmount().value, 12n); + t.is(carol.getCurrentAmount().value, 3n); +}); + +serial('stage 4: run balance sheet and income statement', t => { + const { db, kit } = t.context as CommunityContext; + const assetTotal = db + .prepare<[string], { total: string }>( + [ + 'SELECT COALESCE(SUM(quantity_num), 0) AS total', + 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', + "WHERE accounts.account_type = 'ASSET' AND accounts.commodity_guid = ?", + ].join(' '), + ) + .get(kit.commodityGuid)?.total; + const equityTotal = db + .prepare<[string], { total: string }>( + [ + 'SELECT COALESCE(SUM(quantity_num), 0) AS total', + 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', + "WHERE accounts.account_type = 'EQUITY' AND accounts.commodity_guid = ?", + ].join(' '), + ) + .get(kit.commodityGuid)?.total; + const expenseTotal = db + .prepare<[string], { total: string }>( + [ + 'SELECT COALESCE(SUM(quantity_num), 0) AS total', + 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', + "WHERE accounts.account_type = 'EXPENSE' AND accounts.commodity_guid = ?", + ].join(' '), + ) + .get(kit.commodityGuid)?.total; + + t.is(BigInt(assetTotal ?? '0'), 25n); + t.is(BigInt(equityTotal ?? '0'), -25n); + t.is(BigInt(expenseTotal ?? '0'), 0n); +}); From 9304ebac4864c4ff8b36bcf467054708d4f9d648 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 10 Jan 2026 02:52:45 -0600 Subject: [PATCH 16/77] WIP: tsbuildinfo doesn't belong in git --- packages/ertp-ledgerguise/tsconfig.tsbuildinfo | 1 - 1 file changed, 1 deletion(-) delete mode 100644 packages/ertp-ledgerguise/tsconfig.tsbuildinfo diff --git a/packages/ertp-ledgerguise/tsconfig.tsbuildinfo b/packages/ertp-ledgerguise/tsconfig.tsbuildinfo deleted file mode 100644 index 0013a2b..0000000 --- a/packages/ertp-ledgerguise/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2020.full.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/better-sqlite3/index.d.ts","./node_modules/@endo/eventual-send/src/E.d.ts","./node_modules/@endo/eventual-send/src/handled-promise.d.ts","./node_modules/@endo/eventual-send/src/track-turns.d.ts","./node_modules/@endo/eventual-send/src/types.d.ts","./node_modules/@endo/eventual-send/src/exports.d.ts","./node_modules/@endo/eventual-send/src/no-shim.d.ts","./node_modules/@endo/far/src/exports.d.ts","./node_modules/@endo/pass-style/src/passStyle-helpers.d.ts","./node_modules/ses/types.d.ts","./node_modules/@endo/pass-style/src/types.d.ts","./node_modules/@endo/pass-style/src/makeTagged.d.ts","./node_modules/@endo/pass-style/src/deeplyFulfilled.d.ts","./node_modules/@endo/pass-style/src/iter-helpers.d.ts","./node_modules/@endo/pass-style/src/internal-types.d.ts","./node_modules/@endo/pass-style/src/error.d.ts","./node_modules/@endo/pass-style/src/remotable.d.ts","./node_modules/@endo/pass-style/src/symbol.d.ts","./node_modules/@endo/pass-style/src/string.d.ts","./node_modules/@endo/pass-style/src/passStyleOf.d.ts","./node_modules/@endo/pass-style/src/make-far.d.ts","./node_modules/@endo/pass-style/src/typeGuards.d.ts","./node_modules/@endo/pass-style/index.d.ts","./node_modules/@endo/far/src/index.d.ts","./node_modules/@endo/marshal/src/types.d.ts","./node_modules/@endo/marshal/src/encodeToCapData.d.ts","./node_modules/@endo/marshal/src/marshal.d.ts","./node_modules/@endo/marshal/src/marshal-stringify.d.ts","./node_modules/@endo/marshal/src/marshal-justin.d.ts","./node_modules/@endo/marshal/src/encodePassable.d.ts","./node_modules/@endo/marshal/src/rankOrder.d.ts","./node_modules/@endo/marshal/index.d.ts","./node_modules/@endo/patterns/src/types.d.ts","./node_modules/@endo/patterns/src/keys/copySet.d.ts","./node_modules/@endo/patterns/src/keys/copyBag.d.ts","./node_modules/@endo/common/list-difference.d.ts","./node_modules/@endo/common/object-map.d.ts","./node_modules/@endo/patterns/src/keys/checkKey.d.ts","./node_modules/@endo/patterns/src/keys/compareKeys.d.ts","./node_modules/@endo/patterns/src/keys/merge-set-operators.d.ts","./node_modules/@endo/patterns/src/keys/merge-bag-operators.d.ts","./node_modules/@endo/patterns/src/patterns/patternMatchers.d.ts","./node_modules/@endo/patterns/src/patterns/getGuardPayloads.d.ts","./node_modules/@endo/patterns/index.d.ts","./node_modules/@endo/common/object-meta-map.d.ts","./node_modules/@endo/common/from-unique-entries.d.ts","./node_modules/@agoric/internal/src/js-utils.d.ts","./node_modules/@agoric/internal/src/ses-utils.d.ts","./node_modules/@agoric/internal/src/types.ts","./node_modules/@endo/exo/src/get-interface.d.ts","./node_modules/@endo/exo/src/types.d.ts","./node_modules/@endo/exo/src/exo-makers.d.ts","./node_modules/@endo/exo/index.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakSetStore.d.ts","./node_modules/@agoric/store/src/types.d.ts","./node_modules/@agoric/store/src/stores/scalarSetStore.d.ts","./node_modules/@agoric/store/src/stores/scalarWeakMapStore.d.ts","./node_modules/@agoric/store/src/stores/scalarMapStore.d.ts","./node_modules/@agoric/store/src/legacy/legacyMap.d.ts","./node_modules/@agoric/store/src/legacy/legacyWeakMap.d.ts","./node_modules/@agoric/internal/src/cli-utils.d.ts","./node_modules/@agoric/internal/src/config.d.ts","./node_modules/@agoric/internal/src/debug.d.ts","./node_modules/@agoric/internal/src/errors.d.ts","./node_modules/@agoric/internal/src/method-tools.d.ts","./node_modules/@agoric/internal/src/metrics.d.ts","./node_modules/@agoric/internal/src/natural-sort.d.ts","./node_modules/@agoric/internal/src/tmpDir.d.ts","./node_modules/@agoric/internal/src/typeCheck.d.ts","./node_modules/@agoric/internal/src/typeGuards.d.ts","./node_modules/@agoric/internal/src/types-index.d.ts","./node_modules/@agoric/internal/src/marshal.d.ts","./node_modules/@agoric/internal/src/index.d.ts","./node_modules/@agoric/store/src/stores/store-utils.d.ts","./node_modules/@agoric/store/src/index.d.ts","./node_modules/@agoric/base-zone/src/watch-promise.d.ts","./node_modules/@agoric/base-zone/src/types.d.ts","./node_modules/@agoric/base-zone/src/exports.d.ts","./node_modules/@agoric/swingset-liveslots/src/types.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualReferences.d.ts","./node_modules/@agoric/swingset-liveslots/src/virtualObjectManager.d.ts","./node_modules/@agoric/swingset-liveslots/src/watchedPromises.d.ts","./node_modules/@agoric/swingset-liveslots/src/vatDataTypes.ts","./node_modules/@agoric/swingset-liveslots/src/types-index.d.ts","./node_modules/@agoric/swingset-liveslots/src/liveslots.d.ts","./node_modules/@agoric/swingset-liveslots/src/message.d.ts","./node_modules/@agoric/swingset-liveslots/src/index.d.ts","./node_modules/@agoric/base-zone/src/make-once.d.ts","./node_modules/@agoric/base-zone/src/keys.d.ts","./node_modules/@agoric/base-zone/src/is-passable.d.ts","./node_modules/@agoric/base-zone/src/index.d.ts","./node_modules/@agoric/internal/src/lib-chainStorage.d.ts","./node_modules/@agoric/notifier/src/types.ts","./node_modules/@agoric/notifier/src/topic.d.ts","./node_modules/@agoric/notifier/src/storesub.d.ts","./node_modules/@agoric/notifier/src/stored-notifier.d.ts","./node_modules/@agoric/notifier/src/types-index.d.ts","./node_modules/@agoric/notifier/src/publish-kit.d.ts","./node_modules/@agoric/notifier/src/subscribe.d.ts","./node_modules/@agoric/notifier/src/notifier.d.ts","./node_modules/@agoric/notifier/src/subscriber.d.ts","./node_modules/@agoric/notifier/src/asyncIterableAdaptor.d.ts","./node_modules/@agoric/notifier/src/index.d.ts","./node_modules/@agoric/internal/src/tagged.d.ts","./node_modules/@agoric/ertp/src/types.ts","./node_modules/@agoric/ertp/src/amountMath.d.ts","./node_modules/@agoric/ertp/src/issuerKit.d.ts","./node_modules/@agoric/ertp/src/typeGuards.d.ts","./node_modules/@agoric/ertp/src/types-index.d.ts","./node_modules/@agoric/ertp/src/index.d.ts","./src/guids.ts","./src/types.ts","./src/db-helpers.ts","./src/sql/gc_empty.ts","./src/jessie-tools.ts","./src/purse.ts","./src/index.ts","./node_modules/ava/types/assertions.d.cts","./node_modules/ava/types/subscribable.d.cts","./node_modules/ava/types/try-fn.d.cts","./node_modules/ava/types/test-fn.d.cts","./node_modules/ava/entrypoints/main.d.cts","./node_modules/ava/index.d.ts","./test/ledgerguise.test.ts"],"fileIdsList":[[56,119,127,131,134,136,137,138,150,252],[56,119,127,131,134,136,137,138,150,251,253,263,264,265],[56,119,127,131,134,136,137,138,150,198],[56,119,127,131,134,136,137,138,150,252,262],[56,119,127,131,134,136,137,138,150,228,250,251],[56,119,127,131,134,136,137,138,150,219],[56,119,127,131,134,136,137,138,150,219,280],[56,119,127,131,134,136,137,138,150,281,282,283,284],[56,119,127,131,134,136,137,138,150,219,248,280,281],[56,119,127,131,134,136,137,138,150,219,248,280],[56,119,127,131,134,136,137,138,150,280],[56,119,127,131,134,136,137,138,150,198,199,219,278,279,281],[56,119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,222,223,236,237,238,239,240,241,242,243,244,245,246,247],[56,119,127,131,134,136,137,138,150,199,207,224,228,266],[56,119,127,131,134,136,137,138,150,207,224],[56,119,127,131,134,136,137,138,150,199,212,220,221,222,224],[56,119,127,131,134,136,137,138,150,224],[56,119,127,131,134,136,137,138,150,219,224],[56,119,127,131,134,136,137,138,150,182,198,219,223],[56,119,127,131,134,136,137,138,150,182,198,199,268,272],[56,119,127,131,134,136,137,138,150,269,270,271,272,273,274,275,276,277],[56,119,127,131,134,136,137,138,150,248,268],[56,119,127,131,134,136,137,138,150,219,262,268],[56,119,127,131,134,136,137,138,150,198,199,267,268],[56,119,127,131,134,136,137,138,150,199,207,267,268],[56,119,127,131,134,136,137,138,150,182,198,199,268],[56,119,127,131,134,136,137,138,150,268],[56,119,127,131,134,136,137,138,150,207,267],[56,119,127,131,134,136,137,138,150,219,228,229,230,231,232,233,234,235,248,249],[56,119,127,131,134,136,137,138,150,230],[56,119,127,131,134,136,137,138,150,198,219,230],[56,119,127,131,134,136,137,138,150,219,230],[56,119,127,131,134,136,137,138,150,219,250],[56,119,127,131,134,136,137,138,150,198,207,219,230],[56,119,127,131,134,136,137,138,150,198,219],[56,119,127,131,134,136,137,138,150,259,260,261],[56,119,127,131,134,136,137,138,150,222,254],[56,119,127,131,134,136,137,138,150,254],[56,119,127,131,134,136,137,138,150,254,258],[56,119,127,131,134,136,137,138,150,207],[56,119,127,131,134,136,137,138,150,182,198,219,228,250,257],[56,119,127,131,134,136,137,138,150,207,254,255,262],[56,119,127,131,134,136,137,138,150,207,254,255,256,258],[56,119,127,131,134,136,137,138,150,180],[56,119,127,131,134,136,137,138,150,177,178,181],[56,119,127,131,134,136,137,138,150,177,178,179],[56,119,127,131,134,136,137,138,150,225,226,227],[56,119,127,131,134,136,137,138,150,219,226],[56,119,127,131,134,136,137,138,150,182,198,219,225],[56,119,127,131,134,136,137,138,150,182],[56,119,127,131,134,136,137,138,150,182,183,198],[56,119,127,131,134,136,137,138,150,198,200,201,202,203,204,205,206],[56,119,127,131,134,136,137,138,150,198,200],[56,119,127,131,134,136,137,138,150,185,198,200],[56,119,127,131,134,136,137,138,150,200],[56,119,127,131,134,136,137,138,150,184,186,187,188,189,191,192,193,194,195,196,197],[56,119,127,131,134,136,137,138,150,185,186,190],[56,119,127,131,134,136,137,138,150,186],[56,119,127,131,134,136,137,138,150,182,186],[56,119,127,131,134,136,137,138,150,186,190],[56,119,127,131,134,136,137,138,150,184,185],[56,119,127,131,134,136,137,138,150,208,209,210,211,212,213,214,215,216,217,218],[56,119,127,131,134,136,137,138,150,198,208],[56,119,127,131,134,136,137,138,150,208],[56,119,127,131,134,136,137,138,150,198,207,208],[56,119,127,131,134,136,137,138,150,198,207],[56,119,127,131,134,136,137,138,150,175],[56,116,117,119,127,131,134,136,137,138,150],[56,118,119,127,131,134,136,137,138,150],[119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,158],[56,119,120,125,127,130,131,134,136,137,138,140,150,155,167],[56,119,120,121,127,130,131,134,136,137,138,150],[56,119,122,127,131,134,136,137,138,150,168],[56,119,123,124,127,131,134,136,137,138,141,150],[56,119,124,127,131,134,136,137,138,150,155,164],[56,119,125,127,130,131,134,136,137,138,140,150],[56,118,119,126,127,131,134,136,137,138,150],[56,119,127,128,131,134,136,137,138,150],[56,119,127,129,130,131,134,136,137,138,150],[56,118,119,127,130,131,134,136,137,138,150],[56,119,127,130,131,132,134,136,137,138,150,155,167],[56,119,127,130,131,132,134,136,137,138,150,155,158],[56,106,119,127,130,131,133,134,136,137,138,140,150,155,167],[56,119,127,130,131,133,134,136,137,138,140,150,155,164,167],[56,119,127,131,133,134,135,136,137,138,150,155,164,167],[54,55,56,57,58,59,60,61,62,63,64,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174],[56,119,127,130,131,134,136,137,138,150],[56,119,127,131,134,136,138,150],[56,119,127,131,134,136,137,138,139,150,167],[56,119,127,130,131,134,136,137,138,140,150,155],[56,119,127,131,134,136,137,138,141,150],[56,119,127,131,134,136,137,138,142,150],[56,119,127,130,131,134,136,137,138,145,150],[56,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174],[56,119,127,131,134,136,137,138,147,150],[56,119,127,131,134,136,137,138,148,150],[56,119,124,127,131,134,136,137,138,140,150,158],[56,119,127,130,131,134,136,137,138,150,151],[56,119,127,131,134,136,137,138,150,152,168,171],[56,119,127,130,131,134,136,137,138,150,155,157,158],[56,119,127,131,134,136,137,138,150,156,158],[56,119,127,131,134,136,137,138,150,158,168],[56,119,127,131,134,136,137,138,150,159],[56,116,119,127,131,134,136,137,138,150,155,161],[56,119,127,131,134,136,137,138,150,155,160],[56,119,127,130,131,134,136,137,138,150,162,163],[56,119,127,131,134,136,137,138,150,162,163],[56,119,124,127,131,134,136,137,138,140,150,155,164],[56,119,127,131,134,136,137,138,150,165],[56,119,127,131,134,136,137,138,140,150,166],[56,119,127,131,133,134,136,137,138,148,150,167],[56,119,127,131,134,136,137,138,150,168,169],[56,119,124,127,131,134,136,137,138,150,169],[56,119,127,131,134,136,137,138,150,155,170],[56,119,127,131,134,136,137,138,139,150,171],[56,119,127,131,134,136,137,138,150,172],[56,119,122,127,131,134,136,137,138,150],[56,119,124,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,168],[56,106,119,127,131,134,136,137,138,150],[56,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,150,173],[56,119,127,131,134,136,137,138,145,150],[56,119,127,131,134,136,137,138,150,163],[56,106,119,127,130,131,132,134,136,137,138,145,150,155,158,167,170,171,173],[56,119,127,131,134,136,137,138,150,155,174],[56,119,127,131,134,136,137,138,150,293,294,295,296],[56,119,127,131,134,136,137,138,150,297],[56,119,127,131,134,136,137,138,150,293,294,295],[56,119,127,131,134,136,137,138,150,296],[56,72,75,78,79,119,127,131,134,136,137,138,150,167],[56,75,119,127,131,134,136,137,138,150,155,167],[56,75,79,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,150,155],[56,69,119,127,131,134,136,137,138,150],[56,73,119,127,131,134,136,137,138,150],[56,71,72,75,119,127,131,134,136,137,138,150,167],[56,119,127,131,134,136,137,138,140,150,164],[56,69,119,127,131,134,136,137,138,150,175],[56,71,75,119,127,131,134,136,137,138,140,150,167],[56,66,67,68,70,74,119,127,130,131,134,136,137,138,150,155,167],[56,75,83,91,119,127,131,134,136,137,138,150],[56,67,73,119,127,131,134,136,137,138,150],[56,75,100,101,119,127,131,134,136,137,138,150],[56,67,70,75,119,127,131,134,136,137,138,150,158,167,175],[56,75,119,127,131,134,136,137,138,150],[56,71,75,119,127,131,134,136,137,138,150,167],[56,66,119,127,131,134,136,137,138,150],[56,69,70,71,73,74,75,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,119,127,131,134,136,137,138,150],[56,75,93,96,119,127,131,134,136,137,138,150],[56,75,83,84,85,119,127,131,134,136,137,138,150],[56,73,75,84,86,119,127,131,134,136,137,138,150],[56,74,119,127,131,134,136,137,138,150],[56,67,69,75,119,127,131,134,136,137,138,150],[56,75,79,84,86,119,127,131,134,136,137,138,150],[56,79,119,127,131,134,136,137,138,150],[56,73,75,78,119,127,131,134,136,137,138,150,167],[56,67,71,75,83,119,127,131,134,136,137,138,150],[56,75,93,119,127,131,134,136,137,138,150],[56,86,119,127,131,134,136,137,138,150],[56,69,75,100,119,127,131,134,136,137,138,150,158,173,175],[56,119,127,131,134,136,137,138,150,176,287],[56,119,127,131,134,136,137,138,150,176,285,286,287,288,289,290,291],[56,119,127,131,134,136,137,138,150,176,287,288,290],[56,119,127,131,134,136,137,138,150,176,285,286],[56,119,127,131,134,136,137,138,150,176,285,292,298]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"961cf7535b9c521cd634055b1b6ac49b94d055f0b573ce7fdc4cfaddab080b7c","impliedFormat":1},{"version":"806a8c6daae69e5695e7200d9eca6bc1e4298f38d90edda3ce67a794da31a24f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"5e0c66763bda6ad4efe2ff62b2ca3a8af0b8d5b58a09429bbf9e433706c32f49","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"cd9189eacf0f9143b8830e9d6769335aa6d902c04195f04145bcbf19e7f26fcb","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"c2a6a737189ced24ffe0634e9239b087e4c26378d0490f95141b9b9b042b746c","impliedFormat":1},{"version":"2cd4b702eb44058636981ad2a53ab0152417c8f36b224e459aa5404d5786166e","impliedFormat":99},{"version":"64a95727716d7a159ff916085eb5df4dd67f1ff9c6f7e35ce2aff8a4ed4e6d31","impliedFormat":99},{"version":"93340c70128cbf56acb9eba0146f9cae83b5ef8f4b02f380fff0b77a6b7cf113","impliedFormat":99},{"version":"eb10902fb118057f367f63a703af037ea92a1f8e6161b9b128c29d934539d9a5","impliedFormat":99},{"version":"6b9c704b9febb76cdf74f8f1e3ac199c5b4708e5be2afe257320411ec2c8a3a1","affectsGlobalScope":true,"impliedFormat":99},{"version":"614fa8a4693c632333c354af80562633c8aaf0d552e7ed90f191a6ace24abe9d","impliedFormat":99},{"version":"d221c15d4aae13d314072f859de2ccec2c600a3addc9f2b71b397c83a157e71f","impliedFormat":99},{"version":"dc8a5014726788b50b968d67404dbc7713009040720a04b39c784b43dd8fdacb","impliedFormat":99},{"version":"ea5d08724831aab137fab28195dadf65667aec35acc0f2a5e517271d8c3082d3","affectsGlobalScope":true,"impliedFormat":99},{"version":"009b62c055096dfb3291f2667b8f0984ce480abef01c646e9675868fcec5ac60","impliedFormat":99},{"version":"d86a646352434aa51e337e64e234eab2d28af156bb5931d25c789d0c5dfbcd08","impliedFormat":99},{"version":"d15ab66050babcbb3858c785c437230bd984943b9b2080cd16fe1f0007b4802b","impliedFormat":99},{"version":"d5dc3c765037bfc7bd118be91ad280801f8c01fe41e8b7c8c1d8b96f6a0dc489","impliedFormat":99},{"version":"c6af1103d816d17451bc1a18cb9889fc9a282966383b695927d3ead99d958da0","impliedFormat":99},{"version":"d34287eb61f4689723448d33f50a047769dadee66ec8cb8609b41b17a5b3df40","impliedFormat":99},{"version":"22f52ade1934d26b5db4d5558be99097a82417c0247958527336535930d5a288","impliedFormat":99},{"version":"717d656e46e34696d072f2cee99ca045e69350f3c5ede3193337f884ccbc2a3b","impliedFormat":99},{"version":"b5a53985100fa348fcfb06bad4ee86367168e018998cbf95394a01b2dac92bb7","impliedFormat":99},{"version":"cadea2f7c33f255e142da3b0fefee54fa3985a12471cf9c5c51a221b3844f976","impliedFormat":99},{"version":"46f09e6b30f4301674d1c685934bd4ad2b594085d2545d6f063c175b1dcfd5af","impliedFormat":99},{"version":"25cd3d5fecfed6af5903170b67e8b3531591633e14c5b6735aac0d49e93d7cf0","impliedFormat":99},{"version":"f9fdd230ece877f4bcd8d35240426bcb1482f44faf813e6a336c2cc1b034e58d","impliedFormat":99},{"version":"bcbe66e540446c7fb8b34afe764dae60b28ef929cafe26402594f41a377fac41","impliedFormat":99},{"version":"428ef8df7e77bd4731faa19ef7430823f42bc95abd99368351411541ee08d2f7","impliedFormat":99},{"version":"a8a953cb8cf0b05c91086bd15a383afdfbddbf0cda5ed67d2c55542a5064b69d","impliedFormat":99},{"version":"f5a00483d6aa997ffedb1e802df7c7dcd048e43deab8f75c2c754f4ee3f97b41","impliedFormat":99},{"version":"14da43cd38f32c3b6349d1667937579820f1a3ddb40f3187caa727d4d451dcd4","impliedFormat":99},{"version":"2b77e2bc5350c160c53c767c8e6325ee61da47eda437c1d3156e16df94a64257","impliedFormat":99},{"version":"b0c5a13c0ec9074cdd2f8ed15e6734ba49231eb773330b221083e79e558badb4","impliedFormat":99},{"version":"a2d30f97dcc401dad445fb4f0667a167d1b9c0fdb1132001cc37d379e8946e3c","impliedFormat":99},{"version":"81c859cff06ee38d6f6b8015faa04722b535bb644ea386919d570e0e1f052430","impliedFormat":99},{"version":"05e938c1bc8cc5d2f3b9bb87dc09da7ab8e8e8436f17af7f1672f9b42ab5307d","impliedFormat":99},{"version":"061020cd9bc920fc08a8817160c5cb97b8c852c5961509ed15aab0c5a4faddb3","impliedFormat":99},{"version":"e33bbc0d740e4db63b20fa80933eb78cd305258ebb02b2c21b7932c8df118d3b","impliedFormat":99},{"version":"6795c049a6aaaaeb25ae95e0b9a4c75c8a325bd2b3b40aee7e8f5225533334d4","impliedFormat":99},{"version":"e6081f90b9dc3ff16bcc3fdab32aa361800dc749acc78097870228d8f8fd9920","impliedFormat":99},{"version":"6274539c679f0c9bcd2dbf9e85c5116db6acf91b3b9e1084ce8a17db56a0259a","impliedFormat":99},{"version":"f472753504df7760ad34eafa357007e90c59040e6f6882aae751de7b134b8713","impliedFormat":99},{"version":"dba70304db331da707d5c771e492b9c1db7545eb29a949050a65d0d4fa4a000d","impliedFormat":99},{"version":"a520f33e8a5a92d3847223b2ae2d8244cdb7a6d3d8dfdcc756c5650a38fc30f4","impliedFormat":99},{"version":"76aec992df433e1e56b9899183b4cf8f8216e00e098659dbfbc4d0cbf9054725","impliedFormat":99},{"version":"28fbf5d3fdff7c1dad9e3fd71d4e60077f14134b06253cb62e0eb3ba46f628e3","impliedFormat":99},{"version":"c5340ac3565038735dbf82f6f151a75e8b95b9b1d5664b4fddf0168e4dd9c2f3","impliedFormat":99},{"version":"9481179c799a61aa282d5d48b22421d4d9f592c892f2c6ae2cda7b78595a173e","impliedFormat":99},{"version":"00de25621f1acd5ed68e04bb717a418150779459c0df27843e5a3145ab6aa13d","impliedFormat":99},{"version":"3b0a6f0e693745a8f6fd35bafb8d69f334f3c782a91c8f3344733e2e55ba740d","impliedFormat":99},{"version":"83576f4e2a788f59c217da41b5b7eb67912a400a5ff20aa0622a5c902d23eb75","impliedFormat":99},{"version":"039ee0312b31c74b8fcf0d55b24ef9350b17da57572648580acd70d2e79c0d84","impliedFormat":99},{"version":"6a437bd627ddcb418741f1a279a9db2828cc63c24b4f8586b0473e04f314bee5","impliedFormat":99},{"version":"bb1a27e42875da4a6ff036a9bbe8fca33f88225d9ee5f3c18619bfeabc37c4f4","impliedFormat":99},{"version":"56e07c29328f54e68cf4f6a81bc657ae6b2bbd31c2f53a00f4f0a902fa095ea1","impliedFormat":99},{"version":"ce29026a1ee122328dc9f1b40bff4cf424643fddf8dc6c046f4c71bf97ecf5b5","impliedFormat":99},{"version":"386a071f8e7ca44b094aba364286b65e6daceba25347afb3b7d316a109800393","impliedFormat":99},{"version":"6ba3f7fc791e73109b8c59ae17b1e013ab269629a973e78812e0143e4eab48b2","impliedFormat":99},{"version":"042dbb277282e4cb651b7a5cde8a07c01a7286d41f585808afa98c2c5adae7e0","impliedFormat":99},{"version":"0952d2faef01544f6061dd15d81ae53bfb9d3789b9def817f0019731e139bda8","impliedFormat":99},{"version":"8ec4b0ca2590204f6ef4a26d77c5c8b0bba222a5cd80b2cb3aa3016e3867f9ce","impliedFormat":99},{"version":"15d389a1ee1f700a49260e38736c8757339e5d5e06ca1409634242c1a7b0602e","impliedFormat":99},{"version":"f868b2a12bbe4356e2fd57057ba0619d88f1496d2b884a4f22d8bab3e253dbf5","impliedFormat":99},{"version":"a474bc8c71919a09c0d27ad0cba92e5e3e754dc957bec9c269728c9a4a4cf754","impliedFormat":99},{"version":"e732c6a46c6624dbbd56d3f164d6afdfe2b6007c6709bb64189ce057d03d30fd","impliedFormat":99},{"version":"5c425f77a2867b5d7026875328f13736e3478b0cc6c092787ac3a8dcc8ff0d42","impliedFormat":99},{"version":"b6d1738ae0dd427debbb3605ba03c30ceb76d4cefc7bd5f437004f6f4c622e38","impliedFormat":99},{"version":"6629357b7dd05ee4367a71962a234d508fa0fb99fbbad83fdbf3e64aa6e77104","impliedFormat":99},{"version":"5f8b299ecc1852b7b6eb9682a05f2dbfaae087e3363ecfbb9430350be32a97dc","impliedFormat":99},{"version":"6e304bbf3302fb015164bb3a7c7dfca6b3fdf57b1d56809173fed3663b42ced4","impliedFormat":99},{"version":"cd6aab42fef5395a16795cf23bbc9645dc9786af2c08dac3d61234948f72c67d","impliedFormat":99},{"version":"fe1f9b28ceb4ff76facbe0c363888d33d8265a0beb6fb5532a6e7a291490c795","impliedFormat":99},{"version":"b1d6ee25d690d99f44fd9c1c831bcdb9c0354f23dab49e14cdcfe5d0212bcba0","impliedFormat":99},{"version":"488958cf5865bce05ac5343cf1607ad7af72486a351c3afc7756fdd9fdafa233","impliedFormat":99},{"version":"424a44fb75e76db02794cf0e26c61510daf8bf4d4b43ebbeb6adc70be1dd68b4","impliedFormat":99},{"version":"519f0d3b64727722e5b188c679c1f741997be640fdcd30435a2c7ba006667d6e","impliedFormat":99},{"version":"49324b7e03d2c9081d66aef8b0a8129f0244ecac4fb11378520c9816d693ce7a","impliedFormat":99},{"version":"bbe31d874c9a2ac21ea0c5cee6ded26697f30961dca6f18470145b1c8cd66b21","impliedFormat":99},{"version":"38a5641908bc748e9829ab1d6147239a3797918fab932f0aa81543d409732990","impliedFormat":99},{"version":"125da449b5464b2873f7642e57452ac045a0219f0cb6a5d3391a15cc4336c471","impliedFormat":99},{"version":"d1cacc1ae76a3698129f4289657a18de22057bb6c00e7bf36aa2e9c5365eec66","impliedFormat":99},{"version":"0468caf7769824cd6ddd202c5f37c574bcc3f5c158ef401b71ca3ece8de5462f","impliedFormat":99},{"version":"966a181ee1c0cecd2aaa9cf8281f3b8036d159db7963788a7bfae78937c62717","impliedFormat":99},{"version":"8d11b30c4b66b9524db822608d279dc5e2b576d22ee21ee735a9b9a604524873","impliedFormat":99},{"version":"dac1ccee916195518aa964a933af099be396eaca9791dab44af01eb3209b9930","impliedFormat":99},{"version":"f95e4d1e6d3c5cbbbf6e216ea4742138e52402337eb3416170eabb2fdbe5c762","impliedFormat":99},{"version":"22b43e7fd932e3aa63e5bee8247d408ad1e5a29fe8008123dc6a4bd35ea49ded","impliedFormat":99},{"version":"aeea49091e71d123a471642c74a5dc4d8703476fd6254002d27c75728aa13691","impliedFormat":99},{"version":"0d4db4b482d5dec495943683ba3b6bb4026747a351c614fafdbaf54c00c5adab","impliedFormat":99},{"version":"45ac0268333f7bf8098595cda739764c429cd5d182ae4a127b3ca33405f81431","impliedFormat":99},{"version":"253c3549b055ad942ee115bef4c586c0c56e6b11aeb6353f171c7f0ffec8df07","impliedFormat":99},{"version":"0f1791a8891729f010e49f29b921b05afd45e5ba8430663c8ece4edeee748b1b","impliedFormat":99},{"version":"dfa585104fc407014e2a9ceafb748a50284fb282a561e9d8eb08562e64b1cb24","impliedFormat":99},{"version":"51130d85941585df457441c29e8f157ddc01e4978573a02a806a04c687b6748a","impliedFormat":99},{"version":"40f0d41f453dc614b2a3c552e7aca5ce723bb84d6e6bca8a6dcad1dca4cd9449","impliedFormat":99},{"version":"404627849c9714a78663bd299480dd94e75e457f5322caf0c7e169e5adab0a18","impliedFormat":99},{"version":"208306f454635e47d72092763c801f0ffcb7e6cba662d553eee945bd50987bb1","impliedFormat":99},{"version":"8b5a27971e8ede37415e42f24aae6fd227c2a1d2a93d6b8c7791a13abcde0f0b","impliedFormat":99},{"version":"1c106d58790bab5e144b35eeb31186f2be215d651e4000586fc021140cd324b9","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"c140653685b9af4f01e4283dd9d759126cb15f1c41721270c0bdbb55fd72673f","impliedFormat":99},{"version":"5844202ecdcea1f8612a826905623d93add56c9c1988df6471dff9999d92c0a7","impliedFormat":99},{"version":"b268ce0a7f489c27d8bf748c2563fd81092ead98e4c30f673670297250b774bd","impliedFormat":99},{"version":"9b0ca5de920ec607eecea5b40402fca8e705dfb3ff5e72cc91e2ac6d8f390985","impliedFormat":99},{"version":"efad5849e64223db373bbabc5eb6b2566d16e3bd34c0fd29ccf8bbe8a8a655e7","impliedFormat":99},{"version":"4c1c9ab197c2596bace50281bacf3ce3276f22aaef1c8398af0137779b577f24","impliedFormat":99},{"version":"a1acd535289b4cca0466376c1af5a99d887c91483792346be3b0b58d5f72eead","impliedFormat":99},{"version":"cdb6a1ed879f191ad45615cb4b7e7935237de0cfb8d410c7eb1fd9707d9c17ac","impliedFormat":99},{"version":"ca1debd87d50ade2eba2d0594eb47ab98e050a9fa08f879c750d80863dd3ce4c","impliedFormat":99},{"version":"dc01a3cc4787313606d58b1c6f3a4c5bf0d3fe4e3789dfdcde28d59bfd9b7c59","impliedFormat":99},{"version":"73ab9b053ad2a5ddee2f4c9b8cd36a436974dd5fa5a7c74940dd6b92e4d8e02d","impliedFormat":99},{"version":"9beca01b257cda65699baadb0de2e32c6847f5326bb876213a0bcf3fd86510c6","impliedFormat":99},{"version":"fbf43977fd4aead581f1ef81146a4ff6fafe6bec7fac2b4cbd5a00577ab0c1c7","impliedFormat":99},{"version":"2ae4378b3e906557e1b319ca96b23978ee517a71f830be14c99d3a8f23c961b0","signature":"999142549785919344c29d95c5beeab0df338cd9ef20c5a8e039b6d48c115c43"},{"version":"fb380a470b6457adcdf883f05888ea83f378f47a17b775851190cf2160fdfee2","signature":"a2e6dfa4b803a333e731d8a788e65f450254958209ac445a8ed160d7f80b08b1"},{"version":"fc8e720e22b8f9ba80bdcdd3b140a641dc0de4aa647715175dab6422f6992859","signature":"b5287a80d647fb84acefa319a409b6da2da1be86bfcaeaabfc2a1d10218b5565"},{"version":"c189c903a1eb9620083188f005016fafef46ec9f65a6c93b356122251e7c83a8","signature":"a66b08d5957056956a73d0da1f1a25d94a8deee8fc0dda21b2426949651918d3"},{"version":"aa33f2f6c925e57e552e0fe8874fb6a6decbb4b2bd34e2beaac825b17e6cac2d","signature":"82908493d1cb77532ce657dc02cbac73e795d0dc2ea22b7c1063f74ba1630ecb"},{"version":"73b9b29841e031dc8c816b5d1d1621c593a698a9ad0a26c207c455291ef7b207","signature":"f3715d591e74f76c70a85952c3202591fc8ade3b5387b52eb54a9a4ccab18230"},{"version":"9f4f4abe3cbc04061e888728f4d5b974205a456f07c4681e7b13f24b58d53a93","signature":"a18e6dc5937faa74052fdf06c72bce89458199c01fe144ec7fa05bd54f42d959"},{"version":"465f1ca1f11e6a1b01b043a93196b7f8fc09c985b8e3084804d9a3938aad588d","impliedFormat":1},{"version":"00b72e597dcd6ff7bf772918c78c41dc7c68e239af658cf452bff645ebdc485d","impliedFormat":1},{"version":"17b183b69a3dd3cca2505cee7ff70501c574343ad49a385c9acb5b5299e1ba73","impliedFormat":1},{"version":"b26d3fa6859459f64c93e0c154bfc7a8b216b4cf1e241ca6b67e67ee8248626b","impliedFormat":1},{"version":"91cab3f4d6ab131c74ea8772a8c182bdb9c52500fb0388ef9fd2828c084b8087","impliedFormat":1},{"version":"13b8acfead5a8519fad35e43f58c62b946a24f2a1311254250b840b15b2051cd","impliedFormat":99},{"version":"ef8d3fb4ff7fc7cb05c14d56d1d5432564b5a4abe32aab5a65a4c5bb0fa87533","signature":"eff01d2bd4cee37bf7a0690ab7d9d17b258ce2b6570e2dd5276214e939760d6b"}],"root":[[286,292],299],"options":{"esModuleInterop":true,"module":1,"skipLibCheck":true,"strict":true,"target":7},"referencedMap":[[253,1],[266,2],[265,3],[264,1],[263,4],[252,5],[251,6],[281,7],[285,8],[282,9],[283,10],[284,11],[280,12],[236,13],[237,13],[238,13],[239,13],[248,14],[222,13],[267,15],[247,16],[240,13],[241,13],[242,13],[223,17],[279,13],[243,13],[244,18],[245,19],[246,18],[224,20],[277,21],[278,22],[275,23],[273,24],[271,25],[270,26],[274,27],[276,28],[269,28],[272,28],[268,29],[250,30],[234,31],[235,31],[233,32],[231,33],[232,32],[229,34],[249,35],[230,36],[262,37],[260,38],[261,39],[259,40],[254,41],[258,42],[256,43],[255,13],[257,44],[221,13],[211,13],[212,13],[220,13],[177,45],[181,45],[178,13],[182,46],[179,13],[180,47],[228,48],[227,49],[225,36],[226,50],[183,51],[199,52],[207,53],[205,3],[201,54],[204,55],[203,3],[202,56],[206,54],[200,3],[198,57],[188,3],[191,58],[190,59],[189,13],[196,60],[187,59],[184,59],[195,59],[192,61],[194,13],[193,13],[197,59],[186,62],[219,63],[213,64],[214,65],[210,66],[209,66],[216,65],[215,65],[218,64],[217,64],[208,67],[176,68],[116,69],[117,69],[118,70],[56,71],[119,72],[120,73],[121,74],[54,13],[122,75],[123,76],[124,77],[125,78],[126,79],[127,80],[128,80],[129,81],[130,82],[131,83],[132,84],[57,13],[55,13],[133,85],[134,86],[135,87],[175,88],[136,89],[137,90],[138,89],[139,91],[140,92],[141,93],[142,94],[143,94],[144,94],[145,95],[146,96],[147,97],[148,98],[149,99],[150,100],[151,100],[152,101],[153,13],[154,13],[155,102],[156,103],[157,102],[158,104],[159,105],[160,106],[161,107],[162,108],[163,109],[164,110],[165,111],[166,112],[167,113],[168,114],[169,115],[170,116],[171,117],[172,118],[58,89],[59,13],[60,119],[61,120],[62,13],[63,121],[64,13],[107,122],[108,123],[109,124],[110,124],[111,125],[112,13],[113,72],[114,126],[115,123],[173,127],[174,128],[297,129],[298,130],[293,13],[294,13],[296,131],[295,132],[65,13],[185,13],[51,13],[52,13],[10,13],[8,13],[9,13],[14,13],[13,13],[2,13],[15,13],[16,13],[17,13],[18,13],[19,13],[20,13],[21,13],[22,13],[3,13],[23,13],[24,13],[4,13],[25,13],[29,13],[26,13],[27,13],[28,13],[30,13],[31,13],[32,13],[5,13],[33,13],[34,13],[35,13],[36,13],[6,13],[40,13],[37,13],[38,13],[39,13],[41,13],[7,13],[42,13],[53,13],[47,13],[48,13],[43,13],[44,13],[45,13],[46,13],[1,13],[49,13],[50,13],[12,13],[11,13],[83,133],[95,134],[81,135],[96,136],[105,137],[72,138],[73,139],[71,140],[104,68],[99,141],[103,142],[75,143],[92,144],[74,145],[102,146],[69,147],[70,141],[76,148],[77,13],[82,149],[80,148],[67,150],[106,151],[97,152],[86,153],[85,148],[87,154],[90,155],[84,156],[88,157],[100,68],[78,158],[79,159],[91,160],[68,136],[94,161],[93,148],[89,162],[98,13],[66,13],[101,163],[288,164],[286,120],[292,165],[290,13],[291,166],[289,13],[287,167],[299,168]],"affectedFilesPendingEmit":[288,286,292,290,291,289,287,299],"version":"5.9.3"} \ No newline at end of file From 7ef7fa51e6d429467204730e1f208c29489190e0 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 18 Jan 2026 14:47:30 -0600 Subject: [PATCH 17/77] refactor(ertp-ledgerguise): move Nat to jessie-tools --- packages/ertp-ledgerguise/src/index.ts | 12 +----------- packages/ertp-ledgerguise/src/jessie-tools.ts | 10 ++++++++++ packages/ertp-ledgerguise/src/purse.ts | 4 +--- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 00bbc18..85fe7d9 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -10,7 +10,7 @@ import type { IssuerKit } from '@agoric/ertp'; import type { Database } from 'better-sqlite3'; import { gcEmptySql } from './sql/gc_empty'; -import { freezeProps } from './jessie-tools'; +import { freezeProps, Nat } from './jessie-tools'; import { makeDeterministicGuid } from './guids'; import type { AccountPurse, @@ -60,15 +60,6 @@ const makeIssuerKitForCommodity = ({ nowMs: () => number; }): IssuerKitForCommodity => { const { freeze } = Object; - const Nat = (specimen: bigint) => { - if (typeof specimen !== 'bigint') { - throw new Error('amount must be bigint'); - } - if (specimen < 0n) { - throw new Error('amount must be non-negative'); - } - return specimen; - }; // TODO: consider validation of DB capability and schema. const displayInfo = freeze({ assetKind: 'nat' as const }); const amountShape = freeze({}); @@ -132,7 +123,6 @@ const makeIssuerKitForCommodity = ({ makePayment, paymentRecords, transferRecorder, - Nat, getBrand: () => brand, }); const brand = freezeProps({ diff --git a/packages/ertp-ledgerguise/src/jessie-tools.ts b/packages/ertp-ledgerguise/src/jessie-tools.ts index 0f24784..51d5c04 100644 --- a/packages/ertp-ledgerguise/src/jessie-tools.ts +++ b/packages/ertp-ledgerguise/src/jessie-tools.ts @@ -8,3 +8,13 @@ export const freezeProps = >( } return Object.freeze(obj); }; + +export const Nat = (specimen: bigint) => { + if (typeof specimen !== 'bigint') { + throw new Error('amount must be bigint'); + } + if (specimen < 0n) { + throw new Error('amount must be non-negative'); + } + return specimen; +}; diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index 817fe8a..b005cc0 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -1,4 +1,4 @@ -import { freezeProps } from './jessie-tools'; +import { freezeProps, Nat } from './jessie-tools'; import { createAccountRow, ensureAccountRow, @@ -32,7 +32,6 @@ type PurseFactoryOptions = { >; /** @see makeTransferRecorder */ transferRecorder: ReturnType; - Nat: (specimen: bigint) => bigint; getBrand: () => unknown; }; export const makePurseFactory = ({ @@ -42,7 +41,6 @@ export const makePurseFactory = ({ makePayment, paymentRecords, transferRecorder, - Nat, getBrand, }: PurseFactoryOptions) => { const purseGuids = new WeakMap(); From 95f984277721aa15d38efcd159bc086cd165f3d2 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 18 Jan 2026 14:55:40 -0600 Subject: [PATCH 18/77] test(ertp-ledgerguise): factor community test utilities --- .../ertp-ledgerguise/test/adversarial.test.ts | 13 ++-- .../ertp-ledgerguise/test/community.test.ts | 78 ++++++++----------- .../ertp-ledgerguise/test/helpers/clock.ts | 11 +++ .../ertp-ledgerguise/test/ledgerguise.test.ts | 15 ++-- 4 files changed, 60 insertions(+), 57 deletions(-) create mode 100644 packages/ertp-ledgerguise/test/helpers/clock.ts diff --git a/packages/ertp-ledgerguise/test/adversarial.test.ts b/packages/ertp-ledgerguise/test/adversarial.test.ts index 4f81147..1b64ecc 100644 --- a/packages/ertp-ledgerguise/test/adversarial.test.ts +++ b/packages/ertp-ledgerguise/test/adversarial.test.ts @@ -7,6 +7,7 @@ import test from 'ava'; import Database from 'better-sqlite3'; import type { Brand, NatAmount } from '@agoric/ertp'; import { asGuid, createIssuerKit, initGnuCashSchema, openIssuerKit } from '../src/index'; +import { makeTestClock } from './helpers/clock'; const seedAccountBalance = ( db: import('better-sqlite3').Database, @@ -55,7 +56,7 @@ test('rejects negative withdraw amounts', t => { namespace: 'COMMODITY', mnemonic: 'BUCKS', }); - const nowMs = () => 0; + const nowMs = makeTestClock(); const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); const brand = issuedKit.brand as Brand<'nat'>; const bucks = (value: bigint): NatAmount => freeze({ brand, value }); @@ -83,7 +84,7 @@ test('makeEmptyPurse rejects account GUID collisions', t => { namespace: 'COMMODITY', mnemonic: 'BUCKS', }); - const nowMs = () => 0; + const nowMs = makeTestClock(); const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); seedAccountBalance(db, victimAccountGuid, issuedKit.commodityGuid, 25n); @@ -111,7 +112,7 @@ test('createIssuerKit rejects commodity GUID collisions', t => { namespace: 'COMMODITY', mnemonic: 'BUCKS', }); - const nowMs = () => 0; + const nowMs = makeTestClock(); t.throws(() => createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })), { message: /commodity/i, @@ -130,7 +131,7 @@ test('withdraw rejects wrong-brand amounts', t => { guidCounter += 1n; return asGuid(guid.toString(16).padStart(32, '0')); }; - const nowMs = () => 0; + const nowMs = makeTestClock(); const bucks = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const credits = freeze({ namespace: 'COMMODITY', mnemonic: 'CREDITS' }); @@ -161,7 +162,7 @@ test('openAccountPurse rejects wrong-commodity accounts', t => { guidCounter += 1n; return asGuid(guid.toString(16).padStart(32, '0')); }; - const nowMs = () => 0; + const nowMs = makeTestClock(); const bucks = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const credits = freeze({ namespace: 'COMMODITY', mnemonic: 'CREDITS' }); @@ -193,7 +194,7 @@ test('openAccountPurse rejects the holding account', t => { guidCounter += 1n; return asGuid(guid.toString(16).padStart(32, '0')); }; - const nowMs = () => 0; + const nowMs = makeTestClock(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const created = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); const reopened = openIssuerKit( diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts index 6d015f9..a835af2 100644 --- a/packages/ertp-ledgerguise/test/community.test.ts +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -14,6 +14,7 @@ import Database from 'better-sqlite3'; import type { Brand, NatAmount } from '@agoric/ertp'; import type { Guid } from '../src/types'; import { asGuid, createIssuerKit, initGnuCashSchema, makeChartFacet } from '../src/index'; +import { makeTestClock } from './helpers/clock'; type PurseLike = ReturnType['issuer']['makeEmptyPurse']>; @@ -26,7 +27,7 @@ type CommunityContext = { members: Map; }; -const state: { +const sharedState: { rootPurse?: PurseLike; rootGuid?: Guid; members: Map; @@ -34,6 +35,23 @@ const state: { const serial = test.serial as TestFn; +const getTotalForAccountType = ( + db: import('better-sqlite3').Database, + commodityGuid: Guid, + accountType: string, +) => { + const row = db + .prepare<[string, string], { total: string }>( + [ + 'SELECT COALESCE(SUM(quantity_num), 0) AS total', + 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', + "WHERE accounts.account_type = ? AND accounts.commodity_guid = ?", + ].join(' '), + ) + .get(accountType, commodityGuid); + return BigInt(row?.total ?? '0'); +}; + serial.before(t => { const { freeze } = Object; const dbPath = process.env.ERTP_DB ?? ':memory:'; @@ -46,7 +64,7 @@ serial.before(t => { guidCounter += 1n; return asGuid(guid.toString(16).padStart(32, '0')); }; - const nowMs = () => 0; + const nowMs = makeTestClock(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); const chart = makeChartFacet({ @@ -63,7 +81,7 @@ serial.before(t => { chart, brand, bucks, - members: state.members, + members: sharedState.members, }; }); @@ -87,8 +105,8 @@ serial('stage 1: create the community root account', t => { accountType: 'EQUITY', }); const rootGuid = kit.purses.getGuid(rootPurse); - state.rootPurse = rootPurse; - state.rootGuid = rootGuid; + sharedState.rootPurse = rootPurse; + sharedState.rootGuid = rootGuid; const row = t.context.db .prepare<[string], { name: string; account_type: string }>( @@ -101,34 +119,34 @@ serial('stage 1: create the community root account', t => { serial('stage 2: add member purses to the chart', t => { const { chart, kit } = t.context as CommunityContext; - t.truthy(state.rootGuid); + t.truthy(sharedState.rootGuid); const members = ['Alice', 'Bob', 'Carol']; for (const name of members) { const purse = kit.issuer.makeEmptyPurse(); chart.placePurse({ purse, name, - parentGuid: state.rootGuid, + parentGuid: sharedState.rootGuid, accountType: 'ASSET', }); - state.members.set(name, purse); + sharedState.members.set(name, purse); } - const aliceGuid = kit.purses.getGuid(state.members.get('Alice')!); + const aliceGuid = kit.purses.getGuid(sharedState.members.get('Alice')!); const row = t.context.db .prepare<[string], { name: string; parent_guid: string | null }>( 'SELECT name, parent_guid FROM accounts WHERE guid = ?', ) .get(aliceGuid); t.is(row?.name, 'Alice'); - t.is(row?.parent_guid, state.rootGuid); + t.is(row?.parent_guid, sharedState.rootGuid); }); serial('stage 3: award contributions to members', t => { const { kit, bucks } = t.context as CommunityContext; - const alice = state.members.get('Alice')!; - const bob = state.members.get('Bob')!; - const carol = state.members.get('Carol')!; + const alice = sharedState.members.get('Alice')!; + const bob = sharedState.members.get('Bob')!; + const carol = sharedState.members.get('Carol')!; alice.deposit(kit.mint.mintPayment(bucks(10n))); bob.deposit(kit.mint.mintPayment(bucks(7n))); @@ -142,35 +160,7 @@ serial('stage 3: award contributions to members', t => { serial('stage 4: run balance sheet and income statement', t => { const { db, kit } = t.context as CommunityContext; - const assetTotal = db - .prepare<[string], { total: string }>( - [ - 'SELECT COALESCE(SUM(quantity_num), 0) AS total', - 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', - "WHERE accounts.account_type = 'ASSET' AND accounts.commodity_guid = ?", - ].join(' '), - ) - .get(kit.commodityGuid)?.total; - const equityTotal = db - .prepare<[string], { total: string }>( - [ - 'SELECT COALESCE(SUM(quantity_num), 0) AS total', - 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', - "WHERE accounts.account_type = 'EQUITY' AND accounts.commodity_guid = ?", - ].join(' '), - ) - .get(kit.commodityGuid)?.total; - const expenseTotal = db - .prepare<[string], { total: string }>( - [ - 'SELECT COALESCE(SUM(quantity_num), 0) AS total', - 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', - "WHERE accounts.account_type = 'EXPENSE' AND accounts.commodity_guid = ?", - ].join(' '), - ) - .get(kit.commodityGuid)?.total; - - t.is(BigInt(assetTotal ?? '0'), 25n); - t.is(BigInt(equityTotal ?? '0'), -25n); - t.is(BigInt(expenseTotal ?? '0'), 0n); + t.is(getTotalForAccountType(db, kit.commodityGuid, 'ASSET'), 25n); + t.is(getTotalForAccountType(db, kit.commodityGuid, 'EQUITY'), -25n); + t.is(getTotalForAccountType(db, kit.commodityGuid, 'EXPENSE'), 0n); }); diff --git a/packages/ertp-ledgerguise/test/helpers/clock.ts b/packages/ertp-ledgerguise/test/helpers/clock.ts new file mode 100644 index 0000000..7a6dd0d --- /dev/null +++ b/packages/ertp-ledgerguise/test/helpers/clock.ts @@ -0,0 +1,11 @@ +export const makeTestClock = (startMs = Date.UTC(2020, 0, 1), stepDays = 3) => { + const stepMs = stepDays * 24 * 60 * 60 * 1000; + return (() => { + let now = startMs; + return () => { + const current = now; + now += stepMs; + return current; + }; + })(); +}; diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index bb1fc32..7d07d28 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -7,6 +7,7 @@ import test from 'ava'; import Database from 'better-sqlite3'; import type { Brand, NatAmount } from '@agoric/ertp'; import { asGuid, createIssuerKit, initGnuCashSchema, openIssuerKit } from '../src/index'; +import { makeTestClock } from './helpers/clock'; test('initGnuCashSchema creates GnuCash tables', t => { const db = new Database(':memory:'); @@ -38,7 +39,7 @@ test('brand.isMyIssuer rejects unrelated issuers', async t => { namespace: 'COMMODITY', mnemonic: 'BUCKS', }); - const nowMs = () => 0; + const nowMs = makeTestClock(); const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); const other = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); @@ -62,7 +63,7 @@ test('alice sends 10 to bob', t => { namespace: 'COMMODITY', mnemonic: 'BUCKS', }); - const nowMs = () => 0; + const nowMs = makeTestClock(); const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); const brand = issuedKit.brand as Brand<'nat'>; const bucks = (value: bigint): NatAmount => freeze({ brand, value }); @@ -93,7 +94,7 @@ test('alice-to-bob transfer records a single transaction', t => { namespace: 'COMMODITY', mnemonic: 'BUCKS', }); - const nowMs = () => 0; + const nowMs = makeTestClock(); const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); const brand = issuedKit.brand as Brand<'nat'>; const bucks = (value: bigint): NatAmount => freeze({ brand, value }); @@ -149,7 +150,7 @@ test('payments can be reified by check number', t => { namespace: 'COMMODITY', mnemonic: 'BUCKS', }); - const nowMs = () => 0; + const nowMs = makeTestClock(); const created = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); const brand = created.brand as Brand<'nat'>; const bucks = (value: bigint): NatAmount => freeze({ brand, value }); @@ -164,7 +165,7 @@ test('payments can be reified by check number', t => { ); const reopened = openIssuerKit( - freeze({ db, commodityGuid: created.commodityGuid, makeGuid, nowMs }), + freeze({ db, commodityGuid: created.commodityGuid, makeGuid, nowMs: makeTestClock() }), ); const reified = reopened.payments.openPayment( checkNumber, @@ -193,7 +194,7 @@ test('createIssuerKit persists balances across re-open', t => { }); const [aliceGuid, bobGuid, createdCommodityGuid] = (() => { - const nowMs = () => 0; + const nowMs = makeTestClock(); const created = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); t.truthy(created.issuer); t.truthy(created.brand); @@ -217,7 +218,7 @@ test('createIssuerKit persists balances across re-open', t => { })(); const reopened = openIssuerKit( - freeze({ db, commodityGuid: createdCommodityGuid, makeGuid, nowMs: () => 0 }), + freeze({ db, commodityGuid: createdCommodityGuid, makeGuid, nowMs: makeTestClock() }), ); t.is(reopened.accounts.openAccountPurse(aliceGuid).getCurrentAmount().value, 0n); t.is(reopened.accounts.openAccountPurse(bobGuid).getCurrentAmount().value, 10n); From 2f71f8e2bb5feab6f50d49dc2a8725b4d8a358b8 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 18 Jan 2026 15:06:49 -0600 Subject: [PATCH 19/77] feat(ertp-ledgerguise): format check numbers by time --- packages/ertp-ledgerguise/src/db-helpers.ts | 52 ++++++++++++++++--- .../ertp-ledgerguise/test/helpers/clock.ts | 5 +- .../ertp-ledgerguise/test/ledgerguise.test.ts | 33 ++++++++++++ 3 files changed, 81 insertions(+), 9 deletions(-) diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index 1f5ef0b..0fad8fc 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -165,6 +165,31 @@ export const makeTransferRecorder = ({ makeGuid: () => Guid; nowMs: () => number; }) => { + const formatCheckNumber = (nowMsValue: number) => { + const date = new Date(nowMsValue); + const hh = String(date.getUTCHours()).padStart(2, '0'); + const mm = String(date.getUTCMinutes()).padStart(2, '0'); + return `${hh}:${mm}`; + }; + + const resolveCheckNumber = (base: string) => { + const rows = db + .prepare<[string, string], { num: string }>( + 'SELECT num FROM transactions WHERE num = ? OR num LIKE ?', + ) + .all(base, `${base}.%`); + if (rows.length === 0) return base; + let maxSuffix = 1; + for (const row of rows) { + if (row.num === base) continue; + const suffix = Number(row.num.slice(base.length + 1)); + if (Number.isInteger(suffix) && suffix > maxSuffix) { + maxSuffix = suffix; + } + } + return `${base}.${maxSuffix + 1}`; + }; + const recordSplit = ( txGuid: Guid, accountGuid: Guid, @@ -194,29 +219,40 @@ export const makeTransferRecorder = ({ return splitGuid; }; - const recordTransaction = (txGuid: Guid, amount: bigint, checkNumber: string) => { - const now = new Date(nowMs()).toISOString().slice(0, 19); + const recordTransaction = ( + txGuid: Guid, + amount: bigint, + checkNumber: string, + nowMsValue: number, + ) => { + const seconds = Math.floor(nowMsValue / 1000); db.prepare( [ 'INSERT INTO transactions(', 'guid, currency_guid, num, post_date, enter_date, description', - ') VALUES (?, ?, ?, ?, ?, ?)', + ") VALUES (?, ?, ?, date(?, 'unixepoch'), date(?, 'unixepoch'), ?)", ].join(' '), - ).run(txGuid, commodityGuid, checkNumber, now, now, `ledgerguise ${amount.toString()}`); + ).run( + txGuid, + commodityGuid, + checkNumber, + seconds, + seconds, + `ledgerguise ${amount.toString()}`, + ); }; const createHold = ({ fromAccountGuid, amount, - checkNumber, }: { fromAccountGuid: Guid; amount: bigint; - checkNumber?: string; }) => { + const nowMsValue = nowMs(); const txGuid = makeGuid(); - const resolvedCheckNumber = checkNumber ?? txGuid; - recordTransaction(txGuid, amount, resolvedCheckNumber); + const resolvedCheckNumber = resolveCheckNumber(formatCheckNumber(nowMsValue)); + recordTransaction(txGuid, amount, resolvedCheckNumber, nowMsValue); const holdingSplitGuid = recordSplit(txGuid, holdingAccountGuid, amount, 'n'); recordSplit(txGuid, fromAccountGuid, -amount, 'n'); return { txGuid, holdingSplitGuid, checkNumber: resolvedCheckNumber }; diff --git a/packages/ertp-ledgerguise/test/helpers/clock.ts b/packages/ertp-ledgerguise/test/helpers/clock.ts index 7a6dd0d..8623844 100644 --- a/packages/ertp-ledgerguise/test/helpers/clock.ts +++ b/packages/ertp-ledgerguise/test/helpers/clock.ts @@ -1,4 +1,7 @@ -export const makeTestClock = (startMs = Date.UTC(2020, 0, 1), stepDays = 3) => { +export const makeTestClock = ( + startMs = Date.UTC(2020, 0, 1, 9, 15), + stepDays = 3, +) => { const stepMs = stepDays * 24 * 60 * 60 * 1000; return (() => { let now = startMs; diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index 7d07d28..18491c2 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -176,6 +176,39 @@ test('payments can be reified by check number', t => { t.is(reopenedBob.getCurrentAmount().value, 10n); }); +test('check numbers increment on collisions', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const nowMs = (() => { + const fixed = Date.UTC(2020, 0, 1, 9, 15); + return () => fixed; + })(); + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const created = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const brand = created.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + + const p1 = created.mint.mintPayment(bucks(1n)); + const p2 = created.mint.mintPayment(bucks(1n)); + const n1 = created.payments.getCheckNumber(p1); + const n2 = created.payments.getCheckNumber(p2); + + t.is(n1, '09:15'); + t.is(n2, '09:15.2'); +}); + test('createIssuerKit persists balances across re-open', t => { const { freeze } = Object; const db = new Database(':memory:'); From a245f27150a7fe87255908dda51d39c874f898eb Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 18 Jan 2026 17:14:33 -0600 Subject: [PATCH 20/77] feat(ertp-ledgerguise): add escrow layer and mint charting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a minimal escrow layer that records a single transaction with holding splits, optional description text, and unique check number enforcement, plus a unit test that swaps two purses via the holding account. Expose escrow from the package entry point and types; extend the chart facet with placeAccount plus placeholder support so non-purse accounts can be arranged in the tree. Expose mint info (holding/recovery GUIDs), rename the holding account to “Mint Holding,” ensure mint recovery is a STOCK account, and allow account creation helpers to accept parent GUIDs. Rework the community story to use escrow awards, variable issue values and varied issue-style descriptions; expand to 7 members across 3 weeks; create Mint as a root-level placeholder with holding/recovery under it; switch the chart subtree to STOCK accounts; and exclude the holding account from statement totals. Store transaction dates as full timestamps using datetime(date(...)) so GnuCash parses them consistently. Tests: npm run check (in packages/ertp-ledgerguise) --- packages/ertp-ledgerguise/src/chart.ts | 80 +++++-- packages/ertp-ledgerguise/src/db-helpers.ts | 14 +- packages/ertp-ledgerguise/src/escrow.ts | 154 +++++++++++++ packages/ertp-ledgerguise/src/index.ts | 40 +++- packages/ertp-ledgerguise/src/types.ts | 30 +++ .../ertp-ledgerguise/test/adversarial.test.ts | 2 +- .../ertp-ledgerguise/test/community.test.ts | 215 +++++++++++++++--- packages/ertp-ledgerguise/test/escrow.test.ts | 56 +++++ 8 files changed, 522 insertions(+), 69 deletions(-) create mode 100644 packages/ertp-ledgerguise/src/escrow.ts create mode 100644 packages/ertp-ledgerguise/test/escrow.test.ts diff --git a/packages/ertp-ledgerguise/src/chart.ts b/packages/ertp-ledgerguise/src/chart.ts index b2f39f7..64b50d2 100644 --- a/packages/ertp-ledgerguise/src/chart.ts +++ b/packages/ertp-ledgerguise/src/chart.ts @@ -17,34 +17,80 @@ export const makeChartFacet = ({ db: import('better-sqlite3').Database; commodityGuid: Guid; getPurseGuid: (purse: unknown) => Guid; -}): ChartFacet => - freezeProps({ +}): ChartFacet => { + const updateAccount = ({ + accountGuid, + name, + parentGuid, + accountType, + placeholder, + }: { + accountGuid: Guid; + name: string; + parentGuid: Guid | null; + accountType: string; + placeholder: boolean; + }) => { + requireAccountCommodity({ db, accountGuid, commodityGuid }); + if (parentGuid !== null) { + const row = db + .prepare<[string], { guid: string }>('SELECT guid FROM accounts WHERE guid = ?') + .get(parentGuid); + if (!row) { + throw new Error('parent account not found'); + } + } + db.prepare( + [ + 'UPDATE accounts SET name = ?, account_type = ?, parent_guid = ?, placeholder = ?', + 'WHERE guid = ?', + ].join(' '), + ).run(name, accountType, parentGuid, placeholder ? 1 : 0, accountGuid); + }; + + return freezeProps({ placePurse: ({ purse, name, parentGuid = null, accountType = 'ASSET', + placeholder = false, }: { purse: unknown; name: string; parentGuid?: Guid | null; accountType?: string; + placeholder?: boolean; }) => { const purseGuid = getPurseGuid(purse); - requireAccountCommodity({ db, accountGuid: purseGuid, commodityGuid }); - if (parentGuid !== null) { - const row = db - .prepare<[string], { guid: string }>('SELECT guid FROM accounts WHERE guid = ?') - .get(parentGuid); - if (!row) { - throw new Error('parent account not found'); - } - } - db.prepare( - [ - 'UPDATE accounts SET name = ?, account_type = ?, parent_guid = ?', - 'WHERE guid = ?', - ].join(' '), - ).run(name, accountType, parentGuid, purseGuid); + updateAccount({ + accountGuid: purseGuid, + name, + parentGuid, + accountType, + placeholder, + }); + }, + placeAccount: ({ + accountGuid, + name, + parentGuid = null, + accountType = 'ASSET', + placeholder = false, + }: { + accountGuid: Guid; + name: string; + parentGuid?: Guid | null; + accountType?: string; + placeholder?: boolean; + }) => { + updateAccount({ + accountGuid, + name, + parentGuid, + accountType, + placeholder, + }); }, }); +}; diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index 0fad8fc..2748339 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -61,20 +61,22 @@ export const ensureAccountRow = ({ name, commodityGuid, accountType = 'ASSET', + parentGuid = null, }: { db: Database; accountGuid: Guid; name: string; commodityGuid: Guid; accountType?: string; + parentGuid?: Guid | null; }): void => { db.prepare( [ 'INSERT OR IGNORE INTO accounts(', 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', - ') VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0)', + ') VALUES (?, ?, ?, ?, ?, ?, ?, NULL, NULL, 0, 0)', ].join(' '), - ).run(accountGuid, name, accountType, commodityGuid, 1, 0); + ).run(accountGuid, name, accountType, commodityGuid, 1, 0, parentGuid); }; export const createAccountRow = ({ @@ -83,12 +85,14 @@ export const createAccountRow = ({ name, commodityGuid, accountType = 'ASSET', + parentGuid = null, }: { db: Database; accountGuid: Guid; name: string; commodityGuid: Guid; accountType?: string; + parentGuid?: Guid | null; }): void => { const row = db .prepare<[string], { guid: string }>('SELECT guid FROM accounts WHERE guid = ?') @@ -100,9 +104,9 @@ export const createAccountRow = ({ [ 'INSERT INTO accounts(', 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', - ') VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0)', + ') VALUES (?, ?, ?, ?, ?, ?, ?, NULL, NULL, 0, 0)', ].join(' '), - ).run(accountGuid, name, accountType, commodityGuid, 1, 0); + ).run(accountGuid, name, accountType, commodityGuid, 1, 0, parentGuid); }; export const requireAccountCommodity = ({ @@ -230,7 +234,7 @@ export const makeTransferRecorder = ({ [ 'INSERT INTO transactions(', 'guid, currency_guid, num, post_date, enter_date, description', - ") VALUES (?, ?, ?, date(?, 'unixepoch'), date(?, 'unixepoch'), ?)", + ") VALUES (?, ?, ?, datetime(date(?, 'unixepoch')), datetime(date(?, 'unixepoch')), ?)", ].join(' '), ).run( txGuid, diff --git a/packages/ertp-ledgerguise/src/escrow.ts b/packages/ertp-ledgerguise/src/escrow.ts new file mode 100644 index 0000000..1142c4f --- /dev/null +++ b/packages/ertp-ledgerguise/src/escrow.ts @@ -0,0 +1,154 @@ +import { freezeProps, Nat } from './jessie-tools'; +import type { AmountLike, EscrowFacet, Guid } from './types'; +import { requireAccountCommodity } from './db-helpers'; + +/** + * @file Minimal two-party escrow layered on ERTP-style purses. + */ + +type EscrowRecord = { + txGuid: Guid; + leftHoldingSplitGuid: Guid; + rightHoldingSplitGuid: Guid; + leftAccountGuid: Guid; + rightAccountGuid: Guid; + leftToAccountGuid: Guid; + rightToAccountGuid: Guid; + live: boolean; +}; + +/** + * Create a two-party escrow with a single holding account for the brand. + */ +export const makeEscrow = ({ + db, + commodityGuid, + holdingAccountGuid, + getPurseGuid, + brand, + makeGuid, + nowMs, +}: { + db: import('better-sqlite3').Database; + commodityGuid: Guid; + holdingAccountGuid: Guid; + getPurseGuid: (purse: unknown) => Guid; + brand: unknown; + makeGuid: () => Guid; + nowMs: () => number; +}): EscrowFacet => { + const offers = new WeakMap(); + const assertAmount = (amount: AmountLike) => { + if (amount.brand !== brand) { + throw new Error('amount brand mismatch'); + } + return Nat(amount.value); + }; + const recordSplit = ( + txGuid: Guid, + accountGuid: Guid, + amount: bigint, + reconcileState = 'n', + ) => { + const splitGuid = makeGuid(); + db.prepare( + [ + 'INSERT INTO splits(', + 'guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date,', + 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', + ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', + ].join(' '), + ).run( + splitGuid, + txGuid, + accountGuid, + '', + '', + reconcileState, + amount.toString(), + 1, + amount.toString(), + 1, + ); + return splitGuid; + }; + const assertCheckNumberAvailable = (checkNumber: string) => { + if (!checkNumber) { + throw new Error('check number required'); + } + const row = db + .prepare<[string], { count: number }>( + 'SELECT COUNT(*) AS count FROM transactions WHERE num = ?', + ) + .get(checkNumber); + if (row && row.count > 0) { + throw new Error('check number already used'); + } + }; + const retargetSplit = (splitGuid: Guid, accountGuid: Guid) => { + db.prepare( + 'UPDATE splits SET account_guid = ?, reconcile_state = ? WHERE guid = ?', + ).run(accountGuid, 'c', splitGuid); + }; + const markCleared = (txGuid: Guid) => { + db.prepare('UPDATE splits SET reconcile_state = ? WHERE tx_guid = ?').run('c', txGuid); + }; + return freezeProps({ + makeOffer: (left, right, checkNumber, description = 'escrow') => { + assertCheckNumberAvailable(checkNumber); + const leftAmount = assertAmount(left.amount); + const rightAmount = assertAmount(right.amount); + const leftAccountGuid = getPurseGuid(left.fromPurse); + const rightAccountGuid = getPurseGuid(right.fromPurse); + const leftToAccountGuid = getPurseGuid(left.toPurse); + const rightToAccountGuid = getPurseGuid(right.toPurse); + requireAccountCommodity({ db, accountGuid: leftAccountGuid, commodityGuid }); + requireAccountCommodity({ db, accountGuid: rightAccountGuid, commodityGuid }); + requireAccountCommodity({ db, accountGuid: leftToAccountGuid, commodityGuid }); + requireAccountCommodity({ db, accountGuid: rightToAccountGuid, commodityGuid }); + const txGuid = makeGuid(); + const seconds = Math.floor(nowMs() / 1000); + db.prepare( + [ + 'INSERT INTO transactions(', + 'guid, currency_guid, num, post_date, enter_date, description', + ") VALUES (?, ?, ?, datetime(date(?, 'unixepoch')), datetime(date(?, 'unixepoch')), ?)", + ].join(' '), + ).run(txGuid, commodityGuid, checkNumber, seconds, seconds, description); + const leftHoldingSplitGuid = recordSplit(txGuid, holdingAccountGuid, leftAmount, 'n'); + const rightHoldingSplitGuid = recordSplit(txGuid, holdingAccountGuid, rightAmount, 'n'); + recordSplit(txGuid, leftAccountGuid, -leftAmount, 'n'); + recordSplit(txGuid, rightAccountGuid, -rightAmount, 'n'); + const offer = freezeProps({ + accept: () => { + const record = offers.get(offer); + if (!record?.live) throw new Error('escrow offer not live'); + record.live = false; + retargetSplit(record.leftHoldingSplitGuid, record.leftToAccountGuid); + retargetSplit(record.rightHoldingSplitGuid, record.rightToAccountGuid); + markCleared(record.txGuid); + }, + cancel: () => { + const record = offers.get(offer); + if (!record?.live) throw new Error('escrow offer not live'); + record.live = false; + retargetSplit(record.leftHoldingSplitGuid, record.leftAccountGuid); + retargetSplit(record.rightHoldingSplitGuid, record.rightAccountGuid); + markCleared(record.txGuid); + }, + getOfferId: () => txGuid, + }); + offers.set(offer, { + txGuid, + leftHoldingSplitGuid, + rightHoldingSplitGuid, + leftAccountGuid, + rightAccountGuid, + leftToAccountGuid, + rightToAccountGuid, + live: true, + }); + return offer; + }, + }); +}; diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 85fe7d9..887e494 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -30,15 +30,18 @@ import { makeTransferRecorder, } from './db-helpers'; import { makePurseFactory } from './purse'; +import { makeEscrow } from './escrow'; export type { CommoditySpec, + EscrowFacet, IssuerKitForCommodity, IssuerKitWithGuid, IssuerKitWithPurseGuids, } from './types'; export { asGuid } from './guids'; export { makeChartFacet } from './chart'; +export { makeEscrow } from './escrow'; /** * Initialize an empty sqlite database with the GnuCash schema. @@ -101,13 +104,15 @@ const makeIssuerKitForCommodity = ({ return payment; }; const getAllegedName = () => getCommodityAllegedName(db, commodityGuid); + const commodityLabel = getAllegedName(); const balanceAccountGuid = makeDeterministicGuid(`ledgerguise-balance:${commodityGuid}`); ensureAccountRow({ db, accountGuid: balanceAccountGuid, - name: 'Ledgerguise Balance', + name: `${commodityLabel} Mint Holding`, commodityGuid, - accountType: 'EQUITY', + // GnuCash requires non-currency commodities to live under STOCK/MUTUAL/related accounts. + accountType: 'STOCK', }); const transferRecorder = makeTransferRecorder({ db, @@ -165,10 +170,15 @@ const makeIssuerKitForCommodity = ({ return makePayment(amount, balanceAccountGuid, txGuid, holdingSplitGuid, checkNumber); }, }); - const mintRecoveryPurse = ensurePurse( - makeDeterministicGuid(`ledgerguise:recovery:${commodityGuid}`), - '__mintRecovery', - ); + const mintRecoveryGuid = makeDeterministicGuid(`ledgerguise:recovery:${commodityGuid}`); + ensureAccountRow({ + db, + accountGuid: mintRecoveryGuid, + name: `${commodityLabel} Mint Recovery`, + commodityGuid, + accountType: 'STOCK', + }); + const mintRecoveryPurse = openPurse(mintRecoveryGuid, `${commodityLabel} Mint Recovery`); const kit = freeze({ brand, issuer, @@ -176,6 +186,12 @@ const makeIssuerKitForCommodity = ({ mintRecoveryPurse, displayInfo, }) as unknown as IssuerKit; + const mintInfo = freezeProps({ + getMintInfo: () => ({ + holdingAccountGuid: balanceAccountGuid, + recoveryPurseGuid: mintRecoveryGuid, + }), + }); const payments = freezeProps({ getCheckNumber: (payment: unknown) => { const record = paymentRecords.get(payment as object); @@ -251,7 +267,7 @@ const makeIssuerKitForCommodity = ({ return openPurse(accountGuid, accountGuid); }, }); - return freezeProps({ kit, accounts, purseGuids, payments }); + return freezeProps({ kit, accounts, purseGuids, payments, mintInfo }); }; /** @@ -263,7 +279,7 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG // TODO: consider validation of DB capability and schema. const commodityGuid = makeGuid(); createCommodityRow({ db, guid: commodityGuid, commodity }); - const { kit, purseGuids, payments } = makeIssuerKitForCommodity({ + const { kit, purseGuids, payments, mintInfo } = makeIssuerKitForCommodity({ db, commodityGuid, makeGuid, @@ -276,7 +292,13 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG return guid; }, }); - return freezeProps({ ...kit, commodityGuid, purses, payments }) as IssuerKitWithPurseGuids; + return freezeProps({ + ...kit, + commodityGuid, + purses, + payments, + mintInfo, + }) as IssuerKitWithPurseGuids; }; /** diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index baf1e34..69805b0 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -54,6 +54,7 @@ export type IssuerKitForCommodity = { accounts: AccountPurseAccess; purseGuids: WeakMap; payments: PaymentAccess; + mintInfo: MintInfoAccess; }; export type IssuerKitWithGuid = IssuerKit & { commodityGuid: Guid }; @@ -63,6 +64,7 @@ export type IssuerKitWithPurseGuids = IssuerKitWithGuid & { getGuid: (purse: unknown) => Guid; }; payments: PaymentAccess; + mintInfo: MintInfoAccess; }; export type PaymentAccess = { @@ -70,13 +72,41 @@ export type PaymentAccess = { openPayment: (checkNumber: string) => object; }; +export type MintInfoAccess = { + getMintInfo: () => { + holdingAccountGuid: Guid; + recoveryPurseGuid: Guid; + }; +}; + export type ChartFacet = { placePurse: (args: { purse: unknown; name: string; parentGuid?: Guid | null; accountType?: string; + placeholder?: boolean; + }) => void; + placeAccount: (args: { + accountGuid: Guid; + name: string; + parentGuid?: Guid | null; + accountType?: string; + placeholder?: boolean; }) => void; }; +export type EscrowFacet = { + makeOffer: ( + left: { fromPurse: unknown; toPurse: unknown; amount: AmountLike }, + right: { fromPurse: unknown; toPurse: unknown; amount: AmountLike }, + checkNumber: string, + description?: string, + ) => { + accept: () => void; + cancel: () => void; + getOfferId: () => string; + }; +}; + export type { Guid } from './guids'; diff --git a/packages/ertp-ledgerguise/test/adversarial.test.ts b/packages/ertp-ledgerguise/test/adversarial.test.ts index 1b64ecc..58637a2 100644 --- a/packages/ertp-ledgerguise/test/adversarial.test.ts +++ b/packages/ertp-ledgerguise/test/adversarial.test.ts @@ -205,7 +205,7 @@ test('openAccountPurse rejects the holding account', t => { .prepare<[string, string], { guid: string }>( 'SELECT guid FROM accounts WHERE name = ? AND commodity_guid = ?', ) - .get('Ledgerguise Balance', created.commodityGuid); + .get('BUCKS Mint Holding', created.commodityGuid); t.truthy(row?.guid); t.throws(() => reopened.accounts.openAccountPurse(asGuid(row!.guid)), { diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts index a835af2..68f1013 100644 --- a/packages/ertp-ledgerguise/test/community.test.ts +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -13,7 +13,14 @@ import test, { TestFn } from 'ava'; import Database from 'better-sqlite3'; import type { Brand, NatAmount } from '@agoric/ertp'; import type { Guid } from '../src/types'; -import { asGuid, createIssuerKit, initGnuCashSchema, makeChartFacet } from '../src/index'; +import { + asGuid, + createIssuerKit, + initGnuCashSchema, + makeChartFacet, + makeEscrow, +} from '../src/index'; +import { makeDeterministicGuid } from '../src/guids'; import { makeTestClock } from './helpers/clock'; type PurseLike = ReturnType['issuer']['makeEmptyPurse']>; @@ -22,16 +29,24 @@ type CommunityContext = { db: import('better-sqlite3').Database; kit: ReturnType; chart: ReturnType; + escrow: ReturnType; brand: Brand<'nat'>; bucks: (value: bigint) => NatAmount; - members: Map; }; const sharedState: { rootPurse?: PurseLike; rootGuid?: Guid; - members: Map; -} = { members: new Map() }; + treasuryPurse?: PurseLike; + workPurse?: PurseLike; + inParentGuid?: Guid; + outParentGuid?: Guid; + inPurses: Map; + outPurses: Map; +} = { + inPurses: new Map(), + outPurses: new Map(), +}; const serial = test.serial as TestFn; @@ -39,16 +54,22 @@ const getTotalForAccountType = ( db: import('better-sqlite3').Database, commodityGuid: Guid, accountType: string, + excludeGuids: Guid[] = [], ) => { + const filters = excludeGuids.length + ? ` AND accounts.guid NOT IN (${excludeGuids.map(() => '?').join(', ')})` + : ''; const row = db - .prepare<[string, string], { total: string }>( + .prepare( [ 'SELECT COALESCE(SUM(quantity_num), 0) AS total', 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', - "WHERE accounts.account_type = ? AND accounts.commodity_guid = ?", + `WHERE accounts.account_type = ? AND accounts.commodity_guid = ?${filters}`, ].join(' '), ) - .get(accountType, commodityGuid); + .get( + ...([accountType, commodityGuid, ...excludeGuids] as string[]), + ) as { total: string } | undefined; return BigInt(row?.total ?? '0'); }; @@ -64,7 +85,7 @@ serial.before(t => { guidCounter += 1n; return asGuid(guid.toString(16).padStart(32, '0')); }; - const nowMs = makeTestClock(); + const nowMs = makeTestClock(Date.UTC(2020, 0, 1, 9, 15), 1); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); const chart = makeChartFacet({ @@ -72,6 +93,15 @@ serial.before(t => { commodityGuid: kit.commodityGuid, getPurseGuid: kit.purses.getGuid, }); + const escrow = makeEscrow({ + db, + commodityGuid: kit.commodityGuid, + holdingAccountGuid: makeDeterministicGuid(`ledgerguise-balance:${kit.commodityGuid}`), + getPurseGuid: kit.purses.getGuid, + brand: kit.brand, + makeGuid, + nowMs, + }); const brand = kit.brand as Brand<'nat'>; const bucks = (value: bigint): NatAmount => freeze({ brand, value }); @@ -79,9 +109,9 @@ serial.before(t => { db, kit, chart, + escrow, brand, bucks, - members: sharedState.members, }; }); @@ -90,7 +120,7 @@ serial.after(t => { }); serial('stage 1: create the community root account', t => { - const { chart, kit } = t.context as CommunityContext; + const { chart, kit, bucks } = t.context as CommunityContext; const rootPurse = kit.issuer.makeEmptyPurse(); const gnucashRoot = t.context.db .prepare<[], { root_account_guid: string }>( @@ -98,69 +128,180 @@ serial('stage 1: create the community root account', t => { ) .get(); t.truthy(gnucashRoot?.root_account_guid); + // GnuCash only shows commodity balances under STOCK/MUTUAL-style subtrees. chart.placePurse({ purse: rootPurse, - name: 'Community Root', + name: 'Org1', parentGuid: gnucashRoot!.root_account_guid as Guid, - accountType: 'EQUITY', + accountType: 'STOCK', }); const rootGuid = kit.purses.getGuid(rootPurse); sharedState.rootPurse = rootPurse; sharedState.rootGuid = rootGuid; + const mintParentPurse = kit.issuer.makeEmptyPurse(); + const commodityLabel = kit.brand.getAllegedName(); + chart.placePurse({ + purse: mintParentPurse, + name: `${commodityLabel} Mint`, + parentGuid: gnucashRoot!.root_account_guid as Guid, + accountType: 'STOCK', + placeholder: true, + }); + const mintParentGuid = kit.purses.getGuid(mintParentPurse); + const { holdingAccountGuid, recoveryPurseGuid } = kit.mintInfo.getMintInfo(); + chart.placeAccount({ + accountGuid: holdingAccountGuid, + name: `${commodityLabel} Mint Holding`, + parentGuid: mintParentGuid, + accountType: 'STOCK', + }); + chart.placePurse({ + purse: kit.mintRecoveryPurse, + name: `${commodityLabel} Mint Recovery`, + parentGuid: mintParentGuid, + accountType: 'STOCK', + }); + + const treasuryPurse = kit.issuer.makeEmptyPurse(); + chart.placePurse({ + purse: treasuryPurse, + name: 'Treasury', + parentGuid: rootGuid, + accountType: 'STOCK', + }); + const treasuryPayment = kit.mint.mintPayment(bucks(10_000n)); + treasuryPurse.deposit(treasuryPayment); + sharedState.treasuryPurse = treasuryPurse; + + const workPurse = kit.issuer.makeEmptyPurse(); + chart.placePurse({ + purse: workPurse, + name: 'Work', + parentGuid: rootGuid, + accountType: 'STOCK', + }); + sharedState.workPurse = workPurse; + const row = t.context.db .prepare<[string], { name: string; account_type: string }>( 'SELECT name, account_type FROM accounts WHERE guid = ?', ) .get(rootGuid); - t.is(row?.name, 'Community Root'); - t.is(row?.account_type, 'EQUITY'); + t.is(row?.name, 'Org1'); + t.is(row?.account_type, 'STOCK'); }); serial('stage 2: add member purses to the chart', t => { const { chart, kit } = t.context as CommunityContext; t.truthy(sharedState.rootGuid); - const members = ['Alice', 'Bob', 'Carol']; + const inPurse = kit.issuer.makeEmptyPurse(); + chart.placePurse({ + purse: inPurse, + name: 'In', + parentGuid: sharedState.rootGuid, + accountType: 'STOCK', + }); + const inGuid = kit.purses.getGuid(inPurse); + sharedState.inParentGuid = inGuid; + const outPurse = kit.issuer.makeEmptyPurse(); + chart.placePurse({ + purse: outPurse, + name: 'Out', + parentGuid: sharedState.rootGuid, + accountType: 'STOCK', + }); + const outGuid = kit.purses.getGuid(outPurse); + sharedState.outParentGuid = outGuid; + const members = ['Alice', 'Bob', 'Carol', 'Dave', 'Peggy', 'Mallory', 'Eve']; for (const name of members) { - const purse = kit.issuer.makeEmptyPurse(); + const inMember = kit.issuer.makeEmptyPurse(); + chart.placePurse({ + purse: inMember, + name, + parentGuid: inGuid, + accountType: 'STOCK', + }); + sharedState.inPurses.set(name, inMember); + const outMember = kit.issuer.makeEmptyPurse(); chart.placePurse({ - purse, + purse: outMember, name, - parentGuid: sharedState.rootGuid, - accountType: 'ASSET', + parentGuid: outGuid, + accountType: 'STOCK', }); - sharedState.members.set(name, purse); + sharedState.outPurses.set(name, outMember); } - const aliceGuid = kit.purses.getGuid(sharedState.members.get('Alice')!); + const aliceGuid = kit.purses.getGuid(sharedState.outPurses.get('Alice')!); const row = t.context.db .prepare<[string], { name: string; parent_guid: string | null }>( 'SELECT name, parent_guid FROM accounts WHERE guid = ?', ) .get(aliceGuid); t.is(row?.name, 'Alice'); - t.is(row?.parent_guid, sharedState.rootGuid); + t.is(row?.parent_guid, sharedState.outParentGuid); }); serial('stage 3: award contributions to members', t => { - const { kit, bucks } = t.context as CommunityContext; - const alice = sharedState.members.get('Alice')!; - const bob = sharedState.members.get('Bob')!; - const carol = sharedState.members.get('Carol')!; - - alice.deposit(kit.mint.mintPayment(bucks(10n))); - bob.deposit(kit.mint.mintPayment(bucks(7n))); - carol.deposit(kit.mint.mintPayment(bucks(3n))); - bob.deposit(kit.mint.mintPayment(bucks(5n))); - - t.is(alice.getCurrentAmount().value, 10n); - t.is(bob.getCurrentAmount().value, 12n); - t.is(carol.getCurrentAmount().value, 3n); + const { kit, bucks, escrow } = t.context as CommunityContext; + const treasury = sharedState.treasuryPurse!; + const workPurse = sharedState.workPurse!; + const members = ['Alice', 'Bob', 'Carol', 'Dave', 'Peggy', 'Mallory', 'Eve']; + const contributionsByWeek = [ + [1, 0, 2, 0, 1, 0, 3], + [0, 1, 0, 2, 0, 1, 3], + [2, 0, 1, 0, 2, 0, 2], + ]; + const totalsByMember = new Map(); + for (const name of members) { + totalsByMember.set(name, 0n); + } + let issueCounter = 123; + const issueValue = (issueNumber: number) => BigInt(1 + ((issueNumber - 123) % 5)); + const issueSubjects = [ + 'improve treasury report', + 'refactor chart placement', + 'audit mint recovery', + 'document escrow flow', + 'tighten adversarial tests', + ]; + const issueDescription = (issueNumber: number) => + `#${issueNumber}: ${issueSubjects[(issueNumber - 123) % issueSubjects.length]}`; + const award = (name: string, count: number) => { + const inPurse = sharedState.inPurses.get(name)!; + const outPurse = sharedState.outPurses.get(name)!; + for (let i = 0; i < count; i += 1) { + const value = issueValue(issueCounter); + const offer = escrow.makeOffer( + { fromPurse: inPurse, toPurse: workPurse, amount: bucks(value) }, + { fromPurse: treasury, toPurse: outPurse, amount: bucks(value) }, + `issue-${issueCounter}`, + issueDescription(issueCounter), + ); + issueCounter += 1; + offer.accept(); + totalsByMember.set(name, totalsByMember.get(name)! + value); + } + }; + for (const week of contributionsByWeek) { + for (const [index, count] of week.entries()) { + const name = members[index]; + award(name, count); + } + } + for (const name of members) { + const outPurse = sharedState.outPurses.get(name)!; + t.is(outPurse.getCurrentAmount().value, totalsByMember.get(name)!); + } }); serial('stage 4: run balance sheet and income statement', t => { const { db, kit } = t.context as CommunityContext; - t.is(getTotalForAccountType(db, kit.commodityGuid, 'ASSET'), 25n); - t.is(getTotalForAccountType(db, kit.commodityGuid, 'EQUITY'), -25n); + const holdingGuid = makeDeterministicGuid(`ledgerguise-balance:${kit.commodityGuid}`); + // Exclude the holding account from statement totals; it acts as equity-like backing. + t.is(getTotalForAccountType(db, kit.commodityGuid, 'STOCK', [holdingGuid]), 10_000n); + t.is(getTotalForAccountType(db, kit.commodityGuid, 'EQUITY'), 0n); t.is(getTotalForAccountType(db, kit.commodityGuid, 'EXPENSE'), 0n); + t.is(getTotalForAccountType(db, kit.commodityGuid, 'INCOME'), 0n); }); diff --git a/packages/ertp-ledgerguise/test/escrow.test.ts b/packages/ertp-ledgerguise/test/escrow.test.ts new file mode 100644 index 0000000..e1df964 --- /dev/null +++ b/packages/ertp-ledgerguise/test/escrow.test.ts @@ -0,0 +1,56 @@ +/** + * @file Minimal escrow tests. + * @see ../src/escrow.ts + */ + +import test from 'ava'; +import Database from 'better-sqlite3'; +import type { Brand, NatAmount } from '@agoric/ertp'; +import { asGuid, createIssuerKit, initGnuCashSchema, makeEscrow } from '../src/index'; +import { makeDeterministicGuid } from '../src/guids'; +import { makeTestClock } from './helpers/clock'; + +test('escrow swaps two purses with a single holding account', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const nowMs = makeTestClock(); + const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); + const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const brand = kit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + + const holdingAccountGuid = makeDeterministicGuid(`ledgerguise-balance:${kit.commodityGuid}`); + const escrow = makeEscrow({ + db, + commodityGuid: kit.commodityGuid, + holdingAccountGuid, + getPurseGuid: kit.purses.getGuid, + brand: kit.brand, + makeGuid, + nowMs, + }); + + const alice = kit.issuer.makeEmptyPurse(); + const bob = kit.issuer.makeEmptyPurse(); + alice.deposit(kit.mint.mintPayment(bucks(5n))); + bob.deposit(kit.mint.mintPayment(bucks(4n))); + + const offer = escrow.makeOffer( + { fromPurse: alice, toPurse: bob, amount: bucks(3n) }, + { fromPurse: bob, toPurse: alice, amount: bucks(2n) }, + 'issue-123', + ); + offer.accept(); + + t.is(alice.getCurrentAmount().value, 4n); + t.is(bob.getCurrentAmount().value, 5n); +}); From dc9a62c9483d8b709b384e9e5919eca3481bbc9b Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 18 Jan 2026 23:33:55 -0600 Subject: [PATCH 21/77] feat(ertp-clerk): add minimal worker scaffold --- packages/ertp-clerk/.gitignore | 1 + packages/ertp-clerk/CONTRIBUTING.md | 21 + packages/ertp-clerk/README.md | 5 + packages/ertp-clerk/package-lock.json | 1583 +++++++++++++++++++++++++ packages/ertp-clerk/package.json | 13 + packages/ertp-clerk/src/index.ts | 9 + packages/ertp-clerk/wrangler.toml | 6 + 7 files changed, 1638 insertions(+) create mode 100644 packages/ertp-clerk/.gitignore create mode 100644 packages/ertp-clerk/CONTRIBUTING.md create mode 100644 packages/ertp-clerk/README.md create mode 100644 packages/ertp-clerk/package-lock.json create mode 100644 packages/ertp-clerk/package.json create mode 100644 packages/ertp-clerk/src/index.ts create mode 100644 packages/ertp-clerk/wrangler.toml diff --git a/packages/ertp-clerk/.gitignore b/packages/ertp-clerk/.gitignore new file mode 100644 index 0000000..b75a0fa --- /dev/null +++ b/packages/ertp-clerk/.gitignore @@ -0,0 +1 @@ +.wrangler/ diff --git a/packages/ertp-clerk/CONTRIBUTING.md b/packages/ertp-clerk/CONTRIBUTING.md new file mode 100644 index 0000000..83e621b --- /dev/null +++ b/packages/ertp-clerk/CONTRIBUTING.md @@ -0,0 +1,21 @@ +# CONTRIBUTING + +Thanks for your interest in contributing! This package will host the worker/service layer for ERTP-ledger access. + +## Scope + +- Keep changes limited to this package unless requested. +- Prefer minimal, explicit interfaces for the worker API. + +## Development + +- `wrangler dev` + +## TODO + +- Define the Cap'n Web interface surface for issuer/brand/purse/payment facets. +- Decide how capability references will be issued and revoked. +- Choose deployment target (Cloudflare Workers, workerd, or both) and document local dev. +- Add request routing conventions (per-ledger DO instance vs per-commodity vs per-org). +- Add error taxonomy and map ledger errors to HTTP status codes. +- Confirm whether the wrangler dependency warning about rollup-plugin-inject is acceptable or needs remediation per best practices. diff --git a/packages/ertp-clerk/README.md b/packages/ertp-clerk/README.md new file mode 100644 index 0000000..2c93f5a --- /dev/null +++ b/packages/ertp-clerk/README.md @@ -0,0 +1,5 @@ +# ertp-clerk + +A minimal worker that will eventually expose ERTP-ledger services over Cap'n Web. + +Current behavior: all HTTP requests return a failure response. diff --git a/packages/ertp-clerk/package-lock.json b/packages/ertp-clerk/package-lock.json new file mode 100644 index 0000000..a85f79c --- /dev/null +++ b/packages/ertp-clerk/package-lock.json @@ -0,0 +1,1583 @@ +{ + "name": "ertp-clerk", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ertp-clerk", + "version": "0.0.0", + "devDependencies": { + "wrangler": "^3.114.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz", + "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "mime": "^3.0.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.0.2.tgz", + "integrity": "sha512-nyzYnlZjjV5xT3LizahG1Iu6mnrCaxglJ04rZLpDwlDVDZ7v46lNsfxhV3A/xtfgQuSHmLnc6SVI+KwBpc3Lwg==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.14", + "workerd": "^1.20250124.0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250718.0.tgz", + "integrity": "sha512-FHf4t7zbVN8yyXgQ/r/GqLPaYZSGUVzeR7RnL28Mwj2djyw2ZergvytVc7fdGcczl6PQh+VKGfZCfUqpJlbi9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250718.0.tgz", + "integrity": "sha512-fUiyUJYyqqp4NqJ0YgGtp4WJh/II/YZsUnEb6vVy5Oeas8lUOxnN+ZOJ8N/6/5LQCVAtYCChRiIrBbfhTn5Z8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250718.0.tgz", + "integrity": "sha512-5+eb3rtJMiEwp08Kryqzzu8d1rUcK+gdE442auo5eniMpT170Dz0QxBrqkg2Z48SFUPYbj+6uknuA5tzdRSUSg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250718.0.tgz", + "integrity": "sha512-Aa2M/DVBEBQDdATMbn217zCSFKE+ud/teS+fFS+OQqKABLn0azO2qq6ANAHYOIE6Q3Sq4CxDIQr8lGdaJHwUog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250718.0.tgz", + "integrity": "sha512-dY16RXKffmugnc67LTbyjdDHZn5NoTF1yHEf2fN4+OaOnoGSp3N1x77QubTDwqZ9zECWxgQfDLjddcH8dWeFhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "dev": true, + "license": "ISC", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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": ">=6.0.0" + } + }, + "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/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "printable-characters": "^1.0.42" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.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==", + "dev": true, + "license": "MIT", + "optional": true, + "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==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true, + "license": "MIT" + }, + "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/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/miniflare": { + "version": "3.20250718.3", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20250718.3.tgz", + "integrity": "sha512-JuPrDJhwLrNLEJiNLWO7ZzJrv/Vv9kZuwMYCfv0LskQDM6Eonw4OvywO3CH/wCGjgHzha/qyjUh8JQ068TjDgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "8.14.0", + "acorn-walk": "8.3.2", + "exit-hook": "2.2.1", + "glob-to-regexp": "0.4.1", + "stoppable": "1.1.0", + "undici": "^5.28.5", + "workerd": "1.20250718.0", + "ws": "8.18.0", + "youch": "3.3.4", + "zod": "3.22.3" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "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/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "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/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "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/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "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==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/unenv": { + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.14.tgz", + "integrity": "sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "exsolve": "^1.0.1", + "ohash": "^2.0.10", + "pathe": "^2.0.3", + "ufo": "^1.5.4" + } + }, + "node_modules/workerd": { + "version": "1.20250718.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250718.0.tgz", + "integrity": "sha512-kqkIJP/eOfDlUyBzU7joBg+tl8aB25gEAGqDap+nFWb+WHhnooxjGHgxPBy3ipw2hnShPFNOQt5lFRxbwALirg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20250718.0", + "@cloudflare/workerd-darwin-arm64": "1.20250718.0", + "@cloudflare/workerd-linux-64": "1.20250718.0", + "@cloudflare/workerd-linux-arm64": "1.20250718.0", + "@cloudflare/workerd-windows-64": "1.20250718.0" + } + }, + "node_modules/wrangler": { + "version": "3.114.17", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.114.17.tgz", + "integrity": "sha512-tAvf7ly+tB+zwwrmjsCyJ2pJnnc7SZhbnNwXbH+OIdVas3zTSmjcZOjmLKcGGptssAA3RyTKhcF9BvKZzMUycA==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.3.4", + "@cloudflare/unenv-preset": "2.0.2", + "@esbuild-plugins/node-globals-polyfill": "0.2.3", + "@esbuild-plugins/node-modules-polyfill": "0.2.2", + "blake3-wasm": "2.1.5", + "esbuild": "0.17.19", + "miniflare": "3.20250718.3", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.14", + "workerd": "1.20250718.0" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=16.17.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20250408.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/youch": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz", + "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie": "^0.7.1", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "node_modules/zod": { + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", + "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/packages/ertp-clerk/package.json b/packages/ertp-clerk/package.json new file mode 100644 index 0000000..5a50bb4 --- /dev/null +++ b/packages/ertp-clerk/package.json @@ -0,0 +1,13 @@ +{ + "name": "ertp-clerk", + "version": "0.0.0", + "private": true, + "type": "module", + "main": "src/index.ts", + "scripts": { + "dev": "wrangler dev" + }, + "devDependencies": { + "wrangler": "^3.114.0" + } +} diff --git a/packages/ertp-clerk/src/index.ts b/packages/ertp-clerk/src/index.ts new file mode 100644 index 0000000..da7b27d --- /dev/null +++ b/packages/ertp-clerk/src/index.ts @@ -0,0 +1,9 @@ +const { freeze } = Object; + +const handler = { + async fetch(_request: Request): Promise { + return new Response('ertp-clerk: not implemented', { status: 501 }); + }, +}; + +export default freeze(handler); diff --git a/packages/ertp-clerk/wrangler.toml b/packages/ertp-clerk/wrangler.toml new file mode 100644 index 0000000..fe45ae6 --- /dev/null +++ b/packages/ertp-clerk/wrangler.toml @@ -0,0 +1,6 @@ +name = "ertp-clerk" +main = "src/index.ts" +compatibility_date = "2025-01-01" + +[observability] +enabled = true From 4ba3bd0d7cdf181f710a569e9a4864656f905c05 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 18 Jan 2026 23:35:48 -0600 Subject: [PATCH 22/77] docs(ertp-ledgerguise): add escrow TODO details --- packages/ertp-ledgerguise/CONTRIBUTING.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index e514aad..27439d9 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -114,3 +114,23 @@ Consequences: - Consider Flow B (accrual then payout): record contributor payable before minting. - Consider periodic minting (budgeted supply) vs per-contribution minting. +- Consider a read-only openIssuerKit facade with a reduced capability surface: + - No account access (no make/open purse). + - No mint access. + - No escrow access. + - Expose brand and displayInfo for identification. + - Expose issuer.getAmountOf / issuer.isLive for payment inspection. + - Optional: read-only chart/balance reporting facet (account tree, balances, recent txs). + - Keep payment reification behind a separate explicit capability if needed. +- Consider generalizing escrow beyond a single brand (e.g., $ for stock). Two design options: + - Dual-transaction escrow (one transaction per brand): + - Use one holding account per brand; write two transactions with a shared offer ID/check number. + - Each transaction stays single-commodity (currency_guid matches the brand commodity). + - Accept/cancel retargets each brand's holding split to the destination/source account. + - Pros: avoids TRADING accounts; preserves current ledger invariants. + - Cons: two txs to correlate; needs shared offer ID and consistency checks. + - Single-transaction with TRADING splits: + - Create a single transaction with both commodities plus balancing splits to a TRADING account. + - Leverages GnuCash's multi-commodity transaction model. + - Pros: one tx per offer; native to GnuCash if configured correctly. + - Cons: requires TRADING accounts and correct valuation; more complex and harder to audit. From 408974f8c150b9c5c8937eff9ffce7ab6c01d29b Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 18 Jan 2026 23:42:48 -0600 Subject: [PATCH 23/77] chore(ertp-ledgerguise): add package-local gitignore --- packages/ertp-ledgerguise/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 packages/ertp-ledgerguise/.gitignore diff --git a/packages/ertp-ledgerguise/.gitignore b/packages/ertp-ledgerguise/.gitignore new file mode 100644 index 0000000..6ab860d --- /dev/null +++ b/packages/ertp-ledgerguise/.gitignore @@ -0,0 +1,2 @@ +community1.db +community1.db.*.log From 4d8f03b2a8abdbd56df888296933b5eff861a18b Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 19 Jan 2026 00:51:08 -0600 Subject: [PATCH 24/77] refactor(ertp-ledgerguise): abstract sql database interface --- packages/ertp-ledgerguise/src/chart.ts | 3 ++- packages/ertp-ledgerguise/src/db-helpers.ts | 18 +++++++++--------- packages/ertp-ledgerguise/src/escrow.ts | 3 ++- packages/ertp-ledgerguise/src/index.ts | 7 ++++--- packages/ertp-ledgerguise/src/purse.ts | 3 ++- packages/ertp-ledgerguise/src/sql-db.ts | 12 ++++++++++++ packages/ertp-ledgerguise/src/types.ts | 6 +++--- 7 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 packages/ertp-ledgerguise/src/sql-db.ts diff --git a/packages/ertp-ledgerguise/src/chart.ts b/packages/ertp-ledgerguise/src/chart.ts index 64b50d2..c686591 100644 --- a/packages/ertp-ledgerguise/src/chart.ts +++ b/packages/ertp-ledgerguise/src/chart.ts @@ -1,4 +1,5 @@ import { freezeProps } from './jessie-tools'; +import type { SqlDatabase } from './sql-db'; import type { ChartFacet, Guid } from './types'; import { requireAccountCommodity } from './db-helpers'; @@ -14,7 +15,7 @@ export const makeChartFacet = ({ commodityGuid, getPurseGuid, }: { - db: import('better-sqlite3').Database; + db: SqlDatabase; commodityGuid: Guid; getPurseGuid: (purse: unknown) => Guid; }): ChartFacet => { diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index 2748339..3027d19 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -1,8 +1,8 @@ -import type { Database } from 'better-sqlite3'; +import type { SqlDatabase } from './sql-db'; import type { CommoditySpec, Guid } from './types'; export const ensureCommodityRow = ( - db: Database, + db: SqlDatabase, guid: Guid, commodity: CommoditySpec, ): void => { @@ -28,7 +28,7 @@ export const createCommodityRow = ({ guid, commodity, }: { - db: Database; + db: SqlDatabase; guid: Guid; commodity: CommoditySpec; }): void => { @@ -63,7 +63,7 @@ export const ensureAccountRow = ({ accountType = 'ASSET', parentGuid = null, }: { - db: Database; + db: SqlDatabase; accountGuid: Guid; name: string; commodityGuid: Guid; @@ -87,7 +87,7 @@ export const createAccountRow = ({ accountType = 'ASSET', parentGuid = null, }: { - db: Database; + db: SqlDatabase; accountGuid: Guid; name: string; commodityGuid: Guid; @@ -114,7 +114,7 @@ export const requireAccountCommodity = ({ accountGuid, commodityGuid, }: { - db: Database; + db: SqlDatabase; accountGuid: Guid; commodityGuid: Guid; }): void => { @@ -131,7 +131,7 @@ export const requireAccountCommodity = ({ } }; -export const getCommodityAllegedName = (db: Database, commodityGuid: Guid): string => { +export const getCommodityAllegedName = (db: SqlDatabase, commodityGuid: Guid): string => { const row = db .prepare<[string], { fullname: string | null; mnemonic: string }>( 'SELECT fullname, mnemonic FROM commodities WHERE guid = ?', @@ -140,7 +140,7 @@ export const getCommodityAllegedName = (db: Database, commodityGuid: Guid): stri return row?.fullname || row?.mnemonic || 'GnuCash'; }; -export const getAccountBalance = (db: Database, accountGuid: Guid): bigint => { +export const getAccountBalance = (db: SqlDatabase, accountGuid: Guid): bigint => { const row = db .prepare<[string], { qty: string }>( 'SELECT COALESCE(SUM(quantity_num), 0) AS qty FROM splits WHERE account_guid = ?', @@ -163,7 +163,7 @@ export const makeTransferRecorder = ({ makeGuid, nowMs, }: { - db: Database; + db: SqlDatabase; commodityGuid: Guid; holdingAccountGuid: Guid; makeGuid: () => Guid; diff --git a/packages/ertp-ledgerguise/src/escrow.ts b/packages/ertp-ledgerguise/src/escrow.ts index 1142c4f..2e61af6 100644 --- a/packages/ertp-ledgerguise/src/escrow.ts +++ b/packages/ertp-ledgerguise/src/escrow.ts @@ -1,5 +1,6 @@ import { freezeProps, Nat } from './jessie-tools'; import type { AmountLike, EscrowFacet, Guid } from './types'; +import type { SqlDatabase } from './sql-db'; import { requireAccountCommodity } from './db-helpers'; /** @@ -29,7 +30,7 @@ export const makeEscrow = ({ makeGuid, nowMs, }: { - db: import('better-sqlite3').Database; + db: SqlDatabase; commodityGuid: Guid; holdingAccountGuid: Guid; getPurseGuid: (purse: unknown) => Guid; diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 887e494..2c23a8f 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -8,7 +8,7 @@ */ import type { IssuerKit } from '@agoric/ertp'; -import type { Database } from 'better-sqlite3'; +import type { SqlDatabase } from './sql-db'; import { gcEmptySql } from './sql/gc_empty'; import { freezeProps, Nat } from './jessie-tools'; import { makeDeterministicGuid } from './guids'; @@ -42,12 +42,13 @@ export type { export { asGuid } from './guids'; export { makeChartFacet } from './chart'; export { makeEscrow } from './escrow'; +export type { SqlDatabase, SqlStatement } from './sql-db'; /** * Initialize an empty sqlite database with the GnuCash schema. * @see ./sql/gc_empty.sql */ -export const initGnuCashSchema = (db: Database): void => { +export const initGnuCashSchema = (db: SqlDatabase): void => { db.exec(gcEmptySql); }; @@ -57,7 +58,7 @@ const makeIssuerKitForCommodity = ({ makeGuid, nowMs, }: { - db: Database; + db: SqlDatabase; commodityGuid: Guid; makeGuid: () => Guid; nowMs: () => number; diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index b005cc0..6351555 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -7,9 +7,10 @@ import { requireAccountCommodity, } from './db-helpers'; import type { AccountPurse, AmountLike, Guid } from './types'; +import type { SqlDatabase } from './sql-db'; type PurseFactoryOptions = { - db: import('better-sqlite3').Database; + db: SqlDatabase; commodityGuid: Guid; makeAmount: (value: bigint) => AmountLike; makePayment: ( diff --git a/packages/ertp-ledgerguise/src/sql-db.ts b/packages/ertp-ledgerguise/src/sql-db.ts new file mode 100644 index 0000000..2d1d752 --- /dev/null +++ b/packages/ertp-ledgerguise/src/sql-db.ts @@ -0,0 +1,12 @@ +export type SqlStatement = { + run: (...params: any[]) => any; + get: (...params: any[]) => TRow | undefined; + all: (...params: any[]) => TRow[]; +}; + +export type SqlDatabase = { + exec: (sql: string) => void; + prepare: ( + sql: string, + ) => SqlStatement; +}; diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index 69805b0..ef60fc7 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -1,5 +1,5 @@ import type { IssuerKit } from '@agoric/ertp'; -import type { Database } from 'better-sqlite3'; +import type { SqlDatabase } from './sql-db'; import type { Guid } from './guids'; export type CommoditySpec = { @@ -11,7 +11,7 @@ export type CommoditySpec = { }; export type CreateIssuerConfig = { - db: Database; + db: SqlDatabase; commodity: CommoditySpec; /** * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. @@ -24,7 +24,7 @@ export type CreateIssuerConfig = { }; export type OpenIssuerConfig = { - db: Database; + db: SqlDatabase; commodityGuid: Guid; /** * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. From 93a468cd1757bc077b9aaf5fcc5aef4ab0f851a9 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 19 Jan 2026 00:51:27 -0600 Subject: [PATCH 25/77] feat(ertp-clerk): add DO-backed capnweb bootstrap --- packages/ertp-clerk/CONTRIBUTING.md | 3 + packages/ertp-clerk/package-lock.json | 1686 ++++++++++++++++-------- packages/ertp-clerk/package.json | 6 +- packages/ertp-clerk/src/index.ts | 56 +- packages/ertp-clerk/src/ledger-do.ts | 153 +++ packages/ertp-clerk/src/sql-adapter.ts | 35 + packages/ertp-clerk/wrangler.toml | 9 + 7 files changed, 1395 insertions(+), 553 deletions(-) create mode 100644 packages/ertp-clerk/src/ledger-do.ts create mode 100644 packages/ertp-clerk/src/sql-adapter.ts diff --git a/packages/ertp-clerk/CONTRIBUTING.md b/packages/ertp-clerk/CONTRIBUTING.md index 83e621b..da1cc02 100644 --- a/packages/ertp-clerk/CONTRIBUTING.md +++ b/packages/ertp-clerk/CONTRIBUTING.md @@ -19,3 +19,6 @@ Thanks for your interest in contributing! This package will host the worker/serv - Add request routing conventions (per-ledger DO instance vs per-commodity vs per-org). - Add error taxonomy and map ledger errors to HTTP status codes. - Confirm whether the wrangler dependency warning about rollup-plugin-inject is acceptable or needs remediation per best practices. +- Evaluate alternatives to loading capnweb from esm.sh (e.g., bundling locally). +- Replace better-sqlite3 with a Worker-compatible backend (Durable Object SQLite or D1) and keep IO injected. +- Consider moving the External wrapper into ertp-ledgerguise (Far/exo-style) so facets are RPC-ready. diff --git a/packages/ertp-clerk/package-lock.json b/packages/ertp-clerk/package-lock.json index a85f79c..28a3412 100644 --- a/packages/ertp-clerk/package-lock.json +++ b/packages/ertp-clerk/package-lock.json @@ -7,32 +7,48 @@ "": { "name": "ertp-clerk", "version": "0.0.0", + "dependencies": { + "capnweb": "^0.4.0", + "drizzle-orm": "^0.44.5" + }, + "devDependencies": { + "wrangler": "^4.59.2" + } + }, + "../ertp-ledgerguise": { + "name": "@finquick/ertp-ledgerguise", + "version": "0.0.1", + "extraneous": true, + "dependencies": { + "@agoric/ertp": "*", + "better-sqlite3": "^12.6.0" + }, "devDependencies": { - "wrangler": "^3.114.0" + "@types/better-sqlite3": "^7.6.1", + "ava": "^5.3.1", + "ts-node": "^10.9.2", + "typescript": "~5.9.3" } }, "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz", - "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", "dev": true, "license": "MIT OR Apache-2.0", - "dependencies": { - "mime": "^3.0.0" - }, "engines": { - "node": ">=16.13" + "node": ">=18.0.0" } }, "node_modules/@cloudflare/unenv-preset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.0.2.tgz", - "integrity": "sha512-nyzYnlZjjV5xT3LizahG1Iu6mnrCaxglJ04rZLpDwlDVDZ7v46lNsfxhV3A/xtfgQuSHmLnc6SVI+KwBpc3Lwg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.10.0.tgz", + "integrity": "sha512-/uII4vLQXhzCAZzEVeYAjFLBNg2nqTJ1JGzd2lRF6ItYe6U2zVoYGfeKpGx/EkBF6euiU+cyBXgMdtJih+nQ6g==", "dev": true, "license": "MIT OR Apache-2.0", "peerDependencies": { - "unenv": "2.0.0-rc.14", - "workerd": "^1.20250124.0" + "unenv": "2.0.0-rc.24", + "workerd": "^1.20251221.0" }, "peerDependenciesMeta": { "workerd": { @@ -41,9 +57,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20250718.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250718.0.tgz", - "integrity": "sha512-FHf4t7zbVN8yyXgQ/r/GqLPaYZSGUVzeR7RnL28Mwj2djyw2ZergvytVc7fdGcczl6PQh+VKGfZCfUqpJlbi9g==", + "version": "1.20260114.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260114.0.tgz", + "integrity": "sha512-HNlsRkfNgardCig2P/5bp/dqDECsZ4+NU5XewqArWxMseqt3C5daSuptI620s4pn7Wr0ZKg7jVLH0PDEBkA+aA==", "cpu": [ "x64" ], @@ -58,9 +74,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20250718.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250718.0.tgz", - "integrity": "sha512-fUiyUJYyqqp4NqJ0YgGtp4WJh/II/YZsUnEb6vVy5Oeas8lUOxnN+ZOJ8N/6/5LQCVAtYCChRiIrBbfhTn5Z8Q==", + "version": "1.20260114.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260114.0.tgz", + "integrity": "sha512-qyE1UdFnAlxzb+uCfN/d9c8icch7XRiH49/DjoqEa+bCDihTuRS7GL1RmhVIqHJhb3pX3DzxmKgQZBDBL83Inw==", "cpu": [ "arm64" ], @@ -75,9 +91,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20250718.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250718.0.tgz", - "integrity": "sha512-5+eb3rtJMiEwp08Kryqzzu8d1rUcK+gdE442auo5eniMpT170Dz0QxBrqkg2Z48SFUPYbj+6uknuA5tzdRSUSg==", + "version": "1.20260114.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260114.0.tgz", + "integrity": "sha512-Z0BLvAj/JPOabzads2ddDEfgExWTlD22pnwsuNbPwZAGTSZeQa3Y47eGUWyHk+rSGngknk++S7zHTGbKuG7RRg==", "cpu": [ "x64" ], @@ -92,9 +108,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20250718.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250718.0.tgz", - "integrity": "sha512-Aa2M/DVBEBQDdATMbn217zCSFKE+ud/teS+fFS+OQqKABLn0azO2qq6ANAHYOIE6Q3Sq4CxDIQr8lGdaJHwUog==", + "version": "1.20260114.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260114.0.tgz", + "integrity": "sha512-kPUmEtUxUWlr9PQ64kuhdK0qyo8idPe5IIXUgi7xCD7mDd6EOe5J7ugDpbfvfbYKEjx4DpLvN2t45izyI/Sodw==", "cpu": [ "arm64" ], @@ -109,9 +125,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20250718.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250718.0.tgz", - "integrity": "sha512-dY16RXKffmugnc67LTbyjdDHZn5NoTF1yHEf2fN4+OaOnoGSp3N1x77QubTDwqZ9zECWxgQfDLjddcH8dWeFhg==", + "version": "1.20260114.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260114.0.tgz", + "integrity": "sha512-MJnKgm6i1jZGyt2ZHQYCnRlpFTEZcK2rv9y7asS3KdVEXaDgGF8kOns5u6YL6/+eMogfZuHRjfDS+UqRTUYIFA==", "cpu": [ "x64" ], @@ -149,34 +165,27 @@ "tslib": "^2.4.0" } }, - "node_modules/@esbuild-plugins/node-globals-polyfill": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", - "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", - "dev": true, - "license": "ISC", - "peerDependencies": { - "esbuild": "*" - } - }, - "node_modules/@esbuild-plugins/node-modules-polyfill": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", - "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "escape-string-regexp": "^4.0.0", - "rollup-plugin-node-polyfills": "^0.2.1" - }, - "peerDependencies": { - "esbuild": "*" + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", "cpu": [ "arm" ], @@ -187,13 +196,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", "cpu": [ "arm64" ], @@ -204,13 +213,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", "cpu": [ "x64" ], @@ -221,13 +230,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", "cpu": [ "arm64" ], @@ -238,13 +247,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", "cpu": [ "x64" ], @@ -255,13 +264,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", "cpu": [ "arm64" ], @@ -272,13 +281,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", "cpu": [ "x64" ], @@ -289,13 +298,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", "cpu": [ "arm" ], @@ -306,13 +315,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", "cpu": [ "arm64" ], @@ -323,13 +332,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", "cpu": [ "ia32" ], @@ -340,13 +349,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", "cpu": [ "loong64" ], @@ -357,13 +366,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", "cpu": [ "mips64el" ], @@ -374,13 +383,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", "cpu": [ "ppc64" ], @@ -391,13 +400,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", "cpu": [ "riscv64" ], @@ -408,13 +417,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", "cpu": [ "s390x" ], @@ -425,13 +434,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", "cpu": [ "x64" ], @@ -442,13 +451,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", + "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", "cpu": [ "x64" ], @@ -459,13 +485,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", + "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", "cpu": [ "x64" ], @@ -476,13 +519,30 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", + "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", "cpu": [ "x64" ], @@ -493,13 +553,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", "cpu": [ "arm64" ], @@ -510,13 +570,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", "cpu": [ "ia32" ], @@ -527,13 +587,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", "cpu": [ "x64" ], @@ -544,23 +604,23 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "dev": true, "license": "MIT", "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", "cpu": [ "arm64" ], @@ -577,13 +637,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", "cpu": [ "x64" ], @@ -600,13 +660,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", "cpu": [ "arm64" ], @@ -621,9 +681,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "cpu": [ "x64" ], @@ -638,9 +698,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "cpu": [ "arm" ], @@ -655,9 +715,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "cpu": [ "arm64" ], @@ -671,10 +731,44 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", "cpu": [ "s390x" ], @@ -689,9 +783,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], @@ -706,9 +800,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "cpu": [ "arm64" ], @@ -723,9 +817,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "cpu": [ "x64" ], @@ -740,9 +834,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "cpu": [ "arm" ], @@ -759,13 +853,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" + "@img/sharp-libvips-linux-arm": "1.2.4" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", "cpu": [ "arm64" ], @@ -782,13 +876,59 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", "cpu": [ "s390x" ], @@ -805,13 +945,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" + "@img/sharp-libvips-linux-s390x": "1.2.4" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "cpu": [ "x64" ], @@ -828,13 +968,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" + "@img/sharp-libvips-linux-x64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", "cpu": [ "arm64" ], @@ -851,13 +991,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", "cpu": [ "x64" ], @@ -874,13 +1014,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", "cpu": [ "wasm32" ], @@ -888,7 +1028,7 @@ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.2.0" + "@emnapi/runtime": "^1.7.0" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -897,10 +1037,30 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", "cpu": [ "ia32" ], @@ -918,9 +1078,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "cpu": [ "x64" ], @@ -965,134 +1125,366 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "dependencies": { + "kleur": "^4.1.5" } }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.4.0" + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" } }, - "node_modules/as-table": { - "version": "1.0.55", - "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", - "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", "dev": true, "license": "MIT", - "dependencies": { - "printable-characters": "^1.0.42" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/blake3-wasm": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", - "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "node_modules/@speed-highlight/core": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.14.tgz", + "integrity": "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==", "dev": true, - "license": "MIT" + "license": "CC0-1.0" }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dev": true, + "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", + "optional": true, + "peer": true + }, + "node_modules/better-sqlite3": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.6.2.tgz", + "integrity": "sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==", + "hasInstallScript": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" }, "engines": { - "node": ">=12.5.0" + "node": "20.x || 22.x || 23.x || 24.x || 25.x" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "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", "optional": true, + "peer": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "file-uri-to-path": "1.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==", - "dev": true, + "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", - "optional": true + "optional": true, + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } }, - "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==", + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", "dev": true, + "license": "MIT" + }, + "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", "optional": true, + "peer": true, "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, + "node_modules/capnweb": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/capnweb/-/capnweb-0.4.0.tgz", + "integrity": "sha512-OgqPQcxnrAIqjrkAuwI4N9MP/mzseM5w9oLWb/oU63KveBJl1c8p41etLSVQUlYFiAYZu+h6/LJxKaDJd93xFw==", + "license": "MIT" + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC", + "optional": true, + "peer": true + }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/data-uri-to-buffer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", - "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", - "dev": true, - "license": "MIT" + "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", + "optional": true, + "peer": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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/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", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0.0" + } }, "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==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", - "optional": true, "engines": { "node": ">=8" } }, + "node_modules/drizzle-orm": { + "version": "0.44.7", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.44.7.tgz", + "integrity": "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "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", + "optional": true, + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1100,72 +1492,63 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "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", + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.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)", + "optional": true, + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", - "dev": 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", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true, + "peer": true }, - "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/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", + "optional": true, + "peer": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -1182,97 +1565,149 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-source": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", - "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "data-uri-to-buffer": "^2.0.0", - "source-map": "^0.6.1" - } + "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", + "optional": true, + "peer": true + }, + "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", + "optional": true, + "peer": true }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC", + "optional": true, + "peer": true }, - "node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "dev": true, - "license": "MIT", - "optional": true + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC", + "optional": true, + "peer": true }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "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==", "dev": true, "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.8" + "engines": { + "node": ">=6" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, + "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", - "bin": { - "mime": "cli.js" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=10.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/miniflare": { - "version": "3.20250718.3", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20250718.3.tgz", - "integrity": "sha512-JuPrDJhwLrNLEJiNLWO7ZzJrv/Vv9kZuwMYCfv0LskQDM6Eonw4OvywO3CH/wCGjgHzha/qyjUh8JQ068TjDgQ==", + "version": "4.20260114.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260114.0.tgz", + "integrity": "sha512-QwHT7S6XqGdQxIvql1uirH/7/i3zDEt0B/YBXTYzMfJtVCR4+ue3KPkU+Bl0zMxvpgkvjh9+eCHhJbKEqya70A==", "dev": true, "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "0.8.1", - "acorn": "8.14.0", - "acorn-walk": "8.3.2", - "exit-hook": "2.2.1", - "glob-to-regexp": "0.4.1", - "stoppable": "1.1.0", - "undici": "^5.28.5", - "workerd": "1.20250718.0", + "sharp": "^0.34.5", + "undici": "7.14.0", + "workerd": "1.20260114.0", "ws": "8.18.0", - "youch": "3.3.4", - "zod": "3.22.3" + "youch": "4.1.0-beta.10", + "zod": "^3.25.76" }, "bin": { "miniflare": "bootstrap.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.0.0" } }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", - "bin": { - "mustache": "bin/mustache" + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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", + "optional": true, + "peer": true + }, + "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", + "optional": true, + "peer": true + }, + "node_modules/node-abi": { + "version": "3.86.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.86.0.tgz", + "integrity": "sha512-sn9Et4N3ynsetj3spsZR729DVlGH6iBG4RiDMV7HEp3guyOW6W3S0unGpLDxT50mXortGUMax/ykUNQXdqc/Xg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "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", + "optional": true, + "peer": true, + "dependencies": { + "wrappy": "1" + } }, "node_modules/path-to-regexp": { "version": "6.3.0", @@ -1288,53 +1723,107 @@ "dev": true, "license": "MIT" }, - "node_modules/printable-characters": { - "version": "1.0.42", - "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", - "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", - "dev": true, + "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", + "optional": true, + "peer": true, "dependencies": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" + "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": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", - "dev": true, + "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", + "optional": true, + "peer": true, "dependencies": { - "rollup-plugin-inject": "^3.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, + "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)", + "optional": true, + "peer": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/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, + "peer": true, "dependencies": { - "estree-walker": "^0.6.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, + "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", + "optional": true, + "peer": true + }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, + "devOptional": true, "license": "ISC", - "optional": true, "bin": { "semver": "bin/semver.js" }, @@ -1343,17 +1832,16 @@ } }, "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "optional": true, "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -1362,76 +1850,146 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "dev": true, + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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, + "peer": true + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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, + "peer": true, "dependencies": { - "is-arrayish": "^0.3.1" + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.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", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } }, - "node_modules/stacktracey": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", - "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", - "dev": true, - "license": "Unlicense", + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "as-table": "^1.0.36", - "get-source": "^2.0.12" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" } }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "dev": true, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, "engines": { - "node": ">=4", - "npm": ">=6" + "node": ">=6" } }, "node_modules/tslib": { @@ -1442,44 +2000,52 @@ "license": "0BSD", "optional": true }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - "dev": true, - "license": "MIT" + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } }, "node_modules/undici": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz", + "integrity": "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==", "dev": true, "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, "engines": { - "node": ">=14.0" + "node": ">=20.18.1" } }, "node_modules/unenv": { - "version": "2.0.0-rc.14", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.14.tgz", - "integrity": "sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q==", + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", "dev": true, "license": "MIT", "dependencies": { - "defu": "^6.1.4", - "exsolve": "^1.0.1", - "ohash": "^2.0.10", - "pathe": "^2.0.3", - "ufo": "^1.5.4" + "pathe": "^2.0.3" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/workerd": { - "version": "1.20250718.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250718.0.tgz", - "integrity": "sha512-kqkIJP/eOfDlUyBzU7joBg+tl8aB25gEAGqDap+nFWb+WHhnooxjGHgxPBy3ipw2hnShPFNOQt5lFRxbwALirg==", + "version": "1.20260114.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260114.0.tgz", + "integrity": "sha512-kTJ+jNdIllOzWuVA3NRQRvywP0T135zdCjAE2dAUY1BFbxM6fmMZV8BbskEoQ4hAODVQUfZQmyGctcwvVCKxFA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -1490,44 +2056,41 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20250718.0", - "@cloudflare/workerd-darwin-arm64": "1.20250718.0", - "@cloudflare/workerd-linux-64": "1.20250718.0", - "@cloudflare/workerd-linux-arm64": "1.20250718.0", - "@cloudflare/workerd-windows-64": "1.20250718.0" + "@cloudflare/workerd-darwin-64": "1.20260114.0", + "@cloudflare/workerd-darwin-arm64": "1.20260114.0", + "@cloudflare/workerd-linux-64": "1.20260114.0", + "@cloudflare/workerd-linux-arm64": "1.20260114.0", + "@cloudflare/workerd-windows-64": "1.20260114.0" } }, "node_modules/wrangler": { - "version": "3.114.17", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.114.17.tgz", - "integrity": "sha512-tAvf7ly+tB+zwwrmjsCyJ2pJnnc7SZhbnNwXbH+OIdVas3zTSmjcZOjmLKcGGptssAA3RyTKhcF9BvKZzMUycA==", + "version": "4.59.2", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.59.2.tgz", + "integrity": "sha512-Z4xn6jFZTaugcOKz42xvRAYKgkVUERHVbuCJ5+f+gK+R6k12L02unakPGOA0L0ejhUl16dqDjKe4tmL9sedHcw==", "dev": true, "license": "MIT OR Apache-2.0", "dependencies": { - "@cloudflare/kv-asset-handler": "0.3.4", - "@cloudflare/unenv-preset": "2.0.2", - "@esbuild-plugins/node-globals-polyfill": "0.2.3", - "@esbuild-plugins/node-modules-polyfill": "0.2.2", + "@cloudflare/kv-asset-handler": "0.4.2", + "@cloudflare/unenv-preset": "2.10.0", "blake3-wasm": "2.1.5", - "esbuild": "0.17.19", - "miniflare": "3.20250718.3", + "esbuild": "0.27.0", + "miniflare": "4.20260114.0", "path-to-regexp": "6.3.0", - "unenv": "2.0.0-rc.14", - "workerd": "1.20250718.0" + "unenv": "2.0.0-rc.24", + "workerd": "1.20260114.0" }, "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" }, "engines": { - "node": ">=16.17.0" + "node": ">=20.0.0" }, "optionalDependencies": { - "fsevents": "~2.3.2", - "sharp": "^0.33.5" + "fsevents": "~2.3.2" }, "peerDependencies": { - "@cloudflare/workers-types": "^4.20250408.0" + "@cloudflare/workers-types": "^4.20260114.0" }, "peerDependenciesMeta": { "@cloudflare/workers-types": { @@ -1535,6 +2098,14 @@ } } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC", + "optional": true, + "peer": true + }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -1558,21 +2129,34 @@ } }, "node_modules/youch": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz", - "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", + "version": "4.1.0-beta.10", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", "dev": true, "license": "MIT", "dependencies": { - "cookie": "^0.7.1", - "mustache": "^4.2.0", - "stacktracey": "^2.1.8" + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" } }, "node_modules/zod": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", - "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", "funding": { diff --git a/packages/ertp-clerk/package.json b/packages/ertp-clerk/package.json index 5a50bb4..0c8bcad 100644 --- a/packages/ertp-clerk/package.json +++ b/packages/ertp-clerk/package.json @@ -7,7 +7,11 @@ "scripts": { "dev": "wrangler dev" }, + "dependencies": { + "capnweb": "^0.4.0", + "drizzle-orm": "^0.44.5" + }, "devDependencies": { - "wrangler": "^3.114.0" + "wrangler": "^4.59.2" } } diff --git a/packages/ertp-clerk/src/index.ts b/packages/ertp-clerk/src/index.ts index da7b27d..e5dbba7 100644 --- a/packages/ertp-clerk/src/index.ts +++ b/packages/ertp-clerk/src/index.ts @@ -1,9 +1,63 @@ +import type { DurableObjectNamespace } from 'cloudflare:workers'; +import { LedgerDurableObject } from './ledger-do'; + const { freeze } = Object; +const html = ` + + + + + ertp-clerk + + +

ertp-clerk

+

Open the browser console to explore the bootstrap object.

+ + + +`; + +const bootstrapModule = `const { newWebSocketRpcSession } = await import('https://esm.sh/capnweb@0.4.0'); +const url = new URL('/api', globalThis.location.href); +url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'; +const bootstrap = newWebSocketRpcSession(url.toString()); +export { bootstrap }; +`; + +type Env = { + LEDGER: DurableObjectNamespace; +}; + const handler = { - async fetch(_request: Request): Promise { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url); + if (url.pathname === '/') { + return new Response(html, { + headers: { 'content-type': 'text/html; charset=utf-8' }, + }); + } + if (url.pathname === '/bootstrap') { + return new Response(bootstrapModule, { + headers: { 'content-type': 'application/javascript; charset=utf-8' }, + }); + } + if (url.pathname === '/favicon.ico') { + return new Response(null, { status: 204 }); + } + if (url.pathname === '/api') { + const stub = env.LEDGER.get(env.LEDGER.idFromName('default')); + return stub.fetch(request); + } return new Response('ertp-clerk: not implemented', { status: 501 }); }, }; export default freeze(handler); +export { LedgerDurableObject }; diff --git a/packages/ertp-clerk/src/ledger-do.ts b/packages/ertp-clerk/src/ledger-do.ts new file mode 100644 index 0000000..8afb6c5 --- /dev/null +++ b/packages/ertp-clerk/src/ledger-do.ts @@ -0,0 +1,153 @@ +import { RpcTarget, newWorkersRpcResponse } from 'capnweb'; +import { drizzle, type DrizzleSqliteDODatabase } from 'drizzle-orm/durable-sqlite'; +import { DurableObject } from 'cloudflare:workers'; +import type { DurableObjectState } from 'cloudflare:workers'; +import { + createIssuerKit, + initGnuCashSchema, + asGuid, + type IssuerKitWithPurseGuids, + type SqlDatabase, + type Guid, +} from '../../ertp-ledgerguise/src/index.js'; +import { makeSqlDatabaseFromStorage } from './sql-adapter'; + +const makeGuidFactory = () => { + let guidCounter = 0n; + return () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; +}; + +const isPromiseLike = (value: unknown): value is Promise => + !!value && typeof (value as Promise).then === 'function'; + +const isAmountLike = (value: unknown): value is { brand: unknown; value: bigint } => + !!value && + typeof value === 'object' && + 'brand' in value && + 'value' in value && + typeof (value as { value: unknown }).value === 'bigint'; + +const makeExternalWrapper = () => { + const targetToExternal = new WeakMap(); + const externalToTarget = new WeakMap(); + const unwrapValue = (value: unknown): unknown => { + if (value === null || value === undefined) return value; + if (isPromiseLike(value)) { + return value.then(unwrapValue); + } + if (typeof value !== 'object') return value; + if (Array.isArray(value)) return value.map(unwrapValue); + if (isAmountLike(value)) { + const amount = value as { brand: unknown; value: bigint }; + return { ...amount, brand: unwrapValue(amount.brand) }; + } + const target = externalToTarget.get(value as object); + return target ?? value; + }; + const wrapValue = (value: unknown): unknown => { + if (value === null || value === undefined) return value; + if (isPromiseLike(value)) { + return value.then(wrapValue); + } + if (typeof value !== 'object') return value; + if (Array.isArray(value)) return value.map(wrapValue); + if (isAmountLike(value)) { + const amount = value as { brand: unknown; value: bigint }; + return Object.freeze({ ...amount, brand: wrapValue(amount.brand) }); + } + const cached = targetToExternal.get(value as object); + if (cached) return cached; + const external = new Proxy(new External(value as object), { + get(target, prop, receiver) { + if (prop in target) { + return Reflect.get(target, prop, receiver); + } + const targetValue = (target.target as Record)[prop]; + if (typeof targetValue === 'function') { + return (...args: unknown[]) => { + const unwrappedArgs = args.map(unwrapValue); + return wrapValue(targetValue.apply(target.target, unwrappedArgs)); + }; + } + return wrapValue(targetValue); + }, + }); + targetToExternal.set(value as object, external); + externalToTarget.set(external, value as object); + return external; + }; + return { wrapValue }; +}; + +class External extends RpcTarget { + constructor(readonly target: T) { + super(); + } +} + +const wrapIssuerKit = (wrapValue: (value: unknown) => unknown, kit: IssuerKitWithPurseGuids) => ({ + commodityGuid: kit.commodityGuid, + brand: wrapValue(kit.brand), + issuer: wrapValue(kit.issuer), + mint: wrapValue(kit.mint), + mintRecoveryPurse: wrapValue(kit.mintRecoveryPurse), + purses: wrapValue(kit.purses), + payments: wrapValue(kit.payments), + mintInfo: wrapValue(kit.mintInfo), +}); + +class Bootstrap extends RpcTarget { + constructor( + private readonly db: SqlDatabase, + private readonly wrapValue: (value: unknown) => unknown, + private readonly makeGuid: () => Guid, + ) { + super(); + } + + makeIssuerKit(name: string) { + const kit = createIssuerKit({ + db: this.db, + commodity: { namespace: 'COMMODITY', mnemonic: name }, + makeGuid: this.makeGuid, + nowMs: () => Date.now(), + }); + return wrapIssuerKit(this.wrapValue, kit); + } +} + +export class LedgerDurableObject extends DurableObject { + private readonly db: SqlDatabase; + private readonly drizzle: DrizzleSqliteDODatabase; + private readonly ready: Promise; + private readonly bootstrap: Bootstrap; + + constructor(ctx: DurableObjectState) { + super(ctx); + this.db = makeSqlDatabaseFromStorage(ctx.storage.sql); + this.drizzle = drizzle(ctx.storage, { logger: false }); + const { wrapValue } = makeExternalWrapper(); + this.bootstrap = new Bootstrap(this.db, wrapValue, makeGuidFactory()); + this.ready = this.ensureSchema(); + } + + private async ensureSchema() { + const row = this.db + .prepare<[string], { name: string }>( + "SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?", + ) + .get('accounts'); + if (!row) { + initGnuCashSchema(this.db); + } + } + + async fetch(request: Request): Promise { + await this.ready; + return newWorkersRpcResponse(request, this.bootstrap); + } +} diff --git a/packages/ertp-clerk/src/sql-adapter.ts b/packages/ertp-clerk/src/sql-adapter.ts new file mode 100644 index 0000000..c754a24 --- /dev/null +++ b/packages/ertp-clerk/src/sql-adapter.ts @@ -0,0 +1,35 @@ +import type { SqlDatabase } from '../../ertp-ledgerguise/src/index.js'; + +type SqlCursor> = { + next: () => IteratorResult; + toArray: () => T[]; + one: () => T; + raw: () => SqlCursor; +}; + +type SqlStorage = { + exec: (sql: string, ...params: unknown[]) => SqlCursor; +}; + +const runExec = (sql: SqlStorage, statement: string, params: unknown[]) => { + sql.exec(statement, ...params); +}; + +const toArray = (sql: SqlStorage, statement: string, params: unknown[]) => + sql.exec(statement, ...params).toArray() as T[]; + +const one = (sql: SqlStorage, statement: string, params: unknown[]) => { + const rows = toArray(sql, statement, params); + return rows[0]; +}; + +export const makeSqlDatabaseFromStorage = (sql: SqlStorage): SqlDatabase => ({ + exec: (statement: string) => { + sql.exec(statement); + }, + prepare: (statement: string) => ({ + run: (...params: TParams) => runExec(sql, statement, params), + get: (...params: TParams) => one(sql, statement, params), + all: (...params: TParams) => toArray(sql, statement, params), + }), +}); diff --git a/packages/ertp-clerk/wrangler.toml b/packages/ertp-clerk/wrangler.toml index fe45ae6..1fa21ce 100644 --- a/packages/ertp-clerk/wrangler.toml +++ b/packages/ertp-clerk/wrangler.toml @@ -1,6 +1,15 @@ name = "ertp-clerk" main = "src/index.ts" compatibility_date = "2025-01-01" +compatibility_flags = ["nodejs_compat"] [observability] enabled = true + +[[durable_objects.bindings]] +name = "LEDGER" +class_name = "LedgerDurableObject" + +[[migrations]] +tag = "v1" +new_sqlite_classes = ["LedgerDurableObject"] From 196d8b21c176fef33fc175198090e2faa0ab9cf2 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 19 Jan 2026 02:33:11 -0600 Subject: [PATCH 26/77] feat(ertp-ledgerguise): add zone-based facets Thread a Zone through issuer/escrow/chart/purse entry points so all facets are created via exo(). Add a default zone with method freezing and widen freezeProps to handle symbol keys. Track live payments and emit a Symbol.dispose warning for leaked live payments. Update types to accept zone parameters. --- packages/ertp-ledgerguise/src/chart.ts | 8 ++- packages/ertp-ledgerguise/src/escrow.ts | 10 ++- packages/ertp-ledgerguise/src/index.ts | 65 +++++++++++++++---- packages/ertp-ledgerguise/src/jessie-tools.ts | 16 ++++- packages/ertp-ledgerguise/src/purse.ts | 11 +++- packages/ertp-ledgerguise/src/types.ts | 3 + 6 files changed, 90 insertions(+), 23 deletions(-) diff --git a/packages/ertp-ledgerguise/src/chart.ts b/packages/ertp-ledgerguise/src/chart.ts index c686591..ba41c7c 100644 --- a/packages/ertp-ledgerguise/src/chart.ts +++ b/packages/ertp-ledgerguise/src/chart.ts @@ -1,4 +1,5 @@ -import { freezeProps } from './jessie-tools'; +import { defaultZone } from './jessie-tools'; +import type { Zone } from './jessie-tools'; import type { SqlDatabase } from './sql-db'; import type { ChartFacet, Guid } from './types'; import { requireAccountCommodity } from './db-helpers'; @@ -14,11 +15,14 @@ export const makeChartFacet = ({ db, commodityGuid, getPurseGuid, + zone = defaultZone, }: { db: SqlDatabase; commodityGuid: Guid; getPurseGuid: (purse: unknown) => Guid; + zone?: Zone; }): ChartFacet => { + const { exo } = zone; const updateAccount = ({ accountGuid, name, @@ -49,7 +53,7 @@ export const makeChartFacet = ({ ).run(name, accountType, parentGuid, placeholder ? 1 : 0, accountGuid); }; - return freezeProps({ + return exo('ChartFacet', { placePurse: ({ purse, name, diff --git a/packages/ertp-ledgerguise/src/escrow.ts b/packages/ertp-ledgerguise/src/escrow.ts index 2e61af6..ffca84f 100644 --- a/packages/ertp-ledgerguise/src/escrow.ts +++ b/packages/ertp-ledgerguise/src/escrow.ts @@ -1,4 +1,5 @@ -import { freezeProps, Nat } from './jessie-tools'; +import { defaultZone, Nat } from './jessie-tools'; +import type { Zone } from './jessie-tools'; import type { AmountLike, EscrowFacet, Guid } from './types'; import type { SqlDatabase } from './sql-db'; import { requireAccountCommodity } from './db-helpers'; @@ -29,6 +30,7 @@ export const makeEscrow = ({ brand, makeGuid, nowMs, + zone = defaultZone, }: { db: SqlDatabase; commodityGuid: Guid; @@ -37,7 +39,9 @@ export const makeEscrow = ({ brand: unknown; makeGuid: () => Guid; nowMs: () => number; + zone?: Zone; }): EscrowFacet => { + const { exo } = zone; const offers = new WeakMap(); const assertAmount = (amount: AmountLike) => { if (amount.brand !== brand) { @@ -94,7 +98,7 @@ export const makeEscrow = ({ const markCleared = (txGuid: Guid) => { db.prepare('UPDATE splits SET reconcile_state = ? WHERE tx_guid = ?').run('c', txGuid); }; - return freezeProps({ + return exo('Escrow', { makeOffer: (left, right, checkNumber, description = 'escrow') => { assertCheckNumberAvailable(checkNumber); const leftAmount = assertAmount(left.amount); @@ -120,7 +124,7 @@ export const makeEscrow = ({ const rightHoldingSplitGuid = recordSplit(txGuid, holdingAccountGuid, rightAmount, 'n'); recordSplit(txGuid, leftAccountGuid, -leftAmount, 'n'); recordSplit(txGuid, rightAccountGuid, -rightAmount, 'n'); - const offer = freezeProps({ + const offer = exo('EscrowOffer', { accept: () => { const record = offers.get(offer); if (!record?.live) throw new Error('escrow offer not live'); diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 2c23a8f..9c498d4 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -10,7 +10,8 @@ import type { IssuerKit } from '@agoric/ertp'; import type { SqlDatabase } from './sql-db'; import { gcEmptySql } from './sql/gc_empty'; -import { freezeProps, Nat } from './jessie-tools'; +import { defaultZone, Nat } from './jessie-tools'; +import type { Zone } from './jessie-tools'; import { makeDeterministicGuid } from './guids'; import type { AccountPurse, @@ -43,13 +44,25 @@ export { asGuid } from './guids'; export { makeChartFacet } from './chart'; export { makeEscrow } from './escrow'; export type { SqlDatabase, SqlStatement } from './sql-db'; +export type { Zone } from './jessie-tools'; /** * Initialize an empty sqlite database with the GnuCash schema. * @see ./sql/gc_empty.sql */ -export const initGnuCashSchema = (db: SqlDatabase): void => { - db.exec(gcEmptySql); +export const initGnuCashSchema = ( + db: SqlDatabase, + options: { allowTransactionStatements?: boolean } = {}, +): void => { + const { allowTransactionStatements = true } = options; + if (allowTransactionStatements) { + db.exec(gcEmptySql); + return; + } + const sanitized = gcEmptySql + .replace(/\bBEGIN TRANSACTION;\s*/gi, '') + .replace(/\bCOMMIT;\s*/gi, ''); + db.exec(sanitized); }; const makeIssuerKitForCommodity = ({ @@ -57,12 +70,15 @@ const makeIssuerKitForCommodity = ({ commodityGuid, makeGuid, nowMs, + zone, }: { db: SqlDatabase; commodityGuid: Guid; makeGuid: () => Guid; nowMs: () => number; + zone: Zone; }): IssuerKitForCommodity => { + const { exo } = zone; const { freeze } = Object; // TODO: consider validation of DB capability and schema. const displayInfo = freeze({ assetKind: 'nat' as const }); @@ -78,6 +94,7 @@ const makeIssuerKitForCommodity = ({ checkNumber: string; } >(); + const livePayments = new Set(); const assertAmount = (amount: AmountLike) => { if (amount.brand !== brand) { throw new Error('amount brand mismatch'); @@ -93,7 +110,20 @@ const makeIssuerKitForCommodity = ({ checkNumber: string, ) => { const amountValue = assertAmount(amount); - const payment = freeze({}); + const payment = exo('Payment', { + __getAllegedInterface__: () => { + // TODO: return ERTP interface metadata once defined. + throw new Error('not implemented'); + }, + [Symbol.dispose]: () => { + const record = paymentRecords.get(payment as object); + if (record?.live) { + console.warn('ledgerguise payment disposed while live', { + checkNumber: record.checkNumber, + }); + } + }, + }); paymentRecords.set(payment, { amount: amountValue, live: true, @@ -102,6 +132,7 @@ const makeIssuerKitForCommodity = ({ holdingSplitGuid, checkNumber, }); + livePayments.add(payment as object); return payment; }; const getAllegedName = () => getCommodityAllegedName(db, commodityGuid); @@ -127,17 +158,19 @@ const makeIssuerKitForCommodity = ({ commodityGuid, makeAmount, makePayment, + livePayments, paymentRecords, transferRecorder, getBrand: () => brand, + zone, }); - const brand = freezeProps({ + const brand = exo('Brand', { isMyIssuer: async (allegedIssuer: object) => allegedIssuer === issuer, getAllegedName: () => getAllegedName(), getDisplayInfo: () => displayInfo, getAmountShape: () => amountShape, }); - const issuer = freezeProps({ + const issuer = exo('Issuer', { getBrand: () => brand, getAllegedName: () => getAllegedName(), getAssetKind: () => 'nat' as const, @@ -152,6 +185,7 @@ const makeIssuerKitForCommodity = ({ const record = paymentRecords.get(payment); if (!record?.live) throw new Error('payment not live'); record.live = false; + livePayments.delete(payment as object); transferRecorder.finalizeHold({ txGuid: record.txGuid, holdingSplitGuid: record.holdingSplitGuid, @@ -160,7 +194,7 @@ const makeIssuerKitForCommodity = ({ return makeAmount(record.amount); }, }); - const mint = freezeProps({ + const mint = exo('Mint', { getIssuer: () => issuer, mintPayment: (amount: AmountLike) => { const amountValue = assertAmount(amount); @@ -187,13 +221,13 @@ const makeIssuerKitForCommodity = ({ mintRecoveryPurse, displayInfo, }) as unknown as IssuerKit; - const mintInfo = freezeProps({ + const mintInfo = exo('MintInfoAccess', { getMintInfo: () => ({ holdingAccountGuid: balanceAccountGuid, recoveryPurseGuid: mintRecoveryGuid, }), }); - const payments = freezeProps({ + const payments = exo('PaymentAccess', { getCheckNumber: (payment: unknown) => { const record = paymentRecords.get(payment as object); if (!record) throw new Error('unknown payment'); @@ -254,7 +288,7 @@ const makeIssuerKitForCommodity = ({ ); }, }); - const accounts = freezeProps({ + const accounts = exo('AccountAccess', { makeAccountPurse: (accountGuid: Guid) => { if (accountGuid === balanceAccountGuid) { throw new Error('holding account is not externally accessible'); @@ -268,7 +302,7 @@ const makeIssuerKitForCommodity = ({ return openPurse(accountGuid, accountGuid); }, }); - return freezeProps({ kit, accounts, purseGuids, payments, mintInfo }); + return freeze({ kit, accounts, purseGuids, payments, mintInfo }); }; /** @@ -277,6 +311,7 @@ const makeIssuerKitForCommodity = ({ */ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseGuids => { const { db, commodity, makeGuid, nowMs } = config; + const zone = config.zone ?? defaultZone; // TODO: consider validation of DB capability and schema. const commodityGuid = makeGuid(); createCommodityRow({ db, guid: commodityGuid, commodity }); @@ -285,15 +320,16 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG commodityGuid, makeGuid, nowMs, + zone, }); - const purses = freezeProps({ + const purses = zone.exo('PurseGuids', { getGuid: (purse: unknown) => { const guid = purseGuids.get(purse as AccountPurse); if (!guid) throw new Error('unknown purse'); return guid; }, }); - return freezeProps({ + return Object.freeze({ ...kit, commodityGuid, purses, @@ -307,8 +343,9 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG */ export const openIssuerKit = (config: OpenIssuerConfig): IssuerKitForCommodity => { const { db, commodityGuid, makeGuid, nowMs } = config; + const zone = config.zone ?? defaultZone; // TODO: consider validation of DB capability and schema. // TODO: verify commodity record matches expected issuer/brand metadata. // TODO: add a commodity-vs-currency option (namespace, fraction defaults, and naming rules). - return makeIssuerKitForCommodity({ db, commodityGuid, makeGuid, nowMs }); + return makeIssuerKitForCommodity({ db, commodityGuid, makeGuid, nowMs, zone }); }; diff --git a/packages/ertp-ledgerguise/src/jessie-tools.ts b/packages/ertp-ledgerguise/src/jessie-tools.ts index 51d5c04..fe11250 100644 --- a/packages/ertp-ledgerguise/src/jessie-tools.ts +++ b/packages/ertp-ledgerguise/src/jessie-tools.ts @@ -1,7 +1,8 @@ -export const freezeProps = >( +export const freezeProps = >( obj: T, ): Readonly => { - for (const value of Object.values(obj)) { + for (const key of Reflect.ownKeys(obj)) { + const value = (obj as Record)[key]; if (typeof value === 'function') { Object.freeze(value); } @@ -9,6 +10,17 @@ export const freezeProps = >( return Object.freeze(obj); }; +export type Zone = { + exo: >( + interfaceName: string, + methods: T, + ) => Readonly; +}; + +export const defaultZone: Zone = { + exo: (_interfaceName, methods) => freezeProps(methods), +}; + export const Nat = (specimen: bigint) => { if (typeof specimen !== 'bigint') { throw new Error('amount must be bigint'); diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index 6351555..a0803d4 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -1,4 +1,5 @@ -import { freezeProps, Nat } from './jessie-tools'; +import { Nat } from './jessie-tools'; +import type { Zone } from './jessie-tools'; import { createAccountRow, ensureAccountRow, @@ -20,6 +21,8 @@ type PurseFactoryOptions = { holdingSplitGuid: Guid, checkNumber: string, ) => object; + livePayments: Set; + zone: Zone; paymentRecords: WeakMap< object, { @@ -40,10 +43,13 @@ export const makePurseFactory = ({ commodityGuid, makeAmount, makePayment, + livePayments, paymentRecords, transferRecorder, getBrand, + zone, }: PurseFactoryOptions) => { + const { exo } = zone; const purseGuids = new WeakMap(); const buildPurse = (accountGuid: Guid, name: string): AccountPurse => { @@ -53,6 +59,7 @@ export const makePurseFactory = ({ if (!record?.live) throw new Error('payment not live'); Nat(record.amount); record.live = false; + livePayments.delete(payment); transferRecorder.finalizeHold({ txGuid: record.txGuid, holdingSplitGuid: record.holdingSplitGuid, @@ -74,7 +81,7 @@ export const makePurseFactory = ({ return makePayment(amount, accountGuid, txGuid, holdingSplitGuid, checkNumber); }; const getCurrentAmount = () => makeAmount(getAccountBalance(db, accountGuid)); - const purse = freezeProps({ deposit, withdraw, getCurrentAmount }); + const purse = exo('Purse', { deposit, withdraw, getCurrentAmount }); purseGuids.set(purse, accountGuid); return purse; }; diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index ef60fc7..8759ada 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -1,6 +1,7 @@ import type { IssuerKit } from '@agoric/ertp'; import type { SqlDatabase } from './sql-db'; import type { Guid } from './guids'; +import type { Zone } from './jessie-tools'; export type CommoditySpec = { namespace?: string; @@ -13,6 +14,7 @@ export type CommoditySpec = { export type CreateIssuerConfig = { db: SqlDatabase; commodity: CommoditySpec; + zone?: Zone; /** * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. */ @@ -26,6 +28,7 @@ export type CreateIssuerConfig = { export type OpenIssuerConfig = { db: SqlDatabase; commodityGuid: Guid; + zone?: Zone; /** * Injected GUID generator to avoid ambient randomness and preserve ocap discipline. */ From 4765e40077764aae64ad9c61b346a65f17f6cce5 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 19 Jan 2026 02:33:34 -0600 Subject: [PATCH 27/77] feat(ertp-clerk): wire RPC zone and capnweb patch Switch clerk to pass a zone that wraps facets in RpcTarget prototype methods. Normalize amount-like args for RPC and keep GUIDs collision-resistant. Add patch-package and a capnweb patch to preserve export identity on import. Expand the smoke test to mint and transfer 10 BUCKS over WebSocket RPC. Document the capnweb identity patch and add TODOs for migrations and RPC batching. --- packages/ertp-clerk/CONTRIBUTING.md | 8 + packages/ertp-clerk/package-lock.json | 737 +- packages/ertp-clerk/package.json | 6 +- .../ertp-clerk/patches/capnweb+0.4.0.patch | 28 + packages/ertp-clerk/scripts/smoke.js | 24 + packages/ertp-clerk/src/index.ts | 6 +- packages/ertp-clerk/src/ledger-do.ts | 162 +- packages/ertp-clerk/worker-configuration.d.ts | 10825 ++++++++++++++++ 8 files changed, 11703 insertions(+), 93 deletions(-) create mode 100644 packages/ertp-clerk/patches/capnweb+0.4.0.patch create mode 100644 packages/ertp-clerk/scripts/smoke.js create mode 100644 packages/ertp-clerk/worker-configuration.d.ts diff --git a/packages/ertp-clerk/CONTRIBUTING.md b/packages/ertp-clerk/CONTRIBUTING.md index da1cc02..b88275f 100644 --- a/packages/ertp-clerk/CONTRIBUTING.md +++ b/packages/ertp-clerk/CONTRIBUTING.md @@ -11,6 +11,10 @@ Thanks for your interest in contributing! This package will host the worker/serv - `wrangler dev` +## capnweb identity patch + +We currently patch capnweb to preserve identity for export targets when a client sends a capability back to the worker. Without this patch, payments arrive as new import stubs and fail `WeakMap` identity checks (`payment not live`). Track upstream status and remove the patch once capnweb offers a supported identity mapping hook. + ## TODO - Define the Cap'n Web interface surface for issuer/brand/purse/payment facets. @@ -21,4 +25,8 @@ Thanks for your interest in contributing! This package will host the worker/serv - Confirm whether the wrangler dependency warning about rollup-plugin-inject is acceptable or needs remediation per best practices. - Evaluate alternatives to loading capnweb from esm.sh (e.g., bundling locally). - Replace better-sqlite3 with a Worker-compatible backend (Durable Object SQLite or D1) and keep IO injected. +- Use drizzle migrations for schema setup instead of inline bootstrap SQL. +- Investigate HTTP batch RPC support in wrangler/miniflare (smoke test uses WebSockets for now). +- Track the capnweb identity patch and remove it once upstream supports returning original export targets. - Consider moving the External wrapper into ertp-ledgerguise (Far/exo-style) so facets are RPC-ready. +- Replace the relative import of ertp-ledgerguise src with a proper package build or bundler config. diff --git a/packages/ertp-clerk/package-lock.json b/packages/ertp-clerk/package-lock.json index 28a3412..ecb7237 100644 --- a/packages/ertp-clerk/package-lock.json +++ b/packages/ertp-clerk/package-lock.json @@ -12,6 +12,8 @@ "drizzle-orm": "^0.44.5" }, "devDependencies": { + "@types/node": "^24.0.0", + "patch-package": "^8.0.1", "wrangler": "^4.59.2" } }, @@ -1174,6 +1176,39 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/@types/node": { + "version": "24.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", + "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1243,6 +1278,19 @@ "dev": true, "license": "MIT" }, + "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": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -1269,12 +1317,92 @@ "ieee754": "^1.1.13" } }, + "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==", + "dev": true, + "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/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/capnweb": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/capnweb/-/capnweb-0.4.0.tgz", "integrity": "sha512-OgqPQcxnrAIqjrkAuwI4N9MP/mzseM5w9oLWb/oU63KveBJl1c8p41etLSVQUlYFiAYZu+h6/LJxKaDJd93xFw==", "license": "MIT" }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -1283,6 +1411,42 @@ "optional": true, "peer": true }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/cookie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", @@ -1297,6 +1461,21 @@ "url": "https://opencollective.com/express" } }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -1325,6 +1504,24 @@ "node": ">=4.0.0" } }, + "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==", + "dev": true, + "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/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -1460,6 +1657,21 @@ } } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -1481,6 +1693,39 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", @@ -1542,6 +1787,29 @@ "optional": true, "peer": true }, + "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": ">=8" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -1550,6 +1818,21 @@ "optional": true, "peer": true }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1565,6 +1848,55 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -1573,6 +1905,75 @@ "optional": true, "peer": true }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -1611,6 +2012,112 @@ "optional": true, "peer": true }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-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": ">=0.12.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -1621,6 +2128,30 @@ "node": ">=6" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -1661,9 +2192,8 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "devOptional": true, "license": "MIT", - "optional": true, - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1698,6 +2228,16 @@ "node": ">=10" } }, + "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": ">= 0.4" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1709,6 +2249,63 @@ "wrappy": "1" } }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", + "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^10.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.2.4", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-to-regexp": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", @@ -1723,6 +2320,19 @@ "dev": true, "license": "MIT" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -1831,6 +2441,24 @@ "node": ">=10" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/sharp": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", @@ -1876,6 +2504,29 @@ "@img/sharp-win32-x64": "0.34.5" } }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -1925,6 +2576,16 @@ "simple-concat": "^1.0.0" } }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -1992,6 +2653,29 @@ "node": ">=6" } }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "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" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -2024,6 +2708,13 @@ "node": ">=20.18.1" } }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, "node_modules/unenv": { "version": "2.0.0-rc.24", "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", @@ -2034,6 +2725,16 @@ "pathe": "^2.0.3" } }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2042,6 +2743,22 @@ "optional": true, "peer": true }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/workerd": { "version": "1.20260114.0", "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260114.0.tgz", @@ -2128,6 +2845,22 @@ } } }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/youch": { "version": "4.1.0-beta.10", "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", diff --git a/packages/ertp-clerk/package.json b/packages/ertp-clerk/package.json index 0c8bcad..df3bf23 100644 --- a/packages/ertp-clerk/package.json +++ b/packages/ertp-clerk/package.json @@ -5,13 +5,17 @@ "type": "module", "main": "src/index.ts", "scripts": { - "dev": "wrangler dev" + "dev": "wrangler dev", + "smoke": "node scripts/smoke.js", + "postinstall": "patch-package" }, "dependencies": { "capnweb": "^0.4.0", "drizzle-orm": "^0.44.5" }, "devDependencies": { + "@types/node": "^24.0.0", + "patch-package": "^8.0.1", "wrangler": "^4.59.2" } } diff --git a/packages/ertp-clerk/patches/capnweb+0.4.0.patch b/packages/ertp-clerk/patches/capnweb+0.4.0.patch new file mode 100644 index 0000000..0d27187 --- /dev/null +++ b/packages/ertp-clerk/patches/capnweb+0.4.0.patch @@ -0,0 +1,28 @@ +diff --git a/node_modules/capnweb/dist/index-workers.js b/node_modules/capnweb/dist/index-workers.js +index ff4527f..f5392b0 100644 +--- a/node_modules/capnweb/dist/index-workers.js ++++ b/node_modules/capnweb/dist/index-workers.js +@@ -1384,6 +1384,9 @@ var Evaluator = class _Evaluator { + return stub; + } + }; ++ if (!isPromise && value.length == 2 && hook instanceof TargetStubHook) { ++ return hook.getTarget(); ++ } + if (value.length == 2) { + if (isPromise) { + return addStub(hook.get([])); +diff --git a/node_modules/capnweb/dist/index.js b/node_modules/capnweb/dist/index.js +index b6f9cdc..e66777b 100644 +--- a/node_modules/capnweb/dist/index.js ++++ b/node_modules/capnweb/dist/index.js +@@ -1381,6 +1381,9 @@ var Evaluator = class _Evaluator { + return stub; + } + }; ++ if (!isPromise && value.length == 2 && hook instanceof TargetStubHook) { ++ return hook.getTarget(); ++ } + if (value.length == 2) { + if (isPromise) { + return addStub(hook.get([])); diff --git a/packages/ertp-clerk/scripts/smoke.js b/packages/ertp-clerk/scripts/smoke.js new file mode 100644 index 0000000..b6f615c --- /dev/null +++ b/packages/ertp-clerk/scripts/smoke.js @@ -0,0 +1,24 @@ +import { newWebSocketRpcSession } from 'capnweb'; + +const baseUrl = process.env.ERTP_CLERK_URL ?? 'http://localhost:8787'; +const apiUrl = new URL('/api', baseUrl); +apiUrl.protocol = apiUrl.protocol === 'https:' ? 'wss:' : 'ws:'; +const socket = new WebSocket(apiUrl); +const api = newWebSocketRpcSession(socket); +const kit = await api.makeIssuerKit('BUCKS'); +const name = await kit.brand.getAllegedName(); +const alice = await kit.issuer.makeEmptyPurse(); +const bob = await kit.issuer.makeEmptyPurse(); +const amount = { brand: kit.brand, value: 10n }; +const payment = await kit.mint.mintPayment(amount); +await alice.deposit(payment); +const paymentToBob = await alice.withdraw(amount); +await bob.deposit(paymentToBob); +const aliceAmount = await alice.getCurrentAmount(); +const bobAmount = await bob.getCurrentAmount(); + +console.log('issuer kit brand:', name); +console.log('alice amount:', aliceAmount); +console.log('bob amount:', bobAmount); +socket.close(); +await new Promise((resolve) => socket.addEventListener('close', resolve, { once: true })); diff --git a/packages/ertp-clerk/src/index.ts b/packages/ertp-clerk/src/index.ts index e5dbba7..7b95807 100644 --- a/packages/ertp-clerk/src/index.ts +++ b/packages/ertp-clerk/src/index.ts @@ -1,5 +1,5 @@ -import type { DurableObjectNamespace } from 'cloudflare:workers'; import { LedgerDurableObject } from './ledger-do'; +import type { Env } from '../worker-configuration'; const { freeze } = Object; @@ -31,10 +31,6 @@ const bootstrap = newWebSocketRpcSession(url.toString()); export { bootstrap }; `; -type Env = { - LEDGER: DurableObjectNamespace; -}; - const handler = { async fetch(request: Request, env: Env): Promise { const url = new URL(request.url); diff --git a/packages/ertp-clerk/src/ledger-do.ts b/packages/ertp-clerk/src/ledger-do.ts index 8afb6c5..c157822 100644 --- a/packages/ertp-clerk/src/ledger-do.ts +++ b/packages/ertp-clerk/src/ledger-do.ts @@ -2,109 +2,100 @@ import { RpcTarget, newWorkersRpcResponse } from 'capnweb'; import { drizzle, type DrizzleSqliteDODatabase } from 'drizzle-orm/durable-sqlite'; import { DurableObject } from 'cloudflare:workers'; import type { DurableObjectState } from 'cloudflare:workers'; +import type { Env } from '../worker-configuration'; import { createIssuerKit, initGnuCashSchema, asGuid, - type IssuerKitWithPurseGuids, type SqlDatabase, type Guid, + type Zone, } from '../../ertp-ledgerguise/src/index.js'; import { makeSqlDatabaseFromStorage } from './sql-adapter'; -const makeGuidFactory = () => { - let guidCounter = 0n; - return () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; -}; +const { freeze } = Object; -const isPromiseLike = (value: unknown): value is Promise => - !!value && typeof (value as Promise).then === 'function'; +const makeGuid = () => asGuid(crypto.randomUUID().replace(/-/g, '')); -const isAmountLike = (value: unknown): value is { brand: unknown; value: bigint } => - !!value && - typeof value === 'object' && - 'brand' in value && - 'value' in value && - typeof (value as { value: unknown }).value === 'bigint'; +const isAmountLike = (value: unknown): value is { brand: unknown; value: unknown } => + !!value && typeof value === 'object' && 'brand' in value && 'value' in value; -const makeExternalWrapper = () => { - const targetToExternal = new WeakMap(); - const externalToTarget = new WeakMap(); - const unwrapValue = (value: unknown): unknown => { - if (value === null || value === undefined) return value; - if (isPromiseLike(value)) { - return value.then(unwrapValue); - } - if (typeof value !== 'object') return value; - if (Array.isArray(value)) return value.map(unwrapValue); - if (isAmountLike(value)) { - const amount = value as { brand: unknown; value: bigint }; - return { ...amount, brand: unwrapValue(amount.brand) }; - } - const target = externalToTarget.get(value as object); - return target ?? value; +const asAmountValue = (value: unknown): bigint => { + if (typeof value === 'bigint') return value; + if (typeof value === 'number') return BigInt(value); + if (typeof value === 'string') return BigInt(value); + throw new Error('amount value must be bigint-compatible'); +}; + +const normalizeAmountLike = ( + value: { brand: unknown; value: unknown }, + target: object, +) => { + const targetRecord = target as { + getBrand?: () => unknown; + getIssuer?: () => { getBrand?: () => unknown }; + getCurrentAmount?: () => { brand?: unknown }; }; - const wrapValue = (value: unknown): unknown => { - if (value === null || value === undefined) return value; - if (isPromiseLike(value)) { - return value.then(wrapValue); - } - if (typeof value !== 'object') return value; - if (Array.isArray(value)) return value.map(wrapValue); - if (isAmountLike(value)) { - const amount = value as { brand: unknown; value: bigint }; - return Object.freeze({ ...amount, brand: wrapValue(amount.brand) }); - } - const cached = targetToExternal.get(value as object); - if (cached) return cached; - const external = new Proxy(new External(value as object), { - get(target, prop, receiver) { - if (prop in target) { - return Reflect.get(target, prop, receiver); - } - const targetValue = (target.target as Record)[prop]; - if (typeof targetValue === 'function') { - return (...args: unknown[]) => { - const unwrappedArgs = args.map(unwrapValue); - return wrapValue(targetValue.apply(target.target, unwrappedArgs)); - }; - } - return wrapValue(targetValue); - }, - }); - targetToExternal.set(value as object, external); - externalToTarget.set(external, value as object); - return external; + const targetBrand = + targetRecord.getBrand?.() ?? + targetRecord.getIssuer?.()?.getBrand?.() ?? + targetRecord.getCurrentAmount?.()?.brand ?? + undefined; + return { + ...value, + brand: targetBrand ?? value.brand, + value: asAmountValue(value.value), }; - return { wrapValue }; }; -class External extends RpcTarget { - constructor(readonly target: T) { - super(); +const normalizeArgForTarget = (arg: unknown, target: object): unknown => { + if (isAmountLike(arg)) { + return normalizeAmountLike(arg, target); } -} + if (arg && typeof arg === 'object' && 'amount' in arg) { + const record = arg as { amount?: unknown }; + if (record.amount && isAmountLike(record.amount)) { + return { + ...arg, + amount: normalizeAmountLike(record.amount, target), + }; + } + } + return arg; +}; -const wrapIssuerKit = (wrapValue: (value: unknown) => unknown, kit: IssuerKitWithPurseGuids) => ({ - commodityGuid: kit.commodityGuid, - brand: wrapValue(kit.brand), - issuer: wrapValue(kit.issuer), - mint: wrapValue(kit.mint), - mintRecoveryPurse: wrapValue(kit.mintRecoveryPurse), - purses: wrapValue(kit.purses), - payments: wrapValue(kit.payments), - mintInfo: wrapValue(kit.mintInfo), +const makeRpcZone = (): Zone => ({ + exo: (_interfaceName, methods) => { + class ExoTarget extends RpcTarget {} + for (const key of Reflect.ownKeys(methods)) { + const value = (methods as Record)[key]; + if (typeof value === 'function') { + const wrappedMethod = function (this: object, ...args: unknown[]) { + return value(...args.map((arg) => normalizeArgForTarget(arg, this))); + }; + freeze(wrappedMethod); + Object.defineProperty(ExoTarget.prototype, key, { + value: wrappedMethod, + writable: false, + }); + continue; + } + Object.defineProperty(ExoTarget.prototype, key, { + get() { + return value; + }, + }); + } + freeze(ExoTarget.prototype); + return freeze(new ExoTarget()); + }, }); class Bootstrap extends RpcTarget { constructor( private readonly db: SqlDatabase, - private readonly wrapValue: (value: unknown) => unknown, private readonly makeGuid: () => Guid, + private readonly zone: Zone, ) { super(); } @@ -115,8 +106,9 @@ class Bootstrap extends RpcTarget { commodity: { namespace: 'COMMODITY', mnemonic: name }, makeGuid: this.makeGuid, nowMs: () => Date.now(), + zone: this.zone, }); - return wrapIssuerKit(this.wrapValue, kit); + return kit; } } @@ -126,12 +118,11 @@ export class LedgerDurableObject extends DurableObject { private readonly ready: Promise; private readonly bootstrap: Bootstrap; - constructor(ctx: DurableObjectState) { - super(ctx); + constructor(ctx: DurableObjectState, env: Env) { + super(ctx, env); this.db = makeSqlDatabaseFromStorage(ctx.storage.sql); this.drizzle = drizzle(ctx.storage, { logger: false }); - const { wrapValue } = makeExternalWrapper(); - this.bootstrap = new Bootstrap(this.db, wrapValue, makeGuidFactory()); + this.bootstrap = new Bootstrap(this.db, makeGuid, makeRpcZone()); this.ready = this.ensureSchema(); } @@ -142,7 +133,8 @@ export class LedgerDurableObject extends DurableObject { ) .get('accounts'); if (!row) { - initGnuCashSchema(this.db); + // TODO: replace schema bootstrap with drizzle migrations. + initGnuCashSchema(this.db, { allowTransactionStatements: false }); } } diff --git a/packages/ertp-clerk/worker-configuration.d.ts b/packages/ertp-clerk/worker-configuration.d.ts new file mode 100644 index 0000000..4490d9b --- /dev/null +++ b/packages/ertp-clerk/worker-configuration.d.ts @@ -0,0 +1,10825 @@ +/* eslint-disable */ +// Generated by Wrangler by running `wrangler types` (hash: 451e059fe2b1648f9f3b377b35e8c9cd) +// Runtime types generated with workerd@1.20260114.0 2025-01-01 nodejs_compat +declare namespace Cloudflare { + interface GlobalProps { + mainModule: typeof import("./src/index"); + durableNamespaces: "LedgerDurableObject"; + } + interface Env { + LEDGER: DurableObjectNamespace; + } +} +interface Env extends Cloudflare.Env {} + +// Begin runtime types +/*! ***************************************************************************** +Copyright (c) Cloudflare. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ +/* eslint-disable */ +// noinspection JSUnusedGlobalSymbols +declare var onmessage: never; +/** + * The **`DOMException`** interface represents an abnormal event (called an **exception**) that occurs as a result of calling a method or accessing a property of a web API. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException) + */ +declare class DOMException extends Error { + constructor(message?: string, name?: string); + /** + * The **`message`** read-only property of the a message or description associated with the given error name. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/message) + */ + readonly message: string; + /** + * The **`name`** read-only property of the one of the strings associated with an error name. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/name) + */ + readonly name: string; + /** + * The **`code`** read-only property of the DOMException interface returns one of the legacy error code constants, or `0` if none match. + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/code) + */ + readonly code: number; + static readonly INDEX_SIZE_ERR: number; + static readonly DOMSTRING_SIZE_ERR: number; + static readonly HIERARCHY_REQUEST_ERR: number; + static readonly WRONG_DOCUMENT_ERR: number; + static readonly INVALID_CHARACTER_ERR: number; + static readonly NO_DATA_ALLOWED_ERR: number; + static readonly NO_MODIFICATION_ALLOWED_ERR: number; + static readonly NOT_FOUND_ERR: number; + static readonly NOT_SUPPORTED_ERR: number; + static readonly INUSE_ATTRIBUTE_ERR: number; + static readonly INVALID_STATE_ERR: number; + static readonly SYNTAX_ERR: number; + static readonly INVALID_MODIFICATION_ERR: number; + static readonly NAMESPACE_ERR: number; + static readonly INVALID_ACCESS_ERR: number; + static readonly VALIDATION_ERR: number; + static readonly TYPE_MISMATCH_ERR: number; + static readonly SECURITY_ERR: number; + static readonly NETWORK_ERR: number; + static readonly ABORT_ERR: number; + static readonly URL_MISMATCH_ERR: number; + static readonly QUOTA_EXCEEDED_ERR: number; + static readonly TIMEOUT_ERR: number; + static readonly INVALID_NODE_TYPE_ERR: number; + static readonly DATA_CLONE_ERR: number; + get stack(): any; + set stack(value: any); +} +type WorkerGlobalScopeEventMap = { + fetch: FetchEvent; + scheduled: ScheduledEvent; + queue: QueueEvent; + unhandledrejection: PromiseRejectionEvent; + rejectionhandled: PromiseRejectionEvent; +}; +declare abstract class WorkerGlobalScope extends EventTarget { + EventTarget: typeof EventTarget; +} +/* The **`console`** object provides access to the debugging console (e.g., the Web console in Firefox). * + * The **`console`** object provides access to the debugging console (e.g., the Web console in Firefox). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console) + */ +interface Console { + "assert"(condition?: boolean, ...data: any[]): void; + /** + * The **`console.clear()`** static method clears the console if possible. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/clear_static) + */ + clear(): void; + /** + * The **`console.count()`** static method logs the number of times that this particular call to `count()` has been called. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/count_static) + */ + count(label?: string): void; + /** + * The **`console.countReset()`** static method resets counter used with console/count_static. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/countReset_static) + */ + countReset(label?: string): void; + /** + * The **`console.debug()`** static method outputs a message to the console at the 'debug' log level. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/debug_static) + */ + debug(...data: any[]): void; + /** + * The **`console.dir()`** static method displays a list of the properties of the specified JavaScript object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/dir_static) + */ + dir(item?: any, options?: any): void; + /** + * The **`console.dirxml()`** static method displays an interactive tree of the descendant elements of the specified XML/HTML element. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/dirxml_static) + */ + dirxml(...data: any[]): void; + /** + * The **`console.error()`** static method outputs a message to the console at the 'error' log level. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/error_static) + */ + error(...data: any[]): void; + /** + * The **`console.group()`** static method creates a new inline group in the Web console log, causing any subsequent console messages to be indented by an additional level, until console/groupEnd_static is called. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/group_static) + */ + group(...data: any[]): void; + /** + * The **`console.groupCollapsed()`** static method creates a new inline group in the console. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/groupCollapsed_static) + */ + groupCollapsed(...data: any[]): void; + /** + * The **`console.groupEnd()`** static method exits the current inline group in the console. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/groupEnd_static) + */ + groupEnd(): void; + /** + * The **`console.info()`** static method outputs a message to the console at the 'info' log level. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/info_static) + */ + info(...data: any[]): void; + /** + * The **`console.log()`** static method outputs a message to the console. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/log_static) + */ + log(...data: any[]): void; + /** + * The **`console.table()`** static method displays tabular data as a table. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/table_static) + */ + table(tabularData?: any, properties?: string[]): void; + /** + * The **`console.time()`** static method starts a timer you can use to track how long an operation takes. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/time_static) + */ + time(label?: string): void; + /** + * The **`console.timeEnd()`** static method stops a timer that was previously started by calling console/time_static. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/timeEnd_static) + */ + timeEnd(label?: string): void; + /** + * The **`console.timeLog()`** static method logs the current value of a timer that was previously started by calling console/time_static. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/timeLog_static) + */ + timeLog(label?: string, ...data: any[]): void; + timeStamp(label?: string): void; + /** + * The **`console.trace()`** static method outputs a stack trace to the console. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/trace_static) + */ + trace(...data: any[]): void; + /** + * The **`console.warn()`** static method outputs a warning message to the console at the 'warning' log level. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/warn_static) + */ + warn(...data: any[]): void; +} +declare const console: Console; +type BufferSource = ArrayBufferView | ArrayBuffer; +type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array; +declare namespace WebAssembly { + class CompileError extends Error { + constructor(message?: string); + } + class RuntimeError extends Error { + constructor(message?: string); + } + type ValueType = "anyfunc" | "externref" | "f32" | "f64" | "i32" | "i64" | "v128"; + interface GlobalDescriptor { + value: ValueType; + mutable?: boolean; + } + class Global { + constructor(descriptor: GlobalDescriptor, value?: any); + value: any; + valueOf(): any; + } + type ImportValue = ExportValue | number; + type ModuleImports = Record; + type Imports = Record; + type ExportValue = Function | Global | Memory | Table; + type Exports = Record; + class Instance { + constructor(module: Module, imports?: Imports); + readonly exports: Exports; + } + interface MemoryDescriptor { + initial: number; + maximum?: number; + shared?: boolean; + } + class Memory { + constructor(descriptor: MemoryDescriptor); + readonly buffer: ArrayBuffer; + grow(delta: number): number; + } + type ImportExportKind = "function" | "global" | "memory" | "table"; + interface ModuleExportDescriptor { + kind: ImportExportKind; + name: string; + } + interface ModuleImportDescriptor { + kind: ImportExportKind; + module: string; + name: string; + } + abstract class Module { + static customSections(module: Module, sectionName: string): ArrayBuffer[]; + static exports(module: Module): ModuleExportDescriptor[]; + static imports(module: Module): ModuleImportDescriptor[]; + } + type TableKind = "anyfunc" | "externref"; + interface TableDescriptor { + element: TableKind; + initial: number; + maximum?: number; + } + class Table { + constructor(descriptor: TableDescriptor, value?: any); + readonly length: number; + get(index: number): any; + grow(delta: number, value?: any): number; + set(index: number, value?: any): void; + } + function instantiate(module: Module, imports?: Imports): Promise; + function validate(bytes: BufferSource): boolean; +} +/** + * The **`ServiceWorkerGlobalScope`** interface of the Service Worker API represents the global execution context of a service worker. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ServiceWorkerGlobalScope) + */ +interface ServiceWorkerGlobalScope extends WorkerGlobalScope { + DOMException: typeof DOMException; + WorkerGlobalScope: typeof WorkerGlobalScope; + btoa(data: string): string; + atob(data: string): string; + setTimeout(callback: (...args: any[]) => void, msDelay?: number): number; + setTimeout(callback: (...args: Args) => void, msDelay?: number, ...args: Args): number; + clearTimeout(timeoutId: number | null): void; + setInterval(callback: (...args: any[]) => void, msDelay?: number): number; + setInterval(callback: (...args: Args) => void, msDelay?: number, ...args: Args): number; + clearInterval(timeoutId: number | null): void; + queueMicrotask(task: Function): void; + structuredClone(value: T, options?: StructuredSerializeOptions): T; + reportError(error: any): void; + fetch(input: RequestInfo | URL, init?: RequestInit): Promise; + self: ServiceWorkerGlobalScope; + crypto: Crypto; + caches: CacheStorage; + scheduler: Scheduler; + performance: Performance; + Cloudflare: Cloudflare; + readonly origin: string; + Event: typeof Event; + ExtendableEvent: typeof ExtendableEvent; + CustomEvent: typeof CustomEvent; + PromiseRejectionEvent: typeof PromiseRejectionEvent; + FetchEvent: typeof FetchEvent; + TailEvent: typeof TailEvent; + TraceEvent: typeof TailEvent; + ScheduledEvent: typeof ScheduledEvent; + MessageEvent: typeof MessageEvent; + CloseEvent: typeof CloseEvent; + ReadableStreamDefaultReader: typeof ReadableStreamDefaultReader; + ReadableStreamBYOBReader: typeof ReadableStreamBYOBReader; + ReadableStream: typeof ReadableStream; + WritableStream: typeof WritableStream; + WritableStreamDefaultWriter: typeof WritableStreamDefaultWriter; + TransformStream: typeof TransformStream; + ByteLengthQueuingStrategy: typeof ByteLengthQueuingStrategy; + CountQueuingStrategy: typeof CountQueuingStrategy; + ErrorEvent: typeof ErrorEvent; + EventSource: typeof EventSource; + ReadableStreamBYOBRequest: typeof ReadableStreamBYOBRequest; + ReadableStreamDefaultController: typeof ReadableStreamDefaultController; + ReadableByteStreamController: typeof ReadableByteStreamController; + WritableStreamDefaultController: typeof WritableStreamDefaultController; + TransformStreamDefaultController: typeof TransformStreamDefaultController; + CompressionStream: typeof CompressionStream; + DecompressionStream: typeof DecompressionStream; + TextEncoderStream: typeof TextEncoderStream; + TextDecoderStream: typeof TextDecoderStream; + Headers: typeof Headers; + Body: typeof Body; + Request: typeof Request; + Response: typeof Response; + WebSocket: typeof WebSocket; + WebSocketPair: typeof WebSocketPair; + WebSocketRequestResponsePair: typeof WebSocketRequestResponsePair; + AbortController: typeof AbortController; + AbortSignal: typeof AbortSignal; + TextDecoder: typeof TextDecoder; + TextEncoder: typeof TextEncoder; + navigator: Navigator; + Navigator: typeof Navigator; + URL: typeof URL; + URLSearchParams: typeof URLSearchParams; + URLPattern: typeof URLPattern; + Blob: typeof Blob; + File: typeof File; + FormData: typeof FormData; + Crypto: typeof Crypto; + SubtleCrypto: typeof SubtleCrypto; + CryptoKey: typeof CryptoKey; + CacheStorage: typeof CacheStorage; + Cache: typeof Cache; + FixedLengthStream: typeof FixedLengthStream; + IdentityTransformStream: typeof IdentityTransformStream; + HTMLRewriter: typeof HTMLRewriter; +} +declare function addEventListener(type: Type, handler: EventListenerOrEventListenerObject, options?: EventTargetAddEventListenerOptions | boolean): void; +declare function removeEventListener(type: Type, handler: EventListenerOrEventListenerObject, options?: EventTargetEventListenerOptions | boolean): void; +/** + * The **`dispatchEvent()`** method of the EventTarget sends an Event to the object, (synchronously) invoking the affected event listeners in the appropriate order. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent) + */ +declare function dispatchEvent(event: WorkerGlobalScopeEventMap[keyof WorkerGlobalScopeEventMap]): boolean; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/btoa) */ +declare function btoa(data: string): string; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/atob) */ +declare function atob(data: string): string; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setTimeout) */ +declare function setTimeout(callback: (...args: any[]) => void, msDelay?: number): number; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setTimeout) */ +declare function setTimeout(callback: (...args: Args) => void, msDelay?: number, ...args: Args): number; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/clearTimeout) */ +declare function clearTimeout(timeoutId: number | null): void; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setInterval) */ +declare function setInterval(callback: (...args: any[]) => void, msDelay?: number): number; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setInterval) */ +declare function setInterval(callback: (...args: Args) => void, msDelay?: number, ...args: Args): number; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/clearInterval) */ +declare function clearInterval(timeoutId: number | null): void; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/queueMicrotask) */ +declare function queueMicrotask(task: Function): void; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/structuredClone) */ +declare function structuredClone(value: T, options?: StructuredSerializeOptions): T; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/reportError) */ +declare function reportError(error: any): void; +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch) */ +declare function fetch(input: RequestInfo | URL, init?: RequestInit): Promise; +declare const self: ServiceWorkerGlobalScope; +/** +* The Web Crypto API provides a set of low-level functions for common cryptographic tasks. +* The Workers runtime implements the full surface of this API, but with some differences in +* the [supported algorithms](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/#supported-algorithms) +* compared to those implemented in most browsers. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/) +*/ +declare const crypto: Crypto; +/** +* The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) +*/ +declare const caches: CacheStorage; +declare const scheduler: Scheduler; +/** +* The Workers runtime supports a subset of the Performance API, used to measure timing and performance, +* as well as timing of subrequests and other operations. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/) +*/ +declare const performance: Performance; +declare const Cloudflare: Cloudflare; +declare const origin: string; +declare const navigator: Navigator; +interface TestController { +} +interface ExecutionContext { + waitUntil(promise: Promise): void; + passThroughOnException(): void; + readonly props: Props; +} +type ExportedHandlerFetchHandler = (request: Request>, env: Env, ctx: ExecutionContext) => Response | Promise; +type ExportedHandlerTailHandler = (events: TraceItem[], env: Env, ctx: ExecutionContext) => void | Promise; +type ExportedHandlerTraceHandler = (traces: TraceItem[], env: Env, ctx: ExecutionContext) => void | Promise; +type ExportedHandlerTailStreamHandler = (event: TailStream.TailEvent, env: Env, ctx: ExecutionContext) => TailStream.TailEventHandlerType | Promise; +type ExportedHandlerScheduledHandler = (controller: ScheduledController, env: Env, ctx: ExecutionContext) => void | Promise; +type ExportedHandlerQueueHandler = (batch: MessageBatch, env: Env, ctx: ExecutionContext) => void | Promise; +type ExportedHandlerTestHandler = (controller: TestController, env: Env, ctx: ExecutionContext) => void | Promise; +interface ExportedHandler { + fetch?: ExportedHandlerFetchHandler; + tail?: ExportedHandlerTailHandler; + trace?: ExportedHandlerTraceHandler; + tailStream?: ExportedHandlerTailStreamHandler; + scheduled?: ExportedHandlerScheduledHandler; + test?: ExportedHandlerTestHandler; + email?: EmailExportedHandler; + queue?: ExportedHandlerQueueHandler; +} +interface StructuredSerializeOptions { + transfer?: any[]; +} +declare abstract class Navigator { + sendBeacon(url: string, body?: BodyInit): boolean; + readonly userAgent: string; + readonly hardwareConcurrency: number; +} +interface AlarmInvocationInfo { + readonly isRetry: boolean; + readonly retryCount: number; +} +interface Cloudflare { + readonly compatibilityFlags: Record; +} +interface DurableObject { + fetch(request: Request): Response | Promise; + alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise; + webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise; + webSocketClose?(ws: WebSocket, code: number, reason: string, wasClean: boolean): void | Promise; + webSocketError?(ws: WebSocket, error: unknown): void | Promise; +} +type DurableObjectStub = Fetcher & { + readonly id: DurableObjectId; + readonly name?: string; +}; +interface DurableObjectId { + toString(): string; + equals(other: DurableObjectId): boolean; + readonly name?: string; +} +declare abstract class DurableObjectNamespace { + newUniqueId(options?: DurableObjectNamespaceNewUniqueIdOptions): DurableObjectId; + idFromName(name: string): DurableObjectId; + idFromString(id: string): DurableObjectId; + get(id: DurableObjectId, options?: DurableObjectNamespaceGetDurableObjectOptions): DurableObjectStub; + getByName(name: string, options?: DurableObjectNamespaceGetDurableObjectOptions): DurableObjectStub; + jurisdiction(jurisdiction: DurableObjectJurisdiction): DurableObjectNamespace; +} +type DurableObjectJurisdiction = "eu" | "fedramp" | "fedramp-high"; +interface DurableObjectNamespaceNewUniqueIdOptions { + jurisdiction?: DurableObjectJurisdiction; +} +type DurableObjectLocationHint = "wnam" | "enam" | "sam" | "weur" | "eeur" | "apac" | "oc" | "afr" | "me"; +type DurableObjectRoutingMode = "primary-only"; +interface DurableObjectNamespaceGetDurableObjectOptions { + locationHint?: DurableObjectLocationHint; + routingMode?: DurableObjectRoutingMode; +} +interface DurableObjectClass<_T extends Rpc.DurableObjectBranded | undefined = undefined> { +} +interface DurableObjectState { + waitUntil(promise: Promise): void; + readonly props: Props; + readonly id: DurableObjectId; + readonly storage: DurableObjectStorage; + container?: Container; + blockConcurrencyWhile(callback: () => Promise): Promise; + acceptWebSocket(ws: WebSocket, tags?: string[]): void; + getWebSockets(tag?: string): WebSocket[]; + setWebSocketAutoResponse(maybeReqResp?: WebSocketRequestResponsePair): void; + getWebSocketAutoResponse(): WebSocketRequestResponsePair | null; + getWebSocketAutoResponseTimestamp(ws: WebSocket): Date | null; + setHibernatableWebSocketEventTimeout(timeoutMs?: number): void; + getHibernatableWebSocketEventTimeout(): number | null; + getTags(ws: WebSocket): string[]; + abort(reason?: string): void; +} +interface DurableObjectTransaction { + get(key: string, options?: DurableObjectGetOptions): Promise; + get(keys: string[], options?: DurableObjectGetOptions): Promise>; + list(options?: DurableObjectListOptions): Promise>; + put(key: string, value: T, options?: DurableObjectPutOptions): Promise; + put(entries: Record, options?: DurableObjectPutOptions): Promise; + delete(key: string, options?: DurableObjectPutOptions): Promise; + delete(keys: string[], options?: DurableObjectPutOptions): Promise; + rollback(): void; + getAlarm(options?: DurableObjectGetAlarmOptions): Promise; + setAlarm(scheduledTime: number | Date, options?: DurableObjectSetAlarmOptions): Promise; + deleteAlarm(options?: DurableObjectSetAlarmOptions): Promise; +} +interface DurableObjectStorage { + get(key: string, options?: DurableObjectGetOptions): Promise; + get(keys: string[], options?: DurableObjectGetOptions): Promise>; + list(options?: DurableObjectListOptions): Promise>; + put(key: string, value: T, options?: DurableObjectPutOptions): Promise; + put(entries: Record, options?: DurableObjectPutOptions): Promise; + delete(key: string, options?: DurableObjectPutOptions): Promise; + delete(keys: string[], options?: DurableObjectPutOptions): Promise; + deleteAll(options?: DurableObjectPutOptions): Promise; + transaction(closure: (txn: DurableObjectTransaction) => Promise): Promise; + getAlarm(options?: DurableObjectGetAlarmOptions): Promise; + setAlarm(scheduledTime: number | Date, options?: DurableObjectSetAlarmOptions): Promise; + deleteAlarm(options?: DurableObjectSetAlarmOptions): Promise; + sync(): Promise; + sql: SqlStorage; + kv: SyncKvStorage; + transactionSync(closure: () => T): T; + getCurrentBookmark(): Promise; + getBookmarkForTime(timestamp: number | Date): Promise; + onNextSessionRestoreBookmark(bookmark: string): Promise; +} +interface DurableObjectListOptions { + start?: string; + startAfter?: string; + end?: string; + prefix?: string; + reverse?: boolean; + limit?: number; + allowConcurrency?: boolean; + noCache?: boolean; +} +interface DurableObjectGetOptions { + allowConcurrency?: boolean; + noCache?: boolean; +} +interface DurableObjectGetAlarmOptions { + allowConcurrency?: boolean; +} +interface DurableObjectPutOptions { + allowConcurrency?: boolean; + allowUnconfirmed?: boolean; + noCache?: boolean; +} +interface DurableObjectSetAlarmOptions { + allowConcurrency?: boolean; + allowUnconfirmed?: boolean; +} +declare class WebSocketRequestResponsePair { + constructor(request: string, response: string); + get request(): string; + get response(): string; +} +interface AnalyticsEngineDataset { + writeDataPoint(event?: AnalyticsEngineDataPoint): void; +} +interface AnalyticsEngineDataPoint { + indexes?: ((ArrayBuffer | string) | null)[]; + doubles?: number[]; + blobs?: ((ArrayBuffer | string) | null)[]; +} +/** + * The **`Event`** interface represents an event which takes place on an `EventTarget`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event) + */ +declare class Event { + constructor(type: string, init?: EventInit); + /** + * The **`type`** read-only property of the Event interface returns a string containing the event's type. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/type) + */ + get type(): string; + /** + * The **`eventPhase`** read-only property of the being evaluated. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/eventPhase) + */ + get eventPhase(): number; + /** + * The read-only **`composed`** property of the or not the event will propagate across the shadow DOM boundary into the standard DOM. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/composed) + */ + get composed(): boolean; + /** + * The **`bubbles`** read-only property of the Event interface indicates whether the event bubbles up through the DOM tree or not. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/bubbles) + */ + get bubbles(): boolean; + /** + * The **`cancelable`** read-only property of the Event interface indicates whether the event can be canceled, and therefore prevented as if the event never happened. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelable) + */ + get cancelable(): boolean; + /** + * The **`defaultPrevented`** read-only property of the Event interface returns a boolean value indicating whether or not the call to Event.preventDefault() canceled the event. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/defaultPrevented) + */ + get defaultPrevented(): boolean; + /** + * The Event property **`returnValue`** indicates whether the default action for this event has been prevented or not. + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/returnValue) + */ + get returnValue(): boolean; + /** + * The **`currentTarget`** read-only property of the Event interface identifies the element to which the event handler has been attached. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/currentTarget) + */ + get currentTarget(): EventTarget | undefined; + /** + * The read-only **`target`** property of the dispatched. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/target) + */ + get target(): EventTarget | undefined; + /** + * The deprecated **`Event.srcElement`** is an alias for the Event.target property. + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/srcElement) + */ + get srcElement(): EventTarget | undefined; + /** + * The **`timeStamp`** read-only property of the Event interface returns the time (in milliseconds) at which the event was created. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/timeStamp) + */ + get timeStamp(): number; + /** + * The **`isTrusted`** read-only property of the when the event was generated by the user agent (including via user actions and programmatic methods such as HTMLElement.focus()), and `false` when the event was dispatched via The only exception is the `click` event, which initializes the `isTrusted` property to `false` in user agents. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/isTrusted) + */ + get isTrusted(): boolean; + /** + * The **`cancelBubble`** property of the Event interface is deprecated. + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelBubble) + */ + get cancelBubble(): boolean; + /** + * The **`cancelBubble`** property of the Event interface is deprecated. + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelBubble) + */ + set cancelBubble(value: boolean); + /** + * The **`stopImmediatePropagation()`** method of the If several listeners are attached to the same element for the same event type, they are called in the order in which they were added. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/stopImmediatePropagation) + */ + stopImmediatePropagation(): void; + /** + * The **`preventDefault()`** method of the Event interface tells the user agent that if the event does not get explicitly handled, its default action should not be taken as it normally would be. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/preventDefault) + */ + preventDefault(): void; + /** + * The **`stopPropagation()`** method of the Event interface prevents further propagation of the current event in the capturing and bubbling phases. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/stopPropagation) + */ + stopPropagation(): void; + /** + * The **`composedPath()`** method of the Event interface returns the event's path which is an array of the objects on which listeners will be invoked. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/composedPath) + */ + composedPath(): EventTarget[]; + static readonly NONE: number; + static readonly CAPTURING_PHASE: number; + static readonly AT_TARGET: number; + static readonly BUBBLING_PHASE: number; +} +interface EventInit { + bubbles?: boolean; + cancelable?: boolean; + composed?: boolean; +} +type EventListener = (event: EventType) => void; +interface EventListenerObject { + handleEvent(event: EventType): void; +} +type EventListenerOrEventListenerObject = EventListener | EventListenerObject; +/** + * The **`EventTarget`** interface is implemented by objects that can receive events and may have listeners for them. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget) + */ +declare class EventTarget = Record> { + constructor(); + /** + * The **`addEventListener()`** method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: Type, handler: EventListenerOrEventListenerObject, options?: EventTargetAddEventListenerOptions | boolean): void; + /** + * The **`removeEventListener()`** method of the EventTarget interface removes an event listener previously registered with EventTarget.addEventListener() from the target. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/removeEventListener) + */ + removeEventListener(type: Type, handler: EventListenerOrEventListenerObject, options?: EventTargetEventListenerOptions | boolean): void; + /** + * The **`dispatchEvent()`** method of the EventTarget sends an Event to the object, (synchronously) invoking the affected event listeners in the appropriate order. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent) + */ + dispatchEvent(event: EventMap[keyof EventMap]): boolean; +} +interface EventTargetEventListenerOptions { + capture?: boolean; +} +interface EventTargetAddEventListenerOptions { + capture?: boolean; + passive?: boolean; + once?: boolean; + signal?: AbortSignal; +} +interface EventTargetHandlerObject { + handleEvent: (event: Event) => any | undefined; +} +/** + * The **`AbortController`** interface represents a controller object that allows you to abort one or more Web requests as and when desired. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController) + */ +declare class AbortController { + constructor(); + /** + * The **`signal`** read-only property of the AbortController interface returns an AbortSignal object instance, which can be used to communicate with/abort an asynchronous operation as desired. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController/signal) + */ + get signal(): AbortSignal; + /** + * The **`abort()`** method of the AbortController interface aborts an asynchronous operation before it has completed. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController/abort) + */ + abort(reason?: any): void; +} +/** + * The **`AbortSignal`** interface represents a signal object that allows you to communicate with an asynchronous operation (such as a fetch request) and abort it if required via an AbortController object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal) + */ +declare abstract class AbortSignal extends EventTarget { + /** + * The **`AbortSignal.abort()`** static method returns an AbortSignal that is already set as aborted (and which does not trigger an AbortSignal/abort_event event). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_static) + */ + static abort(reason?: any): AbortSignal; + /** + * The **`AbortSignal.timeout()`** static method returns an AbortSignal that will automatically abort after a specified time. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/timeout_static) + */ + static timeout(delay: number): AbortSignal; + /** + * The **`AbortSignal.any()`** static method takes an iterable of abort signals and returns an AbortSignal. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/any_static) + */ + static any(signals: AbortSignal[]): AbortSignal; + /** + * The **`aborted`** read-only property returns a value that indicates whether the asynchronous operations the signal is communicating with are aborted (`true`) or not (`false`). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/aborted) + */ + get aborted(): boolean; + /** + * The **`reason`** read-only property returns a JavaScript value that indicates the abort reason. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/reason) + */ + get reason(): any; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event) */ + get onabort(): any | null; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event) */ + set onabort(value: any | null); + /** + * The **`throwIfAborted()`** method throws the signal's abort AbortSignal.reason if the signal has been aborted; otherwise it does nothing. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/throwIfAborted) + */ + throwIfAborted(): void; +} +interface Scheduler { + wait(delay: number, maybeOptions?: SchedulerWaitOptions): Promise; +} +interface SchedulerWaitOptions { + signal?: AbortSignal; +} +/** + * The **`ExtendableEvent`** interface extends the lifetime of the `install` and `activate` events dispatched on the global scope as part of the service worker lifecycle. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ExtendableEvent) + */ +declare abstract class ExtendableEvent extends Event { + /** + * The **`ExtendableEvent.waitUntil()`** method tells the event dispatcher that work is ongoing. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ExtendableEvent/waitUntil) + */ + waitUntil(promise: Promise): void; +} +/** + * The **`CustomEvent`** interface represents events initialized by an application for any purpose. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomEvent) + */ +declare class CustomEvent extends Event { + constructor(type: string, init?: CustomEventCustomEventInit); + /** + * The read-only **`detail`** property of the CustomEvent interface returns any data passed when initializing the event. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomEvent/detail) + */ + get detail(): T; +} +interface CustomEventCustomEventInit { + bubbles?: boolean; + cancelable?: boolean; + composed?: boolean; + detail?: any; +} +/** + * The **`Blob`** interface represents a blob, which is a file-like object of immutable, raw data; they can be read as text or binary data, or converted into a ReadableStream so its methods can be used for processing the data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob) + */ +declare class Blob { + constructor(type?: ((ArrayBuffer | ArrayBufferView) | string | Blob)[], options?: BlobOptions); + /** + * The **`size`** read-only property of the Blob interface returns the size of the Blob or File in bytes. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size) + */ + get size(): number; + /** + * The **`type`** read-only property of the Blob interface returns the MIME type of the file. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type) + */ + get type(): string; + /** + * The **`slice()`** method of the Blob interface creates and returns a new `Blob` object which contains data from a subset of the blob on which it's called. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice) + */ + slice(start?: number, end?: number, type?: string): Blob; + /** + * The **`arrayBuffer()`** method of the Blob interface returns a Promise that resolves with the contents of the blob as binary data contained in an ArrayBuffer. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/arrayBuffer) + */ + arrayBuffer(): Promise; + /** + * The **`bytes()`** method of the Blob interface returns a Promise that resolves with a Uint8Array containing the contents of the blob as an array of bytes. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/bytes) + */ + bytes(): Promise; + /** + * The **`text()`** method of the string containing the contents of the blob, interpreted as UTF-8. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text) + */ + text(): Promise; + /** + * The **`stream()`** method of the Blob interface returns a ReadableStream which upon reading returns the data contained within the `Blob`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/stream) + */ + stream(): ReadableStream; +} +interface BlobOptions { + type?: string; +} +/** + * The **`File`** interface provides information about files and allows JavaScript in a web page to access their content. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File) + */ +declare class File extends Blob { + constructor(bits: ((ArrayBuffer | ArrayBufferView) | string | Blob)[] | undefined, name: string, options?: FileOptions); + /** + * The **`name`** read-only property of the File interface returns the name of the file represented by a File object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name) + */ + get name(): string; + /** + * The **`lastModified`** read-only property of the File interface provides the last modified date of the file as the number of milliseconds since the Unix epoch (January 1, 1970 at midnight). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified) + */ + get lastModified(): number; +} +interface FileOptions { + type?: string; + lastModified?: number; +} +/** +* The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) +*/ +declare abstract class CacheStorage { + /** + * The **`open()`** method of the the Cache object matching the `cacheName`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CacheStorage/open) + */ + open(cacheName: string): Promise; + readonly default: Cache; +} +/** +* The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) +*/ +declare abstract class Cache { + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#delete) */ + delete(request: RequestInfo | URL, options?: CacheQueryOptions): Promise; + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#match) */ + match(request: RequestInfo | URL, options?: CacheQueryOptions): Promise; + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#put) */ + put(request: RequestInfo | URL, response: Response): Promise; +} +interface CacheQueryOptions { + ignoreMethod?: boolean; +} +/** +* The Web Crypto API provides a set of low-level functions for common cryptographic tasks. +* The Workers runtime implements the full surface of this API, but with some differences in +* the [supported algorithms](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/#supported-algorithms) +* compared to those implemented in most browsers. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/) +*/ +declare abstract class Crypto { + /** + * The **`Crypto.subtle`** read-only property returns a cryptographic operations. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/subtle) + */ + get subtle(): SubtleCrypto; + /** + * The **`Crypto.getRandomValues()`** method lets you get cryptographically strong random values. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/getRandomValues) + */ + getRandomValues(buffer: T): T; + /** + * The **`randomUUID()`** method of the Crypto interface is used to generate a v4 UUID using a cryptographically secure random number generator. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/randomUUID) + */ + randomUUID(): string; + DigestStream: typeof DigestStream; +} +/** + * The **`SubtleCrypto`** interface of the Web Crypto API provides a number of low-level cryptographic functions. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto) + */ +declare abstract class SubtleCrypto { + /** + * The **`encrypt()`** method of the SubtleCrypto interface encrypts data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/encrypt) + */ + encrypt(algorithm: string | SubtleCryptoEncryptAlgorithm, key: CryptoKey, plainText: ArrayBuffer | ArrayBufferView): Promise; + /** + * The **`decrypt()`** method of the SubtleCrypto interface decrypts some encrypted data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/decrypt) + */ + decrypt(algorithm: string | SubtleCryptoEncryptAlgorithm, key: CryptoKey, cipherText: ArrayBuffer | ArrayBufferView): Promise; + /** + * The **`sign()`** method of the SubtleCrypto interface generates a digital signature. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/sign) + */ + sign(algorithm: string | SubtleCryptoSignAlgorithm, key: CryptoKey, data: ArrayBuffer | ArrayBufferView): Promise; + /** + * The **`verify()`** method of the SubtleCrypto interface verifies a digital signature. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/verify) + */ + verify(algorithm: string | SubtleCryptoSignAlgorithm, key: CryptoKey, signature: ArrayBuffer | ArrayBufferView, data: ArrayBuffer | ArrayBufferView): Promise; + /** + * The **`digest()`** method of the SubtleCrypto interface generates a _digest_ of the given data, using the specified hash function. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/digest) + */ + digest(algorithm: string | SubtleCryptoHashAlgorithm, data: ArrayBuffer | ArrayBufferView): Promise; + /** + * The **`generateKey()`** method of the SubtleCrypto interface is used to generate a new key (for symmetric algorithms) or key pair (for public-key algorithms). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) + */ + generateKey(algorithm: string | SubtleCryptoGenerateKeyAlgorithm, extractable: boolean, keyUsages: string[]): Promise; + /** + * The **`deriveKey()`** method of the SubtleCrypto interface can be used to derive a secret key from a master key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveKey) + */ + deriveKey(algorithm: string | SubtleCryptoDeriveKeyAlgorithm, baseKey: CryptoKey, derivedKeyAlgorithm: string | SubtleCryptoImportKeyAlgorithm, extractable: boolean, keyUsages: string[]): Promise; + /** + * The **`deriveBits()`** method of the key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveBits) + */ + deriveBits(algorithm: string | SubtleCryptoDeriveKeyAlgorithm, baseKey: CryptoKey, length?: number | null): Promise; + /** + * The **`importKey()`** method of the SubtleCrypto interface imports a key: that is, it takes as input a key in an external, portable format and gives you a CryptoKey object that you can use in the Web Crypto API. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/importKey) + */ + importKey(format: string, keyData: (ArrayBuffer | ArrayBufferView) | JsonWebKey, algorithm: string | SubtleCryptoImportKeyAlgorithm, extractable: boolean, keyUsages: string[]): Promise; + /** + * The **`exportKey()`** method of the SubtleCrypto interface exports a key: that is, it takes as input a CryptoKey object and gives you the key in an external, portable format. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) + */ + exportKey(format: string, key: CryptoKey): Promise; + /** + * The **`wrapKey()`** method of the SubtleCrypto interface 'wraps' a key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/wrapKey) + */ + wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: string | SubtleCryptoEncryptAlgorithm): Promise; + /** + * The **`unwrapKey()`** method of the SubtleCrypto interface 'unwraps' a key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/unwrapKey) + */ + unwrapKey(format: string, wrappedKey: ArrayBuffer | ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: string | SubtleCryptoEncryptAlgorithm, unwrappedKeyAlgorithm: string | SubtleCryptoImportKeyAlgorithm, extractable: boolean, keyUsages: string[]): Promise; + timingSafeEqual(a: ArrayBuffer | ArrayBufferView, b: ArrayBuffer | ArrayBufferView): boolean; +} +/** + * The **`CryptoKey`** interface of the Web Crypto API represents a cryptographic key obtained from one of the SubtleCrypto methods SubtleCrypto.generateKey, SubtleCrypto.deriveKey, SubtleCrypto.importKey, or SubtleCrypto.unwrapKey. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey) + */ +declare abstract class CryptoKey { + /** + * The read-only **`type`** property of the CryptoKey interface indicates which kind of key is represented by the object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/type) + */ + readonly type: string; + /** + * The read-only **`extractable`** property of the CryptoKey interface indicates whether or not the key may be extracted using `SubtleCrypto.exportKey()` or `SubtleCrypto.wrapKey()`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/extractable) + */ + readonly extractable: boolean; + /** + * The read-only **`algorithm`** property of the CryptoKey interface returns an object describing the algorithm for which this key can be used, and any associated extra parameters. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/algorithm) + */ + readonly algorithm: CryptoKeyKeyAlgorithm | CryptoKeyAesKeyAlgorithm | CryptoKeyHmacKeyAlgorithm | CryptoKeyRsaKeyAlgorithm | CryptoKeyEllipticKeyAlgorithm | CryptoKeyArbitraryKeyAlgorithm; + /** + * The read-only **`usages`** property of the CryptoKey interface indicates what can be done with the key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/usages) + */ + readonly usages: string[]; +} +interface CryptoKeyPair { + publicKey: CryptoKey; + privateKey: CryptoKey; +} +interface JsonWebKey { + kty: string; + use?: string; + key_ops?: string[]; + alg?: string; + ext?: boolean; + crv?: string; + x?: string; + y?: string; + d?: string; + n?: string; + e?: string; + p?: string; + q?: string; + dp?: string; + dq?: string; + qi?: string; + oth?: RsaOtherPrimesInfo[]; + k?: string; +} +interface RsaOtherPrimesInfo { + r?: string; + d?: string; + t?: string; +} +interface SubtleCryptoDeriveKeyAlgorithm { + name: string; + salt?: (ArrayBuffer | ArrayBufferView); + iterations?: number; + hash?: (string | SubtleCryptoHashAlgorithm); + $public?: CryptoKey; + info?: (ArrayBuffer | ArrayBufferView); +} +interface SubtleCryptoEncryptAlgorithm { + name: string; + iv?: (ArrayBuffer | ArrayBufferView); + additionalData?: (ArrayBuffer | ArrayBufferView); + tagLength?: number; + counter?: (ArrayBuffer | ArrayBufferView); + length?: number; + label?: (ArrayBuffer | ArrayBufferView); +} +interface SubtleCryptoGenerateKeyAlgorithm { + name: string; + hash?: (string | SubtleCryptoHashAlgorithm); + modulusLength?: number; + publicExponent?: (ArrayBuffer | ArrayBufferView); + length?: number; + namedCurve?: string; +} +interface SubtleCryptoHashAlgorithm { + name: string; +} +interface SubtleCryptoImportKeyAlgorithm { + name: string; + hash?: (string | SubtleCryptoHashAlgorithm); + length?: number; + namedCurve?: string; + compressed?: boolean; +} +interface SubtleCryptoSignAlgorithm { + name: string; + hash?: (string | SubtleCryptoHashAlgorithm); + dataLength?: number; + saltLength?: number; +} +interface CryptoKeyKeyAlgorithm { + name: string; +} +interface CryptoKeyAesKeyAlgorithm { + name: string; + length: number; +} +interface CryptoKeyHmacKeyAlgorithm { + name: string; + hash: CryptoKeyKeyAlgorithm; + length: number; +} +interface CryptoKeyRsaKeyAlgorithm { + name: string; + modulusLength: number; + publicExponent: ArrayBuffer | ArrayBufferView; + hash?: CryptoKeyKeyAlgorithm; +} +interface CryptoKeyEllipticKeyAlgorithm { + name: string; + namedCurve: string; +} +interface CryptoKeyArbitraryKeyAlgorithm { + name: string; + hash?: CryptoKeyKeyAlgorithm; + namedCurve?: string; + length?: number; +} +declare class DigestStream extends WritableStream { + constructor(algorithm: string | SubtleCryptoHashAlgorithm); + readonly digest: Promise; + get bytesWritten(): number | bigint; +} +/** + * The **`TextDecoder`** interface represents a decoder for a specific text encoding, such as `UTF-8`, `ISO-8859-2`, `KOI8-R`, `GBK`, etc. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoder) + */ +declare class TextDecoder { + constructor(label?: string, options?: TextDecoderConstructorOptions); + /** + * The **`TextDecoder.decode()`** method returns a string containing text decoded from the buffer passed as a parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoder/decode) + */ + decode(input?: (ArrayBuffer | ArrayBufferView), options?: TextDecoderDecodeOptions): string; + get encoding(): string; + get fatal(): boolean; + get ignoreBOM(): boolean; +} +/** + * The **`TextEncoder`** interface takes a stream of code points as input and emits a stream of UTF-8 bytes. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder) + */ +declare class TextEncoder { + constructor(); + /** + * The **`TextEncoder.encode()`** method takes a string as input, and returns a Global_Objects/Uint8Array containing the text given in parameters encoded with the specific method for that TextEncoder object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder/encode) + */ + encode(input?: string): Uint8Array; + /** + * The **`TextEncoder.encodeInto()`** method takes a string to encode and a destination Uint8Array to put resulting UTF-8 encoded text into, and returns a dictionary object indicating the progress of the encoding. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder/encodeInto) + */ + encodeInto(input: string, buffer: Uint8Array): TextEncoderEncodeIntoResult; + get encoding(): string; +} +interface TextDecoderConstructorOptions { + fatal: boolean; + ignoreBOM: boolean; +} +interface TextDecoderDecodeOptions { + stream: boolean; +} +interface TextEncoderEncodeIntoResult { + read: number; + written: number; +} +/** + * The **`ErrorEvent`** interface represents events providing information related to errors in scripts or in files. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent) + */ +declare class ErrorEvent extends Event { + constructor(type: string, init?: ErrorEventErrorEventInit); + /** + * The **`filename`** read-only property of the ErrorEvent interface returns a string containing the name of the script file in which the error occurred. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/filename) + */ + get filename(): string; + /** + * The **`message`** read-only property of the ErrorEvent interface returns a string containing a human-readable error message describing the problem. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/message) + */ + get message(): string; + /** + * The **`lineno`** read-only property of the ErrorEvent interface returns an integer containing the line number of the script file on which the error occurred. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/lineno) + */ + get lineno(): number; + /** + * The **`colno`** read-only property of the ErrorEvent interface returns an integer containing the column number of the script file on which the error occurred. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/colno) + */ + get colno(): number; + /** + * The **`error`** read-only property of the ErrorEvent interface returns a JavaScript value, such as an Error or DOMException, representing the error associated with this event. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/error) + */ + get error(): any; +} +interface ErrorEventErrorEventInit { + message?: string; + filename?: string; + lineno?: number; + colno?: number; + error?: any; +} +/** + * The **`MessageEvent`** interface represents a message received by a target object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent) + */ +declare class MessageEvent extends Event { + constructor(type: string, initializer: MessageEventInit); + /** + * The **`data`** read-only property of the The data sent by the message emitter; this can be any data type, depending on what originated this event. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/data) + */ + readonly data: any; + /** + * The **`origin`** read-only property of the origin of the message emitter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/origin) + */ + readonly origin: string | null; + /** + * The **`lastEventId`** read-only property of the unique ID for the event. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/lastEventId) + */ + readonly lastEventId: string; + /** + * The **`source`** read-only property of the a WindowProxy, MessagePort, or a `MessageEventSource` (which can be a WindowProxy, message emitter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/source) + */ + readonly source: MessagePort | null; + /** + * The **`ports`** read-only property of the containing all MessagePort objects sent with the message, in order. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/ports) + */ + readonly ports: MessagePort[]; +} +interface MessageEventInit { + data: ArrayBuffer | string; +} +/** + * The **`PromiseRejectionEvent`** interface represents events which are sent to the global script context when JavaScript Promises are rejected. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent) + */ +declare abstract class PromiseRejectionEvent extends Event { + /** + * The PromiseRejectionEvent interface's **`promise`** read-only property indicates the JavaScript rejected. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent/promise) + */ + readonly promise: Promise; + /** + * The PromiseRejectionEvent **`reason`** read-only property is any JavaScript value or Object which provides the reason passed into Promise.reject(). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent/reason) + */ + readonly reason: any; +} +/** + * The **`FormData`** interface provides a way to construct a set of key/value pairs representing form fields and their values, which can be sent using the Window/fetch, XMLHttpRequest.send() or navigator.sendBeacon() methods. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData) + */ +declare class FormData { + constructor(); + /** + * The **`append()`** method of the FormData interface appends a new value onto an existing key inside a `FormData` object, or adds the key if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append) + */ + append(name: string, value: string): void; + /** + * The **`append()`** method of the FormData interface appends a new value onto an existing key inside a `FormData` object, or adds the key if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append) + */ + append(name: string, value: Blob, filename?: string): void; + /** + * The **`delete()`** method of the FormData interface deletes a key and its value(s) from a `FormData` object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/delete) + */ + delete(name: string): void; + /** + * The **`get()`** method of the FormData interface returns the first value associated with a given key from within a `FormData` object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/get) + */ + get(name: string): (File | string) | null; + /** + * The **`getAll()`** method of the FormData interface returns all the values associated with a given key from within a `FormData` object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/getAll) + */ + getAll(name: string): (File | string)[]; + /** + * The **`has()`** method of the FormData interface returns whether a `FormData` object contains a certain key. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/has) + */ + has(name: string): boolean; + /** + * The **`set()`** method of the FormData interface sets a new value for an existing key inside a `FormData` object, or adds the key/value if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set) + */ + set(name: string, value: string): void; + /** + * The **`set()`** method of the FormData interface sets a new value for an existing key inside a `FormData` object, or adds the key/value if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set) + */ + set(name: string, value: Blob, filename?: string): void; + /* Returns an array of key, value pairs for every entry in the list. */ + entries(): IterableIterator<[ + key: string, + value: File | string + ]>; + /* Returns a list of keys in the list. */ + keys(): IterableIterator; + /* Returns a list of values in the list. */ + values(): IterableIterator<(File | string)>; + forEach(callback: (this: This, value: File | string, key: string, parent: FormData) => void, thisArg?: This): void; + [Symbol.iterator](): IterableIterator<[ + key: string, + value: File | string + ]>; +} +interface ContentOptions { + html?: boolean; +} +declare class HTMLRewriter { + constructor(); + on(selector: string, handlers: HTMLRewriterElementContentHandlers): HTMLRewriter; + onDocument(handlers: HTMLRewriterDocumentContentHandlers): HTMLRewriter; + transform(response: Response): Response; +} +interface HTMLRewriterElementContentHandlers { + element?(element: Element): void | Promise; + comments?(comment: Comment): void | Promise; + text?(element: Text): void | Promise; +} +interface HTMLRewriterDocumentContentHandlers { + doctype?(doctype: Doctype): void | Promise; + comments?(comment: Comment): void | Promise; + text?(text: Text): void | Promise; + end?(end: DocumentEnd): void | Promise; +} +interface Doctype { + readonly name: string | null; + readonly publicId: string | null; + readonly systemId: string | null; +} +interface Element { + tagName: string; + readonly attributes: IterableIterator; + readonly removed: boolean; + readonly namespaceURI: string; + getAttribute(name: string): string | null; + hasAttribute(name: string): boolean; + setAttribute(name: string, value: string): Element; + removeAttribute(name: string): Element; + before(content: string | ReadableStream | Response, options?: ContentOptions): Element; + after(content: string | ReadableStream | Response, options?: ContentOptions): Element; + prepend(content: string | ReadableStream | Response, options?: ContentOptions): Element; + append(content: string | ReadableStream | Response, options?: ContentOptions): Element; + replace(content: string | ReadableStream | Response, options?: ContentOptions): Element; + remove(): Element; + removeAndKeepContent(): Element; + setInnerContent(content: string | ReadableStream | Response, options?: ContentOptions): Element; + onEndTag(handler: (tag: EndTag) => void | Promise): void; +} +interface EndTag { + name: string; + before(content: string | ReadableStream | Response, options?: ContentOptions): EndTag; + after(content: string | ReadableStream | Response, options?: ContentOptions): EndTag; + remove(): EndTag; +} +interface Comment { + text: string; + readonly removed: boolean; + before(content: string, options?: ContentOptions): Comment; + after(content: string, options?: ContentOptions): Comment; + replace(content: string, options?: ContentOptions): Comment; + remove(): Comment; +} +interface Text { + readonly text: string; + readonly lastInTextNode: boolean; + readonly removed: boolean; + before(content: string | ReadableStream | Response, options?: ContentOptions): Text; + after(content: string | ReadableStream | Response, options?: ContentOptions): Text; + replace(content: string | ReadableStream | Response, options?: ContentOptions): Text; + remove(): Text; +} +interface DocumentEnd { + append(content: string, options?: ContentOptions): DocumentEnd; +} +/** + * This is the event type for `fetch` events dispatched on the ServiceWorkerGlobalScope. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent) + */ +declare abstract class FetchEvent extends ExtendableEvent { + /** + * The **`request`** read-only property of the the event handler. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/request) + */ + readonly request: Request; + /** + * The **`respondWith()`** method of allows you to provide a promise for a Response yourself. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/respondWith) + */ + respondWith(promise: Response | Promise): void; + passThroughOnException(): void; +} +type HeadersInit = Headers | Iterable> | Record; +/** + * The **`Headers`** interface of the Fetch API allows you to perform various actions on HTTP request and response headers. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers) + */ +declare class Headers { + constructor(init?: HeadersInit); + /** + * The **`get()`** method of the Headers interface returns a byte string of all the values of a header within a `Headers` object with a given name. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/get) + */ + get(name: string): string | null; + getAll(name: string): string[]; + /** + * The **`getSetCookie()`** method of the Headers interface returns an array containing the values of all Set-Cookie headers associated with a response. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/getSetCookie) + */ + getSetCookie(): string[]; + /** + * The **`has()`** method of the Headers interface returns a boolean stating whether a `Headers` object contains a certain header. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/has) + */ + has(name: string): boolean; + /** + * The **`set()`** method of the Headers interface sets a new value for an existing header inside a `Headers` object, or adds the header if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/set) + */ + set(name: string, value: string): void; + /** + * The **`append()`** method of the Headers interface appends a new value onto an existing header inside a `Headers` object, or adds the header if it does not already exist. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/append) + */ + append(name: string, value: string): void; + /** + * The **`delete()`** method of the Headers interface deletes a header from the current `Headers` object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/delete) + */ + delete(name: string): void; + forEach(callback: (this: This, value: string, key: string, parent: Headers) => void, thisArg?: This): void; + /* Returns an iterator allowing to go through all key/value pairs contained in this object. */ + entries(): IterableIterator<[ + key: string, + value: string + ]>; + /* Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. */ + keys(): IterableIterator; + /* Returns an iterator allowing to go through all values of the key/value pairs contained in this object. */ + values(): IterableIterator; + [Symbol.iterator](): IterableIterator<[ + key: string, + value: string + ]>; +} +type BodyInit = ReadableStream | string | ArrayBuffer | ArrayBufferView | Blob | URLSearchParams | FormData; +declare abstract class Body { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) */ + get body(): ReadableStream | null; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + get bodyUsed(): boolean; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer(): Promise; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) */ + bytes(): Promise; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/text) */ + text(): Promise; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/json) */ + json(): Promise; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/formData) */ + formData(): Promise; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob(): Promise; +} +/** + * The **`Response`** interface of the Fetch API represents the response to a request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response) + */ +declare var Response: { + prototype: Response; + new (body?: BodyInit | null, init?: ResponseInit): Response; + error(): Response; + redirect(url: string, status?: number): Response; + json(any: any, maybeInit?: (ResponseInit | Response)): Response; +}; +/** + * The **`Response`** interface of the Fetch API represents the response to a request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response) + */ +interface Response extends Body { + /** + * The **`clone()`** method of the Response interface creates a clone of a response object, identical in every way, but stored in a different variable. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/clone) + */ + clone(): Response; + /** + * The **`status`** read-only property of the Response interface contains the HTTP status codes of the response. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/status) + */ + status: number; + /** + * The **`statusText`** read-only property of the Response interface contains the status message corresponding to the HTTP status code in Response.status. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/statusText) + */ + statusText: string; + /** + * The **`headers`** read-only property of the with the response. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/headers) + */ + headers: Headers; + /** + * The **`ok`** read-only property of the Response interface contains a Boolean stating whether the response was successful (status in the range 200-299) or not. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/ok) + */ + ok: boolean; + /** + * The **`redirected`** read-only property of the Response interface indicates whether or not the response is the result of a request you made which was redirected. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/redirected) + */ + redirected: boolean; + /** + * The **`url`** read-only property of the Response interface contains the URL of the response. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/url) + */ + url: string; + webSocket: WebSocket | null; + cf: any | undefined; + /** + * The **`type`** read-only property of the Response interface contains the type of the response. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/type) + */ + type: "default" | "error"; +} +interface ResponseInit { + status?: number; + statusText?: string; + headers?: HeadersInit; + cf?: any; + webSocket?: (WebSocket | null); + encodeBody?: "automatic" | "manual"; +} +type RequestInfo> = Request | string; +/** + * The **`Request`** interface of the Fetch API represents a resource request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request) + */ +declare var Request: { + prototype: Request; + new >(input: RequestInfo | URL, init?: RequestInit): Request; +}; +/** + * The **`Request`** interface of the Fetch API represents a resource request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request) + */ +interface Request> extends Body { + /** + * The **`clone()`** method of the Request interface creates a copy of the current `Request` object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/clone) + */ + clone(): Request; + /** + * The **`method`** read-only property of the `POST`, etc.) A String indicating the method of the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/method) + */ + method: string; + /** + * The **`url`** read-only property of the Request interface contains the URL of the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/url) + */ + url: string; + /** + * The **`headers`** read-only property of the with the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/headers) + */ + headers: Headers; + /** + * The **`redirect`** read-only property of the Request interface contains the mode for how redirects are handled. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/redirect) + */ + redirect: string; + fetcher: Fetcher | null; + /** + * The read-only **`signal`** property of the Request interface returns the AbortSignal associated with the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/signal) + */ + signal: AbortSignal; + cf: Cf | undefined; + /** + * The **`integrity`** read-only property of the Request interface contains the subresource integrity value of the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/integrity) + */ + integrity: string; + /** + * The **`keepalive`** read-only property of the Request interface contains the request's `keepalive` setting (`true` or `false`), which indicates whether the browser will keep the associated request alive if the page that initiated it is unloaded before the request is complete. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/keepalive) + */ + keepalive: boolean; + /** + * The **`cache`** read-only property of the Request interface contains the cache mode of the request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/cache) + */ + cache?: "no-store"; +} +interface RequestInit { + /* A string to set request's method. */ + method?: string; + /* A Headers object, an object literal, or an array of two-item arrays to set request's headers. */ + headers?: HeadersInit; + /* A BodyInit object or null to set request's body. */ + body?: BodyInit | null; + /* A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. */ + redirect?: string; + fetcher?: (Fetcher | null); + cf?: Cf; + /* A string indicating how the request will interact with the browser's cache to set request's cache. */ + cache?: "no-store"; + /* A cryptographic hash of the resource to be fetched by request. Sets request's integrity. */ + integrity?: string; + /* An AbortSignal to set request's signal. */ + signal?: (AbortSignal | null); + encodeResponseBody?: "automatic" | "manual"; +} +type Service Rpc.WorkerEntrypointBranded) | Rpc.WorkerEntrypointBranded | ExportedHandler | undefined = undefined> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded ? Fetcher> : T extends Rpc.WorkerEntrypointBranded ? Fetcher : T extends Exclude ? never : Fetcher; +type Fetcher = (T extends Rpc.EntrypointBranded ? Rpc.Provider : unknown) & { + fetch(input: RequestInfo | URL, init?: RequestInit): Promise; + connect(address: SocketAddress | string, options?: SocketOptions): Socket; +}; +interface KVNamespaceListKey { + name: Key; + expiration?: number; + metadata?: Metadata; +} +type KVNamespaceListResult = { + list_complete: false; + keys: KVNamespaceListKey[]; + cursor: string; + cacheStatus: string | null; +} | { + list_complete: true; + keys: KVNamespaceListKey[]; + cacheStatus: string | null; +}; +interface KVNamespace { + get(key: Key, options?: Partial>): Promise; + get(key: Key, type: "text"): Promise; + get(key: Key, type: "json"): Promise; + get(key: Key, type: "arrayBuffer"): Promise; + get(key: Key, type: "stream"): Promise; + get(key: Key, options?: KVNamespaceGetOptions<"text">): Promise; + get(key: Key, options?: KVNamespaceGetOptions<"json">): Promise; + get(key: Key, options?: KVNamespaceGetOptions<"arrayBuffer">): Promise; + get(key: Key, options?: KVNamespaceGetOptions<"stream">): Promise; + get(key: Array, type: "text"): Promise>; + get(key: Array, type: "json"): Promise>; + get(key: Array, options?: Partial>): Promise>; + get(key: Array, options?: KVNamespaceGetOptions<"text">): Promise>; + get(key: Array, options?: KVNamespaceGetOptions<"json">): Promise>; + list(options?: KVNamespaceListOptions): Promise>; + put(key: Key, value: string | ArrayBuffer | ArrayBufferView | ReadableStream, options?: KVNamespacePutOptions): Promise; + getWithMetadata(key: Key, options?: Partial>): Promise>; + getWithMetadata(key: Key, type: "text"): Promise>; + getWithMetadata(key: Key, type: "json"): Promise>; + getWithMetadata(key: Key, type: "arrayBuffer"): Promise>; + getWithMetadata(key: Key, type: "stream"): Promise>; + getWithMetadata(key: Key, options: KVNamespaceGetOptions<"text">): Promise>; + getWithMetadata(key: Key, options: KVNamespaceGetOptions<"json">): Promise>; + getWithMetadata(key: Key, options: KVNamespaceGetOptions<"arrayBuffer">): Promise>; + getWithMetadata(key: Key, options: KVNamespaceGetOptions<"stream">): Promise>; + getWithMetadata(key: Array, type: "text"): Promise>>; + getWithMetadata(key: Array, type: "json"): Promise>>; + getWithMetadata(key: Array, options?: Partial>): Promise>>; + getWithMetadata(key: Array, options?: KVNamespaceGetOptions<"text">): Promise>>; + getWithMetadata(key: Array, options?: KVNamespaceGetOptions<"json">): Promise>>; + delete(key: Key): Promise; +} +interface KVNamespaceListOptions { + limit?: number; + prefix?: (string | null); + cursor?: (string | null); +} +interface KVNamespaceGetOptions { + type: Type; + cacheTtl?: number; +} +interface KVNamespacePutOptions { + expiration?: number; + expirationTtl?: number; + metadata?: (any | null); +} +interface KVNamespaceGetWithMetadataResult { + value: Value | null; + metadata: Metadata | null; + cacheStatus: string | null; +} +type QueueContentType = "text" | "bytes" | "json" | "v8"; +interface Queue { + send(message: Body, options?: QueueSendOptions): Promise; + sendBatch(messages: Iterable>, options?: QueueSendBatchOptions): Promise; +} +interface QueueSendOptions { + contentType?: QueueContentType; + delaySeconds?: number; +} +interface QueueSendBatchOptions { + delaySeconds?: number; +} +interface MessageSendRequest { + body: Body; + contentType?: QueueContentType; + delaySeconds?: number; +} +interface QueueRetryOptions { + delaySeconds?: number; +} +interface Message { + readonly id: string; + readonly timestamp: Date; + readonly body: Body; + readonly attempts: number; + retry(options?: QueueRetryOptions): void; + ack(): void; +} +interface QueueEvent extends ExtendableEvent { + readonly messages: readonly Message[]; + readonly queue: string; + retryAll(options?: QueueRetryOptions): void; + ackAll(): void; +} +interface MessageBatch { + readonly messages: readonly Message[]; + readonly queue: string; + retryAll(options?: QueueRetryOptions): void; + ackAll(): void; +} +interface R2Error extends Error { + readonly name: string; + readonly code: number; + readonly message: string; + readonly action: string; + readonly stack: any; +} +interface R2ListOptions { + limit?: number; + prefix?: string; + cursor?: string; + delimiter?: string; + startAfter?: string; + include?: ("httpMetadata" | "customMetadata")[]; +} +declare abstract class R2Bucket { + head(key: string): Promise; + get(key: string, options: R2GetOptions & { + onlyIf: R2Conditional | Headers; + }): Promise; + get(key: string, options?: R2GetOptions): Promise; + put(key: string, value: ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, options?: R2PutOptions & { + onlyIf: R2Conditional | Headers; + }): Promise; + put(key: string, value: ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, options?: R2PutOptions): Promise; + createMultipartUpload(key: string, options?: R2MultipartOptions): Promise; + resumeMultipartUpload(key: string, uploadId: string): R2MultipartUpload; + delete(keys: string | string[]): Promise; + list(options?: R2ListOptions): Promise; +} +interface R2MultipartUpload { + readonly key: string; + readonly uploadId: string; + uploadPart(partNumber: number, value: ReadableStream | (ArrayBuffer | ArrayBufferView) | string | Blob, options?: R2UploadPartOptions): Promise; + abort(): Promise; + complete(uploadedParts: R2UploadedPart[]): Promise; +} +interface R2UploadedPart { + partNumber: number; + etag: string; +} +declare abstract class R2Object { + readonly key: string; + readonly version: string; + readonly size: number; + readonly etag: string; + readonly httpEtag: string; + readonly checksums: R2Checksums; + readonly uploaded: Date; + readonly httpMetadata?: R2HTTPMetadata; + readonly customMetadata?: Record; + readonly range?: R2Range; + readonly storageClass: string; + readonly ssecKeyMd5?: string; + writeHttpMetadata(headers: Headers): void; +} +interface R2ObjectBody extends R2Object { + get body(): ReadableStream; + get bodyUsed(): boolean; + arrayBuffer(): Promise; + bytes(): Promise; + text(): Promise; + json(): Promise; + blob(): Promise; +} +type R2Range = { + offset: number; + length?: number; +} | { + offset?: number; + length: number; +} | { + suffix: number; +}; +interface R2Conditional { + etagMatches?: string; + etagDoesNotMatch?: string; + uploadedBefore?: Date; + uploadedAfter?: Date; + secondsGranularity?: boolean; +} +interface R2GetOptions { + onlyIf?: (R2Conditional | Headers); + range?: (R2Range | Headers); + ssecKey?: (ArrayBuffer | string); +} +interface R2PutOptions { + onlyIf?: (R2Conditional | Headers); + httpMetadata?: (R2HTTPMetadata | Headers); + customMetadata?: Record; + md5?: ((ArrayBuffer | ArrayBufferView) | string); + sha1?: ((ArrayBuffer | ArrayBufferView) | string); + sha256?: ((ArrayBuffer | ArrayBufferView) | string); + sha384?: ((ArrayBuffer | ArrayBufferView) | string); + sha512?: ((ArrayBuffer | ArrayBufferView) | string); + storageClass?: string; + ssecKey?: (ArrayBuffer | string); +} +interface R2MultipartOptions { + httpMetadata?: (R2HTTPMetadata | Headers); + customMetadata?: Record; + storageClass?: string; + ssecKey?: (ArrayBuffer | string); +} +interface R2Checksums { + readonly md5?: ArrayBuffer; + readonly sha1?: ArrayBuffer; + readonly sha256?: ArrayBuffer; + readonly sha384?: ArrayBuffer; + readonly sha512?: ArrayBuffer; + toJSON(): R2StringChecksums; +} +interface R2StringChecksums { + md5?: string; + sha1?: string; + sha256?: string; + sha384?: string; + sha512?: string; +} +interface R2HTTPMetadata { + contentType?: string; + contentLanguage?: string; + contentDisposition?: string; + contentEncoding?: string; + cacheControl?: string; + cacheExpiry?: Date; +} +type R2Objects = { + objects: R2Object[]; + delimitedPrefixes: string[]; +} & ({ + truncated: true; + cursor: string; +} | { + truncated: false; +}); +interface R2UploadPartOptions { + ssecKey?: (ArrayBuffer | string); +} +declare abstract class ScheduledEvent extends ExtendableEvent { + readonly scheduledTime: number; + readonly cron: string; + noRetry(): void; +} +interface ScheduledController { + readonly scheduledTime: number; + readonly cron: string; + noRetry(): void; +} +interface QueuingStrategy { + highWaterMark?: (number | bigint); + size?: (chunk: T) => number | bigint; +} +interface UnderlyingSink { + type?: string; + start?: (controller: WritableStreamDefaultController) => void | Promise; + write?: (chunk: W, controller: WritableStreamDefaultController) => void | Promise; + abort?: (reason: any) => void | Promise; + close?: () => void | Promise; +} +interface UnderlyingByteSource { + type: "bytes"; + autoAllocateChunkSize?: number; + start?: (controller: ReadableByteStreamController) => void | Promise; + pull?: (controller: ReadableByteStreamController) => void | Promise; + cancel?: (reason: any) => void | Promise; +} +interface UnderlyingSource { + type?: "" | undefined; + start?: (controller: ReadableStreamDefaultController) => void | Promise; + pull?: (controller: ReadableStreamDefaultController) => void | Promise; + cancel?: (reason: any) => void | Promise; + expectedLength?: (number | bigint); +} +interface Transformer { + readableType?: string; + writableType?: string; + start?: (controller: TransformStreamDefaultController) => void | Promise; + transform?: (chunk: I, controller: TransformStreamDefaultController) => void | Promise; + flush?: (controller: TransformStreamDefaultController) => void | Promise; + cancel?: (reason: any) => void | Promise; + expectedLength?: number; +} +interface StreamPipeOptions { + preventAbort?: boolean; + preventCancel?: boolean; + /** + * Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered. + * + * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader. + * + * Errors and closures of the source and destination streams propagate as follows: + * + * An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination. + * + * An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source. + * + * When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error. + * + * If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source. + * + * The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set. + */ + preventClose?: boolean; + signal?: AbortSignal; +} +type ReadableStreamReadResult = { + done: false; + value: R; +} | { + done: true; + value?: undefined; +}; +/** + * The `ReadableStream` interface of the Streams API represents a readable stream of byte data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream) + */ +interface ReadableStream { + /** + * The **`locked`** read-only property of the ReadableStream interface returns whether or not the readable stream is locked to a reader. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/locked) + */ + get locked(): boolean; + /** + * The **`cancel()`** method of the ReadableStream interface returns a Promise that resolves when the stream is canceled. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/cancel) + */ + cancel(reason?: any): Promise; + /** + * The **`getReader()`** method of the ReadableStream interface creates a reader and locks the stream to it. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/getReader) + */ + getReader(): ReadableStreamDefaultReader; + /** + * The **`getReader()`** method of the ReadableStream interface creates a reader and locks the stream to it. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/getReader) + */ + getReader(options: ReadableStreamGetReaderOptions): ReadableStreamBYOBReader; + /** + * The **`pipeThrough()`** method of the ReadableStream interface provides a chainable way of piping the current stream through a transform stream or any other writable/readable pair. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/pipeThrough) + */ + pipeThrough(transform: ReadableWritablePair, options?: StreamPipeOptions): ReadableStream; + /** + * The **`pipeTo()`** method of the ReadableStream interface pipes the current `ReadableStream` to a given WritableStream and returns a Promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/pipeTo) + */ + pipeTo(destination: WritableStream, options?: StreamPipeOptions): Promise; + /** + * The **`tee()`** method of the two-element array containing the two resulting branches as new ReadableStream instances. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/tee) + */ + tee(): [ + ReadableStream, + ReadableStream + ]; + values(options?: ReadableStreamValuesOptions): AsyncIterableIterator; + [Symbol.asyncIterator](options?: ReadableStreamValuesOptions): AsyncIterableIterator; +} +/** + * The `ReadableStream` interface of the Streams API represents a readable stream of byte data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream) + */ +declare const ReadableStream: { + prototype: ReadableStream; + new (underlyingSource: UnderlyingByteSource, strategy?: QueuingStrategy): ReadableStream; + new (underlyingSource?: UnderlyingSource, strategy?: QueuingStrategy): ReadableStream; +}; +/** + * The **`ReadableStreamDefaultReader`** interface of the Streams API represents a default reader that can be used to read stream data supplied from a network (such as a fetch request). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader) + */ +declare class ReadableStreamDefaultReader { + constructor(stream: ReadableStream); + get closed(): Promise; + cancel(reason?: any): Promise; + /** + * The **`read()`** method of the ReadableStreamDefaultReader interface returns a Promise providing access to the next chunk in the stream's internal queue. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/read) + */ + read(): Promise>; + /** + * The **`releaseLock()`** method of the ReadableStreamDefaultReader interface releases the reader's lock on the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/releaseLock) + */ + releaseLock(): void; +} +/** + * The `ReadableStreamBYOBReader` interface of the Streams API defines a reader for a ReadableStream that supports zero-copy reading from an underlying byte source. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader) + */ +declare class ReadableStreamBYOBReader { + constructor(stream: ReadableStream); + get closed(): Promise; + cancel(reason?: any): Promise; + /** + * The **`read()`** method of the ReadableStreamBYOBReader interface is used to read data into a view on a user-supplied buffer from an associated readable byte stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader/read) + */ + read(view: T): Promise>; + /** + * The **`releaseLock()`** method of the ReadableStreamBYOBReader interface releases the reader's lock on the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader/releaseLock) + */ + releaseLock(): void; + readAtLeast(minElements: number, view: T): Promise>; +} +interface ReadableStreamBYOBReaderReadableStreamBYOBReaderReadOptions { + min?: number; +} +interface ReadableStreamGetReaderOptions { + /** + * Creates a ReadableStreamBYOBReader and locks the stream to the new reader. + * + * This call behaves the same way as the no-argument variant, except that it only works on readable byte streams, i.e. streams which were constructed specifically with the ability to handle "bring your own buffer" reading. The returned BYOB reader provides the ability to directly read individual chunks from the stream via its read() method, into developer-supplied buffers, allowing more precise control over allocation. + */ + mode: "byob"; +} +/** + * The **`ReadableStreamBYOBRequest`** interface of the Streams API represents a 'pull request' for data from an underlying source that will made as a zero-copy transfer to a consumer (bypassing the stream's internal queues). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest) + */ +declare abstract class ReadableStreamBYOBRequest { + /** + * The **`view`** getter property of the ReadableStreamBYOBRequest interface returns the current view. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/view) + */ + get view(): Uint8Array | null; + /** + * The **`respond()`** method of the ReadableStreamBYOBRequest interface is used to signal to the associated readable byte stream that the specified number of bytes were written into the ReadableStreamBYOBRequest.view. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/respond) + */ + respond(bytesWritten: number): void; + /** + * The **`respondWithNewView()`** method of the ReadableStreamBYOBRequest interface specifies a new view that the consumer of the associated readable byte stream should write to instead of ReadableStreamBYOBRequest.view. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/respondWithNewView) + */ + respondWithNewView(view: ArrayBuffer | ArrayBufferView): void; + get atLeast(): number | null; +} +/** + * The **`ReadableStreamDefaultController`** interface of the Streams API represents a controller allowing control of a ReadableStream's state and internal queue. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController) + */ +declare abstract class ReadableStreamDefaultController { + /** + * The **`desiredSize`** read-only property of the required to fill the stream's internal queue. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/desiredSize) + */ + get desiredSize(): number | null; + /** + * The **`close()`** method of the ReadableStreamDefaultController interface closes the associated stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/close) + */ + close(): void; + /** + * The **`enqueue()`** method of the ```js-nolint enqueue(chunk) ``` - `chunk` - : The chunk to enqueue. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/enqueue) + */ + enqueue(chunk?: R): void; + /** + * The **`error()`** method of the with the associated stream to error. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/error) + */ + error(reason: any): void; +} +/** + * The **`ReadableByteStreamController`** interface of the Streams API represents a controller for a readable byte stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController) + */ +declare abstract class ReadableByteStreamController { + /** + * The **`byobRequest`** read-only property of the ReadableByteStreamController interface returns the current BYOB request, or `null` if there are no pending requests. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/byobRequest) + */ + get byobRequest(): ReadableStreamBYOBRequest | null; + /** + * The **`desiredSize`** read-only property of the ReadableByteStreamController interface returns the number of bytes required to fill the stream's internal queue to its 'desired size'. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/desiredSize) + */ + get desiredSize(): number | null; + /** + * The **`close()`** method of the ReadableByteStreamController interface closes the associated stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/close) + */ + close(): void; + /** + * The **`enqueue()`** method of the ReadableByteStreamController interface enqueues a given chunk on the associated readable byte stream (the chunk is copied into the stream's internal queues). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/enqueue) + */ + enqueue(chunk: ArrayBuffer | ArrayBufferView): void; + /** + * The **`error()`** method of the ReadableByteStreamController interface causes any future interactions with the associated stream to error with the specified reason. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/error) + */ + error(reason: any): void; +} +/** + * The **`WritableStreamDefaultController`** interface of the Streams API represents a controller allowing control of a WritableStream's state. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController) + */ +declare abstract class WritableStreamDefaultController { + /** + * The read-only **`signal`** property of the WritableStreamDefaultController interface returns the AbortSignal associated with the controller. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController/signal) + */ + get signal(): AbortSignal; + /** + * The **`error()`** method of the with the associated stream to error. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController/error) + */ + error(reason?: any): void; +} +/** + * The **`TransformStreamDefaultController`** interface of the Streams API provides methods to manipulate the associated ReadableStream and WritableStream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController) + */ +declare abstract class TransformStreamDefaultController { + /** + * The **`desiredSize`** read-only property of the TransformStreamDefaultController interface returns the desired size to fill the queue of the associated ReadableStream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/desiredSize) + */ + get desiredSize(): number | null; + /** + * The **`enqueue()`** method of the TransformStreamDefaultController interface enqueues the given chunk in the readable side of the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/enqueue) + */ + enqueue(chunk?: O): void; + /** + * The **`error()`** method of the TransformStreamDefaultController interface errors both sides of the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/error) + */ + error(reason: any): void; + /** + * The **`terminate()`** method of the TransformStreamDefaultController interface closes the readable side and errors the writable side of the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/terminate) + */ + terminate(): void; +} +interface ReadableWritablePair { + readable: ReadableStream; + /** + * Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use. + * + * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader. + */ + writable: WritableStream; +} +/** + * The **`WritableStream`** interface of the Streams API provides a standard abstraction for writing streaming data to a destination, known as a sink. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream) + */ +declare class WritableStream { + constructor(underlyingSink?: UnderlyingSink, queuingStrategy?: QueuingStrategy); + /** + * The **`locked`** read-only property of the WritableStream interface returns a boolean indicating whether the `WritableStream` is locked to a writer. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/locked) + */ + get locked(): boolean; + /** + * The **`abort()`** method of the WritableStream interface aborts the stream, signaling that the producer can no longer successfully write to the stream and it is to be immediately moved to an error state, with any queued writes discarded. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/abort) + */ + abort(reason?: any): Promise; + /** + * The **`close()`** method of the WritableStream interface closes the associated stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/close) + */ + close(): Promise; + /** + * The **`getWriter()`** method of the WritableStream interface returns a new instance of WritableStreamDefaultWriter and locks the stream to that instance. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/getWriter) + */ + getWriter(): WritableStreamDefaultWriter; +} +/** + * The **`WritableStreamDefaultWriter`** interface of the Streams API is the object returned by WritableStream.getWriter() and once created locks the writer to the `WritableStream` ensuring that no other streams can write to the underlying sink. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter) + */ +declare class WritableStreamDefaultWriter { + constructor(stream: WritableStream); + /** + * The **`closed`** read-only property of the the stream errors or the writer's lock is released. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/closed) + */ + get closed(): Promise; + /** + * The **`ready`** read-only property of the that resolves when the desired size of the stream's internal queue transitions from non-positive to positive, signaling that it is no longer applying backpressure. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/ready) + */ + get ready(): Promise; + /** + * The **`desiredSize`** read-only property of the to fill the stream's internal queue. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/desiredSize) + */ + get desiredSize(): number | null; + /** + * The **`abort()`** method of the the producer can no longer successfully write to the stream and it is to be immediately moved to an error state, with any queued writes discarded. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/abort) + */ + abort(reason?: any): Promise; + /** + * The **`close()`** method of the stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/close) + */ + close(): Promise; + /** + * The **`write()`** method of the operation. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/write) + */ + write(chunk?: W): Promise; + /** + * The **`releaseLock()`** method of the corresponding stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/releaseLock) + */ + releaseLock(): void; +} +/** + * The **`TransformStream`** interface of the Streams API represents a concrete implementation of the pipe chain _transform stream_ concept. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream) + */ +declare class TransformStream { + constructor(transformer?: Transformer, writableStrategy?: QueuingStrategy, readableStrategy?: QueuingStrategy); + /** + * The **`readable`** read-only property of the TransformStream interface returns the ReadableStream instance controlled by this `TransformStream`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream/readable) + */ + get readable(): ReadableStream; + /** + * The **`writable`** read-only property of the TransformStream interface returns the WritableStream instance controlled by this `TransformStream`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream/writable) + */ + get writable(): WritableStream; +} +declare class FixedLengthStream extends IdentityTransformStream { + constructor(expectedLength: number | bigint, queuingStrategy?: IdentityTransformStreamQueuingStrategy); +} +declare class IdentityTransformStream extends TransformStream { + constructor(queuingStrategy?: IdentityTransformStreamQueuingStrategy); +} +interface IdentityTransformStreamQueuingStrategy { + highWaterMark?: (number | bigint); +} +interface ReadableStreamValuesOptions { + preventCancel?: boolean; +} +/** + * The **`CompressionStream`** interface of the Compression Streams API is an API for compressing a stream of data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CompressionStream) + */ +declare class CompressionStream extends TransformStream { + constructor(format: "gzip" | "deflate" | "deflate-raw"); +} +/** + * The **`DecompressionStream`** interface of the Compression Streams API is an API for decompressing a stream of data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DecompressionStream) + */ +declare class DecompressionStream extends TransformStream { + constructor(format: "gzip" | "deflate" | "deflate-raw"); +} +/** + * The **`TextEncoderStream`** interface of the Encoding API converts a stream of strings into bytes in the UTF-8 encoding. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoderStream) + */ +declare class TextEncoderStream extends TransformStream { + constructor(); + get encoding(): string; +} +/** + * The **`TextDecoderStream`** interface of the Encoding API converts a stream of text in a binary encoding, such as UTF-8 etc., to a stream of strings. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoderStream) + */ +declare class TextDecoderStream extends TransformStream { + constructor(label?: string, options?: TextDecoderStreamTextDecoderStreamInit); + get encoding(): string; + get fatal(): boolean; + get ignoreBOM(): boolean; +} +interface TextDecoderStreamTextDecoderStreamInit { + fatal?: boolean; + ignoreBOM?: boolean; +} +/** + * The **`ByteLengthQueuingStrategy`** interface of the Streams API provides a built-in byte length queuing strategy that can be used when constructing streams. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy) + */ +declare class ByteLengthQueuingStrategy implements QueuingStrategy { + constructor(init: QueuingStrategyInit); + /** + * The read-only **`ByteLengthQueuingStrategy.highWaterMark`** property returns the total number of bytes that can be contained in the internal queue before backpressure is applied. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy/highWaterMark) + */ + get highWaterMark(): number; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy/size) */ + get size(): (chunk?: any) => number; +} +/** + * The **`CountQueuingStrategy`** interface of the Streams API provides a built-in chunk counting queuing strategy that can be used when constructing streams. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy) + */ +declare class CountQueuingStrategy implements QueuingStrategy { + constructor(init: QueuingStrategyInit); + /** + * The read-only **`CountQueuingStrategy.highWaterMark`** property returns the total number of chunks that can be contained in the internal queue before backpressure is applied. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy/highWaterMark) + */ + get highWaterMark(): number; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy/size) */ + get size(): (chunk?: any) => number; +} +interface QueuingStrategyInit { + /** + * Creates a new ByteLengthQueuingStrategy with the provided high water mark. + * + * Note that the provided high water mark will not be validated ahead of time. Instead, if it is negative, NaN, or not a number, the resulting ByteLengthQueuingStrategy will cause the corresponding stream constructor to throw. + */ + highWaterMark: number; +} +interface ScriptVersion { + id?: string; + tag?: string; + message?: string; +} +declare abstract class TailEvent extends ExtendableEvent { + readonly events: TraceItem[]; + readonly traces: TraceItem[]; +} +interface TraceItem { + readonly event: (TraceItemFetchEventInfo | TraceItemJsRpcEventInfo | TraceItemScheduledEventInfo | TraceItemAlarmEventInfo | TraceItemQueueEventInfo | TraceItemEmailEventInfo | TraceItemTailEventInfo | TraceItemCustomEventInfo | TraceItemHibernatableWebSocketEventInfo) | null; + readonly eventTimestamp: number | null; + readonly logs: TraceLog[]; + readonly exceptions: TraceException[]; + readonly diagnosticsChannelEvents: TraceDiagnosticChannelEvent[]; + readonly scriptName: string | null; + readonly entrypoint?: string; + readonly scriptVersion?: ScriptVersion; + readonly dispatchNamespace?: string; + readonly scriptTags?: string[]; + readonly durableObjectId?: string; + readonly outcome: string; + readonly executionModel: string; + readonly truncated: boolean; + readonly cpuTime: number; + readonly wallTime: number; +} +interface TraceItemAlarmEventInfo { + readonly scheduledTime: Date; +} +interface TraceItemCustomEventInfo { +} +interface TraceItemScheduledEventInfo { + readonly scheduledTime: number; + readonly cron: string; +} +interface TraceItemQueueEventInfo { + readonly queue: string; + readonly batchSize: number; +} +interface TraceItemEmailEventInfo { + readonly mailFrom: string; + readonly rcptTo: string; + readonly rawSize: number; +} +interface TraceItemTailEventInfo { + readonly consumedEvents: TraceItemTailEventInfoTailItem[]; +} +interface TraceItemTailEventInfoTailItem { + readonly scriptName: string | null; +} +interface TraceItemFetchEventInfo { + readonly response?: TraceItemFetchEventInfoResponse; + readonly request: TraceItemFetchEventInfoRequest; +} +interface TraceItemFetchEventInfoRequest { + readonly cf?: any; + readonly headers: Record; + readonly method: string; + readonly url: string; + getUnredacted(): TraceItemFetchEventInfoRequest; +} +interface TraceItemFetchEventInfoResponse { + readonly status: number; +} +interface TraceItemJsRpcEventInfo { + readonly rpcMethod: string; +} +interface TraceItemHibernatableWebSocketEventInfo { + readonly getWebSocketEvent: TraceItemHibernatableWebSocketEventInfoMessage | TraceItemHibernatableWebSocketEventInfoClose | TraceItemHibernatableWebSocketEventInfoError; +} +interface TraceItemHibernatableWebSocketEventInfoMessage { + readonly webSocketEventType: string; +} +interface TraceItemHibernatableWebSocketEventInfoClose { + readonly webSocketEventType: string; + readonly code: number; + readonly wasClean: boolean; +} +interface TraceItemHibernatableWebSocketEventInfoError { + readonly webSocketEventType: string; +} +interface TraceLog { + readonly timestamp: number; + readonly level: string; + readonly message: any; +} +interface TraceException { + readonly timestamp: number; + readonly message: string; + readonly name: string; + readonly stack?: string; +} +interface TraceDiagnosticChannelEvent { + readonly timestamp: number; + readonly channel: string; + readonly message: any; +} +interface TraceMetrics { + readonly cpuTime: number; + readonly wallTime: number; +} +interface UnsafeTraceMetrics { + fromTrace(item: TraceItem): TraceMetrics; +} +/** + * The **`URL`** interface is used to parse, construct, normalize, and encode URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL) + */ +declare class URL { + constructor(url: string | URL, base?: string | URL); + /** + * The **`origin`** read-only property of the URL interface returns a string containing the Unicode serialization of the origin of the represented URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/origin) + */ + get origin(): string; + /** + * The **`href`** property of the URL interface is a string containing the whole URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href) + */ + get href(): string; + /** + * The **`href`** property of the URL interface is a string containing the whole URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href) + */ + set href(value: string); + /** + * The **`protocol`** property of the URL interface is a string containing the protocol or scheme of the URL, including the final `':'`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol) + */ + get protocol(): string; + /** + * The **`protocol`** property of the URL interface is a string containing the protocol or scheme of the URL, including the final `':'`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol) + */ + set protocol(value: string); + /** + * The **`username`** property of the URL interface is a string containing the username component of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username) + */ + get username(): string; + /** + * The **`username`** property of the URL interface is a string containing the username component of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username) + */ + set username(value: string); + /** + * The **`password`** property of the URL interface is a string containing the password component of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password) + */ + get password(): string; + /** + * The **`password`** property of the URL interface is a string containing the password component of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password) + */ + set password(value: string); + /** + * The **`host`** property of the URL interface is a string containing the host, which is the URL.hostname, and then, if the port of the URL is nonempty, a `':'`, followed by the URL.port of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host) + */ + get host(): string; + /** + * The **`host`** property of the URL interface is a string containing the host, which is the URL.hostname, and then, if the port of the URL is nonempty, a `':'`, followed by the URL.port of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host) + */ + set host(value: string); + /** + * The **`hostname`** property of the URL interface is a string containing either the domain name or IP address of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname) + */ + get hostname(): string; + /** + * The **`hostname`** property of the URL interface is a string containing either the domain name or IP address of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname) + */ + set hostname(value: string); + /** + * The **`port`** property of the URL interface is a string containing the port number of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port) + */ + get port(): string; + /** + * The **`port`** property of the URL interface is a string containing the port number of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port) + */ + set port(value: string); + /** + * The **`pathname`** property of the URL interface represents a location in a hierarchical structure. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname) + */ + get pathname(): string; + /** + * The **`pathname`** property of the URL interface represents a location in a hierarchical structure. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname) + */ + set pathname(value: string); + /** + * The **`search`** property of the URL interface is a search string, also called a _query string_, that is a string containing a `'?'` followed by the parameters of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search) + */ + get search(): string; + /** + * The **`search`** property of the URL interface is a search string, also called a _query string_, that is a string containing a `'?'` followed by the parameters of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search) + */ + set search(value: string); + /** + * The **`hash`** property of the URL interface is a string containing a `'#'` followed by the fragment identifier of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash) + */ + get hash(): string; + /** + * The **`hash`** property of the URL interface is a string containing a `'#'` followed by the fragment identifier of the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash) + */ + set hash(value: string); + /** + * The **`searchParams`** read-only property of the access to the [MISSING: httpmethod('GET')] decoded query arguments contained in the URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/searchParams) + */ + get searchParams(): URLSearchParams; + /** + * The **`toJSON()`** method of the URL interface returns a string containing a serialized version of the URL, although in practice it seems to have the same effect as ```js-nolint toJSON() ``` None. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/toJSON) + */ + toJSON(): string; + /*function toString() { [native code] }*/ + toString(): string; + /** + * The **`URL.canParse()`** static method of the URL interface returns a boolean indicating whether or not an absolute URL, or a relative URL combined with a base URL, are parsable and valid. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/canParse_static) + */ + static canParse(url: string, base?: string): boolean; + /** + * The **`URL.parse()`** static method of the URL interface returns a newly created URL object representing the URL defined by the parameters. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/parse_static) + */ + static parse(url: string, base?: string): URL | null; + /** + * The **`createObjectURL()`** static method of the URL interface creates a string containing a URL representing the object given in the parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/createObjectURL_static) + */ + static createObjectURL(object: File | Blob): string; + /** + * The **`revokeObjectURL()`** static method of the URL interface releases an existing object URL which was previously created by calling Call this method when you've finished using an object URL to let the browser know not to keep the reference to the file any longer. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/revokeObjectURL_static) + */ + static revokeObjectURL(object_url: string): void; +} +/** + * The **`URLSearchParams`** interface defines utility methods to work with the query string of a URL. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams) + */ +declare class URLSearchParams { + constructor(init?: (Iterable> | Record | string)); + /** + * The **`size`** read-only property of the URLSearchParams interface indicates the total number of search parameter entries. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/size) + */ + get size(): number; + /** + * The **`append()`** method of the URLSearchParams interface appends a specified key/value pair as a new search parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/append) + */ + append(name: string, value: string): void; + /** + * The **`delete()`** method of the URLSearchParams interface deletes specified parameters and their associated value(s) from the list of all search parameters. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/delete) + */ + delete(name: string, value?: string): void; + /** + * The **`get()`** method of the URLSearchParams interface returns the first value associated to the given search parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/get) + */ + get(name: string): string | null; + /** + * The **`getAll()`** method of the URLSearchParams interface returns all the values associated with a given search parameter as an array. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/getAll) + */ + getAll(name: string): string[]; + /** + * The **`has()`** method of the URLSearchParams interface returns a boolean value that indicates whether the specified parameter is in the search parameters. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/has) + */ + has(name: string, value?: string): boolean; + /** + * The **`set()`** method of the URLSearchParams interface sets the value associated with a given search parameter to the given value. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/set) + */ + set(name: string, value: string): void; + /** + * The **`URLSearchParams.sort()`** method sorts all key/value pairs contained in this object in place and returns `undefined`. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/sort) + */ + sort(): void; + /* Returns an array of key, value pairs for every entry in the search params. */ + entries(): IterableIterator<[ + key: string, + value: string + ]>; + /* Returns a list of keys in the search params. */ + keys(): IterableIterator; + /* Returns a list of values in the search params. */ + values(): IterableIterator; + forEach(callback: (this: This, value: string, key: string, parent: URLSearchParams) => void, thisArg?: This): void; + /*function toString() { [native code] }*/ + toString(): string; + [Symbol.iterator](): IterableIterator<[ + key: string, + value: string + ]>; +} +declare class URLPattern { + constructor(input?: (string | URLPatternInit), baseURL?: (string | URLPatternOptions), patternOptions?: URLPatternOptions); + get protocol(): string; + get username(): string; + get password(): string; + get hostname(): string; + get port(): string; + get pathname(): string; + get search(): string; + get hash(): string; + test(input?: (string | URLPatternInit), baseURL?: string): boolean; + exec(input?: (string | URLPatternInit), baseURL?: string): URLPatternResult | null; +} +interface URLPatternInit { + protocol?: string; + username?: string; + password?: string; + hostname?: string; + port?: string; + pathname?: string; + search?: string; + hash?: string; + baseURL?: string; +} +interface URLPatternComponentResult { + input: string; + groups: Record; +} +interface URLPatternResult { + inputs: (string | URLPatternInit)[]; + protocol: URLPatternComponentResult; + username: URLPatternComponentResult; + password: URLPatternComponentResult; + hostname: URLPatternComponentResult; + port: URLPatternComponentResult; + pathname: URLPatternComponentResult; + search: URLPatternComponentResult; + hash: URLPatternComponentResult; +} +interface URLPatternOptions { + ignoreCase?: boolean; +} +/** + * A `CloseEvent` is sent to clients using WebSockets when the connection is closed. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent) + */ +declare class CloseEvent extends Event { + constructor(type: string, initializer?: CloseEventInit); + /** + * The **`code`** read-only property of the CloseEvent interface returns a WebSocket connection close code indicating the reason the connection was closed. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/code) + */ + readonly code: number; + /** + * The **`reason`** read-only property of the CloseEvent interface returns the WebSocket connection close reason the server gave for closing the connection; that is, a concise human-readable prose explanation for the closure. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/reason) + */ + readonly reason: string; + /** + * The **`wasClean`** read-only property of the CloseEvent interface returns `true` if the connection closed cleanly. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/wasClean) + */ + readonly wasClean: boolean; +} +interface CloseEventInit { + code?: number; + reason?: string; + wasClean?: boolean; +} +type WebSocketEventMap = { + close: CloseEvent; + message: MessageEvent; + open: Event; + error: ErrorEvent; +}; +/** + * The `WebSocket` object provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket) + */ +declare var WebSocket: { + prototype: WebSocket; + new (url: string, protocols?: (string[] | string)): WebSocket; + readonly READY_STATE_CONNECTING: number; + readonly CONNECTING: number; + readonly READY_STATE_OPEN: number; + readonly OPEN: number; + readonly READY_STATE_CLOSING: number; + readonly CLOSING: number; + readonly READY_STATE_CLOSED: number; + readonly CLOSED: number; +}; +/** + * The `WebSocket` object provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket) + */ +interface WebSocket extends EventTarget { + accept(): void; + /** + * The **`WebSocket.send()`** method enqueues the specified data to be transmitted to the server over the WebSocket connection, increasing the value of `bufferedAmount` by the number of bytes needed to contain the data. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/send) + */ + send(message: (ArrayBuffer | ArrayBufferView) | string): void; + /** + * The **`WebSocket.close()`** method closes the already `CLOSED`, this method does nothing. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/close) + */ + close(code?: number, reason?: string): void; + serializeAttachment(attachment: any): void; + deserializeAttachment(): any | null; + /** + * The **`WebSocket.readyState`** read-only property returns the current state of the WebSocket connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/readyState) + */ + readyState: number; + /** + * The **`WebSocket.url`** read-only property returns the absolute URL of the WebSocket as resolved by the constructor. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/url) + */ + url: string | null; + /** + * The **`WebSocket.protocol`** read-only property returns the name of the sub-protocol the server selected; this will be one of the strings specified in the `protocols` parameter when creating the WebSocket object, or the empty string if no connection is established. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/protocol) + */ + protocol: string | null; + /** + * The **`WebSocket.extensions`** read-only property returns the extensions selected by the server. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/extensions) + */ + extensions: string | null; +} +declare const WebSocketPair: { + new (): { + 0: WebSocket; + 1: WebSocket; + }; +}; +interface SqlStorage { + exec>(query: string, ...bindings: any[]): SqlStorageCursor; + get databaseSize(): number; + Cursor: typeof SqlStorageCursor; + Statement: typeof SqlStorageStatement; +} +declare abstract class SqlStorageStatement { +} +type SqlStorageValue = ArrayBuffer | string | number | null; +declare abstract class SqlStorageCursor> { + next(): { + done?: false; + value: T; + } | { + done: true; + value?: never; + }; + toArray(): T[]; + one(): T; + raw(): IterableIterator; + columnNames: string[]; + get rowsRead(): number; + get rowsWritten(): number; + [Symbol.iterator](): IterableIterator; +} +interface Socket { + get readable(): ReadableStream; + get writable(): WritableStream; + get closed(): Promise; + get opened(): Promise; + get upgraded(): boolean; + get secureTransport(): "on" | "off" | "starttls"; + close(): Promise; + startTls(options?: TlsOptions): Socket; +} +interface SocketOptions { + secureTransport?: string; + allowHalfOpen: boolean; + highWaterMark?: (number | bigint); +} +interface SocketAddress { + hostname: string; + port: number; +} +interface TlsOptions { + expectedServerHostname?: string; +} +interface SocketInfo { + remoteAddress?: string; + localAddress?: string; +} +/** + * The **`EventSource`** interface is web content's interface to server-sent events. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource) + */ +declare class EventSource extends EventTarget { + constructor(url: string, init?: EventSourceEventSourceInit); + /** + * The **`close()`** method of the EventSource interface closes the connection, if one is made, and sets the ```js-nolint close() ``` None. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/close) + */ + close(): void; + /** + * The **`url`** read-only property of the URL of the source. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/url) + */ + get url(): string; + /** + * The **`withCredentials`** read-only property of the the `EventSource` object was instantiated with CORS credentials set. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/withCredentials) + */ + get withCredentials(): boolean; + /** + * The **`readyState`** read-only property of the connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/readyState) + */ + get readyState(): number; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/open_event) */ + get onopen(): any | null; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/open_event) */ + set onopen(value: any | null); + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/message_event) */ + get onmessage(): any | null; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/message_event) */ + set onmessage(value: any | null); + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/error_event) */ + get onerror(): any | null; + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/error_event) */ + set onerror(value: any | null); + static readonly CONNECTING: number; + static readonly OPEN: number; + static readonly CLOSED: number; + static from(stream: ReadableStream): EventSource; +} +interface EventSourceEventSourceInit { + withCredentials?: boolean; + fetcher?: Fetcher; +} +interface Container { + get running(): boolean; + start(options?: ContainerStartupOptions): void; + monitor(): Promise; + destroy(error?: any): Promise; + signal(signo: number): void; + getTcpPort(port: number): Fetcher; + setInactivityTimeout(durationMs: number | bigint): Promise; +} +interface ContainerStartupOptions { + entrypoint?: string[]; + enableInternet: boolean; + env?: Record; + hardTimeout?: (number | bigint); +} +/** + * The **`MessagePort`** interface of the Channel Messaging API represents one of the two ports of a MessageChannel, allowing messages to be sent from one port and listening out for them arriving at the other. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort) + */ +interface MessagePort extends EventTarget { + /** + * The **`postMessage()`** method of the transfers ownership of objects to other browsing contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort/postMessage) + */ + postMessage(data?: any, options?: (any[] | MessagePortPostMessageOptions)): void; + /** + * The **`close()`** method of the MessagePort interface disconnects the port, so it is no longer active. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort/close) + */ + close(): void; + /** + * The **`start()`** method of the MessagePort interface starts the sending of messages queued on the port. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort/start) + */ + start(): void; + get onmessage(): any | null; + set onmessage(value: any | null); +} +interface MessagePortPostMessageOptions { + transfer?: any[]; +} +type LoopbackForExport Rpc.EntrypointBranded) | ExportedHandler | undefined = undefined> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded ? LoopbackServiceStub> : T extends new (...args: any[]) => Rpc.DurableObjectBranded ? LoopbackDurableObjectClass> : T extends ExportedHandler ? LoopbackServiceStub : undefined; +type LoopbackServiceStub = Fetcher & (T extends CloudflareWorkersModule.WorkerEntrypoint ? (opts: { + props?: Props; +}) => Fetcher : (opts: { + props?: any; +}) => Fetcher); +type LoopbackDurableObjectClass = DurableObjectClass & (T extends CloudflareWorkersModule.DurableObject ? (opts: { + props?: Props; +}) => DurableObjectClass : (opts: { + props?: any; +}) => DurableObjectClass); +interface SyncKvStorage { + get(key: string): T | undefined; + list(options?: SyncKvListOptions): Iterable<[ + string, + T + ]>; + put(key: string, value: T): void; + delete(key: string): boolean; +} +interface SyncKvListOptions { + start?: string; + startAfter?: string; + end?: string; + prefix?: string; + reverse?: boolean; + limit?: number; +} +interface WorkerStub { + getEntrypoint(name?: string, options?: WorkerStubEntrypointOptions): Fetcher; +} +interface WorkerStubEntrypointOptions { + props?: any; +} +interface WorkerLoader { + get(name: string | null, getCode: () => WorkerLoaderWorkerCode | Promise): WorkerStub; +} +interface WorkerLoaderModule { + js?: string; + cjs?: string; + text?: string; + data?: ArrayBuffer; + json?: any; + py?: string; + wasm?: ArrayBuffer; +} +interface WorkerLoaderWorkerCode { + compatibilityDate: string; + compatibilityFlags?: string[]; + allowExperimental?: boolean; + mainModule: string; + modules: Record; + env?: any; + globalOutbound?: (Fetcher | null); + tails?: Fetcher[]; + streamingTails?: Fetcher[]; +} +/** +* The Workers runtime supports a subset of the Performance API, used to measure timing and performance, +* as well as timing of subrequests and other operations. +* +* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/) +*/ +declare abstract class Performance { + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/#performancetimeorigin) */ + get timeOrigin(): number; + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/#performancenow) */ + now(): number; +} +type AiImageClassificationInput = { + image: number[]; +}; +type AiImageClassificationOutput = { + score?: number; + label?: string; +}[]; +declare abstract class BaseAiImageClassification { + inputs: AiImageClassificationInput; + postProcessedOutputs: AiImageClassificationOutput; +} +type AiImageToTextInput = { + image: number[]; + prompt?: string; + max_tokens?: number; + temperature?: number; + top_p?: number; + top_k?: number; + seed?: number; + repetition_penalty?: number; + frequency_penalty?: number; + presence_penalty?: number; + raw?: boolean; + messages?: RoleScopedChatInput[]; +}; +type AiImageToTextOutput = { + description: string; +}; +declare abstract class BaseAiImageToText { + inputs: AiImageToTextInput; + postProcessedOutputs: AiImageToTextOutput; +} +type AiImageTextToTextInput = { + image: string; + prompt?: string; + max_tokens?: number; + temperature?: number; + ignore_eos?: boolean; + top_p?: number; + top_k?: number; + seed?: number; + repetition_penalty?: number; + frequency_penalty?: number; + presence_penalty?: number; + raw?: boolean; + messages?: RoleScopedChatInput[]; +}; +type AiImageTextToTextOutput = { + description: string; +}; +declare abstract class BaseAiImageTextToText { + inputs: AiImageTextToTextInput; + postProcessedOutputs: AiImageTextToTextOutput; +} +type AiMultimodalEmbeddingsInput = { + image: string; + text: string[]; +}; +type AiIMultimodalEmbeddingsOutput = { + data: number[][]; + shape: number[]; +}; +declare abstract class BaseAiMultimodalEmbeddings { + inputs: AiImageTextToTextInput; + postProcessedOutputs: AiImageTextToTextOutput; +} +type AiObjectDetectionInput = { + image: number[]; +}; +type AiObjectDetectionOutput = { + score?: number; + label?: string; +}[]; +declare abstract class BaseAiObjectDetection { + inputs: AiObjectDetectionInput; + postProcessedOutputs: AiObjectDetectionOutput; +} +type AiSentenceSimilarityInput = { + source: string; + sentences: string[]; +}; +type AiSentenceSimilarityOutput = number[]; +declare abstract class BaseAiSentenceSimilarity { + inputs: AiSentenceSimilarityInput; + postProcessedOutputs: AiSentenceSimilarityOutput; +} +type AiAutomaticSpeechRecognitionInput = { + audio: number[]; +}; +type AiAutomaticSpeechRecognitionOutput = { + text?: string; + words?: { + word: string; + start: number; + end: number; + }[]; + vtt?: string; +}; +declare abstract class BaseAiAutomaticSpeechRecognition { + inputs: AiAutomaticSpeechRecognitionInput; + postProcessedOutputs: AiAutomaticSpeechRecognitionOutput; +} +type AiSummarizationInput = { + input_text: string; + max_length?: number; +}; +type AiSummarizationOutput = { + summary: string; +}; +declare abstract class BaseAiSummarization { + inputs: AiSummarizationInput; + postProcessedOutputs: AiSummarizationOutput; +} +type AiTextClassificationInput = { + text: string; +}; +type AiTextClassificationOutput = { + score?: number; + label?: string; +}[]; +declare abstract class BaseAiTextClassification { + inputs: AiTextClassificationInput; + postProcessedOutputs: AiTextClassificationOutput; +} +type AiTextEmbeddingsInput = { + text: string | string[]; +}; +type AiTextEmbeddingsOutput = { + shape: number[]; + data: number[][]; +}; +declare abstract class BaseAiTextEmbeddings { + inputs: AiTextEmbeddingsInput; + postProcessedOutputs: AiTextEmbeddingsOutput; +} +type RoleScopedChatInput = { + role: "user" | "assistant" | "system" | "tool" | (string & NonNullable); + content: string; + name?: string; +}; +type AiTextGenerationToolLegacyInput = { + name: string; + description: string; + parameters?: { + type: "object" | (string & NonNullable); + properties: { + [key: string]: { + type: string; + description?: string; + }; + }; + required: string[]; + }; +}; +type AiTextGenerationToolInput = { + type: "function" | (string & NonNullable); + function: { + name: string; + description: string; + parameters?: { + type: "object" | (string & NonNullable); + properties: { + [key: string]: { + type: string; + description?: string; + }; + }; + required: string[]; + }; + }; +}; +type AiTextGenerationFunctionsInput = { + name: string; + code: string; +}; +type AiTextGenerationResponseFormat = { + type: string; + json_schema?: any; +}; +type AiTextGenerationInput = { + prompt?: string; + raw?: boolean; + stream?: boolean; + max_tokens?: number; + temperature?: number; + top_p?: number; + top_k?: number; + seed?: number; + repetition_penalty?: number; + frequency_penalty?: number; + presence_penalty?: number; + messages?: RoleScopedChatInput[]; + response_format?: AiTextGenerationResponseFormat; + tools?: AiTextGenerationToolInput[] | AiTextGenerationToolLegacyInput[] | (object & NonNullable); + functions?: AiTextGenerationFunctionsInput[]; +}; +type AiTextGenerationToolLegacyOutput = { + name: string; + arguments: unknown; +}; +type AiTextGenerationToolOutput = { + id: string; + type: "function"; + function: { + name: string; + arguments: string; + }; +}; +type UsageTags = { + prompt_tokens: number; + completion_tokens: number; + total_tokens: number; +}; +type AiTextGenerationOutput = { + response?: string; + tool_calls?: AiTextGenerationToolLegacyOutput[] & AiTextGenerationToolOutput[]; + usage?: UsageTags; +}; +declare abstract class BaseAiTextGeneration { + inputs: AiTextGenerationInput; + postProcessedOutputs: AiTextGenerationOutput; +} +type AiTextToSpeechInput = { + prompt: string; + lang?: string; +}; +type AiTextToSpeechOutput = Uint8Array | { + audio: string; +}; +declare abstract class BaseAiTextToSpeech { + inputs: AiTextToSpeechInput; + postProcessedOutputs: AiTextToSpeechOutput; +} +type AiTextToImageInput = { + prompt: string; + negative_prompt?: string; + height?: number; + width?: number; + image?: number[]; + image_b64?: string; + mask?: number[]; + num_steps?: number; + strength?: number; + guidance?: number; + seed?: number; +}; +type AiTextToImageOutput = ReadableStream; +declare abstract class BaseAiTextToImage { + inputs: AiTextToImageInput; + postProcessedOutputs: AiTextToImageOutput; +} +type AiTranslationInput = { + text: string; + target_lang: string; + source_lang?: string; +}; +type AiTranslationOutput = { + translated_text?: string; +}; +declare abstract class BaseAiTranslation { + inputs: AiTranslationInput; + postProcessedOutputs: AiTranslationOutput; +} +/** + * Workers AI support for OpenAI's Responses API + * Reference: https://github.com/openai/openai-node/blob/master/src/resources/responses/responses.ts + * + * It's a stripped down version from its source. + * It currently supports basic function calling, json mode and accepts images as input. + * + * It does not include types for WebSearch, CodeInterpreter, FileInputs, MCP, CustomTools. + * We plan to add those incrementally as model + platform capabilities evolve. + */ +type ResponsesInput = { + background?: boolean | null; + conversation?: string | ResponseConversationParam | null; + include?: Array | null; + input?: string | ResponseInput; + instructions?: string | null; + max_output_tokens?: number | null; + parallel_tool_calls?: boolean | null; + previous_response_id?: string | null; + prompt_cache_key?: string; + reasoning?: Reasoning | null; + safety_identifier?: string; + service_tier?: "auto" | "default" | "flex" | "scale" | "priority" | null; + stream?: boolean | null; + stream_options?: StreamOptions | null; + temperature?: number | null; + text?: ResponseTextConfig; + tool_choice?: ToolChoiceOptions | ToolChoiceFunction; + tools?: Array; + top_p?: number | null; + truncation?: "auto" | "disabled" | null; +}; +type ResponsesOutput = { + id?: string; + created_at?: number; + output_text?: string; + error?: ResponseError | null; + incomplete_details?: ResponseIncompleteDetails | null; + instructions?: string | Array | null; + object?: "response"; + output?: Array; + parallel_tool_calls?: boolean; + temperature?: number | null; + tool_choice?: ToolChoiceOptions | ToolChoiceFunction; + tools?: Array; + top_p?: number | null; + max_output_tokens?: number | null; + previous_response_id?: string | null; + prompt?: ResponsePrompt | null; + reasoning?: Reasoning | null; + safety_identifier?: string; + service_tier?: "auto" | "default" | "flex" | "scale" | "priority" | null; + status?: ResponseStatus; + text?: ResponseTextConfig; + truncation?: "auto" | "disabled" | null; + usage?: ResponseUsage; +}; +type EasyInputMessage = { + content: string | ResponseInputMessageContentList; + role: "user" | "assistant" | "system" | "developer"; + type?: "message"; +}; +type ResponsesFunctionTool = { + name: string; + parameters: { + [key: string]: unknown; + } | null; + strict: boolean | null; + type: "function"; + description?: string | null; +}; +type ResponseIncompleteDetails = { + reason?: "max_output_tokens" | "content_filter"; +}; +type ResponsePrompt = { + id: string; + variables?: { + [key: string]: string | ResponseInputText | ResponseInputImage; + } | null; + version?: string | null; +}; +type Reasoning = { + effort?: ReasoningEffort | null; + generate_summary?: "auto" | "concise" | "detailed" | null; + summary?: "auto" | "concise" | "detailed" | null; +}; +type ResponseContent = ResponseInputText | ResponseInputImage | ResponseOutputText | ResponseOutputRefusal | ResponseContentReasoningText; +type ResponseContentReasoningText = { + text: string; + type: "reasoning_text"; +}; +type ResponseConversationParam = { + id: string; +}; +type ResponseCreatedEvent = { + response: Response; + sequence_number: number; + type: "response.created"; +}; +type ResponseCustomToolCallOutput = { + call_id: string; + output: string | Array; + type: "custom_tool_call_output"; + id?: string; +}; +type ResponseError = { + code: "server_error" | "rate_limit_exceeded" | "invalid_prompt" | "vector_store_timeout" | "invalid_image" | "invalid_image_format" | "invalid_base64_image" | "invalid_image_url" | "image_too_large" | "image_too_small" | "image_parse_error" | "image_content_policy_violation" | "invalid_image_mode" | "image_file_too_large" | "unsupported_image_media_type" | "empty_image_file" | "failed_to_download_image" | "image_file_not_found"; + message: string; +}; +type ResponseErrorEvent = { + code: string | null; + message: string; + param: string | null; + sequence_number: number; + type: "error"; +}; +type ResponseFailedEvent = { + response: Response; + sequence_number: number; + type: "response.failed"; +}; +type ResponseFormatText = { + type: "text"; +}; +type ResponseFormatJSONObject = { + type: "json_object"; +}; +type ResponseFormatTextConfig = ResponseFormatText | ResponseFormatTextJSONSchemaConfig | ResponseFormatJSONObject; +type ResponseFormatTextJSONSchemaConfig = { + name: string; + schema: { + [key: string]: unknown; + }; + type: "json_schema"; + description?: string; + strict?: boolean | null; +}; +type ResponseFunctionCallArgumentsDeltaEvent = { + delta: string; + item_id: string; + output_index: number; + sequence_number: number; + type: "response.function_call_arguments.delta"; +}; +type ResponseFunctionCallArgumentsDoneEvent = { + arguments: string; + item_id: string; + name: string; + output_index: number; + sequence_number: number; + type: "response.function_call_arguments.done"; +}; +type ResponseFunctionCallOutputItem = ResponseInputTextContent | ResponseInputImageContent; +type ResponseFunctionCallOutputItemList = Array; +type ResponseFunctionToolCall = { + arguments: string; + call_id: string; + name: string; + type: "function_call"; + id?: string; + status?: "in_progress" | "completed" | "incomplete"; +}; +interface ResponseFunctionToolCallItem extends ResponseFunctionToolCall { + id: string; +} +type ResponseFunctionToolCallOutputItem = { + id: string; + call_id: string; + output: string | Array; + type: "function_call_output"; + status?: "in_progress" | "completed" | "incomplete"; +}; +type ResponseIncludable = "message.input_image.image_url" | "message.output_text.logprobs"; +type ResponseIncompleteEvent = { + response: Response; + sequence_number: number; + type: "response.incomplete"; +}; +type ResponseInput = Array; +type ResponseInputContent = ResponseInputText | ResponseInputImage; +type ResponseInputImage = { + detail: "low" | "high" | "auto"; + type: "input_image"; + /** + * Base64 encoded image + */ + image_url?: string | null; +}; +type ResponseInputImageContent = { + type: "input_image"; + detail?: "low" | "high" | "auto" | null; + /** + * Base64 encoded image + */ + image_url?: string | null; +}; +type ResponseInputItem = EasyInputMessage | ResponseInputItemMessage | ResponseOutputMessage | ResponseFunctionToolCall | ResponseInputItemFunctionCallOutput | ResponseReasoningItem; +type ResponseInputItemFunctionCallOutput = { + call_id: string; + output: string | ResponseFunctionCallOutputItemList; + type: "function_call_output"; + id?: string | null; + status?: "in_progress" | "completed" | "incomplete" | null; +}; +type ResponseInputItemMessage = { + content: ResponseInputMessageContentList; + role: "user" | "system" | "developer"; + status?: "in_progress" | "completed" | "incomplete"; + type?: "message"; +}; +type ResponseInputMessageContentList = Array; +type ResponseInputMessageItem = { + id: string; + content: ResponseInputMessageContentList; + role: "user" | "system" | "developer"; + status?: "in_progress" | "completed" | "incomplete"; + type?: "message"; +}; +type ResponseInputText = { + text: string; + type: "input_text"; +}; +type ResponseInputTextContent = { + text: string; + type: "input_text"; +}; +type ResponseItem = ResponseInputMessageItem | ResponseOutputMessage | ResponseFunctionToolCallItem | ResponseFunctionToolCallOutputItem; +type ResponseOutputItem = ResponseOutputMessage | ResponseFunctionToolCall | ResponseReasoningItem; +type ResponseOutputItemAddedEvent = { + item: ResponseOutputItem; + output_index: number; + sequence_number: number; + type: "response.output_item.added"; +}; +type ResponseOutputItemDoneEvent = { + item: ResponseOutputItem; + output_index: number; + sequence_number: number; + type: "response.output_item.done"; +}; +type ResponseOutputMessage = { + id: string; + content: Array; + role: "assistant"; + status: "in_progress" | "completed" | "incomplete"; + type: "message"; +}; +type ResponseOutputRefusal = { + refusal: string; + type: "refusal"; +}; +type ResponseOutputText = { + text: string; + type: "output_text"; + logprobs?: Array; +}; +type ResponseReasoningItem = { + id: string; + summary: Array; + type: "reasoning"; + content?: Array; + encrypted_content?: string | null; + status?: "in_progress" | "completed" | "incomplete"; +}; +type ResponseReasoningSummaryItem = { + text: string; + type: "summary_text"; +}; +type ResponseReasoningContentItem = { + text: string; + type: "reasoning_text"; +}; +type ResponseReasoningTextDeltaEvent = { + content_index: number; + delta: string; + item_id: string; + output_index: number; + sequence_number: number; + type: "response.reasoning_text.delta"; +}; +type ResponseReasoningTextDoneEvent = { + content_index: number; + item_id: string; + output_index: number; + sequence_number: number; + text: string; + type: "response.reasoning_text.done"; +}; +type ResponseRefusalDeltaEvent = { + content_index: number; + delta: string; + item_id: string; + output_index: number; + sequence_number: number; + type: "response.refusal.delta"; +}; +type ResponseRefusalDoneEvent = { + content_index: number; + item_id: string; + output_index: number; + refusal: string; + sequence_number: number; + type: "response.refusal.done"; +}; +type ResponseStatus = "completed" | "failed" | "in_progress" | "cancelled" | "queued" | "incomplete"; +type ResponseStreamEvent = ResponseCompletedEvent | ResponseCreatedEvent | ResponseErrorEvent | ResponseFunctionCallArgumentsDeltaEvent | ResponseFunctionCallArgumentsDoneEvent | ResponseFailedEvent | ResponseIncompleteEvent | ResponseOutputItemAddedEvent | ResponseOutputItemDoneEvent | ResponseReasoningTextDeltaEvent | ResponseReasoningTextDoneEvent | ResponseRefusalDeltaEvent | ResponseRefusalDoneEvent | ResponseTextDeltaEvent | ResponseTextDoneEvent; +type ResponseCompletedEvent = { + response: Response; + sequence_number: number; + type: "response.completed"; +}; +type ResponseTextConfig = { + format?: ResponseFormatTextConfig; + verbosity?: "low" | "medium" | "high" | null; +}; +type ResponseTextDeltaEvent = { + content_index: number; + delta: string; + item_id: string; + logprobs: Array; + output_index: number; + sequence_number: number; + type: "response.output_text.delta"; +}; +type ResponseTextDoneEvent = { + content_index: number; + item_id: string; + logprobs: Array; + output_index: number; + sequence_number: number; + text: string; + type: "response.output_text.done"; +}; +type Logprob = { + token: string; + logprob: number; + top_logprobs?: Array; +}; +type TopLogprob = { + token?: string; + logprob?: number; +}; +type ResponseUsage = { + input_tokens: number; + output_tokens: number; + total_tokens: number; +}; +type Tool = ResponsesFunctionTool; +type ToolChoiceFunction = { + name: string; + type: "function"; +}; +type ToolChoiceOptions = "none"; +type ReasoningEffort = "minimal" | "low" | "medium" | "high" | null; +type StreamOptions = { + include_obfuscation?: boolean; +}; +type Ai_Cf_Baai_Bge_Base_En_V1_5_Input = { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; +} | { + /** + * Batch of the embeddings requests to run using async-queue + */ + requests: { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; + }[]; +}; +type Ai_Cf_Baai_Bge_Base_En_V1_5_Output = { + shape?: number[]; + /** + * Embeddings of the requested text values + */ + data?: number[][]; + /** + * The pooling method used in the embedding process. + */ + pooling?: "mean" | "cls"; +} | Ai_Cf_Baai_Bge_Base_En_V1_5_AsyncResponse; +interface Ai_Cf_Baai_Bge_Base_En_V1_5_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Baai_Bge_Base_En_V1_5 { + inputs: Ai_Cf_Baai_Bge_Base_En_V1_5_Input; + postProcessedOutputs: Ai_Cf_Baai_Bge_Base_En_V1_5_Output; +} +type Ai_Cf_Openai_Whisper_Input = string | { + /** + * An array of integers that represent the audio data constrained to 8-bit unsigned integer values + */ + audio: number[]; +}; +interface Ai_Cf_Openai_Whisper_Output { + /** + * The transcription + */ + text: string; + word_count?: number; + words?: { + word?: string; + /** + * The second this word begins in the recording + */ + start?: number; + /** + * The ending second when the word completes + */ + end?: number; + }[]; + vtt?: string; +} +declare abstract class Base_Ai_Cf_Openai_Whisper { + inputs: Ai_Cf_Openai_Whisper_Input; + postProcessedOutputs: Ai_Cf_Openai_Whisper_Output; +} +type Ai_Cf_Meta_M2M100_1_2B_Input = { + /** + * The text to be translated + */ + text: string; + /** + * The language code of the source text (e.g., 'en' for English). Defaults to 'en' if not specified + */ + source_lang?: string; + /** + * The language code to translate the text into (e.g., 'es' for Spanish) + */ + target_lang: string; +} | { + /** + * Batch of the embeddings requests to run using async-queue + */ + requests: { + /** + * The text to be translated + */ + text: string; + /** + * The language code of the source text (e.g., 'en' for English). Defaults to 'en' if not specified + */ + source_lang?: string; + /** + * The language code to translate the text into (e.g., 'es' for Spanish) + */ + target_lang: string; + }[]; +}; +type Ai_Cf_Meta_M2M100_1_2B_Output = { + /** + * The translated text in the target language + */ + translated_text?: string; +} | Ai_Cf_Meta_M2M100_1_2B_AsyncResponse; +interface Ai_Cf_Meta_M2M100_1_2B_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Meta_M2M100_1_2B { + inputs: Ai_Cf_Meta_M2M100_1_2B_Input; + postProcessedOutputs: Ai_Cf_Meta_M2M100_1_2B_Output; +} +type Ai_Cf_Baai_Bge_Small_En_V1_5_Input = { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; +} | { + /** + * Batch of the embeddings requests to run using async-queue + */ + requests: { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; + }[]; +}; +type Ai_Cf_Baai_Bge_Small_En_V1_5_Output = { + shape?: number[]; + /** + * Embeddings of the requested text values + */ + data?: number[][]; + /** + * The pooling method used in the embedding process. + */ + pooling?: "mean" | "cls"; +} | Ai_Cf_Baai_Bge_Small_En_V1_5_AsyncResponse; +interface Ai_Cf_Baai_Bge_Small_En_V1_5_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Baai_Bge_Small_En_V1_5 { + inputs: Ai_Cf_Baai_Bge_Small_En_V1_5_Input; + postProcessedOutputs: Ai_Cf_Baai_Bge_Small_En_V1_5_Output; +} +type Ai_Cf_Baai_Bge_Large_En_V1_5_Input = { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; +} | { + /** + * Batch of the embeddings requests to run using async-queue + */ + requests: { + text: string | string[]; + /** + * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy. + */ + pooling?: "mean" | "cls"; + }[]; +}; +type Ai_Cf_Baai_Bge_Large_En_V1_5_Output = { + shape?: number[]; + /** + * Embeddings of the requested text values + */ + data?: number[][]; + /** + * The pooling method used in the embedding process. + */ + pooling?: "mean" | "cls"; +} | Ai_Cf_Baai_Bge_Large_En_V1_5_AsyncResponse; +interface Ai_Cf_Baai_Bge_Large_En_V1_5_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Baai_Bge_Large_En_V1_5 { + inputs: Ai_Cf_Baai_Bge_Large_En_V1_5_Input; + postProcessedOutputs: Ai_Cf_Baai_Bge_Large_En_V1_5_Output; +} +type Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Input = string | { + /** + * The input text prompt for the model to generate a response. + */ + prompt?: string; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; + image: number[] | (string & NonNullable); + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; +}; +interface Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Output { + description?: string; +} +declare abstract class Base_Ai_Cf_Unum_Uform_Gen2_Qwen_500M { + inputs: Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Input; + postProcessedOutputs: Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Output; +} +type Ai_Cf_Openai_Whisper_Tiny_En_Input = string | { + /** + * An array of integers that represent the audio data constrained to 8-bit unsigned integer values + */ + audio: number[]; +}; +interface Ai_Cf_Openai_Whisper_Tiny_En_Output { + /** + * The transcription + */ + text: string; + word_count?: number; + words?: { + word?: string; + /** + * The second this word begins in the recording + */ + start?: number; + /** + * The ending second when the word completes + */ + end?: number; + }[]; + vtt?: string; +} +declare abstract class Base_Ai_Cf_Openai_Whisper_Tiny_En { + inputs: Ai_Cf_Openai_Whisper_Tiny_En_Input; + postProcessedOutputs: Ai_Cf_Openai_Whisper_Tiny_En_Output; +} +interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input { + /** + * Base64 encoded value of the audio data. + */ + audio: string; + /** + * Supported tasks are 'translate' or 'transcribe'. + */ + task?: string; + /** + * The language of the audio being transcribed or translated. + */ + language?: string; + /** + * Preprocess the audio with a voice activity detection model. + */ + vad_filter?: boolean; + /** + * A text prompt to help provide context to the model on the contents of the audio. + */ + initial_prompt?: string; + /** + * The prefix it appended the the beginning of the output of the transcription and can guide the transcription result. + */ + prefix?: string; +} +interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output { + transcription_info?: { + /** + * The language of the audio being transcribed or translated. + */ + language?: string; + /** + * The confidence level or probability of the detected language being accurate, represented as a decimal between 0 and 1. + */ + language_probability?: number; + /** + * The total duration of the original audio file, in seconds. + */ + duration?: number; + /** + * The duration of the audio after applying Voice Activity Detection (VAD) to remove silent or irrelevant sections, in seconds. + */ + duration_after_vad?: number; + }; + /** + * The complete transcription of the audio. + */ + text: string; + /** + * The total number of words in the transcription. + */ + word_count?: number; + segments?: { + /** + * The starting time of the segment within the audio, in seconds. + */ + start?: number; + /** + * The ending time of the segment within the audio, in seconds. + */ + end?: number; + /** + * The transcription of the segment. + */ + text?: string; + /** + * The temperature used in the decoding process, controlling randomness in predictions. Lower values result in more deterministic outputs. + */ + temperature?: number; + /** + * The average log probability of the predictions for the words in this segment, indicating overall confidence. + */ + avg_logprob?: number; + /** + * The compression ratio of the input to the output, measuring how much the text was compressed during the transcription process. + */ + compression_ratio?: number; + /** + * The probability that the segment contains no speech, represented as a decimal between 0 and 1. + */ + no_speech_prob?: number; + words?: { + /** + * The individual word transcribed from the audio. + */ + word?: string; + /** + * The starting time of the word within the audio, in seconds. + */ + start?: number; + /** + * The ending time of the word within the audio, in seconds. + */ + end?: number; + }[]; + }[]; + /** + * The transcription in WebVTT format, which includes timing and text information for use in subtitles. + */ + vtt?: string; +} +declare abstract class Base_Ai_Cf_Openai_Whisper_Large_V3_Turbo { + inputs: Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input; + postProcessedOutputs: Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output; +} +type Ai_Cf_Baai_Bge_M3_Input = Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts | Ai_Cf_Baai_Bge_M3_Input_Embedding | { + /** + * Batch of the embeddings requests to run using async-queue + */ + requests: (Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts_1 | Ai_Cf_Baai_Bge_M3_Input_Embedding_1)[]; +}; +interface Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts { + /** + * A query you wish to perform against the provided contexts. If no query is provided the model with respond with embeddings for contexts + */ + query?: string; + /** + * List of provided contexts. Note that the index in this array is important, as the response will refer to it. + */ + contexts: { + /** + * One of the provided context content + */ + text?: string; + }[]; + /** + * When provided with too long context should the model error out or truncate the context to fit? + */ + truncate_inputs?: boolean; +} +interface Ai_Cf_Baai_Bge_M3_Input_Embedding { + text: string | string[]; + /** + * When provided with too long context should the model error out or truncate the context to fit? + */ + truncate_inputs?: boolean; +} +interface Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts_1 { + /** + * A query you wish to perform against the provided contexts. If no query is provided the model with respond with embeddings for contexts + */ + query?: string; + /** + * List of provided contexts. Note that the index in this array is important, as the response will refer to it. + */ + contexts: { + /** + * One of the provided context content + */ + text?: string; + }[]; + /** + * When provided with too long context should the model error out or truncate the context to fit? + */ + truncate_inputs?: boolean; +} +interface Ai_Cf_Baai_Bge_M3_Input_Embedding_1 { + text: string | string[]; + /** + * When provided with too long context should the model error out or truncate the context to fit? + */ + truncate_inputs?: boolean; +} +type Ai_Cf_Baai_Bge_M3_Output = Ai_Cf_Baai_Bge_M3_Ouput_Query | Ai_Cf_Baai_Bge_M3_Output_EmbeddingFor_Contexts | Ai_Cf_Baai_Bge_M3_Ouput_Embedding | Ai_Cf_Baai_Bge_M3_AsyncResponse; +interface Ai_Cf_Baai_Bge_M3_Ouput_Query { + response?: { + /** + * Index of the context in the request + */ + id?: number; + /** + * Score of the context under the index. + */ + score?: number; + }[]; +} +interface Ai_Cf_Baai_Bge_M3_Output_EmbeddingFor_Contexts { + response?: number[][]; + shape?: number[]; + /** + * The pooling method used in the embedding process. + */ + pooling?: "mean" | "cls"; +} +interface Ai_Cf_Baai_Bge_M3_Ouput_Embedding { + shape?: number[]; + /** + * Embeddings of the requested text values + */ + data?: number[][]; + /** + * The pooling method used in the embedding process. + */ + pooling?: "mean" | "cls"; +} +interface Ai_Cf_Baai_Bge_M3_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Baai_Bge_M3 { + inputs: Ai_Cf_Baai_Bge_M3_Input; + postProcessedOutputs: Ai_Cf_Baai_Bge_M3_Output; +} +interface Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Input { + /** + * A text description of the image you want to generate. + */ + prompt: string; + /** + * The number of diffusion steps; higher values can improve quality but take longer. + */ + steps?: number; +} +interface Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Output { + /** + * The generated image in Base64 format. + */ + image?: string; +} +declare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_1_Schnell { + inputs: Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Input; + postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Output; +} +type Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Input = Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Prompt | Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Messages; +interface Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + image?: number[] | (string & NonNullable); + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; +} +interface Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + /** + * The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[] | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }; + }[]; + image?: number[] | (string & NonNullable); + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + /** + * If true, the response will be streamed back incrementally. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +type Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Output = { + /** + * The generated text response from the model + */ + response?: string; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +}; +declare abstract class Base_Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct { + inputs: Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Input; + postProcessedOutputs: Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Output; +} +type Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Input = Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Prompt | Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Messages | Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Async_Batch; +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + /** + * The content of the message as a string. + */ + content: string; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_1; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_1 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Async_Batch { + requests?: { + /** + * User-supplied reference. This field will be present in the response as well it can be used to reference the request and response. It's NOT validated to be unique. + */ + external_reference?: string; + /** + * Prompt for the text generation model + */ + prompt?: string; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; + response_format?: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_2; + }[]; +} +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_2 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +type Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +} | string | Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_AsyncResponse; +interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast { + inputs: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Input; + postProcessedOutputs: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Output; +} +interface Ai_Cf_Meta_Llama_Guard_3_8B_Input { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender must alternate between 'user' and 'assistant'. + */ + role: "user" | "assistant"; + /** + * The content of the message as a string. + */ + content: string; + }[]; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Dictate the output format of the generated response. + */ + response_format?: { + /** + * Set to json_object to process and output generated text as JSON. + */ + type?: string; + }; +} +interface Ai_Cf_Meta_Llama_Guard_3_8B_Output { + response?: string | { + /** + * Whether the conversation is safe or not. + */ + safe?: boolean; + /** + * A list of what hazard categories predicted for the conversation, if the conversation is deemed unsafe. + */ + categories?: string[]; + }; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; +} +declare abstract class Base_Ai_Cf_Meta_Llama_Guard_3_8B { + inputs: Ai_Cf_Meta_Llama_Guard_3_8B_Input; + postProcessedOutputs: Ai_Cf_Meta_Llama_Guard_3_8B_Output; +} +interface Ai_Cf_Baai_Bge_Reranker_Base_Input { + /** + * A query you wish to perform against the provided contexts. + */ + /** + * Number of returned results starting with the best score. + */ + top_k?: number; + /** + * List of provided contexts. Note that the index in this array is important, as the response will refer to it. + */ + contexts: { + /** + * One of the provided context content + */ + text?: string; + }[]; +} +interface Ai_Cf_Baai_Bge_Reranker_Base_Output { + response?: { + /** + * Index of the context in the request + */ + id?: number; + /** + * Score of the context under the index. + */ + score?: number; + }[]; +} +declare abstract class Base_Ai_Cf_Baai_Bge_Reranker_Base { + inputs: Ai_Cf_Baai_Bge_Reranker_Base_Input; + postProcessedOutputs: Ai_Cf_Baai_Bge_Reranker_Base_Output; +} +type Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Input = Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Prompt | Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Messages; +interface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + /** + * The content of the message as a string. + */ + content: string; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode_1; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode_1 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +type Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +}; +declare abstract class Base_Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct { + inputs: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Input; + postProcessedOutputs: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Output; +} +type Ai_Cf_Qwen_Qwq_32B_Input = Ai_Cf_Qwen_Qwq_32B_Prompt | Ai_Cf_Qwen_Qwq_32B_Messages; +interface Ai_Cf_Qwen_Qwq_32B_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwq_32B_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + /** + * The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[] | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +type Ai_Cf_Qwen_Qwq_32B_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +}; +declare abstract class Base_Ai_Cf_Qwen_Qwq_32B { + inputs: Ai_Cf_Qwen_Qwq_32B_Input; + postProcessedOutputs: Ai_Cf_Qwen_Qwq_32B_Output; +} +type Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Input = Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Prompt | Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Messages; +interface Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + /** + * The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[] | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +type Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +}; +declare abstract class Base_Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct { + inputs: Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Input; + postProcessedOutputs: Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Output; +} +type Ai_Cf_Google_Gemma_3_12B_It_Input = Ai_Cf_Google_Gemma_3_12B_It_Prompt | Ai_Cf_Google_Gemma_3_12B_It_Messages; +interface Ai_Cf_Google_Gemma_3_12B_It_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Google_Gemma_3_12B_It_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[]; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +type Ai_Cf_Google_Gemma_3_12B_It_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + /** + * The name of the tool to be called + */ + name?: string; + }[]; +}; +declare abstract class Base_Ai_Cf_Google_Gemma_3_12B_It { + inputs: Ai_Cf_Google_Gemma_3_12B_It_Input; + postProcessedOutputs: Ai_Cf_Google_Gemma_3_12B_It_Output; +} +type Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Input = Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Async_Batch; +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + /** + * The tool call id. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[] | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Async_Batch { + requests: (Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt_Inner | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages_Inner)[]; +} +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt_Inner { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages_Inner { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string; + /** + * The tool call id. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string; + content?: string | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }[] | { + /** + * Type of the content provided + */ + type?: string; + text?: string; + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string; + }; + }; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode; + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +type Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Output = { + /** + * The generated text response from the model + */ + response: string; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The tool call id. + */ + id?: string; + /** + * Specifies the type of tool (e.g., 'function'). + */ + type?: string; + /** + * Details of the function tool. + */ + function?: { + /** + * The name of the tool to be called + */ + name?: string; + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object; + }; + }[]; +}; +declare abstract class Base_Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct { + inputs: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Input; + postProcessedOutputs: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Output; +} +type Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Input = Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Async_Batch; +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + /** + * The content of the message as a string. + */ + content: string; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_1; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_1 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Async_Batch { + requests: (Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt_1 | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages_1)[]; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt_1 { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_2; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_2 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages_1 { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + /** + * The content of the message as a string. + */ + content: string; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_3; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_3 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +type Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Output = Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Chat_Completion_Response | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Text_Completion_Response | string | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_AsyncResponse; +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Chat_Completion_Response { + /** + * Unique identifier for the completion + */ + id?: string; + /** + * Object type identifier + */ + object?: "chat.completion"; + /** + * Unix timestamp of when the completion was created + */ + created?: number; + /** + * Model used for the completion + */ + model?: string; + /** + * List of completion choices + */ + choices?: { + /** + * Index of the choice in the list + */ + index?: number; + /** + * The message generated by the model + */ + message?: { + /** + * Role of the message author + */ + role: string; + /** + * The content of the message + */ + content: string; + /** + * Internal reasoning content (if available) + */ + reasoning_content?: string; + /** + * Tool calls made by the assistant + */ + tool_calls?: { + /** + * Unique identifier for the tool call + */ + id: string; + /** + * Type of tool call + */ + type: "function"; + function: { + /** + * Name of the function to call + */ + name: string; + /** + * JSON string of arguments for the function + */ + arguments: string; + }; + }[]; + }; + /** + * Reason why the model stopped generating + */ + finish_reason?: string; + /** + * Stop reason (may be null) + */ + stop_reason?: string | null; + /** + * Log probabilities (if requested) + */ + logprobs?: {} | null; + }[]; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * Log probabilities for the prompt (if requested) + */ + prompt_logprobs?: {} | null; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Text_Completion_Response { + /** + * Unique identifier for the completion + */ + id?: string; + /** + * Object type identifier + */ + object?: "text_completion"; + /** + * Unix timestamp of when the completion was created + */ + created?: number; + /** + * Model used for the completion + */ + model?: string; + /** + * List of completion choices + */ + choices?: { + /** + * Index of the choice in the list + */ + index: number; + /** + * The generated text completion + */ + text: string; + /** + * Reason why the model stopped generating + */ + finish_reason: string; + /** + * Stop reason (may be null) + */ + stop_reason?: string | null; + /** + * Log probabilities (if requested) + */ + logprobs?: {} | null; + /** + * Log probabilities for the prompt (if requested) + */ + prompt_logprobs?: {} | null; + }[]; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; +} +interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8 { + inputs: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Input; + postProcessedOutputs: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Output; +} +interface Ai_Cf_Deepgram_Nova_3_Input { + audio: { + body: object; + contentType: string; + }; + /** + * Sets how the model will interpret strings submitted to the custom_topic param. When strict, the model will only return topics submitted using the custom_topic param. When extended, the model will return its own detected topics in addition to those submitted using the custom_topic param. + */ + custom_topic_mode?: "extended" | "strict"; + /** + * Custom topics you want the model to detect within your input audio or text if present Submit up to 100 + */ + custom_topic?: string; + /** + * Sets how the model will interpret intents submitted to the custom_intent param. When strict, the model will only return intents submitted using the custom_intent param. When extended, the model will return its own detected intents in addition those submitted using the custom_intents param + */ + custom_intent_mode?: "extended" | "strict"; + /** + * Custom intents you want the model to detect within your input audio if present + */ + custom_intent?: string; + /** + * Identifies and extracts key entities from content in submitted audio + */ + detect_entities?: boolean; + /** + * Identifies the dominant language spoken in submitted audio + */ + detect_language?: boolean; + /** + * Recognize speaker changes. Each word in the transcript will be assigned a speaker number starting at 0 + */ + diarize?: boolean; + /** + * Identify and extract key entities from content in submitted audio + */ + dictation?: boolean; + /** + * Specify the expected encoding of your submitted audio + */ + encoding?: "linear16" | "flac" | "mulaw" | "amr-nb" | "amr-wb" | "opus" | "speex" | "g729"; + /** + * Arbitrary key-value pairs that are attached to the API response for usage in downstream processing + */ + extra?: string; + /** + * Filler Words can help transcribe interruptions in your audio, like 'uh' and 'um' + */ + filler_words?: boolean; + /** + * Key term prompting can boost or suppress specialized terminology and brands. + */ + keyterm?: string; + /** + * Keywords can boost or suppress specialized terminology and brands. + */ + keywords?: string; + /** + * The BCP-47 language tag that hints at the primary spoken language. Depending on the Model and API endpoint you choose only certain languages are available. + */ + language?: string; + /** + * Spoken measurements will be converted to their corresponding abbreviations. + */ + measurements?: boolean; + /** + * Opts out requests from the Deepgram Model Improvement Program. Refer to our Docs for pricing impacts before setting this to true. https://dpgr.am/deepgram-mip. + */ + mip_opt_out?: boolean; + /** + * Mode of operation for the model representing broad area of topic that will be talked about in the supplied audio + */ + mode?: "general" | "medical" | "finance"; + /** + * Transcribe each audio channel independently. + */ + multichannel?: boolean; + /** + * Numerals converts numbers from written format to numerical format. + */ + numerals?: boolean; + /** + * Splits audio into paragraphs to improve transcript readability. + */ + paragraphs?: boolean; + /** + * Profanity Filter looks for recognized profanity and converts it to the nearest recognized non-profane word or removes it from the transcript completely. + */ + profanity_filter?: boolean; + /** + * Add punctuation and capitalization to the transcript. + */ + punctuate?: boolean; + /** + * Redaction removes sensitive information from your transcripts. + */ + redact?: string; + /** + * Search for terms or phrases in submitted audio and replaces them. + */ + replace?: string; + /** + * Search for terms or phrases in submitted audio. + */ + search?: string; + /** + * Recognizes the sentiment throughout a transcript or text. + */ + sentiment?: boolean; + /** + * Apply formatting to transcript output. When set to true, additional formatting will be applied to transcripts to improve readability. + */ + smart_format?: boolean; + /** + * Detect topics throughout a transcript or text. + */ + topics?: boolean; + /** + * Segments speech into meaningful semantic units. + */ + utterances?: boolean; + /** + * Seconds to wait before detecting a pause between words in submitted audio. + */ + utt_split?: number; + /** + * The number of channels in the submitted audio + */ + channels?: number; + /** + * Specifies whether the streaming endpoint should provide ongoing transcription updates as more audio is received. When set to true, the endpoint sends continuous updates, meaning transcription results may evolve over time. Note: Supported only for webosockets. + */ + interim_results?: boolean; + /** + * Indicates how long model will wait to detect whether a speaker has finished speaking or pauses for a significant period of time. When set to a value, the streaming endpoint immediately finalizes the transcription for the processed time range and returns the transcript with a speech_final parameter set to true. Can also be set to false to disable endpointing + */ + endpointing?: string; + /** + * Indicates that speech has started. You'll begin receiving Speech Started messages upon speech starting. Note: Supported only for webosockets. + */ + vad_events?: boolean; + /** + * Indicates how long model will wait to send an UtteranceEnd message after a word has been transcribed. Use with interim_results. Note: Supported only for webosockets. + */ + utterance_end_ms?: boolean; +} +interface Ai_Cf_Deepgram_Nova_3_Output { + results?: { + channels?: { + alternatives?: { + confidence?: number; + transcript?: string; + words?: { + confidence?: number; + end?: number; + start?: number; + word?: string; + }[]; + }[]; + }[]; + summary?: { + result?: string; + short?: string; + }; + sentiments?: { + segments?: { + text?: string; + start_word?: number; + end_word?: number; + sentiment?: string; + sentiment_score?: number; + }[]; + average?: { + sentiment?: string; + sentiment_score?: number; + }; + }; + }; +} +declare abstract class Base_Ai_Cf_Deepgram_Nova_3 { + inputs: Ai_Cf_Deepgram_Nova_3_Input; + postProcessedOutputs: Ai_Cf_Deepgram_Nova_3_Output; +} +interface Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Input { + queries?: string | string[]; + /** + * Optional instruction for the task + */ + instruction?: string; + documents?: string | string[]; + text?: string | string[]; +} +interface Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Output { + data?: number[][]; + shape?: number[]; +} +declare abstract class Base_Ai_Cf_Qwen_Qwen3_Embedding_0_6B { + inputs: Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Input; + postProcessedOutputs: Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Output; +} +type Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Input = { + /** + * readable stream with audio data and content-type specified for that data + */ + audio: { + body: object; + contentType: string; + }; + /** + * type of data PCM data that's sent to the inference server as raw array + */ + dtype?: "uint8" | "float32" | "float64"; +} | { + /** + * base64 encoded audio data + */ + audio: string; + /** + * type of data PCM data that's sent to the inference server as raw array + */ + dtype?: "uint8" | "float32" | "float64"; +}; +interface Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Output { + /** + * if true, end-of-turn was detected + */ + is_complete?: boolean; + /** + * probability of the end-of-turn detection + */ + probability?: number; +} +declare abstract class Base_Ai_Cf_Pipecat_Ai_Smart_Turn_V2 { + inputs: Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Input; + postProcessedOutputs: Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Output; +} +declare abstract class Base_Ai_Cf_Openai_Gpt_Oss_120B { + inputs: ResponsesInput; + postProcessedOutputs: ResponsesOutput; +} +declare abstract class Base_Ai_Cf_Openai_Gpt_Oss_20B { + inputs: ResponsesInput; + postProcessedOutputs: ResponsesOutput; +} +interface Ai_Cf_Leonardo_Phoenix_1_0_Input { + /** + * A text description of the image you want to generate. + */ + prompt: string; + /** + * Controls how closely the generated image should adhere to the prompt; higher values make the image more aligned with the prompt + */ + guidance?: number; + /** + * Random seed for reproducibility of the image generation + */ + seed?: number; + /** + * The height of the generated image in pixels + */ + height?: number; + /** + * The width of the generated image in pixels + */ + width?: number; + /** + * The number of diffusion steps; higher values can improve quality but take longer + */ + num_steps?: number; + /** + * Specify what to exclude from the generated images + */ + negative_prompt?: string; +} +/** + * The generated image in JPEG format + */ +type Ai_Cf_Leonardo_Phoenix_1_0_Output = string; +declare abstract class Base_Ai_Cf_Leonardo_Phoenix_1_0 { + inputs: Ai_Cf_Leonardo_Phoenix_1_0_Input; + postProcessedOutputs: Ai_Cf_Leonardo_Phoenix_1_0_Output; +} +interface Ai_Cf_Leonardo_Lucid_Origin_Input { + /** + * A text description of the image you want to generate. + */ + prompt: string; + /** + * Controls how closely the generated image should adhere to the prompt; higher values make the image more aligned with the prompt + */ + guidance?: number; + /** + * Random seed for reproducibility of the image generation + */ + seed?: number; + /** + * The height of the generated image in pixels + */ + height?: number; + /** + * The width of the generated image in pixels + */ + width?: number; + /** + * The number of diffusion steps; higher values can improve quality but take longer + */ + num_steps?: number; + /** + * The number of diffusion steps; higher values can improve quality but take longer + */ + steps?: number; +} +interface Ai_Cf_Leonardo_Lucid_Origin_Output { + /** + * The generated image in Base64 format. + */ + image?: string; +} +declare abstract class Base_Ai_Cf_Leonardo_Lucid_Origin { + inputs: Ai_Cf_Leonardo_Lucid_Origin_Input; + postProcessedOutputs: Ai_Cf_Leonardo_Lucid_Origin_Output; +} +interface Ai_Cf_Deepgram_Aura_1_Input { + /** + * Speaker used to produce the audio. + */ + speaker?: "angus" | "asteria" | "arcas" | "orion" | "orpheus" | "athena" | "luna" | "zeus" | "perseus" | "helios" | "hera" | "stella"; + /** + * Encoding of the output audio. + */ + encoding?: "linear16" | "flac" | "mulaw" | "alaw" | "mp3" | "opus" | "aac"; + /** + * Container specifies the file format wrapper for the output audio. The available options depend on the encoding type.. + */ + container?: "none" | "wav" | "ogg"; + /** + * The text content to be converted to speech + */ + text: string; + /** + * Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable + */ + sample_rate?: number; + /** + * The bitrate of the audio in bits per second. Choose from predefined ranges or specific values based on the encoding type. + */ + bit_rate?: number; +} +/** + * The generated audio in MP3 format + */ +type Ai_Cf_Deepgram_Aura_1_Output = string; +declare abstract class Base_Ai_Cf_Deepgram_Aura_1 { + inputs: Ai_Cf_Deepgram_Aura_1_Input; + postProcessedOutputs: Ai_Cf_Deepgram_Aura_1_Output; +} +interface Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Input { + /** + * Input text to translate. Can be a single string or a list of strings. + */ + text: string | string[]; + /** + * Target language to translate to + */ + target_language: "asm_Beng" | "awa_Deva" | "ben_Beng" | "bho_Deva" | "brx_Deva" | "doi_Deva" | "eng_Latn" | "gom_Deva" | "gon_Deva" | "guj_Gujr" | "hin_Deva" | "hne_Deva" | "kan_Knda" | "kas_Arab" | "kas_Deva" | "kha_Latn" | "lus_Latn" | "mag_Deva" | "mai_Deva" | "mal_Mlym" | "mar_Deva" | "mni_Beng" | "mni_Mtei" | "npi_Deva" | "ory_Orya" | "pan_Guru" | "san_Deva" | "sat_Olck" | "snd_Arab" | "snd_Deva" | "tam_Taml" | "tel_Telu" | "urd_Arab" | "unr_Deva"; +} +interface Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Output { + /** + * Translated texts + */ + translations: string[]; +} +declare abstract class Base_Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B { + inputs: Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Input; + postProcessedOutputs: Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Output; +} +type Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Input = Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Async_Batch; +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + /** + * The content of the message as a string. + */ + content: string; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_1; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_1 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Async_Batch { + requests: (Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt_1 | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages_1)[]; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt_1 { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string; + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string; + response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_2; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_2 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages_1 { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string; + /** + * The content of the message as a string. + */ + content: string; + }[]; + functions?: { + name: string; + code: string; + }[]; + /** + * A list of tools available for the assistant to use. + */ + tools?: ({ + /** + * The name of the tool. More descriptive the better. + */ + name: string; + /** + * A brief description of what the tool does. + */ + description: string; + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + } | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string; + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string; + /** + * A brief description of what the function does. + */ + description: string; + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string; + /** + * List of required parameter names. + */ + required?: string[]; + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string; + /** + * A description of the expected parameter. + */ + description: string; + }; + }; + }; + }; + })[]; + response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_3; + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean; + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean; + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number; + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number; + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number; + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number; + /** + * Random seed for reproducibility of the generation. + */ + seed?: number; + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number; + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number; + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_3 { + type?: "json_object" | "json_schema"; + json_schema?: unknown; +} +type Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Output = Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Chat_Completion_Response | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Text_Completion_Response | string | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_AsyncResponse; +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Chat_Completion_Response { + /** + * Unique identifier for the completion + */ + id?: string; + /** + * Object type identifier + */ + object?: "chat.completion"; + /** + * Unix timestamp of when the completion was created + */ + created?: number; + /** + * Model used for the completion + */ + model?: string; + /** + * List of completion choices + */ + choices?: { + /** + * Index of the choice in the list + */ + index?: number; + /** + * The message generated by the model + */ + message?: { + /** + * Role of the message author + */ + role: string; + /** + * The content of the message + */ + content: string; + /** + * Internal reasoning content (if available) + */ + reasoning_content?: string; + /** + * Tool calls made by the assistant + */ + tool_calls?: { + /** + * Unique identifier for the tool call + */ + id: string; + /** + * Type of tool call + */ + type: "function"; + function: { + /** + * Name of the function to call + */ + name: string; + /** + * JSON string of arguments for the function + */ + arguments: string; + }; + }[]; + }; + /** + * Reason why the model stopped generating + */ + finish_reason?: string; + /** + * Stop reason (may be null) + */ + stop_reason?: string | null; + /** + * Log probabilities (if requested) + */ + logprobs?: {} | null; + }[]; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; + /** + * Log probabilities for the prompt (if requested) + */ + prompt_logprobs?: {} | null; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Text_Completion_Response { + /** + * Unique identifier for the completion + */ + id?: string; + /** + * Object type identifier + */ + object?: "text_completion"; + /** + * Unix timestamp of when the completion was created + */ + created?: number; + /** + * Model used for the completion + */ + model?: string; + /** + * List of completion choices + */ + choices?: { + /** + * Index of the choice in the list + */ + index: number; + /** + * The generated text completion + */ + text: string; + /** + * Reason why the model stopped generating + */ + finish_reason: string; + /** + * Stop reason (may be null) + */ + stop_reason?: string | null; + /** + * Log probabilities (if requested) + */ + logprobs?: {} | null; + /** + * Log probabilities for the prompt (if requested) + */ + prompt_logprobs?: {} | null; + }[]; + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number; + /** + * Total number of tokens in output + */ + completion_tokens?: number; + /** + * Total number of input and output tokens + */ + total_tokens?: number; + }; +} +interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_AsyncResponse { + /** + * The async request id that can be used to obtain the results. + */ + request_id?: string; +} +declare abstract class Base_Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It { + inputs: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Input; + postProcessedOutputs: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Output; +} +interface Ai_Cf_Pfnet_Plamo_Embedding_1B_Input { + /** + * Input text to embed. Can be a single string or a list of strings. + */ + text: string | string[]; +} +interface Ai_Cf_Pfnet_Plamo_Embedding_1B_Output { + /** + * Embedding vectors, where each vector is a list of floats. + */ + data: number[][]; + /** + * Shape of the embedding data as [number_of_embeddings, embedding_dimension]. + * + * @minItems 2 + * @maxItems 2 + */ + shape: [ + number, + number + ]; +} +declare abstract class Base_Ai_Cf_Pfnet_Plamo_Embedding_1B { + inputs: Ai_Cf_Pfnet_Plamo_Embedding_1B_Input; + postProcessedOutputs: Ai_Cf_Pfnet_Plamo_Embedding_1B_Output; +} +interface Ai_Cf_Deepgram_Flux_Input { + /** + * Encoding of the audio stream. Currently only supports raw signed little-endian 16-bit PCM. + */ + encoding: "linear16"; + /** + * Sample rate of the audio stream in Hz. + */ + sample_rate: string; + /** + * End-of-turn confidence required to fire an eager end-of-turn event. When set, enables EagerEndOfTurn and TurnResumed events. Valid Values 0.3 - 0.9. + */ + eager_eot_threshold?: string; + /** + * End-of-turn confidence required to finish a turn. Valid Values 0.5 - 0.9. + */ + eot_threshold?: string; + /** + * A turn will be finished when this much time has passed after speech, regardless of EOT confidence. + */ + eot_timeout_ms?: string; + /** + * Keyterm prompting can improve recognition of specialized terminology. Pass multiple keyterm query parameters to boost multiple keyterms. + */ + keyterm?: string; + /** + * Opts out requests from the Deepgram Model Improvement Program. Refer to Deepgram Docs for pricing impacts before setting this to true. https://dpgr.am/deepgram-mip + */ + mip_opt_out?: "true" | "false"; + /** + * Label your requests for the purpose of identification during usage reporting + */ + tag?: string; +} +/** + * Output will be returned as websocket messages. + */ +interface Ai_Cf_Deepgram_Flux_Output { + /** + * The unique identifier of the request (uuid) + */ + request_id?: string; + /** + * Starts at 0 and increments for each message the server sends to the client. + */ + sequence_id?: number; + /** + * The type of event being reported. + */ + event?: "Update" | "StartOfTurn" | "EagerEndOfTurn" | "TurnResumed" | "EndOfTurn"; + /** + * The index of the current turn + */ + turn_index?: number; + /** + * Start time in seconds of the audio range that was transcribed + */ + audio_window_start?: number; + /** + * End time in seconds of the audio range that was transcribed + */ + audio_window_end?: number; + /** + * Text that was said over the course of the current turn + */ + transcript?: string; + /** + * The words in the transcript + */ + words?: { + /** + * The individual punctuated, properly-cased word from the transcript + */ + word: string; + /** + * Confidence that this word was transcribed correctly + */ + confidence: number; + }[]; + /** + * Confidence that no more speech is coming in this turn + */ + end_of_turn_confidence?: number; +} +declare abstract class Base_Ai_Cf_Deepgram_Flux { + inputs: Ai_Cf_Deepgram_Flux_Input; + postProcessedOutputs: Ai_Cf_Deepgram_Flux_Output; +} +interface Ai_Cf_Deepgram_Aura_2_En_Input { + /** + * Speaker used to produce the audio. + */ + speaker?: "amalthea" | "andromeda" | "apollo" | "arcas" | "aries" | "asteria" | "athena" | "atlas" | "aurora" | "callista" | "cora" | "cordelia" | "delia" | "draco" | "electra" | "harmonia" | "helena" | "hera" | "hermes" | "hyperion" | "iris" | "janus" | "juno" | "jupiter" | "luna" | "mars" | "minerva" | "neptune" | "odysseus" | "ophelia" | "orion" | "orpheus" | "pandora" | "phoebe" | "pluto" | "saturn" | "thalia" | "theia" | "vesta" | "zeus"; + /** + * Encoding of the output audio. + */ + encoding?: "linear16" | "flac" | "mulaw" | "alaw" | "mp3" | "opus" | "aac"; + /** + * Container specifies the file format wrapper for the output audio. The available options depend on the encoding type.. + */ + container?: "none" | "wav" | "ogg"; + /** + * The text content to be converted to speech + */ + text: string; + /** + * Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable + */ + sample_rate?: number; + /** + * The bitrate of the audio in bits per second. Choose from predefined ranges or specific values based on the encoding type. + */ + bit_rate?: number; +} +/** + * The generated audio in MP3 format + */ +type Ai_Cf_Deepgram_Aura_2_En_Output = string; +declare abstract class Base_Ai_Cf_Deepgram_Aura_2_En { + inputs: Ai_Cf_Deepgram_Aura_2_En_Input; + postProcessedOutputs: Ai_Cf_Deepgram_Aura_2_En_Output; +} +interface Ai_Cf_Deepgram_Aura_2_Es_Input { + /** + * Speaker used to produce the audio. + */ + speaker?: "sirio" | "nestor" | "carina" | "celeste" | "alvaro" | "diana" | "aquila" | "selena" | "estrella" | "javier"; + /** + * Encoding of the output audio. + */ + encoding?: "linear16" | "flac" | "mulaw" | "alaw" | "mp3" | "opus" | "aac"; + /** + * Container specifies the file format wrapper for the output audio. The available options depend on the encoding type.. + */ + container?: "none" | "wav" | "ogg"; + /** + * The text content to be converted to speech + */ + text: string; + /** + * Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable + */ + sample_rate?: number; + /** + * The bitrate of the audio in bits per second. Choose from predefined ranges or specific values based on the encoding type. + */ + bit_rate?: number; +} +/** + * The generated audio in MP3 format + */ +type Ai_Cf_Deepgram_Aura_2_Es_Output = string; +declare abstract class Base_Ai_Cf_Deepgram_Aura_2_Es { + inputs: Ai_Cf_Deepgram_Aura_2_Es_Input; + postProcessedOutputs: Ai_Cf_Deepgram_Aura_2_Es_Output; +} +interface AiModels { + "@cf/huggingface/distilbert-sst-2-int8": BaseAiTextClassification; + "@cf/stabilityai/stable-diffusion-xl-base-1.0": BaseAiTextToImage; + "@cf/runwayml/stable-diffusion-v1-5-inpainting": BaseAiTextToImage; + "@cf/runwayml/stable-diffusion-v1-5-img2img": BaseAiTextToImage; + "@cf/lykon/dreamshaper-8-lcm": BaseAiTextToImage; + "@cf/bytedance/stable-diffusion-xl-lightning": BaseAiTextToImage; + "@cf/myshell-ai/melotts": BaseAiTextToSpeech; + "@cf/google/embeddinggemma-300m": BaseAiTextEmbeddings; + "@cf/microsoft/resnet-50": BaseAiImageClassification; + "@cf/meta/llama-2-7b-chat-int8": BaseAiTextGeneration; + "@cf/mistral/mistral-7b-instruct-v0.1": BaseAiTextGeneration; + "@cf/meta/llama-2-7b-chat-fp16": BaseAiTextGeneration; + "@hf/thebloke/llama-2-13b-chat-awq": BaseAiTextGeneration; + "@hf/thebloke/mistral-7b-instruct-v0.1-awq": BaseAiTextGeneration; + "@hf/thebloke/zephyr-7b-beta-awq": BaseAiTextGeneration; + "@hf/thebloke/openhermes-2.5-mistral-7b-awq": BaseAiTextGeneration; + "@hf/thebloke/neural-chat-7b-v3-1-awq": BaseAiTextGeneration; + "@hf/thebloke/llamaguard-7b-awq": BaseAiTextGeneration; + "@hf/thebloke/deepseek-coder-6.7b-base-awq": BaseAiTextGeneration; + "@hf/thebloke/deepseek-coder-6.7b-instruct-awq": BaseAiTextGeneration; + "@cf/deepseek-ai/deepseek-math-7b-instruct": BaseAiTextGeneration; + "@cf/defog/sqlcoder-7b-2": BaseAiTextGeneration; + "@cf/openchat/openchat-3.5-0106": BaseAiTextGeneration; + "@cf/tiiuae/falcon-7b-instruct": BaseAiTextGeneration; + "@cf/thebloke/discolm-german-7b-v1-awq": BaseAiTextGeneration; + "@cf/qwen/qwen1.5-0.5b-chat": BaseAiTextGeneration; + "@cf/qwen/qwen1.5-7b-chat-awq": BaseAiTextGeneration; + "@cf/qwen/qwen1.5-14b-chat-awq": BaseAiTextGeneration; + "@cf/tinyllama/tinyllama-1.1b-chat-v1.0": BaseAiTextGeneration; + "@cf/microsoft/phi-2": BaseAiTextGeneration; + "@cf/qwen/qwen1.5-1.8b-chat": BaseAiTextGeneration; + "@cf/mistral/mistral-7b-instruct-v0.2-lora": BaseAiTextGeneration; + "@hf/nousresearch/hermes-2-pro-mistral-7b": BaseAiTextGeneration; + "@hf/nexusflow/starling-lm-7b-beta": BaseAiTextGeneration; + "@hf/google/gemma-7b-it": BaseAiTextGeneration; + "@cf/meta-llama/llama-2-7b-chat-hf-lora": BaseAiTextGeneration; + "@cf/google/gemma-2b-it-lora": BaseAiTextGeneration; + "@cf/google/gemma-7b-it-lora": BaseAiTextGeneration; + "@hf/mistral/mistral-7b-instruct-v0.2": BaseAiTextGeneration; + "@cf/meta/llama-3-8b-instruct": BaseAiTextGeneration; + "@cf/fblgit/una-cybertron-7b-v2-bf16": BaseAiTextGeneration; + "@cf/meta/llama-3-8b-instruct-awq": BaseAiTextGeneration; + "@cf/meta/llama-3.1-8b-instruct-fp8": BaseAiTextGeneration; + "@cf/meta/llama-3.1-8b-instruct-awq": BaseAiTextGeneration; + "@cf/meta/llama-3.2-3b-instruct": BaseAiTextGeneration; + "@cf/meta/llama-3.2-1b-instruct": BaseAiTextGeneration; + "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b": BaseAiTextGeneration; + "@cf/ibm-granite/granite-4.0-h-micro": BaseAiTextGeneration; + "@cf/facebook/bart-large-cnn": BaseAiSummarization; + "@cf/llava-hf/llava-1.5-7b-hf": BaseAiImageToText; + "@cf/baai/bge-base-en-v1.5": Base_Ai_Cf_Baai_Bge_Base_En_V1_5; + "@cf/openai/whisper": Base_Ai_Cf_Openai_Whisper; + "@cf/meta/m2m100-1.2b": Base_Ai_Cf_Meta_M2M100_1_2B; + "@cf/baai/bge-small-en-v1.5": Base_Ai_Cf_Baai_Bge_Small_En_V1_5; + "@cf/baai/bge-large-en-v1.5": Base_Ai_Cf_Baai_Bge_Large_En_V1_5; + "@cf/unum/uform-gen2-qwen-500m": Base_Ai_Cf_Unum_Uform_Gen2_Qwen_500M; + "@cf/openai/whisper-tiny-en": Base_Ai_Cf_Openai_Whisper_Tiny_En; + "@cf/openai/whisper-large-v3-turbo": Base_Ai_Cf_Openai_Whisper_Large_V3_Turbo; + "@cf/baai/bge-m3": Base_Ai_Cf_Baai_Bge_M3; + "@cf/black-forest-labs/flux-1-schnell": Base_Ai_Cf_Black_Forest_Labs_Flux_1_Schnell; + "@cf/meta/llama-3.2-11b-vision-instruct": Base_Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct; + "@cf/meta/llama-3.3-70b-instruct-fp8-fast": Base_Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast; + "@cf/meta/llama-guard-3-8b": Base_Ai_Cf_Meta_Llama_Guard_3_8B; + "@cf/baai/bge-reranker-base": Base_Ai_Cf_Baai_Bge_Reranker_Base; + "@cf/qwen/qwen2.5-coder-32b-instruct": Base_Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct; + "@cf/qwen/qwq-32b": Base_Ai_Cf_Qwen_Qwq_32B; + "@cf/mistralai/mistral-small-3.1-24b-instruct": Base_Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct; + "@cf/google/gemma-3-12b-it": Base_Ai_Cf_Google_Gemma_3_12B_It; + "@cf/meta/llama-4-scout-17b-16e-instruct": Base_Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct; + "@cf/qwen/qwen3-30b-a3b-fp8": Base_Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8; + "@cf/deepgram/nova-3": Base_Ai_Cf_Deepgram_Nova_3; + "@cf/qwen/qwen3-embedding-0.6b": Base_Ai_Cf_Qwen_Qwen3_Embedding_0_6B; + "@cf/pipecat-ai/smart-turn-v2": Base_Ai_Cf_Pipecat_Ai_Smart_Turn_V2; + "@cf/openai/gpt-oss-120b": Base_Ai_Cf_Openai_Gpt_Oss_120B; + "@cf/openai/gpt-oss-20b": Base_Ai_Cf_Openai_Gpt_Oss_20B; + "@cf/leonardo/phoenix-1.0": Base_Ai_Cf_Leonardo_Phoenix_1_0; + "@cf/leonardo/lucid-origin": Base_Ai_Cf_Leonardo_Lucid_Origin; + "@cf/deepgram/aura-1": Base_Ai_Cf_Deepgram_Aura_1; + "@cf/ai4bharat/indictrans2-en-indic-1B": Base_Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B; + "@cf/aisingapore/gemma-sea-lion-v4-27b-it": Base_Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It; + "@cf/pfnet/plamo-embedding-1b": Base_Ai_Cf_Pfnet_Plamo_Embedding_1B; + "@cf/deepgram/flux": Base_Ai_Cf_Deepgram_Flux; + "@cf/deepgram/aura-2-en": Base_Ai_Cf_Deepgram_Aura_2_En; + "@cf/deepgram/aura-2-es": Base_Ai_Cf_Deepgram_Aura_2_Es; +} +type AiOptions = { + /** + * Send requests as an asynchronous batch job, only works for supported models + * https://developers.cloudflare.com/workers-ai/features/batch-api + */ + queueRequest?: boolean; + /** + * Establish websocket connections, only works for supported models + */ + websocket?: boolean; + /** + * Tag your requests to group and view them in Cloudflare dashboard. + * + * Rules: + * Tags must only contain letters, numbers, and the symbols: : - . / @ + * Each tag can have maximum 50 characters. + * Maximum 5 tags are allowed each request. + * Duplicate tags will removed. + */ + tags?: string[]; + gateway?: GatewayOptions; + returnRawResponse?: boolean; + prefix?: string; + extraHeaders?: object; +}; +type AiModelsSearchParams = { + author?: string; + hide_experimental?: boolean; + page?: number; + per_page?: number; + search?: string; + source?: number; + task?: string; +}; +type AiModelsSearchObject = { + id: string; + source: number; + name: string; + description: string; + task: { + id: string; + name: string; + description: string; + }; + tags: string[]; + properties: { + property_id: string; + value: string; + }[]; +}; +interface InferenceUpstreamError extends Error { +} +interface AiInternalError extends Error { +} +type AiModelListType = Record; +declare abstract class Ai { + aiGatewayLogId: string | null; + gateway(gatewayId: string): AiGateway; + autorag(autoragId: string): AutoRAG; + run(model: Name, inputs: InputOptions, options?: Options): Promise; + models(params?: AiModelsSearchParams): Promise; + toMarkdown(): ToMarkdownService; + toMarkdown(files: MarkdownDocument[], options?: ConversionRequestOptions): Promise; + toMarkdown(files: MarkdownDocument, options?: ConversionRequestOptions): Promise; +} +type GatewayRetries = { + maxAttempts?: 1 | 2 | 3 | 4 | 5; + retryDelayMs?: number; + backoff?: 'constant' | 'linear' | 'exponential'; +}; +type GatewayOptions = { + id: string; + cacheKey?: string; + cacheTtl?: number; + skipCache?: boolean; + metadata?: Record; + collectLog?: boolean; + eventId?: string; + requestTimeoutMs?: number; + retries?: GatewayRetries; +}; +type UniversalGatewayOptions = Exclude & { + /** + ** @deprecated + */ + id?: string; +}; +type AiGatewayPatchLog = { + score?: number | null; + feedback?: -1 | 1 | null; + metadata?: Record | null; +}; +type AiGatewayLog = { + id: string; + provider: string; + model: string; + model_type?: string; + path: string; + duration: number; + request_type?: string; + request_content_type?: string; + status_code: number; + response_content_type?: string; + success: boolean; + cached: boolean; + tokens_in?: number; + tokens_out?: number; + metadata?: Record; + step?: number; + cost?: number; + custom_cost?: boolean; + request_size: number; + request_head?: string; + request_head_complete: boolean; + response_size: number; + response_head?: string; + response_head_complete: boolean; + created_at: Date; +}; +type AIGatewayProviders = 'workers-ai' | 'anthropic' | 'aws-bedrock' | 'azure-openai' | 'google-vertex-ai' | 'huggingface' | 'openai' | 'perplexity-ai' | 'replicate' | 'groq' | 'cohere' | 'google-ai-studio' | 'mistral' | 'grok' | 'openrouter' | 'deepseek' | 'cerebras' | 'cartesia' | 'elevenlabs' | 'adobe-firefly'; +type AIGatewayHeaders = { + 'cf-aig-metadata': Record | string; + 'cf-aig-custom-cost': { + per_token_in?: number; + per_token_out?: number; + } | { + total_cost?: number; + } | string; + 'cf-aig-cache-ttl': number | string; + 'cf-aig-skip-cache': boolean | string; + 'cf-aig-cache-key': string; + 'cf-aig-event-id': string; + 'cf-aig-request-timeout': number | string; + 'cf-aig-max-attempts': number | string; + 'cf-aig-retry-delay': number | string; + 'cf-aig-backoff': string; + 'cf-aig-collect-log': boolean | string; + Authorization: string; + 'Content-Type': string; + [key: string]: string | number | boolean | object; +}; +type AIGatewayUniversalRequest = { + provider: AIGatewayProviders | string; // eslint-disable-line + endpoint: string; + headers: Partial; + query: unknown; +}; +interface AiGatewayInternalError extends Error { +} +interface AiGatewayLogNotFound extends Error { +} +declare abstract class AiGateway { + patchLog(logId: string, data: AiGatewayPatchLog): Promise; + getLog(logId: string): Promise; + run(data: AIGatewayUniversalRequest | AIGatewayUniversalRequest[], options?: { + gateway?: UniversalGatewayOptions; + extraHeaders?: object; + }): Promise; + getUrl(provider?: AIGatewayProviders | string): Promise; // eslint-disable-line +} +interface AutoRAGInternalError extends Error { +} +interface AutoRAGNotFoundError extends Error { +} +interface AutoRAGUnauthorizedError extends Error { +} +interface AutoRAGNameNotSetError extends Error { +} +type ComparisonFilter = { + key: string; + type: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte'; + value: string | number | boolean; +}; +type CompoundFilter = { + type: 'and' | 'or'; + filters: ComparisonFilter[]; +}; +type AutoRagSearchRequest = { + query: string; + filters?: CompoundFilter | ComparisonFilter; + max_num_results?: number; + ranking_options?: { + ranker?: string; + score_threshold?: number; + }; + reranking?: { + enabled?: boolean; + model?: string; + }; + rewrite_query?: boolean; +}; +type AutoRagAiSearchRequest = AutoRagSearchRequest & { + stream?: boolean; + system_prompt?: string; +}; +type AutoRagAiSearchRequestStreaming = Omit & { + stream: true; +}; +type AutoRagSearchResponse = { + object: 'vector_store.search_results.page'; + search_query: string; + data: { + file_id: string; + filename: string; + score: number; + attributes: Record; + content: { + type: 'text'; + text: string; + }[]; + }[]; + has_more: boolean; + next_page: string | null; +}; +type AutoRagListResponse = { + id: string; + enable: boolean; + type: string; + source: string; + vectorize_name: string; + paused: boolean; + status: string; +}[]; +type AutoRagAiSearchResponse = AutoRagSearchResponse & { + response: string; +}; +declare abstract class AutoRAG { + list(): Promise; + search(params: AutoRagSearchRequest): Promise; + aiSearch(params: AutoRagAiSearchRequestStreaming): Promise; + aiSearch(params: AutoRagAiSearchRequest): Promise; + aiSearch(params: AutoRagAiSearchRequest): Promise; +} +interface BasicImageTransformations { + /** + * Maximum width in image pixels. The value must be an integer. + */ + width?: number; + /** + * Maximum height in image pixels. The value must be an integer. + */ + height?: number; + /** + * Resizing mode as a string. It affects interpretation of width and height + * options: + * - scale-down: Similar to contain, but the image is never enlarged. If + * the image is larger than given width or height, it will be resized. + * Otherwise its original size will be kept. + * - contain: Resizes to maximum size that fits within the given width and + * height. If only a single dimension is given (e.g. only width), the + * image will be shrunk or enlarged to exactly match that dimension. + * Aspect ratio is always preserved. + * - cover: Resizes (shrinks or enlarges) to fill the entire area of width + * and height. If the image has an aspect ratio different from the ratio + * of width and height, it will be cropped to fit. + * - crop: The image will be shrunk and cropped to fit within the area + * specified by width and height. The image will not be enlarged. For images + * smaller than the given dimensions it's the same as scale-down. For + * images larger than the given dimensions, it's the same as cover. + * See also trim. + * - pad: Resizes to the maximum size that fits within the given width and + * height, and then fills the remaining area with a background color + * (white by default). Use of this mode is not recommended, as the same + * effect can be more efficiently achieved with the contain mode and the + * CSS object-fit: contain property. + * - squeeze: Stretches and deforms to the width and height given, even if it + * breaks aspect ratio + */ + fit?: "scale-down" | "contain" | "cover" | "crop" | "pad" | "squeeze"; + /** + * Image segmentation using artificial intelligence models. Sets pixels not + * within selected segment area to transparent e.g "foreground" sets every + * background pixel as transparent. + */ + segment?: "foreground"; + /** + * When cropping with fit: "cover", this defines the side or point that should + * be left uncropped. The value is either a string + * "left", "right", "top", "bottom", "auto", or "center" (the default), + * or an object {x, y} containing focal point coordinates in the original + * image expressed as fractions ranging from 0.0 (top or left) to 1.0 + * (bottom or right), 0.5 being the center. {fit: "cover", gravity: "top"} will + * crop bottom or left and right sides as necessary, but won’t crop anything + * from the top. {fit: "cover", gravity: {x:0.5, y:0.2}} will crop each side to + * preserve as much as possible around a point at 20% of the height of the + * source image. + */ + gravity?: 'face' | 'left' | 'right' | 'top' | 'bottom' | 'center' | 'auto' | 'entropy' | BasicImageTransformationsGravityCoordinates; + /** + * Background color to add underneath the image. Applies only to images with + * transparency (such as PNG). Accepts any CSS color (#RRGGBB, rgba(…), + * hsl(…), etc.) + */ + background?: string; + /** + * Number of degrees (90, 180, 270) to rotate the image by. width and height + * options refer to axes after rotation. + */ + rotate?: 0 | 90 | 180 | 270 | 360; +} +interface BasicImageTransformationsGravityCoordinates { + x?: number; + y?: number; + mode?: 'remainder' | 'box-center'; +} +/** + * In addition to the properties you can set in the RequestInit dict + * that you pass as an argument to the Request constructor, you can + * set certain properties of a `cf` object to control how Cloudflare + * features are applied to that new Request. + * + * Note: Currently, these properties cannot be tested in the + * playground. + */ +interface RequestInitCfProperties extends Record { + cacheEverything?: boolean; + /** + * A request's cache key is what determines if two requests are + * "the same" for caching purposes. If a request has the same cache key + * as some previous request, then we can serve the same cached response for + * both. (e.g. 'some-key') + * + * Only available for Enterprise customers. + */ + cacheKey?: string; + /** + * This allows you to append additional Cache-Tag response headers + * to the origin response without modifications to the origin server. + * This will allow for greater control over the Purge by Cache Tag feature + * utilizing changes only in the Workers process. + * + * Only available for Enterprise customers. + */ + cacheTags?: string[]; + /** + * Force response to be cached for a given number of seconds. (e.g. 300) + */ + cacheTtl?: number; + /** + * Force response to be cached for a given number of seconds based on the Origin status code. + * (e.g. { '200-299': 86400, '404': 1, '500-599': 0 }) + */ + cacheTtlByStatus?: Record; + scrapeShield?: boolean; + apps?: boolean; + image?: RequestInitCfPropertiesImage; + minify?: RequestInitCfPropertiesImageMinify; + mirage?: boolean; + polish?: "lossy" | "lossless" | "off"; + r2?: RequestInitCfPropertiesR2; + /** + * Redirects the request to an alternate origin server. You can use this, + * for example, to implement load balancing across several origins. + * (e.g.us-east.example.com) + * + * Note - For security reasons, the hostname set in resolveOverride must + * be proxied on the same Cloudflare zone of the incoming request. + * Otherwise, the setting is ignored. CNAME hosts are allowed, so to + * resolve to a host under a different domain or a DNS only domain first + * declare a CNAME record within your own zone’s DNS mapping to the + * external hostname, set proxy on Cloudflare, then set resolveOverride + * to point to that CNAME record. + */ + resolveOverride?: string; +} +interface RequestInitCfPropertiesImageDraw extends BasicImageTransformations { + /** + * Absolute URL of the image file to use for the drawing. It can be any of + * the supported file formats. For drawing of watermarks or non-rectangular + * overlays we recommend using PNG or WebP images. + */ + url: string; + /** + * Floating-point number between 0 (transparent) and 1 (opaque). + * For example, opacity: 0.5 makes overlay semitransparent. + */ + opacity?: number; + /** + * - If set to true, the overlay image will be tiled to cover the entire + * area. This is useful for stock-photo-like watermarks. + * - If set to "x", the overlay image will be tiled horizontally only + * (form a line). + * - If set to "y", the overlay image will be tiled vertically only + * (form a line). + */ + repeat?: true | "x" | "y"; + /** + * Position of the overlay image relative to a given edge. Each property is + * an offset in pixels. 0 aligns exactly to the edge. For example, left: 10 + * positions left side of the overlay 10 pixels from the left edge of the + * image it's drawn over. bottom: 0 aligns bottom of the overlay with bottom + * of the background image. + * + * Setting both left & right, or both top & bottom is an error. + * + * If no position is specified, the image will be centered. + */ + top?: number; + left?: number; + bottom?: number; + right?: number; +} +interface RequestInitCfPropertiesImage extends BasicImageTransformations { + /** + * Device Pixel Ratio. Default 1. Multiplier for width/height that makes it + * easier to specify higher-DPI sizes in . + */ + dpr?: number; + /** + * Allows you to trim your image. Takes dpr into account and is performed before + * resizing or rotation. + * + * It can be used as: + * - left, top, right, bottom - it will specify the number of pixels to cut + * off each side + * - width, height - the width/height you'd like to end up with - can be used + * in combination with the properties above + * - border - this will automatically trim the surroundings of an image based on + * it's color. It consists of three properties: + * - color: rgb or hex representation of the color you wish to trim (todo: verify the rgba bit) + * - tolerance: difference from color to treat as color + * - keep: the number of pixels of border to keep + */ + trim?: "border" | { + top?: number; + bottom?: number; + left?: number; + right?: number; + width?: number; + height?: number; + border?: boolean | { + color?: string; + tolerance?: number; + keep?: number; + }; + }; + /** + * Quality setting from 1-100 (useful values are in 60-90 range). Lower values + * make images look worse, but load faster. The default is 85. It applies only + * to JPEG and WebP images. It doesn’t have any effect on PNG. + */ + quality?: number | "low" | "medium-low" | "medium-high" | "high"; + /** + * Output format to generate. It can be: + * - avif: generate images in AVIF format. + * - webp: generate images in Google WebP format. Set quality to 100 to get + * the WebP-lossless format. + * - json: instead of generating an image, outputs information about the + * image, in JSON format. The JSON object will contain image size + * (before and after resizing), source image’s MIME type, file size, etc. + * - jpeg: generate images in JPEG format. + * - png: generate images in PNG format. + */ + format?: "avif" | "webp" | "json" | "jpeg" | "png" | "baseline-jpeg" | "png-force" | "svg"; + /** + * Whether to preserve animation frames from input files. Default is true. + * Setting it to false reduces animations to still images. This setting is + * recommended when enlarging images or processing arbitrary user content, + * because large GIF animations can weigh tens or even hundreds of megabytes. + * It is also useful to set anim:false when using format:"json" to get the + * response quicker without the number of frames. + */ + anim?: boolean; + /** + * What EXIF data should be preserved in the output image. Note that EXIF + * rotation and embedded color profiles are always applied ("baked in" into + * the image), and aren't affected by this option. Note that if the Polish + * feature is enabled, all metadata may have been removed already and this + * option may have no effect. + * - keep: Preserve most of EXIF metadata, including GPS location if there's + * any. + * - copyright: Only keep the copyright tag, and discard everything else. + * This is the default behavior for JPEG files. + * - none: Discard all invisible EXIF metadata. Currently WebP and PNG + * output formats always discard metadata. + */ + metadata?: "keep" | "copyright" | "none"; + /** + * Strength of sharpening filter to apply to the image. Floating-point + * number between 0 (no sharpening, default) and 10 (maximum). 1.0 is a + * recommended value for downscaled images. + */ + sharpen?: number; + /** + * Radius of a blur filter (approximate gaussian). Maximum supported radius + * is 250. + */ + blur?: number; + /** + * Overlays are drawn in the order they appear in the array (last array + * entry is the topmost layer). + */ + draw?: RequestInitCfPropertiesImageDraw[]; + /** + * Fetching image from authenticated origin. Setting this property will + * pass authentication headers (Authorization, Cookie, etc.) through to + * the origin. + */ + "origin-auth"?: "share-publicly"; + /** + * Adds a border around the image. The border is added after resizing. Border + * width takes dpr into account, and can be specified either using a single + * width property, or individually for each side. + */ + border?: { + color: string; + width: number; + } | { + color: string; + top: number; + right: number; + bottom: number; + left: number; + }; + /** + * Increase brightness by a factor. A value of 1.0 equals no change, a value + * of 0.5 equals half brightness, and a value of 2.0 equals twice as bright. + * 0 is ignored. + */ + brightness?: number; + /** + * Increase contrast by a factor. A value of 1.0 equals no change, a value of + * 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is + * ignored. + */ + contrast?: number; + /** + * Increase exposure by a factor. A value of 1.0 equals no change, a value of + * 0.5 darkens the image, and a value of 2.0 lightens the image. 0 is ignored. + */ + gamma?: number; + /** + * Increase contrast by a factor. A value of 1.0 equals no change, a value of + * 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is + * ignored. + */ + saturation?: number; + /** + * Flips the images horizontally, vertically, or both. Flipping is applied before + * rotation, so if you apply flip=h,rotate=90 then the image will be flipped + * horizontally, then rotated by 90 degrees. + */ + flip?: 'h' | 'v' | 'hv'; + /** + * Slightly reduces latency on a cache miss by selecting a + * quickest-to-compress file format, at a cost of increased file size and + * lower image quality. It will usually override the format option and choose + * JPEG over WebP or AVIF. We do not recommend using this option, except in + * unusual circumstances like resizing uncacheable dynamically-generated + * images. + */ + compression?: "fast"; +} +interface RequestInitCfPropertiesImageMinify { + javascript?: boolean; + css?: boolean; + html?: boolean; +} +interface RequestInitCfPropertiesR2 { + /** + * Colo id of bucket that an object is stored in + */ + bucketColoId?: number; +} +/** + * Request metadata provided by Cloudflare's edge. + */ +type IncomingRequestCfProperties = IncomingRequestCfPropertiesBase & IncomingRequestCfPropertiesBotManagementEnterprise & IncomingRequestCfPropertiesCloudflareForSaaSEnterprise & IncomingRequestCfPropertiesGeographicInformation & IncomingRequestCfPropertiesCloudflareAccessOrApiShield; +interface IncomingRequestCfPropertiesBase extends Record { + /** + * [ASN](https://www.iana.org/assignments/as-numbers/as-numbers.xhtml) of the incoming request. + * + * @example 395747 + */ + asn?: number; + /** + * The organization which owns the ASN of the incoming request. + * + * @example "Google Cloud" + */ + asOrganization?: string; + /** + * The original value of the `Accept-Encoding` header if Cloudflare modified it. + * + * @example "gzip, deflate, br" + */ + clientAcceptEncoding?: string; + /** + * The number of milliseconds it took for the request to reach your worker. + * + * @example 22 + */ + clientTcpRtt?: number; + /** + * The three-letter [IATA](https://en.wikipedia.org/wiki/IATA_airport_code) + * airport code of the data center that the request hit. + * + * @example "DFW" + */ + colo: string; + /** + * Represents the upstream's response to a + * [TCP `keepalive` message](https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html) + * from cloudflare. + * + * For workers with no upstream, this will always be `1`. + * + * @example 3 + */ + edgeRequestKeepAliveStatus: IncomingRequestCfPropertiesEdgeRequestKeepAliveStatus; + /** + * The HTTP Protocol the request used. + * + * @example "HTTP/2" + */ + httpProtocol: string; + /** + * The browser-requested prioritization information in the request object. + * + * If no information was set, defaults to the empty string `""` + * + * @example "weight=192;exclusive=0;group=3;group-weight=127" + * @default "" + */ + requestPriority: string; + /** + * The TLS version of the connection to Cloudflare. + * In requests served over plaintext (without TLS), this property is the empty string `""`. + * + * @example "TLSv1.3" + */ + tlsVersion: string; + /** + * The cipher for the connection to Cloudflare. + * In requests served over plaintext (without TLS), this property is the empty string `""`. + * + * @example "AEAD-AES128-GCM-SHA256" + */ + tlsCipher: string; + /** + * Metadata containing the [`HELLO`](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2) and [`FINISHED`](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9) messages from this request's TLS handshake. + * + * If the incoming request was served over plaintext (without TLS) this field is undefined. + */ + tlsExportedAuthenticator?: IncomingRequestCfPropertiesExportedAuthenticatorMetadata; +} +interface IncomingRequestCfPropertiesBotManagementBase { + /** + * Cloudflare’s [level of certainty](https://developers.cloudflare.com/bots/concepts/bot-score/) that a request comes from a bot, + * represented as an integer percentage between `1` (almost certainly a bot) and `99` (almost certainly human). + * + * @example 54 + */ + score: number; + /** + * A boolean value that is true if the request comes from a good bot, like Google or Bing. + * Most customers choose to allow this traffic. For more details, see [Traffic from known bots](https://developers.cloudflare.com/firewall/known-issues-and-faq/#how-does-firewall-rules-handle-traffic-from-known-bots). + */ + verifiedBot: boolean; + /** + * A boolean value that is true if the request originates from a + * Cloudflare-verified proxy service. + */ + corporateProxy: boolean; + /** + * A boolean value that's true if the request matches [file extensions](https://developers.cloudflare.com/bots/reference/static-resources/) for many types of static resources. + */ + staticResource: boolean; + /** + * List of IDs that correlate to the Bot Management heuristic detections made on a request (you can have multiple heuristic detections on the same request). + */ + detectionIds: number[]; +} +interface IncomingRequestCfPropertiesBotManagement { + /** + * Results of Cloudflare's Bot Management analysis + */ + botManagement: IncomingRequestCfPropertiesBotManagementBase; + /** + * Duplicate of `botManagement.score`. + * + * @deprecated + */ + clientTrustScore: number; +} +interface IncomingRequestCfPropertiesBotManagementEnterprise extends IncomingRequestCfPropertiesBotManagement { + /** + * Results of Cloudflare's Bot Management analysis + */ + botManagement: IncomingRequestCfPropertiesBotManagementBase & { + /** + * A [JA3 Fingerprint](https://developers.cloudflare.com/bots/concepts/ja3-fingerprint/) to help profile specific SSL/TLS clients + * across different destination IPs, Ports, and X509 certificates. + */ + ja3Hash: string; + }; +} +interface IncomingRequestCfPropertiesCloudflareForSaaSEnterprise { + /** + * Custom metadata set per-host in [Cloudflare for SaaS](https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/). + * + * This field is only present if you have Cloudflare for SaaS enabled on your account + * and you have followed the [required steps to enable it]((https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/domain-support/custom-metadata/)). + */ + hostMetadata?: HostMetadata; +} +interface IncomingRequestCfPropertiesCloudflareAccessOrApiShield { + /** + * Information about the client certificate presented to Cloudflare. + * + * This is populated when the incoming request is served over TLS using + * either Cloudflare Access or API Shield (mTLS) + * and the presented SSL certificate has a valid + * [Certificate Serial Number](https://ldapwiki.com/wiki/Certificate%20Serial%20Number) + * (i.e., not `null` or `""`). + * + * Otherwise, a set of placeholder values are used. + * + * The property `certPresented` will be set to `"1"` when + * the object is populated (i.e. the above conditions were met). + */ + tlsClientAuth: IncomingRequestCfPropertiesTLSClientAuth | IncomingRequestCfPropertiesTLSClientAuthPlaceholder; +} +/** + * Metadata about the request's TLS handshake + */ +interface IncomingRequestCfPropertiesExportedAuthenticatorMetadata { + /** + * The client's [`HELLO` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2), encoded in hexadecimal + * + * @example "44372ba35fa1270921d318f34c12f155dc87b682cf36a790cfaa3ba8737a1b5d" + */ + clientHandshake: string; + /** + * The server's [`HELLO` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2), encoded in hexadecimal + * + * @example "44372ba35fa1270921d318f34c12f155dc87b682cf36a790cfaa3ba8737a1b5d" + */ + serverHandshake: string; + /** + * The client's [`FINISHED` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9), encoded in hexadecimal + * + * @example "084ee802fe1348f688220e2a6040a05b2199a761f33cf753abb1b006792d3f8b" + */ + clientFinished: string; + /** + * The server's [`FINISHED` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9), encoded in hexadecimal + * + * @example "084ee802fe1348f688220e2a6040a05b2199a761f33cf753abb1b006792d3f8b" + */ + serverFinished: string; +} +/** + * Geographic data about the request's origin. + */ +interface IncomingRequestCfPropertiesGeographicInformation { + /** + * The [ISO 3166-1 Alpha 2](https://www.iso.org/iso-3166-country-codes.html) country code the request originated from. + * + * If your worker is [configured to accept TOR connections](https://support.cloudflare.com/hc/en-us/articles/203306930-Understanding-Cloudflare-Tor-support-and-Onion-Routing), this may also be `"T1"`, indicating a request that originated over TOR. + * + * If Cloudflare is unable to determine where the request originated this property is omitted. + * + * The country code `"T1"` is used for requests originating on TOR. + * + * @example "GB" + */ + country?: Iso3166Alpha2Code | "T1"; + /** + * If present, this property indicates that the request originated in the EU + * + * @example "1" + */ + isEUCountry?: "1"; + /** + * A two-letter code indicating the continent the request originated from. + * + * @example "AN" + */ + continent?: ContinentCode; + /** + * The city the request originated from + * + * @example "Austin" + */ + city?: string; + /** + * Postal code of the incoming request + * + * @example "78701" + */ + postalCode?: string; + /** + * Latitude of the incoming request + * + * @example "30.27130" + */ + latitude?: string; + /** + * Longitude of the incoming request + * + * @example "-97.74260" + */ + longitude?: string; + /** + * Timezone of the incoming request + * + * @example "America/Chicago" + */ + timezone?: string; + /** + * If known, the ISO 3166-2 name for the first level region associated with + * the IP address of the incoming request + * + * @example "Texas" + */ + region?: string; + /** + * If known, the ISO 3166-2 code for the first-level region associated with + * the IP address of the incoming request + * + * @example "TX" + */ + regionCode?: string; + /** + * Metro code (DMA) of the incoming request + * + * @example "635" + */ + metroCode?: string; +} +/** Data about the incoming request's TLS certificate */ +interface IncomingRequestCfPropertiesTLSClientAuth { + /** Always `"1"`, indicating that the certificate was presented */ + certPresented: "1"; + /** + * Result of certificate verification. + * + * @example "FAILED:self signed certificate" + */ + certVerified: Exclude; + /** The presented certificate's revokation status. + * + * - A value of `"1"` indicates the certificate has been revoked + * - A value of `"0"` indicates the certificate has not been revoked + */ + certRevoked: "1" | "0"; + /** + * The certificate issuer's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) + * + * @example "CN=cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certIssuerDN: string; + /** + * The certificate subject's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) + * + * @example "CN=*.cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certSubjectDN: string; + /** + * The certificate issuer's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) ([RFC 2253](https://www.rfc-editor.org/rfc/rfc2253.html) formatted) + * + * @example "CN=cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certIssuerDNRFC2253: string; + /** + * The certificate subject's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) ([RFC 2253](https://www.rfc-editor.org/rfc/rfc2253.html) formatted) + * + * @example "CN=*.cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certSubjectDNRFC2253: string; + /** The certificate issuer's distinguished name (legacy policies) */ + certIssuerDNLegacy: string; + /** The certificate subject's distinguished name (legacy policies) */ + certSubjectDNLegacy: string; + /** + * The certificate's serial number + * + * @example "00936EACBE07F201DF" + */ + certSerial: string; + /** + * The certificate issuer's serial number + * + * @example "2489002934BDFEA34" + */ + certIssuerSerial: string; + /** + * The certificate's Subject Key Identifier + * + * @example "BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4" + */ + certSKI: string; + /** + * The certificate issuer's Subject Key Identifier + * + * @example "BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4" + */ + certIssuerSKI: string; + /** + * The certificate's SHA-1 fingerprint + * + * @example "6b9109f323999e52259cda7373ff0b4d26bd232e" + */ + certFingerprintSHA1: string; + /** + * The certificate's SHA-256 fingerprint + * + * @example "acf77cf37b4156a2708e34c4eb755f9b5dbbe5ebb55adfec8f11493438d19e6ad3f157f81fa3b98278453d5652b0c1fd1d71e5695ae4d709803a4d3f39de9dea" + */ + certFingerprintSHA256: string; + /** + * The effective starting date of the certificate + * + * @example "Dec 22 19:39:00 2018 GMT" + */ + certNotBefore: string; + /** + * The effective expiration date of the certificate + * + * @example "Dec 22 19:39:00 2018 GMT" + */ + certNotAfter: string; +} +/** Placeholder values for TLS Client Authorization */ +interface IncomingRequestCfPropertiesTLSClientAuthPlaceholder { + certPresented: "0"; + certVerified: "NONE"; + certRevoked: "0"; + certIssuerDN: ""; + certSubjectDN: ""; + certIssuerDNRFC2253: ""; + certSubjectDNRFC2253: ""; + certIssuerDNLegacy: ""; + certSubjectDNLegacy: ""; + certSerial: ""; + certIssuerSerial: ""; + certSKI: ""; + certIssuerSKI: ""; + certFingerprintSHA1: ""; + certFingerprintSHA256: ""; + certNotBefore: ""; + certNotAfter: ""; +} +/** Possible outcomes of TLS verification */ +declare type CertVerificationStatus = +/** Authentication succeeded */ +"SUCCESS" +/** No certificate was presented */ + | "NONE" +/** Failed because the certificate was self-signed */ + | "FAILED:self signed certificate" +/** Failed because the certificate failed a trust chain check */ + | "FAILED:unable to verify the first certificate" +/** Failed because the certificate not yet valid */ + | "FAILED:certificate is not yet valid" +/** Failed because the certificate is expired */ + | "FAILED:certificate has expired" +/** Failed for another unspecified reason */ + | "FAILED"; +/** + * An upstream endpoint's response to a TCP `keepalive` message from Cloudflare. + */ +declare type IncomingRequestCfPropertiesEdgeRequestKeepAliveStatus = 0 /** Unknown */ | 1 /** no keepalives (not found) */ | 2 /** no connection re-use, opening keepalive connection failed */ | 3 /** no connection re-use, keepalive accepted and saved */ | 4 /** connection re-use, refused by the origin server (`TCP FIN`) */ | 5; /** connection re-use, accepted by the origin server */ +/** ISO 3166-1 Alpha-2 codes */ +declare type Iso3166Alpha2Code = "AD" | "AE" | "AF" | "AG" | "AI" | "AL" | "AM" | "AO" | "AQ" | "AR" | "AS" | "AT" | "AU" | "AW" | "AX" | "AZ" | "BA" | "BB" | "BD" | "BE" | "BF" | "BG" | "BH" | "BI" | "BJ" | "BL" | "BM" | "BN" | "BO" | "BQ" | "BR" | "BS" | "BT" | "BV" | "BW" | "BY" | "BZ" | "CA" | "CC" | "CD" | "CF" | "CG" | "CH" | "CI" | "CK" | "CL" | "CM" | "CN" | "CO" | "CR" | "CU" | "CV" | "CW" | "CX" | "CY" | "CZ" | "DE" | "DJ" | "DK" | "DM" | "DO" | "DZ" | "EC" | "EE" | "EG" | "EH" | "ER" | "ES" | "ET" | "FI" | "FJ" | "FK" | "FM" | "FO" | "FR" | "GA" | "GB" | "GD" | "GE" | "GF" | "GG" | "GH" | "GI" | "GL" | "GM" | "GN" | "GP" | "GQ" | "GR" | "GS" | "GT" | "GU" | "GW" | "GY" | "HK" | "HM" | "HN" | "HR" | "HT" | "HU" | "ID" | "IE" | "IL" | "IM" | "IN" | "IO" | "IQ" | "IR" | "IS" | "IT" | "JE" | "JM" | "JO" | "JP" | "KE" | "KG" | "KH" | "KI" | "KM" | "KN" | "KP" | "KR" | "KW" | "KY" | "KZ" | "LA" | "LB" | "LC" | "LI" | "LK" | "LR" | "LS" | "LT" | "LU" | "LV" | "LY" | "MA" | "MC" | "MD" | "ME" | "MF" | "MG" | "MH" | "MK" | "ML" | "MM" | "MN" | "MO" | "MP" | "MQ" | "MR" | "MS" | "MT" | "MU" | "MV" | "MW" | "MX" | "MY" | "MZ" | "NA" | "NC" | "NE" | "NF" | "NG" | "NI" | "NL" | "NO" | "NP" | "NR" | "NU" | "NZ" | "OM" | "PA" | "PE" | "PF" | "PG" | "PH" | "PK" | "PL" | "PM" | "PN" | "PR" | "PS" | "PT" | "PW" | "PY" | "QA" | "RE" | "RO" | "RS" | "RU" | "RW" | "SA" | "SB" | "SC" | "SD" | "SE" | "SG" | "SH" | "SI" | "SJ" | "SK" | "SL" | "SM" | "SN" | "SO" | "SR" | "SS" | "ST" | "SV" | "SX" | "SY" | "SZ" | "TC" | "TD" | "TF" | "TG" | "TH" | "TJ" | "TK" | "TL" | "TM" | "TN" | "TO" | "TR" | "TT" | "TV" | "TW" | "TZ" | "UA" | "UG" | "UM" | "US" | "UY" | "UZ" | "VA" | "VC" | "VE" | "VG" | "VI" | "VN" | "VU" | "WF" | "WS" | "YE" | "YT" | "ZA" | "ZM" | "ZW"; +/** The 2-letter continent codes Cloudflare uses */ +declare type ContinentCode = "AF" | "AN" | "AS" | "EU" | "NA" | "OC" | "SA"; +type CfProperties = IncomingRequestCfProperties | RequestInitCfProperties; +interface D1Meta { + duration: number; + size_after: number; + rows_read: number; + rows_written: number; + last_row_id: number; + changed_db: boolean; + changes: number; + /** + * The region of the database instance that executed the query. + */ + served_by_region?: string; + /** + * True if-and-only-if the database instance that executed the query was the primary. + */ + served_by_primary?: boolean; + timings?: { + /** + * The duration of the SQL query execution by the database instance. It doesn't include any network time. + */ + sql_duration_ms: number; + }; + /** + * Number of total attempts to execute the query, due to automatic retries. + * Note: All other fields in the response like `timings` only apply to the last attempt. + */ + total_attempts?: number; +} +interface D1Response { + success: true; + meta: D1Meta & Record; + error?: never; +} +type D1Result = D1Response & { + results: T[]; +}; +interface D1ExecResult { + count: number; + duration: number; +} +type D1SessionConstraint = +// Indicates that the first query should go to the primary, and the rest queries +// using the same D1DatabaseSession will go to any replica that is consistent with +// the bookmark maintained by the session (returned by the first query). +'first-primary' +// Indicates that the first query can go anywhere (primary or replica), and the rest queries +// using the same D1DatabaseSession will go to any replica that is consistent with +// the bookmark maintained by the session (returned by the first query). + | 'first-unconstrained'; +type D1SessionBookmark = string; +declare abstract class D1Database { + prepare(query: string): D1PreparedStatement; + batch(statements: D1PreparedStatement[]): Promise[]>; + exec(query: string): Promise; + /** + * Creates a new D1 Session anchored at the given constraint or the bookmark. + * All queries executed using the created session will have sequential consistency, + * meaning that all writes done through the session will be visible in subsequent reads. + * + * @param constraintOrBookmark Either the session constraint or the explicit bookmark to anchor the created session. + */ + withSession(constraintOrBookmark?: D1SessionBookmark | D1SessionConstraint): D1DatabaseSession; + /** + * @deprecated dump() will be removed soon, only applies to deprecated alpha v1 databases. + */ + dump(): Promise; +} +declare abstract class D1DatabaseSession { + prepare(query: string): D1PreparedStatement; + batch(statements: D1PreparedStatement[]): Promise[]>; + /** + * @returns The latest session bookmark across all executed queries on the session. + * If no query has been executed yet, `null` is returned. + */ + getBookmark(): D1SessionBookmark | null; +} +declare abstract class D1PreparedStatement { + bind(...values: unknown[]): D1PreparedStatement; + first(colName: string): Promise; + first>(): Promise; + run>(): Promise>; + all>(): Promise>; + raw(options: { + columnNames: true; + }): Promise<[ + string[], + ...T[] + ]>; + raw(options?: { + columnNames?: false; + }): Promise; +} +// `Disposable` was added to TypeScript's standard lib types in version 5.2. +// To support older TypeScript versions, define an empty `Disposable` interface. +// Users won't be able to use `using`/`Symbol.dispose` without upgrading to 5.2, +// but this will ensure type checking on older versions still passes. +// TypeScript's interface merging will ensure our empty interface is effectively +// ignored when `Disposable` is included in the standard lib. +interface Disposable { +} +/** + * An email message that can be sent from a Worker. + */ +interface EmailMessage { + /** + * Envelope From attribute of the email message. + */ + readonly from: string; + /** + * Envelope To attribute of the email message. + */ + readonly to: string; +} +/** + * An email message that is sent to a consumer Worker and can be rejected/forwarded. + */ +interface ForwardableEmailMessage extends EmailMessage { + /** + * Stream of the email message content. + */ + readonly raw: ReadableStream; + /** + * An [Headers object](https://developer.mozilla.org/en-US/docs/Web/API/Headers). + */ + readonly headers: Headers; + /** + * Size of the email message content. + */ + readonly rawSize: number; + /** + * Reject this email message by returning a permanent SMTP error back to the connecting client including the given reason. + * @param reason The reject reason. + * @returns void + */ + setReject(reason: string): void; + /** + * Forward this email message to a verified destination address of the account. + * @param rcptTo Verified destination address. + * @param headers A [Headers object](https://developer.mozilla.org/en-US/docs/Web/API/Headers). + * @returns A promise that resolves when the email message is forwarded. + */ + forward(rcptTo: string, headers?: Headers): Promise; + /** + * Reply to the sender of this email message with a new EmailMessage object. + * @param message The reply message. + * @returns A promise that resolves when the email message is replied. + */ + reply(message: EmailMessage): Promise; +} +/** + * A binding that allows a Worker to send email messages. + */ +interface SendEmail { + send(message: EmailMessage): Promise; +} +declare abstract class EmailEvent extends ExtendableEvent { + readonly message: ForwardableEmailMessage; +} +declare type EmailExportedHandler = (message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext) => void | Promise; +declare module "cloudflare:email" { + let _EmailMessage: { + prototype: EmailMessage; + new (from: string, to: string, raw: ReadableStream | string): EmailMessage; + }; + export { _EmailMessage as EmailMessage }; +} +/** + * Hello World binding to serve as an explanatory example. DO NOT USE + */ +interface HelloWorldBinding { + /** + * Retrieve the current stored value + */ + get(): Promise<{ + value: string; + ms?: number; + }>; + /** + * Set a new stored value + */ + set(value: string): Promise; +} +interface Hyperdrive { + /** + * Connect directly to Hyperdrive as if it's your database, returning a TCP socket. + * + * Calling this method returns an identical socket to if you call + * `connect("host:port")` using the `host` and `port` fields from this object. + * Pick whichever approach works better with your preferred DB client library. + * + * Note that this socket is not yet authenticated -- it's expected that your + * code (or preferably, the client library of your choice) will authenticate + * using the information in this class's readonly fields. + */ + connect(): Socket; + /** + * A valid DB connection string that can be passed straight into the typical + * client library/driver/ORM. This will typically be the easiest way to use + * Hyperdrive. + */ + readonly connectionString: string; + /* + * A randomly generated hostname that is only valid within the context of the + * currently running Worker which, when passed into `connect()` function from + * the "cloudflare:sockets" module, will connect to the Hyperdrive instance + * for your database. + */ + readonly host: string; + /* + * The port that must be paired the the host field when connecting. + */ + readonly port: number; + /* + * The username to use when authenticating to your database via Hyperdrive. + * Unlike the host and password, this will be the same every time + */ + readonly user: string; + /* + * The randomly generated password to use when authenticating to your + * database via Hyperdrive. Like the host field, this password is only valid + * within the context of the currently running Worker instance from which + * it's read. + */ + readonly password: string; + /* + * The name of the database to connect to. + */ + readonly database: string; +} +// Copyright (c) 2024 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 +type ImageInfoResponse = { + format: 'image/svg+xml'; +} | { + format: string; + fileSize: number; + width: number; + height: number; +}; +type ImageTransform = { + width?: number; + height?: number; + background?: string; + blur?: number; + border?: { + color?: string; + width?: number; + } | { + top?: number; + bottom?: number; + left?: number; + right?: number; + }; + brightness?: number; + contrast?: number; + fit?: 'scale-down' | 'contain' | 'pad' | 'squeeze' | 'cover' | 'crop'; + flip?: 'h' | 'v' | 'hv'; + gamma?: number; + segment?: 'foreground'; + gravity?: 'face' | 'left' | 'right' | 'top' | 'bottom' | 'center' | 'auto' | 'entropy' | { + x?: number; + y?: number; + mode: 'remainder' | 'box-center'; + }; + rotate?: 0 | 90 | 180 | 270; + saturation?: number; + sharpen?: number; + trim?: 'border' | { + top?: number; + bottom?: number; + left?: number; + right?: number; + width?: number; + height?: number; + border?: boolean | { + color?: string; + tolerance?: number; + keep?: number; + }; + }; +}; +type ImageDrawOptions = { + opacity?: number; + repeat?: boolean | string; + top?: number; + left?: number; + bottom?: number; + right?: number; +}; +type ImageInputOptions = { + encoding?: 'base64'; +}; +type ImageOutputOptions = { + format: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp' | 'image/avif' | 'rgb' | 'rgba'; + quality?: number; + background?: string; + anim?: boolean; +}; +interface ImagesBinding { + /** + * Get image metadata (type, width and height) + * @throws {@link ImagesError} with code 9412 if input is not an image + * @param stream The image bytes + */ + info(stream: ReadableStream, options?: ImageInputOptions): Promise; + /** + * Begin applying a series of transformations to an image + * @param stream The image bytes + * @returns A transform handle + */ + input(stream: ReadableStream, options?: ImageInputOptions): ImageTransformer; +} +interface ImageTransformer { + /** + * Apply transform next, returning a transform handle. + * You can then apply more transformations, draw, or retrieve the output. + * @param transform + */ + transform(transform: ImageTransform): ImageTransformer; + /** + * Draw an image on this transformer, returning a transform handle. + * You can then apply more transformations, draw, or retrieve the output. + * @param image The image (or transformer that will give the image) to draw + * @param options The options configuring how to draw the image + */ + draw(image: ReadableStream | ImageTransformer, options?: ImageDrawOptions): ImageTransformer; + /** + * Retrieve the image that results from applying the transforms to the + * provided input + * @param options Options that apply to the output e.g. output format + */ + output(options: ImageOutputOptions): Promise; +} +type ImageTransformationOutputOptions = { + encoding?: 'base64'; +}; +interface ImageTransformationResult { + /** + * The image as a response, ready to store in cache or return to users + */ + response(): Response; + /** + * The content type of the returned image + */ + contentType(): string; + /** + * The bytes of the response + */ + image(options?: ImageTransformationOutputOptions): ReadableStream; +} +interface ImagesError extends Error { + readonly code: number; + readonly message: string; + readonly stack?: string; +} +/** + * Media binding for transforming media streams. + * Provides the entry point for media transformation operations. + */ +interface MediaBinding { + /** + * Creates a media transformer from an input stream. + * @param media - The input media bytes + * @returns A MediaTransformer instance for applying transformations + */ + input(media: ReadableStream): MediaTransformer; +} +/** + * Media transformer for applying transformation operations to media content. + * Handles sizing, fitting, and other input transformation parameters. + */ +interface MediaTransformer { + /** + * Applies transformation options to the media content. + * @param transform - Configuration for how the media should be transformed + * @returns A generator for producing the transformed media output + */ + transform(transform: MediaTransformationInputOptions): MediaTransformationGenerator; +} +/** + * Generator for producing media transformation results. + * Configures the output format and parameters for the transformed media. + */ +interface MediaTransformationGenerator { + /** + * Generates the final media output with specified options. + * @param output - Configuration for the output format and parameters + * @returns The final transformation result containing the transformed media + */ + output(output: MediaTransformationOutputOptions): MediaTransformationResult; +} +/** + * Result of a media transformation operation. + * Provides multiple ways to access the transformed media content. + */ +interface MediaTransformationResult { + /** + * Returns the transformed media as a readable stream of bytes. + * @returns A stream containing the transformed media data + */ + media(): ReadableStream; + /** + * Returns the transformed media as an HTTP response object. + * @returns The transformed media as a Response, ready to store in cache or return to users + */ + response(): Response; + /** + * Returns the MIME type of the transformed media. + * @returns The content type string (e.g., 'image/jpeg', 'video/mp4') + */ + contentType(): string; +} +/** + * Configuration options for transforming media input. + * Controls how the media should be resized and fitted. + */ +type MediaTransformationInputOptions = { + /** How the media should be resized to fit the specified dimensions */ + fit?: 'contain' | 'cover' | 'scale-down'; + /** Target width in pixels */ + width?: number; + /** Target height in pixels */ + height?: number; +}; +/** + * Configuration options for Media Transformations output. + * Controls the format, timing, and type of the generated output. + */ +type MediaTransformationOutputOptions = { + /** + * Output mode determining the type of media to generate + */ + mode?: 'video' | 'spritesheet' | 'frame' | 'audio'; + /** Whether to include audio in the output */ + audio?: boolean; + /** + * Starting timestamp for frame extraction or start time for clips. (e.g. '2s'). + */ + time?: string; + /** + * Duration for video clips, audio extraction, and spritesheet generation (e.g. '5s'). + */ + duration?: string; + /** + * Number of frames in the spritesheet. + */ + imageCount?: number; + /** + * Output format for the generated media. + */ + format?: 'jpg' | 'png' | 'm4a'; +}; +/** + * Error object for media transformation operations. + * Extends the standard Error interface with additional media-specific information. + */ +interface MediaError extends Error { + readonly code: number; + readonly message: string; + readonly stack?: string; +} +declare module 'cloudflare:node' { + interface NodeStyleServer { + listen(...args: unknown[]): this; + address(): { + port?: number | null | undefined; + }; + } + export function httpServerHandler(port: number): ExportedHandler; + export function httpServerHandler(options: { + port: number; + }): ExportedHandler; + export function httpServerHandler(server: NodeStyleServer): ExportedHandler; +} +type Params

= Record; +type EventContext = { + request: Request>; + functionPath: string; + waitUntil: (promise: Promise) => void; + passThroughOnException: () => void; + next: (input?: Request | string, init?: RequestInit) => Promise; + env: Env & { + ASSETS: { + fetch: typeof fetch; + }; + }; + params: Params

; + data: Data; +}; +type PagesFunction = Record> = (context: EventContext) => Response | Promise; +type EventPluginContext = { + request: Request>; + functionPath: string; + waitUntil: (promise: Promise) => void; + passThroughOnException: () => void; + next: (input?: Request | string, init?: RequestInit) => Promise; + env: Env & { + ASSETS: { + fetch: typeof fetch; + }; + }; + params: Params

; + data: Data; + pluginArgs: PluginArgs; +}; +type PagesPluginFunction = Record, PluginArgs = unknown> = (context: EventPluginContext) => Response | Promise; +declare module "assets:*" { + export const onRequest: PagesFunction; +} +// Copyright (c) 2022-2023 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 +declare module "cloudflare:pipelines" { + export abstract class PipelineTransformationEntrypoint { + protected env: Env; + protected ctx: ExecutionContext; + constructor(ctx: ExecutionContext, env: Env); + /** + * run receives an array of PipelineRecord which can be + * transformed and returned to the pipeline + * @param records Incoming records from the pipeline to be transformed + * @param metadata Information about the specific pipeline calling the transformation entrypoint + * @returns A promise containing the transformed PipelineRecord array + */ + public run(records: I[], metadata: PipelineBatchMetadata): Promise; + } + export type PipelineRecord = Record; + export type PipelineBatchMetadata = { + pipelineId: string; + pipelineName: string; + }; + export interface Pipeline { + /** + * The Pipeline interface represents the type of a binding to a Pipeline + * + * @param records The records to send to the pipeline + */ + send(records: T[]): Promise; + } +} +// PubSubMessage represents an incoming PubSub message. +// The message includes metadata about the broker, the client, and the payload +// itself. +// https://developers.cloudflare.com/pub-sub/ +interface PubSubMessage { + // Message ID + readonly mid: number; + // MQTT broker FQDN in the form mqtts://BROKER.NAMESPACE.cloudflarepubsub.com:PORT + readonly broker: string; + // The MQTT topic the message was sent on. + readonly topic: string; + // The client ID of the client that published this message. + readonly clientId: string; + // The unique identifier (JWT ID) used by the client to authenticate, if token + // auth was used. + readonly jti?: string; + // A Unix timestamp (seconds from Jan 1, 1970), set when the Pub/Sub Broker + // received the message from the client. + readonly receivedAt: number; + // An (optional) string with the MIME type of the payload, if set by the + // client. + readonly contentType: string; + // Set to 1 when the payload is a UTF-8 string + // https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901063 + readonly payloadFormatIndicator: number; + // Pub/Sub (MQTT) payloads can be UTF-8 strings, or byte arrays. + // You can use payloadFormatIndicator to inspect this before decoding. + payload: string | Uint8Array; +} +// JsonWebKey extended by kid parameter +interface JsonWebKeyWithKid extends JsonWebKey { + // Key Identifier of the JWK + readonly kid: string; +} +interface RateLimitOptions { + key: string; +} +interface RateLimitOutcome { + success: boolean; +} +interface RateLimit { + /** + * Rate limit a request based on the provided options. + * @see https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/ + * @returns A promise that resolves with the outcome of the rate limit. + */ + limit(options: RateLimitOptions): Promise; +} +// Namespace for RPC utility types. Unfortunately, we can't use a `module` here as these types need +// to referenced by `Fetcher`. This is included in the "importable" version of the types which +// strips all `module` blocks. +declare namespace Rpc { + // Branded types for identifying `WorkerEntrypoint`/`DurableObject`/`Target`s. + // TypeScript uses *structural* typing meaning anything with the same shape as type `T` is a `T`. + // For the classes exported by `cloudflare:workers` we want *nominal* typing (i.e. we only want to + // accept `WorkerEntrypoint` from `cloudflare:workers`, not any other class with the same shape) + export const __RPC_STUB_BRAND: '__RPC_STUB_BRAND'; + export const __RPC_TARGET_BRAND: '__RPC_TARGET_BRAND'; + export const __WORKER_ENTRYPOINT_BRAND: '__WORKER_ENTRYPOINT_BRAND'; + export const __DURABLE_OBJECT_BRAND: '__DURABLE_OBJECT_BRAND'; + export const __WORKFLOW_ENTRYPOINT_BRAND: '__WORKFLOW_ENTRYPOINT_BRAND'; + export interface RpcTargetBranded { + [__RPC_TARGET_BRAND]: never; + } + export interface WorkerEntrypointBranded { + [__WORKER_ENTRYPOINT_BRAND]: never; + } + export interface DurableObjectBranded { + [__DURABLE_OBJECT_BRAND]: never; + } + export interface WorkflowEntrypointBranded { + [__WORKFLOW_ENTRYPOINT_BRAND]: never; + } + export type EntrypointBranded = WorkerEntrypointBranded | DurableObjectBranded | WorkflowEntrypointBranded; + // Types that can be used through `Stub`s + export type Stubable = RpcTargetBranded | ((...args: any[]) => any); + // Types that can be passed over RPC + // The reason for using a generic type here is to build a serializable subset of structured + // cloneable composite types. This allows types defined with the "interface" keyword to pass the + // serializable check as well. Otherwise, only types defined with the "type" keyword would pass. + type Serializable = + // Structured cloneables + BaseType + // Structured cloneable composites + | Map ? Serializable : never, T extends Map ? Serializable : never> | Set ? Serializable : never> | ReadonlyArray ? Serializable : never> | { + [K in keyof T]: K extends number | string ? Serializable : never; + } + // Special types + | Stub + // Serialized as stubs, see `Stubify` + | Stubable; + // Base type for all RPC stubs, including common memory management methods. + // `T` is used as a marker type for unwrapping `Stub`s later. + interface StubBase extends Disposable { + [__RPC_STUB_BRAND]: T; + dup(): this; + } + export type Stub = Provider & StubBase; + // This represents all the types that can be sent as-is over an RPC boundary + type BaseType = void | undefined | null | boolean | number | bigint | string | TypedArray | ArrayBuffer | DataView | Date | Error | RegExp | ReadableStream | WritableStream | Request | Response | Headers; + // Recursively rewrite all `Stubable` types with `Stub`s + // prettier-ignore + type Stubify = T extends Stubable ? Stub : T extends Map ? Map, Stubify> : T extends Set ? Set> : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> : T extends BaseType ? T : T extends { + [key: string | number]: any; + } ? { + [K in keyof T]: Stubify; + } : T; + // Recursively rewrite all `Stub`s with the corresponding `T`s. + // Note we use `StubBase` instead of `Stub` here to avoid circular dependencies: + // `Stub` depends on `Provider`, which depends on `Unstubify`, which would depend on `Stub`. + // prettier-ignore + type Unstubify = T extends StubBase ? V : T extends Map ? Map, Unstubify> : T extends Set ? Set> : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> : T extends BaseType ? T : T extends { + [key: string | number]: unknown; + } ? { + [K in keyof T]: Unstubify; + } : T; + type UnstubifyAll = { + [I in keyof A]: Unstubify; + }; + // Utility type for adding `Provider`/`Disposable`s to `object` types only. + // Note `unknown & T` is equivalent to `T`. + type MaybeProvider = T extends object ? Provider : unknown; + type MaybeDisposable = T extends object ? Disposable : unknown; + // Type for method return or property on an RPC interface. + // - Stubable types are replaced by stubs. + // - Serializable types are passed by value, with stubable types replaced by stubs + // and a top-level `Disposer`. + // Everything else can't be passed over PRC. + // Technically, we use custom thenables here, but they quack like `Promise`s. + // Intersecting with `(Maybe)Provider` allows pipelining. + // prettier-ignore + type Result = R extends Stubable ? Promise> & Provider : R extends Serializable ? Promise & MaybeDisposable> & MaybeProvider : never; + // Type for method or property on an RPC interface. + // For methods, unwrap `Stub`s in parameters, and rewrite returns to be `Result`s. + // Unwrapping `Stub`s allows calling with `Stubable` arguments. + // For properties, rewrite types to be `Result`s. + // In each case, unwrap `Promise`s. + type MethodOrProperty = V extends (...args: infer P) => infer R ? (...args: UnstubifyAll

) => Result> : Result>; + // Type for the callable part of an `Provider` if `T` is callable. + // This is intersected with methods/properties. + type MaybeCallableProvider = T extends (...args: any[]) => any ? MethodOrProperty : unknown; + // Base type for all other types providing RPC-like interfaces. + // Rewrites all methods/properties to be `MethodOrProperty`s, while preserving callable types. + // `Reserved` names (e.g. stub method names like `dup()`) and symbols can't be accessed over RPC. + export type Provider = MaybeCallableProvider & Pick<{ + [K in keyof T]: MethodOrProperty; + }, Exclude>>; +} +declare namespace Cloudflare { + // Type of `env`. + // + // The specific project can extend `Env` by redeclaring it in project-specific files. Typescript + // will merge all declarations. + // + // You can use `wrangler types` to generate the `Env` type automatically. + interface Env { + } + // Project-specific parameters used to inform types. + // + // This interface is, again, intended to be declared in project-specific files, and then that + // declaration will be merged with this one. + // + // A project should have a declaration like this: + // + // interface GlobalProps { + // // Declares the main module's exports. Used to populate Cloudflare.Exports aka the type + // // of `ctx.exports`. + // mainModule: typeof import("my-main-module"); + // + // // Declares which of the main module's exports are configured with durable storage, and + // // thus should behave as Durable Object namsepace bindings. + // durableNamespaces: "MyDurableObject" | "AnotherDurableObject"; + // } + // + // You can use `wrangler types` to generate `GlobalProps` automatically. + interface GlobalProps { + } + // Evaluates to the type of a property in GlobalProps, defaulting to `Default` if it is not + // present. + type GlobalProp = K extends keyof GlobalProps ? GlobalProps[K] : Default; + // The type of the program's main module exports, if known. Requires `GlobalProps` to declare the + // `mainModule` property. + type MainModule = GlobalProp<"mainModule", {}>; + // The type of ctx.exports, which contains loopback bindings for all top-level exports. + type Exports = { + [K in keyof MainModule]: LoopbackForExport + // If the export is listed in `durableNamespaces`, then it is also a + // DurableObjectNamespace. + & (K extends GlobalProp<"durableNamespaces", never> ? MainModule[K] extends new (...args: any[]) => infer DoInstance ? DoInstance extends Rpc.DurableObjectBranded ? DurableObjectNamespace : DurableObjectNamespace : DurableObjectNamespace : {}); + }; +} +declare namespace CloudflareWorkersModule { + export type RpcStub = Rpc.Stub; + export const RpcStub: { + new (value: T): Rpc.Stub; + }; + export abstract class RpcTarget implements Rpc.RpcTargetBranded { + [Rpc.__RPC_TARGET_BRAND]: never; + } + // `protected` fields don't appear in `keyof`s, so can't be accessed over RPC + export abstract class WorkerEntrypoint implements Rpc.WorkerEntrypointBranded { + [Rpc.__WORKER_ENTRYPOINT_BRAND]: never; + protected ctx: ExecutionContext; + protected env: Env; + constructor(ctx: ExecutionContext, env: Env); + email?(message: ForwardableEmailMessage): void | Promise; + fetch?(request: Request): Response | Promise; + queue?(batch: MessageBatch): void | Promise; + scheduled?(controller: ScheduledController): void | Promise; + tail?(events: TraceItem[]): void | Promise; + tailStream?(event: TailStream.TailEvent): TailStream.TailEventHandlerType | Promise; + test?(controller: TestController): void | Promise; + trace?(traces: TraceItem[]): void | Promise; + } + export abstract class DurableObject implements Rpc.DurableObjectBranded { + [Rpc.__DURABLE_OBJECT_BRAND]: never; + protected ctx: DurableObjectState; + protected env: Env; + constructor(ctx: DurableObjectState, env: Env); + alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise; + fetch?(request: Request): Response | Promise; + webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise; + webSocketClose?(ws: WebSocket, code: number, reason: string, wasClean: boolean): void | Promise; + webSocketError?(ws: WebSocket, error: unknown): void | Promise; + } + export type WorkflowDurationLabel = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year'; + export type WorkflowSleepDuration = `${number} ${WorkflowDurationLabel}${'s' | ''}` | number; + export type WorkflowDelayDuration = WorkflowSleepDuration; + export type WorkflowTimeoutDuration = WorkflowSleepDuration; + export type WorkflowRetentionDuration = WorkflowSleepDuration; + export type WorkflowBackoff = 'constant' | 'linear' | 'exponential'; + export type WorkflowStepConfig = { + retries?: { + limit: number; + delay: WorkflowDelayDuration | number; + backoff?: WorkflowBackoff; + }; + timeout?: WorkflowTimeoutDuration | number; + }; + export type WorkflowEvent = { + payload: Readonly; + timestamp: Date; + instanceId: string; + }; + export type WorkflowStepEvent = { + payload: Readonly; + timestamp: Date; + type: string; + }; + export abstract class WorkflowStep { + do>(name: string, callback: () => Promise): Promise; + do>(name: string, config: WorkflowStepConfig, callback: () => Promise): Promise; + sleep: (name: string, duration: WorkflowSleepDuration) => Promise; + sleepUntil: (name: string, timestamp: Date | number) => Promise; + waitForEvent>(name: string, options: { + type: string; + timeout?: WorkflowTimeoutDuration | number; + }): Promise>; + } + export abstract class WorkflowEntrypoint | unknown = unknown> implements Rpc.WorkflowEntrypointBranded { + [Rpc.__WORKFLOW_ENTRYPOINT_BRAND]: never; + protected ctx: ExecutionContext; + protected env: Env; + constructor(ctx: ExecutionContext, env: Env); + run(event: Readonly>, step: WorkflowStep): Promise; + } + export function waitUntil(promise: Promise): void; + export function withEnv(newEnv: unknown, fn: () => unknown): unknown; + export function withExports(newExports: unknown, fn: () => unknown): unknown; + export function withEnvAndExports(newEnv: unknown, newExports: unknown, fn: () => unknown): unknown; + export const env: Cloudflare.Env; + export const exports: Cloudflare.Exports; +} +declare module 'cloudflare:workers' { + export = CloudflareWorkersModule; +} +interface SecretsStoreSecret { + /** + * Get a secret from the Secrets Store, returning a string of the secret value + * if it exists, or throws an error if it does not exist + */ + get(): Promise; +} +declare module "cloudflare:sockets" { + function _connect(address: string | SocketAddress, options?: SocketOptions): Socket; + export { _connect as connect }; +} +type MarkdownDocument = { + name: string; + blob: Blob; +}; +type ConversionResponse = { + name: string; + mimeType: string; + format: 'markdown'; + tokens: number; + data: string; +} | { + name: string; + mimeType: string; + format: 'error'; + error: string; +}; +type ImageConversionOptions = { + descriptionLanguage?: 'en' | 'es' | 'fr' | 'it' | 'pt' | 'de'; +}; +type EmbeddedImageConversionOptions = ImageConversionOptions & { + convert?: boolean; + maxConvertedImages?: number; +}; +type ConversionOptions = { + html?: { + images?: EmbeddedImageConversionOptions & { + convertOGImage?: boolean; + }; + }; + docx?: { + images?: EmbeddedImageConversionOptions; + }; + image?: ImageConversionOptions; + pdf?: { + images?: EmbeddedImageConversionOptions; + metadata?: boolean; + }; +}; +type ConversionRequestOptions = { + gateway?: GatewayOptions; + extraHeaders?: object; + conversionOptions?: ConversionOptions; +}; +type SupportedFileFormat = { + mimeType: string; + extension: string; +}; +declare abstract class ToMarkdownService { + transform(files: MarkdownDocument[], options?: ConversionRequestOptions): Promise; + transform(files: MarkdownDocument, options?: ConversionRequestOptions): Promise; + supported(): Promise; +} +declare namespace TailStream { + interface Header { + readonly name: string; + readonly value: string; + } + interface FetchEventInfo { + readonly type: "fetch"; + readonly method: string; + readonly url: string; + readonly cfJson?: object; + readonly headers: Header[]; + } + interface JsRpcEventInfo { + readonly type: "jsrpc"; + } + interface ScheduledEventInfo { + readonly type: "scheduled"; + readonly scheduledTime: Date; + readonly cron: string; + } + interface AlarmEventInfo { + readonly type: "alarm"; + readonly scheduledTime: Date; + } + interface QueueEventInfo { + readonly type: "queue"; + readonly queueName: string; + readonly batchSize: number; + } + interface EmailEventInfo { + readonly type: "email"; + readonly mailFrom: string; + readonly rcptTo: string; + readonly rawSize: number; + } + interface TraceEventInfo { + readonly type: "trace"; + readonly traces: (string | null)[]; + } + interface HibernatableWebSocketEventInfoMessage { + readonly type: "message"; + } + interface HibernatableWebSocketEventInfoError { + readonly type: "error"; + } + interface HibernatableWebSocketEventInfoClose { + readonly type: "close"; + readonly code: number; + readonly wasClean: boolean; + } + interface HibernatableWebSocketEventInfo { + readonly type: "hibernatableWebSocket"; + readonly info: HibernatableWebSocketEventInfoClose | HibernatableWebSocketEventInfoError | HibernatableWebSocketEventInfoMessage; + } + interface CustomEventInfo { + readonly type: "custom"; + } + interface FetchResponseInfo { + readonly type: "fetch"; + readonly statusCode: number; + } + type EventOutcome = "ok" | "canceled" | "exception" | "unknown" | "killSwitch" | "daemonDown" | "exceededCpu" | "exceededMemory" | "loadShed" | "responseStreamDisconnected" | "scriptNotFound"; + interface ScriptVersion { + readonly id: string; + readonly tag?: string; + readonly message?: string; + } + interface Onset { + readonly type: "onset"; + readonly attributes: Attribute[]; + // id for the span being opened by this Onset event. + readonly spanId: string; + readonly dispatchNamespace?: string; + readonly entrypoint?: string; + readonly executionModel: string; + readonly scriptName?: string; + readonly scriptTags?: string[]; + readonly scriptVersion?: ScriptVersion; + readonly info: FetchEventInfo | JsRpcEventInfo | ScheduledEventInfo | AlarmEventInfo | QueueEventInfo | EmailEventInfo | TraceEventInfo | HibernatableWebSocketEventInfo | CustomEventInfo; + } + interface Outcome { + readonly type: "outcome"; + readonly outcome: EventOutcome; + readonly cpuTime: number; + readonly wallTime: number; + } + interface SpanOpen { + readonly type: "spanOpen"; + readonly name: string; + // id for the span being opened by this SpanOpen event. + readonly spanId: string; + readonly info?: FetchEventInfo | JsRpcEventInfo | Attributes; + } + interface SpanClose { + readonly type: "spanClose"; + readonly outcome: EventOutcome; + } + interface DiagnosticChannelEvent { + readonly type: "diagnosticChannel"; + readonly channel: string; + readonly message: any; + } + interface Exception { + readonly type: "exception"; + readonly name: string; + readonly message: string; + readonly stack?: string; + } + interface Log { + readonly type: "log"; + readonly level: "debug" | "error" | "info" | "log" | "warn"; + readonly message: object; + } + // This marks the worker handler return information. + // This is separate from Outcome because the worker invocation can live for a long time after + // returning. For example - Websockets that return an http upgrade response but then continue + // streaming information or SSE http connections. + interface Return { + readonly type: "return"; + readonly info?: FetchResponseInfo; + } + interface Attribute { + readonly name: string; + readonly value: string | string[] | boolean | boolean[] | number | number[] | bigint | bigint[]; + } + interface Attributes { + readonly type: "attributes"; + readonly info: Attribute[]; + } + type EventType = Onset | Outcome | SpanOpen | SpanClose | DiagnosticChannelEvent | Exception | Log | Return | Attributes; + // Context in which this trace event lives. + interface SpanContext { + // Single id for the entire top-level invocation + // This should be a new traceId for the first worker stage invoked in the eyeball request and then + // same-account service-bindings should reuse the same traceId but cross-account service-bindings + // should use a new traceId. + readonly traceId: string; + // spanId in which this event is handled + // for Onset and SpanOpen events this would be the parent span id + // for Outcome and SpanClose these this would be the span id of the opening Onset and SpanOpen events + // For Hibernate and Mark this would be the span under which they were emitted. + // spanId is not set ONLY if: + // 1. This is an Onset event + // 2. We are not inheriting any SpanContext. (e.g. this is a cross-account service binding or a new top-level invocation) + readonly spanId?: string; + } + interface TailEvent { + // invocation id of the currently invoked worker stage. + // invocation id will always be unique to every Onset event and will be the same until the Outcome event. + readonly invocationId: string; + // Inherited spanContext for this event. + readonly spanContext: SpanContext; + readonly timestamp: Date; + readonly sequence: number; + readonly event: Event; + } + type TailEventHandler = (event: TailEvent) => void | Promise; + type TailEventHandlerObject = { + outcome?: TailEventHandler; + spanOpen?: TailEventHandler; + spanClose?: TailEventHandler; + diagnosticChannel?: TailEventHandler; + exception?: TailEventHandler; + log?: TailEventHandler; + return?: TailEventHandler; + attributes?: TailEventHandler; + }; + type TailEventHandlerType = TailEventHandler | TailEventHandlerObject; +} +// Copyright (c) 2022-2023 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 +/** + * Data types supported for holding vector metadata. + */ +type VectorizeVectorMetadataValue = string | number | boolean | string[]; +/** + * Additional information to associate with a vector. + */ +type VectorizeVectorMetadata = VectorizeVectorMetadataValue | Record; +type VectorFloatArray = Float32Array | Float64Array; +interface VectorizeError { + code?: number; + error: string; +} +/** + * Comparison logic/operation to use for metadata filtering. + * + * This list is expected to grow as support for more operations are released. + */ +type VectorizeVectorMetadataFilterOp = '$eq' | '$ne' | '$lt' | '$lte' | '$gt' | '$gte'; +type VectorizeVectorMetadataFilterCollectionOp = '$in' | '$nin'; +/** + * Filter criteria for vector metadata used to limit the retrieved query result set. + */ +type VectorizeVectorMetadataFilter = { + [field: string]: Exclude | null | { + [Op in VectorizeVectorMetadataFilterOp]?: Exclude | null; + } | { + [Op in VectorizeVectorMetadataFilterCollectionOp]?: Exclude[]; + }; +}; +/** + * Supported distance metrics for an index. + * Distance metrics determine how other "similar" vectors are determined. + */ +type VectorizeDistanceMetric = "euclidean" | "cosine" | "dot-product"; +/** + * Metadata return levels for a Vectorize query. + * + * Default to "none". + * + * @property all Full metadata for the vector return set, including all fields (including those un-indexed) without truncation. This is a more expensive retrieval, as it requires additional fetching & reading of un-indexed data. + * @property indexed Return all metadata fields configured for indexing in the vector return set. This level of retrieval is "free" in that no additional overhead is incurred returning this data. However, note that indexed metadata is subject to truncation (especially for larger strings). + * @property none No indexed metadata will be returned. + */ +type VectorizeMetadataRetrievalLevel = "all" | "indexed" | "none"; +interface VectorizeQueryOptions { + topK?: number; + namespace?: string; + returnValues?: boolean; + returnMetadata?: boolean | VectorizeMetadataRetrievalLevel; + filter?: VectorizeVectorMetadataFilter; +} +/** + * Information about the configuration of an index. + */ +type VectorizeIndexConfig = { + dimensions: number; + metric: VectorizeDistanceMetric; +} | { + preset: string; // keep this generic, as we'll be adding more presets in the future and this is only in a read capacity +}; +/** + * Metadata about an existing index. + * + * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. + * See {@link VectorizeIndexInfo} for its post-beta equivalent. + */ +interface VectorizeIndexDetails { + /** The unique ID of the index */ + readonly id: string; + /** The name of the index. */ + name: string; + /** (optional) A human readable description for the index. */ + description?: string; + /** The index configuration, including the dimension size and distance metric. */ + config: VectorizeIndexConfig; + /** The number of records containing vectors within the index. */ + vectorsCount: number; +} +/** + * Metadata about an existing index. + */ +interface VectorizeIndexInfo { + /** The number of records containing vectors within the index. */ + vectorCount: number; + /** Number of dimensions the index has been configured for. */ + dimensions: number; + /** ISO 8601 datetime of the last processed mutation on in the index. All changes before this mutation will be reflected in the index state. */ + processedUpToDatetime: number; + /** UUIDv4 of the last mutation processed by the index. All changes before this mutation will be reflected in the index state. */ + processedUpToMutation: number; +} +/** + * Represents a single vector value set along with its associated metadata. + */ +interface VectorizeVector { + /** The ID for the vector. This can be user-defined, and must be unique. It should uniquely identify the object, and is best set based on the ID of what the vector represents. */ + id: string; + /** The vector values */ + values: VectorFloatArray | number[]; + /** The namespace this vector belongs to. */ + namespace?: string; + /** Metadata associated with the vector. Includes the values of other fields and potentially additional details. */ + metadata?: Record; +} +/** + * Represents a matched vector for a query along with its score and (if specified) the matching vector information. + */ +type VectorizeMatch = Pick, "values"> & Omit & { + /** The score or rank for similarity, when returned as a result */ + score: number; +}; +/** + * A set of matching {@link VectorizeMatch} for a particular query. + */ +interface VectorizeMatches { + matches: VectorizeMatch[]; + count: number; +} +/** + * Results of an operation that performed a mutation on a set of vectors. + * Here, `ids` is a list of vectors that were successfully processed. + * + * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. + * See {@link VectorizeAsyncMutation} for its post-beta equivalent. + */ +interface VectorizeVectorMutation { + /* List of ids of vectors that were successfully processed. */ + ids: string[]; + /* Total count of the number of processed vectors. */ + count: number; +} +/** + * Result type indicating a mutation on the Vectorize Index. + * Actual mutations are processed async where the `mutationId` is the unique identifier for the operation. + */ +interface VectorizeAsyncMutation { + /** The unique identifier for the async mutation operation containing the changeset. */ + mutationId: string; +} +/** + * A Vectorize Vector Search Index for querying vectors/embeddings. + * + * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. + * See {@link Vectorize} for its new implementation. + */ +declare abstract class VectorizeIndex { + /** + * Get information about the currently bound index. + * @returns A promise that resolves with information about the current index. + */ + public describe(): Promise; + /** + * Use the provided vector to perform a similarity search across the index. + * @param vector Input vector that will be used to drive the similarity search. + * @param options Configuration options to massage the returned data. + * @returns A promise that resolves with matched and scored vectors. + */ + public query(vector: VectorFloatArray | number[], options?: VectorizeQueryOptions): Promise; + /** + * Insert a list of vectors into the index dataset. If a provided id exists, an error will be thrown. + * @param vectors List of vectors that will be inserted. + * @returns A promise that resolves with the ids & count of records that were successfully processed. + */ + public insert(vectors: VectorizeVector[]): Promise; + /** + * Upsert a list of vectors into the index dataset. If a provided id exists, it will be replaced with the new values. + * @param vectors List of vectors that will be upserted. + * @returns A promise that resolves with the ids & count of records that were successfully processed. + */ + public upsert(vectors: VectorizeVector[]): Promise; + /** + * Delete a list of vectors with a matching id. + * @param ids List of vector ids that should be deleted. + * @returns A promise that resolves with the ids & count of records that were successfully processed (and thus deleted). + */ + public deleteByIds(ids: string[]): Promise; + /** + * Get a list of vectors with a matching id. + * @param ids List of vector ids that should be returned. + * @returns A promise that resolves with the raw unscored vectors matching the id set. + */ + public getByIds(ids: string[]): Promise; +} +/** + * A Vectorize Vector Search Index for querying vectors/embeddings. + * + * Mutations in this version are async, returning a mutation id. + */ +declare abstract class Vectorize { + /** + * Get information about the currently bound index. + * @returns A promise that resolves with information about the current index. + */ + public describe(): Promise; + /** + * Use the provided vector to perform a similarity search across the index. + * @param vector Input vector that will be used to drive the similarity search. + * @param options Configuration options to massage the returned data. + * @returns A promise that resolves with matched and scored vectors. + */ + public query(vector: VectorFloatArray | number[], options?: VectorizeQueryOptions): Promise; + /** + * Use the provided vector-id to perform a similarity search across the index. + * @param vectorId Id for a vector in the index against which the index should be queried. + * @param options Configuration options to massage the returned data. + * @returns A promise that resolves with matched and scored vectors. + */ + public queryById(vectorId: string, options?: VectorizeQueryOptions): Promise; + /** + * Insert a list of vectors into the index dataset. If a provided id exists, an error will be thrown. + * @param vectors List of vectors that will be inserted. + * @returns A promise that resolves with a unique identifier of a mutation containing the insert changeset. + */ + public insert(vectors: VectorizeVector[]): Promise; + /** + * Upsert a list of vectors into the index dataset. If a provided id exists, it will be replaced with the new values. + * @param vectors List of vectors that will be upserted. + * @returns A promise that resolves with a unique identifier of a mutation containing the upsert changeset. + */ + public upsert(vectors: VectorizeVector[]): Promise; + /** + * Delete a list of vectors with a matching id. + * @param ids List of vector ids that should be deleted. + * @returns A promise that resolves with a unique identifier of a mutation containing the delete changeset. + */ + public deleteByIds(ids: string[]): Promise; + /** + * Get a list of vectors with a matching id. + * @param ids List of vector ids that should be returned. + * @returns A promise that resolves with the raw unscored vectors matching the id set. + */ + public getByIds(ids: string[]): Promise; +} +/** + * The interface for "version_metadata" binding + * providing metadata about the Worker Version using this binding. + */ +type WorkerVersionMetadata = { + /** The ID of the Worker Version using this binding */ + id: string; + /** The tag of the Worker Version using this binding */ + tag: string; + /** The timestamp of when the Worker Version was uploaded */ + timestamp: string; +}; +interface DynamicDispatchLimits { + /** + * Limit CPU time in milliseconds. + */ + cpuMs?: number; + /** + * Limit number of subrequests. + */ + subRequests?: number; +} +interface DynamicDispatchOptions { + /** + * Limit resources of invoked Worker script. + */ + limits?: DynamicDispatchLimits; + /** + * Arguments for outbound Worker script, if configured. + */ + outbound?: { + [key: string]: any; + }; +} +interface DispatchNamespace { + /** + * @param name Name of the Worker script. + * @param args Arguments to Worker script. + * @param options Options for Dynamic Dispatch invocation. + * @returns A Fetcher object that allows you to send requests to the Worker script. + * @throws If the Worker script does not exist in this dispatch namespace, an error will be thrown. + */ + get(name: string, args?: { + [key: string]: any; + }, options?: DynamicDispatchOptions): Fetcher; +} +declare module 'cloudflare:workflows' { + /** + * NonRetryableError allows for a user to throw a fatal error + * that makes a Workflow instance fail immediately without triggering a retry + */ + export class NonRetryableError extends Error { + public constructor(message: string, name?: string); + } +} +declare abstract class Workflow { + /** + * Get a handle to an existing instance of the Workflow. + * @param id Id for the instance of this Workflow + * @returns A promise that resolves with a handle for the Instance + */ + public get(id: string): Promise; + /** + * Create a new instance and return a handle to it. If a provided id exists, an error will be thrown. + * @param options Options when creating an instance including id and params + * @returns A promise that resolves with a handle for the Instance + */ + public create(options?: WorkflowInstanceCreateOptions): Promise; + /** + * Create a batch of instances and return handle for all of them. If a provided id exists, an error will be thrown. + * `createBatch` is limited at 100 instances at a time or when the RPC limit for the batch (1MiB) is reached. + * @param batch List of Options when creating an instance including name and params + * @returns A promise that resolves with a list of handles for the created instances. + */ + public createBatch(batch: WorkflowInstanceCreateOptions[]): Promise; +} +type WorkflowDurationLabel = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year'; +type WorkflowSleepDuration = `${number} ${WorkflowDurationLabel}${'s' | ''}` | number; +type WorkflowRetentionDuration = WorkflowSleepDuration; +interface WorkflowInstanceCreateOptions { + /** + * An id for your Workflow instance. Must be unique within the Workflow. + */ + id?: string; + /** + * The event payload the Workflow instance is triggered with + */ + params?: PARAMS; + /** + * The retention policy for Workflow instance. + * Defaults to the maximum retention period available for the owner's account. + */ + retention?: { + successRetention?: WorkflowRetentionDuration; + errorRetention?: WorkflowRetentionDuration; + }; +} +type InstanceStatus = { + status: 'queued' // means that instance is waiting to be started (see concurrency limits) + | 'running' | 'paused' | 'errored' | 'terminated' // user terminated the instance while it was running + | 'complete' | 'waiting' // instance is hibernating and waiting for sleep or event to finish + | 'waitingForPause' // instance is finishing the current work to pause + | 'unknown'; + error?: { + name: string; + message: string; + }; + output?: unknown; +}; +interface WorkflowError { + code?: number; + message: string; +} +declare abstract class WorkflowInstance { + public id: string; + /** + * Pause the instance. + */ + public pause(): Promise; + /** + * Resume the instance. If it is already running, an error will be thrown. + */ + public resume(): Promise; + /** + * Terminate the instance. If it is errored, terminated or complete, an error will be thrown. + */ + public terminate(): Promise; + /** + * Restart the instance. + */ + public restart(): Promise; + /** + * Returns the current status of the instance. + */ + public status(): Promise; + /** + * Send an event to this instance. + */ + public sendEvent({ type, payload, }: { + type: string; + payload: unknown; + }): Promise; +} From fa24b23fd1e8c8ef2076b72c55e1044346a4edf5 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 19 Jan 2026 02:38:25 -0600 Subject: [PATCH 28/77] docs(ertp-clerk): refresh README usage Describe the bootstrap console flow and /api Cap'n Web endpoint. --- packages/ertp-clerk/README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/ertp-clerk/README.md b/packages/ertp-clerk/README.md index 2c93f5a..b76efd9 100644 --- a/packages/ertp-clerk/README.md +++ b/packages/ertp-clerk/README.md @@ -1,5 +1,9 @@ # ertp-clerk -A minimal worker that will eventually expose ERTP-ledger services over Cap'n Web. +ERTP ledger access over Cap'n Web, hosted as a Cloudflare Worker. -Current behavior: all HTTP requests return a failure response. +## Usage + +- Visit `/` to load a small page that exposes `globalThis.bootstrap` in the browser console. +- Call `await bootstrap.makeIssuerKit("BUCKS")` to obtain issuer facets backed by the durable ledger. +- POST or WebSocket requests to `/api` speak Cap'n Web RPC; other endpoints return 501/204. From b7f06ea55fbba97c5b8f43e6ef5e306c1158687f Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 19 Jan 2026 02:42:45 -0600 Subject: [PATCH 29/77] fix(ertp-ledgerguise): deposit returns payment amount Add a test that deposits 2 and 3 BUCKS and expects per-payment amounts. Return the payment amount instead of the purse balance from deposit. --- packages/ertp-ledgerguise/src/purse.ts | 2 +- .../ertp-ledgerguise/test/ledgerguise.test.ts | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index a0803d4..0684756 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -65,7 +65,7 @@ export const makePurseFactory = ({ holdingSplitGuid: record.holdingSplitGuid, toAccountGuid: accountGuid, }); - return makeAmount(getAccountBalance(db, accountGuid)); + return makeAmount(record.amount); }; const withdraw = (amount: AmountLike) => { if (amount.brand !== brand) { diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index 18491c2..c149cb5 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -78,6 +78,35 @@ test('alice sends 10 to bob', t => { t.is(bobPurse.getCurrentAmount().value, 10n); }); +test('deposit returns the payment amount', t => { + const { freeze } = Object; + const db = new Database(':memory:'); + t.teardown(() => db.close()); + initGnuCashSchema(db); + + let guidCounter = 0n; + const makeGuid = () => { + const guid = guidCounter; + guidCounter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const nowMs = makeTestClock(); + const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const brand = issuedKit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + const purse = issuedKit.issuer.makeEmptyPurse(); + + const firstDeposit = purse.deposit(issuedKit.mint.mintPayment(bucks(2n))); + const secondDeposit = purse.deposit(issuedKit.mint.mintPayment(bucks(3n))); + + t.is(firstDeposit.value, 2n); + t.is(secondDeposit.value, 3n); +}); + test('alice-to-bob transfer records a single transaction', t => { const { freeze } = Object; const db = new Database(':memory:'); From 60796bf5e79e19b96e64150c68deacfc9c68d508 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 23 Jan 2026 17:32:02 -0600 Subject: [PATCH 30/77] build: normalize workspaces, pin node, and clean lockfiles --- .envrc.example | 2 + .gitignore | 1 - .nvmrc | 1 + CONTRIBUTING.md | 20 + package.json | 5 +- packages/brcal/yarn.lock | 2387 ------------- packages/brscript/yarn.lock | 1740 ---------- packages/ertp-clerk/package-lock.json | 2900 ---------------- packages/ertp-ledgerguise/package-lock.json | 3124 ----------------- packages/fincaps/yarn.lock | 3383 ------------------- 10 files changed, 24 insertions(+), 13539 deletions(-) create mode 100644 .envrc.example create mode 100644 .nvmrc create mode 100644 CONTRIBUTING.md delete mode 100644 packages/brcal/yarn.lock delete mode 100644 packages/brscript/yarn.lock delete mode 100644 packages/ertp-clerk/package-lock.json delete mode 100644 packages/ertp-ledgerguise/package-lock.json delete mode 100644 packages/fincaps/yarn.lock diff --git a/.envrc.example b/.envrc.example new file mode 100644 index 0000000..bef4667 --- /dev/null +++ b/.envrc.example @@ -0,0 +1,2 @@ +source ~/.nvm/nvm.sh +nvm use diff --git a/.gitignore b/.gitignore index 015be69..f3ca993 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ node_modules/ .envrc -.nvmrc .vscode/ .yarn/ *.code-workspace diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..5767036 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22.21.1 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..f97b69c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,20 @@ +# Contributing + +## Node + direnv (nvm) +- Install nvm and set your Node version with `nvm install`. +- This repo pins Node in `.nvmrc`. With direnv, copy `.envrc.example` to `.envrc`, then run `direnv allow` once per machine. +- `direnv` will run `nvm use` automatically on `cd` into the repo. + +## Yarn (boring + stable) +- Use the repo Yarn version: `corepack enable` then `corepack prepare yarn@4.5.3 --activate`. +- Install: `yarn install` (use `yarn install --immutable` in CI). +- Don’t use npm in workspaces (no `package-lock.json`). +- For adding deps: `yarn workspace add ` or edit the package and run `yarn install`. +- Dedupe: use `yarn dedupe` (not `npx yarn-deduplicate`, which is Yarn 1). + +## Workspaces +- Workspaces are `packages/*`. Each package must have a `package.json`. +- Avoid adding nested lockfiles inside packages. +- Avoid local dev deps that use `workspace:` (e.g., private monorepo packages) unless you also add their workspaces here. +- TODO: Restore optional `@endo/cli` support for `packages/fincaps` without breaking installs (e.g., document a separate Endo monorepo workflow or make it an opt-in dev dependency). +- TODO: Consider `yarn workspaces focus` to avoid Electron (via `packages/ofxies`) when not working on that package. diff --git a/package.json b/package.json index 286cddb..e8212ed 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,7 @@ }, "useWorkspaces": true, "workspaces": [ - "packages/br-cal", - "packages/br-script", - "packages/discover-dl", - "packages/lm-sync" + "packages/*" ], "devDependencies": { "@endo/eslint-plugin": "^0.5.1", diff --git a/packages/brcal/yarn.lock b/packages/brcal/yarn.lock deleted file mode 100644 index fbd3955..0000000 --- a/packages/brcal/yarn.lock +++ /dev/null @@ -1,2387 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@agoric/eslint-config@^0.3.3": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@agoric/eslint-config/-/eslint-config-0.3.25.tgz#2a293393ef31dc7a60161a92ccacb56ed321a53a" - integrity sha512-GbrgRM8NuI1Azq5gM2XB9jFfl88PCC+Jk98/Kc5kIq2/YDeUsz8z9jAPcxc+dpG3mx7/V0IYDNcj2gIPf6uMxA== - -"@agoric/eslint-plugin@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@agoric/eslint-plugin/-/eslint-plugin-0.2.3.tgz#29734731b2bcfcb4bb259f531fcf0125772c3bfd" - integrity sha512-m0GcNDf4L8WCQMbDrdq7dv4RVYly7YvDm6Xs2C3/Zq2FQGli9TjuR38SA41HXpf1O9Vaz20YpchuLjx/CP8uKQ== - dependencies: - requireindex "~1.1.0" - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/highlight@^7.10.4": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== - 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" - -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@types/better-sqlite3@^7.6.1": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.4.tgz#102462611e67aadf950d3ccca10292de91e6f35b" - integrity sha512-dzrRZCYPXIXfSR1/surNbJ/grU3scTaygS0OMzjlGf71i9sc2fGyHPXXiXmEvNIoE0cGwsanEFMVJxPXmco9Eg== - dependencies: - "@types/node" "*" - -"@types/follow-redirects@^1.13.0": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@types/follow-redirects/-/follow-redirects-1.14.1.tgz#c08b173be7517ddc53725d0faf9648d4dc7a9cdb" - integrity sha512-THBEFwqsLuU/K62B5JRwab9NW97cFmL4Iy34NTMX0bMycQVzq2q7PKOkhfivIwxdpa/J72RppgC42vCHfwKJ0Q== - dependencies: - "@types/node" "*" - -"@types/fs-extra@^11.0.1": - version "11.0.1" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.1.tgz#f542ec47810532a8a252127e6e105f487e0a6ea5" - integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA== - dependencies: - "@types/jsonfile" "*" - "@types/node" "*" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/jsonfile@*": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.1.tgz#ac84e9aefa74a2425a0fb3012bdea44f58970f1b" - integrity sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png== - dependencies: - "@types/node" "*" - -"@types/minimist@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - -"@types/mysql@^2.15.15": - version "2.15.21" - resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.21.tgz#7516cba7f9d077f980100c85fd500c8210bd5e45" - integrity sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg== - dependencies: - "@types/node" "*" - -"@types/node@*": - version "20.4.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.8.tgz#b5dda19adaa473a9bf0ab5cbd8f30ec7d43f5c85" - integrity sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg== - -"@types/node@^14.14.7": - version "14.18.54" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.54.tgz#fc304bd66419030141fa997dc5a9e0e374029ae8" - integrity sha512-uq7O52wvo2Lggsx1x21tKZgqkJpvwCseBBPtX/nKQfpVlEsLOb11zZ1CRsWUKvJF0+lzuA9jwvA7Pr2Wt7i3xw== - -"@types/node@^18.16.3": - version "18.17.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.3.tgz#409febdc84478b452306a8112c692e800ad9f6fe" - integrity sha512-2x8HWtFk0S99zqVQABU9wTpr8wPoaDHZUcAkoTKH+nL7kPv3WUI9cRi/Kk5Mz4xdqXSqTkKP7IWNoQQYCnDsTA== - -"@types/ps-tree@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/ps-tree/-/ps-tree-1.1.2.tgz#5c60773a38ffb1402e049902a7b7a8d3c67cd59a" - integrity sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw== - -"@types/which@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/which/-/which-3.0.0.tgz#849afdd9fdcb0b67339b9cfc80fa6ea4e0253fc5" - integrity sha512-ASCxdbsrwNfSMXALlC3Decif9rwDMu+80KGp5zI2RLRotfMsTv7fHL8W8VDp24wymzDyIFudhUeSCugrgRFfHQ== - -"@typescript-eslint/parser@^4.21.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== - 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" - -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== - -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== - 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" - -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== - dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - 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" - -ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlastindex@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz#bc229aef98f6bd0533a2bc61ff95209875526c9b" - integrity sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" - -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -better-sqlite3@^7.6.2: - version "7.6.2" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-7.6.2.tgz#47cd8cad5b9573cace535f950ac321166bc31384" - integrity sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg== - dependencies: - bindings "^1.5.0" - prebuild-install "^7.1.0" - -bignumber.js@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" - integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - 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" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -comment-parser@1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.1.5.tgz#453627ef8f67dbcec44e79a9bd5baa37f0bce9b2" - integrity sha512-RePCE4leIhBlmrqiYTvaqEeGYg7qpSl4etaIabKtdOQVi+mSTIBBklGUwIr79GXYnl3LpMwmDw4KeR2stNc6FA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -confusing-browser-globals@^1.0.10: - version "1.0.11" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -csv-parse@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.4.0.tgz#6793210a4a49a9a74b3fde3f9d00f3f52044fd89" - integrity sha512-JiQosUWiOFgp4hQn0an+SBoV9IKdqzhROM0iiN4LB7UpfJBlsSJlWl9nq4zGgxgMAzHJ6V4t29VAVD+3+2NJAg== - -data-uri-to-buffer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" - integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -detect-libc@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" - integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -duplexer@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enquirer@^2.3.5: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-airbnb-base@^14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" - integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== - dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.2" - -eslint-config-prettier@^8.1.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" - integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== - -eslint-import-resolver-node@^0.3.7: - version "0.3.8" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.8.tgz#be719e72f5e96dcef7a60f74147c842db0c74b06" - integrity sha512-tEe+Pok22qIGaK3KoMP+N96GVDS66B/zreoVVmiavLvRUEmGRtvb4B8wO9jwnb8d2lvHtrkhZ7UD73dWBVnf/Q== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.22.1: - version "2.28.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz#8d66d6925117b06c4018d491ae84469eb3cb1005" - integrity sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q== - dependencies: - array-includes "^3.1.6" - array.prototype.findlastindex "^1.2.2" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.8.0" - has "^1.0.3" - is-core-module "^2.12.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.6" - object.groupby "^1.0.0" - object.values "^1.1.6" - resolve "^1.22.3" - semver "^6.3.1" - tsconfig-paths "^3.14.2" - -eslint-plugin-jsdoc@^32.3.0: - version "32.3.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.3.4.tgz#6888f3b2dbb9f73fb551458c639a4e8c84fe9ddc" - integrity sha512-xSWfsYvffXnN0OkwLnB7MoDDDDjqcp46W7YlY1j7JyfAQBQ+WnGCfLov3gVNZjUGtK9Otj8mEhTZTqJu4QtIGA== - dependencies: - comment-parser "1.1.5" - debug "^4.3.1" - jsdoctypeparser "^9.0.0" - lodash "^4.17.21" - regextras "^0.7.1" - semver "^7.3.5" - spdx-expression-parse "^3.0.1" - -eslint-plugin-prettier@^3.3.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" - integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint@^7.24.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - 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" - -esm@^3.2.25: - version "3.2.25" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" - integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-stream@=3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== - 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" - -fast-json-patch@^3.0.0-1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz#85064ea1b1ebf97a3f7ad01e23f9337e72c66947" - integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fetch-blob@^3.1.2, fetch-blob@^3.1.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" - integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== - dependencies: - node-domexception "^1.0.0" - web-streams-polyfill "^3.0.3" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@^1.14.8: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -formdata-polyfill@^4.0.10: - version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" - integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== - dependencies: - fetch-blob "^3.1.2" - -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" - integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -fx@*: - version "28.0.0" - resolved "https://registry.yarnpkg.com/fx/-/fx-28.0.0.tgz#67087b31377039bab42f51db32c8758ccb4708e8" - integrity sha512-vKQDA9g868cZiW8ulgs2uN1yx1i7/nsS33jTMOxekk0Z03BJLffVcdW6AVD32fWb3E6RtmWWuBXBZOk8cLXFNQ== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - 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" - -globals@^13.6.0, globals@^13.9.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.3: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - 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" - -globby@^13.1.4: - version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" - ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -ical@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/ical/-/ical-0.8.0.tgz#aa93f021dfead58e54aaa22076a11ca07d65886b" - integrity sha512-/viUSb/RGLLnlgm0lWRlPBtVeQguQRErSPYl3ugnUaKUnzQswKqOG3M8/P1v1AB5NJwlHTuvTq1cs4mpeG2rCg== - dependencies: - rrule "2.4.1" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.12.1, is-core-module@^2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsdoctypeparser@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz#8c97e2fb69315eb274b0f01377eaa5c940bd7b26" - integrity sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -luxon@^1.3.3: - version "1.28.1" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.1.tgz#528cdf3624a54506d710290a2341aa8e6e6c61b0" - integrity sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw== - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6, minimist@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mysql@^2.18.1: - version "2.18.1" - resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.18.1.tgz#2254143855c5a8c73825e4522baf2ea021766717" - integrity sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig== - dependencies: - bignumber.js "9.0.0" - readable-stream "2.3.7" - safe-buffer "5.1.2" - sqlstring "2.3.1" - -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-abi@^3.3.0: - version "3.45.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.45.0.tgz#f568f163a3bfca5aacfce1fbeee1fa2cc98441f5" - integrity sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ== - dependencies: - semver "^7.3.5" - -node-domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - -node-fetch@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.1.tgz#b3eea7b54b3a48020e46f4f88b9c5a7430d20b2e" - integrity sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow== - dependencies: - data-uri-to-buffer "^4.0.0" - fetch-blob "^3.1.4" - formdata-polyfill "^4.0.10" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.2, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.2: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.groupby@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.0.tgz#cb29259cf90f37e7bac6437686c1ea8c916d12a9" - integrity sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.21.2" - get-intrinsic "^1.2.1" - -object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.1: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== - dependencies: - through "~2.3" - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -prebuild-install@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - 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" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -ps-tree@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" - integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== - dependencies: - event-stream "=3.3.4" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - 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" - -readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - -regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regextras@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.1.tgz#be95719d5f43f9ef0b9fa07ad89b7c606995a3b2" - integrity sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-text@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/require-text/-/require-text-0.0.1.tgz#cde7a3e443b71c14e1ec0d5cefcfcd418dffd66e" - integrity sha512-F0YWfF47G/IWK3RjLo2VIgASklXbKv5R+ZovK+v/MXsG1Gpu57i4XlCQ8x6gs2NgBo2dULGWvEySn8H2Ki2Gaw== - -requireindex@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" - integrity sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.22.3, resolve@^1.22.4: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rrule@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/rrule/-/rrule-2.4.1.tgz#1d0db4e45f2b0e92e2cca62d2f7093729ac7ec94" - integrity sha512-+NcvhETefswZq13T8nkuEnnQ6YgUeZaqMqVbp+ZiFDPCbp3AVgQIwUvNVDdMNrP05bKZG9ddDULFp0qZZYDrxg== - optionalDependencies: - luxon "^1.3.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.2.1, semver@^7.3.5: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sqlstring@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" - integrity sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ== - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== - dependencies: - duplexer "~0.1.1" - -string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -table@^6.0.9: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== - 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" - -tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -through@2, through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tsconfig-paths@^3.14.2: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typescript@^4.1.3: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -web-streams-polyfill@^3.0.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" - integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== - -webpod@^0: - version "0.0.2" - resolved "https://registry.yarnpkg.com/webpod/-/webpod-0.0.2.tgz#b577c93604fd23596488735887168b3236e3adae" - integrity sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg== - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - 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" - -which-typed-array@^1.1.10, which-typed-array@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" - integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== - dependencies: - isexe "^2.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -xml2js@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" - integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^2.2.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -zx@^7.0.8: - version "7.2.3" - resolved "https://registry.yarnpkg.com/zx/-/zx-7.2.3.tgz#d9fef6bd084f7e21994080de09fb20e441074c39" - integrity sha512-QODu38nLlYXg/B/Gw7ZKiZrvPkEsjPN3LQ5JFXM7h0JvwhEdPNNl+4Ao1y4+o3CLNiDUNcwzQYZ4/Ko7kKzCMA== - dependencies: - "@types/fs-extra" "^11.0.1" - "@types/minimist" "^1.2.2" - "@types/node" "^18.16.3" - "@types/ps-tree" "^1.1.2" - "@types/which" "^3.0.0" - chalk "^5.2.0" - fs-extra "^11.1.1" - fx "*" - globby "^13.1.4" - minimist "^1.2.8" - node-fetch "3.3.1" - ps-tree "^1.2.0" - webpod "^0" - which "^3.0.0" - yaml "^2.2.2" diff --git a/packages/brscript/yarn.lock b/packages/brscript/yarn.lock deleted file mode 100644 index cefedf1..0000000 --- a/packages/brscript/yarn.lock +++ /dev/null @@ -1,1740 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== - dependencies: - "@babel/highlight" "^7.22.5" - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@google/clasp@^2.3.0": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@google/clasp/-/clasp-2.4.2.tgz#4e484bed60f10f02ad2694ec42d7fed1590295e0" - integrity sha512-SrHzWSotR8c7mNBVwH81sFCc4HhoDrCevicJehQlvrvgdTvLIiU0Pfb5EYCzWUPBSC4Ez/nvW6wxsgaK7RrPjQ== - dependencies: - "@sindresorhus/is" "^4.0.1" - chalk "^4.1.2" - chokidar "^3.5.2" - cli-truncate "^3.0.0" - commander "^8.1.0" - debounce "^1.2.1" - dotf "^2.0.2" - find-up "^6.0.0" - fs-extra "^10.0.0" - fuzzy "^0.1.3" - google-auth-library "^7.6.2" - googleapis "^84.0.0" - inquirer "^8.1.2" - inquirer-autocomplete-prompt-ipt "^2.0.0" - is-reachable "^5.0.0" - log-symbols "^5.0.0" - loud-rejection "^2.2.0" - make-dir "^3.1.0" - multimatch "^5.0.0" - normalize-newline "^4.1.0" - open "^8.2.1" - ora "^6.0.0" - p-map "^5.1.0" - read-pkg-up "^8.0.0" - recursive-readdir "^2.2.2" - server-destroy "^1.0.1" - split-lines "^3.0.0" - strip-bom "^5.0.0" - ts2gas "^4.2.0" - typescript "^4.4.2" - -"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.0.1": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@types/cacheable-request@^6.0.1": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" - -"@types/google-apps-script@^1.0.17": - version "1.0.66" - resolved "https://registry.yarnpkg.com/@types/google-apps-script/-/google-apps-script-1.0.66.tgz#fc35a3b28d27e6f788729f043b8135b232a7c5dc" - integrity sha512-cLj0yFt2153SfCByZ2jLyvUpyHT8UPvs1EmMFpWxb3F5eoREoxF0CiyyXd5rC95LoX1kvWgPyj78OHqCHJ652g== - -"@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== - -"@types/keyv@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== - dependencies: - "@types/node" "*" - -"@types/minimatch@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/node@*": - version "20.4.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.8.tgz#b5dda19adaa473a9bf0ab5cbd8f30ec7d43f5c85" - integrity sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -aggregate-error@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" - integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== - dependencies: - clean-stack "^4.0.0" - indent-string "^5.0.0" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -array-differ@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" - integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -arrify@^2.0.0, arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.0, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bignumber.js@^9.0.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bl@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" - integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== - dependencies: - buffer "^6.0.3" - inherits "^2.0.4" - readable-stream "^3.4.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-request@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" - integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== - 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" - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - 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" - -chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.0.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chokidar@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -clean-stack@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" - integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== - dependencies: - escape-string-regexp "5.0.0" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - -cli-spinners@^2.5.0, cli-spinners@^2.6.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" - integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== - -cli-truncate@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng== - dependencies: - array-find-index "^1.0.1" - -debounce@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - -debug@4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -defer-to-connect@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -dotf@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dotf/-/dotf-2.0.2.tgz#d137b56540dfec94f8c48e5afbb99467433bfce5" - integrity sha512-4cN2fwEqHimE11jVc8uMNiEB2A2YOL5Fdyd1p14UbAvRh/5vAxjEaiVPx45zD5IQcwc/uQIxI9Jh18skB/uYFQ== - dependencies: - graceful-fs "^4.2.8" - jsonfile "^6.1.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -extend@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -fast-text-encoding@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" - integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== - -figures@^3.0.0, figures@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" - integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== - dependencies: - locate-path "^7.1.0" - path-exists "^5.0.0" - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -fuzzy@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/fuzzy/-/fuzzy-0.1.3.tgz#4c76ec2ff0ac1a36a9dccf9a00df8623078d4ed8" - integrity sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w== - -gaxios@^4.0.0: - version "4.3.3" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-4.3.3.tgz#d44bdefe52d34b6435cc41214fdb160b64abfc22" - integrity sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA== - dependencies: - abort-controller "^3.0.0" - extend "^3.0.2" - https-proxy-agent "^5.0.0" - is-stream "^2.0.0" - node-fetch "^2.6.7" - -gcp-metadata@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-4.3.1.tgz#fb205fe6a90fef2fd9c85e6ba06e5559ee1eefa9" - integrity sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A== - dependencies: - gaxios "^4.0.0" - json-bigint "^1.0.0" - -get-intrinsic@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -google-auth-library@^7.0.2, google-auth-library@^7.14.0, google-auth-library@^7.6.2: - version "7.14.1" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-7.14.1.tgz#e3483034162f24cc71b95c8a55a210008826213c" - integrity sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA== - dependencies: - arrify "^2.0.0" - base64-js "^1.3.0" - ecdsa-sig-formatter "^1.0.11" - fast-text-encoding "^1.0.0" - gaxios "^4.0.0" - gcp-metadata "^4.2.0" - gtoken "^5.0.4" - jws "^4.0.0" - lru-cache "^6.0.0" - -google-p12-pem@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.1.4.tgz#123f7b40da204de4ed1fbf2fd5be12c047fc8b3b" - integrity sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg== - dependencies: - node-forge "^1.3.1" - -googleapis-common@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/googleapis-common/-/googleapis-common-5.1.0.tgz#845a79471c787e522e03c50d415467140e9e356a" - integrity sha512-RXrif+Gzhq1QAzfjxulbGvAY3FPj8zq/CYcvgjzDbaBNCD6bUl+86I7mUs4DKWHGruuK26ijjR/eDpWIDgNROA== - dependencies: - extend "^3.0.2" - gaxios "^4.0.0" - google-auth-library "^7.14.0" - qs "^6.7.0" - url-template "^2.0.8" - uuid "^8.0.0" - -googleapis@^84.0.0: - version "84.0.0" - resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-84.0.0.tgz#55b534b234c2df1af0b0f33c0394f31ac23a20d0" - integrity sha512-5WWLwmraulw3p55lu0gNpLz2FME1gcuR7QxgmUdAVHMiVN4LEasYjJV9p36gxcf2TMe6bn6+PgQ/63+CvBEgoQ== - dependencies: - google-auth-library "^7.0.2" - googleapis-common "^5.0.2" - -got@^11.7.0: - version "11.8.6" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== - 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" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.8: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -gtoken@^5.0.4: - version "5.3.2" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-5.3.2.tgz#deb7dc876abe002178e0515e383382ea9446d58f" - integrity sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ== - dependencies: - gaxios "^4.0.0" - google-p12-pem "^3.1.3" - jws "^4.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indent-string@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" - integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== - -inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inquirer-autocomplete-prompt-ipt@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/inquirer-autocomplete-prompt-ipt/-/inquirer-autocomplete-prompt-ipt-2.0.0.tgz#d5b170d3b1bd084e9e7671d1d6345929d7e5e99f" - integrity sha512-2qkl1lWeXbFN/O3+xdqJUdMfnNirvWKqgsgmhOjpOiVCcnJf+XYSEjFfdTgk+MDTtVt5AZiWR9Ji+f4YsWBdUw== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - figures "^3.1.0" - run-async "^2.3.0" - rxjs "^6.5.3" - -inquirer@^8.1.2: - version "8.2.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" - integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^6.0.1" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.5.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== - dependencies: - has "^1.0.3" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-interactive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" - integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-port-reachable@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-3.1.0.tgz#f6668d3bca9c36b07f737c48a8f875ab0653cd2b" - integrity sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A== - -is-reachable@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/is-reachable/-/is-reachable-5.2.1.tgz#4bba5ba32f60723404d5f95b7ecd895644c776f3" - integrity sha512-ViPrrlmt9FTTclYbz6mL/PFyF1TXSpJ9y/zw9QMVJxbhU/7DFkvk/5cTv7S0sXtqbJj32zZ+jKpNAjrYTUZBPQ== - dependencies: - arrify "^2.0.1" - got "^11.7.0" - is-port-reachable "^3.0.0" - p-any "^3.0.0" - p-timeout "^3.2.0" - prepend-http "^3.0.1" - router-ips "^1.0.0" - url-parse "^1.5.10" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-unicode-supported@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" - integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -jsonfile@^6.0.1, jsonfile@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jwa@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" - integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" - integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== - dependencies: - jwa "^2.0.0" - safe-buffer "^5.0.1" - -keyv@^4.0.0: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== - dependencies: - json-buffer "3.0.1" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -locate-path@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" - integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== - dependencies: - p-locate "^6.0.0" - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-symbols@^5.0.0, log-symbols@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" - integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== - dependencies: - chalk "^5.0.0" - is-unicode-supported "^1.1.0" - -loud-rejection@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-2.2.0.tgz#4255eb6e9c74045b0edc021fa7397ab655a8517c" - integrity sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ== - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.2" - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimatch@^3.0.4, minimatch@^3.0.5: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multimatch@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" - integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== - dependencies: - "@types/minimatch" "^3.0.3" - array-differ "^3.0.0" - array-union "^2.1.0" - arrify "^2.0.1" - minimatch "^3.0.4" - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -node-fetch@^2.6.7: - version "2.6.12" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" - integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -normalize-newline@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/normalize-newline/-/normalize-newline-4.1.0.tgz#47576ac687846b67bf1c163e938f1f00a8bacfcb" - integrity sha512-ff4jKqMI8Xl50/4Mms/9jPobzAV/UK+kXG2XJ/7AqOmxIx8mqfqTIHYxuAnEgJ2AQeBbLnlbmZ5+38Y9A0w/YA== - dependencies: - replace-buffer "^1.2.1" - -normalize-package-data@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.2.1: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - 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" - -ora@^6.0.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-6.3.1.tgz#a4e9e5c2cf5ee73c259e8b410273e706a2ad3ed6" - integrity sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ== - 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" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-any@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-any/-/p-any-3.0.0.tgz#79847aeed70b5d3a10ea625296c0c3d2e90a87b9" - integrity sha512-5rqbqfsRWNb0sukt0awwgJMlaep+8jV45S15SKKB34z4UuzjcofIfnriCBhWjZP2jbVtjt9yRl7buB6RlKsu9w== - dependencies: - p-cancelable "^2.0.0" - p-some "^5.0.0" - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-locate@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" - integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== - dependencies: - p-limit "^4.0.0" - -p-map@^5.1.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" - integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== - dependencies: - aggregate-error "^4.0.0" - -p-some@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-some/-/p-some-5.0.0.tgz#8b730c74b4fe5169d7264a240ad010b6ebc686a4" - integrity sha512-Js5XZxo6vHjB9NOYAzWDYAIyyiPvva0DWESAIWIK7uhSpGsyg5FwUPxipU/SOQx5x9EqhOh545d1jo6cVkitig== - dependencies: - aggregate-error "^3.0.0" - p-cancelable "^2.0.0" - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - 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" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" - integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -prepend-http@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-3.0.1.tgz#3e724d58fd5867465b300bb9615009fa2f8ee3b6" - integrity sha512-BLxfZh+m6UiAiCPZFJ4+vYoL7NrRs5XgCTRrjseATAggXhdZKKxn+JUNmuVYWY23bDHgaEHodxw8mnmtVEDtHw== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -qs@^6.7.0: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -read-pkg-up@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-8.0.0.tgz#72f595b65e66110f43b052dd9af4de6b10534670" - integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ== - dependencies: - find-up "^5.0.0" - read-pkg "^6.0.0" - type-fest "^1.0.1" - -read-pkg@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-6.0.0.tgz#a67a7d6a1c2b0c3cd6aa2ea521f40c458a4a504c" - integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^3.0.2" - parse-json "^5.2.0" - type-fest "^1.0.1" - -readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -replace-buffer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/replace-buffer/-/replace-buffer-1.2.1.tgz#6c188c61445ba91569284b17b8fa119f04a07eb0" - integrity sha512-ly3OKwKu+3T55DjP5PjIMzxgz9lFx6dQnBmAIxryZyRKl8f22juy12ShOyuq8WrQE5UlFOseZgQZDua0iF9DHw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-alpn@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== - dependencies: - lowercase-keys "^2.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -router-ips@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/router-ips/-/router-ips-1.0.0.tgz#44e00858ebebc0133d58e40b2cd8a1fbb04203f5" - integrity sha512-yBo6F52Un/WYioXbedBGvrKIiofbwt+4cUhdqDb9fNMJBI4D4jOy7jlxxaRVEvICPKU7xMmJDtDFR6YswX/sFQ== - -run-async@^2.3.0, run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -rxjs@^6.5.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@^7.5.5: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^6.0.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -server-destroy@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" - integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - -split-lines@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/split-lines/-/split-lines-3.0.0.tgz#b7ce0d1a853ed73e1f6963c95e31d8f6e957ad69" - integrity sha512-d0TpRBL/VfKDXsk8JxPF7zgF5pCUDdBMSlEL36xBgVeaX448t+yGXcJaikUyzkoKOJ0l6KpMfygzJU9naIuivw== - -stdin-discarder@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" - integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== - dependencies: - bl "^5.0.0" - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-5.0.0.tgz#88d2e135d154dca7a5e06b4a4ba9653b6bdc0dd2" - integrity sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts2gas@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ts2gas/-/ts2gas-4.2.0.tgz#7585c9865e88a5075b7c57beb5b70d04461d112f" - integrity sha512-5xZugaeM3wKQPj/vrWnrtYjNh4xnIz6cGSW/smCe9OTmkh1+KvHpm7M7HLq/OnBaljf4+yKctC4AYimBi4T1/Q== - dependencies: - type-fest "^2.1.0" - typescript "^4.4.2" - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" - integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -type-fest@^2.1.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -typescript@^4.0.5, typescript@^4.4.2: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -url-parse@^1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url-template@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^8.0.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -wrap-ansi@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== diff --git a/packages/ertp-clerk/package-lock.json b/packages/ertp-clerk/package-lock.json deleted file mode 100644 index ecb7237..0000000 --- a/packages/ertp-clerk/package-lock.json +++ /dev/null @@ -1,2900 +0,0 @@ -{ - "name": "ertp-clerk", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "ertp-clerk", - "version": "0.0.0", - "dependencies": { - "capnweb": "^0.4.0", - "drizzle-orm": "^0.44.5" - }, - "devDependencies": { - "@types/node": "^24.0.0", - "patch-package": "^8.0.1", - "wrangler": "^4.59.2" - } - }, - "../ertp-ledgerguise": { - "name": "@finquick/ertp-ledgerguise", - "version": "0.0.1", - "extraneous": true, - "dependencies": { - "@agoric/ertp": "*", - "better-sqlite3": "^12.6.0" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.1", - "ava": "^5.3.1", - "ts-node": "^10.9.2", - "typescript": "~5.9.3" - } - }, - "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", - "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", - "dev": true, - "license": "MIT OR Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@cloudflare/unenv-preset": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.10.0.tgz", - "integrity": "sha512-/uII4vLQXhzCAZzEVeYAjFLBNg2nqTJ1JGzd2lRF6ItYe6U2zVoYGfeKpGx/EkBF6euiU+cyBXgMdtJih+nQ6g==", - "dev": true, - "license": "MIT OR Apache-2.0", - "peerDependencies": { - "unenv": "2.0.0-rc.24", - "workerd": "^1.20251221.0" - }, - "peerDependenciesMeta": { - "workerd": { - "optional": true - } - } - }, - "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20260114.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260114.0.tgz", - "integrity": "sha512-HNlsRkfNgardCig2P/5bp/dqDECsZ4+NU5XewqArWxMseqt3C5daSuptI620s4pn7Wr0ZKg7jVLH0PDEBkA+aA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20260114.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260114.0.tgz", - "integrity": "sha512-qyE1UdFnAlxzb+uCfN/d9c8icch7XRiH49/DjoqEa+bCDihTuRS7GL1RmhVIqHJhb3pX3DzxmKgQZBDBL83Inw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20260114.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260114.0.tgz", - "integrity": "sha512-Z0BLvAj/JPOabzads2ddDEfgExWTlD22pnwsuNbPwZAGTSZeQa3Y47eGUWyHk+rSGngknk++S7zHTGbKuG7RRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20260114.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260114.0.tgz", - "integrity": "sha512-kPUmEtUxUWlr9PQ64kuhdK0qyo8idPe5IIXUgi7xCD7mDd6EOe5J7ugDpbfvfbYKEjx4DpLvN2t45izyI/Sodw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20260114.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260114.0.tgz", - "integrity": "sha512-MJnKgm6i1jZGyt2ZHQYCnRlpFTEZcK2rv9y7asS3KdVEXaDgGF8kOns5u6YL6/+eMogfZuHRjfDS+UqRTUYIFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", - "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", - "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", - "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", - "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", - "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", - "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", - "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", - "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", - "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", - "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", - "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", - "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", - "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", - "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", - "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", - "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", - "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", - "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", - "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", - "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", - "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", - "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", - "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", - "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", - "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", - "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "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": ">=6.0.0" - } - }, - "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/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@poppinss/colors": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", - "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^4.1.5" - } - }, - "node_modules/@poppinss/dumper": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", - "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@poppinss/colors": "^4.1.5", - "@sindresorhus/is": "^7.0.2", - "supports-color": "^10.0.0" - } - }, - "node_modules/@poppinss/exception": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", - "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", - "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@speed-highlight/core": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.14.tgz", - "integrity": "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@types/node": { - "version": "24.10.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", - "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/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", - "optional": true, - "peer": true - }, - "node_modules/better-sqlite3": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.6.2.tgz", - "integrity": "sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - }, - "engines": { - "node": "20.x || 22.x || 23.x || 24.x || 25.x" - } - }, - "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", - "optional": true, - "peer": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "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", - "optional": true, - "peer": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/blake3-wasm": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", - "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", - "dev": true, - "license": "MIT" - }, - "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": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "optional": true, - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "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==", - "dev": true, - "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/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/capnweb": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/capnweb/-/capnweb-0.4.0.tgz", - "integrity": "sha512-OgqPQcxnrAIqjrkAuwI4N9MP/mzseM5w9oLWb/oU63KveBJl1c8p41etLSVQUlYFiAYZu+h6/LJxKaDJd93xFw==", - "license": "MIT" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC", - "optional": true, - "peer": true - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "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==", - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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", - "optional": true, - "peer": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "optional": true, - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "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==", - "dev": true, - "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/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/drizzle-orm": { - "version": "0.44.7", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.44.7.tgz", - "integrity": "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ==", - "license": "Apache-2.0", - "peerDependencies": { - "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=4", - "@electric-sql/pglite": ">=0.2.0", - "@libsql/client": ">=0.10.0", - "@libsql/client-wasm": ">=0.10.0", - "@neondatabase/serverless": ">=0.10.0", - "@op-engineering/op-sqlite": ">=2", - "@opentelemetry/api": "^1.4.1", - "@planetscale/database": ">=1.13", - "@prisma/client": "*", - "@tidbcloud/serverless": "*", - "@types/better-sqlite3": "*", - "@types/pg": "*", - "@types/sql.js": "*", - "@upstash/redis": ">=1.34.7", - "@vercel/postgres": ">=0.8.0", - "@xata.io/client": "*", - "better-sqlite3": ">=7", - "bun-types": "*", - "expo-sqlite": ">=14.0.0", - "gel": ">=2", - "knex": "*", - "kysely": "*", - "mysql2": ">=2", - "pg": ">=8", - "postgres": ">=3", - "sql.js": ">=1", - "sqlite3": ">=5" - }, - "peerDependenciesMeta": { - "@aws-sdk/client-rds-data": { - "optional": true - }, - "@cloudflare/workers-types": { - "optional": true - }, - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@libsql/client-wasm": { - "optional": true - }, - "@neondatabase/serverless": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@prisma/client": { - "optional": true - }, - "@tidbcloud/serverless": { - "optional": true - }, - "@types/better-sqlite3": { - "optional": true - }, - "@types/pg": { - "optional": true - }, - "@types/sql.js": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/postgres": { - "optional": true - }, - "@xata.io/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "bun-types": { - "optional": true - }, - "expo-sqlite": { - "optional": true - }, - "gel": { - "optional": true - }, - "knex": { - "optional": true - }, - "kysely": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "postgres": { - "optional": true - }, - "prisma": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - } - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/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", - "optional": true, - "peer": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-stack-parser-es": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", - "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", - "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.0", - "@esbuild/android-arm": "0.27.0", - "@esbuild/android-arm64": "0.27.0", - "@esbuild/android-x64": "0.27.0", - "@esbuild/darwin-arm64": "0.27.0", - "@esbuild/darwin-x64": "0.27.0", - "@esbuild/freebsd-arm64": "0.27.0", - "@esbuild/freebsd-x64": "0.27.0", - "@esbuild/linux-arm": "0.27.0", - "@esbuild/linux-arm64": "0.27.0", - "@esbuild/linux-ia32": "0.27.0", - "@esbuild/linux-loong64": "0.27.0", - "@esbuild/linux-mips64el": "0.27.0", - "@esbuild/linux-ppc64": "0.27.0", - "@esbuild/linux-riscv64": "0.27.0", - "@esbuild/linux-s390x": "0.27.0", - "@esbuild/linux-x64": "0.27.0", - "@esbuild/netbsd-arm64": "0.27.0", - "@esbuild/netbsd-x64": "0.27.0", - "@esbuild/openbsd-arm64": "0.27.0", - "@esbuild/openbsd-x64": "0.27.0", - "@esbuild/openharmony-arm64": "0.27.0", - "@esbuild/sunos-x64": "0.27.0", - "@esbuild/win32-arm64": "0.27.0", - "@esbuild/win32-ia32": "0.27.0", - "@esbuild/win32-x64": "0.27.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)", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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", - "optional": true, - "peer": true - }, - "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": ">=8" - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "micromatch": "^4.0.2" - } - }, - "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", - "optional": true, - "peer": true - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/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", - "optional": true, - "peer": true - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/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", - "optional": true, - "peer": true - }, - "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", - "optional": true, - "peer": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC", - "optional": true, - "peer": true - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-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": ">=0.12.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/json-stable-stringify": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", - "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "isarray": "^2.0.5", - "jsonify": "^0.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "dev": true, - "license": "Public Domain", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/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": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "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", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/miniflare": { - "version": "4.20260114.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260114.0.tgz", - "integrity": "sha512-QwHT7S6XqGdQxIvql1uirH/7/i3zDEt0B/YBXTYzMfJtVCR4+ue3KPkU+Bl0zMxvpgkvjh9+eCHhJbKEqya70A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "0.8.1", - "sharp": "^0.34.5", - "undici": "7.14.0", - "workerd": "1.20260114.0", - "ws": "8.18.0", - "youch": "4.1.0-beta.10", - "zod": "^3.25.76" - }, - "bin": { - "miniflare": "bootstrap.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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", - "optional": true, - "peer": true - }, - "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", - "optional": true, - "peer": true - }, - "node_modules/node-abi": { - "version": "3.86.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.86.0.tgz", - "integrity": "sha512-sn9Et4N3ynsetj3spsZR729DVlGH6iBG4RiDMV7HEp3guyOW6W3S0unGpLDxT50mXortGUMax/ykUNQXdqc/Xg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "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": ">= 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", - "optional": true, - "peer": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/patch-package": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", - "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "ci-info": "^3.7.0", - "cross-spawn": "^7.0.3", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^10.0.0", - "json-stable-stringify": "^1.0.2", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "semver": "^7.5.3", - "slash": "^2.0.0", - "tmp": "^0.2.4", - "yaml": "^2.2.2" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "node": ">=14", - "npm": ">5" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT" - }, - "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/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/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", - "optional": true, - "peer": true, - "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": "^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": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "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", - "optional": true, - "peer": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "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)", - "optional": true, - "peer": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/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, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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", - "optional": true, - "peer": true - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "devOptional": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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, - "peer": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "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, - "peer": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", - "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "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" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/undici": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz", - "integrity": "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unenv": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", - "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pathe": "^2.0.3" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workerd": { - "version": "1.20260114.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260114.0.tgz", - "integrity": "sha512-kTJ+jNdIllOzWuVA3NRQRvywP0T135zdCjAE2dAUY1BFbxM6fmMZV8BbskEoQ4hAODVQUfZQmyGctcwvVCKxFA==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "bin": { - "workerd": "bin/workerd" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20260114.0", - "@cloudflare/workerd-darwin-arm64": "1.20260114.0", - "@cloudflare/workerd-linux-64": "1.20260114.0", - "@cloudflare/workerd-linux-arm64": "1.20260114.0", - "@cloudflare/workerd-windows-64": "1.20260114.0" - } - }, - "node_modules/wrangler": { - "version": "4.59.2", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.59.2.tgz", - "integrity": "sha512-Z4xn6jFZTaugcOKz42xvRAYKgkVUERHVbuCJ5+f+gK+R6k12L02unakPGOA0L0ejhUl16dqDjKe4tmL9sedHcw==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "@cloudflare/kv-asset-handler": "0.4.2", - "@cloudflare/unenv-preset": "2.10.0", - "blake3-wasm": "2.1.5", - "esbuild": "0.27.0", - "miniflare": "4.20260114.0", - "path-to-regexp": "6.3.0", - "unenv": "2.0.0-rc.24", - "workerd": "1.20260114.0" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" - }, - "engines": { - "node": ">=20.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@cloudflare/workers-types": "^4.20260114.0" - }, - "peerDependenciesMeta": { - "@cloudflare/workers-types": { - "optional": true - } - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC", - "optional": true, - "peer": true - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/youch": { - "version": "4.1.0-beta.10", - "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", - "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@poppinss/colors": "^4.1.5", - "@poppinss/dumper": "^0.6.4", - "@speed-highlight/core": "^1.2.7", - "cookie": "^1.0.2", - "youch-core": "^0.3.3" - } - }, - "node_modules/youch-core": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", - "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@poppinss/exception": "^1.2.2", - "error-stack-parser-es": "^1.0.5" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/packages/ertp-ledgerguise/package-lock.json b/packages/ertp-ledgerguise/package-lock.json deleted file mode 100644 index b31383b..0000000 --- a/packages/ertp-ledgerguise/package-lock.json +++ /dev/null @@ -1,3124 +0,0 @@ -{ - "name": "@finquick/ertp-ledgerguise", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@finquick/ertp-ledgerguise", - "version": "0.0.1", - "dependencies": { - "@agoric/ertp": "*", - "better-sqlite3": "^12.6.0" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.1", - "ava": "^5.3.1", - "ts-node": "^10.9.2", - "typescript": "~5.9.3" - } - }, - "node_modules/@agoric/base-zone": { - "version": "0.2.0-u22.1", - "resolved": "https://registry.npmjs.org/@agoric/base-zone/-/base-zone-0.2.0-u22.1.tgz", - "integrity": "sha512-8NTFVvpgbNxYY4CU3iaRBXR1TOJ/qoz1zJW8on10wxmxSZF1/upPRX7vYOXSnfNa6RXnKYtQuF7Ub56i2xualQ==", - "license": "Apache-2.0", - "dependencies": { - "@agoric/store": "0.10.0-u22.1", - "@endo/common": "^1.2.13", - "@endo/errors": "^1.2.13", - "@endo/exo": "^1.5.12", - "@endo/far": "^1.1.14", - "@endo/pass-style": "^1.6.3", - "@endo/patterns": "^1.7.0" - }, - "engines": { - "node": "^20.9 || ^22.11" - } - }, - "node_modules/@agoric/ertp": { - "version": "0.17.0-u22.2", - "resolved": "https://registry.npmjs.org/@agoric/ertp/-/ertp-0.17.0-u22.2.tgz", - "integrity": "sha512-GuAeA1Stzo/TBYVyZIV/E+Jdhhv1/17H1n76tuN73Ab+Q04CZKC3ynHIHz4T60wQv+3OLyyJ7qA3LVGGBCMZRw==", - "license": "Apache-2.0", - "dependencies": { - "@agoric/notifier": "0.7.0-u22.2", - "@agoric/store": "0.10.0-u22.1", - "@agoric/vat-data": "0.6.0-u22.2", - "@agoric/zone": "0.3.0-u22.2", - "@endo/errors": "^1.2.13", - "@endo/eventual-send": "^1.3.4", - "@endo/far": "^1.1.14", - "@endo/marshal": "^1.8.0", - "@endo/nat": "^5.1.3", - "@endo/patterns": "^1.7.0", - "@endo/promise-kit": "^1.1.13" - }, - "engines": { - "node": "^20.9 || ^22.11" - } - }, - "node_modules/@agoric/internal": { - "version": "0.4.0-u22.2", - "resolved": "https://registry.npmjs.org/@agoric/internal/-/internal-0.4.0-u22.2.tgz", - "integrity": "sha512-AthCoZpId1RSAibdi1+PnFeQ3T4Zy2TjdaResfWdAge5fEBMa3NLNnYJhMFV6ijrYFyLr/XbhVO20crRje+5Kw==", - "license": "Apache-2.0", - "dependencies": { - "@agoric/base-zone": "0.2.0-u22.1", - "@endo/common": "^1.2.13", - "@endo/compartment-mapper": "^1.6.3", - "@endo/errors": "^1.2.13", - "@endo/eventual-send": "^1.3.4", - "@endo/far": "^1.1.14", - "@endo/init": "^1.1.12", - "@endo/marshal": "^1.8.0", - "@endo/nat": "^5.1.3", - "@endo/pass-style": "^1.6.3", - "@endo/patterns": "^1.7.0", - "@endo/promise-kit": "^1.1.13", - "@endo/stream": "^1.2.13", - "anylogger": "^0.21.0", - "jessie.js": "^0.3.4" - }, - "engines": { - "node": "^20.9 || ^22.11" - } - }, - "node_modules/@agoric/notifier": { - "version": "0.7.0-u22.2", - "resolved": "https://registry.npmjs.org/@agoric/notifier/-/notifier-0.7.0-u22.2.tgz", - "integrity": "sha512-Rpp5V/MdW4YLwyBoN/Mie0Rd9wMHMobYFtXiqHZCqGmukRjd+srl0u7B27gE2pMiGAPAjNXKILyVAc1838gyPw==", - "license": "Apache-2.0", - "dependencies": { - "@agoric/internal": "0.4.0-u22.2", - "@agoric/vat-data": "0.6.0-u22.2", - "@endo/errors": "^1.2.13", - "@endo/far": "^1.1.14", - "@endo/marshal": "^1.8.0", - "@endo/patterns": "^1.7.0", - "@endo/promise-kit": "^1.1.13" - }, - "engines": { - "node": "^20.9 || ^22.11" - } - }, - "node_modules/@agoric/store": { - "version": "0.10.0-u22.1", - "resolved": "https://registry.npmjs.org/@agoric/store/-/store-0.10.0-u22.1.tgz", - "integrity": "sha512-Ff2/AvwYEnx2VTavZlN+OgmcOSXtsHgrS+UjxfU+hTpblrgGlnjHl9MFRKbOx5j23yZ5QXJ7rFuZfpPm85hwZg==", - "license": "Apache-2.0", - "dependencies": { - "@endo/errors": "^1.2.13", - "@endo/exo": "^1.5.12", - "@endo/marshal": "^1.8.0", - "@endo/pass-style": "^1.6.3", - "@endo/patterns": "^1.7.0" - }, - "engines": { - "node": "^20.9 || ^22.11" - } - }, - "node_modules/@agoric/swingset-liveslots": { - "version": "0.11.0-u22.2", - "resolved": "https://registry.npmjs.org/@agoric/swingset-liveslots/-/swingset-liveslots-0.11.0-u22.2.tgz", - "integrity": "sha512-/3lGNtpAx5nsu9NchiNa5uG1Fj5+eV10GlZIk7lD0CE/cUwUm1l7Ky6wOq44Ku8FbdS3pBtK1wcTsmA3M+gJSA==", - "license": "Apache-2.0", - "dependencies": { - "@agoric/internal": "0.4.0-u22.2", - "@agoric/store": "0.10.0-u22.1", - "@endo/env-options": "^1.1.11", - "@endo/errors": "^1.2.13", - "@endo/eventual-send": "^1.3.4", - "@endo/exo": "^1.5.12", - "@endo/far": "^1.1.14", - "@endo/init": "^1.1.12", - "@endo/marshal": "^1.8.0", - "@endo/nat": "^5.1.3", - "@endo/pass-style": "^1.6.3", - "@endo/patterns": "^1.7.0", - "@endo/promise-kit": "^1.1.13" - }, - "engines": { - "node": "^20.9 || ^22.11" - } - }, - "node_modules/@agoric/vat-data": { - "version": "0.6.0-u22.2", - "resolved": "https://registry.npmjs.org/@agoric/vat-data/-/vat-data-0.6.0-u22.2.tgz", - "integrity": "sha512-oqaNq6hNNFJEuUXHFop/HDQI3LS9px1nvcRQjKbkHT4rTdnoAkePwT8QPCQ+83V+FS3TfsSFUIAFQoKyEYvaAg==", - "license": "Apache-2.0", - "dependencies": { - "@agoric/base-zone": "0.2.0-u22.1", - "@agoric/store": "0.10.0-u22.1", - "@agoric/swingset-liveslots": "0.11.0-u22.2", - "@endo/errors": "^1.2.13", - "@endo/exo": "^1.5.12", - "@endo/patterns": "^1.7.0" - }, - "engines": { - "node": "^20.9 || ^22.11" - } - }, - "node_modules/@agoric/zone": { - "version": "0.3.0-u22.2", - "resolved": "https://registry.npmjs.org/@agoric/zone/-/zone-0.3.0-u22.2.tgz", - "integrity": "sha512-YUO8LSedS4rPdvFIuljdVW+PRIygrtjvnVfCcAjIY+8uY1xn7+7I4+TVnB0XBmqxvcwS/5Ffcc1KuVcjBlqnIw==", - "license": "Apache-2.0", - "dependencies": { - "@agoric/base-zone": "0.2.0-u22.1", - "@agoric/vat-data": "0.6.0-u22.2", - "@endo/errors": "^1.2.13", - "@endo/far": "^1.1.14", - "@endo/pass-style": "^1.6.3" - }, - "engines": { - "node": "^20.9 || ^22.11" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/generator/node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.10" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@endo/base64": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@endo/base64/-/base64-1.0.12.tgz", - "integrity": "sha512-opxoUVA4GuibR5S3CVFo8iyrYrXjN0XWJQSr9EKj4A8viQAcRm/7IQtyoF26F9PFgY3r11ihBswBMZUySnfXkg==", - "license": "Apache-2.0" - }, - "node_modules/@endo/cache-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@endo/cache-map/-/cache-map-1.1.0.tgz", - "integrity": "sha512-owFGshs/97PDw9oguZqU/px8Lv1d0KjAUtDUiPwKHNXRVUE/jyettEbRoTbNJR1OaI8biMn6bHr9kVJsOh6dXw==", - "license": "Apache-2.0" - }, - "node_modules/@endo/cjs-module-analyzer": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@endo/cjs-module-analyzer/-/cjs-module-analyzer-1.0.11.tgz", - "integrity": "sha512-zS+SjeUN4y7Ry7l0DSME05gUekLrfIZnhZ66q+1674BkQc4dk1eub2ZLgPDGoXOrBLtcadc7yxHwazilmMoQLQ==", - "license": "Apache-2.0" - }, - "node_modules/@endo/common": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@endo/common/-/common-1.2.13.tgz", - "integrity": "sha512-DUO8u5U4+7GaOpnQHWR3dNRsWFF4WsllI3kB7bzOzhj6lqBYOBGavTDjI69N/9vJQ5X2DJ0f2OEYtf6jQCjYwg==", - "license": "Apache-2.0", - "dependencies": { - "@endo/errors": "^1.2.13", - "@endo/eventual-send": "^1.3.4", - "@endo/promise-kit": "^1.1.13" - } - }, - "node_modules/@endo/compartment-mapper": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@endo/compartment-mapper/-/compartment-mapper-1.6.3.tgz", - "integrity": "sha512-jo8g684OMXXsBne8exczjwcN2FK+IHDq/SL/B+y2QPk+fdRtqBH9tTaD1KV7yCJ4mJSbNGaUllkw/qtbeo9y1Q==", - "license": "Apache-2.0", - "dependencies": { - "@endo/cjs-module-analyzer": "^1.0.11", - "@endo/module-source": "^1.3.3", - "@endo/path-compare": "^1.1.0", - "@endo/trampoline": "^1.0.5", - "@endo/zip": "^1.0.11", - "ses": "^1.14.0" - } - }, - "node_modules/@endo/env-options": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@endo/env-options/-/env-options-1.1.11.tgz", - "integrity": "sha512-p9OnAPsdqoX4YJsE98e3NBVhIr2iW9gNZxHhAI2/Ul5TdRfoOViItzHzTqrgUVopw6XxA1u1uS6CykLMDUxarA==", - "license": "Apache-2.0" - }, - "node_modules/@endo/errors": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@endo/errors/-/errors-1.2.13.tgz", - "integrity": "sha512-cRRfsVTWfAnw/B2tT+OgN6oZ8JVZM06QVPyKD6Oo12qJX39oonJfyuf3SKFo7Ii4lh5mt5v+5iHqzsQ4xHjvIQ==", - "license": "Apache-2.0", - "dependencies": { - "ses": "^1.14.0" - } - }, - "node_modules/@endo/eventual-send": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@endo/eventual-send/-/eventual-send-1.3.4.tgz", - "integrity": "sha512-Pn3ArDN2ar1rJ6VYmtMJFYtihSJCUymKYWq17kvKqS+PlFvoP69M3UYP2ly5Dz+nOnW14Kvdhkui6/hcwB0n0w==", - "license": "Apache-2.0", - "dependencies": { - "@endo/env-options": "^1.1.11" - } - }, - "node_modules/@endo/exo": { - "version": "1.5.12", - "resolved": "https://registry.npmjs.org/@endo/exo/-/exo-1.5.12.tgz", - "integrity": "sha512-UhFoYIQ9mJIc4xE1SQPRCNvZ+kIpVuWUSt8SpjvXCpiuYd/M9fpT3o1SClfu/yvj6v6cUtFmcvqk7HYREtFPjQ==", - "license": "Apache-2.0", - "dependencies": { - "@endo/common": "^1.2.13", - "@endo/env-options": "^1.1.11", - "@endo/errors": "^1.2.13", - "@endo/eventual-send": "^1.3.4", - "@endo/far": "^1.1.14", - "@endo/pass-style": "^1.6.3", - "@endo/patterns": "^1.7.0" - } - }, - "node_modules/@endo/far": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@endo/far/-/far-1.1.14.tgz", - "integrity": "sha512-OlM+yCNWVqhwSZa6MyjkVB0oQSTAQ15KoiDGL1qowtnTnhuGUbOXuaUAsDf4eAJZ4L+h2KsJOUdyYEuhNsDPLg==", - "license": "Apache-2.0", - "dependencies": { - "@endo/errors": "^1.2.13", - "@endo/eventual-send": "^1.3.4", - "@endo/pass-style": "^1.6.3" - } - }, - "node_modules/@endo/immutable-arraybuffer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@endo/immutable-arraybuffer/-/immutable-arraybuffer-1.1.2.tgz", - "integrity": "sha512-u+NaYB2aqEugQ3u7w3c5QNkPogf8q/xGgsPaqdY6pUiGWtYiTiFspKFcha6+oeZhWXWQ23rf0KrUq0kfuzqYyQ==", - "license": "Apache-2.0" - }, - "node_modules/@endo/init": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@endo/init/-/init-1.1.12.tgz", - "integrity": "sha512-6Q0IhmL8NPh1ATnLULO03X6hEqFpkO97ms1pmAdyJg0+vrPuTcRHULP9oRVghVY12o/yDGg8tumDk4+CUUv6zw==", - "license": "Apache-2.0", - "dependencies": { - "@endo/base64": "^1.0.12", - "@endo/eventual-send": "^1.3.4", - "@endo/lockdown": "^1.0.18", - "@endo/promise-kit": "^1.1.13" - } - }, - "node_modules/@endo/lockdown": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/@endo/lockdown/-/lockdown-1.0.18.tgz", - "integrity": "sha512-dv9gpnEM5VdOW1WkY6dwQSqlTuNgkZMHOPNcEGZmpzYcT+0U6VjfSjo0wumxyej+T4K7Y6FwgSPLXwHqGXFANw==", - "license": "Apache-2.0", - "dependencies": { - "ses": "^1.14.0" - } - }, - "node_modules/@endo/marshal": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@endo/marshal/-/marshal-1.8.0.tgz", - "integrity": "sha512-TsjZUAYo6BwewNFvv1rzgLkogee3f2Z+xIF5d4TQOBVcgtOR/uvDhx7XmmtFwYDnq90UzPo/f0ffmR47micduA==", - "license": "Apache-2.0", - "dependencies": { - "@endo/common": "^1.2.13", - "@endo/env-options": "^1.1.11", - "@endo/errors": "^1.2.13", - "@endo/eventual-send": "^1.3.4", - "@endo/nat": "^5.1.3", - "@endo/pass-style": "^1.6.3", - "@endo/promise-kit": "^1.1.13" - } - }, - "node_modules/@endo/module-source": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@endo/module-source/-/module-source-1.3.3.tgz", - "integrity": "sha512-BsnzQDVxHVdE5otMextsqZvXEko1N+djde1Y/lrbZp+/gn0x9O9x30ZUG8Yt84Vob4sxjL9I7piTVE/px5cuog==", - "license": "Apache-2.0", - "dependencies": { - "@babel/generator": "^7.26.3", - "@babel/parser": "~7.26.2", - "@babel/traverse": "~7.25.9", - "@babel/types": "~7.26.0", - "ses": "^1.14.0" - } - }, - "node_modules/@endo/nat": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@endo/nat/-/nat-5.1.3.tgz", - "integrity": "sha512-+uRT6/hrAxEup2SOZYD2GJpnVaQQ6bx4Txxv9n+Whr1yVM8fL15fAY2NUTwpAJpGAPZA0uwreW+Wf4lmePq0Nw==", - "license": "Apache-2.0" - }, - "node_modules/@endo/pass-style": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@endo/pass-style/-/pass-style-1.6.3.tgz", - "integrity": "sha512-dVcLC0+ApxoI4T+kaEsbuS/u4ai7zXDw831otd3pYGn7la/eJ9Lu6g2qOduE1vtY2BFOI46N91/dtIBni7R6yg==", - "license": "Apache-2.0", - "dependencies": { - "@endo/common": "^1.2.13", - "@endo/env-options": "^1.1.11", - "@endo/errors": "^1.2.13", - "@endo/eventual-send": "^1.3.4", - "@endo/promise-kit": "^1.1.13" - } - }, - "node_modules/@endo/path-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@endo/path-compare/-/path-compare-1.1.0.tgz", - "integrity": "sha512-dKBykUBpZPLvvxB8CqOzSl1kJ9Bv4gzig34E5n2LQRj2xULaUjdgBm8DtMkORpIOPLrvJKWMoispwSlRXL/7OA==", - "license": "Apache-2.0" - }, - "node_modules/@endo/patterns": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@endo/patterns/-/patterns-1.7.0.tgz", - "integrity": "sha512-jf/4sq8psz+E9CGLyU99J0zz9Y3xRod7XpcQ7TIC0vjTRfEoIMhNTKZWCYoDQKpIuvtEdgnL3ixikrtS2QILKA==", - "license": "Apache-2.0", - "dependencies": { - "@endo/common": "^1.2.13", - "@endo/errors": "^1.2.13", - "@endo/eventual-send": "^1.3.4", - "@endo/marshal": "^1.8.0", - "@endo/pass-style": "^1.6.3", - "@endo/promise-kit": "^1.1.13" - } - }, - "node_modules/@endo/promise-kit": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@endo/promise-kit/-/promise-kit-1.1.13.tgz", - "integrity": "sha512-2hPhjy8sG+C9gg2XJMSVpQW5PqidAf0SfjciR3eLXzA/2gpqxotSbA/9TvvuHIR4zGKTXfUrk53lQAHYq+96ug==", - "license": "Apache-2.0", - "dependencies": { - "ses": "^1.14.0" - }, - "engines": { - "node": ">=11.0" - } - }, - "node_modules/@endo/stream": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@endo/stream/-/stream-1.2.13.tgz", - "integrity": "sha512-ZXkmEjH4i750jd1WJEq50ruVFjAFbIDoABQRUGGQCfwlFHCwz5mU9t7Gs0dvyl3LCNbbX3dtRuSqqMMrpkfbCA==", - "license": "Apache-2.0", - "dependencies": { - "@endo/eventual-send": "^1.3.4", - "@endo/promise-kit": "^1.1.13", - "ses": "^1.14.0" - } - }, - "node_modules/@endo/trampoline": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@endo/trampoline/-/trampoline-1.0.5.tgz", - "integrity": "sha512-75sXj6cvvJ7qpD8UVoUVTEQRay/X6y5OrFYH48iFEmTg1SJcEQlldjMI4mrvOyuHjtr+KnVlNr+zmrhAUtLm0w==", - "license": "Apache-2.0" - }, - "node_modules/@endo/zip": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@endo/zip/-/zip-1.0.11.tgz", - "integrity": "sha512-gx73xEyRFH3V/63eZAhrw1+t4tnpLG9n5RYzBwl3LR5mrtbrguGvx7fPoFww+oxjmkAgvGQUMVuJuqf11alAcg==", - "license": "Apache-2.0" - }, - "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==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@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==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "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": { - "@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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/better-sqlite3": { - "version": "7.6.13", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", - "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "25.0.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.5.tgz", - "integrity": "sha512-FuLxeLuSVOqHPxSN1fkcD8DLU21gAP7nCKqGRJ/FglbCUBs0NYN6TpHcdmyLeh8C0KwGIaZQJSv+OYG+KZz+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "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", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/chalk/ansi-regex?sponsor=1" - } - }, - "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": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anylogger": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/anylogger/-/anylogger-0.21.0.tgz", - "integrity": "sha512-XJVplwflEff43l7aE48lW9gNoS0fpb1Ha4WttzjfTFlN3uJUIKALZ5oNWtwgRXPm/Q2dbp1EIddMbQ/AGHVX1A==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrgv": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", - "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ava/-/ava-5.3.1.tgz", - "integrity": "sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.8.2", - "acorn-walk": "^8.2.0", - "ansi-styles": "^6.2.1", - "arrgv": "^1.0.2", - "arrify": "^3.0.0", - "callsites": "^4.0.0", - "cbor": "^8.1.0", - "chalk": "^5.2.0", - "chokidar": "^3.5.3", - "chunkd": "^2.0.1", - "ci-info": "^3.8.0", - "ci-parallel-vars": "^1.0.1", - "clean-yaml-object": "^0.1.0", - "cli-truncate": "^3.1.0", - "code-excerpt": "^4.0.0", - "common-path-prefix": "^3.0.0", - "concordance": "^5.0.4", - "currently-unhandled": "^0.4.1", - "debug": "^4.3.4", - "emittery": "^1.0.1", - "figures": "^5.0.0", - "globby": "^13.1.4", - "ignore-by-default": "^2.1.0", - "indent-string": "^5.0.0", - "is-error": "^2.2.2", - "is-plain-object": "^5.0.0", - "is-promise": "^4.0.0", - "matcher": "^5.0.0", - "mem": "^9.0.2", - "ms": "^2.1.3", - "p-event": "^5.0.1", - "p-map": "^5.5.0", - "picomatch": "^2.3.1", - "pkg-conf": "^4.0.0", - "plur": "^5.1.0", - "pretty-ms": "^8.0.0", - "resolve-cwd": "^3.0.0", - "stack-utils": "^2.0.6", - "strip-ansi": "^7.0.1", - "supertap": "^3.0.1", - "temp-dir": "^3.0.0", - "write-file-atomic": "^5.0.1", - "yargs": "^17.7.2" - }, - "bin": { - "ava": "entrypoints/cli.mjs" - }, - "engines": { - "node": ">=14.19 <15 || >=16.15 <17 || >=18" - }, - "peerDependencies": { - "@ava/typescript": "*" - }, - "peerDependenciesMeta": { - "@ava/typescript": { - "optional": true - } - } - }, - "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/better-sqlite3": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.6.0.tgz", - "integrity": "sha512-FXI191x+D6UPWSze5IzZjhz+i9MK9nsuHsmTX9bXVl52k06AfZ2xql0lrgIUuzsMsJ7Vgl5kIptvDgBLIV3ZSQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - }, - "engines": { - "node": "20.x || 22.x || 23.x || 24.x || 25.x" - } - }, - "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==", - "dev": true, - "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/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/blueimp-md5": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", - "dev": true, - "license": "MIT" - }, - "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": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/callsites": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", - "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", - "dev": true, - "license": "MIT", - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=12.19" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/chunkd": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", - "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ci-parallel-vars": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", - "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "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/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "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==", - "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/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/code-excerpt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", - "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "convert-to-spaces": "^2.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true, - "license": "ISC" - }, - "node_modules/concordance": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", - "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "date-time": "^3.1.0", - "esutils": "^2.0.3", - "fast-diff": "^1.2.0", - "js-string-escape": "^1.0.1", - "lodash": "^4.17.15", - "md5-hex": "^3.0.1", - "semver": "^7.3.2", - "well-known-symbols": "^2.0.0" - }, - "engines": { - "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" - } - }, - "node_modules/convert-to-spaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", - "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/date-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", - "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "time-zone": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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/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/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": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "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-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/emittery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.2.0.tgz", - "integrity": "sha512-KxdRyyFcS85pH3dnU8Y5yFUm2YJdaHwcBZWrfG8o89ZY9a13/f9itbN+YG3ELbBo9Pg5zvIozstmuV8bX13q6g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "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/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": { - "once": "^1.4.0" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": ">=4" - } - }, - "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": ">=0.10.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": ">=6" - } - }, - "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": { - "@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": ">=8.6.0" - } - }, - "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": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/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-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "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" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", - "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10 <11 || >=12 <13 || >=14" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "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/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-error": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", - "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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": ">=0.12.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jessie.js": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/jessie.js/-/jessie.js-0.3.4.tgz", - "integrity": "sha512-JYJm6nXuFIO/X6OWLBatorgqmFVYbenqnFP0UDalO2OQ6sn58VeJ3cKtMQ0l0TM0JnCx4wKhyO4BQQ/ilxjd6g==", - "license": "Apache-2.0", - "dependencies": { - "@endo/far": "^1.0.0" - } - }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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": "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", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/load-json-file": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", - "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/matcher": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", - "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/md5-hex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", - "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", - "dev": true, - "license": "MIT", - "dependencies": { - "blueimp-md5": "^2.10.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mem": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", - "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", - "dev": true, - "license": "MIT", - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "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", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/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/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/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/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/node-abi": { - "version": "3.85.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz", - "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.19" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.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/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-event": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", - "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-timeout": "^5.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-ms": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", - "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-conf": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", - "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.0.0", - "load-json-file": "^7.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plur": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", - "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "irregular-plurals": "^3.3.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "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": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pretty-ms": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", - "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-ms": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "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/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" - } - }, - "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/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/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": { - "iojs": ">=1.0.0", - "node": ">=0.10.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==", - "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": { - "queue-microtask": "^1.2.2" - } - }, - "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/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" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ses": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/ses/-/ses-1.14.0.tgz", - "integrity": "sha512-T07hNgOfVRTLZGwSS50RnhqrG3foWP+rM+Q5Du4KUQyMLFI3A8YA4RKl0jjZzhihC1ZvDGrWi/JMn4vqbgr/Jg==", - "license": "Apache-2.0", - "dependencies": { - "@endo/cache-map": "^1.1.0", - "@endo/env-options": "^1.1.11", - "@endo/immutable-arraybuffer": "^1.1.2" - } - }, - "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": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "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": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/sprintf-js": { - "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/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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/chalk/strip-ansi?sponsor=1" - } - }, - "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", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supertap": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", - "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^5.0.0", - "js-yaml": "^3.14.1", - "serialize-error": "^7.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "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==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "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": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/well-known-symbols": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", - "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "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/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/packages/fincaps/yarn.lock b/packages/fincaps/yarn.lock deleted file mode 100644 index 2cc3222..0000000 --- a/packages/fincaps/yarn.lock +++ /dev/null @@ -1,3383 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@agoric/babel-generator@^7.17.4", "@agoric/babel-generator@^7.17.6": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@agoric/babel-generator/-/babel-generator-7.17.6.tgz#75ff4629468a481d670b4154bcfade11af6de674" - integrity sha512-D2wnk5fGajxMN5SCRSaA/triQGEaEX2Du0EzrRqobuD4wRXjvtF1e7jC1PPOk/RC2bZ8/0fzp0CHOiB7YLwb5w== - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" - integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== - dependencies: - "@babel/highlight" "^7.22.10" - chalk "^2.4.2" - -"@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== - dependencies: - "@babel/types" "^7.22.10" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/highlight@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" - integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.17.3", "@babel/parser@^7.22.10", "@babel/parser@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" - integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== - -"@babel/template@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@^7.17.3": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.10.tgz#20252acb240e746d27c2e82b4484f199cf8141aa" - integrity sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig== - dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.10" - "@babel/types" "^7.22.10" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.17.0", "@babel/types@^7.22.10", "@babel/types@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" - integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@endo/base64@^0.2.34": - version "0.2.34" - resolved "https://registry.yarnpkg.com/@endo/base64/-/base64-0.2.34.tgz#3de6f121d079a6d9055ac1a6c38243860aa1b6ee" - integrity sha512-UXfNd3fVqjOMwHW81g0pfhzMPUbmr2X0+1oBYVuYCco5k+GDwzO6smRzfef0MGtxLVIXvf86Npb5eDuegQKGHA== - -"@endo/bundle-source@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@endo/bundle-source/-/bundle-source-2.7.0.tgz#10a398128b8968bdd89420fab4390b10ae258336" - integrity sha512-IT/TCxjvcJj6IU22bnIpouPJuZG+ANJrbWKihnlNyQppS25YEYjvf31iGIRBhcJWaWDDyDIfIDsSgxmrFBWnyw== - dependencies: - "@agoric/babel-generator" "^7.17.4" - "@babel/parser" "^7.17.3" - "@babel/traverse" "^7.17.3" - "@endo/base64" "^0.2.34" - "@endo/compartment-mapper" "^0.9.1" - "@endo/init" "^0.5.59" - "@endo/promise-kit" "^0.2.59" - "@endo/where" "^0.3.4" - "@rollup/plugin-commonjs" "^19.0.0" - "@rollup/plugin-node-resolve" "^13.0.0" - acorn "^8.2.4" - jessie.js "^0.3.2" - rollup endojs/endo#rollup-2.7.1-patch-1 - source-map "^0.7.3" - -"@endo/captp@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@endo/captp/-/captp-3.1.4.tgz#7f6f4d304d2387f16c6080134701e202374361d1" - integrity sha512-fSrbTcFEYZGy26s4qio7KQBivI/Wb0+zV8YMRpls/eDMHIR1Cz+LTn7qD6hcLPpk4fLFjOpDCcbcoSGeP/YMRw== - dependencies: - "@endo/eventual-send" "^0.17.5" - "@endo/marshal" "^0.8.8" - "@endo/nat" "^4.1.30" - "@endo/promise-kit" "^0.2.59" - -"@endo/cjs-module-analyzer@^0.2.34": - version "0.2.34" - resolved "https://registry.yarnpkg.com/@endo/cjs-module-analyzer/-/cjs-module-analyzer-0.2.34.tgz#bef0196fb01477f199159e097a4d6b1c1f0c9591" - integrity sha512-Ik5Q0NDFMLx4wXlP0JCzpPt6yqNGsRrFqhe/DBhsU+3GXDMhpabUZk7xzN6Tthr6MTG06P8p2sOVwwyvNLrlvw== - -"@endo/cli@file:../../../endo/packages/cli": - version "0.2.5" - dependencies: - "@endo/bundle-source" "^2.7.0" - "@endo/compartment-mapper" "^0.9.1" - "@endo/daemon" "^0.2.5" - "@endo/eventual-send" "^0.17.5" - "@endo/far" "^0.2.21" - "@endo/import-bundle" "^0.4.1" - "@endo/lockdown" "^0.1.31" - "@endo/promise-kit" "^0.2.59" - "@endo/stream-node" "^0.2.29" - "@endo/where" "^0.3.4" - commander "^5.0.0" - open "^9.1.0" - ses "^0.18.7" - -"@endo/compartment-mapper@^0.9.1": - version "0.9.1" - resolved "https://registry.yarnpkg.com/@endo/compartment-mapper/-/compartment-mapper-0.9.1.tgz#e5935ade7bb6280acb8b545ad84e289122bac544" - integrity sha512-uqVFo597bqjWaaPQnqMumkAgk6KVQbQm+hPtoARB2R2VNbBLD8ED/53HrxtvA/+Iw1PQrvJEcZkIGCvbzFKeuA== - dependencies: - "@endo/cjs-module-analyzer" "^0.2.34" - "@endo/static-module-record" "^0.8.1" - "@endo/zip" "^0.2.34" - ses "^0.18.7" - -"@endo/daemon@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@endo/daemon/-/daemon-0.2.5.tgz#a620570c1036e7d931102d15d6c62986601df04e" - integrity sha512-Mzu1ChYNXXyaGGZaHOgvckH8wi69eFIquL+RU3rq/xj5kkXqRmpFLYmCVX6vsJPaFzS0UT9b4LITFT/6Eio8MA== - dependencies: - "@endo/captp" "^3.1.4" - "@endo/eventual-send" "^0.17.5" - "@endo/far" "^0.2.21" - "@endo/lockdown" "^0.1.31" - "@endo/netstring" "^0.3.29" - "@endo/promise-kit" "^0.2.59" - "@endo/stream" "^0.3.28" - "@endo/stream-node" "^0.2.29" - "@endo/where" "^0.3.4" - ses "^0.18.7" - -"@endo/env-options@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@endo/env-options/-/env-options-0.1.3.tgz#430133977de48fb64125535d54f75e0eb0682260" - integrity sha512-ljs5E0+Fhe5IQsciCn6jL5bsi1PYysPm4NhrPmNByw136AcjUbfZhOBmOzeXwOhxaL93cI/jTStNdWEA80Q+nQ== - -"@endo/eventual-send@^0.17.5": - version "0.17.5" - resolved "https://registry.yarnpkg.com/@endo/eventual-send/-/eventual-send-0.17.5.tgz#2f5390eda82a1c4dcd4c1c9c748ddd96d043d0ba" - integrity sha512-GpDSU2+Hcn99mff3dt62/ZDiZkG20spawZcNgRNB5oZe+kW6pP26ugDI2jRXML5yoQbUBtSit26HDD8GX2p/HQ== - dependencies: - "@endo/env-options" "^0.1.3" - -"@endo/far@^0.2.21", "@endo/far@^0.2.3": - version "0.2.21" - resolved "https://registry.yarnpkg.com/@endo/far/-/far-0.2.21.tgz#f61fae564486d7b7ab77c95c4bd2b3bf710e6a81" - integrity sha512-PTY6PrHAusAnU70oTRPk+tRQ4Nac8isg3nXXoe6y5F6rHrAZsSIYINk9bOfRo3MqW3e++qU0+AVd3niYydk3OQ== - dependencies: - "@endo/eventual-send" "^0.17.5" - "@endo/pass-style" "^0.1.6" - -"@endo/import-bundle@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@endo/import-bundle/-/import-bundle-0.4.1.tgz#fc413c140e75456b1242ebebf60e211727e57016" - integrity sha512-XL0q/HDVOo7m0fg/rjQwyUqPAbpcsIxI4KQuwf/5DJMWzMH/AggHbEgvwtuRnV76FtRiNAGdgJeSyK0g86MuCg== - dependencies: - "@endo/base64" "^0.2.34" - "@endo/compartment-mapper" "^0.9.1" - "@endo/where" "^0.3.4" - ses "^0.18.7" - -"@endo/init@^0.5.59": - version "0.5.59" - resolved "https://registry.yarnpkg.com/@endo/init/-/init-0.5.59.tgz#b4e5433f1d0e9cb49de3db48585642e946ed6299" - integrity sha512-F6+b1xUapQcsL4ALZTrM1fQJcbT+nbDLVq//6rH7ZVQGrXLOJK09ImOQVBm0YflVkfhu8UB6fk2YZQx+uaPwxw== - dependencies: - "@endo/base64" "^0.2.34" - "@endo/eventual-send" "^0.17.5" - "@endo/lockdown" "^0.1.31" - "@endo/promise-kit" "^0.2.59" - -"@endo/lockdown@^0.1.31": - version "0.1.31" - resolved "https://registry.yarnpkg.com/@endo/lockdown/-/lockdown-0.1.31.tgz#8921730896a3fdd8e079bf225f4cbf8751cd74a0" - integrity sha512-6pGdxCEF8+MOVX2weML+RMkzEwIv3hATa2CMZy8B7P2pakfIama6PoopraSzt9OB/S+o39GW3VLqwRWlGN/J+Q== - dependencies: - ses "^0.18.7" - -"@endo/marshal@^0.8.8": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@endo/marshal/-/marshal-0.8.8.tgz#d6e51a5c1c4c97f3904a8ee93bb352706391baa7" - integrity sha512-uoGF5Hwmne9y8eT73474YTLjfcvgWQD+9Iq5PrJSy+Ymek4VbOGNv12j5wvA0TTylbHlrakFv0fs7q10OV9B+Q== - dependencies: - "@endo/eventual-send" "^0.17.5" - "@endo/nat" "^4.1.30" - "@endo/pass-style" "^0.1.6" - "@endo/promise-kit" "^0.2.59" - -"@endo/nat@^4.1.30": - version "4.1.30" - resolved "https://registry.yarnpkg.com/@endo/nat/-/nat-4.1.30.tgz#a52137e4d9dc159dc01f146a3506e7de3cb912f2" - integrity sha512-UN8obyLCGrG4vvEX+LV8ZOQMfwVDDA6z6mnvBRyZXbl+GwAs8QXa7vi9NiscidyCTvxad7jjfuf7IIqlIZUTQg== - -"@endo/netstring@^0.3.29": - version "0.3.29" - resolved "https://registry.yarnpkg.com/@endo/netstring/-/netstring-0.3.29.tgz#7519e1e410aa3af7f866260813b410dd2982f8a2" - integrity sha512-KD4gWQdCTPcSb2QWKl4QPfXcvACGbpuJsAT0rUg5u0S5qBzihFkECF0Oghmfwqs7Mbms4SmVDWL2Rxtkl66t9Q== - dependencies: - "@endo/init" "^0.5.59" - "@endo/stream" "^0.3.28" - ses "^0.18.7" - -"@endo/pass-style@^0.1.6": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@endo/pass-style/-/pass-style-0.1.6.tgz#eb554b6c1b4ff3a4e55a8f3c612866bf27e91b76" - integrity sha512-SkRFW0FqBjjVagBDyhlGr7GmDFtVqZYhH4rN+YBtIjciFugmMT5p8gdnTnns3AUnurBSHH55MjKXIOzJNL+Txw== - dependencies: - "@endo/promise-kit" "^0.2.59" - "@fast-check/ava" "^1.1.5" - -"@endo/patterns@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@endo/patterns/-/patterns-0.2.5.tgz#84fae7cd78ea641b2c20549a19b101ad04ef2bde" - integrity sha512-oJATZDCNPR2FzbzrRM1GlH1E8dZe6j5zAVdhQPCcaVmlyZd66YVEnm4VaoI6EV+LGPclAoMFq2uHn9/npysxdQ== - dependencies: - "@endo/eventual-send" "^0.17.5" - "@endo/marshal" "^0.8.8" - "@endo/promise-kit" "^0.2.59" - -"@endo/promise-kit@^0.2.59": - version "0.2.59" - resolved "https://registry.yarnpkg.com/@endo/promise-kit/-/promise-kit-0.2.59.tgz#93f61a709660252c541e9ecaf7c138f1cf279f9a" - integrity sha512-l4KK3CE4gb0cqPA2u9Agh+7yIbsExO10eJbnWKDgN9FC6b1oaZPL9NdXf3kOhSjH1OFCPHtc+whH9uMNV9e+KQ== - dependencies: - ses "^0.18.7" - -"@endo/static-module-record@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@endo/static-module-record/-/static-module-record-0.8.1.tgz#cf1900b66a92aa0a46584486e778351483102153" - integrity sha512-F2x+jALc286VQ7xfd0LXYyo+PwHR46dolmuMLOC7MkpPHVT323jH6n29U6unIEFTqknhVB6gHXIwuwGD4mzSWQ== - dependencies: - "@agoric/babel-generator" "^7.17.6" - "@babel/parser" "^7.17.3" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - ses "^0.18.7" - -"@endo/stream-node@^0.2.29": - version "0.2.29" - resolved "https://registry.yarnpkg.com/@endo/stream-node/-/stream-node-0.2.29.tgz#b006afd648f5ae079e6d333b9679edb13c11d8be" - integrity sha512-wL8io8Y106f15CsV/cBdlgZjkK7a8NFlR+o0jalwILHErFg7foTKPGqK5lb+tuNue6vaheC/QXNGG5/nWx4u7g== - dependencies: - "@endo/init" "^0.5.59" - "@endo/stream" "^0.3.28" - ses "^0.18.7" - -"@endo/stream@^0.3.28": - version "0.3.28" - resolved "https://registry.yarnpkg.com/@endo/stream/-/stream-0.3.28.tgz#755bbdbf1fd8d31a9ad80a8b5fcc20ba37535c64" - integrity sha512-zlSm7KlMxVDal2Ob6pazjZ7vRTFgQxwSSiAeLJMM7tlBPL28G28MJfcPAMFKtcN+jknW1MXcHDmjzMo4kJuUiA== - dependencies: - "@endo/eventual-send" "^0.17.5" - "@endo/promise-kit" "^0.2.59" - ses "^0.18.7" - -"@endo/where@^0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@endo/where/-/where-0.3.4.tgz#af8f5cd8140e376a881e08e522359aa18ab162e5" - integrity sha512-v4jTUPJwjYY2EUBG1hzwhzFywsTejMPr1hDSQevCVVzK8HnSzHch0AeUciBSo+/2+iM8JTstF1TLlLq0n5YQmw== - -"@endo/zip@^0.2.34": - version "0.2.34" - resolved "https://registry.yarnpkg.com/@endo/zip/-/zip-0.2.34.tgz#d5571ef91019a647f64e69b003a0e3fb23de827d" - integrity sha512-ty6zqDLF3HZyc5Icq0/d93snpNBJsdqIeb8GcbDWxwHBhczmJoTPu0YOnWPtNgkE8bqi+2zhibmdS9kdn7M1Ew== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.6.1": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" - integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== - -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== - 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" - -"@eslint/js@8.48.0": - version "8.48.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" - integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== - -"@fast-check/ava@^1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@fast-check/ava/-/ava-1.1.5.tgz#b471ce5252a3d62eb9bc316f1b7b0a79a7c8341f" - integrity sha512-OopAjw8v6r3sEqR02O61r2yGoE4B1nWDRXAkB4tuK/v7qemkf86Fz+GRgBgAkSFql85VAeUq+wlx0F3Y7wJzzA== - dependencies: - fast-check "^3.0.0" - -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rollup/plugin-commonjs@^19.0.0": - version "19.0.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-19.0.2.tgz#1ccc3d63878d1bc9846f8969f09dd3b3e4ecc244" - integrity sha512-gBjarfqlC7qs0AutpRW/hrFNm+cd2/QKxhwyFa+srbg1oX7rDsEU3l+W7LAUhsAp9mPJMAkXDhLbQaVwEaE8bA== - dependencies: - "@rollup/pluginutils" "^3.1.0" - commondir "^1.0.1" - estree-walker "^2.0.1" - glob "^7.1.6" - is-reference "^1.2.1" - magic-string "^0.25.7" - resolve "^1.17.0" - -"@rollup/plugin-node-resolve@^13.0.0": - version "13.3.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c" - integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - deepmerge "^4.2.2" - is-builtin-module "^3.1.0" - is-module "^1.0.0" - resolve "^1.19.0" - -"@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== - dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" - -"@types/estree@*": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/google-spreadsheet@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/google-spreadsheet/-/google-spreadsheet-4.0.0.tgz#a5828b3e5461eec0e138b8e4a7ab15fd69c3af30" - integrity sha512-GdfhBRQcN1KhpZGbhOEu/Cj2LimDLUW7hVB/GD552F4IY4FuYFwYwIz1TIB7rRqMVnMy99RdwpgXPX0G5Uu+7g== - dependencies: - google-spreadsheet "*" - -"@types/node@*": - version "20.5.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30" - integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - -agent-base@^7.0.2: - version "7.1.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" - integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== - dependencies: - debug "^4.3.4" - -aggregate-error@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" - integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== - dependencies: - clean-stack "^4.0.0" - indent-string "^5.0.0" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - 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" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.0.0, ansi-styles@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== - -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - -arrgv@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arrgv/-/arrgv-1.0.2.tgz#025ed55a6a433cad9b604f8112fc4292715a6ec0" - integrity sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw== - -arrify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" - integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -ava@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ava/-/ava-5.3.1.tgz#335737dd963b7941b90214836cea2e8de1f4d5f4" - integrity sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg== - dependencies: - acorn "^8.8.2" - acorn-walk "^8.2.0" - ansi-styles "^6.2.1" - arrgv "^1.0.2" - arrify "^3.0.0" - callsites "^4.0.0" - cbor "^8.1.0" - chalk "^5.2.0" - chokidar "^3.5.3" - chunkd "^2.0.1" - ci-info "^3.8.0" - ci-parallel-vars "^1.0.1" - clean-yaml-object "^0.1.0" - cli-truncate "^3.1.0" - code-excerpt "^4.0.0" - common-path-prefix "^3.0.0" - concordance "^5.0.4" - currently-unhandled "^0.4.1" - debug "^4.3.4" - emittery "^1.0.1" - figures "^5.0.0" - globby "^13.1.4" - ignore-by-default "^2.1.0" - indent-string "^5.0.0" - is-error "^2.2.2" - is-plain-object "^5.0.0" - is-promise "^4.0.0" - matcher "^5.0.0" - mem "^9.0.2" - ms "^2.1.3" - p-event "^5.0.1" - p-map "^5.5.0" - picomatch "^2.3.1" - pkg-conf "^4.0.0" - plur "^5.1.0" - pretty-ms "^8.0.0" - resolve-cwd "^3.0.0" - stack-utils "^2.0.6" - strip-ansi "^7.0.1" - supertap "^3.0.1" - temp-dir "^3.0.0" - write-file-atomic "^5.0.1" - yargs "^17.7.2" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axios@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267" - integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.0, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -better-sqlite3@^8.5.2: - version "8.5.2" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-8.5.2.tgz#a1c13e4361125255e39302e8b569a6568c3291e3" - integrity sha512-w/EZ/jwuZF+/47mAVC2+rhR2X/gwkZ+fd1pbX7Y90D5NRaRzDQcxrHY10t6ijGiYIonCVsBSF5v1cay07bP5sg== - dependencies: - bindings "^1.5.0" - prebuild-install "^7.1.0" - -big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -bignumber.js@^9.0.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blueimp-md5@^2.10.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" - integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== - -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -callsites@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.1.0.tgz#de72b98612eed4e1e2564c952498677faa9d86c2" - integrity sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw== - -cbor@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" - integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== - dependencies: - nofilter "^3.1.0" - -chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - 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" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chunkd@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-2.0.1.tgz#49cd1d7b06992dc4f7fccd962fe2a101ee7da920" - integrity sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ== - -ci-info@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -ci-parallel-vars@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz#e87ff0625ccf9d286985b29b4ada8485ca9ffbc2" - integrity sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg== - -clean-stack@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" - integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== - dependencies: - escape-string-regexp "5.0.0" - -clean-yaml-object@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" - integrity sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw== - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -code-excerpt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-4.0.0.tgz#2de7d46e98514385cb01f7b3b741320115f4c95e" - integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== - dependencies: - convert-to-spaces "^2.0.1" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -common-path-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" - integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concordance@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" - integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== - dependencies: - date-time "^3.1.0" - esutils "^2.0.3" - fast-diff "^1.2.0" - js-string-escape "^1.0.1" - lodash "^4.17.15" - md5-hex "^3.0.1" - semver "^7.3.2" - well-known-symbols "^2.0.0" - -convert-to-spaces@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" - integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng== - dependencies: - array-find-index "^1.0.1" - -date-time@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" - integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== - dependencies: - time-zone "^1.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-libc@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" - integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== - -dettle@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dettle/-/dettle-1.0.1.tgz#25e07a725722e389d3dea28027fb4a53cf18d8dd" - integrity sha512-/oD3At60ZfhgzpofJtyClNTrIACyMdRe+ih0YiHzAniN0IZnLdLpEzgR6RtGs3kowxUkTnvV/4t1FBxXMUdusQ== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -emittery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-1.0.1.tgz#e0cf36e2d7eef94dbd025969f642d57ae50a56cd" - integrity sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.36.0: - version "8.48.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" - integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.48.0" - "@humanwhocodes/config-array" "^0.11.10" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - 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" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== - -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2, esutils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - 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" - -execa@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" - integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== - 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" - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -extend@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-check@^3.0.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.12.0.tgz#440949277387a053f7f82cd532fa3fcf67346ba1" - integrity sha512-SqahE9mlL3+lhjJ39joMLwcj6F+24hfZdf/tchlNO8sHcTdrUUdA5P/ZbSFZM9Xpzs36XaneGwE0FWepm/zyOA== - dependencies: - pure-rand "^6.0.0" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== - 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" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -figures@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-5.0.0.tgz#126cd055052dea699f8a54e8c9450e6ecfc44d5f" - integrity sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg== - dependencies: - escape-string-regexp "^5.0.0" - is-unicode-supported "^1.2.0" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" - integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== - dependencies: - locate-path "^7.1.0" - path-exists "^5.0.0" - -flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== - dependencies: - flatted "^3.2.7" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gaxios@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.1.0.tgz#8ab08adbf9cc600368a57545f58e004ccf831ccb" - integrity sha512-EIHuesZxNyIkUGcTQKQPMICyOpDD/bi+LJIJx+NLsSGmnS7N+xCLRX5bi4e9yAu9AlSZdVq+qlyWWVuTh/483w== - dependencies: - extend "^3.0.2" - https-proxy-agent "^7.0.1" - is-stream "^2.0.0" - node-fetch "^2.6.9" - -gcp-metadata@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.0.0.tgz#2ae12008bef8caa8726cba31fd0a641ebad5fb56" - integrity sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ== - dependencies: - gaxios "^6.0.0" - json-bigint "^1.0.0" - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - 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" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^13.1.4: - version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" - ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" - -google-auth-library@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.0.0.tgz#b159d22464c679a6a25cb46d48a4ac97f9f426a2" - integrity sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q== - dependencies: - base64-js "^1.3.0" - ecdsa-sig-formatter "^1.0.11" - gaxios "^6.0.0" - gcp-metadata "^6.0.0" - gtoken "^7.0.0" - jws "^4.0.0" - lru-cache "^6.0.0" - -google-spreadsheet@*, google-spreadsheet@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/google-spreadsheet/-/google-spreadsheet-4.0.2.tgz#9feddb65ba5a37e16fde9e4f43ca934d0e32e6cd" - integrity sha512-A5Y3HdgQhwnc16cwfwIdMS1FR2rAVRBa+4RLO8jbuUPYWOGMTPWqhl1mkIB5XOT+w69znoXMHeNgaNbKZp0J2g== - dependencies: - axios "^1.4.0" - lodash "^4.17.21" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.2: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -gtoken@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.0.1.tgz#b64bd01d88268ea3a3572c9076a85d1c48f1a455" - integrity sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ== - dependencies: - gaxios "^6.0.0" - jws "^4.0.0" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -https-proxy-agent@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz#0277e28f13a07d45c663633841e20a40aaafe0ab" - integrity sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ== - dependencies: - agent-base "^7.0.2" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-by-default@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.1.0.tgz#c0e0de1a99b6065bdc93315a6f728867981464db" - integrity sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" - integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -irregular-plurals@^3.3.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.5.0.tgz#0835e6639aa8425bdc8b0d33d0dc4e89d9c01d2b" - integrity sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ== - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-builtin-module@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" - integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== - dependencies: - builtin-modules "^3.3.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-error@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" - integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-promise@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" - integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== - -is-reference@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - -is-unicode-supported@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" - integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -jessie.js@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/jessie.js/-/jessie.js-0.3.3.tgz#c79a8b1f105b41f4e5a278f8dc67339c273b5900" - integrity sha512-qtm2JSB/ZeH9xNNPjVkeTFH+Hoq9BxAzakgf6WK1PLarIoXJ9roSi+Z5UF65K47rT7QteWrP8b6RPBVquvIwsg== - dependencies: - "@endo/far" "^0.2.3" - -js-string-escape@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -jwa@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" - integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" - integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== - dependencies: - jwa "^2.0.0" - safe-buffer "^5.0.1" - -keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -load-json-file@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-7.0.1.tgz#a3c9fde6beffb6bedb5acf104fad6bb1604e1b00" - integrity sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -locate-path@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" - integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== - dependencies: - p-locate "^6.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@^0.25.7: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -map-age-cleaner@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -matcher@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-5.0.0.tgz#cd82f1c7ae7ee472a9eeaf8ec7cac45e0fe0da62" - integrity sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw== - dependencies: - escape-string-regexp "^5.0.0" - -md5-hex@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" - integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== - dependencies: - blueimp-md5 "^2.10.0" - -mem@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/mem/-/mem-9.0.2.tgz#bbc2d40be045afe30749681e8f5d554cee0c0354" - integrity sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A== - dependencies: - map-age-cleaner "^0.1.3" - mimic-fn "^4.0.0" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.3: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-abi@^3.3.0: - version "3.47.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.47.0.tgz#6cbfa2916805ae25c2b7156ca640131632eb05e8" - integrity sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A== - dependencies: - semver "^7.3.5" - -node-fetch@^2.6.9: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -nofilter@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" - integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-all@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" - integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== - dependencies: - ansi-styles "^3.2.1" - chalk "^2.4.1" - cross-spawn "^6.0.5" - memorystream "^0.3.1" - minimatch "^3.0.4" - pidtree "^0.3.0" - read-pkg "^3.0.0" - shell-quote "^1.6.1" - string.prototype.padend "^3.0.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== - dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== - -p-event@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" - integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== - dependencies: - p-timeout "^5.0.2" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-locate@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" - integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== - dependencies: - p-limit "^4.0.0" - -p-map@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" - integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== - dependencies: - aggregate-error "^4.0.0" - -p-timeout@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" - integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-ms@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-3.0.0.tgz#3ea24a934913345fcc3656deda72df921da3a70e" - integrity sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" - integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" - integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pkg-conf@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-4.0.0.tgz#63ace00cbacfa94c2226aee133800802d3e3b80c" - integrity sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w== - dependencies: - find-up "^6.0.0" - load-json-file "^7.0.0" - -plur@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/plur/-/plur-5.1.0.tgz#bff58c9f557b9061d60d8ebf93959cf4b08594ae" - integrity sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg== - dependencies: - irregular-plurals "^3.3.0" - -prebuild-install@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - 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" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -pretty-ms@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-8.0.0.tgz#a35563b2a02df01e595538f86d7de54ca23194a3" - integrity sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q== - dependencies: - parse-ms "^3.0.0" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pure-rand@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" - integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.10.0, resolve@^1.17.0, resolve@^1.19.0: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup@endojs/endo#rollup-2.7.1-patch-1: - version "2.70.1-endo.1" - resolved "https://codeload.github.com/endojs/endo/tar.gz/54060e784a4dbe77b6692f17344f4d84a198530d" - optionalDependencies: - fsevents "~2.3.2" - -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^7.3.2, semver@^7.3.5: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -serialize-error@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" - integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== - dependencies: - type-fest "^0.13.1" - -ses@^0.18.7: - version "0.18.7" - resolved "https://registry.yarnpkg.com/ses/-/ses-0.18.7.tgz#8abeb65732845642c2d1a284e415ef11957fb489" - integrity sha512-bcQ3CY8jh+UnumfdDZCPDgRA9hWk6acpL1d7ecQLMOdMkqKkP0yv2b6Sd9AVxuxbu4cXMt158epbpwkV/5sIfw== - dependencies: - "@endo/env-options" "^0.1.3" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.padend@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" - integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -stubborn-fs@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/stubborn-fs/-/stubborn-fs-1.2.5.tgz#e5e244223166921ddf66ed5e062b6b3bf285bfd2" - integrity sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g== - -supertap@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/supertap/-/supertap-3.0.1.tgz#aa89e4522104402c6e8fe470a7d2db6dc4037c6a" - integrity sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw== - dependencies: - indent-string "^5.0.0" - js-yaml "^3.14.1" - serialize-error "^7.0.1" - strip-ansi "^7.0.1" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -temp-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-3.0.0.tgz#7f147b42ee41234cc6ba3138cd8e8aa2302acffa" - integrity sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -time-zone@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" - integrity sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA== - -tiny-readdir@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tiny-readdir/-/tiny-readdir-2.2.0.tgz#ad3770a29efae222beae06032389cbedab4b57bc" - integrity sha512-bO4IgID5M2x5YQFBru/wREgT30YuA8aoOd/F8Rd6LKRIn1gOe9aREjT74J9EVukHqI/2RB+4SM1RgXM0gwxoWw== - -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typescript@~5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" - integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -watcher@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/watcher/-/watcher-2.3.0.tgz#27f4125575da16a6ce6445ccecc1820ef68548f7" - integrity sha512-6hVpT1OhmYTZhsgUND2o2gTL79TosB1rH8DWzDO7KBlyR9Yuxg/LXUGeHJqjjvwpnyHT7uUdDwWczprJuqae9Q== - dependencies: - dettle "^1.0.1" - stubborn-fs "^1.2.5" - tiny-readdir "^2.2.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -well-known-symbols@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" - integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - 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" - -which-typed-array@^1.1.10, which-typed-array@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" - integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^4.0.1" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== From de5e5dc2f5798d6ec03c09a9cf5ce4152737cac1 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 23 Jan 2026 17:33:02 -0600 Subject: [PATCH 31/77] build(deps): standardize better-sqlite3 to 12.6.2 --- packages/brcal/package.json | 2 +- packages/ertp-ledgerguise/package.json | 2 +- packages/fincaps/package.json | 2 +- packages/lm-sync/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/brcal/package.json b/packages/brcal/package.json index 0146264..a2f30f1 100644 --- a/packages/brcal/package.json +++ b/packages/brcal/package.json @@ -18,7 +18,7 @@ "lint:eslint": "eslint '**/*.js'" }, "dependencies": { - "better-sqlite3": "^7.6.2", + "better-sqlite3": "^12.6.2", "chokidar": "^3.5.3", "csv-parse": "^5.3.0", "esm": "^3.2.25", diff --git a/packages/ertp-ledgerguise/package.json b/packages/ertp-ledgerguise/package.json index 6ef9100..9b5a086 100644 --- a/packages/ertp-ledgerguise/package.json +++ b/packages/ertp-ledgerguise/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@agoric/ertp": "*", - "better-sqlite3": "^12.6.0" + "better-sqlite3": "^12.6.2" }, "devDependencies": { "@types/better-sqlite3": "^7.6.1", diff --git a/packages/fincaps/package.json b/packages/fincaps/package.json index 8f70746..085a462 100644 --- a/packages/fincaps/package.json +++ b/packages/fincaps/package.json @@ -20,7 +20,7 @@ "dependencies": { "@endo/far": "^0.2.21", "@endo/patterns": "^0.2.5", - "better-sqlite3": "^8.5.2", + "better-sqlite3": "^12.6.2", "google-auth-library": "^9.0.0", "google-spreadsheet": "^4.0.2", "minimatch": "^9.0.3", diff --git a/packages/lm-sync/package.json b/packages/lm-sync/package.json index 0af1fc5..73fe7ae 100644 --- a/packages/lm-sync/package.json +++ b/packages/lm-sync/package.json @@ -6,7 +6,7 @@ }, "type": "module", "dependencies": { - "better-sqlite3": "^11.6.0", + "better-sqlite3": "^12.6.2", "body-parser": "^1.20.1", "express": "^4.18.2", "google-spreadsheet": "^3.3.0" From 37711a9b8c4fe90afccfb53d91bdcd7550d27e12 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 23 Jan 2026 17:33:50 -0600 Subject: [PATCH 32/77] build(deps): move agoric deps to dev tags and add update script --- CONTRIBUTING.md | 8 + packages/brcal/package.json | 4 +- packages/ertp-ledgerguise/package.json | 2 +- packages/lm-sync/package.json | 4 +- scripts/update-agoric-dev.js | 96 + yarn.lock | 10683 ++++++++++++++++++++++- 6 files changed, 10640 insertions(+), 157 deletions(-) create mode 100755 scripts/update-agoric-dev.js diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f97b69c..6e791ed 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,3 +18,11 @@ - Avoid local dev deps that use `workspace:` (e.g., private monorepo packages) unless you also add their workspaces here. - TODO: Restore optional `@endo/cli` support for `packages/fincaps` without breaking installs (e.g., document a separate Endo monorepo workflow or make it an opt-in dev dependency). - TODO: Consider `yarn workspaces focus` to avoid Electron (via `packages/ofxies`) when not working on that package. + +## Agoric dev versions +- To update `@agoric/*` deps to their current `dev` dist-tags (from npm): `./scripts/update-agoric-dev.js` +- Then run `yarn install` to refresh the lockfile. + +## better-sqlite3 +- Multiple versions are expected when packages depend on different major ranges. +- If you need a single version, align the package.json ranges and run `yarn install`. diff --git a/packages/brcal/package.json b/packages/brcal/package.json index a2f30f1..d45786c 100644 --- a/packages/brcal/package.json +++ b/packages/brcal/package.json @@ -30,8 +30,8 @@ "xml2js": "^0.6.2" }, "devDependencies": { - "@agoric/eslint-config": "^0.3.3", - "@agoric/eslint-plugin": "^0.2.3", + "@agoric/eslint-config": "0.4.1-dev-dc67c18.0.dc67c18", + "@agoric/eslint-plugin": "0.1.1-dev-dc67c18.0.dc67c18", "@types/better-sqlite3": "^7.6.1", "@types/follow-redirects": "^1.13.0", "@types/mysql": "^2.15.15", diff --git a/packages/ertp-ledgerguise/package.json b/packages/ertp-ledgerguise/package.json index 9b5a086..55f3252 100644 --- a/packages/ertp-ledgerguise/package.json +++ b/packages/ertp-ledgerguise/package.json @@ -20,7 +20,7 @@ ] }, "dependencies": { - "@agoric/ertp": "*", + "@agoric/ertp": "0.16.3-dev-dc67c18.0.dc67c18", "better-sqlite3": "^12.6.2" }, "devDependencies": { diff --git a/packages/lm-sync/package.json b/packages/lm-sync/package.json index 73fe7ae..427669e 100644 --- a/packages/lm-sync/package.json +++ b/packages/lm-sync/package.json @@ -12,8 +12,8 @@ "google-spreadsheet": "^3.3.0" }, "devDependencies": { - "@agoric/eslint-config": "^0.3.3", - "@agoric/eslint-plugin": "^0.2.3", + "@agoric/eslint-config": "0.4.1-dev-dc67c18.0.dc67c18", + "@agoric/eslint-plugin": "0.1.1-dev-dc67c18.0.dc67c18", "@endo/eslint-config": "^0.5.1", "@types/better-sqlite3": "^7.6.1", "@types/node": "^14.14.7", diff --git a/scripts/update-agoric-dev.js b/scripts/update-agoric-dev.js new file mode 100755 index 0000000..6e94ba5 --- /dev/null +++ b/scripts/update-agoric-dev.js @@ -0,0 +1,96 @@ +#!/usr/bin/env node +// Queries the npm registry to resolve current dev dist-tags for @agoric/* packages. +/* eslint-disable no-console */ +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +const ROOT = process.cwd(); +const SKIP_DIRS = new Set(['node_modules', '.git', '.hg', '.yarn', '.vscode']); + +function listPackageJsonFiles(dir) { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + const out = []; + for (const entry of entries) { + if (entry.isDirectory()) { + if (SKIP_DIRS.has(entry.name)) continue; + out.push(...listPackageJsonFiles(path.join(dir, entry.name))); + } else if (entry.isFile() && entry.name === 'package.json') { + out.push(path.join(dir, entry.name)); + } + } + return out; +} + +function readJson(filePath) { + return JSON.parse(fs.readFileSync(filePath, 'utf8')); +} + +function writeJson(filePath, data) { + fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n'); +} + +function getDevTag(pkg) { + const raw = execSync(`npm view ${pkg} dist-tags --json`, { stdio: ['ignore', 'pipe', 'pipe'] }) + .toString() + .trim(); + const tags = raw ? JSON.parse(raw) : {}; + return tags.dev || null; +} + +const packageFiles = listPackageJsonFiles(ROOT); +const devTagCache = new Map(); +const updated = []; +const skipped = new Set(); + +for (const file of packageFiles) { + const data = readJson(file); + let changed = false; + + for (const field of ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies']) { + const deps = data[field]; + if (!deps) continue; + for (const name of Object.keys(deps)) { + if (!name.startsWith('@agoric/')) continue; + if (!devTagCache.has(name)) { + const devTag = getDevTag(name); + devTagCache.set(name, devTag); + } + const devTag = devTagCache.get(name); + if (!devTag) { + skipped.add(name); + continue; + } + if (deps[name] !== devTag) { + deps[name] = devTag; + changed = true; + } + } + } + + if (changed) { + writeJson(file, data); + updated.push(file); + } +} + +console.log('Updated package.json files:'); +if (updated.length === 0) { + console.log(' (none)'); +} else { + for (const file of updated) { + console.log(` ${path.relative(ROOT, file)}`); + } +} + +if (devTagCache.size > 0) { + console.log('Agoric dev tags used:'); + for (const [name, tag] of devTagCache.entries()) { + console.log(` ${name}: ${tag || '(no dev tag)'}`); + } +} + +if (skipped.size > 0) { + console.log('Skipped (no dev tag):'); + for (const name of skipped) console.log(` ${name}`); +} diff --git a/yarn.lock b/yarn.lock index 910b4a1..691408e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,34 +5,167 @@ __metadata: version: 8 cacheKey: 10c0 -"@agoric/eslint-config@npm:^0.3.3": - version: 0.3.25 - resolution: "@agoric/eslint-config@npm:0.3.25" +"@agoric/base-zone@npm:0.1.1-dev-dc67c18.0.dc67c18": + version: 0.1.1-dev-dc67c18.0.dc67c18 + resolution: "@agoric/base-zone@npm:0.1.1-dev-dc67c18.0.dc67c18" + dependencies: + "@agoric/store": "npm:0.9.3-dev-dc67c18.0.dc67c18" + "@endo/common": "npm:^1.2.13" + "@endo/errors": "npm:^1.2.13" + "@endo/exo": "npm:^1.5.12" + "@endo/far": "npm:^1.1.14" + "@endo/pass-style": "npm:^1.6.3" + "@endo/patterns": "npm:^1.7.0" + checksum: 10c0/9713c42e8b224f278ab24242ebc59eb7882bcfb571637213c6d9dbc177b4f9d0ea37326a1e91999e68f45428078ac9e0a8e46b129d583567f83393c9c1e6fb0f + languageName: node + linkType: hard + +"@agoric/ertp@npm:0.16.3-dev-dc67c18.0.dc67c18": + version: 0.16.3-dev-dc67c18.0.dc67c18 + resolution: "@agoric/ertp@npm:0.16.3-dev-dc67c18.0.dc67c18" + dependencies: + "@agoric/notifier": "npm:0.6.3-dev-dc67c18.0.dc67c18" + "@agoric/store": "npm:0.9.3-dev-dc67c18.0.dc67c18" + "@agoric/vat-data": "npm:0.5.3-dev-dc67c18.0.dc67c18" + "@agoric/zone": "npm:0.2.3-dev-dc67c18.0.dc67c18" + "@endo/errors": "npm:^1.2.13" + "@endo/eventual-send": "npm:^1.3.4" + "@endo/far": "npm:^1.1.14" + "@endo/marshal": "npm:^1.8.0" + "@endo/nat": "npm:^5.1.3" + "@endo/patterns": "npm:^1.7.0" + "@endo/promise-kit": "npm:^1.1.13" + checksum: 10c0/8fccd1a06f7483dd3b6a8e95f6b4db9c2f6644bc146ae6b6093e846e8ac10106a87bdc60e616132e7311764caea1b302a7bfa3343038d3c51bb25b2d7dca3d48 + languageName: node + linkType: hard + +"@agoric/eslint-config@npm:0.4.1-dev-dc67c18.0.dc67c18": + version: 0.4.1-dev-dc67c18.0.dc67c18 + resolution: "@agoric/eslint-config@npm:0.4.1-dev-dc67c18.0.dc67c18" peerDependencies: - "@endo/eslint-config": ^0.5.1 - "@jessie.js/eslint-plugin": ^0.2.0 - "@typescript-eslint/parser": ^5.33.0 - eslint: ^7.32.0 - eslint-config-airbnb-base: ^14.0.0 + "@agoric/eslint-plugin": ^0.1.0 + "@endo/eslint-plugin": ^2.4.0 + "@jessie.js/eslint-plugin": ^0.4.2 + eslint: ^9.0.0 + eslint-config-airbnb-base: ^15.0.0 eslint-config-jessie: ^0.0.6 - eslint-config-prettier: ^6.15.0 + eslint-config-prettier: ^9.0.0 + eslint-plugin-github: ^5.1.4 eslint-plugin-import: ^2.25.3 - eslint-plugin-jsdoc: ^39.2.9 - eslint-plugin-jsx-a11y: ^6.5.1 - eslint-plugin-prettier: ^4.0.0 - eslint-plugin-react: ^7.28.0 - eslint-plugin-react-hooks: ^4.3.0 - prettier: ^2.6.2 - checksum: 10c0/16bd07bd2556485891e025c987473974687eb00e583de43a526cf0def10cd4e3fc06b63b91442a8316324cf4715e02e4f4ef4a237222ebda7b93427e8467745f + eslint-plugin-jsdoc: ^46.4.3 + prettier: ^3.4.2 + typescript-eslint: ^8.17.0 + checksum: 10c0/380d9a17d206aae50cf0dd9c7152ce91e052023dace43ff1bea7d2aba0fc9ed296ebc0cbd8053a31e22f673d881cbb310d04157ddd4e81595175b55018164abb languageName: node linkType: hard -"@agoric/eslint-plugin@npm:^0.2.3": - version: 0.2.3 - resolution: "@agoric/eslint-plugin@npm:0.2.3" +"@agoric/eslint-plugin@npm:0.1.1-dev-dc67c18.0.dc67c18": + version: 0.1.1-dev-dc67c18.0.dc67c18 + resolution: "@agoric/eslint-plugin@npm:0.1.1-dev-dc67c18.0.dc67c18" + peerDependencies: + eslint: ^9.0.0 + checksum: 10c0/674884fde139d6469bf58ab3e7aa23c1d75aed80ffb1823be4a7908e0714e3bc3cebb34473e77468201ea668f93cb75891a58b58090e7f8a991e89e9e92e9478 + languageName: node + linkType: hard + +"@agoric/internal@npm:0.3.3-dev-dc67c18.0.dc67c18": + version: 0.3.3-dev-dc67c18.0.dc67c18 + resolution: "@agoric/internal@npm:0.3.3-dev-dc67c18.0.dc67c18" dependencies: - requireindex: "npm:~1.1.0" - checksum: 10c0/a82567a1ba05c1270a6441e55d29dcc6779d4f5bd2573499aefd5d11ae1ebb875efb0f167427aa3de55c9e51b99650bbdcac7b7f3ca5fbd499abb2d018f95076 + "@agoric/base-zone": "npm:0.1.1-dev-dc67c18.0.dc67c18" + "@endo/cache-map": "npm:^1.1.0" + "@endo/common": "npm:^1.2.13" + "@endo/compartment-mapper": "npm:^1.6.3" + "@endo/errors": "npm:^1.2.13" + "@endo/eventual-send": "npm:^1.3.4" + "@endo/far": "npm:^1.1.14" + "@endo/init": "npm:^1.1.12" + "@endo/marshal": "npm:^1.8.0" + "@endo/nat": "npm:^5.1.3" + "@endo/pass-style": "npm:^1.6.3" + "@endo/patterns": "npm:^1.7.0" + "@endo/promise-kit": "npm:^1.1.13" + "@endo/stream": "npm:^1.2.13" + anylogger: "npm:^0.21.0" + import-meta-resolve: "npm:^4.1.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/0b497e190823e34cbba50fbe331df10135db13fcb854a9bb8e40c222aff8f3dd0b6040a7df956441e7f4b846c48aead3e9792dfbe73ec9933410f19079e51604 + languageName: node + linkType: hard + +"@agoric/notifier@npm:0.6.3-dev-dc67c18.0.dc67c18": + version: 0.6.3-dev-dc67c18.0.dc67c18 + resolution: "@agoric/notifier@npm:0.6.3-dev-dc67c18.0.dc67c18" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-dc67c18.0.dc67c18" + "@agoric/vat-data": "npm:0.5.3-dev-dc67c18.0.dc67c18" + "@endo/errors": "npm:^1.2.13" + "@endo/far": "npm:^1.1.14" + "@endo/marshal": "npm:^1.8.0" + "@endo/patterns": "npm:^1.7.0" + "@endo/promise-kit": "npm:^1.1.13" + checksum: 10c0/dbc94b0e76d1f58172cf5333384ef89919ed7a64cc09ade991e759fff6f7dcff2281cb16b4ffedb182d20800c8268671cc64a859a0aefe8e7a70414378b14f03 + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-dev-dc67c18.0.dc67c18": + version: 0.9.3-dev-dc67c18.0.dc67c18 + resolution: "@agoric/store@npm:0.9.3-dev-dc67c18.0.dc67c18" + dependencies: + "@endo/errors": "npm:^1.2.13" + "@endo/exo": "npm:^1.5.12" + "@endo/marshal": "npm:^1.8.0" + "@endo/pass-style": "npm:^1.6.3" + "@endo/patterns": "npm:^1.7.0" + checksum: 10c0/5ec558bd4df96e5c1a4088360015a0bb4b418d0c613cb82dc0f4b68df83b3e6c3d0f718a4ebe28c71eb804138d34415ca45d40df252e0830cccc9fda167e8675 + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-dev-dc67c18.0.dc67c18": + version: 0.10.3-dev-dc67c18.0.dc67c18 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-dc67c18.0.dc67c18" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-dc67c18.0.dc67c18" + "@agoric/store": "npm:0.9.3-dev-dc67c18.0.dc67c18" + "@endo/env-options": "npm:^1.1.11" + "@endo/errors": "npm:^1.2.13" + "@endo/eventual-send": "npm:^1.3.4" + "@endo/exo": "npm:^1.5.12" + "@endo/far": "npm:^1.1.14" + "@endo/init": "npm:^1.1.12" + "@endo/marshal": "npm:^1.8.0" + "@endo/nat": "npm:^5.1.3" + "@endo/pass-style": "npm:^1.6.3" + "@endo/patterns": "npm:^1.7.0" + "@endo/promise-kit": "npm:^1.1.13" + checksum: 10c0/e76bb05916d3e032baa944de96ef9ea881dfc87f483e84a011d9cb91472762bbcf641dd4741d3b13882355ef25c3d3386c479aa09928048848b41528d7297c6e + languageName: node + linkType: hard + +"@agoric/vat-data@npm:0.5.3-dev-dc67c18.0.dc67c18": + version: 0.5.3-dev-dc67c18.0.dc67c18 + resolution: "@agoric/vat-data@npm:0.5.3-dev-dc67c18.0.dc67c18" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-dc67c18.0.dc67c18" + "@agoric/store": "npm:0.9.3-dev-dc67c18.0.dc67c18" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-dc67c18.0.dc67c18" + "@endo/errors": "npm:^1.2.13" + "@endo/exo": "npm:^1.5.12" + "@endo/patterns": "npm:^1.7.0" + checksum: 10c0/4986fff8be833056ac5b2e4c3c1e46885c0cd2e2e08d04657280c0acb6288e90ffd2da7051dbb86462f71257f18040b1ca0609719db321d22a7ebbae11ff35d7 + languageName: node + linkType: hard + +"@agoric/zone@npm:0.2.3-dev-dc67c18.0.dc67c18": + version: 0.2.3-dev-dc67c18.0.dc67c18 + resolution: "@agoric/zone@npm:0.2.3-dev-dc67c18.0.dc67c18" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-dc67c18.0.dc67c18" + "@agoric/vat-data": "npm:0.5.3-dev-dc67c18.0.dc67c18" + "@endo/errors": "npm:^1.2.13" + "@endo/far": "npm:^1.1.14" + "@endo/pass-style": "npm:^1.6.3" + checksum: 10c0/389c253f2fb40f9530270d1b0c8ef814e636bbe1c8a8ae534eb12da78fd78914531feffbdfe803ee5eae86d1b420f131650e925fa12064ea7f5939750928c06d languageName: node linkType: hard @@ -54,6 +187,37 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/code-frame@npm:7.28.6" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.28.5" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10c0/ed5d57f99455e3b1c23e75ebb8430c6b9800b4ecd0121b4348b97cecb65406a47778d6db61f0d538a4958bb01b4b277e90348a68d39bd3beff1d7c940ed6dd66 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.3": + version: 7.28.6 + resolution: "@babel/generator@npm:7.28.6" + dependencies: + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10c0/162fa358484a9a18e8da1235d998f10ea77c63bab408c8d3e327d5833f120631a77ff022c5ed1d838ee00523f8bb75df1f08196d3657d0bca9f2cfeb8503cc12 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.25.9, @babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-validator-identifier@npm:7.22.5" @@ -68,7 +232,14 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.10.4": +"@babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.16.7": version: 7.25.9 resolution: "@babel/highlight@npm:7.25.9" dependencies: @@ -91,6 +262,226 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/parser@npm:7.28.6" + dependencies: + "@babel/types": "npm:^7.28.6" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/d6bfe8aa8e067ef58909e9905496157312372ca65d8d2a4f2b40afbea48d59250163755bba8ae626a615da53d192b084bcfc8c9dad8b01e315b96967600de581 + languageName: node + linkType: hard + +"@babel/parser@npm:~7.26.2": + version: 7.26.10 + resolution: "@babel/parser@npm:7.26.10" + dependencies: + "@babel/types": "npm:^7.26.10" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/c47f5c0f63cd12a663e9dc94a635f9efbb5059d98086a92286d7764357c66bceba18ccbe79333e01e9be3bfb8caba34b3aaebfd8e62c3d5921c8cf907267be75 + languageName: node + linkType: hard + +"@babel/polyfill@npm:^7.0.0": + version: 7.12.1 + resolution: "@babel/polyfill@npm:7.12.1" + dependencies: + core-js: "npm:^2.6.5" + regenerator-runtime: "npm:^0.13.4" + checksum: 10c0/f5d233d2958582e8678838c32c42ba780965119ebb3771d9b9735f85efabc7b8b49161e7d908477486e0aaf8508410e957be764c27a6a828714fb9d1b7f80bc3 + languageName: node + linkType: hard + +"@babel/template@npm:^7.25.9": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" + dependencies: + "@babel/code-frame": "npm:^7.28.6" + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10c0/66d87225ed0bc77f888181ae2d97845021838c619944877f7c4398c6748bcf611f216dfd6be74d39016af502bca876e6ce6873db3c49e4ac354c56d34d57e9f5 + languageName: node + linkType: hard + +"@babel/traverse@npm:~7.25.9": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" + dependencies: + "@babel/code-frame": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 + languageName: node + linkType: hard + +"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/types@npm:7.28.6" + dependencies: + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.28.5" + checksum: 10c0/54a6a9813e48ef6f35aa73c03b3c1572cad7fa32b61b35dd07e4230bc77b559194519c8a4d8106a041a27cc7a94052579e238a30a32d5509aa4da4d6fd83d990 + languageName: node + linkType: hard + +"@babel/types@npm:~7.26.0": + version: 7.26.10 + resolution: "@babel/types@npm:7.26.10" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/7a7f83f568bfc3dfabfaf9ae3a97ab5c061726c0afa7dcd94226d4f84a81559da368ed79671e3a8039d16f12476cf110381a377ebdea07587925f69628200dac + languageName: node + linkType: hard + +"@cloudflare/kv-asset-handler@npm:0.4.2": + version: 0.4.2 + resolution: "@cloudflare/kv-asset-handler@npm:0.4.2" + checksum: 10c0/c8877851ce069b04d32d50a640c9c0faaab054970204f64a4111bac3dd85f177c001a0b57d32f7e65269e3896268b8f94605f31e4fa06253a6a5779587a63d17 + languageName: node + linkType: hard + +"@cloudflare/unenv-preset@npm:2.11.0": + version: 2.11.0 + resolution: "@cloudflare/unenv-preset@npm:2.11.0" + peerDependencies: + unenv: 2.0.0-rc.24 + workerd: ^1.20260115.0 + peerDependenciesMeta: + workerd: + optional: true + checksum: 10c0/ff551d6570640b1c7326954c05bbc7a3410626ee02fdc66859f469dfdb82b67f2b06c3191d71e75589b0f82908f43398f5380ea17def83e5538adba1556018a1 + languageName: node + linkType: hard + +"@cloudflare/workerd-darwin-64@npm:1.20260120.0": + version: 1.20260120.0 + resolution: "@cloudflare/workerd-darwin-64@npm:1.20260120.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@cloudflare/workerd-darwin-arm64@npm:1.20260120.0": + version: 1.20260120.0 + resolution: "@cloudflare/workerd-darwin-arm64@npm:1.20260120.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@cloudflare/workerd-linux-64@npm:1.20260120.0": + version: 1.20260120.0 + resolution: "@cloudflare/workerd-linux-64@npm:1.20260120.0" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@cloudflare/workerd-linux-arm64@npm:1.20260120.0": + version: 1.20260120.0 + resolution: "@cloudflare/workerd-linux-arm64@npm:1.20260120.0" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@cloudflare/workerd-windows-64@npm:1.20260120.0": + version: 1.20260120.0 + resolution: "@cloudflare/workerd-windows-64@npm:1.20260120.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:0.8.1, @cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.7.0": + version: 1.8.1 + resolution: "@emnapi/runtime@npm:1.8.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f4929d75e37aafb24da77d2f58816761fe3f826aad2e37fa6d4421dac9060cbd5098eea1ac3c9ecc4526b89deb58153852fa432f87021dc57863f2ff726d713f + languageName: node + linkType: hard + +"@endo/base64@npm:^1.0.12": + version: 1.0.12 + resolution: "@endo/base64@npm:1.0.12" + checksum: 10c0/3db2f276c6c84c97f7a5fcdb684c65c096844de23c0c2550b022934a299a47399b17503066254973f344f62d774e45e0dea2be767a92caa0d57912f44e88b748 + languageName: node + linkType: hard + +"@endo/cache-map@npm:^1.1.0": + version: 1.1.0 + resolution: "@endo/cache-map@npm:1.1.0" + checksum: 10c0/7d3df3263bfd581248a1e44472cb6650e73fc473f096bcd6dfe6619c3f8017d959e4376edcd76cea729d56f6b52b33de0a3d40a7f7b192cb4fb0e6822a153993 + languageName: node + linkType: hard + +"@endo/cjs-module-analyzer@npm:^1.0.11": + version: 1.0.11 + resolution: "@endo/cjs-module-analyzer@npm:1.0.11" + checksum: 10c0/ea396491ee440e8b05e023e64ed9f2701a008b9c3382f2a00a31f5956d9cc02ea356b75211025d61b2c402ce025d6b0d044a23d3224fe304aeb09d00c14c108c + languageName: node + linkType: hard + +"@endo/common@npm:^1.2.13": + version: 1.2.13 + resolution: "@endo/common@npm:1.2.13" + dependencies: + "@endo/errors": "npm:^1.2.13" + "@endo/eventual-send": "npm:^1.3.4" + "@endo/promise-kit": "npm:^1.1.13" + checksum: 10c0/dd5f1da0e4b773e17219bd342648c6214ae18fa8a0a3878a22679932f6027b86edc4b504c0b346d3d191113fbbcb84ec2e3050c731cc36954fab2b9c0c7eddb1 + languageName: node + linkType: hard + +"@endo/compartment-mapper@npm:^1.6.3": + version: 1.6.3 + resolution: "@endo/compartment-mapper@npm:1.6.3" + dependencies: + "@endo/cjs-module-analyzer": "npm:^1.0.11" + "@endo/module-source": "npm:^1.3.3" + "@endo/path-compare": "npm:^1.1.0" + "@endo/trampoline": "npm:^1.0.5" + "@endo/zip": "npm:^1.0.11" + ses: "npm:^1.14.0" + checksum: 10c0/869b0f4eb62ab621d8bf0dd62f11e1e3498ab57cf4f5d1ae9a27492155af52746a86cce21ed972c07b4c6785238113400b9df1c82ed4662252fdad171ab56ff7 + languageName: node + linkType: hard + +"@endo/env-options@npm:^0.1.4": + version: 0.1.4 + resolution: "@endo/env-options@npm:0.1.4" + checksum: 10c0/5bf49d362849090bff328b15f906adb5b8b6220815e8955e45f81e7ff9a8ab17e509fff8bf30f4c619772f4f1a8cba8f1ca90faec724b53b5b3f1c89050c6b44 + languageName: node + linkType: hard + +"@endo/env-options@npm:^1.1.11": + version: 1.1.11 + resolution: "@endo/env-options@npm:1.1.11" + checksum: 10c0/207ca764c56aaf8350bb3e897913852fdf2a3e737dbf2777b1e9928430d4efdba11b75a91570d781d28bb28da77c24e4ac7795fcee6b0530944c804e448748c6 + languageName: node + linkType: hard + +"@endo/errors@npm:^1.2.13": + version: 1.2.13 + resolution: "@endo/errors@npm:1.2.13" + dependencies: + ses: "npm:^1.14.0" + checksum: 10c0/eb1261978f3109682c00c93545cf3ab79daceeee6b76f02ea5408fa690cfa3d08740956c741bcfe018b7cda5a28e24bcd2a49350b7c747ded765c3e84b3a7bb4 + languageName: node + linkType: hard + "@endo/eslint-config@npm:^0.5.1": version: 0.5.3 resolution: "@endo/eslint-config@npm:0.5.3" @@ -125,6 +516,422 @@ __metadata: languageName: node linkType: hard +"@endo/eventual-send@npm:^0.17.6": + version: 0.17.6 + resolution: "@endo/eventual-send@npm:0.17.6" + dependencies: + "@endo/env-options": "npm:^0.1.4" + checksum: 10c0/3a8dae48e06ad3a8fdad074d0b6b10ced09f1e440f04f802d98372243ed8ead97278d85d4aa4a310dee34bc7146f09e7aaf6d01b7c06cbe3f8610544c97b5ce2 + languageName: node + linkType: hard + +"@endo/eventual-send@npm:^1.3.4": + version: 1.3.4 + resolution: "@endo/eventual-send@npm:1.3.4" + dependencies: + "@endo/env-options": "npm:^1.1.11" + checksum: 10c0/c0baa6b20bac2273f2d6816a8b9a0cdad2a80cadffb421163a4985179eb5c9979b77482ce7bb314a6ffe08526f83838e51089fbc94e5f3b2d27b04e856a23631 + languageName: node + linkType: hard + +"@endo/exo@npm:^1.5.12": + version: 1.5.12 + resolution: "@endo/exo@npm:1.5.12" + dependencies: + "@endo/common": "npm:^1.2.13" + "@endo/env-options": "npm:^1.1.11" + "@endo/errors": "npm:^1.2.13" + "@endo/eventual-send": "npm:^1.3.4" + "@endo/far": "npm:^1.1.14" + "@endo/pass-style": "npm:^1.6.3" + "@endo/patterns": "npm:^1.7.0" + checksum: 10c0/ac530fb9629697b20c876c3cd6a3f60ed4bde9c1d29425c44ec9e876e34e92b7411153202de71651629574f23a170770403e9edb407df8dea58608832161a659 + languageName: node + linkType: hard + +"@endo/far@npm:^0.2.21": + version: 0.2.22 + resolution: "@endo/far@npm:0.2.22" + dependencies: + "@endo/eventual-send": "npm:^0.17.6" + "@endo/pass-style": "npm:^0.1.7" + checksum: 10c0/bd30a168b47a26014cab296336a64aa2721975c386f7f87b6776dd33cf77f3e85ddb822e8422fbc2befb6920d72301e3b9b206fe71d970dce1870b708b09805d + languageName: node + linkType: hard + +"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.14": + version: 1.1.14 + resolution: "@endo/far@npm:1.1.14" + dependencies: + "@endo/errors": "npm:^1.2.13" + "@endo/eventual-send": "npm:^1.3.4" + "@endo/pass-style": "npm:^1.6.3" + checksum: 10c0/17e68cfaa765941dba7e7731c141c92452a1d1cfa523927714b9e27ddb576da0522380d066ce4746e4d920731962575ba0ddd7d681d22a220795d7596b4f993d + languageName: node + linkType: hard + +"@endo/immutable-arraybuffer@npm:^1.1.2": + version: 1.1.2 + resolution: "@endo/immutable-arraybuffer@npm:1.1.2" + checksum: 10c0/9ad0915818115999dd5fb618096be49e0f70f6289a234e968f40495ad2b3ced7bbbd09b7f20aaf04a88192fbb398bc42b89eb2dded5760df6a8e7439a20a7b9e + languageName: node + linkType: hard + +"@endo/init@npm:^1.1.12": + version: 1.1.12 + resolution: "@endo/init@npm:1.1.12" + dependencies: + "@endo/base64": "npm:^1.0.12" + "@endo/eventual-send": "npm:^1.3.4" + "@endo/lockdown": "npm:^1.0.18" + "@endo/promise-kit": "npm:^1.1.13" + checksum: 10c0/a10854b39677197fa3d701eef89609ff4c2e250c8e82b0da9fe24aa0638a2a25cd4ce6b5ad2e3cb540b68994b59fa06a848a63fc37f3fbb170093135a971dd81 + languageName: node + linkType: hard + +"@endo/lockdown@npm:^1.0.18": + version: 1.0.18 + resolution: "@endo/lockdown@npm:1.0.18" + dependencies: + ses: "npm:^1.14.0" + checksum: 10c0/1006c4648afc0385aac42934f6403fbe67525d89cd8e8e8adef4470d356825f5781ffb131f625e88b1d7d35e18473b8656110df9a043b9dc03cc99a8b25e8441 + languageName: node + linkType: hard + +"@endo/marshal@npm:^0.8.9": + version: 0.8.9 + resolution: "@endo/marshal@npm:0.8.9" + dependencies: + "@endo/eventual-send": "npm:^0.17.6" + "@endo/nat": "npm:^4.1.31" + "@endo/pass-style": "npm:^0.1.7" + "@endo/promise-kit": "npm:^0.2.60" + checksum: 10c0/cd49675e423e55e8d83f132b051e3844fd065036ada30dbb5452f4d0775c500a16668ad987d227d7f63643e0e1065200014b5545dfe6339d670653c481768b08 + languageName: node + linkType: hard + +"@endo/marshal@npm:^1.8.0": + version: 1.8.0 + resolution: "@endo/marshal@npm:1.8.0" + dependencies: + "@endo/common": "npm:^1.2.13" + "@endo/env-options": "npm:^1.1.11" + "@endo/errors": "npm:^1.2.13" + "@endo/eventual-send": "npm:^1.3.4" + "@endo/nat": "npm:^5.1.3" + "@endo/pass-style": "npm:^1.6.3" + "@endo/promise-kit": "npm:^1.1.13" + checksum: 10c0/fd6d9b7bdc499fa21b4f739d141d2989914e868c1cef0937010c0f9c04d45ffac5cf1356a7fc45898ece7155c98e70d2bd2886c075cd6460c9fa6685672513ac + languageName: node + linkType: hard + +"@endo/module-source@npm:^1.3.3": + version: 1.3.3 + resolution: "@endo/module-source@npm:1.3.3" + dependencies: + "@babel/generator": "npm:^7.26.3" + "@babel/parser": "npm:~7.26.2" + "@babel/traverse": "npm:~7.25.9" + "@babel/types": "npm:~7.26.0" + ses: "npm:^1.14.0" + checksum: 10c0/feafd38a1b0408ac771928ef8115b2f27c30fafbdcd60f4f2d0ef9bbbab942b7c6fe6f54665c7508f9a00850daba941f35bd4c297d3035c9c49300bde0efb92f + languageName: node + linkType: hard + +"@endo/nat@npm:^4.1.31": + version: 4.1.31 + resolution: "@endo/nat@npm:4.1.31" + checksum: 10c0/d77f2663b6f22cf4912e71d9a7b9e3e8268519a46d95675197bb2eaf788cccfefda909e632db446d161701a77595d7bb481afc0b1fe026167cbbf245ed3ccdb8 + languageName: node + linkType: hard + +"@endo/nat@npm:^5.1.3": + version: 5.1.3 + resolution: "@endo/nat@npm:5.1.3" + checksum: 10c0/5ba88c826d44c6e5bde05482ee97dccc8ad57678ea75bd154937fb2ffbc3ca169782be8bf9d2bc2b4c170c6bce8dd037acc6813be00338589744996d0c632037 + languageName: node + linkType: hard + +"@endo/pass-style@npm:^0.1.7": + version: 0.1.7 + resolution: "@endo/pass-style@npm:0.1.7" + dependencies: + "@endo/promise-kit": "npm:^0.2.60" + "@fast-check/ava": "npm:^1.1.5" + checksum: 10c0/0fc8ca918e4b2888619fa10765b9a414f1ab921b590f257421f4af4a523b80b2afc736280691ed99e8f8807ead3afc478c1a855772c52a4c8fbe43733f3fe656 + languageName: node + linkType: hard + +"@endo/pass-style@npm:^1.6.3": + version: 1.6.3 + resolution: "@endo/pass-style@npm:1.6.3" + dependencies: + "@endo/common": "npm:^1.2.13" + "@endo/env-options": "npm:^1.1.11" + "@endo/errors": "npm:^1.2.13" + "@endo/eventual-send": "npm:^1.3.4" + "@endo/promise-kit": "npm:^1.1.13" + checksum: 10c0/3d7b74128191e031275bdc46360ee1f93e0c869960b423ef4e9d7726d245f53c904eb06945e6fa56191ebf740e61ba770e68fce53c0491b57e8b6bcc1928964f + languageName: node + linkType: hard + +"@endo/path-compare@npm:^1.1.0": + version: 1.1.0 + resolution: "@endo/path-compare@npm:1.1.0" + checksum: 10c0/1d6ec5007d2c09ad2fbc32c072ae98406ca92ead52f342b0161a76d81cd3e56bf3784afc5400788be56d804c5596590f86bad3d81938cf8578c715522e56010c + languageName: node + linkType: hard + +"@endo/patterns@npm:^0.2.5": + version: 0.2.6 + resolution: "@endo/patterns@npm:0.2.6" + dependencies: + "@endo/eventual-send": "npm:^0.17.6" + "@endo/marshal": "npm:^0.8.9" + "@endo/promise-kit": "npm:^0.2.60" + checksum: 10c0/fa8f6bc1dcea4296486708d36baa1d306a0c7c5f7d88b0e2469e27aaef4e97f68a89c39dfe53a128888abbc568851a3ba3c63da78242b925a4811bd56912c133 + languageName: node + linkType: hard + +"@endo/patterns@npm:^1.7.0": + version: 1.7.0 + resolution: "@endo/patterns@npm:1.7.0" + dependencies: + "@endo/common": "npm:^1.2.13" + "@endo/errors": "npm:^1.2.13" + "@endo/eventual-send": "npm:^1.3.4" + "@endo/marshal": "npm:^1.8.0" + "@endo/pass-style": "npm:^1.6.3" + "@endo/promise-kit": "npm:^1.1.13" + checksum: 10c0/f054cf9c1201eaad084ce278603afc319a6dff69c1d51c9a3ff3288304a7c3d3097e0887ab83889c9fbb4f3bc9eeb22201484438b310ca2ed9bb56504adba1e4 + languageName: node + linkType: hard + +"@endo/promise-kit@npm:^0.2.60": + version: 0.2.60 + resolution: "@endo/promise-kit@npm:0.2.60" + dependencies: + ses: "npm:^0.18.8" + checksum: 10c0/45fa191d0211cf9e99a6b300c373849c7662e8832e20fbcfa4a8f4938d9c9509f22c3a76377629be70447adc1d2e4e99a56a99395af19ba2a0c1010bfe1da4dd + languageName: node + linkType: hard + +"@endo/promise-kit@npm:^1.1.13": + version: 1.1.13 + resolution: "@endo/promise-kit@npm:1.1.13" + dependencies: + ses: "npm:^1.14.0" + checksum: 10c0/3f358b7a82d1ef856b1aef60c663dbc0bfa5f8f9ddb247e8973f7f4d88849b9fe669b4929b0bc8a452640bd7803ae8da27c4d8f3fc7850b1f82efdabe1cada5a + languageName: node + linkType: hard + +"@endo/stream@npm:^1.2.13": + version: 1.2.13 + resolution: "@endo/stream@npm:1.2.13" + dependencies: + "@endo/eventual-send": "npm:^1.3.4" + "@endo/promise-kit": "npm:^1.1.13" + ses: "npm:^1.14.0" + checksum: 10c0/b5d95a65e280322bdc90a1474021478e3788b6d2ec1b7df80dd9fed5d9bfd8c946dfb04a1f0317c317477a8cecefc8bde9f1cba84476d8135ba254b76886e069 + languageName: node + linkType: hard + +"@endo/trampoline@npm:^1.0.5": + version: 1.0.5 + resolution: "@endo/trampoline@npm:1.0.5" + checksum: 10c0/2b8b2b657d01ca7eaea9b2f942d052660342ae32752c2d20ff80fd297012608c843d8fb1ab3ae49642930c9aa7d9d6441d30148612902db2777f8abbd4df96b6 + languageName: node + linkType: hard + +"@endo/zip@npm:^1.0.11": + version: 1.0.11 + resolution: "@endo/zip@npm:1.0.11" + checksum: 10c0/bf1a6c092fa9805c815625bcd241dda349683e16f9b5044c8fe78991b656941e2c20d4bdf98e01ac0fa97739ac527d8127de738062ef9bfbbff0827762a9c302 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/aix-ppc64@npm:0.27.0" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/android-arm64@npm:0.27.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/android-arm@npm:0.27.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/android-x64@npm:0.27.0" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/darwin-arm64@npm:0.27.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/darwin-x64@npm:0.27.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/freebsd-arm64@npm:0.27.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/freebsd-x64@npm:0.27.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-arm64@npm:0.27.0" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-arm@npm:0.27.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-ia32@npm:0.27.0" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-loong64@npm:0.27.0" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-mips64el@npm:0.27.0" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-ppc64@npm:0.27.0" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-riscv64@npm:0.27.0" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-s390x@npm:0.27.0" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-x64@npm:0.27.0" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/netbsd-arm64@npm:0.27.0" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/netbsd-x64@npm:0.27.0" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/openbsd-arm64@npm:0.27.0" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/openbsd-x64@npm:0.27.0" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/openharmony-arm64@npm:0.27.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/sunos-x64@npm:0.27.0" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/win32-arm64@npm:0.27.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/win32-ia32@npm:0.27.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/win32-x64@npm:0.27.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.1 resolution: "@eslint-community/eslint-utils@npm:4.4.1" @@ -147,6 +954,13 @@ __metadata: languageName: node linkType: hard +"@eslint-community/regexpp@npm:^4.6.1": + version: 4.12.2 + resolution: "@eslint-community/regexpp@npm:4.12.2" + checksum: 10c0/fddcbc66851b308478d04e302a4d771d6917a0b3740dc351513c0da9ca2eab8a1adf99f5e0aa7ab8b13fa0df005c81adeee7e63a92f3effd7d367a163b721c2d + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^0.4.3": version: 0.4.3 resolution: "@eslint/eslintrc@npm:0.4.3" @@ -164,6 +978,95 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 + languageName: node + linkType: hard + +"@fast-check/ava@npm:^1.1.5": + version: 1.2.1 + resolution: "@fast-check/ava@npm:1.2.1" + dependencies: + fast-check: "npm:^3.0.0" + peerDependencies: + ava: ^4 || ^5 || ^6 + checksum: 10c0/3800098fd7e8098102544a2f7a595351d063a7ebaeca18ed4901df5ec2679da2330ba8c0db2c820721d4cbb3e23d817ba22fec6d058957930e229f44fa71a684 + languageName: node + linkType: hard + +"@finquick/ertp-ledgerguise@workspace:packages/ertp-ledgerguise": + version: 0.0.0-use.local + resolution: "@finquick/ertp-ledgerguise@workspace:packages/ertp-ledgerguise" + dependencies: + "@agoric/ertp": "npm:0.16.3-dev-dc67c18.0.dc67c18" + "@types/better-sqlite3": "npm:^7.6.1" + ava: "npm:^5.3.1" + better-sqlite3: "npm:^12.6.2" + ts-node: "npm:^10.9.2" + typescript: "npm:~5.9.3" + languageName: unknown + linkType: soft + +"@google/clasp@npm:^2.3.0": + version: 2.5.0 + resolution: "@google/clasp@npm:2.5.0" + dependencies: + "@sindresorhus/is": "npm:^4.0.1" + chalk: "npm:^4.1.2" + chokidar: "npm:^3.5.2" + cli-truncate: "npm:^3.0.0" + commander: "npm:^8.1.0" + debounce: "npm:^1.2.1" + dotf: "npm:^2.0.2" + find-up: "npm:^6.0.0" + fs-extra: "npm:^10.0.0" + fuzzy: "npm:^0.1.3" + gaxios: "npm:^4.2.1" + google-auth-library: "npm:^7.6.2" + googleapis: "npm:^84.0.0" + inquirer: "npm:^8.1.2" + inquirer-autocomplete-prompt-ipt: "npm:^2.0.0" + is-reachable: "npm:^5.0.0" + log-symbols: "npm:^5.0.0" + loud-rejection: "npm:^2.2.0" + make-dir: "npm:^3.1.0" + multimatch: "npm:^5.0.0" + normalize-newline: "npm:^4.1.0" + open: "npm:^8.2.1" + ora: "npm:^6.0.0" + p-map: "npm:^5.1.0" + read-pkg-up: "npm:^8.0.0" + recursive-readdir: "npm:^2.2.2" + server-destroy: "npm:^1.0.1" + split-lines: "npm:^3.0.0" + strip-bom: "npm:^5.0.0" + ts2gas: "npm:^4.2.0" + typescript: "npm:^4.4.2" + bin: + clasp: build/src/index.js + checksum: 10c0/b6aaa5b8afadb38aa0d400d7996164b6b95170ad81e34bf43206aa525d82fc921f6f9c9f063f11abe9f911d58297e946f2ab827c11089c64a6da638543e6038c + languageName: node + linkType: hard + "@google/clasp@npm:^2.4.2": version: 2.4.2 resolution: "@google/clasp@npm:2.4.2" @@ -204,6 +1107,17 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e + languageName: node + linkType: hard + "@humanwhocodes/config-array@npm:^0.5.0": version: 0.5.0 resolution: "@humanwhocodes/config-array@npm:0.5.0" @@ -215,10 +1129,251 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.0": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: 10c0/c3c35fdb70c04a569278351c75553e293ae339684ed75895edc79facc7276e351115786946658d78133130c0cca80e57e2203bc07f8fa7fe7980300e8deef7db +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.0": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: 10c0/c3c35fdb70c04a569278351c75553e293ae339684ed75895edc79facc7276e351115786946658d78133130c0cca80e57e2203bc07f8fa7fe7980300e8deef7db + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c + languageName: node + linkType: hard + +"@img/colour@npm:^1.0.0": + version: 1.0.0 + resolution: "@img/colour@npm:1.0.0" + checksum: 10c0/02261719c1e0d7aa5a2d585981954f2ac126f0c432400aa1a01b925aa2c41417b7695da8544ee04fd29eba7ecea8eaf9b8bef06f19dc8faba78f94eeac40667d + languageName: node + linkType: hard + +"@img/sharp-darwin-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-arm64": + optional: true + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-darwin-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-x64": + optional: true + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.2.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.2.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm@npm:1.2.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-ppc64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-ppc64@npm:1.2.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-riscv64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-riscv64@npm:1.2.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-s390x@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.2.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linux-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-arm@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm": + optional: true + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-ppc64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-ppc64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-ppc64": + optional: true + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-riscv64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-riscv64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-riscv64": + optional: true + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-s390x@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-s390x@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-s390x": + optional: true + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-wasm32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-wasm32@npm:0.34.5" + dependencies: + "@emnapi/runtime": "npm:^1.7.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@img/sharp-win32-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-arm64@npm:0.34.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-win32-ia32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-ia32@npm:0.34.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@img/sharp-win32-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-x64@npm:0.34.5" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -254,6 +1409,50 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.12": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -271,7 +1470,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3": +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -303,6 +1502,139 @@ __metadata: languageName: node linkType: hard +"@octokit/auth-token@npm:^2.4.0": + version: 2.5.0 + resolution: "@octokit/auth-token@npm:2.5.0" + dependencies: + "@octokit/types": "npm:^6.0.3" + checksum: 10c0/e9f757b6acdee91885dab97069527c86829da0dc60476c38cdff3a739ff47fd026262715965f91e84ec9d01bc43d02678bc8ed472a85395679af621b3ddbe045 + languageName: node + linkType: hard + +"@octokit/endpoint@npm:^6.0.1": + version: 6.0.12 + resolution: "@octokit/endpoint@npm:6.0.12" + dependencies: + "@octokit/types": "npm:^6.0.3" + is-plain-object: "npm:^5.0.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10c0/b2d9c91f00ab7c997338d08a06bfd12a67d86060bc40471f921ba424e4de4e5a0a1117631f2a8a8787107d89d631172dd157cb5e2633674b1ae3a0e2b0dcfa3e + languageName: node + linkType: hard + +"@octokit/openapi-types@npm:^12.11.0": + version: 12.11.0 + resolution: "@octokit/openapi-types@npm:12.11.0" + checksum: 10c0/b3bb3684d9686ef948d8805ab56f85818f36e4cb64ef97b8e48dc233efefef22fe0bddd9da705fb628ea618a1bebd62b3d81b09a3f7dce9522f124d998041896 + languageName: node + linkType: hard + +"@octokit/plugin-paginate-rest@npm:^1.1.1": + version: 1.1.2 + resolution: "@octokit/plugin-paginate-rest@npm:1.1.2" + dependencies: + "@octokit/types": "npm:^2.0.1" + checksum: 10c0/c0b42a7eb92c6b3fb254e85750fe48b667682be277dc9ccafbb91da241fc18396867739b058ae89d48455b3e75eb2967ac5e196fe54a276b58ed56173f5cd188 + languageName: node + linkType: hard + +"@octokit/plugin-request-log@npm:^1.0.0": + version: 1.0.4 + resolution: "@octokit/plugin-request-log@npm:1.0.4" + peerDependencies: + "@octokit/core": ">=3" + checksum: 10c0/7238585445555db553912e0cdef82801c89c6e5cbc62c23ae086761c23cc4a403d6c3fddd20348bbd42fb7508e2c2fce370eb18fdbe3fbae2c0d2c8be974f4cc + languageName: node + linkType: hard + +"@octokit/plugin-rest-endpoint-methods@npm:2.4.0": + version: 2.4.0 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:2.4.0" + dependencies: + "@octokit/types": "npm:^2.0.1" + deprecation: "npm:^2.3.1" + checksum: 10c0/eedb9e6c3589651a391aa2c850d33fbfb01c94448d5da85b6208ff1fc05d556b05e660db019306c473149727ed83c5711f138179a39651d2cd548a8da2c4bc73 + languageName: node + linkType: hard + +"@octokit/request-error@npm:^1.0.2": + version: 1.2.1 + resolution: "@octokit/request-error@npm:1.2.1" + dependencies: + "@octokit/types": "npm:^2.0.0" + deprecation: "npm:^2.0.0" + once: "npm:^1.4.0" + checksum: 10c0/0142170094b5c963de7012aa7d081c3aa05ce19ccd365447c9ca57d475bdf64a79549cb2d5e14348deabdb3c6577966e5f6996eeaa5ea3750b87688cc1c0a0f1 + languageName: node + linkType: hard + +"@octokit/request-error@npm:^2.1.0": + version: 2.1.0 + resolution: "@octokit/request-error@npm:2.1.0" + dependencies: + "@octokit/types": "npm:^6.0.3" + deprecation: "npm:^2.0.0" + once: "npm:^1.4.0" + checksum: 10c0/eb50eb2734aa903f1e855ac5887bb76d6f237a3aaa022b09322a7676c79bb8020259b25f84ab895c4fc7af5cc736e601ec8cc7e9040ca4629bac8cb393e91c40 + languageName: node + linkType: hard + +"@octokit/request@npm:^5.2.0": + version: 5.6.3 + resolution: "@octokit/request@npm:5.6.3" + dependencies: + "@octokit/endpoint": "npm:^6.0.1" + "@octokit/request-error": "npm:^2.1.0" + "@octokit/types": "npm:^6.16.1" + is-plain-object: "npm:^5.0.0" + node-fetch: "npm:^2.6.7" + universal-user-agent: "npm:^6.0.0" + checksum: 10c0/a546dc05665c6cf8184ae7c4ac3ed4f0c339c2170dd7e2beeb31a6e0a9dd968ca8ad960edbd2af745e585276e692c9eb9c6dbf1a8c9d815eb7b7fd282f3e67fc + languageName: node + linkType: hard + +"@octokit/rest@npm:^16.33.1": + version: 16.43.2 + resolution: "@octokit/rest@npm:16.43.2" + dependencies: + "@octokit/auth-token": "npm:^2.4.0" + "@octokit/plugin-paginate-rest": "npm:^1.1.1" + "@octokit/plugin-request-log": "npm:^1.0.0" + "@octokit/plugin-rest-endpoint-methods": "npm:2.4.0" + "@octokit/request": "npm:^5.2.0" + "@octokit/request-error": "npm:^1.0.2" + atob-lite: "npm:^2.0.0" + before-after-hook: "npm:^2.0.0" + btoa-lite: "npm:^1.0.0" + deprecation: "npm:^2.0.0" + lodash.get: "npm:^4.4.2" + lodash.set: "npm:^4.3.2" + lodash.uniq: "npm:^4.5.0" + octokit-pagination-methods: "npm:^1.1.0" + once: "npm:^1.4.0" + universal-user-agent: "npm:^4.0.0" + checksum: 10c0/8e51e16a54dcffb007aeefa48d6dda98f84737c044e15c9e8b123765efcf546b5f3465b37e11666f502d637fac3d4c2ef770ed9e7ba7e21330d1b6d773eccde7 + languageName: node + linkType: hard + +"@octokit/types@npm:^2.0.0, @octokit/types@npm:^2.0.1": + version: 2.16.2 + resolution: "@octokit/types@npm:2.16.2" + dependencies: + "@types/node": "npm:>= 8" + checksum: 10c0/8f324639ea2792f38dee104970f7d74584da6747ca41a5f709e0dcd54bc55095af3c47845a284f132ced4dec5a6d5a9c61ed77c3adaccfb5ad7f347fcb1a55b3 + languageName: node + linkType: hard + +"@octokit/types@npm:^6.0.3, @octokit/types@npm:^6.16.1": + version: 6.41.0 + resolution: "@octokit/types@npm:6.41.0" + dependencies: + "@octokit/openapi-types": "npm:^12.11.0" + checksum: 10c0/81cfa58e5524bf2e233d75a346e625fd6e02a7b919762c6ddb523ad6fb108943ef9d34c0298ff3c5a44122e449d9038263bc22959247fd6ff8894a48888ac705 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -310,6 +1642,40 @@ __metadata: languageName: node linkType: hard +"@poppinss/colors@npm:^4.1.5": + version: 4.1.6 + resolution: "@poppinss/colors@npm:4.1.6" + dependencies: + kleur: "npm:^4.1.5" + checksum: 10c0/5c2cec5393e33294465873002f4c570adf36b5405b9f06551485162a6fb422d01de90ac20cb00800be6ab2f0d93da26e67302e95691dff2e0aa339cf93e5bf7f + languageName: node + linkType: hard + +"@poppinss/dumper@npm:^0.6.4": + version: 0.6.5 + resolution: "@poppinss/dumper@npm:0.6.5" + dependencies: + "@poppinss/colors": "npm:^4.1.5" + "@sindresorhus/is": "npm:^7.0.2" + supports-color: "npm:^10.0.0" + checksum: 10c0/7a0916fe4ce543cac1e61f09218e5c88b903ad0d853301b790686c772b7f5c595a04beccbf13172e0c77dc64b132b27ad438b888816fd7f6128c816290f9dc1f + languageName: node + linkType: hard + +"@poppinss/exception@npm:^1.2.2": + version: 1.2.3 + resolution: "@poppinss/exception@npm:1.2.3" + checksum: 10c0/44e48400c9f2d33a4904bee99321b89239774bb9210049f1c55864725fd524ff55bc78a5a94a13d5edea93b84e13023c229c88ebba8c2dc717fb4b2205e42ac7 + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^0.7.0": + version: 0.7.0 + resolution: "@sindresorhus/is@npm:0.7.0" + checksum: 10c0/c5b483cfa36556326267d525504dfadced0cc3516c2014bbe1c60377ca8e778cd74de26b24666a818ab41da2660bb80d61f545e93be3471f5d022a9999ed5bb9 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^4.0.0, @sindresorhus/is@npm:^4.0.1": version: 4.6.0 resolution: "@sindresorhus/is@npm:4.6.0" @@ -317,6 +1683,20 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^7.0.2": + version: 7.2.0 + resolution: "@sindresorhus/is@npm:7.2.0" + checksum: 10c0/0040c17d7826414363f99f5d56077c200789d51e6dfe5542920bfb29ab3828ec0ebf2845e8bae796bee461debb646b5e4c0a623140131cf3143471e915b50b54 + languageName: node + linkType: hard + +"@speed-highlight/core@npm:^1.2.7": + version: 1.2.14 + resolution: "@speed-highlight/core@npm:1.2.14" + checksum: 10c0/8391bbfa04e9ea1677119b463f9a1413024a83319d271f5eacbc64dcd6d05394f092b876a5e47612eb98b4b55c1abe6c1b16270462ad4ac0f21311a1736e540f + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^4.0.5": version: 4.0.6 resolution: "@szmarczak/http-timer@npm:4.0.6" @@ -326,6 +1706,34 @@ __metadata: languageName: node linkType: hard +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.12 + resolution: "@tsconfig/node10@npm:1.0.12" + checksum: 10c0/7bbbd7408cfaced86387a9b1b71cebc91c6fd701a120369735734da8eab1a4773fc079abd9f40c9e0b049e12586c8ac0e13f0da596bfd455b9b4c3faa813ebc5 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + "@types/better-sqlite3@npm:^7.6.1": version: 7.6.4 resolution: "@types/better-sqlite3@npm:7.6.4" @@ -347,6 +1755,32 @@ __metadata: languageName: node linkType: hard +"@types/follow-redirects@npm:^1.13.0": + version: 1.14.4 + resolution: "@types/follow-redirects@npm:1.14.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/5e0d09e6c9a8bee09b1af9e1fce80fcc2e22f082d786b2f25aa5ccb3be996cf8b9ba866024e17817e01e961586aa2aad13c38c6c3a0dabbe8654d4b47d07977c + languageName: node + linkType: hard + +"@types/fs-extra@npm:^11.0.4": + version: 11.0.4 + resolution: "@types/fs-extra@npm:11.0.4" + dependencies: + "@types/jsonfile": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/9e34f9b24ea464f3c0b18c3f8a82aefc36dc524cc720fc2b886e5465abc66486ff4e439ea3fb2c0acebf91f6d3f74e514f9983b1f02d4243706bdbb7511796ad + languageName: node + linkType: hard + +"@types/google-apps-script@npm:^1.0.17": + version: 1.0.100 + resolution: "@types/google-apps-script@npm:1.0.100" + checksum: 10c0/f09794beb7578b2106cd942189f5f7bef766b4ce0f1fe4eb06ebd84cd2ad16352a3d765e93e4724dceff7589b4601dce2f1f683b2398e024ef12cecad7f58d00 + languageName: node + linkType: hard + "@types/google-apps-script@npm:^1.0.83": version: 1.0.83 resolution: "@types/google-apps-script@npm:1.0.83" @@ -354,6 +1788,15 @@ __metadata: languageName: node linkType: hard +"@types/google-spreadsheet@npm:^4.0.0": + version: 4.0.0 + resolution: "@types/google-spreadsheet@npm:4.0.0" + dependencies: + google-spreadsheet: "npm:*" + checksum: 10c0/1d093d30158a2fdde9a0a77c8b584341d663950b115d3d8ef5e4b77fc143b12c1d3f2570345de271d0a46fd53a1689e59fa9358939db440f79acbd113ea5e7a9 + languageName: node + linkType: hard + "@types/http-cache-semantics@npm:*": version: 4.0.1 resolution: "@types/http-cache-semantics@npm:4.0.1" @@ -382,7 +1825,16 @@ __metadata: languageName: node linkType: hard -"@types/keyv@npm:^3.1.4": +"@types/jsonfile@npm:*": + version: 6.1.4 + resolution: "@types/jsonfile@npm:6.1.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/b12d068b021e4078f6ac4441353965769be87acf15326173e2aea9f3bf8ead41bd0ad29421df5bbeb0123ec3fc02eb0a734481d52903704a1454a1845896b9eb + languageName: node + linkType: hard + +"@types/keyv@npm:^3.1.1, @types/keyv@npm:^3.1.4": version: 3.1.4 resolution: "@types/keyv@npm:3.1.4" dependencies: @@ -398,6 +1850,22 @@ __metadata: languageName: node linkType: hard +"@types/minimist@npm:^1.2.5": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 10c0/3f791258d8e99a1d7d0ca2bda1ca6ea5a94e5e7b8fc6cde84dd79b0552da6fb68ade750f0e17718f6587783c24254bbca0357648dd59dc3812c150305cabdc46 + languageName: node + linkType: hard + +"@types/mysql@npm:^2.15.15": + version: 2.15.27 + resolution: "@types/mysql@npm:2.15.27" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/d34064de1697e9e29dbad313df759a8c7aff9d9d1918c9b666b1ebc894b9a0c1c6f4ae779453fdcd20b892fa60a8e55640138c292c6c2a28d2f758eaeb539ce3 + languageName: node + linkType: hard + "@types/node@npm:*": version: 20.4.8 resolution: "@types/node@npm:20.4.8" @@ -405,6 +1873,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:>= 8": + version: 25.0.10 + resolution: "@types/node@npm:25.0.10" + dependencies: + undici-types: "npm:~7.16.0" + checksum: 10c0/9edc3c812b487c32c76eebac7c87acae1f69515a0bc3f6b545806d513eb9e918c3217bf751dc93da39f60e06bf1b0caa92258ef3a6dd6457124b2e761e54f61f + languageName: node + linkType: hard + "@types/node@npm:^14.14.7": version: 14.18.54 resolution: "@types/node@npm:14.18.54" @@ -412,6 +1889,22 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^24.0.0, @types/node@npm:^24.0.3": + version: 24.10.9 + resolution: "@types/node@npm:24.10.9" + dependencies: + undici-types: "npm:~7.16.0" + checksum: 10c0/e9e436fcd2136bddb1bbe3271a89f4653910bcf6ee8047c4117f544c7905a106c039e2720ee48f28505ef2560e22fb9ead719f28bf5e075fdde0c1120e38e3b2 + languageName: node + linkType: hard + +"@types/node@npm:^8.0.24": + version: 8.10.66 + resolution: "@types/node@npm:8.10.66" + checksum: 10c0/425e0fca5bad0d6ff14336946a1e3577750dcfbb7449614786d3241ca78ff44e3beb43eace122682de1b9d8e25cf2a0456a0b3e500d78cb55cab68f892e38141 + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.1 resolution: "@types/normalize-package-data@npm:2.4.1" @@ -419,6 +1912,13 @@ __metadata: languageName: node linkType: hard +"@types/ps-tree@npm:^1.1.6": + version: 1.1.6 + resolution: "@types/ps-tree@npm:1.1.6" + checksum: 10c0/5bac64e587b82d4a1b0079f04fa5a54380a94b118e99c8096d52444d722a8f9932dbc62138da130b2f09cd6721f8eae1eac35d3cb68b4126c08e4e92d4c4962c + languageName: node + linkType: hard + "@types/responselike@npm:^1.0.0": version: 1.0.0 resolution: "@types/responselike@npm:1.0.0" @@ -442,6 +1942,13 @@ __metadata: languageName: node linkType: hard +"@types/which@npm:^3.0.4": + version: 3.0.4 + resolution: "@types/which@npm:3.0.4" + checksum: 10c0/036e4cb243ebfd5cf4893be2ab3b9a60a22368811c1f1c78fb8fc70cadc274024282d04b8d7c0948268372600003252d84e2d3a5e064014a543a5da235c5989d + languageName: node + linkType: hard + "@typescript-eslint/parser@npm:^4.21.0": version: 4.33.0 resolution: "@typescript-eslint/parser@npm:4.33.0" @@ -629,6 +2136,30 @@ __metadata: languageName: node linkType: hard +"@ungap/structured-clone@npm:^1.2.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a + languageName: node + linkType: hard + +"@yarnpkg/lockfile@npm:^1.1.0": + version: 1.1.0 + resolution: "@yarnpkg/lockfile@npm:1.1.0" + checksum: 10c0/0bfa50a3d756623d1f3409bc23f225a1d069424dbc77c6fd2f14fb377390cd57ec703dc70286e081c564be9051ead9ba85d81d66a3e68eeb6eb506d4e0c0fbda + languageName: node + linkType: hard + +"Capper@dckc/Capper#master": + version: 0.0.1 + resolution: "Capper@https://github.com/dckc/Capper.git#commit=9b3a3e222f72309e4928ef12feba03e7263dc565" + dependencies: + express: "npm:~3.4.1" + q: "npm:~1.0.1" + checksum: 10c0/88e7d90cd4f8b62d1427d622bd546be649fa9d5727c3755939e0f259c1c9b2a5fb6863fb1c3af8cc6311108732eb5042011df4b2f0b705fd2d68e8de9a3d715b + languageName: node + linkType: hard + "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -645,6 +2176,18 @@ __metadata: languageName: node linkType: hard +"abstract-socket@npm:^2.0.0": + version: 2.1.1 + resolution: "abstract-socket@npm:2.1.1" + dependencies: + bindings: "npm:^1.2.1" + nan: "npm:^2.12.1" + node-gyp: "npm:latest" + checksum: 10c0/fe03e03978d6614c460074c217d9ed74fee2f6ea01b15e9a6ea05d3c921752d7616eee6947faa7e37c8b1a87d51ee7d3bb754b9b95580c4eca64e5bc1f2fce9a + conditions: os=linux + languageName: node + linkType: hard + "accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -655,7 +2198,16 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.3.1": +"acorn-jsx@npm:^3.0.0": + version: 3.0.1 + resolution: "acorn-jsx@npm:3.0.1" + dependencies: + acorn: "npm:^3.0.4" + checksum: 10c0/ce6b4ace31fa615e9f2f4d9b5bd52f090e1af0125ca2cd4a880e218e5e45e26ff5b2e98bd29f882950fcc1329132845b29066b6fe0eca55e2093ac30cbbcb5e2 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" peerDependencies: @@ -664,6 +2216,33 @@ __metadata: languageName: node linkType: hard +"acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 + languageName: node + linkType: hard + +"acorn@npm:^3.0.4": + version: 3.3.0 + resolution: "acorn@npm:3.3.0" + bin: + acorn: ./bin/acorn + checksum: 10c0/04d645eede54b19e0aab3da2bea73778b1b42b0c45598fab95687c01bcae0fb47eec7661a73c09781b400a884b47f279fb5c2bdc24f5d09642b5ef3ef62b03a2 + languageName: node + linkType: hard + +"acorn@npm:^5.5.0": + version: 5.7.4 + resolution: "acorn@npm:5.7.4" + bin: + acorn: bin/acorn + checksum: 10c0/b29e61d48fa31ae69d38d74bb213b77b32de6317f125890a6cb76b44d173adccbcd3a07fc9a86acdfe8ab0a80f42b5ec6290df8b7944e0506504ac3b716232bd + languageName: node + linkType: hard + "acorn@npm:^7.4.0": version: 7.4.1 resolution: "acorn@npm:7.4.1" @@ -673,6 +2252,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.11.0, acorn@npm:^8.4.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" + bin: + acorn: bin/acorn + checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec + languageName: node + linkType: hard + "agent-base@npm:6": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -711,7 +2299,26 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.12.4": +"ajv-keywords@npm:^1.0.0": + version: 1.5.1 + resolution: "ajv-keywords@npm:1.5.1" + peerDependencies: + ajv: ">=4.10.0" + checksum: 10c0/4c3b154d22d2aae727e15b0063412c6bc59feb9abd1b80432b5aeb9353c76bc9048bd01bb18bc4591459fc307a4e71b85ec9d77f9de7d121e93e8b006b73483c + languageName: node + linkType: hard + +"ajv@npm:^4.7.0": + version: 4.11.8 + resolution: "ajv@npm:4.11.8" + dependencies: + co: "npm:^4.6.0" + json-stable-stringify: "npm:^1.0.1" + checksum: 10c0/212e104cf5bf2762cca83c53493a5365ae334803e1a017160cfa69720818fcb87cb27eb4848d7c6350f403a3b306a92b99c5afb03c524defac2e997ba52240b7 + languageName: node + linkType: hard + +"ajv@npm:^6.10.0, ajv@npm:^6.10.2, ajv@npm:^6.12.3, ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -735,6 +2342,24 @@ __metadata: languageName: node linkType: hard +"align-text@npm:^0.1.1, align-text@npm:^0.1.3": + version: 0.1.4 + resolution: "align-text@npm:0.1.4" + dependencies: + kind-of: "npm:^3.0.2" + longest: "npm:^1.0.1" + repeat-string: "npm:^1.5.2" + checksum: 10c0/c0fc03fe5de15cda89f9babb91e77a255013b49912031e86e79f25547aa666622f0a68be3da47fc834ab2c97cfb6b0a967509b2ce883f5306d9c78f6069ced7a + languageName: node + linkType: hard + +"amdefine@npm:>=0.0.4": + version: 1.0.1 + resolution: "amdefine@npm:1.0.1" + checksum: 10c0/ba8aa5d4ff5248b2ed067111e72644b36b5b7ae88d9a5a2c4223dddb3bdc9102db67291e0b414f59f12c6479ac6a365886bac72c7965e627cbc732e0962dd1ab + languageName: node + linkType: hard + "ansi-colors@npm:^4.1.1": version: 4.1.3 resolution: "ansi-colors@npm:4.1.3" @@ -742,6 +2367,13 @@ __metadata: languageName: node linkType: hard +"ansi-escapes@npm:^1.1.0": + version: 1.4.0 + resolution: "ansi-escapes@npm:1.4.0" + checksum: 10c0/11ee31a0827d2c95129ea7c3df13d4d9d15b487517209d1d16027a876e6029e1c464ba626771af525a5aee12b26a740fc0378142b3193f3a62aaa2f03b7a5e9c + languageName: node + linkType: hard + "ansi-escapes@npm:^4.2.1": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" @@ -751,6 +2383,27 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^2.0.0": + version: 2.1.1 + resolution: "ansi-regex@npm:2.1.1" + checksum: 10c0/78cebaf50bce2cb96341a7230adf28d804611da3ce6bf338efa7b72f06cc6ff648e29f80cd95e582617ba58d5fdbec38abfeed3500a98bce8381a9daec7c548b + languageName: node + linkType: hard + +"ansi-regex@npm:^3.0.0": + version: 3.0.1 + resolution: "ansi-regex@npm:3.0.1" + checksum: 10c0/d108a7498b8568caf4a46eea4f1784ab4e0dfb2e3f3938c697dee21443d622d765c958f2b7e2b9f6b9e55e2e2af0584eaa9915d51782b89a841c28e744e7a167 + languageName: node + linkType: hard + +"ansi-regex@npm:^4.1.0": + version: 4.1.1 + resolution: "ansi-regex@npm:4.1.1" + checksum: 10c0/d36d34234d077e8770169d980fed7b2f3724bfa2a01da150ccd75ef9707c80e883d27cdf7a0eac2f145ac1d10a785a8a855cffd05b85f778629a0db62e7033da + languageName: node + linkType: hard + "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -765,7 +2418,14 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.1": +"ansi-styles@npm:^2.2.1": + version: 2.2.1 + resolution: "ansi-styles@npm:2.2.1" + checksum: 10c0/7c68aed4f1857389e7a12f85537ea5b40d832656babbf511cc7ecd9efc52889b9c3e5653a71a6aade783c3c5e0aa223ad4ff8e83c27ac8a666514e6c79068cab + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" dependencies: @@ -783,10 +2443,24 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"ansi-styles@npm:^6.2.1": + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 + languageName: node + linkType: hard + +"anylogger@npm:^0.21.0": + version: 0.21.0 + resolution: "anylogger@npm:0.21.0" + checksum: 10c0/1ca7fcf5bc2b78d1e1d9b8c8cc7ce50b5c6cc67a8da5a28c9c975b7b46fff255a04abab02de38a5139190c9d8b34b3d6c59af6724521b077f7d7dfbad9b47a9c languageName: node linkType: hard @@ -800,6 +2474,13 @@ __metadata: languageName: node linkType: hard +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -809,6 +2490,34 @@ __metadata: languageName: node linkType: hard +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"arr-diff@npm:^4.0.0": + version: 4.0.0 + resolution: "arr-diff@npm:4.0.0" + checksum: 10c0/67b80067137f70c89953b95f5c6279ad379c3ee39f7143578e13bd51580a40066ee2a55da066e22d498dce10f68c2d70056d7823f972fab99dfbf4c78d0bc0f7 + languageName: node + linkType: hard + +"arr-flatten@npm:^1.1.0": + version: 1.1.0 + resolution: "arr-flatten@npm:1.1.0" + checksum: 10c0/bef53be02ed3bc58f202b3861a5b1eb6e1ae4fecf39c3ad4d15b1e0433f941077d16e019a33312d820844b0661777322acbb7d0c447b04d9bdf7d6f9c532548a + languageName: node + linkType: hard + +"arr-union@npm:^3.1.0": + version: 3.1.0 + resolution: "arr-union@npm:3.1.0" + checksum: 10c0/7d5aa05894e54aa93c77c5726c1dd5d8e8d3afe4f77983c0aa8a14a8a5cbe8b18f0cf4ecaa4ac8c908ef5f744d2cbbdaa83fd6e96724d15fea56cfa7f5efdd51 + languageName: node + linkType: hard + "array-buffer-byte-length@npm:^1.0.0": version: 1.0.0 resolution: "array-buffer-byte-length@npm:1.0.0" @@ -819,6 +2528,16 @@ __metadata: languageName: node linkType: hard +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d + languageName: node + linkType: hard + "array-differ@npm:^3.0.0": version: 3.0.0 resolution: "array-differ@npm:3.0.0" @@ -826,6 +2545,13 @@ __metadata: languageName: node linkType: hard +"array-each@npm:^1.0.1": + version: 1.0.1 + resolution: "array-each@npm:1.0.1" + checksum: 10c0/b5951ac450b560849143722d6785672ae71f5e9b061f11e7e2f775513a952e583e8bcedbba538a08049e235f5583756efec440fc6740a9b47b411cb487f65a9b + languageName: node + linkType: hard + "array-find-index@npm:^1.0.1": version: 1.0.2 resolution: "array-find-index@npm:1.0.2" @@ -853,6 +2579,13 @@ __metadata: languageName: node linkType: hard +"array-slice@npm:^1.0.0": + version: 1.1.0 + resolution: "array-slice@npm:1.1.0" + checksum: 10c0/dfefd705905f428b6c4cace2a787f308b5a64db5411e33cdf8ff883b6643f1703e48ac152b74eea482f8f6765fdf78b5277e2bad7840be2b4d5c23777db3266f + languageName: node + linkType: hard + "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -860,6 +2593,23 @@ __metadata: languageName: node linkType: hard +"array-unique@npm:^0.3.2": + version: 0.3.2 + resolution: "array-unique@npm:0.3.2" + checksum: 10c0/dbf4462cdba8a4b85577be07705210b3d35be4b765822a3f52962d907186617638ce15e0603a4fefdcf82f4cbbc9d433f8cbbd6855148a68872fa041b6474121 + languageName: node + linkType: hard + +"array.prototype.find@npm:2.0.0": + version: 2.0.0 + resolution: "array.prototype.find@npm:2.0.0" + dependencies: + define-properties: "npm:^1.1.2" + es-abstract: "npm:^1.5.0" + checksum: 10c0/4cf0bf4437a19bcb1ae7f1659dc31aae702f9759a4cd194565b6a741f9014f10fcdf6862101380055be0905126067e6a0e7b2195b42f18ee6dbad54297e397cd + languageName: node + linkType: hard + "array.prototype.findlastindex@npm:^1.2.2": version: 1.2.2 resolution: "array.prototype.findlastindex@npm:1.2.2" @@ -911,6 +2661,28 @@ __metadata: languageName: node linkType: hard +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + is-array-buffer: "npm:^3.0.4" + checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 + languageName: node + linkType: hard + +"arrgv@npm:^1.0.2": + version: 1.0.2 + resolution: "arrgv@npm:1.0.2" + checksum: 10c0/7e6e782e6b749923ac7cbc4048ef6fe0844c4a59bfc8932fcd4c44566ba25eed46501f94dd7cf3c7297da88f3f599ca056bfb77d0c2484aebc92f04239f69124 + languageName: node + linkType: hard + "arrify@npm:^2.0.0, arrify@npm:^2.0.1": version: 2.0.1 resolution: "arrify@npm:2.0.1" @@ -918,6 +2690,50 @@ __metadata: languageName: node linkType: hard +"arrify@npm:^3.0.0": + version: 3.0.0 + resolution: "arrify@npm:3.0.0" + checksum: 10c0/2e26601b8486f29780f1f70f7ac05a226755814c2a3ab42e196748f650af1dc310cd575a11dd4b9841c70fd7460b2dd2b8fe6fb7a3375878e2660706efafa58e + languageName: node + linkType: hard + +"asap@npm:~2.0.3": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d + languageName: node + linkType: hard + +"asn1@npm:~0.2.3": + version: 0.2.6 + resolution: "asn1@npm:0.2.6" + dependencies: + safer-buffer: "npm:~2.1.0" + checksum: 10c0/00c8a06c37e548762306bcb1488388d2f76c74c36f70c803f0c081a01d3bdf26090fc088cd812afc5e56a6d49e33765d451a5f8a68ab9c2b087eba65d2e980e0 + languageName: node + linkType: hard + +"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": + version: 1.0.0 + resolution: "assert-plus@npm:1.0.0" + checksum: 10c0/b194b9d50c3a8f872ee85ab110784911e696a4d49f7ee6fc5fb63216dedbefd2c55999c70cb2eaeb4cf4a0e0338b44e9ace3627117b5bf0d42460e9132f21b91 + languageName: node + linkType: hard + +"assign-symbols@npm:^1.0.0": + version: 1.0.0 + resolution: "assign-symbols@npm:1.0.0" + checksum: 10c0/29a654b8a6da6889a190d0d0efef4b1bfb5948fa06cbc245054aef05139f889f2f7c75b989917e3fde853fc4093b88048e4de8578a73a76f113d41bfd66e5775 + languageName: node + linkType: hard + +"astral-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "astral-regex@npm:1.0.0" + checksum: 10c0/ca460207a19d84c65671e1a85940101522d42f31a450cdb8f93b3464e6daeaf4b58a362826a6c11c57e6cd1976403d197abb0447cfc2087993a29b35c6d63b63 + languageName: node + linkType: hard + "astral-regex@npm:^2.0.0": version: 2.0.0 resolution: "astral-regex@npm:2.0.0" @@ -925,6 +2741,115 @@ __metadata: languageName: node linkType: hard +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 + languageName: node + linkType: hard + +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186 + languageName: node + linkType: hard + +"async-limiter@npm:~1.0.0": + version: 1.0.1 + resolution: "async-limiter@npm:1.0.1" + checksum: 10c0/0693d378cfe86842a70d4c849595a0bb50dc44c11649640ca982fa90cbfc74e3cc4753b5a0847e51933f2e9c65ce8e05576e75e5e1fd963a086e673735b35969 + languageName: node + linkType: hard + +"async@npm:~0.2.6": + version: 0.2.10 + resolution: "async@npm:0.2.10" + checksum: 10c0/714d284dc6c3ae59f3e8b347083e32c7657ba4ffc4ff945eb152ad4fb08def27e768992fcd4d9fd3b411c6b42f1541862ac917446bf2a1acfa0f302d1001f7d2 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"atob-lite@npm:^2.0.0": + version: 2.0.0 + resolution: "atob-lite@npm:2.0.0" + checksum: 10c0/8073795465dad14aa92b2cd3322472e93dbc8b87da5740150bbae9d716ee6cc254af1c375b7310a475d876eb24c25011584ae9c1277bdb3eb53ebb4cd236f501 + languageName: node + linkType: hard + +"atob@npm:^2.1.2": + version: 2.1.2 + resolution: "atob@npm:2.1.2" + bin: + atob: bin/atob.js + checksum: 10c0/ada635b519dc0c576bb0b3ca63a73b50eefacf390abb3f062558342a8d68f2db91d0c8db54ce81b0d89de3b0f000de71f3ae7d761fd7d8cc624278fe443d6c7e + languageName: node + linkType: hard + +"ava@npm:^5.3.1": + version: 5.3.1 + resolution: "ava@npm:5.3.1" + dependencies: + acorn: "npm:^8.8.2" + acorn-walk: "npm:^8.2.0" + ansi-styles: "npm:^6.2.1" + arrgv: "npm:^1.0.2" + arrify: "npm:^3.0.0" + callsites: "npm:^4.0.0" + cbor: "npm:^8.1.0" + chalk: "npm:^5.2.0" + chokidar: "npm:^3.5.3" + chunkd: "npm:^2.0.1" + ci-info: "npm:^3.8.0" + ci-parallel-vars: "npm:^1.0.1" + clean-yaml-object: "npm:^0.1.0" + cli-truncate: "npm:^3.1.0" + code-excerpt: "npm:^4.0.0" + common-path-prefix: "npm:^3.0.0" + concordance: "npm:^5.0.4" + currently-unhandled: "npm:^0.4.1" + debug: "npm:^4.3.4" + emittery: "npm:^1.0.1" + figures: "npm:^5.0.0" + globby: "npm:^13.1.4" + ignore-by-default: "npm:^2.1.0" + indent-string: "npm:^5.0.0" + is-error: "npm:^2.2.2" + is-plain-object: "npm:^5.0.0" + is-promise: "npm:^4.0.0" + matcher: "npm:^5.0.0" + mem: "npm:^9.0.2" + ms: "npm:^2.1.3" + p-event: "npm:^5.0.1" + p-map: "npm:^5.5.0" + picomatch: "npm:^2.3.1" + pkg-conf: "npm:^4.0.0" + plur: "npm:^5.1.0" + pretty-ms: "npm:^8.0.0" + resolve-cwd: "npm:^3.0.0" + stack-utils: "npm:^2.0.6" + strip-ansi: "npm:^7.0.1" + supertap: "npm:^3.0.1" + temp-dir: "npm:^3.0.0" + write-file-atomic: "npm:^5.0.1" + yargs: "npm:^17.7.2" + peerDependencies: + "@ava/typescript": "*" + peerDependenciesMeta: + "@ava/typescript": + optional: true + bin: + ava: entrypoints/cli.mjs + checksum: 10c0/262cbdb9e8c3ce7177be91b92ba521e9d5aef577dcc8095cc591f86baaa291b91c88925928f5d26832c4d1b381a6ae99f2e8804077c592d0d32322c1212605cc + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -932,6 +2857,29 @@ __metadata: languageName: node linkType: hard +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 + languageName: node + linkType: hard + +"aws-sign2@npm:~0.7.0": + version: 0.7.0 + resolution: "aws-sign2@npm:0.7.0" + checksum: 10c0/021d2cc5547d4d9ef1633e0332e746a6f447997758b8b68d6fb33f290986872d2bff5f0c37d5832f41a7229361f093cd81c40898d96ed153493c0fb5cd8575d2 + languageName: node + linkType: hard + +"aws4@npm:^1.8.0": + version: 1.13.2 + resolution: "aws4@npm:1.13.2" + checksum: 10c0/c993d0d186d699f685d73113733695d648ec7d4b301aba2e2a559d0cd9c1c902308cc52f4095e1396b23fddbc35113644e7f0a6a32753636306e41e3ed6f1e79 + languageName: node + linkType: hard + "axios@npm:^0.21.4": version: 0.21.4 resolution: "axios@npm:0.21.4" @@ -941,6 +2889,222 @@ __metadata: languageName: node linkType: hard +"axios@npm:^1.7.7": + version: 1.13.2 + resolution: "axios@npm:1.13.2" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.4" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/e8a42e37e5568ae9c7a28c348db0e8cf3e43d06fcbef73f0048669edfe4f71219664da7b6cc991b0c0f01c28a48f037c515263cb79be1f1ae8ff034cd813867b + languageName: node + linkType: hard + +"babel-code-frame@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-code-frame@npm:6.26.0" + dependencies: + chalk: "npm:^1.1.3" + esutils: "npm:^2.0.2" + js-tokens: "npm:^3.0.2" + checksum: 10c0/7fecc128e87578cf1b96e78d2b25e0b260e202bdbbfcefa2eac23b7f8b7b2f7bc9276a14599cde14403cc798cc2a38e428e2cab50b77658ab49228b09ae92473 + languageName: node + linkType: hard + +"babel-core@npm:^6.26.0, babel-core@npm:^6.9.0": + version: 6.26.3 + resolution: "babel-core@npm:6.26.3" + dependencies: + babel-code-frame: "npm:^6.26.0" + babel-generator: "npm:^6.26.0" + babel-helpers: "npm:^6.24.1" + babel-messages: "npm:^6.23.0" + babel-register: "npm:^6.26.0" + babel-runtime: "npm:^6.26.0" + babel-template: "npm:^6.26.0" + babel-traverse: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + babylon: "npm:^6.18.0" + convert-source-map: "npm:^1.5.1" + debug: "npm:^2.6.9" + json5: "npm:^0.5.1" + lodash: "npm:^4.17.4" + minimatch: "npm:^3.0.4" + path-is-absolute: "npm:^1.0.1" + private: "npm:^0.1.8" + slash: "npm:^1.0.0" + source-map: "npm:^0.5.7" + checksum: 10c0/10292649779f8c33d1908f5671c92ca9df036c9e1b9f35f97e7f62c9da9e3a146ee069f94fc401283ce129ba980f34a30339f137c512f3e62ddd354653b2da0e + languageName: node + linkType: hard + +"babel-generator@npm:^6.26.0": + version: 6.26.1 + resolution: "babel-generator@npm:6.26.1" + dependencies: + babel-messages: "npm:^6.23.0" + babel-runtime: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + detect-indent: "npm:^4.0.0" + jsesc: "npm:^1.3.0" + lodash: "npm:^4.17.4" + source-map: "npm:^0.5.7" + trim-right: "npm:^1.0.1" + checksum: 10c0/d5f9d20c6f7d8644dc41ee57d48c98a78d24d5b74dc305cc518d6e0872d4fa73c5fd8d47ec00e3515858eaf3c3e512a703cdbc184ff0061af5979bc206618555 + languageName: node + linkType: hard + +"babel-helper-hoist-variables@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helper-hoist-variables@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-types: "npm:^6.24.1" + checksum: 10c0/adac32e99ec452f3d9eb0a8f3eb455d3106a3c998954a41187f75c0363e22f48dbf0073221341cb26ee3f9a45115e2d3b29d00c7b4abc75c8dfa5c780eb330bd + languageName: node + linkType: hard + +"babel-helpers@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helpers@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + checksum: 10c0/bbd082e42adaa9c584242515e8c5b1e861108e03ed9517f0b600189e1c1041376ab6a15c71265a2cc095c5af4bd15cfc97158e30ce95a81cbfcea1bfd81ce3e6 + languageName: node + linkType: hard + +"babel-messages@npm:^6.23.0": + version: 6.23.0 + resolution: "babel-messages@npm:6.23.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: 10c0/d4fd6414ee5bb1aa0dad6d8d2c4ffaa66331ec5a507959e11f56b19a683566e2c1e7a4d0b16cfef58ea4cc07db8acf5ff3dc8b25c585407cff2e09ac60553401 + languageName: node + linkType: hard + +"babel-plugin-transform-cjs-system-wrapper@npm:^0.3.0": + version: 0.3.0 + resolution: "babel-plugin-transform-cjs-system-wrapper@npm:0.3.0" + dependencies: + babel-template: "npm:^6.9.0" + checksum: 10c0/da549cae197ea56b12fad168478905a8e6ef038813935cb405722bcaa1c8ea9659b66c4e63e50bbcb202ff1be598382f828391dbd82289bc8119ac1851e45b25 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-modules-systemjs@npm:^6.6.5": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-modules-systemjs@npm:6.24.1" + dependencies: + babel-helper-hoist-variables: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + checksum: 10c0/7e617b5485c8d52d27ef7588f2b67351220e0d7cdf14fb59bd509ba9e868a1483f0bc63e2cb0eba4caee02d1b00d7a0bd5550c575606e98ca9cb24573444a302 + languageName: node + linkType: hard + +"babel-plugin-transform-global-system-wrapper@npm:0.0.1": + version: 0.0.1 + resolution: "babel-plugin-transform-global-system-wrapper@npm:0.0.1" + dependencies: + babel-template: "npm:^6.9.0" + checksum: 10c0/ff1cc7314d6a5092a632ec1531c70decc28433cfc0b43bff2db3d0d7b1115635710cdb5b71051e517e9c1846c91efaca5a72746a2e6667aa88f39e1e77f42d10 + languageName: node + linkType: hard + +"babel-plugin-transform-system-register@npm:0.0.1": + version: 0.0.1 + resolution: "babel-plugin-transform-system-register@npm:0.0.1" + checksum: 10c0/c12b44f7aa5b6c700438c095508c957e2ff52baae890ee1a5de55e01aee6098f8fa347af1ab91c8aa7b277631c24ac4b6b12ae0b0b8d4c158308cd27cff10c2c + languageName: node + linkType: hard + +"babel-register@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-register@npm:6.26.0" + dependencies: + babel-core: "npm:^6.26.0" + babel-runtime: "npm:^6.26.0" + core-js: "npm:^2.5.0" + home-or-tmp: "npm:^2.0.0" + lodash: "npm:^4.17.4" + mkdirp: "npm:^0.5.1" + source-map-support: "npm:^0.4.15" + checksum: 10c0/4ffbc1bfa60a817fb306c98d1a6d10852b0130a614dae3a91e45f391dbebdc95f428d95b489943d85724e046527d2aac3bafb74d3c24f62143492b5f606e2e04 + languageName: node + linkType: hard + +"babel-runtime@npm:6.11.6": + version: 6.11.6 + resolution: "babel-runtime@npm:6.11.6" + dependencies: + core-js: "npm:^2.4.0" + regenerator-runtime: "npm:^0.9.5" + checksum: 10c0/8ee439a158869de7cf4ec1d8facfec2d62a59b1912cef004811089f524e97fa9b0c51f523e36727096ea16b1a99857625c14d223229a1845a039f2f75e8d8c94 + languageName: node + linkType: hard + +"babel-runtime@npm:^6.22.0, babel-runtime@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-runtime@npm:6.26.0" + dependencies: + core-js: "npm:^2.4.0" + regenerator-runtime: "npm:^0.11.0" + checksum: 10c0/caa752004936b1463765ed3199c52f6a55d0613b9bed108743d6f13ca532b821d4ea9decc4be1b583193164462b1e3e7eefdfa36b15c72e7daac58dd72c1772f + languageName: node + linkType: hard + +"babel-template@npm:^6.24.1, babel-template@npm:^6.26.0, babel-template@npm:^6.9.0": + version: 6.26.0 + resolution: "babel-template@npm:6.26.0" + dependencies: + babel-runtime: "npm:^6.26.0" + babel-traverse: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + babylon: "npm:^6.18.0" + lodash: "npm:^4.17.4" + checksum: 10c0/67bc875f19d289dabb1830a1cde93d7f1e187e4599dac9b1d16392fd47f1d12b53fea902dacf7be360acd09807d440faafe0f7907758c13275b1a14d100b68e4 + languageName: node + linkType: hard + +"babel-traverse@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-traverse@npm:6.26.0" + dependencies: + babel-code-frame: "npm:^6.26.0" + babel-messages: "npm:^6.23.0" + babel-runtime: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + babylon: "npm:^6.18.0" + debug: "npm:^2.6.8" + globals: "npm:^9.18.0" + invariant: "npm:^2.2.2" + lodash: "npm:^4.17.4" + checksum: 10c0/dca71b23d07e3c00833c3222d7998202e687105f461048107afeb2b4a7aa2507efab1bd5a6e3e724724ebb9b1e0b14f0113621e1d8c25b4ffdb829392b54b8de + languageName: node + linkType: hard + +"babel-types@npm:^6.24.1, babel-types@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-types@npm:6.26.0" + dependencies: + babel-runtime: "npm:^6.26.0" + esutils: "npm:^2.0.2" + lodash: "npm:^4.17.4" + to-fast-properties: "npm:^1.0.3" + checksum: 10c0/cabe371de1b32c4bbb1fd4ed0fe8a8726d42e5ad7d5cefb83cdae6de0f0a152dce591e4026719743fdf3aa45f84fea2c8851fb822fbe29b0c78a1f0094b67418 + languageName: node + linkType: hard + +"babylon@npm:^6.18.0": + version: 6.18.0 + resolution: "babylon@npm:6.18.0" + bin: + babylon: ./bin/babylon.js + checksum: 10c0/9b1bf946e16782deadb1f5414c1269efa6044eb1e97a3de2051f09a3f2a54e97be3542d4242b28d23de0ef67816f519d38ce1ec3ddb7be306131c39a60e5a667 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -948,6 +3112,25 @@ __metadata: languageName: node linkType: hard +"bank@npm:0.0.4": + version: 0.0.4 + resolution: "bank@npm:0.0.4" + dependencies: + request: "npm:^2.30.0" + checksum: 10c0/632bb0d7f140932587ca9f48c3e10a9e314ce20bf49821e022e7011e81ba4b9373d61580159eff7c8bd54ae6530feef27ef5b874880d766f36b1ab39ccf823d8 + languageName: node + linkType: hard + +"banking@npm:^1.0.1": + version: 1.2.0 + resolution: "banking@npm:1.2.0" + dependencies: + debug: "npm:^2.3.3" + xml2js: "npm:^0.4.17" + checksum: 10c0/0cc195e7dea34f42ddef04d32ebd1fda422d597985836d65e61c1a0329ee5a4cff5d73858e2e6563a11297bab7d3c7a1c07bfd6c862ebd22936f48355c401e15 + languageName: node + linkType: hard + "base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -955,14 +3138,73 @@ __metadata: languageName: node linkType: hard -"better-sqlite3@npm:^11.6.0": - version: 11.6.0 - resolution: "better-sqlite3@npm:11.6.0" +"base@npm:^0.11.1": + version: 0.11.2 + resolution: "base@npm:0.11.2" + dependencies: + cache-base: "npm:^1.0.1" + class-utils: "npm:^0.3.5" + component-emitter: "npm:^1.2.1" + define-property: "npm:^1.0.0" + isobject: "npm:^3.0.1" + mixin-deep: "npm:^1.2.0" + pascalcase: "npm:^0.1.1" + checksum: 10c0/30a2c0675eb52136b05ef496feb41574d9f0bb2d6d677761da579c00a841523fccf07f1dbabec2337b5f5750f428683b8ca60d89e56a1052c4ae1c0cd05de64d + languageName: node + linkType: hard + +"batch@npm:0.5.0": + version: 0.5.0 + resolution: "batch@npm:0.5.0" + checksum: 10c0/2e7fa7ce4f7dda834a4372fe458ac00fbf56d9d2a6506a9a699f62b01d20a9483a1402ad817c744a45224b33009789ef9fde1130e07e74aa5011ea12d0867bff + languageName: node + linkType: hard + +"bcrypt-pbkdf@npm:^1.0.0": + version: 1.0.2 + resolution: "bcrypt-pbkdf@npm:1.0.2" + dependencies: + tweetnacl: "npm:^0.14.3" + checksum: 10c0/ddfe85230b32df25aeebfdccfbc61d3bc493ace49c884c9c68575de1f5dcf733a5d7de9def3b0f318b786616b8d85bad50a28b1da1750c43e0012c93badcc148 + languageName: node + linkType: hard + +"before-after-hook@npm:^2.0.0": + version: 2.2.3 + resolution: "before-after-hook@npm:2.2.3" + checksum: 10c0/0488c4ae12df758ca9d49b3bb27b47fd559677965c52cae7b335784724fb8bf96c42b6e5ba7d7afcbc31facb0e294c3ef717cc41c5bc2f7bd9e76f8b90acd31c + languageName: node + linkType: hard + +"better-sqlite3@npm:^12.6.2": + version: 12.6.2 + resolution: "better-sqlite3@npm:12.6.2" dependencies: bindings: "npm:^1.5.0" node-gyp: "npm:latest" prebuild-install: "npm:^7.1.1" - checksum: 10c0/cafa207b40c42624d767a35f24fb16769d106486371b2e23497e9417505fa1fdedd94313b50508bd67f85713a996a0a9134458987c9b80a0a2b243d4db0d1259 + checksum: 10c0/a58fb3f7a7f5469ba0b8de0855aa67396ff34f951a6975746e4b21987f530be6a34427d1d4bd5958cf48c67ed7ba1df038ae163d2ee9d944237f6b8112f6640d + languageName: node + linkType: hard + +"big-integer@npm:^1.6.17": + version: 1.6.52 + resolution: "big-integer@npm:1.6.52" + checksum: 10c0/9604224b4c2ab3c43c075d92da15863077a9f59e5d4205f4e7e76acd0cd47e8d469ec5e5dba8d9b32aa233951893b29329ca56ac80c20ce094b4a647a66abae0 + languageName: node + linkType: hard + +"bignumber.js@npm:2.0.0": + version: 2.0.0 + resolution: "bignumber.js@npm:2.0.0" + checksum: 10c0/5a78934a45ede0b847de415d46dddbc1729b7eb1683714c95f5eaf105d4d700cbd8dbdd8ba6240144b109344cf0e24bc098bac674813994dac6e156e64d06392 + languageName: node + linkType: hard + +"bignumber.js@npm:9.0.0": + version: 9.0.0 + resolution: "bignumber.js@npm:9.0.0" + checksum: 10c0/a760979ca822533ad7a437a45bcac66c191554a407092baa4991e068fd4af7344ff52d9e82e0574946c831690de706cf86fbc80775b5ebc6e59c2eef7325172c languageName: node linkType: hard @@ -980,7 +3222,17 @@ __metadata: languageName: node linkType: hard -"bindings@npm:^1.5.0": +"binary@npm:~0.3.0": + version: 0.3.0 + resolution: "binary@npm:0.3.0" + dependencies: + buffers: "npm:~0.1.1" + chainsaw: "npm:~0.1.0" + checksum: 10c0/752c2c2ff9f23506b3428cc8accbfcc92fec07bf8a31a1953e9c7e2193eb5db8a67252034ab93e8adab2a1c43f3eeb3da0bacae0320e9814f3ca127942c55871 + languageName: node + linkType: hard + +"bindings@npm:^1.2.1, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" dependencies: @@ -1011,6 +3263,43 @@ __metadata: languageName: node linkType: hard +"blake3-wasm@npm:2.1.5": + version: 2.1.5 + resolution: "blake3-wasm@npm:2.1.5" + checksum: 10c0/5dc729d8e3a9d1d7ab016b36cdda264a327ada0239716df48435163e11d2bf6df25d6e421655a1f52649098ae49555268a654729b7d02768f77c571ab37ef814 + languageName: node + linkType: hard + +"block-stream@npm:*": + version: 0.0.9 + resolution: "block-stream@npm:0.0.9" + dependencies: + inherits: "npm:~2.0.0" + checksum: 10c0/b39b281c01cc5424e47d9433ac499b0c0cccf55bf72b3998ca5b88a8c479dfaab4d311e1a3544d3ed8f745744b0f393a7984e5e7e581d631eecefccf8012ae95 + languageName: node + linkType: hard + +"bluebird@npm:^3.3.4": + version: 3.7.2 + resolution: "bluebird@npm:3.7.2" + checksum: 10c0/680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 + languageName: node + linkType: hard + +"bluebird@npm:~3.4.1": + version: 3.4.7 + resolution: "bluebird@npm:3.4.7" + checksum: 10c0/ac7e3df09a433b985a0ba61a0be4fc23e3874bf62440ffbca2f275a8498b00c11336f1f633631f38419b2c842515473985f9c4aaa9e4c9b36105535026d94144 + languageName: node + linkType: hard + +"blueimp-md5@npm:^2.10.0": + version: 2.19.0 + resolution: "blueimp-md5@npm:2.19.0" + checksum: 10c0/85d04343537dd99a288c62450341dcce7380d3454c81f8e5a971ddd80307d6f9ef51b5b92ad7d48aaaa92fd6d3a1f6b2f4fada068faae646887f7bfabc17a346 + languageName: node + linkType: hard + "body-parser@npm:1.20.3, body-parser@npm:^1.20.1": version: 1.20.3 resolution: "body-parser@npm:1.20.3" @@ -1031,6 +3320,36 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:~1.20.3": + version: 1.20.4 + resolution: "body-parser@npm:1.20.4" + dependencies: + bytes: "npm:~3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:~1.2.0" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + on-finished: "npm:~2.4.1" + qs: "npm:~6.14.0" + raw-body: "npm:~2.5.3" + type-is: "npm:~1.6.18" + unpipe: "npm:~1.0.0" + checksum: 10c0/569c1e896297d1fcd8f34026c8d0ab70b90d45343c15c5d8dff5de2bad08125fc1e2f8c2f3f4c1ac6c0caaad115218202594d37dcb8d89d9b5dcae1c2b736aa9 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.0.0": + version: 1.1.12 + resolution: "brace-expansion@npm:1.1.12" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/975fecac2bb7758c062c20d0b3b6288c7cc895219ee25f0a64a9de662dbac981ff0b6e89909c3897c1f84fa353113a721923afdec5f8b2350255b097f12b1f73 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -1050,6 +3369,24 @@ __metadata: languageName: node linkType: hard +"braces@npm:^2.3.1": + version: 2.3.2 + resolution: "braces@npm:2.3.2" + dependencies: + arr-flatten: "npm:^1.1.0" + array-unique: "npm:^0.3.2" + extend-shallow: "npm:^2.0.1" + fill-range: "npm:^4.0.0" + isobject: "npm:^3.0.1" + repeat-element: "npm:^1.1.2" + snapdragon: "npm:^0.8.1" + snapdragon-node: "npm:^2.0.1" + split-string: "npm:^3.0.2" + to-regex: "npm:^3.0.1" + checksum: 10c0/72b27ea3ea2718f061c29e70fd6e17606e37c65f5801abddcf0b0052db1de7d60f3bf92cfc220ab57b44bd0083a5f69f9d03b3461d2816cfe9f9398207acc728 + languageName: node + linkType: hard + "braces@npm:^3.0.2, braces@npm:~3.0.2": version: 3.0.2 resolution: "braces@npm:3.0.2" @@ -1059,6 +3396,78 @@ __metadata: languageName: node linkType: hard +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"brcal-db04e6@workspace:packages/brcal": + version: 0.0.0-use.local + resolution: "brcal-db04e6@workspace:packages/brcal" + dependencies: + "@agoric/eslint-config": "npm:0.4.1-dev-dc67c18.0.dc67c18" + "@agoric/eslint-plugin": "npm:0.1.1-dev-dc67c18.0.dc67c18" + "@types/better-sqlite3": "npm:^7.6.1" + "@types/follow-redirects": "npm:^1.13.0" + "@types/mysql": "npm:^2.15.15" + "@types/node": "npm:^14.14.7" + "@typescript-eslint/parser": "npm:^4.21.0" + better-sqlite3: "npm:^12.6.2" + chokidar: "npm:^3.5.3" + csv-parse: "npm:^5.3.0" + eslint: "npm:^7.24.0" + eslint-config-airbnb-base: "npm:^14.2.1" + eslint-config-prettier: "npm:^8.1.0" + eslint-plugin-import: "npm:^2.22.1" + eslint-plugin-jsdoc: "npm:^32.3.0" + eslint-plugin-prettier: "npm:^3.3.1" + esm: "npm:^3.2.25" + fast-json-patch: "npm:^3.0.0-1" + follow-redirects: "npm:^1.14.8" + ical: "npm:^0.8.0" + mysql: "npm:^2.18.1" + require-text: "npm:^0.0.1" + typescript: "npm:^4.1.3" + xml2js: "npm:^0.6.2" + zx: "npm:^7.0.8" + languageName: unknown + linkType: soft + +"brscript@workspace:packages/brscript": + version: 0.0.0-use.local + resolution: "brscript@workspace:packages/brscript" + dependencies: + "@google/clasp": "npm:^2.3.0" + "@types/google-apps-script": "npm:^1.0.17" + typescript: "npm:^4.0.5" + languageName: unknown + linkType: soft + +"btoa-lite@npm:^1.0.0": + version: 1.0.0 + resolution: "btoa-lite@npm:1.0.0" + checksum: 10c0/7a4f0568ae3c915464650f98fde7901ae07b13a333a614515a0c86876b3528670fafece28dfef9745d971a613bb83341823afb0c20c6f318b384c1e364b9eb95 + languageName: node + linkType: hard + +"buffer-crc32@npm:0.2.1": + version: 0.2.1 + resolution: "buffer-crc32@npm:0.2.1" + checksum: 10c0/9b02890ea3fd02af74057fa17f12729f437289b735e3aae92c9d56512fea41f0cf5691994f20fd9c0ad488256ccf372ce7d442c6c1941337e8839ee7eb2b0f6b + languageName: node + linkType: hard + +"buffer-crc32@npm:^0.2.3, buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 + languageName: node + linkType: hard + "buffer-equal-constant-time@npm:1.0.1": version: 1.0.1 resolution: "buffer-equal-constant-time@npm:1.0.1" @@ -1066,6 +3475,27 @@ __metadata: languageName: node linkType: hard +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"buffer-indexof-polyfill@npm:~1.0.0": + version: 1.0.2 + resolution: "buffer-indexof-polyfill@npm:1.0.2" + checksum: 10c0/b8376d5f8b2c230d02fce36762b149b6c436aa03aca5e02b934ea13ce72a7e731c785fa30fb30e9c713df5173b4f8e89856574e70ce86b2f1d94d7d90166eab0 + languageName: node + linkType: hard + +"buffer-peek-stream@npm:^1.0.1": + version: 1.1.0 + resolution: "buffer-peek-stream@npm:1.1.0" + checksum: 10c0/2afaabd8ad5fbd153d5fd6d51af16b61e6d06f5d15872fe6a0d8f2f0822f637a9ca9320b1b6a1eb629226390926864f1095988542de72cb8051d659e50ddda53 + languageName: node + linkType: hard + "buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" @@ -1086,7 +3516,21 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2": +"buffers@npm:~0.1.1": + version: 0.1.1 + resolution: "buffers@npm:0.1.1" + checksum: 10c0/c7a3284ddb4f5c65431508be65535e3739215f7996aa03e5d3a3fcf03144d35ffca7d9825572e6c6c6007f5308b8553c7b2941fcf5e56fac20dedea7178f5f71 + languageName: node + linkType: hard + +"bytes@npm:0.2.1, bytes@npm:~0.2.1": + version: 0.2.1 + resolution: "bytes@npm:0.2.1" + checksum: 10c0/1a4611e0935687631ad9cbd94bdd7af96e2e646178ab2a8c1a7294cf8849003ebb2192f456f0874be62e3c718bc57a2ffbc91ea04ccd28d4b07a219f87a2af66 + languageName: node + linkType: hard + +"bytes@npm:3.1.2, bytes@npm:~3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e @@ -1113,6 +3557,23 @@ __metadata: languageName: node linkType: hard +"cache-base@npm:^1.0.1": + version: 1.0.1 + resolution: "cache-base@npm:1.0.1" + dependencies: + collection-visit: "npm:^1.0.0" + component-emitter: "npm:^1.2.1" + get-value: "npm:^2.0.6" + has-value: "npm:^1.0.0" + isobject: "npm:^3.0.1" + set-value: "npm:^2.0.0" + to-object-path: "npm:^0.3.0" + union-value: "npm:^1.0.0" + unset-value: "npm:^1.0.0" + checksum: 10c0/a7142e25c73f767fa520957dcd179b900b86eac63b8cfeaa3b2a35e18c9ca5968aa4e2d2bed7a3e7efd10f13be404344cfab3a4156217e71f9bdb95940bb9c8c + languageName: node + linkType: hard + "cacheable-lookup@npm:^5.0.3": version: 5.0.4 resolution: "cacheable-lookup@npm:5.0.4" @@ -1120,6 +3581,21 @@ __metadata: languageName: node linkType: hard +"cacheable-request@npm:^2.1.1": + version: 2.1.4 + resolution: "cacheable-request@npm:2.1.4" + dependencies: + clone-response: "npm:1.0.2" + get-stream: "npm:3.0.0" + http-cache-semantics: "npm:3.8.1" + keyv: "npm:3.0.0" + lowercase-keys: "npm:1.0.0" + normalize-url: "npm:2.0.1" + responselike: "npm:1.0.2" + checksum: 10c0/41ae13b3cd0ec2c68598b53f2b61b16eee2cb49f9dfa3fb156a0408644ef0d73d49c2f8d86faf32f9866536fe34908810fc695b05e055c4b12459f6be413e6c5 + languageName: node + linkType: hard + "cacheable-request@npm:^7.0.2": version: 7.0.4 resolution: "cacheable-request@npm:7.0.4" @@ -1135,6 +3611,16 @@ __metadata: languageName: node linkType: hard +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 + languageName: node + linkType: hard + "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": version: 1.0.2 resolution: "call-bind@npm:1.0.2" @@ -1158,6 +3644,44 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.2" + checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 + languageName: node + linkType: hard + +"caller-path@npm:^0.1.0": + version: 0.1.0 + resolution: "caller-path@npm:0.1.0" + dependencies: + callsites: "npm:^0.2.0" + checksum: 10c0/4f605823f01019dee30b561cc7fac99eef573990c8de9da069dc0fc926c031cc93e907f9bd08a8a099ac98bb287859e15d02d756e5b37ee1ea3dcb7bd41dad4e + languageName: node + linkType: hard + +"callsites@npm:^0.2.0": + version: 0.2.0 + resolution: "callsites@npm:0.2.0" + checksum: 10c0/1d7b0a32257ea7756bd4a085bba9f0f6c7e5249f67ea0d4ccd24f78c068d5444c2fa2fd6e165a49aae2567128212625730dc932f4869801365138f4e58354068 + languageName: node + linkType: hard + "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -1165,7 +3689,90 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.0, chalk@npm:^2.4.2": +"callsites@npm:^4.0.0": + version: 4.2.0 + resolution: "callsites@npm:4.2.0" + checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3 + languageName: node + linkType: hard + +"camelcase@npm:^1.0.2": + version: 1.2.1 + resolution: "camelcase@npm:1.2.1" + checksum: 10c0/dec70dfd46be8e31c5f8a4616f441cc3902da9b807f843c2ad4f2a0c79a8907d91914184b40166e2111bfa76cb66de6107924c0529017204e810ef14390381fa + languageName: node + linkType: hard + +"camelcase@npm:^3.0.0": + version: 3.0.0 + resolution: "camelcase@npm:3.0.0" + checksum: 10c0/98871bb40b936430beca49490d325759f8d8ade32bea538ee63c20b17b326abb6bbd3e1d84daf63d9332b2fc7637f28696bf76da59180b1247051b955cb1da12 + languageName: node + linkType: hard + +"camelcase@npm:^5.0.0": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 + languageName: node + linkType: hard + +"capnweb@npm:^0.4.0": + version: 0.4.0 + resolution: "capnweb@npm:0.4.0" + checksum: 10c0/36b051ce90da2354ea7b2fa8b6321e59b80b1abf136942691faa31d0aa8ca53deb857789a6fa0b06f6c06a899892df54324c031d981bb6c9c6bee65fe218973d + languageName: node + linkType: hard + +"caseless@npm:~0.12.0": + version: 0.12.0 + resolution: "caseless@npm:0.12.0" + checksum: 10c0/ccf64bcb6c0232cdc5b7bd91ddd06e23a4b541f138336d4725233ac538041fb2f29c2e86c3c4a7a61ef990b665348db23a047060b9414c3a6603e9fa61ad4626 + languageName: node + linkType: hard + +"cbor@npm:^8.1.0": + version: 8.1.0 + resolution: "cbor@npm:8.1.0" + dependencies: + nofilter: "npm:^3.1.0" + checksum: 10c0/a836e2e7ea0efb1b9c4e5a4be906c57113d730cc42293a34072e0164ed110bb8ac035dc7dca2e3ebb641bd4b37e00fdbbf09c951aa864b3d4888a6ed8c6243f7 + languageName: node + linkType: hard + +"center-align@npm:^0.1.1": + version: 0.1.3 + resolution: "center-align@npm:0.1.3" + dependencies: + align-text: "npm:^0.1.3" + lazy-cache: "npm:^1.0.3" + checksum: 10c0/d12d17b53c4ffce900ecddeb87b781e65af9fe197973015bc2d8fb114fcccdd6457995df26bfe156ffe44573ffbabbba7c67653d92cfc8e1b2e7ec88404cbb61 + languageName: node + linkType: hard + +"chainsaw@npm:~0.1.0": + version: 0.1.0 + resolution: "chainsaw@npm:0.1.0" + dependencies: + traverse: "npm:>=0.3.0 <0.4" + checksum: 10c0/c27b8b10fd372b07d80b3f63615ce5ecb9bb1b0be6934fe5de3bb0328f9ffad5051f206bd7a0b426b85778fee0c063a1f029fb32cc639f3b2ee38d6b39f52c5c + languageName: node + linkType: hard + +"chalk@npm:^1.0.0, chalk@npm:^1.1.1, chalk@npm:^1.1.3": + version: 1.1.3 + resolution: "chalk@npm:1.1.3" + dependencies: + ansi-styles: "npm:^2.2.1" + escape-string-regexp: "npm:^1.0.2" + has-ansi: "npm:^2.0.0" + strip-ansi: "npm:^3.0.0" + supports-color: "npm:^2.0.0" + checksum: 10c0/28c3e399ec286bb3a7111fd4225ebedb0d7b813aef38a37bca7c498d032459c265ef43404201d5fbb8d888d29090899c95335b4c0cda13e8b126ff15c541cef8 + languageName: node + linkType: hard + +"chalk@npm:^2.0.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -1193,6 +3800,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^5.2.0, chalk@npm:^5.4.1": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 + languageName: node + linkType: hard + "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" @@ -1200,6 +3814,13 @@ __metadata: languageName: node linkType: hard +"charenc@npm:0.0.2": + version: 0.0.2 + resolution: "charenc@npm:0.0.2" + checksum: 10c0/a45ec39363a16799d0f9365c8dd0c78e711415113c6f14787a22462ef451f5013efae8a28f1c058f81fc01f2a6a16955f7a5fd0cd56247ce94a45349c89877d8 + languageName: node + linkType: hard + "chokidar@npm:^3.5.2": version: 3.5.3 resolution: "chokidar@npm:3.5.3" @@ -1219,6 +3840,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 + languageName: node + linkType: hard + "chownr@npm:^1.1.1": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -1233,6 +3873,46 @@ __metadata: languageName: node linkType: hard +"chunkd@npm:^2.0.1": + version: 2.0.1 + resolution: "chunkd@npm:2.0.1" + checksum: 10c0/4e0c5aac6048ecedfa4cd0a5f6c4f010c70a7b7645aeca7bfeb47cb0733c3463054f0ced3f2667b2e0e67edd75d68a8e05481b01115ba3f8a952a93026254504 + languageName: node + linkType: hard + +"ci-info@npm:^3.7.0, ci-info@npm:^3.8.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"ci-parallel-vars@npm:^1.0.1": + version: 1.0.1 + resolution: "ci-parallel-vars@npm:1.0.1" + checksum: 10c0/80952f699cbbc146092b077b4f3e28d085620eb4e6be37f069b4dbb3db0ee70e8eec3beef4ebe70ff60631e9fc743b9d0869678489f167442cac08b260e5ac08 + languageName: node + linkType: hard + +"circular-json@npm:^0.3.1": + version: 0.3.3 + resolution: "circular-json@npm:0.3.3" + checksum: 10c0/573d1c62f2b1254aac68b58c90764f3d6638eb1451d5d8baab3008e6624d12a5ee4b4ef1ad7aae170655dd476e0ccbb984a439319581e5fcbe37afb4c632b513 + languageName: node + linkType: hard + +"class-utils@npm:^0.3.5": + version: 0.3.6 + resolution: "class-utils@npm:0.3.6" + dependencies: + arr-union: "npm:^3.1.0" + define-property: "npm:^0.2.5" + isobject: "npm:^3.0.0" + static-extend: "npm:^0.1.1" + checksum: 10c0/d44f4afc7a3e48dba4c2d3fada5f781a1adeeff371b875c3b578bc33815c6c29d5d06483c2abfd43a32d35b104b27b67bfa39c2e8a422fa858068bd756cfbd42 + languageName: node + linkType: hard + "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -1249,6 +3929,22 @@ __metadata: languageName: node linkType: hard +"clean-yaml-object@npm:^0.1.0": + version: 0.1.0 + resolution: "clean-yaml-object@npm:0.1.0" + checksum: 10c0/a6505310590038afb9f0adc7f17a4c66787719c94d23f8491267ea4d9c405cdd378bd576ae1926169b6d997d4c59a8b86516bf4d16ba228280cf615598c58e05 + languageName: node + linkType: hard + +"cli-cursor@npm:^1.0.1": + version: 1.0.2 + resolution: "cli-cursor@npm:1.0.2" + dependencies: + restore-cursor: "npm:^1.0.1" + checksum: 10c0/a621ddfae6dde44c699c520ef416745d096b7d58255f3a2a2727b19db4a308085f33ca86e19f1bf3e4dc4d500c347c5c9ed62c4cfe1a23c2fd4b0419e1ff4e8b + languageName: node + linkType: hard + "cli-cursor@npm:^3.1.0": version: 3.1.0 resolution: "cli-cursor@npm:3.1.0" @@ -1274,7 +3970,7 @@ __metadata: languageName: node linkType: hard -"cli-truncate@npm:^3.0.0": +"cli-truncate@npm:^3.0.0, cli-truncate@npm:^3.1.0": version: 3.1.0 resolution: "cli-truncate@npm:3.1.0" dependencies: @@ -1284,6 +3980,13 @@ __metadata: languageName: node linkType: hard +"cli-width@npm:^2.0.0": + version: 2.2.1 + resolution: "cli-width@npm:2.2.1" + checksum: 10c0/e3a6d422d657ca111c630f69ee0f1a499e8f114eea158ccb2cdbedd19711edffa217093bbd43dafb34b68d1b1a3b5334126e51d059b9ec1d19afa53b42b3ef86 + languageName: node + linkType: hard + "cli-width@npm:^3.0.0": version: 3.0.0 resolution: "cli-width@npm:3.0.0" @@ -1291,6 +3994,59 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^2.1.0": + version: 2.1.0 + resolution: "cliui@npm:2.1.0" + dependencies: + center-align: "npm:^0.1.1" + right-align: "npm:^0.1.1" + wordwrap: "npm:0.0.2" + checksum: 10c0/a5e7a3c1f354f3dd4cdea613822633a3c73604d4852ab2f5ac24fb7e10a2bef4475b4064e1bdd3db61e9527130a634ca4cef7e18666d03519611e70213606245 + languageName: node + linkType: hard + +"cliui@npm:^3.2.0": + version: 3.2.0 + resolution: "cliui@npm:3.2.0" + dependencies: + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.1" + wrap-ansi: "npm:^2.0.0" + checksum: 10c0/07b121fac7fd33ff8dbf3523f0d3dca0329d4e457e57dee54502aa5f27a33cbd9e66aa3e248f0260d8a1431b65b2bad8f510cd97fb8ab6a8e0506310a92e18d5 + languageName: node + linkType: hard + +"cliui@npm:^4.0.0": + version: 4.1.0 + resolution: "cliui@npm:4.1.0" + dependencies: + string-width: "npm:^2.1.1" + strip-ansi: "npm:^4.0.0" + wrap-ansi: "npm:^2.0.0" + checksum: 10c0/5cee4720850655365014f158407f65f92e22e6a46be17d4844889d2173bd9327fabf41d08b309016e825a3888a558b606f1a89c7d2f805720b24902235bae4e5 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"clone-response@npm:1.0.2": + version: 1.0.2 + resolution: "clone-response@npm:1.0.2" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 10c0/96f3527ef86d0c322e0a5188d929ab78ddbc3238d47ccbb00f8abb02b02e4ef70339646ec73d657383ffbdb1f0cfef6a937062d4f701ca6f84cee7a37114007f + languageName: node + linkType: hard + "clone-response@npm:^1.0.2": version: 1.0.3 resolution: "clone-response@npm:1.0.3" @@ -1307,6 +4063,39 @@ __metadata: languageName: node linkType: hard +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 + languageName: node + linkType: hard + +"code-excerpt@npm:^4.0.0": + version: 4.0.0 + resolution: "code-excerpt@npm:4.0.0" + dependencies: + convert-to-spaces: "npm:^2.0.1" + checksum: 10c0/b6c5a06e039cecd2ab6a0e10ee0831de8362107d1f298ca3558b5f9004cb8e0260b02dd6c07f57b9a0e346c76864d2873311ee1989809fdeb05bd5fbbadde773 + languageName: node + linkType: hard + +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: 10c0/33f6b234084e46e6e369b6f0b07949392651b4dde70fc6a592a8d3dafa08d5bb32e3981a02f31f6fc323a26bc03a4c063a9d56834848695bda7611c2417ea2e6 + languageName: node + linkType: hard + +"collection-visit@npm:^1.0.0": + version: 1.0.0 + resolution: "collection-visit@npm:1.0.0" + dependencies: + map-visit: "npm:^1.0.0" + object-visit: "npm:^1.0.0" + checksum: 10c0/add72a8d1c37cb90e53b1aaa2c31bf1989bfb733f0b02ce82c9fa6828c7a14358dba2e4f8e698c02f69e424aeccae1ffb39acdeaf872ade2f41369e84a2fcf8a + languageName: node + linkType: hard + "color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" @@ -1339,6 +4128,70 @@ __metadata: languageName: node linkType: hard +"colors@npm:^1.0.3, colors@npm:^1.3.2": + version: 1.4.0 + resolution: "colors@npm:1.4.0" + checksum: 10c0/9af357c019da3c5a098a301cf64e3799d27549d8f185d86f79af23069e4f4303110d115da98483519331f6fb71c8568d5688fa1c6523600044fd4a54e97c4efb + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:0.6.1": + version: 0.6.1 + resolution: "commander@npm:0.6.1" + checksum: 10c0/01dd500bbc8df9d523eaa01c022ec47055c1a308e5c275d3bed986366bd3acaf59a1750319877f15c3cf1a982240098d9469c003dad425a3a20d5db6054a378a + languageName: node + linkType: hard + +"commander@npm:1.0.4": + version: 1.0.4 + resolution: "commander@npm:1.0.4" + dependencies: + keypress: "npm:0.1.x" + checksum: 10c0/a2abfae1de506d876e3b807cd775057f1b6be27643aebb42c3225df3a65eb3be1ccda1ffc2c266b9dc63957f039442fac57cd6dcd4b891987fe1e3ea84390c68 + languageName: node + linkType: hard + +"commander@npm:1.3.2": + version: 1.3.2 + resolution: "commander@npm:1.3.2" + dependencies: + keypress: "npm:0.1.x" + checksum: 10c0/0186245af8054eaeebad465fc5d227a24de1ccd64304ed5994d7361232435227aa248541ed946f18f8fe9318d50afbeb87349f7aa5040cd67530f6dbf0a4d88f + languageName: node + linkType: hard + +"commander@npm:2.0.0": + version: 2.0.0 + resolution: "commander@npm:2.0.0" + checksum: 10c0/c36ce38d4a137ce8f6a2782795a85604f7f1e461f1f84c2fb00e1debc335aeb667594daa1799b7202b3880073c2a95352fed2f73cbdf7c6015c0fe8c6bb0808d + languageName: node + linkType: hard + +"commander@npm:2.9.x": + version: 2.9.0 + resolution: "commander@npm:2.9.0" + dependencies: + graceful-readlink: "npm:>= 1.0.0" + checksum: 10c0/56bcda1e47f453016ed25d9f300bed9e622842a5515802658adb62792fa2ff9af6ee3f9ff16e058d7b20aacc78fb3baa3e02f982414bae1fb5f198c7cb41d5ad + languageName: node + linkType: hard + +"commander@npm:^6.1.0": + version: 6.2.1 + resolution: "commander@npm:6.2.1" + checksum: 10c0/85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea + languageName: node + linkType: hard + "commander@npm:^8.1.0": version: 8.3.0 resolution: "commander@npm:8.3.0" @@ -1353,6 +4206,20 @@ __metadata: languageName: node linkType: hard +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb + languageName: node + linkType: hard + +"component-emitter@npm:^1.2.1": + version: 1.3.1 + resolution: "component-emitter@npm:1.3.1" + checksum: 10c0/e4900b1b790b5e76b8d71b328da41482118c0f3523a516a41be598dc2785a07fd721098d9bf6e22d89b19f4fa4e1025160dc00317ea111633a3e4f75c2b86032 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -1360,6 +4227,34 @@ __metadata: languageName: node linkType: hard +"concat-stream@npm:^1.4.6, concat-stream@npm:^1.6.2": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.2.2" + typedarray: "npm:^0.0.6" + checksum: 10c0/2e9864e18282946dabbccb212c5c7cec0702745e3671679eb8291812ca7fd12023f7d8cb36493942a62f770ac96a7f90009dc5c82ad69893438371720fa92617 + languageName: node + linkType: hard + +"concordance@npm:^5.0.4": + version: 5.0.4 + resolution: "concordance@npm:5.0.4" + dependencies: + date-time: "npm:^3.1.0" + esutils: "npm:^2.0.3" + fast-diff: "npm:^1.2.0" + js-string-escape: "npm:^1.0.1" + lodash: "npm:^4.17.15" + md5-hex: "npm:^3.0.1" + semver: "npm:^7.3.2" + well-known-symbols: "npm:^2.0.0" + checksum: 10c0/59b440f330df3a7c9aa148ba588b3e99aed86acab225b4f01ffcea34ace4cf11f817e31153254e8f38ed48508998dad40b9106951a743c334d751f7ab21afb8a + languageName: node + linkType: hard + "confusing-browser-globals@npm:^1.0.10": version: 1.0.11 resolution: "confusing-browser-globals@npm:1.0.11" @@ -1367,7 +4262,30 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:0.5.4": +"connect@npm:2.12.0": + version: 2.12.0 + resolution: "connect@npm:2.12.0" + dependencies: + batch: "npm:0.5.0" + buffer-crc32: "npm:0.2.1" + bytes: "npm:0.2.1" + cookie: "npm:0.1.0" + cookie-signature: "npm:1.0.1" + debug: "npm:>= 0.7.3 < 1" + fresh: "npm:0.2.0" + methods: "npm:0.1.0" + multiparty: "npm:2.2.0" + negotiator: "npm:0.3.0" + pause: "npm:0.0.1" + qs: "npm:0.6.6" + raw-body: "npm:1.1.2" + send: "npm:0.1.4" + uid2: "npm:0.0.3" + checksum: 10c0/fecd62c19ee76db1f63c187d7349a89d3418ead11ed6c04b1f02f716abaf064a48d6b0bb5e65676ed44db961cc5cfc7555a6d5cd39d737ee1bf56ed96738721a + languageName: node + linkType: hard + +"content-disposition@npm:0.5.4, content-disposition@npm:~0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -1383,6 +4301,27 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^1.5.1": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: 10c0/281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b + languageName: node + linkType: hard + +"convert-to-spaces@npm:^2.0.1": + version: 2.0.1 + resolution: "convert-to-spaces@npm:2.0.1" + checksum: 10c0/d90aa0e3b6a27f9d5265a8d32def3c5c855b3e823a9db1f26d772f8146d6b91020a2fdfd905ce8048a73fad3aaf836fef8188c67602c374405e2ae8396c4ac46 + languageName: node + linkType: hard + +"cookie-signature@npm:1.0.1": + version: 1.0.1 + resolution: "cookie-signature@npm:1.0.1" + checksum: 10c0/2053482e80b4b7c8defec790e52cd05bb6d2ff2eb64a897f1715495e1f12328b4a882240ac0c468d70fd9d8de580091525e0e19e940f04ef63d7181e0d951d21 + languageName: node + linkType: hard + "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" @@ -1390,6 +4329,20 @@ __metadata: languageName: node linkType: hard +"cookie-signature@npm:~1.0.6": + version: 1.0.7 + resolution: "cookie-signature@npm:1.0.7" + checksum: 10c0/e7731ad2995ae2efeed6435ec1e22cdd21afef29d300c27281438b1eab2bae04ef0d1a203928c0afec2cee72aa36540b8747406ebe308ad23c8e8cc3c26c9c51 + languageName: node + linkType: hard + +"cookie@npm:0.1.0": + version: 0.1.0 + resolution: "cookie@npm:0.1.0" + checksum: 10c0/8ae793aea017e0b832a6de17e08e57dbbeb8e2a14cdb154d464761f4a63f507e0fd1c9bf4e9ee1916143981225558796cf1d937df7a52d794e2b33b0c20a271b + languageName: node + linkType: hard + "cookie@npm:0.7.1": version: 0.7.1 resolution: "cookie@npm:0.7.1" @@ -1397,7 +4350,76 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": +"cookie@npm:^1.0.2": + version: 1.1.1 + resolution: "cookie@npm:1.1.1" + checksum: 10c0/79c4ddc0fcad9c4f045f826f42edf54bcc921a29586a4558b0898277fa89fb47be95bc384c2253f493af7b29500c830da28341274527328f18eba9f58afa112c + languageName: node + linkType: hard + +"cookie@npm:~0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 + languageName: node + linkType: hard + +"copy-descriptor@npm:^0.1.0": + version: 0.1.1 + resolution: "copy-descriptor@npm:0.1.1" + checksum: 10c0/161f6760b7348c941007a83df180588fe2f1283e0867cc027182734e0f26134e6cc02de09aa24a95dc267b2e2025b55659eef76c8019df27bc2d883033690181 + languageName: node + linkType: hard + +"core-js@npm:^1.0.0, core-js@npm:^1.2.6": + version: 1.2.7 + resolution: "core-js@npm:1.2.7" + checksum: 10c0/2b2966e40833f522129da4cc979688760654e9b38e32b06517a94c0edf2882d8990c4b1b0087cb2abfbe6219fdb21dc64343fa264a6b6280ec88c3682b8eee66 + languageName: node + linkType: hard + +"core-js@npm:^2.4.0, core-js@npm:^2.5.0, core-js@npm:^2.6.5": + version: 2.6.12 + resolution: "core-js@npm:2.6.12" + checksum: 10c0/00128efe427789120a06b819adc94cc72b96955acb331cb71d09287baf9bd37bebd191d91f1ee4939c893a050307ead4faea08876f09115112612b6a05684b63 + languageName: node + linkType: hard + +"core-util-is@npm:1.0.2": + version: 1.0.2 + resolution: "core-util-is@npm:1.0.2" + checksum: 10c0/980a37a93956d0de8a828ce508f9b9e3317039d68922ca79995421944146700e4aaf490a6dbfebcb1c5292a7184600c7710b957d724be1e37b8254c6bc0fe246 + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + +"cross-spawn@npm:^6.0.0, cross-spawn@npm:^6.0.5": + version: 6.0.6 + resolution: "cross-spawn@npm:6.0.6" + dependencies: + nice-try: "npm:^1.0.4" + path-key: "npm:^2.0.1" + semver: "npm:^5.5.0" + shebang-command: "npm:^1.2.0" + which: "npm:^1.2.9" + checksum: 10c0/bf61fb890e8635102ea9bce050515cf915ff6a50ccaa0b37a17dc82fded0fb3ed7af5478b9367b86baee19127ad86af4be51d209f64fd6638c0862dca185fe1d + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -1408,7 +4430,21 @@ __metadata: languageName: node linkType: hard -"csv-parse@npm:^5.4.0": +"crypt@npm:0.0.2": + version: 0.0.2 + resolution: "crypt@npm:0.0.2" + checksum: 10c0/adbf263441dd801665d5425f044647533f39f4612544071b1471962209d235042fb703c27eea2795c7c53e1dfc242405173003f83cf4f4761a633d11f9653f18 + languageName: node + linkType: hard + +"csv-parse@npm:^1.0.1": + version: 1.3.3 + resolution: "csv-parse@npm:1.3.3" + checksum: 10c0/1c904f7d29a755d98924deec8c8c8c772c2bf1cfcd867769ded89a73f7cde7b4ce9e2fe33965eca30c714c330c756d2086459e753f7af7f6a33fea0c0643540d + languageName: node + linkType: hard + +"csv-parse@npm:^5.3.0, csv-parse@npm:^5.4.0": version: 5.6.0 resolution: "csv-parse@npm:5.6.0" checksum: 10c0/52f5e6c45359902e0c8e57fc2eeed41366dc6b6d283b495b538dd50c8e8510413d6f924096ea056319cbbb8ed26e111c3a3485d7985c021bcf5abaa9e92425c7 @@ -1424,6 +4460,102 @@ __metadata: languageName: node linkType: hard +"d@npm:1, d@npm:^1.0.1, d@npm:^1.0.2": + version: 1.0.2 + resolution: "d@npm:1.0.2" + dependencies: + es5-ext: "npm:^0.10.64" + type: "npm:^2.7.2" + checksum: 10c0/3e6ede10cd3b77586c47da48423b62bed161bf1a48bdbcc94d87263522e22f5dfb0e678a6dba5323fdc14c5d8612b7f7eb9e7d9e37b2e2d67a7bf9f116dabe5a + languageName: node + linkType: hard + +"dashdash@npm:^1.12.0": + version: 1.14.1 + resolution: "dashdash@npm:1.14.1" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: 10c0/64589a15c5bd01fa41ff7007e0f2c6552c5ef2028075daa16b188a3721f4ba001841bf306dfc2eee6e2e6e7f76b38f5f17fb21fa847504192290ffa9e150118a + languageName: node + linkType: hard + +"data-uri-to-buffer@npm:0.0.4": + version: 0.0.4 + resolution: "data-uri-to-buffer@npm:0.0.4" + checksum: 10c0/00afddc0ec246426c1be76a9a4ba82176dddb41d3b58ede24a02ef9687b8e8c8002f0741274ff72439a2582b4bee12a8863855191e76a8bb1d5c15d830069a7d + languageName: node + linkType: hard + +"data-uri-to-buffer@npm:^4.0.0": + version: 4.0.1 + resolution: "data-uri-to-buffer@npm:4.0.1" + checksum: 10c0/20a6b93107597530d71d4cb285acee17f66bcdfc03fd81040921a81252f19db27588d87fc8fc69e1950c55cfb0bf8ae40d0e5e21d907230813eb5d5a7f9eb45b + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 + languageName: node + linkType: hard + +"date-time@npm:^3.1.0": + version: 3.1.0 + resolution: "date-time@npm:3.1.0" + dependencies: + time-zone: "npm:^1.0.0" + checksum: 10c0/aa3e2e930d74b0b9e90f69de7a16d3376e30f21f1f4ce9a2311d8fec32d760e776efea752dafad0ce188187265235229013036202be053fc2d7979813bfb6ded + languageName: node + linkType: hard + +"dbus-native@npm:^0.2.3": + version: 0.2.5 + resolution: "dbus-native@npm:0.2.5" + dependencies: + abstract-socket: "npm:^2.0.0" + event-stream: "npm:^3.1.7" + hexy: "npm:^0.2.10" + long: "npm:^3.0.1" + optimist: "npm:^0.6.1" + put: "npm:0.0.6" + safe-buffer: "npm:^5.1.1" + xml2js: "npm:0.1.14" + dependenciesMeta: + abstract-socket: + optional: true + bin: + dbus2js: ./bin/dbus2js.js + checksum: 10c0/805f8b88eefbcb2682335468f12564db220304da306e810c2cf7e014fb811aaf1ad7b9f5446bf9259003c13e05a507902cd4965093296ba3478ffdab315bcc52 + languageName: node + linkType: hard + "debounce@npm:^1.2.1": version: 1.2.1 resolution: "debounce@npm:1.2.1" @@ -1431,7 +4563,19 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9": +"debug@npm:*, debug@npm:^4.3.2": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + +"debug@npm:2.6.9, debug@npm:^2.1.1, debug@npm:^2.1.3, debug@npm:^2.2.0, debug@npm:^2.3.3, debug@npm:^2.6.8, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -1452,6 +4596,13 @@ __metadata: languageName: node linkType: hard +"debug@npm:>= 0.7.3 < 1": + version: 0.8.1 + resolution: "debug@npm:0.8.1" + checksum: 10c0/cf371ceca5782465d0044af8456b52b39b4824677af538beb8eff8363821ce4dda843f0e91a70928c90f9bb8d4c3af9f95097cf0ab7bee29cb38fc8fb0f32335 + languageName: node + linkType: hard + "debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" @@ -1473,6 +4624,29 @@ __metadata: languageName: node linkType: hard +"decamelize@npm:^1.0.0, decamelize@npm:^1.1.1, decamelize@npm:^1.2.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 + languageName: node + linkType: hard + +"decode-uri-component@npm:^0.2.0": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 10c0/1f4fa54eb740414a816b3f6c24818fbfcabd74ac478391e9f4e2282c994127db02010ce804f3d08e38255493cfe68608b3f5c8e09fd6efc4ae46c807691f7a31 + languageName: node + linkType: hard + +"decompress-response@npm:^3.3.0": + version: 3.3.0 + resolution: "decompress-response@npm:3.3.0" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 10c0/5ffaf1d744277fd51c68c94ddc3081cd011b10b7de06637cccc6ecba137d45304a09ba1a776dee1c47fccc60b4a056c4bc74468eeea798ff1f1fca0024b45c9d + languageName: node + linkType: hard + "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -1482,6 +4656,15 @@ __metadata: languageName: node linkType: hard +"deep-defaults@npm:^1.0.3": + version: 1.0.5 + resolution: "deep-defaults@npm:1.0.5" + dependencies: + lodash: "npm:^4.17.5" + checksum: 10c0/85a7eabb1f2a22a9b8dd338e811e808fb76100ca7764ccad0f0aec1dd15900eab278b8b340f12ea2dfe3b612105fd4b6467440da318199528919942262c064a6 + languageName: node + linkType: hard + "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -1489,14 +4672,14 @@ __metadata: languageName: node linkType: hard -"deep-is@npm:^0.1.3": +"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c languageName: node linkType: hard -"defaults@npm:^1.0.3": +"defaults@npm:^1.0.2, defaults@npm:^1.0.3": version: 1.0.4 resolution: "defaults@npm:1.0.4" dependencies: @@ -1512,7 +4695,7 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.1.4": +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" dependencies: @@ -1530,6 +4713,17 @@ __metadata: languageName: node linkType: hard +"define-properties@npm:^1.1.2, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + "define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0": version: 1.2.0 resolution: "define-properties@npm:1.2.0" @@ -1540,20 +4734,78 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": +"define-property@npm:^0.2.5": + version: 0.2.5 + resolution: "define-property@npm:0.2.5" + dependencies: + is-descriptor: "npm:^0.1.0" + checksum: 10c0/9986915c0893818dedc9ca23eaf41370667762fd83ad8aa4bf026a28563120dbaacebdfbfbf2b18d3b929026b9c6ee972df1dbf22de8fafb5fe6ef18361e4750 + languageName: node + linkType: hard + +"define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "define-property@npm:1.0.0" + dependencies: + is-descriptor: "npm:^1.0.0" + checksum: 10c0/d7cf09db10d55df305f541694ed51dafc776ad9bb8a24428899c9f2d36b11ab38dce5527a81458d1b5e7c389f8cbe803b4abad6e91a0037a329d153b84fc975e + languageName: node + linkType: hard + +"define-property@npm:^2.0.2": + version: 2.0.2 + resolution: "define-property@npm:2.0.2" + dependencies: + is-descriptor: "npm:^1.0.2" + isobject: "npm:^3.0.1" + checksum: 10c0/f91a08ad008fa764172a2c072adc7312f10217ade89ddaea23018321c6d71b2b68b8c229141ed2064179404e345c537f1a2457c379824813695b51a6ad3e4969 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"depd@npm:2.0.0, depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c languageName: node linkType: hard -"destroy@npm:1.2.0": +"deprecation@npm:^2.0.0, deprecation@npm:^2.3.1": + version: 2.3.1 + resolution: "deprecation@npm:2.3.1" + checksum: 10c0/23d688ba66b74d09b908c40a76179418acbeeb0bfdf218c8075c58ad8d0c315130cb91aa3dffb623aa3a411a3569ce56c6460de6c8d69071c17fe6dd2442f032 + languageName: node + linkType: hard + +"destroy@npm:1.2.0, destroy@npm:~1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 languageName: node linkType: hard +"detect-file@npm:^1.0.0": + version: 1.0.0 + resolution: "detect-file@npm:1.0.0" + checksum: 10c0/c782a5f992047944c39d337c82f5d1d21d65d1378986d46c354df9d9ec6d5f356bca0182969c11b08b9b8a7af8727b3c2d5a9fad0b022be4a3bf4c216f63ed07 + languageName: node + linkType: hard + +"detect-indent@npm:^4.0.0": + version: 4.0.0 + resolution: "detect-indent@npm:4.0.0" + dependencies: + repeating: "npm:^2.0.0" + checksum: 10c0/066a0d13eadebb1e7d2ba395fdf9f3956f31f8383a6db263320108c283e2230250a102f4871f54926cc8a77c6323ac7103f30550a4ac3d6518aa1b934c041295 + languageName: node + linkType: hard + "detect-libc@npm:^2.0.0": version: 2.0.3 resolution: "detect-libc@npm:2.0.3" @@ -1561,6 +4813,34 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.1.2": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 + languageName: node + linkType: hard + +"dettle@npm:^1.0.2": + version: 1.0.5 + resolution: "dettle@npm:1.0.5" + checksum: 10c0/015faadbbaf30c0f63386f0a5dd1fea5b32c3e34bc3c269146866bc34d4ce7d9eae0568a368971a40e2e247322a76b4f310fa42c01be31b7d1f6d889afc3a327 + languageName: node + linkType: hard + +"diff@npm:1.0.7": + version: 1.0.7 + resolution: "diff@npm:1.0.7" + checksum: 10c0/2c7f2c78b1e982efa27ac7b1cd6b95069228233b2a54261088a8b86520d869594c093ebbe86bf12841a3049d26849b4cf7ad6e283637d92ba9bdc7d6f095da35 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.4 + resolution: "diff@npm:4.0.4" + checksum: 10c0/855fb70b093d1d9643ddc12ea76dca90dc9d9cdd7f82c08ee8b9325c0dc5748faf3c82e2047ced5dcaa8b26e58f7903900be2628d0380a222c02d79d8de385df + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -1574,10 +4854,27 @@ __metadata: version: 0.0.0-use.local resolution: "discover-dl-f86fcb@workspace:packages/discover-dl" dependencies: - csv-parse: "npm:^5.4.0" - jstoxml: "npm:^3.2.7" - languageName: unknown - linkType: soft + csv-parse: "npm:^5.4.0" + jstoxml: "npm:^3.2.7" + languageName: unknown + linkType: soft + +"docopt@npm:^0.6.2": + version: 0.6.2 + resolution: "docopt@npm:0.6.2" + checksum: 10c0/933d3694c576fbe537452f13ddc3cc9fc93631cc481269affaebc7328a66f22adfef3b156ac1ad0433320b38c0b5f512575f624ad890a624833a3b1a7999a7ba + languageName: node + linkType: hard + +"doctrine@npm:^1.2.2": + version: 1.5.0 + resolution: "doctrine@npm:1.5.0" + dependencies: + esutils: "npm:^2.0.2" + isarray: "npm:^1.0.0" + checksum: 10c0/39e062edfbdd27489fa9c66b57436ed70442e51c9813e2e4326a73641373f6711e99d078eb25e3766b26e4708b430228bb447f67eddd7c6f5ec8fa3fc8f9b4a0 + languageName: node + linkType: hard "doctrine@npm:^2.1.0": version: 2.1.0 @@ -1607,6 +4904,142 @@ __metadata: languageName: node linkType: hard +"drizzle-orm@npm:^0.44.5": + version: 0.44.7 + resolution: "drizzle-orm@npm:0.44.7" + peerDependencies: + "@aws-sdk/client-rds-data": ">=3" + "@cloudflare/workers-types": ">=4" + "@electric-sql/pglite": ">=0.2.0" + "@libsql/client": ">=0.10.0" + "@libsql/client-wasm": ">=0.10.0" + "@neondatabase/serverless": ">=0.10.0" + "@op-engineering/op-sqlite": ">=2" + "@opentelemetry/api": ^1.4.1 + "@planetscale/database": ">=1.13" + "@prisma/client": "*" + "@tidbcloud/serverless": "*" + "@types/better-sqlite3": "*" + "@types/pg": "*" + "@types/sql.js": "*" + "@upstash/redis": ">=1.34.7" + "@vercel/postgres": ">=0.8.0" + "@xata.io/client": "*" + better-sqlite3: ">=7" + bun-types: "*" + expo-sqlite: ">=14.0.0" + gel: ">=2" + knex: "*" + kysely: "*" + mysql2: ">=2" + pg: ">=8" + postgres: ">=3" + sql.js: ">=1" + sqlite3: ">=5" + peerDependenciesMeta: + "@aws-sdk/client-rds-data": + optional: true + "@cloudflare/workers-types": + optional: true + "@electric-sql/pglite": + optional: true + "@libsql/client": + optional: true + "@libsql/client-wasm": + optional: true + "@neondatabase/serverless": + optional: true + "@op-engineering/op-sqlite": + optional: true + "@opentelemetry/api": + optional: true + "@planetscale/database": + optional: true + "@prisma/client": + optional: true + "@tidbcloud/serverless": + optional: true + "@types/better-sqlite3": + optional: true + "@types/pg": + optional: true + "@types/sql.js": + optional: true + "@upstash/redis": + optional: true + "@vercel/postgres": + optional: true + "@xata.io/client": + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + checksum: 10c0/6adfe19179c83be397490c21573433e38ed7eff890bbb1c3b39157ec57d6b7420e9dcfebb8fe0e6ea534b29a53a33b2ec75c77dd2ac6b474b7055965ee7df00d + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 + languageName: node + linkType: hard + +"duplexer2@npm:~0.1.4": + version: 0.1.4 + resolution: "duplexer2@npm:0.1.4" + dependencies: + readable-stream: "npm:^2.0.2" + checksum: 10c0/0765a4cc6fe6d9615d43cc6dbccff6f8412811d89a6f6aa44828ca9422a0a469625ce023bf81cee68f52930dbedf9c5716056ff264ac886612702d134b5e39b4 + languageName: node + linkType: hard + +"duplexer3@npm:^0.1.4": + version: 0.1.5 + resolution: "duplexer3@npm:0.1.5" + checksum: 10c0/02195030d61c4d6a2a34eca71639f2ea5e05cb963490e5bd9527623c2ac7f50c33842a34d14777ea9cbfd9bc2be5a84065560b897d9fabb99346058a5b86ca98 + languageName: node + linkType: hard + +"duplexer@npm:^0.1.1, duplexer@npm:~0.1.1": + version: 0.1.2 + resolution: "duplexer@npm:0.1.2" + checksum: 10c0/c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.1.0": + version: 0.1.1 + resolution: "eastasianwidth@npm:0.1.1" + checksum: 10c0/aaabbe8e14b995c3a732149db1193fd76ebfba818c50b4d303fa1e8f6fc4d90369ff26dfecddd9f55ce2751a3f6f7ec312e0f4af2b9b035084fb409361f11bfb + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -1614,6 +5047,16 @@ __metadata: languageName: node linkType: hard +"ecc-jsbn@npm:~0.1.1": + version: 0.1.2 + resolution: "ecc-jsbn@npm:0.1.2" + dependencies: + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.1.0" + checksum: 10c0/6cf168bae1e2dad2e46561d9af9cbabfbf5ff592176ad4e9f0f41eaaf5fe5e10bb58147fe0a804de62b1ee9dad42c28810c88d652b21b6013c47ba8efa274ca1 + languageName: node + linkType: hard + "ecdsa-sig-formatter@npm:1.0.11, ecdsa-sig-formatter@npm:^1.0.11": version: 1.0.11 resolution: "ecdsa-sig-formatter@npm:1.0.11" @@ -1630,6 +5073,52 @@ __metadata: languageName: node linkType: hard +"electron-download@npm:^3.0.1": + version: 3.3.0 + resolution: "electron-download@npm:3.3.0" + dependencies: + debug: "npm:^2.2.0" + fs-extra: "npm:^0.30.0" + home-path: "npm:^1.0.1" + minimist: "npm:^1.2.0" + nugget: "npm:^2.0.0" + path-exists: "npm:^2.1.0" + rc: "npm:^1.1.2" + semver: "npm:^5.3.0" + sumchecker: "npm:^1.2.0" + bin: + electron-download: build/cli.js + checksum: 10c0/b1ac5915ce6e1cab4095e668a7144bec90b3f0355b60a512a5b57d2050177d53b76f4ee01f7137ff9771c5e70482fcfa7205670a46477ca455a7cff5082d2dc8 + languageName: node + linkType: hard + +"electron@npm:^1.4.4": + version: 1.8.8 + resolution: "electron@npm:1.8.8" + dependencies: + "@types/node": "npm:^8.0.24" + electron-download: "npm:^3.0.1" + extract-zip: "npm:^1.0.3" + bin: + electron: cli.js + checksum: 10c0/b22df7220a7c9def4d641eac7c51d2528c742a71fe6b66c62569f717fd574eab50f818c1eb4cfd9af307a81d6940da42164ff16a0cea84f80b5e8a71831652ad + languageName: node + linkType: hard + +"emittery@npm:^1.0.1": + version: 1.2.0 + resolution: "emittery@npm:1.2.0" + checksum: 10c0/3b16d67b2cbbc19d44fa124684039956dc94c376cefa8c7b29f4c934d9d370e6819f642cddaa343b83b1fc03fda554a1498e12f5861caf9d6f6394ff4b6e808a + languageName: node + linkType: hard + +"emoji-regex@npm:^7.0.1": + version: 7.0.3 + resolution: "emoji-regex@npm:7.0.3" + checksum: 10c0/a8917d695c3a3384e4b7230a6a06fd2de6b3db3709116792e8b7b36ddbb3db4deb28ad3e983e70d4f2a1f9063b5dab9025e4e26e9ca08278da4fbb73e213743f + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -1658,7 +5147,7 @@ __metadata: languageName: node linkType: hard -"encoding@npm:^0.1.13": +"encoding@npm:^0.1.11, encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" dependencies: @@ -1676,6 +5165,15 @@ __metadata: languageName: node linkType: hard +"enqueue@npm:^1.0.2": + version: 1.0.2 + resolution: "enqueue@npm:1.0.2" + dependencies: + sliced: "npm:0.0.5" + checksum: 10c0/4652dc20450ae94190a23acf91dc2715be1cb32509f156e93b81115ababe06150c72f57b80a3ab514ec29e5e72ef81d600d82e377974bab717f9e0d0356ca94b + languageName: node + linkType: hard + "enquirer@npm:^2.3.5": version: 2.4.1 resolution: "enquirer@npm:2.4.1" @@ -1693,6 +5191,13 @@ __metadata: languageName: node linkType: hard +"err-code@npm:^1.0.0": + version: 1.1.2 + resolution: "err-code@npm:1.1.2" + checksum: 10c0/c5c0daadf1f1fb6065e97f1f76d66a72a77d6b38e1e4069e170579ed4d99058acc6d61b9248e8fdd27a74a7f489eb3aa1e376f24342fd4b792b13fcc2065b2c3 + languageName: node + linkType: hard + "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -1700,6 +5205,15 @@ __metadata: languageName: node linkType: hard +"error-ex@npm:^1.2.0": + version: 1.3.4 + resolution: "error-ex@npm:1.3.4" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/b9e34ff4778b8f3b31a8377e1c654456f4c41aeaa3d10a1138c3b7635d8b7b2e03eb2475d46d8ae055c1f180a1063e100bffabf64ea7e7388b37735df5328664 + languageName: node + linkType: hard + "error-ex@npm:^1.3.1": version: 1.3.2 resolution: "error-ex@npm:1.3.2" @@ -1709,6 +5223,25 @@ __metadata: languageName: node linkType: hard +"error-stack-parser-es@npm:^1.0.5": + version: 1.0.5 + resolution: "error-stack-parser-es@npm:1.0.5" + checksum: 10c0/040665eb87a42fe068c0da501bc258f3d15d3a03963c0723d7a2741e251d400c9776a52d2803afdc5709def99554cdb5a5d99c203c7eaf4885d3fbc217e2e8f7 + languageName: node + linkType: hard + +"ertp-clerk@workspace:packages/ertp-clerk": + version: 0.0.0-use.local + resolution: "ertp-clerk@workspace:packages/ertp-clerk" + dependencies: + "@types/node": "npm:^24.0.0" + capnweb: "npm:^0.4.0" + drizzle-orm: "npm:^0.44.5" + patch-package: "npm:^8.0.1" + wrangler: "npm:^4.59.2" + languageName: unknown + linkType: soft + "es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4, es-abstract@npm:^1.21.2": version: 1.22.1 resolution: "es-abstract@npm:1.22.1" @@ -1756,6 +5289,68 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.9, es-abstract@npm:^1.5.0": + version: 1.24.1 + resolution: "es-abstract@npm:1.24.1" + dependencies: + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.2" + is-negative-zero: "npm:^2.0.3" + is-regex: "npm:^1.2.1" + is-set: "npm:^2.0.3" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.4" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.4" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + stop-iteration-iterator: "npm:^1.1.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.19" + checksum: 10c0/fca062ef8b5daacf743732167d319a212d45cb655b0bb540821d38d715416ae15b04b84fc86da9e2c89135aa7b337337b6c867f84dcde698d75d55688d5d765c + languageName: node + linkType: hard + "es-define-property@npm:^1.0.0": version: 1.0.0 resolution: "es-define-property@npm:1.0.0" @@ -1765,6 +5360,13 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + "es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" @@ -1772,6 +5374,15 @@ __metadata: languageName: node linkType: hard +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.1 resolution: "es-set-tostringtag@npm:2.0.1" @@ -1783,6 +5394,18 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af + languageName: node + linkType: hard + "es-shim-unscopables@npm:^1.0.0": version: 1.0.0 resolution: "es-shim-unscopables@npm:1.0.0" @@ -1803,6 +5426,215 @@ __metadata: languageName: node linkType: hard +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" + dependencies: + is-callable: "npm:^1.2.7" + is-date-object: "npm:^1.0.5" + is-symbol: "npm:^1.0.4" + checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b + languageName: node + linkType: hard + +"es-toolkit@npm:^1.39.8": + version: 1.44.0 + resolution: "es-toolkit@npm:1.44.0" + dependenciesMeta: + "@trivago/prettier-plugin-sort-imports@4.3.0": + unplugged: true + prettier-plugin-sort-re-exports@0.0.1: + unplugged: true + checksum: 10c0/b80ff52ddc85ba26914cda57c9d4e46379ccc38c60dc097ef0d065cc0b20f95a16cf8d537969eea600b51c6687b5900a6cce67489db16d5ccc14d47597a29c34 + languageName: node + linkType: hard + +"es5-ext@npm:^0.10.12, es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.62, es5-ext@npm:^0.10.64, es5-ext@npm:~0.10.14": + version: 0.10.64 + resolution: "es5-ext@npm:0.10.64" + dependencies: + es6-iterator: "npm:^2.0.3" + es6-symbol: "npm:^3.1.3" + esniff: "npm:^2.0.1" + next-tick: "npm:^1.1.0" + checksum: 10c0/4459b6ae216f3c615db086e02437bdfde851515a101577fd61b19f9b3c1ad924bab4d197981eb7f0ccb915f643f2fc10ff76b97a680e96cbb572d15a27acd9a3 + languageName: node + linkType: hard + +"es6-iterator@npm:^2.0.3, es6-iterator@npm:~2.0.1, es6-iterator@npm:~2.0.3": + version: 2.0.3 + resolution: "es6-iterator@npm:2.0.3" + dependencies: + d: "npm:1" + es5-ext: "npm:^0.10.35" + es6-symbol: "npm:^3.1.1" + checksum: 10c0/91f20b799dba28fb05bf623c31857fc1524a0f1c444903beccaf8929ad196c8c9ded233e5ac7214fc63a92b3f25b64b7f2737fcca8b1f92d2d96cf3ac902f5d8 + languageName: node + linkType: hard + +"es6-map@npm:^0.1.3": + version: 0.1.5 + resolution: "es6-map@npm:0.1.5" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + es6-iterator: "npm:~2.0.1" + es6-set: "npm:~0.1.5" + es6-symbol: "npm:~3.1.1" + event-emitter: "npm:~0.3.5" + checksum: 10c0/62fe1a90ead1704bed699cb9c975e642023f590d5338c2a640d60ce0a846de7d5197561393ac03dd11473b96087cf8793c9e4836fe05ad4d2ef6afda6b9a3511 + languageName: node + linkType: hard + +"es6-promise@npm:^4.0.5": + version: 4.2.8 + resolution: "es6-promise@npm:4.2.8" + checksum: 10c0/2373d9c5e9a93bdd9f9ed32ff5cb6dd3dd785368d1c21e9bbbfd07d16345b3774ae260f2bd24c8f836a6903f432b4151e7816a7fa8891ccb4e1a55a028ec42c3 + languageName: node + linkType: hard + +"es6-set@npm:~0.1.5": + version: 0.1.6 + resolution: "es6-set@npm:0.1.6" + dependencies: + d: "npm:^1.0.1" + es5-ext: "npm:^0.10.62" + es6-iterator: "npm:~2.0.3" + es6-symbol: "npm:^3.1.3" + event-emitter: "npm:^0.3.5" + type: "npm:^2.7.2" + checksum: 10c0/50416775e45350b5c55b35aeb18dc25e6c2017af0ec056336b8e9e7c57e73d8342df398557909e815c523779628c842fbf1b0126c4483a9fbf42b0414358866a + languageName: node + linkType: hard + +"es6-symbol@npm:^3.1.1, es6-symbol@npm:^3.1.3, es6-symbol@npm:~3.1.1": + version: 3.1.4 + resolution: "es6-symbol@npm:3.1.4" + dependencies: + d: "npm:^1.0.2" + ext: "npm:^1.7.0" + checksum: 10c0/777bf3388db5d7919e09a0fd175aa5b8a62385b17cb2227b7a137680cba62b4d9f6193319a102642aa23d5840d38a62e4784f19cfa5be4a2210a3f0e9b23d15d + languageName: node + linkType: hard + +"es6-template-strings@npm:^2.0.0": + version: 2.0.1 + resolution: "es6-template-strings@npm:2.0.1" + dependencies: + es5-ext: "npm:^0.10.12" + esniff: "npm:^1.1" + checksum: 10c0/56769f10af0ec96910e0e70875a0b4c4f8eba17936785975ca155dc8ada3e5743fb1b100e0b4f4913b73ee46dafe2a409524807d6ae1470b048de7959041c582 + languageName: node + linkType: hard + +"es6-weak-map@npm:^2.0.1": + version: 2.0.3 + resolution: "es6-weak-map@npm:2.0.3" + dependencies: + d: "npm:1" + es5-ext: "npm:^0.10.46" + es6-iterator: "npm:^2.0.3" + es6-symbol: "npm:^3.1.1" + checksum: 10c0/460932be9542473dbbddd183e21c15a66cfec1b2c17dae2b514e190d6fb2896b7eb683783d4b36da036609d2e1c93d2815f21b374dfccaf02a8978694c2f7b67 + languageName: node + linkType: hard + +"esbuild@npm:0.27.0": + version: 0.27.0 + resolution: "esbuild@npm:0.27.0" + dependencies: + "@esbuild/aix-ppc64": "npm:0.27.0" + "@esbuild/android-arm": "npm:0.27.0" + "@esbuild/android-arm64": "npm:0.27.0" + "@esbuild/android-x64": "npm:0.27.0" + "@esbuild/darwin-arm64": "npm:0.27.0" + "@esbuild/darwin-x64": "npm:0.27.0" + "@esbuild/freebsd-arm64": "npm:0.27.0" + "@esbuild/freebsd-x64": "npm:0.27.0" + "@esbuild/linux-arm": "npm:0.27.0" + "@esbuild/linux-arm64": "npm:0.27.0" + "@esbuild/linux-ia32": "npm:0.27.0" + "@esbuild/linux-loong64": "npm:0.27.0" + "@esbuild/linux-mips64el": "npm:0.27.0" + "@esbuild/linux-ppc64": "npm:0.27.0" + "@esbuild/linux-riscv64": "npm:0.27.0" + "@esbuild/linux-s390x": "npm:0.27.0" + "@esbuild/linux-x64": "npm:0.27.0" + "@esbuild/netbsd-arm64": "npm:0.27.0" + "@esbuild/netbsd-x64": "npm:0.27.0" + "@esbuild/openbsd-arm64": "npm:0.27.0" + "@esbuild/openbsd-x64": "npm:0.27.0" + "@esbuild/openharmony-arm64": "npm:0.27.0" + "@esbuild/sunos-x64": "npm:0.27.0" + "@esbuild/win32-arm64": "npm:0.27.0" + "@esbuild/win32-ia32": "npm:0.27.0" + "@esbuild/win32-x64": "npm:0.27.0" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/a3a1deec285337b7dfe25cbb9aa8765d27a0192b610a8477a39bf5bd907a6bdb75e98898b61fb4337114cfadb13163bd95977db14e241373115f548e235b40a2 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + "escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" @@ -1810,20 +5642,27 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:5.0.0": +"escape-string-regexp@npm:5.0.0, escape-string-regexp@npm:^5.0.0": version: 5.0.0 resolution: "escape-string-regexp@npm:5.0.0" checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": +"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 languageName: node linkType: hard +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -1831,6 +5670,18 @@ __metadata: languageName: node linkType: hard +"escope@npm:^3.6.0": + version: 3.6.0 + resolution: "escope@npm:3.6.0" + dependencies: + es6-map: "npm:^0.1.3" + es6-weak-map: "npm:^2.0.1" + esrecurse: "npm:^4.1.0" + estraverse: "npm:^4.1.1" + checksum: 10c0/79cbb30bf126628eb7e586575b2f5fd31b14ea108cd2379c571fe4dc09ea5208f42dacf1cd43a702b59efccb128e9c9e7762d5cd670d2d184a889947aea509e5 + languageName: node + linkType: hard + "eslint-config-airbnb-base@npm:^14.2.1": version: 14.2.1 resolution: "eslint-config-airbnb-base@npm:14.2.1" @@ -1949,6 +5800,16 @@ __metadata: languageName: node linkType: hard +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + "eslint-utils@npm:^2.1.0": version: 2.1.0 resolution: "eslint-utils@npm:2.1.0" @@ -1979,6 +5840,49 @@ __metadata: languageName: node linkType: hard +"eslint@npm:^2.3.0": + version: 2.13.1 + resolution: "eslint@npm:2.13.1" + dependencies: + chalk: "npm:^1.1.3" + concat-stream: "npm:^1.4.6" + debug: "npm:^2.1.1" + doctrine: "npm:^1.2.2" + es6-map: "npm:^0.1.3" + escope: "npm:^3.6.0" + espree: "npm:^3.1.6" + estraverse: "npm:^4.2.0" + esutils: "npm:^2.0.2" + file-entry-cache: "npm:^1.1.1" + glob: "npm:^7.0.3" + globals: "npm:^9.2.0" + ignore: "npm:^3.1.2" + imurmurhash: "npm:^0.1.4" + inquirer: "npm:^0.12.0" + is-my-json-valid: "npm:^2.10.0" + is-resolvable: "npm:^1.0.0" + js-yaml: "npm:^3.5.1" + json-stable-stringify: "npm:^1.0.0" + levn: "npm:^0.3.0" + lodash: "npm:^4.0.0" + mkdirp: "npm:^0.5.0" + optionator: "npm:^0.8.1" + path-is-absolute: "npm:^1.0.0" + path-is-inside: "npm:^1.0.1" + pluralize: "npm:^1.2.1" + progress: "npm:^1.1.8" + require-uncached: "npm:^1.0.2" + shelljs: "npm:^0.6.0" + strip-json-comments: "npm:~1.0.1" + table: "npm:^3.7.8" + text-table: "npm:~0.2.0" + user-home: "npm:^2.0.0" + bin: + eslint: ./bin/eslint.js + checksum: 10c0/42c2942468e400f8344489f0acf6126573d5d5045df6ea0b55104d79d29bd393cd841cd89e79d014c50847791c1bfecbd5a40dfbf6e8f93d6a28b8b77f4d0e62 + languageName: node + linkType: hard + "eslint@npm:^7.24.0": version: 7.32.0 resolution: "eslint@npm:7.32.0" @@ -2022,10 +5926,97 @@ __metadata: strip-json-comments: "npm:^3.1.0" table: "npm:^6.0.9" text-table: "npm:^0.2.0" - v8-compile-cache: "npm:^2.0.3" + v8-compile-cache: "npm:^2.0.3" + bin: + eslint: bin/eslint.js + checksum: 10c0/84409f7767556179cb11529f1215f335c7dfccf90419df6147f949f14c347a960c7b569e80ed84011a0b6d10da1ef5046edbbb9b11c3e59aa6696d5217092e93 + languageName: node + linkType: hard + +"eslint@npm:^8.36.0": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 10c0/84409f7767556179cb11529f1215f335c7dfccf90419df6147f949f14c347a960c7b569e80ed84011a0b6d10da1ef5046edbbb9b11c3e59aa6696d5217092e93 + checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + languageName: node + linkType: hard + +"esm@npm:^3.2.25": + version: 3.2.25 + resolution: "esm@npm:3.2.25" + checksum: 10c0/8e60e8075506a7ce28681c30c8f54623fe18a251c364cd481d86719fc77f58aa055b293d80632d9686d5408aaf865ffa434897dc9fd9153c8b3f469fad23f094 + languageName: node + linkType: hard + +"esniff@npm:^1.1": + version: 1.1.3 + resolution: "esniff@npm:1.1.3" + dependencies: + d: "npm:^1.0.1" + es5-ext: "npm:^0.10.62" + checksum: 10c0/094355417c328c1d393c06e69eb2c9455f43eedbb074b06e8b4a1fcdce62a63cea113fa2f9825673a1251f939b6e858b6934bdf22eb7a0ad5c5a1905bee8e11d + languageName: node + linkType: hard + +"esniff@npm:^2.0.1": + version: 2.0.1 + resolution: "esniff@npm:2.0.1" + dependencies: + d: "npm:^1.0.1" + es5-ext: "npm:^0.10.62" + event-emitter: "npm:^0.3.5" + type: "npm:^2.7.2" + checksum: 10c0/7efd8d44ac20e5db8cb0ca77eb65eca60628b2d0f3a1030bcb05e71cc40e6e2935c47b87dba3c733db12925aa5b897f8e0e7a567a2c274206f184da676ea2e65 + languageName: node + linkType: hard + +"espree@npm:^3.1.6": + version: 3.5.4 + resolution: "espree@npm:3.5.4" + dependencies: + acorn: "npm:^5.5.0" + acorn-jsx: "npm:^3.0.0" + checksum: 10c0/30794af82523e432c40eb4022cf949978bb12b94c292bbd56eb8ecf0f497e1ab5800ce2384080fba39c2e572e447e11471fd6eab5185c962244488ca7838ce77 languageName: node linkType: hard @@ -2040,6 +6031,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + "esprima@npm:^4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" @@ -2059,7 +6061,16 @@ __metadata: languageName: node linkType: hard -"esrecurse@npm:^4.3.0": +"esquery@npm:^1.4.2": + version: 1.7.0 + resolution: "esquery@npm:1.7.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/77d5173db450b66f3bc685d11af4c90cffeedb340f34a39af96d43509a335ce39c894fd79233df32d38f5e4e219fa0f7076f6ec90bae8320170ba082c0db4793 + languageName: node + linkType: hard + +"esrecurse@npm:^4.1.0, esrecurse@npm:^4.3.0": version: 4.3.0 resolution: "esrecurse@npm:4.3.0" dependencies: @@ -2068,7 +6079,7 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": +"estraverse@npm:^4.1.1, estraverse@npm:^4.2.0": version: 4.3.0 resolution: "estraverse@npm:4.3.0" checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d @@ -2082,7 +6093,7 @@ __metadata: languageName: node linkType: hard -"esutils@npm:^2.0.2": +"esutils@npm:^2.0.2, esutils@npm:^2.0.3": version: 2.0.3 resolution: "esutils@npm:2.0.3" checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 @@ -2096,6 +6107,46 @@ __metadata: languageName: node linkType: hard +"event-emitter@npm:^0.3.5, event-emitter@npm:~0.3.5": + version: 0.3.5 + resolution: "event-emitter@npm:0.3.5" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + checksum: 10c0/75082fa8ffb3929766d0f0a063bfd6046bd2a80bea2666ebaa0cfd6f4a9116be6647c15667bea77222afc12f5b4071b68d393cf39fdaa0e8e81eda006160aff0 + languageName: node + linkType: hard + +"event-stream@npm:=3.3.4": + version: 3.3.4 + resolution: "event-stream@npm:3.3.4" + dependencies: + duplexer: "npm:~0.1.1" + from: "npm:~0" + map-stream: "npm:~0.1.0" + pause-stream: "npm:0.0.11" + split: "npm:0.3" + stream-combiner: "npm:~0.0.4" + through: "npm:~2.3.1" + checksum: 10c0/c3ec4e1efc27ab3e73a98923f0a2fa9a19051b87068fea2f3d53d2e4e8c5cfdadf8c8a115b17f3d90b16a46432d396bad91b6e8d0cceb3e449be717a03b75209 + languageName: node + linkType: hard + +"event-stream@npm:^3.1.7": + version: 3.3.5 + resolution: "event-stream@npm:3.3.5" + dependencies: + duplexer: "npm:^0.1.1" + from: "npm:^0.1.7" + map-stream: "npm:0.0.7" + pause-stream: "npm:^0.0.11" + split: "npm:^1.0.1" + stream-combiner: "npm:^0.2.2" + through: "npm:^2.3.8" + checksum: 10c0/266358eeeeaf54495ec1ed704f9e31963beb272023db74127088658ca5668dbfb74dbd6926d0542a04a3ed296ed48d9ee72966df64e2c59ee4c4a06a7cea55fa + languageName: node + linkType: hard + "event-target-shim@npm:^5.0.0": version: 5.0.1 resolution: "event-target-shim@npm:5.0.1" @@ -2103,6 +6154,43 @@ __metadata: languageName: node linkType: hard +"execa@npm:^1.0.0": + version: 1.0.0 + resolution: "execa@npm:1.0.0" + dependencies: + cross-spawn: "npm:^6.0.0" + get-stream: "npm:^4.0.0" + is-stream: "npm:^1.1.0" + npm-run-path: "npm:^2.0.0" + p-finally: "npm:^1.0.0" + signal-exit: "npm:^3.0.0" + strip-eof: "npm:^1.0.0" + checksum: 10c0/cc71707c9aa4a2552346893ee63198bf70a04b5a1bc4f8a0ef40f1d03c319eae80932c59191f037990d7d102193e83a38ec72115fff814ec2fb3099f3661a590 + languageName: node + linkType: hard + +"exit-hook@npm:^1.0.0": + version: 1.1.1 + resolution: "exit-hook@npm:1.1.1" + checksum: 10c0/6485772b1f5fdc5c8bf0cf9e9ba430f5b1e1ced2976be0bc6474b695358be32374a59370f5a3cec452c1b786b5f181035f3a10c58f9c639d7a7218e1b49e1a3a + languageName: node + linkType: hard + +"expand-brackets@npm:^2.1.4": + version: 2.1.4 + resolution: "expand-brackets@npm:2.1.4" + dependencies: + debug: "npm:^2.3.3" + define-property: "npm:^0.2.5" + extend-shallow: "npm:^2.0.1" + posix-character-classes: "npm:^0.1.0" + regex-not: "npm:^1.0.0" + snapdragon: "npm:^0.8.1" + to-regex: "npm:^3.0.1" + checksum: 10c0/3e2fb95d2d7d7231486493fd65db913927b656b6fcdfcce41e139c0991a72204af619ad4acb1be75ed994ca49edb7995ef241dbf8cf44dc3c03d211328428a87 + languageName: node + linkType: hard + "expand-template@npm:^2.0.3": version: 2.0.3 resolution: "expand-template@npm:2.0.3" @@ -2110,6 +6198,24 @@ __metadata: languageName: node linkType: hard +"expand-tilde@npm:^1.2.0": + version: 1.2.2 + resolution: "expand-tilde@npm:1.2.2" + dependencies: + os-homedir: "npm:^1.0.1" + checksum: 10c0/2342695a9d50bd5497454a0fad471b9394579f27c88c05334ef868ba85fbecf88fe2aeac6789ffc2a887b5fe120c0db295e34e65e308885cff0bd949a70f8aac + languageName: node + linkType: hard + +"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": + version: 2.0.2 + resolution: "expand-tilde@npm:2.0.2" + dependencies: + homedir-polyfill: "npm:^1.0.1" + checksum: 10c0/205a60497422746d1c3acbc1d65bd609b945066f239a2b785e69a7a651ac4cbeb4e08555b1ea0023abbe855e6fcb5bbf27d0b371367fdccd303d4fb2b4d66845 + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -2117,6 +6223,45 @@ __metadata: languageName: node linkType: hard +"express@npm:^4.16.3": + version: 4.22.1 + resolution: "express@npm:4.22.1" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:~1.20.3" + content-disposition: "npm:~0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:~0.7.1" + cookie-signature: "npm:~1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:~1.3.1" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.0" + merge-descriptors: "npm:1.0.3" + methods: "npm:~1.1.2" + on-finished: "npm:~2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:~0.1.12" + proxy-addr: "npm:~2.0.7" + qs: "npm:~6.14.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:~0.19.0" + serve-static: "npm:~1.16.2" + setprototypeof: "npm:1.2.0" + statuses: "npm:~2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10c0/ea57f512ab1e05e26b53a14fd432f65a10ec735ece342b37d0b63a7bcb8d337ffbb830ecb8ca15bcdfe423fbff88cea09786277baff200e8cde3ab40faa665cd + languageName: node + linkType: hard + "express@npm:^4.18.2": version: 4.21.1 resolution: "express@npm:4.21.1" @@ -2156,7 +6301,57 @@ __metadata: languageName: node linkType: hard -"extend@npm:^3.0.2": +"express@npm:~3.4.1": + version: 3.4.8 + resolution: "express@npm:3.4.8" + dependencies: + buffer-crc32: "npm:0.2.1" + commander: "npm:1.3.2" + connect: "npm:2.12.0" + cookie: "npm:0.1.0" + cookie-signature: "npm:1.0.1" + debug: "npm:>= 0.7.3 < 1" + fresh: "npm:0.2.0" + merge-descriptors: "npm:0.0.1" + methods: "npm:0.1.0" + mkdirp: "npm:0.3.5" + range-parser: "npm:0.0.4" + send: "npm:0.1.4" + bin: + express: ./bin/express + checksum: 10c0/3c8236b858a053746b1831dbca899be3c291f775c8471cbe4963a954a2c86f61b2b78423c70a660b28e17eacb5f8aafbb0f568dda8e91fb312d02e41731ef899 + languageName: node + linkType: hard + +"ext@npm:^1.7.0": + version: 1.7.0 + resolution: "ext@npm:1.7.0" + dependencies: + type: "npm:^2.7.2" + checksum: 10c0/a8e5f34e12214e9eee3a4af3b5c9d05ba048f28996450975b369fc86e5d0ef13b6df0615f892f5396a9c65d616213c25ec5b0ad17ef42eac4a500512a19da6c7 + languageName: node + linkType: hard + +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: "npm:^0.1.0" + checksum: 10c0/ee1cb0a18c9faddb42d791b2d64867bd6cfd0f3affb711782eb6e894dd193e2934a7f529426aac7c8ddb31ac5d38000a00aa2caf08aa3dfc3e1c8ff6ba340bd9 + languageName: node + linkType: hard + +"extend-shallow@npm:^3.0.0, extend-shallow@npm:^3.0.2": + version: 3.0.2 + resolution: "extend-shallow@npm:3.0.2" + dependencies: + assign-symbols: "npm:^1.0.0" + is-extendable: "npm:^1.0.1" + checksum: 10c0/f39581b8f98e3ad94995e33214fff725b0297cf09f2725b6f624551cfb71e0764accfd0af80becc0182af5014d2a57b31b85ec999f9eb8a6c45af81752feac9a + languageName: node + linkType: hard + +"extend@npm:^3.0.0, extend@npm:^3.0.2, extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 @@ -2174,6 +6369,59 @@ __metadata: languageName: node linkType: hard +"extglob@npm:^2.0.4": + version: 2.0.4 + resolution: "extglob@npm:2.0.4" + dependencies: + array-unique: "npm:^0.3.2" + define-property: "npm:^1.0.0" + expand-brackets: "npm:^2.1.4" + extend-shallow: "npm:^2.0.1" + fragment-cache: "npm:^0.2.1" + regex-not: "npm:^1.0.0" + snapdragon: "npm:^0.8.1" + to-regex: "npm:^3.0.1" + checksum: 10c0/e1a891342e2010d046143016c6c03d58455c2c96c30bf5570ea07929984ee7d48fad86b363aee08f7a8a638f5c3a66906429b21ecb19bc8e90df56a001cd282c + languageName: node + linkType: hard + +"extract-zip@npm:^1.0.3": + version: 1.7.0 + resolution: "extract-zip@npm:1.7.0" + dependencies: + concat-stream: "npm:^1.6.2" + debug: "npm:^2.6.9" + mkdirp: "npm:^0.5.4" + yauzl: "npm:^2.10.0" + bin: + extract-zip: cli.js + checksum: 10c0/333f1349ee678d47268315f264dbfcd7003747d25640441e186e87c66efd7129f171f1bcfe8ff1151a24da19d5f8602daff002ee24145dc65516bc9a8e40ee08 + languageName: node + linkType: hard + +"extsprintf@npm:1.3.0": + version: 1.3.0 + resolution: "extsprintf@npm:1.3.0" + checksum: 10c0/f75114a8388f0cbce68e277b6495dc3930db4dde1611072e4a140c24e204affd77320d004b947a132e9a3b97b8253017b2b62dce661975fb0adced707abf1ab5 + languageName: node + linkType: hard + +"extsprintf@npm:^1.2.0": + version: 1.4.1 + resolution: "extsprintf@npm:1.4.1" + checksum: 10c0/e10e2769985d0e9b6c7199b053a9957589d02e84de42832c295798cb422a025e6d4a92e0259c1fb4d07090f5bfde6b55fd9f880ac5855bd61d775f8ab75a7ab0 + languageName: node + linkType: hard + +"fast-check@npm:^3.0.0": + version: 3.23.2 + resolution: "fast-check@npm:3.23.2" + dependencies: + pure-rand: "npm:^6.1.0" + checksum: 10c0/16fcff3c80321ee765e23c3aebd0f6427f175c9c6c1753104ec658970162365dc2d56bda046d815e8f2e90634c07ba7d6f0bcfd327fbd576d98c56a18a9765ed + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -2181,7 +6429,7 @@ __metadata: languageName: node linkType: hard -"fast-diff@npm:^1.1.2": +"fast-diff@npm:^1.1.2, fast-diff@npm:^1.2.0": version: 1.3.0 resolution: "fast-diff@npm:1.3.0" checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 @@ -2201,6 +6449,26 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.3.0": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe + languageName: node + linkType: hard + +"fast-json-patch@npm:^3.0.0-1": + version: 3.1.1 + resolution: "fast-json-patch@npm:3.1.1" + checksum: 10c0/8a0438b4818bb53153275fe5b38033610e8c9d9eb11869e6a7dc05eb92fa70f3caa57015e344eb3ae1e71c7a75ad4cc6bc2dc9e0ff281d6ed8ecd44505210ca8 + languageName: node + linkType: hard + "fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -2208,7 +6476,7 @@ __metadata: languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6": +"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 @@ -2238,6 +6506,50 @@ __metadata: languageName: node linkType: hard +"fbjs@npm:^0.8.4": + version: 0.8.18 + resolution: "fbjs@npm:0.8.18" + dependencies: + core-js: "npm:^1.0.0" + isomorphic-fetch: "npm:^2.1.1" + loose-envify: "npm:^1.0.0" + object-assign: "npm:^4.1.0" + promise: "npm:^7.1.1" + setimmediate: "npm:^1.0.5" + ua-parser-js: "npm:^0.7.30" + checksum: 10c0/a7e1c64c349cde000e5d94ce0289c59b725a95fbdacc22529155c4dacea1dde37a4dae7e16f0f6602dca566f15978b42acd7ee973b620eaac612b5228687ffe0 + languageName: node + linkType: hard + +"fd-slicer@npm:~1.1.0": + version: 1.1.0 + resolution: "fd-slicer@npm:1.1.0" + dependencies: + pend: "npm:~1.2.0" + checksum: 10c0/304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e + languageName: node + linkType: hard + +"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": + version: 3.2.0 + resolution: "fetch-blob@npm:3.2.0" + dependencies: + node-domexception: "npm:^1.0.0" + web-streams-polyfill: "npm:^3.0.3" + checksum: 10c0/60054bf47bfa10fb0ba6cb7742acec2f37c1f56344f79a70bb8b1c48d77675927c720ff3191fa546410a0442c998d27ab05e9144c32d530d8a52fbe68f843b69 + languageName: node + linkType: hard + +"figures@npm:^1.3.5": + version: 1.7.0 + resolution: "figures@npm:1.7.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + object-assign: "npm:^4.1.0" + checksum: 10c0/a10942b0eec3372bf61822ab130d2bbecdf527d551b0b013fbe7175b7a0238ead644ee8930a1a3cb872fb9ab2ec27df30e303765a3b70b97852e2e9ee43bdff3 + languageName: node + linkType: hard + "figures@npm:^3.0.0, figures@npm:^3.1.0": version: 3.2.0 resolution: "figures@npm:3.2.0" @@ -2247,6 +6559,26 @@ __metadata: languageName: node linkType: hard +"figures@npm:^5.0.0": + version: 5.0.0 + resolution: "figures@npm:5.0.0" + dependencies: + escape-string-regexp: "npm:^5.0.0" + is-unicode-supported: "npm:^1.2.0" + checksum: 10c0/ce0f17d4ea8b0fc429c5207c343534a2f5284ecfb22aa08607da7dc84ed9e1cf754f5b97760e8dcb98d3c9d1a1e4d3d578fe3b5b99c426f05d0f06c7ba618e16 + languageName: node + linkType: hard + +"file-entry-cache@npm:^1.1.1": + version: 1.3.1 + resolution: "file-entry-cache@npm:1.3.1" + dependencies: + flat-cache: "npm:^1.2.1" + object-assign: "npm:^4.0.1" + checksum: 10c0/48c6508c0f041eb44696e48d39cbe573c3ef97401f781b4bc4c576905b1fc31ba641711a705ace5c4557c3f7b9c4ca3a2c885188d2bd17521b8f6a385eade80b + languageName: node + linkType: hard + "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -2263,6 +6595,18 @@ __metadata: languageName: node linkType: hard +"fill-range@npm:^4.0.0": + version: 4.0.0 + resolution: "fill-range@npm:4.0.0" + dependencies: + extend-shallow: "npm:^2.0.1" + is-number: "npm:^3.0.0" + repeat-string: "npm:^1.6.1" + to-regex-range: "npm:^2.1.0" + checksum: 10c0/ccd57b7c43d7e28a1f8a60adfa3c401629c08e2f121565eece95e2386ebc64dedc7128d8c3448342aabf19db0c55a34f425f148400c7a7be9a606ba48749e089 + languageName: node + linkType: hard + "fill-range@npm:^7.0.1": version: 7.0.1 resolution: "fill-range@npm:7.0.1" @@ -2272,6 +6616,15 @@ __metadata: languageName: node linkType: hard +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + "finalhandler@npm:1.3.1": version: 1.3.1 resolution: "finalhandler@npm:1.3.1" @@ -2287,6 +6640,60 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:~1.3.1": + version: 1.3.2 + resolution: "finalhandler@npm:1.3.2" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:~2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:~2.0.2" + unpipe: "npm:~1.0.0" + checksum: 10c0/435a4fd65e4e4e4c71bb5474980090b73c353a123dd415583f67836bdd6516e528cf07298e219a82b94631dee7830eae5eece38d3c178073cf7df4e8c182f413 + languageName: node + linkType: hard + +"fincaps@workspace:packages/fincaps": + version: 0.0.0-use.local + resolution: "fincaps@workspace:packages/fincaps" + dependencies: + "@endo/far": "npm:^0.2.21" + "@endo/patterns": "npm:^0.2.5" + "@fast-check/ava": "npm:^1.1.5" + "@types/google-spreadsheet": "npm:^4.0.0" + ava: "npm:^5.3.1" + better-sqlite3: "npm:^12.6.2" + eslint: "npm:^8.36.0" + google-auth-library: "npm:^9.0.0" + google-spreadsheet: "npm:^4.0.2" + minimatch: "npm:^9.0.3" + npm-run-all: "npm:^4.1.5" + typescript: "npm:~5.1.6" + watcher: "npm:^2.3.0" + languageName: unknown + linkType: soft + +"find-up@npm:^1.0.0": + version: 1.1.2 + resolution: "find-up@npm:1.1.2" + dependencies: + path-exists: "npm:^2.0.0" + pinkie-promise: "npm:^2.0.0" + checksum: 10c0/51e35c62d9b7efe82d7d5cce966bfe10c2eaa78c769333f8114627e3a8a4a4f50747f5f50bff50b1094cbc6527776f0d3b9ff74d3561ef714a5290a17c80c2bc + languageName: node + linkType: hard + +"find-up@npm:^3.0.0": + version: 3.0.0 + resolution: "find-up@npm:3.0.0" + dependencies: + locate-path: "npm:^3.0.0" + checksum: 10c0/2c2e7d0a26db858e2f624f39038c74739e38306dee42b45f404f770db357947be9d0d587f1cac72d20c114deb38aa57316e879eb0a78b17b46da7dab0a3bd6e3 + languageName: node + linkType: hard + "find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" @@ -2307,6 +6714,91 @@ __metadata: languageName: node linkType: hard +"find-yarn-workspace-root@npm:^2.0.0": + version: 2.0.0 + resolution: "find-yarn-workspace-root@npm:2.0.0" + dependencies: + micromatch: "npm:^4.0.2" + checksum: 10c0/b0d3843013fbdaf4e57140e0165889d09fa61745c9e85da2af86e54974f4cc9f1967e40f0d8fc36a79d53091f0829c651d06607d552582e53976f3cd8f4e5689 + languageName: node + linkType: hard + +"findup-sync@npm:^2.0.0": + version: 2.0.0 + resolution: "findup-sync@npm:2.0.0" + dependencies: + detect-file: "npm:^1.0.0" + is-glob: "npm:^3.1.0" + micromatch: "npm:^3.0.4" + resolve-dir: "npm:^1.0.1" + checksum: 10c0/359e0382679718e49a022eca71d217cf0175fb2d0fba2d538f12b7add164d778b78b624375e959a3a78da1ede593e6cc288f4e7e81e0fcd0adf8746636b64608 + languageName: node + linkType: hard + +"fined@npm:^1.0.1": + version: 1.2.0 + resolution: "fined@npm:1.2.0" + dependencies: + expand-tilde: "npm:^2.0.2" + is-plain-object: "npm:^2.0.3" + object.defaults: "npm:^1.1.0" + object.pick: "npm:^1.2.0" + parse-filepath: "npm:^1.0.1" + checksum: 10c0/412f78bc35c450c9888844012f2a53c00c919453cab1d480e24243f12c2ca6479edee88014088351755bafd3eec56336938cbd7362c986491dffefd4ad9741f5 + languageName: node + linkType: hard + +"finquick@workspace:packages/ofxies": + version: 0.0.0-use.local + resolution: "finquick@workspace:packages/ofxies" + dependencies: + "@google/clasp": "npm:^2.4.2" + Capper: "dckc/Capper#master" + abstract-socket: "npm:^2.0.0" + bank: "npm:0.0.4" + banking: "npm:^1.0.1" + csv-parse: "npm:^1.0.1" + dbus-native: "npm:^0.2.3" + docopt: "npm:^0.6.2" + eslint: "npm:^2.3.0" + express: "npm:^4.16.3" + flow-bin: "npm:^0.75.0" + flow-coverage-report: "npm:^0.3.0" + flow-typed: "npm:^2.4.0" + jspm: "npm:^0.16.25" + mocha: "npm:~1.19.0" + mysql: "npm:^2.10.0" + mysql-events: "npm:0.0.7" + nightmare: "npm:^2.10.0" + object-assign-shim: "npm:^1.0.0" + paypal-rest-sdk: "npm:^1.7.1" + q: "npm:~1.0.1" + ws: "npm:^5.2.3" + xkeychain: "npm:0.0.6" + xml: "npm:^1.0.0" + xml2js: "npm:^0.4.7" + languageName: unknown + linkType: soft + +"flagged-respawn@npm:^1.0.0": + version: 1.0.1 + resolution: "flagged-respawn@npm:1.0.1" + checksum: 10c0/4ded739606afa331d60e530cd94ea7948e3bacab8de1c084be3bbb5e37ecceec207eef1ba8fc88d14d1b975c771ac1efc1517d800027b4e05613c6c797211178 + languageName: node + linkType: hard + +"flat-cache@npm:^1.2.1": + version: 1.3.4 + resolution: "flat-cache@npm:1.3.4" + dependencies: + circular-json: "npm:^0.3.1" + graceful-fs: "npm:^4.1.2" + rimraf: "npm:~2.6.2" + write: "npm:^0.2.1" + checksum: 10c0/caa87faf8e76726c385f3e547ef8d0847dd29a6858368771b311209e9ee6f37ec1d409935f73d193df12e7bce5dfd27f8db6029ee37f266748d6272332cf3aa4 + languageName: node + linkType: hard + "flat-cache@npm:^3.0.4": version: 3.2.0 resolution: "flat-cache@npm:3.2.0" @@ -2325,6 +6817,82 @@ __metadata: languageName: node linkType: hard +"flow-bin@npm:^0.75.0": + version: 0.75.0 + resolution: "flow-bin@npm:0.75.0" + bin: + flow: cli.js + checksum: 10c0/fb401d5877a5e88b318c21b160add6810895e0899c5c95f6506ebbc24bb56557416529bd6a8f6c6396a945eba77979188f2a563edb7917f0e454f1fda2d8ed25 + languageName: node + linkType: hard + +"flow-coverage-report@npm:^0.3.0": + version: 0.3.0 + resolution: "flow-coverage-report@npm:0.3.0" + dependencies: + array.prototype.find: "npm:2.0.0" + babel-runtime: "npm:6.11.6" + glob: "npm:7.0.5" + minimatch: "npm:3.0.3" + mkdirp: "npm:0.5.1" + parse-json: "npm:2.2.0" + react: "npm:15.3.1" + react-dom: "npm:15.3.1" + strip-json-comments: "npm:2.0.1" + temp: "npm:0.8.3" + terminal-table: "npm:0.0.12" + yargs: "npm:5.0.0" + bin: + flow-coverage-report: ./bin/flow-coverage-report.js + checksum: 10c0/2a699f39a0acf891095d640bba91cb73150b7b2d51da801908c9187296e6fe2d6f838ddf2b4877320c6decbe5c762661fb8febf038927d073277ec0d090782f3 + languageName: node + linkType: hard + +"flow-typed@npm:^2.4.0": + version: 2.6.2 + resolution: "flow-typed@npm:2.6.2" + dependencies: + "@babel/polyfill": "npm:^7.0.0" + "@octokit/rest": "npm:^16.33.1" + colors: "npm:^1.3.2" + flowgen: "npm:^1.9.0" + fs-extra: "npm:^7.0.0" + glob: "npm:^7.1.3" + got: "npm:^8.3.2" + md5: "npm:^2.2.1" + mkdirp: "npm:^0.5.1" + prettier: "npm:^1.18.2" + rimraf: "npm:^2.6.2" + semver: "npm:^5.5.1" + table: "npm:^5.0.2" + through: "npm:^2.3.8" + unzipper: "npm:^0.9.3" + which: "npm:^1.3.1" + yargs: "npm:^12.0.2" + bin: + flow-typed: dist/cli.js + checksum: 10c0/7241a485b01beeb1b5438c7168716ddfe802b7e3444620d83698c4f4c674082c0efc21cec72fae856db2d3c42a75b9241f0cd47c3ce395e898ebbb4371a76fd9 + languageName: node + linkType: hard + +"flowgen@npm:^1.9.0": + version: 1.21.0 + resolution: "flowgen@npm:1.21.0" + dependencies: + "@babel/code-frame": "npm:^7.16.7" + "@babel/highlight": "npm:^7.16.7" + commander: "npm:^6.1.0" + lodash: "npm:^4.17.20" + prettier: "npm:^2.5.1" + shelljs: "npm:^0.8.4" + typescript: "npm:~4.4.4" + typescript-compiler: "npm:^1.4.1-2" + bin: + flowgen: lib/cli/index.js + checksum: 10c0/60516b55436a6936fcd86658c9de741e1e4b4ccfdb9cf1af74fbf0b619b830c87911329f7499b4a2723431a0e5c9409271c6fe8f367f4ae689469f62027f6278 + languageName: node + linkType: hard + "follow-redirects@npm:^1.14.0": version: 1.15.9 resolution: "follow-redirects@npm:1.15.9" @@ -2335,6 +6903,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.15.6": + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/d301f430542520a54058d4aeeb453233c564aaccac835d29d15e050beb33f339ad67d9bddbce01739c5dc46a6716dbe3d9d0d5134b1ca203effa11a7ef092343 + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -2344,6 +6922,31 @@ __metadata: languageName: node linkType: hard +"for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" + dependencies: + is-callable: "npm:^1.2.7" + checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee + languageName: node + linkType: hard + +"for-in@npm:^1.0.1, for-in@npm:^1.0.2": + version: 1.0.2 + resolution: "for-in@npm:1.0.2" + checksum: 10c0/42bb609d564b1dc340e1996868b67961257fd03a48d7fdafd4f5119530b87f962be6b4d5b7e3a3fc84c9854d149494b1d358e0b0ce9837e64c4c6603a49451d6 + languageName: node + linkType: hard + +"for-own@npm:^1.0.0": + version: 1.0.0 + resolution: "for-own@npm:1.0.0" + dependencies: + for-in: "npm:^1.0.1" + checksum: 10c0/ca475bc22935edf923631e9e23588edcbed33a30f0c81adc98e2c7df35db362ec4f4b569bc69051c7cfc309dfc223818c09a2f52ccd9ed77b71931c913a43a13 + languageName: node + linkType: hard + "foreground-child@npm:^3.1.0": version: 3.3.0 resolution: "foreground-child@npm:3.3.0" @@ -2354,6 +6957,46 @@ __metadata: languageName: node linkType: hard +"forever-agent@npm:~0.6.1": + version: 0.6.1 + resolution: "forever-agent@npm:0.6.1" + checksum: 10c0/364f7f5f7d93ab661455351ce116a67877b66f59aca199559a999bd39e3cfadbfbfacc10415a915255e2210b30c23febe9aec3ca16bf2d1ff11c935a1000e24c + languageName: node + linkType: hard + +"form-data@npm:^4.0.4": + version: 4.0.5 + resolution: "form-data@npm:4.0.5" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.2" + mime-types: "npm:^2.1.12" + checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b + languageName: node + linkType: hard + +"form-data@npm:~2.3.2": + version: 2.3.3 + resolution: "form-data@npm:2.3.3" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.6" + mime-types: "npm:^2.1.12" + checksum: 10c0/706ef1e5649286b6a61e5bb87993a9842807fd8f149cd2548ee807ea4fb882247bdf7f6e64ac4720029c0cd5c80343de0e22eee1dc9e9882e12db9cc7bc016a4 + languageName: node + linkType: hard + +"formdata-polyfill@npm:^4.0.10": + version: 4.0.10 + resolution: "formdata-polyfill@npm:4.0.10" + dependencies: + fetch-blob: "npm:^3.1.2" + checksum: 10c0/5392ec484f9ce0d5e0d52fb5a78e7486637d516179b0eb84d81389d7eccf9ca2f663079da56f761355c0a65792810e3b345dc24db9a8bbbcf24ef3c8c88570c6 + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -2361,13 +7004,46 @@ __metadata: languageName: node linkType: hard -"fresh@npm:0.5.2": +"fragment-cache@npm:^0.2.1": + version: 0.2.1 + resolution: "fragment-cache@npm:0.2.1" + dependencies: + map-cache: "npm:^0.2.2" + checksum: 10c0/5891d1c1d1d5e1a7fb3ccf28515c06731476fa88f7a50f4ede8a0d8d239a338448e7f7cc8b73db48da19c229fa30066104fe6489862065a4f1ed591c42fbeabf + languageName: node + linkType: hard + +"fresh@npm:0.2.0": + version: 0.2.0 + resolution: "fresh@npm:0.2.0" + checksum: 10c0/cd2a93e38a9a9e3fac53c99efadadd58ae600f90e4a02f49e5d6015f55cd8a9df35132d41c1d43e87fe6124949637a1417f355534762b70442b1997b544234be + languageName: node + linkType: hard + +"fresh@npm:0.5.2, fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a languageName: node linkType: hard +"from2@npm:^2.1.1": + version: 2.3.0 + resolution: "from2@npm:2.3.0" + dependencies: + inherits: "npm:^2.0.1" + readable-stream: "npm:^2.0.0" + checksum: 10c0/f87f7a2e4513244d551454a7f8324ef1f7837864a8701c536417286ec19ff4915606b1dfa8909a21b7591ebd8440ffde3642f7c303690b9a4d7c832d62248aa1 + languageName: node + linkType: hard + +"from@npm:^0.1.7, from@npm:~0": + version: 0.1.7 + resolution: "from@npm:0.1.7" + checksum: 10c0/3aab5aea8fe8e1f12a5dee7f390d46a93431ce691b6222dcd5701c5d34378e51ca59b44967da1105a0f90fcdf5d7629d963d51e7ccd79827d19693bdcfb688d4 + languageName: node + linkType: hard + "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -2375,6 +7051,19 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^0.30.0": + version: 0.30.0 + resolution: "fs-extra@npm:0.30.0" + dependencies: + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^2.1.0" + klaw: "npm:^1.0.0" + path-is-absolute: "npm:^1.0.0" + rimraf: "npm:^2.2.8" + checksum: 10c0/24f3c966018c7bf436bf38ca3a126f1d95bf0f82598302195c4f0c8887767f045dae308f92c53a39cead74631dabbc30fcf1c71dbe96f1f0148f6de8edd114bc + languageName: node + linkType: hard + "fs-extra@npm:^10.0.0": version: 10.1.0 resolution: "fs-extra@npm:10.1.0" @@ -2386,6 +7075,28 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.3.0": + version: 11.3.3 + resolution: "fs-extra@npm:11.3.3" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/984924ff4104e3e9f351b658a864bf3b354b2c90429f57aec0acd12d92c4e6b762cbacacdffb4e745b280adce882e1f980c485d9f02c453f769ab4e7fc646ce3 + languageName: node + linkType: hard + +"fs-extra@npm:^7.0.0": + version: 7.0.1 + resolution: "fs-extra@npm:7.0.1" + dependencies: + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 10c0/1943bb2150007e3739921b8d13d4109abdc3cc481e53b97b7ea7f77eda1c3c642e27ae49eac3af074e3496ea02fde30f411ef410c760c70a38b92e656e5da784 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -2430,6 +7141,18 @@ __metadata: languageName: node linkType: hard +"fstream@npm:^1.0.12": + version: 1.0.12 + resolution: "fstream@npm:1.0.12" + dependencies: + graceful-fs: "npm:^4.1.2" + inherits: "npm:~2.0.0" + mkdirp: "npm:>=0.5 0" + rimraf: "npm:2" + checksum: 10c0/f52a0687a0649c6b93973eb7f1d5495e445fa993f797ba1af186e666b6aebe53916a8c497dce7037c74d0d4a33c56b0ab1f98f10ad71cca84ba8661110d25ee2 + languageName: node + linkType: hard + "function-bind@npm:^1.1.1": version: 1.1.1 resolution: "function-bind@npm:1.1.1" @@ -2444,6 +7167,13 @@ __metadata: languageName: node linkType: hard +"function-source@npm:^0.1.0": + version: 0.1.0 + resolution: "function-source@npm:0.1.0" + checksum: 10c0/c37ad491e2fd8f085407a30f49114bf9d501216201ee175044e0308effd4b7b34249822d02cfea653dd0bb2b88caeae4a933981a3c0227c75220d6253d1c3402 + languageName: node + linkType: hard + "function.prototype.name@npm:^1.1.5": version: 1.1.5 resolution: "function.prototype.name@npm:1.1.5" @@ -2456,6 +7186,20 @@ __metadata: languageName: node linkType: hard +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + functions-have-names: "npm:^1.2.3" + hasown: "npm:^2.0.2" + is-callable: "npm:^1.2.7" + checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 + languageName: node + linkType: hard + "functional-red-black-tree@npm:^1.0.1": version: 1.0.1 resolution: "functional-red-black-tree@npm:1.0.1" @@ -2477,7 +7221,16 @@ __metadata: languageName: node linkType: hard -"gaxios@npm:^4.0.0": +"fx@npm:*": + version: 39.2.0 + resolution: "fx@npm:39.2.0" + bin: + fx: index.js + checksum: 10c0/6a069f2b3bd890de53132d3d1de77120322a1342e16f25d138c75675fe994e2cc99e26b34fff3c7a341698fcf2e747846e324e3597bedbe46931d9ee8ec865ce + languageName: node + linkType: hard + +"gaxios@npm:^4.0.0, gaxios@npm:^4.2.1": version: 4.3.3 resolution: "gaxios@npm:4.3.3" dependencies: @@ -2490,6 +7243,19 @@ __metadata: languageName: node linkType: hard +"gaxios@npm:^6.0.0, gaxios@npm:^6.1.1": + version: 6.7.1 + resolution: "gaxios@npm:6.7.1" + dependencies: + extend: "npm:^3.0.2" + https-proxy-agent: "npm:^7.0.1" + is-stream: "npm:^2.0.0" + node-fetch: "npm:^2.6.9" + uuid: "npm:^9.0.1" + checksum: 10c0/53e92088470661c5bc493a1de29d05aff58b1f0009ec5e7903f730f892c3642a93e264e61904383741ccbab1ce6e519f12a985bba91e13527678b32ee6d7d3fd + languageName: node + linkType: hard + "gcp-metadata@npm:^4.2.0": version: 4.3.1 resolution: "gcp-metadata@npm:4.3.1" @@ -2500,6 +7266,56 @@ __metadata: languageName: node linkType: hard +"gcp-metadata@npm:^6.1.0": + version: 6.1.1 + resolution: "gcp-metadata@npm:6.1.1" + dependencies: + gaxios: "npm:^6.1.1" + google-logging-utils: "npm:^0.0.2" + json-bigint: "npm:^1.0.0" + checksum: 10c0/71f6ad4800aa622c246ceec3955014c0c78cdcfe025971f9558b9379f4019f5e65772763428ee8c3244fa81b8631977316eaa71a823493f82e5c44d7259ffac8 + languageName: node + linkType: hard + +"generate-function@npm:^2.0.0": + version: 2.3.1 + resolution: "generate-function@npm:2.3.1" + dependencies: + is-property: "npm:^1.0.2" + checksum: 10c0/4645cf1da90375e46a6f1dc51abc9933e5eafa4cd1a44c2f7e3909a30a4e9a1a08c14cd7d5b32da039da2dba2a085e1ed4597b580c196c3245b2d35d8bc0de5d + languageName: node + linkType: hard + +"generate-object-property@npm:^1.1.0": + version: 1.2.0 + resolution: "generate-object-property@npm:1.2.0" + dependencies: + is-property: "npm:^1.0.0" + checksum: 10c0/0b30acb43283a489b1adf4655f3f413b448dbec750678cf70bfde92b04a22f85b286be004b66fd713e3060e418d7beb562f05431235ec95c044b63e324759e8c + languageName: node + linkType: hard + +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8 + languageName: node + linkType: hard + +"get-caller-file@npm:^1.0.1": + version: 1.0.3 + resolution: "get-caller-file@npm:1.0.3" + checksum: 10c0/763dcee2de8ff60ae7e13a4bad8306205a2fbe108e555686344ddd9ef211b8bebfe459d3a739669257014c59e7cc1e7a44003c21af805c1214673e6a45f06c51 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + "get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1": version: 1.2.1 resolution: "get-intrinsic@npm:1.2.1" @@ -2525,6 +7341,53 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" + dependencies: + async-function: "npm:^1.0.0" + async-generator-function: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d + languageName: node + linkType: hard + +"get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + +"get-stream@npm:3.0.0, get-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "get-stream@npm:3.0.0" + checksum: 10c0/003f5f3b8870da59c6aafdf6ed7e7b07b48c2f8629cd461bd3900726548b6b8cfa2e14d6b7814fbb08f07a42f4f738407fa70b989928b2783a76b278505bba22 + languageName: node + linkType: hard + +"get-stream@npm:^4.0.0": + version: 4.1.0 + resolution: "get-stream@npm:4.1.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/294d876f667694a5ca23f0ca2156de67da950433b6fb53024833733975d32582896dbc7f257842d331809979efccf04d5e0b6b75ad4d45744c45f193fd497539 + languageName: node + linkType: hard + "get-stream@npm:^5.1.0": version: 5.2.0 resolution: "get-stream@npm:5.2.0" @@ -2544,6 +7407,33 @@ __metadata: languageName: node linkType: hard +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b + languageName: node + linkType: hard + +"get-value@npm:^2.0.3, get-value@npm:^2.0.6": + version: 2.0.6 + resolution: "get-value@npm:2.0.6" + checksum: 10c0/f069c132791b357c8fc4adfe9e2929b0a2c6e95f98ca7bc6fcbc27f8a302e552f86b4ae61ec56d9e9ac2544b93b6a39743d479866a37b43fcc104088ba74f0d9 + languageName: node + linkType: hard + +"getpass@npm:^0.1.1": + version: 0.1.7 + resolution: "getpass@npm:0.1.7" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: 10c0/c13f8530ecf16fc509f3fa5cd8dd2129ffa5d0c7ccdf5728b6022d52954c2d24be3706b4cdf15333eec52f1fbb43feb70a01dabc639d1d10071e371da8aaa52f + languageName: node + linkType: hard + "github-from-package@npm:0.0.0": version: 0.0.0 resolution: "github-from-package@npm:0.0.0" @@ -2560,6 +7450,53 @@ __metadata: languageName: node linkType: hard +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:3.2.3": + version: 3.2.3 + resolution: "glob@npm:3.2.3" + dependencies: + graceful-fs: "npm:~2.0.0" + inherits: "npm:2" + minimatch: "npm:~0.2.11" + checksum: 10c0/27d569aef432e61a8b217b5909205822d9cd9a80eba7fdf9d97dff9a36f20970445b11093172049d3efcbbe6e03e78641cae32098202b79fd570a69e9b84188b + languageName: node + linkType: hard + +"glob@npm:5.0.x, glob@npm:^5.0.10": + version: 5.0.15 + resolution: "glob@npm:5.0.15" + dependencies: + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:2 || 3" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/ed17b34406bedceb334a1df3502774a089ce822db07585ad2a6851d6040531540ce07407d7da5f0e0bded238114ea50302902f025e551499108076e635fcd9b1 + languageName: node + linkType: hard + +"glob@npm:7.0.5": + version: 7.0.5 + resolution: "glob@npm:7.0.5" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.0.2" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/e476ff0bcea9b5b26cbc554f49fa605e9a044e31beca628fc285e0773c5d0ed0c9fbbd4773ab1a52c170dfdb34e6f022445c0bf25ccfb52053f60d0e6599ea5a + languageName: node + linkType: hard + "glob@npm:^10.2.2, glob@npm:^10.3.10": version: 10.4.5 resolution: "glob@npm:10.4.5" @@ -2576,7 +7513,20 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3": +"glob@npm:^6.0.1": + version: 6.0.4 + resolution: "glob@npm:6.0.4" + dependencies: + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:2 || 3" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/520146ebce0f4594b8357338f86281b38ee14214debce398a2902176a28f18e0f98911ea48516d85022de64fbbaa57f074aa13715d1daa5d70e21b82cea22183 + languageName: node + linkType: hard + +"glob@npm:^7.0.0, glob@npm:^7.0.3, glob@npm:^7.1.3": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -2590,7 +7540,38 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.6.0, globals@npm:^13.9.0": +"global-modules@npm:^1.0.0": + version: 1.0.0 + resolution: "global-modules@npm:1.0.0" + dependencies: + global-prefix: "npm:^1.0.1" + is-windows: "npm:^1.0.1" + resolve-dir: "npm:^1.0.0" + checksum: 10c0/7d91ecf78d4fcbc966b2d89c1400df273afea795bc8cadf39857ee1684e442065621fd79413ff5fcd9e90c6f1b2dc0123e644fa0b7811f987fd54c6b9afad858 + languageName: node + linkType: hard + +"global-prefix@npm:^1.0.1": + version: 1.0.2 + resolution: "global-prefix@npm:1.0.2" + dependencies: + expand-tilde: "npm:^2.0.2" + homedir-polyfill: "npm:^1.0.1" + ini: "npm:^1.3.4" + is-windows: "npm:^1.0.1" + which: "npm:^1.2.14" + checksum: 10c0/d8037e300f1dc04d5d410d16afa662e71bfad22dcceba6c9727bb55cc273b8988ca940b3402f62e5392fd261dd9924a9a73a865ef2000219461f31f3fc86be06 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^13.19.0, globals@npm:^13.6.0, globals@npm:^13.9.0": version: 13.24.0 resolution: "globals@npm:13.24.0" dependencies: @@ -2599,6 +7580,13 @@ __metadata: languageName: node linkType: hard +"globals@npm:^9.18.0, globals@npm:^9.2.0": + version: 9.18.0 + resolution: "globals@npm:9.18.0" + checksum: 10c0/5ab74cb67cf060a9fceede4a0f2babc4c2c0b90dbb13847d2659defdf2121c60035ef23823c8417ce8c11bdaa7b412396077f2b3d2a7dedab490a881a0a96754 + languageName: node + linkType: hard + "globalthis@npm:^1.0.3": version: 1.0.3 resolution: "globalthis@npm:1.0.3" @@ -2608,6 +7596,16 @@ __metadata: languageName: node linkType: hard +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + "globby@npm:^11.0.3, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" @@ -2622,6 +7620,19 @@ __metadata: languageName: node linkType: hard +"globby@npm:^13.1.4, globby@npm:^13.2.2": + version: 13.2.2 + resolution: "globby@npm:13.2.2" + dependencies: + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.3.0" + ignore: "npm:^5.2.4" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: 10c0/a8d7cc7cbe5e1b2d0f81d467bbc5bc2eac35f74eaded3a6c85fc26d7acc8e6de22d396159db8a2fc340b8a342e74cac58de8f4aee74146d3d146921a76062664 + languageName: node + linkType: hard + "google-auth-library@npm:^6.1.3": version: 6.1.6 resolution: "google-auth-library@npm:6.1.6" @@ -2656,6 +7667,27 @@ __metadata: languageName: node linkType: hard +"google-auth-library@npm:^9.0.0": + version: 9.15.1 + resolution: "google-auth-library@npm:9.15.1" + dependencies: + base64-js: "npm:^1.3.0" + ecdsa-sig-formatter: "npm:^1.0.11" + gaxios: "npm:^6.1.1" + gcp-metadata: "npm:^6.1.0" + gtoken: "npm:^7.0.0" + jws: "npm:^4.0.0" + checksum: 10c0/6eef36d9a9cb7decd11e920ee892579261c6390104b3b24d3e0f3889096673189fe2ed0ee43fd563710e2560de98e63ad5aa4967b91e7f4e69074a422d5f7b65 + languageName: node + linkType: hard + +"google-logging-utils@npm:^0.0.2": + version: 0.0.2 + resolution: "google-logging-utils@npm:0.0.2" + checksum: 10c0/9a4bbd470dd101c77405e450fffca8592d1d7114f245a121288d04a957aca08c9dea2dd1a871effe71e41540d1bb0494731a0b0f6fea4358e77f06645e4268c1 + languageName: node + linkType: hard + "google-p12-pem@npm:^3.1.3": version: 3.1.4 resolution: "google-p12-pem@npm:3.1.4" @@ -2667,6 +7699,21 @@ __metadata: languageName: node linkType: hard +"google-spreadsheet@npm:*": + version: 5.0.2 + resolution: "google-spreadsheet@npm:5.0.2" + dependencies: + es-toolkit: "npm:^1.39.8" + ky: "npm:^1.8.2" + peerDependencies: + google-auth-library: ">=8.8.0" + peerDependenciesMeta: + google-auth-library: + optional: true + checksum: 10c0/bb921bed8cf1a6c260678a98a098a9074ad56aaa287c0d142d592d9f0e9db2fd65987a51d0efbad81fd2c31962d5b614ff770832903834aaa2ee5c83d5c2ea78 + languageName: node + linkType: hard + "google-spreadsheet@npm:^3.3.0": version: 3.3.0 resolution: "google-spreadsheet@npm:3.3.0" @@ -2678,6 +7725,21 @@ __metadata: languageName: node linkType: hard +"google-spreadsheet@npm:^4.0.2": + version: 4.1.5 + resolution: "google-spreadsheet@npm:4.1.5" + dependencies: + axios: "npm:^1.7.7" + lodash: "npm:^4.17.21" + peerDependencies: + google-auth-library: ">=8.8.0" + peerDependenciesMeta: + google-auth-library: + optional: true + checksum: 10c0/25f171cb0129cdc5fdf0bd84e479a0d6fc18ff65fda1ad7f509e92dce57a60ad620f8eeef4fd5282dd3b3daedc9db6e6ba4d795cfdb0778ae1f1ddf1e17d48a1 + languageName: node + linkType: hard + "googleapis-common@npm:^5.0.2": version: 5.1.0 resolution: "googleapis-common@npm:5.1.0" @@ -2711,6 +7773,13 @@ __metadata: languageName: node linkType: hard +"gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + "got@npm:^11.7.0": version: 11.8.6 resolution: "got@npm:11.8.6" @@ -2730,13 +7799,66 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.8": +"got@npm:^8.3.2": + version: 8.3.2 + resolution: "got@npm:8.3.2" + dependencies: + "@sindresorhus/is": "npm:^0.7.0" + cacheable-request: "npm:^2.1.1" + decompress-response: "npm:^3.3.0" + duplexer3: "npm:^0.1.4" + get-stream: "npm:^3.0.0" + into-stream: "npm:^3.1.0" + is-retry-allowed: "npm:^1.1.0" + isurl: "npm:^1.0.0-alpha5" + lowercase-keys: "npm:^1.0.0" + mimic-response: "npm:^1.0.0" + p-cancelable: "npm:^0.4.0" + p-timeout: "npm:^2.0.1" + pify: "npm:^3.0.0" + safe-buffer: "npm:^5.1.1" + timed-out: "npm:^4.0.1" + url-parse-lax: "npm:^3.0.0" + url-to-options: "npm:^1.0.1" + checksum: 10c0/1a3c772fc2f7d6800113b093b391f6864aa1ae5bdf7c6ad6fafc8a42a895e217dbea9b936438c185e2fff612d7ac40c4867d20ad7ba8652caca316994bcf5404 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.8": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 languageName: node linkType: hard +"graceful-fs@npm:~2.0.0": + version: 2.0.3 + resolution: "graceful-fs@npm:2.0.3" + checksum: 10c0/a2ac5ab5eb68731e8b7e3e4fcaa9cd15da8684977f4f41c13a7ca98fc16bf85772203894b53bc627bc1aeb7a3c94396d86869f265b8f18b145dfbb749a745e29 + languageName: node + linkType: hard + +"graceful-readlink@npm:>= 1.0.0": + version: 1.0.1 + resolution: "graceful-readlink@npm:1.0.1" + checksum: 10c0/c53e703257e77f8a4495ff0d476c09aa413251acd26684f4544771b15e0ad361d1075b8f6d27b52af6942ea58155a9bbdb8125d717c70df27117460fee295a54 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"growl@npm:1.7.x": + version: 1.7.0 + resolution: "growl@npm:1.7.0" + checksum: 10c0/eb73954b1c3632eda2196e5321bda9350f44675ea1fedb2241da903fa592e665c773e1b405b349dfaf967780142b8548f4d99c1be439959fa1776b1caf10e35f + languageName: node + linkType: hard + "gtoken@npm:^5.0.4": version: 5.3.2 resolution: "gtoken@npm:5.3.2" @@ -2748,6 +7870,42 @@ __metadata: languageName: node linkType: hard +"gtoken@npm:^7.0.0": + version: 7.1.0 + resolution: "gtoken@npm:7.1.0" + dependencies: + gaxios: "npm:^6.0.0" + jws: "npm:^4.0.0" + checksum: 10c0/0a3dcacb1a3c4578abe1ee01c7d0bf20bffe8ded3ee73fc58885d53c00f6eb43b4e1372ff179f0da3ed5cfebd5b7c6ab8ae2776f1787e90d943691b4fe57c716 + languageName: node + linkType: hard + +"har-schema@npm:^2.0.0": + version: 2.0.0 + resolution: "har-schema@npm:2.0.0" + checksum: 10c0/3856cb76152658e0002b9c2b45b4360bb26b3e832c823caed8fcf39a01096030bf09fa5685c0f7b0f2cb3ecba6e9dce17edaf28b64a423d6201092e6be56e592 + languageName: node + linkType: hard + +"har-validator@npm:~5.1.3": + version: 5.1.5 + resolution: "har-validator@npm:5.1.5" + dependencies: + ajv: "npm:^6.12.3" + har-schema: "npm:^2.0.0" + checksum: 10c0/f1d606eb1021839e3a905be5ef7cca81c2256a6be0748efb8fefc14312214f9e6c15d7f2eaf37514104071207d84f627b68bb9f6178703da4e06fbd1a0649a5e + languageName: node + linkType: hard + +"has-ansi@npm:^2.0.0": + version: 2.0.0 + resolution: "has-ansi@npm:2.0.0" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: 10c0/f54e4887b9f8f3c4bfefd649c48825b3c093987c92c27880ee9898539e6f01aed261e82e73153c3f920fde0db5bf6ebd58deb498ed1debabcb4bc40113ccdf05 + languageName: node + linkType: hard + "has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" @@ -2794,6 +7952,22 @@ __metadata: languageName: node linkType: hard +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: "npm:^1.0.0" + checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95 + languageName: node + linkType: hard + +"has-symbol-support-x@npm:^1.4.1": + version: 1.4.2 + resolution: "has-symbol-support-x@npm:1.4.2" + checksum: 10c0/993f0e1a7a2c8f41f356b20c33cda49bc2f5c4442f858b0fa58b4852f4ba50e7d7400a2734822c415975114e6f768bba9bb6063dd687026baaeeed6453d94a03 + languageName: node + linkType: hard + "has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" @@ -2801,6 +7975,22 @@ __metadata: languageName: node linkType: hard +"has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e + languageName: node + linkType: hard + +"has-to-string-tag-x@npm:^1.2.0": + version: 1.4.1 + resolution: "has-to-string-tag-x@npm:1.4.1" + dependencies: + has-symbol-support-x: "npm:^1.4.1" + checksum: 10c0/e7197e830fe55afe596fc3fe4ab23fa455f69a1ba850b493e527c728d1e6d2ecc7197ab38b8bdc7ae8a7669e23c19a8b9f52f853a509639c70e0efbdc5d175e5 + languageName: node + linkType: hard + "has-tostringtag@npm:^1.0.0": version: 1.0.0 resolution: "has-tostringtag@npm:1.0.0" @@ -2810,6 +8000,54 @@ __metadata: languageName: node linkType: hard +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + +"has-value@npm:^0.3.1": + version: 0.3.1 + resolution: "has-value@npm:0.3.1" + dependencies: + get-value: "npm:^2.0.3" + has-values: "npm:^0.1.4" + isobject: "npm:^2.0.0" + checksum: 10c0/7a7c2e9d07bc9742c81806150adb154d149bc6155267248c459cd1ce2a64b0759980d26213260e4b7599c8a3754551179f155ded88d0533a0d2bc7bc29028432 + languageName: node + linkType: hard + +"has-value@npm:^1.0.0": + version: 1.0.0 + resolution: "has-value@npm:1.0.0" + dependencies: + get-value: "npm:^2.0.6" + has-values: "npm:^1.0.0" + isobject: "npm:^3.0.0" + checksum: 10c0/17cdccaf50f8aac80a109dba2e2ee5e800aec9a9d382ef9deab66c56b34269e4c9ac720276d5ffa722764304a1180ae436df077da0dd05548cfae0209708ba4d + languageName: node + linkType: hard + +"has-values@npm:^0.1.4": + version: 0.1.4 + resolution: "has-values@npm:0.1.4" + checksum: 10c0/a8f00ad862c20289798c35243d5bd0b0a97dd44b668c2204afe082e0265f2d0bf3b89fc8cc0ef01a52b49f10aa35cf85c336ee3a5f1cac96ed490f5e901cdbf2 + languageName: node + linkType: hard + +"has-values@npm:^1.0.0": + version: 1.0.0 + resolution: "has-values@npm:1.0.0" + dependencies: + is-number: "npm:^3.0.0" + kind-of: "npm:^4.0.0" + checksum: 10c0/a6f2a1cc6b2e43eacc68e62e71ad6890def7f4b13d2ef06b4ad3ee156c23e470e6df144b9b467701908e17633411f1075fdff0cab45fb66c5e0584d89b25f35e + languageName: node + linkType: hard + "has@npm:^1.0.3": version: 1.0.3 resolution: "has@npm:1.0.3" @@ -2819,7 +8057,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0": +"hasown@npm:^2.0.0, hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -2828,6 +8066,48 @@ __metadata: languageName: node linkType: hard +"hexy@npm:^0.2.10": + version: 0.2.11 + resolution: "hexy@npm:0.2.11" + bin: + hexy: ./bin/hexy_cmd.js + checksum: 10c0/469fb0f9e4fb491cb60660bfecd6ddfc5be3cc4a9edd938eabcde449b6fc5215a1ca3a9e7285dd352fe7f0e2b94a259dc141d8a9cee4097989c60e24e0f8e590 + languageName: node + linkType: hard + +"home-or-tmp@npm:^2.0.0": + version: 2.0.0 + resolution: "home-or-tmp@npm:2.0.0" + dependencies: + os-homedir: "npm:^1.0.0" + os-tmpdir: "npm:^1.0.1" + checksum: 10c0/a0e0d26db09dc0b3245f52a9159d3e970e628ddc22d69842e8413ea42f81d5a29c3808f9b08ea4d48db084e4e693193cc238c114775aa92d753bf95a9daa10fb + languageName: node + linkType: hard + +"home-path@npm:^1.0.1": + version: 1.0.7 + resolution: "home-path@npm:1.0.7" + checksum: 10c0/389563093e5236642c2d144705c7a3e71ba6a3c5b17e4221d74da62dac35f1e8ab14f66d542708a2ed5ca4e9fcbad7cc3d014feb07351dc928b8a69f593a93c8 + languageName: node + linkType: hard + +"homedir-polyfill@npm:^1.0.1": + version: 1.0.3 + resolution: "homedir-polyfill@npm:1.0.3" + dependencies: + parse-passwd: "npm:^1.0.0" + checksum: 10c0/3c099844f94b8b438f124bd5698bdcfef32b2d455115fb8050d7148e7f7b95fc89ba9922586c491f0e1cdebf437b1053c84ecddb8d596e109e9ac69c5b4a9e27 + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 + languageName: node + linkType: hard + "hosted-git-info@npm:^4.0.1": version: 4.1.0 resolution: "hosted-git-info@npm:4.1.0" @@ -2837,6 +8117,13 @@ __metadata: languageName: node linkType: hard +"http-cache-semantics@npm:3.8.1": + version: 3.8.1 + resolution: "http-cache-semantics@npm:3.8.1" + checksum: 10c0/8925daec009618d5a48c8a36fcb312785fe78c7b22db8008ed58ca84d08fdc41596b63e0507b577ad0bf46e868a74944ab03a037fdb3f31d5d49d3c79df8d9e4 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -2857,6 +8144,19 @@ __metadata: languageName: node linkType: hard +"http-errors@npm:~2.0.0, http-errors@npm:~2.0.1": + version: 2.0.1 + resolution: "http-errors@npm:2.0.1" + dependencies: + depd: "npm:~2.0.0" + inherits: "npm:~2.0.4" + setprototypeof: "npm:~1.2.0" + statuses: "npm:~2.0.2" + toidentifier: "npm:~1.0.1" + checksum: 10c0/fb38906cef4f5c83952d97661fe14dc156cb59fe54812a42cd448fa57b5c5dfcb38a40a916957737bd6b87aab257c0648d63eb5b6a9ca9f548e105b6072712d4 + languageName: node + linkType: hard + "http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" @@ -2867,6 +8167,17 @@ __metadata: languageName: node linkType: hard +"http-signature@npm:~1.2.0": + version: 1.2.0 + resolution: "http-signature@npm:1.2.0" + dependencies: + assert-plus: "npm:^1.0.0" + jsprim: "npm:^1.2.2" + sshpk: "npm:^1.7.0" + checksum: 10c0/582f7af7f354429e1fb19b3bbb9d35520843c69bb30a25b88ca3c5c2c10715f20ae7924e20cffbed220b1d3a726ef4fe8ccc48568d5744db87be9a79887d6733 + languageName: node + linkType: hard + "http2-wrapper@npm:^1.0.0-beta.5.2": version: 1.0.3 resolution: "http2-wrapper@npm:1.0.3" @@ -2897,7 +8208,16 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": +"ical@npm:^0.8.0": + version: 0.8.0 + resolution: "ical@npm:0.8.0" + dependencies: + rrule: "npm:2.4.1" + checksum: 10c0/1f27afea2f5aa17a581439590da98b44e0cb3ef7fa0793c15dba79997924dd87637400ddcea2e8684addb3506f7877efa7e5c37b89e20a4ff037d1d3603f6e71 + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24, iconv-lite@npm:~0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: @@ -2922,6 +8242,20 @@ __metadata: languageName: node linkType: hard +"ignore-by-default@npm:^2.1.0": + version: 2.1.0 + resolution: "ignore-by-default@npm:2.1.0" + checksum: 10c0/3a6040dac25ed9da39dee73bf1634fdd1e15b0eb7cf52a6bdec81c310565782d8811c104ce40acb3d690d61c5fc38a91c78e6baee830a8a2232424dbc6b66981 + languageName: node + linkType: hard + +"ignore@npm:^3.1.2": + version: 3.3.10 + resolution: "ignore@npm:3.3.10" + checksum: 10c0/973e0ef3b3eaab8fc19014d80014ed11bcf3585de8088d9c7a5b5c4edefc55f4ecdc498144bdd0440b8e2ff22deb03f89c90300bfef2d1750d5920f997d0a600 + languageName: node + linkType: hard + "ignore@npm:^4.0.6": version: 4.0.6 resolution: "ignore@npm:4.0.6" @@ -2936,6 +8270,13 @@ __metadata: languageName: node linkType: hard +"ignore@npm:^5.2.4": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + "import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" @@ -2946,6 +8287,13 @@ __metadata: languageName: node linkType: hard +"import-meta-resolve@npm:^4.1.0": + version: 4.2.0 + resolution: "import-meta-resolve@npm:4.2.0" + checksum: 10c0/3ee8aeecb61d19b49d2703987f977e9d1c7d4ba47db615a570eaa02fe414f40dfa63f7b953e842cbe8470d26df6371332bfcf21b2fd92b0112f9fea80dde2c4c + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -2977,14 +8325,14 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:^2.0.4": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.0, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard -"ini@npm:~1.3.0": +"ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a @@ -3006,6 +8354,27 @@ __metadata: languageName: node linkType: hard +"inquirer@npm:^0.12.0": + version: 0.12.0 + resolution: "inquirer@npm:0.12.0" + dependencies: + ansi-escapes: "npm:^1.1.0" + ansi-regex: "npm:^2.0.0" + chalk: "npm:^1.0.0" + cli-cursor: "npm:^1.0.1" + cli-width: "npm:^2.0.0" + figures: "npm:^1.3.5" + lodash: "npm:^4.3.0" + readline2: "npm:^1.0.1" + run-async: "npm:^0.1.0" + rx-lite: "npm:^3.1.2" + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.0" + through: "npm:^2.3.6" + checksum: 10c0/810b8ab7c90674dd6065af9c38d5390f3335550696a438ebf533766fae4439fbe0f68036282868401cb00eae01199efb7fd58ba71bc9c7c5ba83e8f5b4002458 + languageName: node + linkType: hard + "inquirer@npm:^8.1.2": version: 8.2.6 resolution: "inquirer@npm:8.2.6" @@ -3040,6 +8409,57 @@ __metadata: languageName: node linkType: hard +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 + languageName: node + linkType: hard + +"interpret@npm:^1.0.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 10c0/08c5ad30032edeec638485bc3f6db7d0094d9b3e85e0f950866600af3c52e9fd69715416d29564731c479d9f4d43ff3e4d302a178196bdc0e6837ec147640450 + languageName: node + linkType: hard + +"into-stream@npm:^3.1.0": + version: 3.1.0 + resolution: "into-stream@npm:3.1.0" + dependencies: + from2: "npm:^2.1.1" + p-is-promise: "npm:^1.1.0" + checksum: 10c0/2f298ecb3ff9a9a58ae0407ddf390d7f1d6dfcda9c91e696b10194cb81266c1231dae01c09bd7c435049190d03676b6bc6ab4c258c85b03a98c55da93a5e314f + languageName: node + linkType: hard + +"invariant@npm:^2.2.2": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc + languageName: node + linkType: hard + +"invert-kv@npm:^1.0.0": + version: 1.0.0 + resolution: "invert-kv@npm:1.0.0" + checksum: 10c0/9ccef12ada8494c56175cc0380b4cea18b6c0a368436f324a30e43a332db90bdfb83cd3a7987b71df359cdf931ce45b7daf35b677da56658565d61068e4bc20b + languageName: node + linkType: hard + +"invert-kv@npm:^2.0.0": + version: 2.0.0 + resolution: "invert-kv@npm:2.0.0" + checksum: 10c0/1a614b9025875e2009a23b8b56bfcbc7727e81ce949ccb6e0700caa6ce04ef92f0cbbcdb120528b6409317d08a7d5671044e520df48719437b5005ae6a1cbf74 + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -3057,6 +8477,32 @@ __metadata: languageName: node linkType: hard +"irregular-plurals@npm:^3.3.0": + version: 3.5.0 + resolution: "irregular-plurals@npm:3.5.0" + checksum: 10c0/7c033bbe7325e5a6e0a26949cc6863b6ce273403d4cd5b93bd99b33fecb6605b0884097c4259c23ed0c52c2133bf7d1cdcdd7a0630e8c325161fe269b3447918 + languageName: node + linkType: hard + +"is-absolute@npm:^1.0.0": + version: 1.0.0 + resolution: "is-absolute@npm:1.0.0" + dependencies: + is-relative: "npm:^1.0.0" + is-windows: "npm:^1.0.1" + checksum: 10c0/422302ce879d4f3ca6848499b6f3ddcc8fd2dc9f3e9cad3f6bcedff58cdfbbbd7f4c28600fffa7c59a858f1b15c27fb6cfe1d5275e58a36d2bf098a44ef5abc4 + languageName: node + linkType: hard + +"is-accessor-descriptor@npm:^1.0.1": + version: 1.0.1 + resolution: "is-accessor-descriptor@npm:1.0.1" + dependencies: + hasown: "npm:^2.0.0" + checksum: 10c0/d034034074c5ffeb6c868e091083182279db1a956f49f8d1494cecaa0f8b99d706556ded2a9b20d9aa290549106eef8204d67d8572902e06dcb1add6db6b524d + languageName: node + linkType: hard + "is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": version: 3.0.2 resolution: "is-array-buffer@npm:3.0.2" @@ -3068,6 +8514,17 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -3075,6 +8532,19 @@ __metadata: languageName: node linkType: hard +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" + dependencies: + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -3084,6 +8554,15 @@ __metadata: languageName: node linkType: hard +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" + dependencies: + has-bigints: "npm:^1.0.2" + checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4 + languageName: node + linkType: hard + "is-binary-path@npm:~2.1.0": version: 2.1.0 resolution: "is-binary-path@npm:2.1.0" @@ -3103,6 +8582,23 @@ __metadata: languageName: node linkType: hard +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e + languageName: node + linkType: hard + +"is-buffer@npm:^1.1.5, is-buffer@npm:~1.1.6": + version: 1.1.6 + resolution: "is-buffer@npm:1.1.6" + checksum: 10c0/ae18aa0b6e113d6c490ad1db5e8df9bdb57758382b313f5a22c9c61084875c6396d50bbf49315f5b1926d142d74dfb8d31b40d993a383e0a158b15fea7a82234 + languageName: node + linkType: hard + "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" @@ -3119,6 +8615,35 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.16.1": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd + languageName: node + linkType: hard + +"is-data-descriptor@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-descriptor@npm:1.0.1" + dependencies: + hasown: "npm:^2.0.0" + checksum: 10c0/ad3acc372e3227f87eb8cdba112c343ca2a67f1885aecf64f02f901cb0858a1fc9488ad42135ab102e9d9e71a62b3594740790bb103a9ba5da830a131a89e3e8 + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 + languageName: node + linkType: hard + "is-date-object@npm:^1.0.1": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" @@ -3128,6 +8653,36 @@ __metadata: languageName: node linkType: hard +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f + languageName: node + linkType: hard + +"is-descriptor@npm:^0.1.0": + version: 0.1.7 + resolution: "is-descriptor@npm:0.1.7" + dependencies: + is-accessor-descriptor: "npm:^1.0.1" + is-data-descriptor: "npm:^1.0.1" + checksum: 10c0/f5960b9783f508aec570465288cb673d4b3cc4aae4e6de970c3afd9a8fc1351edcb85d78b2cce2ec5251893a423f73263cab3bb94cf365a8d71b5d510a116392 + languageName: node + linkType: hard + +"is-descriptor@npm:^1.0.0, is-descriptor@npm:^1.0.2": + version: 1.0.3 + resolution: "is-descriptor@npm:1.0.3" + dependencies: + is-accessor-descriptor: "npm:^1.0.1" + is-data-descriptor: "npm:^1.0.1" + checksum: 10c0/b4ee667ea787d3a0be4e58536087fd0587de2b0b6672fbfe288f5b8d831ac4b79fd987f31d6c2d4e5543a42c97a87428bc5215ce292a1a47070147793878226f + languageName: node + linkType: hard + "is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": version: 2.2.1 resolution: "is-docker@npm:2.2.1" @@ -3137,10 +8692,65 @@ __metadata: languageName: node linkType: hard -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 +"is-error@npm:^2.2.2": + version: 2.2.2 + resolution: "is-error@npm:2.2.2" + checksum: 10c0/475d3463968bf16e94485555d7cb7a879ed68685e08d365a3370972e626054f1846ebbb3934403091e06682445568601fe919e41646096e5007952d0c1f4fd9b + languageName: node + linkType: hard + +"is-extendable@npm:^0.1.0, is-extendable@npm:^0.1.1": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 10c0/dd5ca3994a28e1740d1e25192e66eed128e0b2ff161a7ea348e87ae4f616554b486854de423877a2a2c171d5f7cd6e8093b91f54533bc88a59ee1c9838c43879 + languageName: node + linkType: hard + +"is-extendable@npm:^1.0.1": + version: 1.0.1 + resolution: "is-extendable@npm:1.0.1" + dependencies: + is-plain-object: "npm:^2.0.4" + checksum: 10c0/1d6678a5be1563db6ecb121331c819c38059703f0179f52aa80c242c223ee9c6b66470286636c0e63d7163e4d905c0a7d82a096e0b5eaeabb51b9f8d0af0d73f + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.0, is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 + languageName: node + linkType: hard + +"is-finite@npm:^1.0.0": + version: 1.1.0 + resolution: "is-finite@npm:1.1.0" + checksum: 10c0/ca6bc7a0321b339f098e657bd4cbf4bb2410f5a11f1b9adb1a1a9ab72288b64368e8251326cb1f74e985f2779299cec3e1f1e558b68ce7e1e2c9be17b7cfd626 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: "npm:^1.0.0" + checksum: 10c0/12acfcf16142f2d431bf6af25d68569d3198e81b9799b4ae41058247aafcc666b0127d64384ea28e67a746372611fcbe9b802f69175287aba466da3eddd5ba0f + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^2.0.0": + version: 2.0.0 + resolution: "is-fullwidth-code-point@npm:2.0.0" + checksum: 10c0/e58f3e4a601fc0500d8b2677e26e9fe0cd450980e66adb29d85b6addf7969731e38f8e43ed2ec868a09c101a55ac3d8b78902209269f38c5286bc98f5bc1b4d9 languageName: node linkType: hard @@ -3158,6 +8768,28 @@ __metadata: languageName: node linkType: hard +"is-generator-function@npm:^1.0.10": + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" + dependencies: + call-bound: "npm:^1.0.4" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/83da102e89c3e3b71d67b51d47c9f9bc862bceb58f87201727e27f7fa19d1d90b0ab223644ecaee6fc6e3d2d622bb25c966fbdaf87c59158b01ce7c0fe2fa372 + languageName: node + linkType: hard + +"is-glob@npm:^3.1.0": + version: 3.1.0 + resolution: "is-glob@npm:3.1.0" + dependencies: + is-extglob: "npm:^2.1.0" + checksum: 10c0/ba816a35dcf5285de924a8a4654df7b183a86381d73ea3bbf3df3cc61b3ba61fdddf90ee205709a2235b210ee600ee86e5e8600093cf291a662607fd032e2ff4 + languageName: node + linkType: hard + "is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -3188,6 +8820,33 @@ __metadata: languageName: node linkType: hard +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc + languageName: node + linkType: hard + +"is-my-ip-valid@npm:^1.0.0": + version: 1.0.1 + resolution: "is-my-ip-valid@npm:1.0.1" + checksum: 10c0/61bc2dac50aa664b9fc9edb7aa7a68363a554dea2432e09766b6b860fcda5fc60aad6d47d273be635511346c4c4964dc1f3f96f8c8db02f1e380ad9992d67cca + languageName: node + linkType: hard + +"is-my-json-valid@npm:^2.10.0": + version: 2.20.6 + resolution: "is-my-json-valid@npm:2.20.6" + dependencies: + generate-function: "npm:^2.0.0" + generate-object-property: "npm:^1.1.0" + is-my-ip-valid: "npm:^1.0.0" + jsonpointer: "npm:^5.0.0" + xtend: "npm:^4.0.0" + checksum: 10c0/1f74c24db02b3ee9dc7042f828b4fb204566350d72b01ca1efa8a61e8c41fab8ef664dfeb1158c11de29a3ca87ac2645b9829e50116205919a1da91b7039d041 + languageName: node + linkType: hard + "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" @@ -3195,6 +8854,13 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e + languageName: node + linkType: hard + "is-number-object@npm:^1.0.4": version: 1.0.7 resolution: "is-number-object@npm:1.0.7" @@ -3204,6 +8870,25 @@ __metadata: languageName: node linkType: hard +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 + languageName: node + linkType: hard + +"is-number@npm:^3.0.0": + version: 3.0.0 + resolution: "is-number@npm:3.0.0" + dependencies: + kind-of: "npm:^3.0.2" + checksum: 10c0/e639c54640b7f029623df24d3d103901e322c0c25ea5bde97cd723c2d0d4c05857a8364ab5c58d963089dbed6bf1d0ffe975cb6aef917e2ad0ccbca653d31b4f + languageName: node + linkType: hard + "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -3211,6 +8896,43 @@ __metadata: languageName: node linkType: hard +"is-object@npm:^1.0.1": + version: 1.0.2 + resolution: "is-object@npm:1.0.2" + checksum: 10c0/9cfb80c3a850f453d4a77297e0556bc2040ac6bea5b6e418aee208654938b36bab768169bef3945ccfac7a9bb460edd8034e7c6d8973bcf147d7571e1b53e764 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.0.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.3, is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: "npm:^3.0.1" + checksum: 10c0/f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + "is-port-reachable@npm:^3.0.0": version: 3.1.0 resolution: "is-port-reachable@npm:3.1.0" @@ -3218,6 +8940,20 @@ __metadata: languageName: node linkType: hard +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + +"is-property@npm:^1.0.0, is-property@npm:^1.0.2": + version: 1.0.2 + resolution: "is-property@npm:1.0.2" + checksum: 10c0/33ab65a136e4ba3f74d4f7d9d2a013f1bd207082e11cedb160698e8d5394644e873c39668d112a402175ccbc58a087cef87198ed46829dbddb479115a0257283 + languageName: node + linkType: hard + "is-reachable@npm:^5.0.0": version: 5.2.1 resolution: "is-reachable@npm:5.2.1" @@ -3244,6 +8980,48 @@ __metadata: languageName: node linkType: hard +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 + languageName: node + linkType: hard + +"is-relative@npm:^1.0.0": + version: 1.0.0 + resolution: "is-relative@npm:1.0.0" + dependencies: + is-unc-path: "npm:^1.0.0" + checksum: 10c0/61157c4be8594dd25ac6f0ef29b1218c36667259ea26698367a4d9f39ff9018368bc365c490b3c79be92dfb1e389e43c4b865c95709e7b3bc72c5932f751fb60 + languageName: node + linkType: hard + +"is-resolvable@npm:^1.0.0": + version: 1.1.0 + resolution: "is-resolvable@npm:1.1.0" + checksum: 10c0/17d5bf39d9268173adf834c23effb6b4e926d809b528a851d87e6fb944e9606ed2c94dfaf1b1b675f922c2990fbc402d754136d8557c90a931ac7fd2f1e4cf07 + languageName: node + linkType: hard + +"is-retry-allowed@npm:^1.1.0": + version: 1.2.0 + resolution: "is-retry-allowed@npm:1.2.0" + checksum: 10c0/a80f14e1e11c27a58f268f2927b883b635703e23a853cb7b8436e3456bf2ea3efd5082a4e920093eec7bd372c1ce6ea7cea78a9376929c211039d0cc4a393a44 + languageName: node + linkType: hard + +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 + languageName: node + linkType: hard + "is-shared-array-buffer@npm:^1.0.2": version: 1.0.2 resolution: "is-shared-array-buffer@npm:1.0.2" @@ -3253,6 +9031,22 @@ __metadata: languageName: node linkType: hard +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db + languageName: node + linkType: hard + +"is-stream@npm:^1.0.1, is-stream@npm:^1.1.0": + version: 1.1.0 + resolution: "is-stream@npm:1.1.0" + checksum: 10c0/b8ae7971e78d2e8488d15f804229c6eed7ed36a28f8807a1815938771f4adff0e705218b7dab968270433f67103e4fef98062a0beea55d64835f705ee72c7002 + languageName: node + linkType: hard + "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -3269,6 +9063,16 @@ __metadata: languageName: node linkType: hard +"is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d + languageName: node + linkType: hard + "is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": version: 1.0.4 resolution: "is-symbol@npm:1.0.4" @@ -3278,6 +9082,17 @@ __metadata: languageName: node linkType: hard +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e + languageName: node + linkType: hard + "is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": version: 1.1.12 resolution: "is-typed-array@npm:1.1.12" @@ -3287,6 +9102,31 @@ __metadata: languageName: node linkType: hard +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: "npm:^1.1.16" + checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 + languageName: node + linkType: hard + +"is-typedarray@npm:~1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 10c0/4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec + languageName: node + linkType: hard + +"is-unc-path@npm:^1.0.0": + version: 1.0.0 + resolution: "is-unc-path@npm:1.0.0" + dependencies: + unc-path-regex: "npm:^0.1.2" + checksum: 10c0/ac1b78f9b748196e3be3d0e722cd4b0f98639247a130a8f2473a58b29baf63fdb1b1c5a12c830660c5ee6ef0279c5418ca8e346f98cbe1a29e433d7ae531d42e + languageName: node + linkType: hard + "is-unicode-supported@npm:^0.1.0": version: 0.1.0 resolution: "is-unicode-supported@npm:0.1.0" @@ -3294,13 +9134,27 @@ __metadata: languageName: node linkType: hard -"is-unicode-supported@npm:^1.1.0": +"is-unicode-supported@npm:^1.1.0, is-unicode-supported@npm:^1.2.0": version: 1.3.0 resolution: "is-unicode-supported@npm:1.3.0" checksum: 10c0/b8674ea95d869f6faabddc6a484767207058b91aea0250803cbf1221345cb0c56f466d4ecea375dc77f6633d248d33c47bd296fb8f4cdba0b4edba8917e83d8a languageName: node linkType: hard +"is-utf8@npm:^0.2.0": + version: 0.2.1 + resolution: "is-utf8@npm:0.2.1" + checksum: 10c0/3ed45e5b4ddfa04ed7e32c63d29c61b980ecd6df74698f45978b8c17a54034943bcbffb6ae243202e799682a66f90fef526f465dd39438745e9fe70794c1ef09 + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 + languageName: node + linkType: hard + "is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" @@ -3310,7 +9164,33 @@ __metadata: languageName: node linkType: hard -"is-wsl@npm:^2.2.0": +"is-weakref@npm:^1.1.1": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 + languageName: node + linkType: hard + +"is-windows@npm:^1.0.1, is-windows@npm:^1.0.2": + version: 1.0.2 + resolution: "is-windows@npm:1.0.2" + checksum: 10c0/b32f418ab3385604a66f1b7a3ce39d25e8881dee0bd30816dc8344ef6ff9df473a732bcc1ec4e84fe99b2f229ae474f7133e8e93f9241686cfcf7eebe53ba7a5 + languageName: node + linkType: hard + +"is-wsl@npm:^2.1.1, is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" dependencies: @@ -3319,6 +9199,20 @@ __metadata: languageName: node linkType: hard +"isarray@npm:0.0.1": + version: 0.0.1 + resolution: "isarray@npm:0.0.1" + checksum: 10c0/ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311 + languageName: node + linkType: hard + +"isarray@npm:1.0.0, isarray@npm:^1.0.0, isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + "isarray@npm:^2.0.5": version: 2.0.5 resolution: "isarray@npm:2.0.5" @@ -3340,6 +9234,49 @@ __metadata: languageName: node linkType: hard +"isobject@npm:^2.0.0": + version: 2.1.0 + resolution: "isobject@npm:2.1.0" + dependencies: + isarray: "npm:1.0.0" + checksum: 10c0/c4cafec73b3b2ee11be75dff8dafd283b5728235ac099b07d7873d5182553a707768e208327bbc12931b9422d8822280bf88d894a0024ff5857b3efefb480e7b + languageName: node + linkType: hard + +"isobject@npm:^3.0.0, isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db + languageName: node + linkType: hard + +"isomorphic-fetch@npm:^2.1.1": + version: 2.2.1 + resolution: "isomorphic-fetch@npm:2.2.1" + dependencies: + node-fetch: "npm:^1.0.1" + whatwg-fetch: "npm:>=0.10.0" + checksum: 10c0/ea9fd37d31ec7b35b82180e1946d4a2f512506d0559fa567ec6ee6701ff1c6d924be90e75499c50982274b707e03ecd9eaa21d618872dd0deff530e4c3bdb074 + languageName: node + linkType: hard + +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: 10c0/a6686a878735ca0a48e0d674dd6d8ad31aedfaf70f07920da16ceadc7577b46d67179a60b313f2e6860cb097a2c2eb3cbd0b89e921ae89199a59a17c3273d66f + languageName: node + linkType: hard + +"isurl@npm:^1.0.0-alpha5": + version: 1.0.0 + resolution: "isurl@npm:1.0.0" + dependencies: + has-to-string-tag-x: "npm:^1.2.0" + is-object: "npm:^1.0.1" + checksum: 10c0/137e377cd72fefdbc950a226a08e7b35d53672c3b7173b03e72194c3e78a03109aa44c15390b26445b90b7708acb89ca89ed3cd7cc55a6afc7c37cbc88fc581a + languageName: node + linkType: hard + "jackspeak@npm:^3.1.2": version: 3.4.3 resolution: "jackspeak@npm:3.4.3" @@ -3353,13 +9290,48 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^4.0.0": +"jade@npm:0.26.3": + version: 0.26.3 + resolution: "jade@npm:0.26.3" + dependencies: + commander: "npm:0.6.1" + mkdirp: "npm:0.3.0" + bin: + jade: ./bin/jade + checksum: 10c0/5fac05818e7203de6e2ba1afa06f522070054166dba95621ec57be891011f6767cdbc30d56e4987b94da89ad84ff28fcf06c6d91b7779c21a3dd0800d67dd6bc + languageName: node + linkType: hard + +"jessie.js@npm:^0.3.4": + version: 0.3.4 + resolution: "jessie.js@npm:0.3.4" + dependencies: + "@endo/far": "npm:^1.0.0" + checksum: 10c0/853ab3f8a0e30df11742882f5e11479d1303033a5a203a247d8ffbf4c6f3f3d4bcbefa53084ae4632e6ab106e348f23dc988280486cbeaaf5d16487fa3d40e96 + languageName: node + linkType: hard + +"js-string-escape@npm:^1.0.1": + version: 1.0.1 + resolution: "js-string-escape@npm:1.0.1" + checksum: 10c0/2c33b9ff1ba6b84681c51ca0997e7d5a1639813c95d5b61cb7ad47e55cc28fa4a0b1935c3d218710d8e6bcee5d0cd8c44755231e3a4e45fc604534d9595a3628 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed languageName: node linkType: hard +"js-tokens@npm:^3.0.2": + version: 3.0.2 + resolution: "js-tokens@npm:3.0.2" + checksum: 10c0/e3c3ee4d12643d90197628eb022a2884a15f08ea7dcac1ce97fdeee43031fbfc7ede674f2cdbbb582dcd4c94388b22e52d56c6cbeb2ac7d1b57c2f33c405e2ba + languageName: node + linkType: hard + "js-yaml@npm:^3.13.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -3372,6 +9344,29 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^3.14.1, js-yaml@npm:^3.5.1": + version: 3.14.2 + resolution: "js-yaml@npm:3.14.2" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/3261f25912f5dd76605e5993d0a126c2b6c346311885d3c483706cd722efe34f697ea0331f654ce27c00a42b426e524518ec89d65ed02ea47df8ad26dcc8ce69 + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7 + languageName: node + linkType: hard + "jsbn@npm:1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -3379,6 +9374,13 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:~0.1.0": + version: 0.1.1 + resolution: "jsbn@npm:0.1.1" + checksum: 10c0/e046e05c59ff880ee4ef68902dbdcb6d2f3c5d60c357d4d68647dc23add556c31c0e5f41bdb7e69e793dd63468bd9e085da3636341048ef577b18f5b713877c0 + languageName: node + linkType: hard + "jsdoctypeparser@npm:^9.0.0": version: 9.0.0 resolution: "jsdoctypeparser@npm:9.0.0" @@ -3388,6 +9390,33 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^0.5.0": + version: 0.5.0 + resolution: "jsesc@npm:0.5.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/f93792440ae1d80f091b65f8ceddf8e55c4bb7f1a09dee5dcbdb0db5612c55c0f6045625aa6b7e8edb2e0a4feabd80ee48616dbe2d37055573a84db3d24f96d9 + languageName: node + linkType: hard + +"jsesc@npm:^1.3.0": + version: 1.3.0 + resolution: "jsesc@npm:1.3.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/62420889dd46b4cdba4df20fe6ffdefa6eeab7532fb4079170ea1b53c45d5a6abcb485144905833e5a69cc1735db12319b1e0b0f9a556811ec926b57a22318a7 + languageName: node + linkType: hard + +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 + languageName: node + linkType: hard + "json-bigint@npm:^1.0.0": version: 1.0.0 resolution: "json-bigint@npm:1.0.0" @@ -3397,6 +9426,13 @@ __metadata: languageName: node linkType: hard +"json-buffer@npm:3.0.0": + version: 3.0.0 + resolution: "json-buffer@npm:3.0.0" + checksum: 10c0/118c060d84430a8ad8376d0c60250830f350a6381bd56541a1ef257ce7ba82d109d1f71a4c4e92e0be0e7ab7da568fad8f7bf02905910a76e8e0aa338621b944 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -3404,6 +9440,13 @@ __metadata: languageName: node linkType: hard +"json-parse-better-errors@npm:^1.0.1": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: 10c0/2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb + languageName: node + linkType: hard + "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -3425,6 +9468,13 @@ __metadata: languageName: node linkType: hard +"json-schema@npm:0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: 10c0/d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 + languageName: node + linkType: hard + "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -3432,6 +9482,35 @@ __metadata: languageName: node linkType: hard +"json-stable-stringify@npm:^1.0.0, json-stable-stringify@npm:^1.0.1, json-stable-stringify@npm:^1.0.2": + version: 1.3.0 + resolution: "json-stable-stringify@npm:1.3.0" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + isarray: "npm:^2.0.5" + jsonify: "npm:^0.0.1" + object-keys: "npm:^1.1.1" + checksum: 10c0/8b3ff19e4c23c0ad591a49bc3a015d89a538db787d12fe9c4072e1d64d8cfa481f8c37719c629c3d84e848847617bf49f5fee894cf1d25959ab5b67e1c517f31 + languageName: node + linkType: hard + +"json-stringify-safe@npm:~5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 + languageName: node + linkType: hard + +"json5@npm:^0.5.1": + version: 0.5.1 + resolution: "json5@npm:0.5.1" + bin: + json5: lib/cli.js + checksum: 10c0/aca0ab7ccf1883d3fc2ecc16219bc389716a773f774552817deaadb549acc0bb502e317a81946fc0a48f9eb6e0822cf1dc5a097009203f2c94de84c8db02a1f3 + languageName: node + linkType: hard + "json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -3443,6 +9522,30 @@ __metadata: languageName: node linkType: hard +"jsonfile@npm:^2.1.0": + version: 2.4.0 + resolution: "jsonfile@npm:2.4.0" + dependencies: + graceful-fs: "npm:^4.1.6" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/02ad746d9490686519b3369bc9572694076eb982e1b4982c5ad9b91bc3c0ad30d10c866bb26b7a87f0c4025a80222cd2962cb57083b5a6a475a9031eab8c8962 + languageName: node + linkType: hard + +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.6" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/7dc94b628d57a66b71fb1b79510d460d662eb975b5f876d723f81549c2e9cd316d58a2ddf742b2b93a4fa6b17b2accaf1a738a0e2ea114bdfb13a32e5377e480 + languageName: node + linkType: hard + "jsonfile@npm:^6.0.1, jsonfile@npm:^6.1.0": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -3456,6 +9559,112 @@ __metadata: languageName: node linkType: hard +"jsonify@npm:^0.0.1": + version: 0.0.1 + resolution: "jsonify@npm:0.0.1" + checksum: 10c0/7f5499cdd59a0967ed35bda48b7cec43d850bbc8fb955cdd3a1717bb0efadbe300724d5646de765bb7a99fc1c3ab06eb80d93503c6faaf99b4ff50a3326692f6 + languageName: node + linkType: hard + +"jsonpointer@npm:^5.0.0": + version: 5.0.1 + resolution: "jsonpointer@npm:5.0.1" + checksum: 10c0/89929e58b400fcb96928c0504fcf4fc3f919d81e9543ceb055df125538470ee25290bb4984251e172e6ef8fcc55761eb998c118da763a82051ad89d4cb073fe7 + languageName: node + linkType: hard + +"jspm-github@npm:^0.13.19": + version: 0.13.26 + resolution: "jspm-github@npm:0.13.26" + dependencies: + expand-tilde: "npm:^1.2.0" + graceful-fs: "npm:^4.1.3" + mkdirp: "npm:^0.5.1" + netrc: "npm:^0.1.3" + request: "npm:^2.74.0" + rimraf: "npm:^2.5.4" + rsvp: "npm:^3.0.17" + semver: "npm:^5.0.1" + tar: "npm:^2.2.1" + which: "npm:^1.0.9" + yauzl: "npm:^2.3.1" + checksum: 10c0/dfde83ace315ebdc8047e6bfd141fcdf25d5b215f1c2b9796f1abbaeae4bfc2290b95f877047b27d36344a525d5a0d141020f99f564d38a531299bc3f6ab137d + languageName: node + linkType: hard + +"jspm-npm@npm:^0.26.12": + version: 0.26.15 + resolution: "jspm-npm@npm:0.26.15" + dependencies: + buffer-peek-stream: "npm:^1.0.1" + glob: "npm:^5.0.10" + graceful-fs: "npm:^4.1.3" + mkdirp: "npm:^0.5.1" + request: "npm:^2.58.0" + resolve: "npm:^1.1.6" + rsvp: "npm:^3.0.18" + semver: "npm:^5.0.1" + systemjs-builder: "npm:^0.15.0" + tar: "npm:^2.2.1" + which: "npm:^1.1.1" + checksum: 10c0/a18bb28830aee39af632ef786df1fe5755357365d33fd765175bb4edf05edb08bc4f91f1e173ccccb78f589c4f0f29e185c1e26ed2b03394f8dac03182444979 + languageName: node + linkType: hard + +"jspm-registry@npm:^0.4.0": + version: 0.4.4 + resolution: "jspm-registry@npm:0.4.4" + dependencies: + graceful-fs: "npm:^4.1.3" + rimraf: "npm:^2.3.2" + rsvp: "npm:^3.0.18" + semver: "npm:^4.3.3" + checksum: 10c0/705caadb8c59c6ec33a891c0ec8b56c9b4d16339283f62e7a60258f6ce19f79c9dd7bdc5de6c982a79550fb4aaeebefbeef7445f8b99bc60dc1ca63db23e169b + languageName: node + linkType: hard + +"jspm@npm:^0.16.25": + version: 0.16.55 + resolution: "jspm@npm:0.16.55" + dependencies: + chalk: "npm:^1.1.1" + core-js: "npm:^1.2.6" + glob: "npm:^6.0.1" + graceful-fs: "npm:^4.1.2" + jspm-github: "npm:^0.13.19" + jspm-npm: "npm:^0.26.12" + jspm-registry: "npm:^0.4.0" + liftoff: "npm:^2.2.0" + minimatch: "npm:^3.0.0" + mkdirp: "npm:~0.5.1" + ncp: "npm:^2.0.0" + proper-lockfile: "npm:^1.1.2" + request: "npm:^2.67.0" + rimraf: "npm:^2.4.4" + rsvp: "npm:^3.1.0" + semver: "npm:^5.1.0" + systemjs: "npm:0.19.46" + systemjs-builder: "npm:0.15.36" + traceur: "npm:0.0.105" + uglify-js: "npm:^2.6.1" + bin: + jspm: ./jspm.js + checksum: 10c0/4f118c483fd5375e60186b95e17592e3b825bb7acc6eec90a5f56404ac82f7405dec613d67899ab371999903139eac49236233a35d1b4cfe4347cf8484221342 + languageName: node + linkType: hard + +"jsprim@npm:^1.2.2": + version: 1.4.2 + resolution: "jsprim@npm:1.4.2" + dependencies: + assert-plus: "npm:1.0.0" + extsprintf: "npm:1.3.0" + json-schema: "npm:0.4.0" + verror: "npm:1.10.0" + checksum: 10c0/5e4bca99e90727c2040eb4c2190d0ef1fe51798ed5714e87b841d304526190d960f9772acc7108fa1416b61e1122bcd60e4460c91793dce0835df5852aab55af + languageName: node + linkType: hard + "jstoxml@npm:^3.2.7": version: 3.2.10 resolution: "jstoxml@npm:3.2.10" @@ -3484,6 +9693,22 @@ __metadata: languageName: node linkType: hard +"keypress@npm:0.1.x": + version: 0.1.0 + resolution: "keypress@npm:0.1.0" + checksum: 10c0/0d6c1921fc92a8b0c1f8dd4845f7b764579a9ac69aa489b9eba60c4fb83f2f7983749534b37f1052b5244a3956d027d8b170aea5c4f24c8dda67b74fa9049a11 + languageName: node + linkType: hard + +"keyv@npm:3.0.0": + version: 3.0.0 + resolution: "keyv@npm:3.0.0" + dependencies: + json-buffer: "npm:3.0.0" + checksum: 10c0/eb128eb136d4b6bca08ac3936fb5a6ba630f1b9575289e8140c60cdc20b4df04cba5cfaa982df57516364bf62801d2c497cad70edca1270e72a2403876a42805 + languageName: node + linkType: hard + "keyv@npm:^4.0.0": version: 4.5.3 resolution: "keyv@npm:4.5.3" @@ -3502,6 +9727,101 @@ __metadata: languageName: node linkType: hard +"kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": + version: 3.2.2 + resolution: "kind-of@npm:3.2.2" + dependencies: + is-buffer: "npm:^1.1.5" + checksum: 10c0/7e34bc29d4b02c997f92f080de34ebb92033a96736bbb0bb2410e033a7e5ae6571f1fa37b2d7710018f95361473b816c604234197f4f203f9cf149d8ef1574d9 + languageName: node + linkType: hard + +"kind-of@npm:^4.0.0": + version: 4.0.0 + resolution: "kind-of@npm:4.0.0" + dependencies: + is-buffer: "npm:^1.1.5" + checksum: 10c0/d6c44c75ee36898142dfc7106afbd50593216c37f96acb81a7ab33ca1a6938ce97d5692b8fc8fccd035f83811a9d97749d68771116441a48eedd0b68e2973165 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 + languageName: node + linkType: hard + +"klaw-sync@npm:^6.0.0": + version: 6.0.0 + resolution: "klaw-sync@npm:6.0.0" + dependencies: + graceful-fs: "npm:^4.1.11" + checksum: 10c0/00d8e4c48d0d699b743b3b028e807295ea0b225caf6179f51029e19783a93ad8bb9bccde617d169659fbe99559d73fb35f796214de031d0023c26b906cecd70a + languageName: node + linkType: hard + +"klaw@npm:^1.0.0": + version: 1.3.1 + resolution: "klaw@npm:1.3.1" + dependencies: + graceful-fs: "npm:^4.1.9" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/da994768b02b3843cc994c99bad3cf1c8c67716beb4dd2834133c919e9e9ee788669fbe27d88ab0ad9a3991349c28280afccbde01c2318229b662dd7a05e4728 + languageName: node + linkType: hard + +"kleur@npm:^4.1.5": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 10c0/e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a + languageName: node + linkType: hard + +"ky@npm:^1.8.2": + version: 1.14.2 + resolution: "ky@npm:1.14.2" + checksum: 10c0/ea5f08660ec8574ad6b116338059d1f2bac42ee917d56df268758405edfb3d17d5baa78913ee289eb6de976f648b1ff7798d5f8a7732c61e85e59d8f10f16795 + languageName: node + linkType: hard + +"lazy-cache@npm:^1.0.3": + version: 1.0.4 + resolution: "lazy-cache@npm:1.0.4" + checksum: 10c0/00f4868a27dc5c491ad86f46068d19bc97c0402d6c7c1449a977fade8ce667d4723beac8e12fdb1d6237156dd25ab0d3c963422bdfcbc76fd25941bfe3c6f015 + languageName: node + linkType: hard + +"lcid@npm:^1.0.0": + version: 1.0.0 + resolution: "lcid@npm:1.0.0" + dependencies: + invert-kv: "npm:^1.0.0" + checksum: 10c0/87fb32196c3c80458778f34f71c042e114f3134a3c86c0d60ee9c94f0750e467d7ca0c005a5224ffd9d49a6e449b5e5c31e1544f1827765a0ba8747298f5980e + languageName: node + linkType: hard + +"lcid@npm:^2.0.0": + version: 2.0.0 + resolution: "lcid@npm:2.0.0" + dependencies: + invert-kv: "npm:^2.0.0" + checksum: 10c0/53777f5946ee7cfa600ebdd8f18019c110f5ca1fd776e183a1f24e74cd200eb3718e535b2693caf762af1efed0714559192a095c4665e7808fd6d807b9797502 + languageName: node + linkType: hard + +"levn@npm:^0.3.0, levn@npm:~0.3.0": + version: 0.3.0 + resolution: "levn@npm:0.3.0" + dependencies: + prelude-ls: "npm:~1.1.2" + type-check: "npm:~0.3.2" + checksum: 10c0/e440df9de4233da0b389cd55bd61f0f6aaff766400bebbccd1231b81801f6dbc1d816c676ebe8d70566394b749fa624b1ed1c68070e9c94999f0bdecc64cb676 + languageName: node + linkType: hard + "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -3512,6 +9832,22 @@ __metadata: languageName: node linkType: hard +"liftoff@npm:^2.2.0": + version: 2.5.0 + resolution: "liftoff@npm:2.5.0" + dependencies: + extend: "npm:^3.0.0" + findup-sync: "npm:^2.0.0" + fined: "npm:^1.0.1" + flagged-respawn: "npm:^1.0.0" + is-plain-object: "npm:^2.0.4" + object.map: "npm:^1.0.0" + rechoir: "npm:^0.6.2" + resolve: "npm:^1.1.7" + checksum: 10c0/b183acabcd00adf5ff13d140f1cfc27357a76b905f5904c1223564ab21457473b97ef583ab22421d8e1e309b505488129c53ae63e3d36ffb495d746e27a6d340 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -3519,17 +9855,24 @@ __metadata: languageName: node linkType: hard +"listenercount@npm:~1.0.1": + version: 1.0.1 + resolution: "listenercount@npm:1.0.1" + checksum: 10c0/280c38501984f0a83272187ea472aff18a2aa3db40d8e05be5f797dc813c3d9351ae67a64e09d23d36e6061288b291c989390297db6a99674de2394c6930284c + languageName: node + linkType: hard + "lm-sync-d27081@workspace:packages/lm-sync": version: 0.0.0-use.local resolution: "lm-sync-d27081@workspace:packages/lm-sync" dependencies: - "@agoric/eslint-config": "npm:^0.3.3" - "@agoric/eslint-plugin": "npm:^0.2.3" + "@agoric/eslint-config": "npm:0.4.1-dev-dc67c18.0.dc67c18" + "@agoric/eslint-plugin": "npm:0.1.1-dev-dc67c18.0.dc67c18" "@endo/eslint-config": "npm:^0.5.1" "@types/better-sqlite3": "npm:^7.6.1" "@types/node": "npm:^14.14.7" "@typescript-eslint/parser": "npm:^4.21.0" - better-sqlite3: "npm:^11.6.0" + better-sqlite3: "npm:^12.6.2" body-parser: "npm:^1.20.1" eslint: "npm:^7.24.0" eslint-config-airbnb-base: "npm:^14.2.1" @@ -3543,6 +9886,48 @@ __metadata: languageName: unknown linkType: soft +"load-json-file@npm:^1.0.0": + version: 1.1.0 + resolution: "load-json-file@npm:1.1.0" + dependencies: + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^2.2.0" + pify: "npm:^2.0.0" + pinkie-promise: "npm:^2.0.0" + strip-bom: "npm:^2.0.0" + checksum: 10c0/2a5344c2d88643735a938fdca8582c0504e1c290577faa74f56b9cc187fa443832709a15f36e5771f779ec0878215a03abc8faf97ec57bb86092ceb7e0caef22 + languageName: node + linkType: hard + +"load-json-file@npm:^4.0.0": + version: 4.0.0 + resolution: "load-json-file@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^4.0.0" + pify: "npm:^3.0.0" + strip-bom: "npm:^3.0.0" + checksum: 10c0/6b48f6a0256bdfcc8970be2c57f68f10acb2ee7e63709b386b2febb6ad3c86198f840889cdbe71d28f741cbaa2f23a7771206b138cd1bdd159564511ca37c1d5 + languageName: node + linkType: hard + +"load-json-file@npm:^7.0.0": + version: 7.0.1 + resolution: "load-json-file@npm:7.0.1" + checksum: 10c0/7117459608a0b6329c7f78e6e1f541b3162dd901c29dd5af721fec8b270177d2e3d7999c971f344fff04daac368d052732e2c7146014bc84d15e0b636975e19a + languageName: node + linkType: hard + +"locate-path@npm:^3.0.0": + version: 3.0.0 + resolution: "locate-path@npm:3.0.0" + dependencies: + p-locate: "npm:^3.0.0" + path-exists: "npm:^3.0.0" + checksum: 10c0/3db394b7829a7fe2f4fbdd25d3c4689b85f003c318c5da4052c7e56eed697da8f1bce5294f685c69ff76e32cba7a33629d94396976f6d05fb7f4c755c5e2ae8b + languageName: node + linkType: hard + "locate-path@npm:^6.0.0": version: 6.0.0 resolution: "locate-path@npm:6.0.0" @@ -3561,6 +9946,20 @@ __metadata: languageName: node linkType: hard +"lodash.assign@npm:^4.1.0, lodash.assign@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.assign@npm:4.2.0" + checksum: 10c0/77e9a28edcb41655e5f5b4b07ec55a5f9bbd6f020f64474acd66c94ce256ed26451f59e5eb421fc4e5ea79d3939a2e2b3a6abeaa0da47bfd1ccd64dfb21f89a0 + languageName: node + linkType: hard + +"lodash.get@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.get@npm:4.4.2" + checksum: 10c0/48f40d471a1654397ed41685495acb31498d5ed696185ac8973daef424a749ca0c7871bf7b665d5c14f5cc479394479e0307e781f61d5573831769593411be6e + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -3568,6 +9967,13 @@ __metadata: languageName: node linkType: hard +"lodash.set@npm:^4.3.2": + version: 4.3.2 + resolution: "lodash.set@npm:4.3.2" + checksum: 10c0/c641d31905e51df43170dce8a1d11a1cff11356e2e2e75fe2615995408e9687d58c3e1d64c3c284c2df2bc519f79a98af737d2944d382ff82ffd244ff6075c29 + languageName: node + linkType: hard + "lodash.truncate@npm:^4.4.2": version: 4.4.2 resolution: "lodash.truncate@npm:4.4.2" @@ -3575,6 +9981,20 @@ __metadata: languageName: node linkType: hard +"lodash.uniq@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniq@npm:4.5.0" + checksum: 10c0/262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e + languageName: node + linkType: hard + +"lodash@npm:^4.0.0, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.4, lodash@npm:^4.17.5, lodash@npm:^4.3.0": + version: 4.17.23 + resolution: "lodash@npm:4.17.23" + checksum: 10c0/1264a90469f5bb95d4739c43eb6277d15b6d9e186df4ac68c3620443160fc669e2f14c11e7d8b2ccf078b81d06147c01a8ccced9aab9f9f63d50dcf8cace6bf6 + languageName: node + linkType: hard + "lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -3602,6 +10022,31 @@ __metadata: languageName: node linkType: hard +"long@npm:^3.0.1": + version: 3.2.0 + resolution: "long@npm:3.2.0" + checksum: 10c0/03884ad097403bda356228899c8397d7e4e2cd26489983034faa8e52ab9f18df4539de548571ad2f574ecf78454fc377bbcd2ba8ba76d567bf973345aefcbdb2 + languageName: node + linkType: hard + +"longest@npm:^1.0.1": + version: 1.0.1 + resolution: "longest@npm:1.0.1" + checksum: 10c0/e77bd510ea4083cc202a8985be1d422d4183e1078775bcf6c5d9aee3e401d9094b44348c720f9d349f230293865b09ee611453ac4694422ad43a9a9bdb092c82 + languageName: node + linkType: hard + +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + languageName: node + linkType: hard + "loud-rejection@npm:^2.2.0": version: 2.2.0 resolution: "loud-rejection@npm:2.2.0" @@ -3612,6 +10057,20 @@ __metadata: languageName: node linkType: hard +"lowercase-keys@npm:1.0.0": + version: 1.0.0 + resolution: "lowercase-keys@npm:1.0.0" + checksum: 10c0/cd5cb8d8f41bf0f8f8f396c467b1872a3d0283528e3aff385f9978f1eb94c8ada3081f67ab3b97bbe70697a44e22bb12ec09fb1b099188b112575595b655b02b + languageName: node + linkType: hard + +"lowercase-keys@npm:^1.0.0": + version: 1.0.1 + resolution: "lowercase-keys@npm:1.0.1" + checksum: 10c0/56776a8e1ef1aca98ecf6c19b30352ae1cf257b65b8ac858b7d8a0e8b348774d12a9b41aa7f59bfea51bff44bc7a198ab63ba4406bfba60dba008799618bef66 + languageName: node + linkType: hard + "lowercase-keys@npm:^2.0.0": version: 2.0.0 resolution: "lowercase-keys@npm:2.0.0" @@ -3619,6 +10078,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:2": + version: 2.7.3 + resolution: "lru-cache@npm:2.7.3" + checksum: 10c0/699702a9e374fd48cb507c55ecf655409337b3f6356a78e620e64e34c675bd988377fd4e3bb1db6e05a03b10e1758ba55877ca90a01c8d7ab2bea05cc49190d8 + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -3635,39 +10101,179 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^3.1.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" +"luxon@npm:^1.3.3": + version: 1.28.1 + resolution: "luxon@npm:1.28.1" + checksum: 10c0/5c561ce4364bb2301ca5811c74d11a9e087f82164109c7997dc8f0959e64d51259d8e630914dca2edc6702525ce5ab066a4b85caa19d04be71f10e79ffe2bc84 + languageName: node + linkType: hard + +"macos-release@npm:^2.2.0": + version: 2.5.1 + resolution: "macos-release@npm:2.5.1" + checksum: 10c0/fd03674e0b91e88a82cabecb75d75bc562863b186a22eac857f7d90c117486e44e02bede0926315637749aaaa934415bd1c2d0c0b53b78a86b729f3c165c5850 + languageName: node + linkType: hard + +"make-dir@npm:^3.1.0": + version: 3.1.0 + resolution: "make-dir@npm:3.1.0" + dependencies: + semver: "npm:^6.0.0" + checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + proc-log: "npm:^4.2.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e + languageName: node + linkType: hard + +"make-iterator@npm:^1.0.0": + version: 1.0.1 + resolution: "make-iterator@npm:1.0.1" + dependencies: + kind-of: "npm:^6.0.2" + checksum: 10c0/84b77d72e4af589a4e6069a9e0265ff55e63162b528aa085149060b7bf4e858c700892b95a073feaf517988cac75ca2e8d9ceb14243718b2f268dc4f4a90ff0a + languageName: node + linkType: hard + +"map-age-cleaner@npm:^0.1.1, map-age-cleaner@npm:^0.1.3": + version: 0.1.3 + resolution: "map-age-cleaner@npm:0.1.3" + dependencies: + p-defer: "npm:^1.0.0" + checksum: 10c0/7495236c7b0950956c144fd8b4bc6399d4e78072a8840a4232fe1c4faccbb5eb5d842e5c0a56a60afc36d723f315c1c672325ca03c1b328650f7fcc478f385fd + languageName: node + linkType: hard + +"map-cache@npm:^0.2.0, map-cache@npm:^0.2.2": + version: 0.2.2 + resolution: "map-cache@npm:0.2.2" + checksum: 10c0/05e3eb005c1b80b9f949ca007687640e8c5d0fc88dc45c3c3ab4902a3bec79d66a58f3e3b04d6985d90cd267c629c7b46c977e9c34433e8c11ecfcbb9f0fa290 + languageName: node + linkType: hard + +"map-stream@npm:0.0.7": + version: 0.0.7 + resolution: "map-stream@npm:0.0.7" + checksum: 10c0/77da244656dad5013bd147b0eef6f0343a212f14761332b97364fe348d4d70f0b8a0903457d6fc88772ec7c3d4d048b24f8db3aa5c0f77a8ce8bf2391473b8ec + languageName: node + linkType: hard + +"map-stream@npm:~0.1.0": + version: 0.1.0 + resolution: "map-stream@npm:0.1.0" + checksum: 10c0/7dd6debe511c1b55d9da75e1efa65a28b1252a2d8357938d2e49b412713c478efbaefb0cdf0ee0533540c3bf733e8f9f71e1a15aa0fe74bf71b64e75bf1576bd + languageName: node + linkType: hard + +"map-visit@npm:^1.0.0": + version: 1.0.0 + resolution: "map-visit@npm:1.0.0" + dependencies: + object-visit: "npm:^1.0.0" + checksum: 10c0/fb3475e5311939a6147e339999113db607adc11c7c3cd3103e5e9dbf502898416ecba6b1c7c649c6d4d12941de00cee58b939756bdf20a9efe7d4fa5a5738b73 + languageName: node + linkType: hard + +"matcher@npm:^5.0.0": + version: 5.0.0 + resolution: "matcher@npm:5.0.0" + dependencies: + escape-string-regexp: "npm:^5.0.0" + checksum: 10c0/eda5471fc9d5b7264d63c81727824adc3585ddb5cfdc5fce5a9b7c86f946ff181610735d330b1c37a84811df872d1290bf4e9401d2be2a414204343701144b18 + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + +"md5-hex@npm:^3.0.1": + version: 3.0.1 + resolution: "md5-hex@npm:3.0.1" + dependencies: + blueimp-md5: "npm:^2.10.0" + checksum: 10c0/ee2b4d8da16b527b3a3fe4d7a96720f43afd07b46a82d49421208b5a126235fb75cfb30b80d4029514772c8844273f940bddfbf4155c787f968f3be4060d01e4 + languageName: node + linkType: hard + +"md5@npm:^2.2.1": + version: 2.3.0 + resolution: "md5@npm:2.3.0" + dependencies: + charenc: "npm:0.0.2" + crypt: "npm:0.0.2" + is-buffer: "npm:~1.1.6" + checksum: 10c0/14a21d597d92e5b738255fbe7fe379905b8cb97e0a49d44a20b58526a646ec5518c337b817ce0094ca94d3e81a3313879c4c7b510d250c282d53afbbdede9110 + languageName: node + linkType: hard + +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 + languageName: node + linkType: hard + +"mem@npm:^4.0.0": + version: 4.3.0 + resolution: "mem@npm:4.3.0" dependencies: - semver: "npm:^6.0.0" - checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa + map-age-cleaner: "npm:^0.1.1" + mimic-fn: "npm:^2.0.0" + p-is-promise: "npm:^2.0.0" + checksum: 10c0/fc74e16d877322aafe869fe92a5c3109b1683195f4ef507920322a2fc8cd9998f3299f716c9853e10304c06a528fd9b763de24bdd7ce0b448155f05c9fad8612 languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" +"mem@npm:^9.0.2": + version: 9.0.2 + resolution: "mem@npm:9.0.2" dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e + map-age-cleaner: "npm:^0.1.3" + mimic-fn: "npm:^4.0.0" + checksum: 10c0/c2c56141399e520d8f0e50186bb7e4b49300b33984dc919682f3f13e53dec0e6608fbd327d5ae99494f45061a3a05a8ee04ccba6dcf795c3c215b5aa906eb41f languageName: node linkType: hard -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 +"memorystream@npm:^0.3.1": + version: 0.3.1 + resolution: "memorystream@npm:0.3.1" + checksum: 10c0/4bd164657711d9747ff5edb0508b2944414da3464b7fe21ac5c67cf35bba975c4b446a0124bd0f9a8be54cfc18faf92e92bd77563a20328b1ccf2ff04e9f39b9 + languageName: node + linkType: hard + +"merge-descriptors@npm:0.0.1": + version: 0.0.1 + resolution: "merge-descriptors@npm:0.0.1" + checksum: 10c0/50d3d0bb19b3306bd58ef46e777b6da61cc64cb6f1f5becdec417afdad0ad2986b97b8518d76712a1acd5cde838927a852adb10ad1db48e452eab609c677abbd languageName: node linkType: hard @@ -3685,6 +10291,13 @@ __metadata: languageName: node linkType: hard +"methods@npm:0.1.0": + version: 0.1.0 + resolution: "methods@npm:0.1.0" + checksum: 10c0/fee60c618e4571bc905da58c52f433db3379393d4f27ff6eac685222da3a5f50ef7a8edf4a9d1f34432bd75131ca8963018fc9c9e4224a88083741c47cd18eb9 + languageName: node + linkType: hard + "methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" @@ -3692,6 +10305,37 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^3.0.4": + version: 3.1.10 + resolution: "micromatch@npm:3.1.10" + dependencies: + arr-diff: "npm:^4.0.0" + array-unique: "npm:^0.3.2" + braces: "npm:^2.3.1" + define-property: "npm:^2.0.2" + extend-shallow: "npm:^3.0.2" + extglob: "npm:^2.0.4" + fragment-cache: "npm:^0.2.1" + kind-of: "npm:^6.0.2" + nanomatch: "npm:^1.2.9" + object.pick: "npm:^1.3.0" + regex-not: "npm:^1.0.0" + snapdragon: "npm:^0.8.1" + to-regex: "npm:^3.0.2" + checksum: 10c0/531a32e7ac92bef60657820202be71b63d0f945c08a69cc4c239c0b19372b751483d464a850a2e3a5ff6cc9060641e43d44c303af104c1a27493d137d8af017f + languageName: node + linkType: hard + +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + "micromatch@npm:^4.0.4": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -3709,7 +10353,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -3727,13 +10371,27 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^2.1.0": +"mime@npm:~1.2.9": + version: 1.2.11 + resolution: "mime@npm:1.2.11" + checksum: 10c0/aa5eb2aa3bac86e6e4d3d6f44f57ca42f697fcf09168ed54b2c94e09d264319ceb309ce29522410e4134026381a2831e0b935c29436dd14e5b295d07ff08ecba + languageName: node + linkType: hard + +"mimic-fn@npm:^2.0.0, mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 languageName: node linkType: hard +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 10c0/de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf + languageName: node + linkType: hard + "mimic-response@npm:^1.0.0": version: 1.0.1 resolution: "mimic-response@npm:1.0.1" @@ -3748,7 +10406,24 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"miniflare@npm:4.20260120.0": + version: 4.20260120.0 + resolution: "miniflare@npm:4.20260120.0" + dependencies: + "@cspotcode/source-map-support": "npm:0.8.1" + sharp: "npm:^0.34.5" + undici: "npm:7.18.2" + workerd: "npm:1.20260120.0" + ws: "npm:8.18.0" + youch: "npm:4.1.0-beta.10" + zod: "npm:^3.25.76" + bin: + miniflare: bootstrap.js + checksum: 10c0/28a4ff03f3d3c7c234851fd7a57ac80822d820d5eb1311c1fc0ecb9bbc3dd78065c115715a162cb3ce694a46495bd753ac772383fa52b4774678a891d309c7e4 + languageName: node + linkType: hard + +"minimatch@npm:2 || 3, minimatch@npm:^3.0.0, minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -3757,7 +10432,16 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.4": +"minimatch@npm:3.0.3": + version: 3.0.3 + resolution: "minimatch@npm:3.0.3" + dependencies: + brace-expansion: "npm:^1.0.0" + checksum: 10c0/827dcf6d4eb80c5d8a7bdcc5f88ef1c2c35e5d858122effb6bd83965e261417b9a559d3d33332b99ca98ddb7488d435e13046a1f8d6635245b906c59ee0f1185 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -3766,13 +10450,37 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6": +"minimatch@npm:~0.2.11": + version: 0.2.14 + resolution: "minimatch@npm:0.2.14" + dependencies: + lru-cache: "npm:2" + sigmund: "npm:~1.0.0" + checksum: 10c0/35b27aa9421ea09729820e09db54d01daa9600f0ac48b9195dacaa6894cc797f5f44048edee8be50dc86bf50452c546f88056267fd03784d6f660d66bd05945f + languageName: node + linkType: hard + +"minimist@npm:0.0.8": + version: 0.0.8 + resolution: "minimist@npm:0.0.8" + checksum: 10c0/d0a998c3042922dbcd5f23566b52811d6977649ad089fd75dd89e8a9bff27634194900818b2dfb1b873f204edb902d0c8cdea9cb8dca8488b301f69bd522d5dc + languageName: node + linkType: hard + +"minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 languageName: node linkType: hard +"minimist@npm:~0.0.1": + version: 0.0.10 + resolution: "minimist@npm:0.0.10" + checksum: 10c0/c505a020144b6e49f2b1c7d1e378f3692b7102e989b4a49338fc171eb4229ddddb430e779ff803dcb11854050e3fe3c2298962a7d73c20df7c2044c92b2ba1da + languageName: node + linkType: hard + "minipass-collect@npm:^2.0.1": version: 2.0.1 resolution: "minipass-collect@npm:2.0.1" @@ -3857,6 +10565,27 @@ __metadata: languageName: node linkType: hard +"minstache@npm:^1.2.0": + version: 1.2.0 + resolution: "minstache@npm:1.2.0" + dependencies: + commander: "npm:1.0.4" + bin: + minstache: bin/minstache + checksum: 10c0/4dc2f9bed6be947fa14b36e5c020e490a7c83dc7d917e53e1304996db7c589ac4e015e09f5f7fe32366d4bb98fd6c806295231da8032b61a623c3a7fb64151ab + languageName: node + linkType: hard + +"mixin-deep@npm:^1.2.0": + version: 1.3.2 + resolution: "mixin-deep@npm:1.3.2" + dependencies: + for-in: "npm:^1.0.2" + is-extendable: "npm:^1.0.1" + checksum: 10c0/cb39ffb73c377222391af788b4c83d1a6cecb2d9fceb7015384f8deb46e151a9b030c21ef59a79cb524d4557e3f74c7248ab948a62a6e7e296b42644863d183b + languageName: node + linkType: hard + "mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": version: 0.5.3 resolution: "mkdirp-classic@npm:0.5.3" @@ -3864,6 +10593,42 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:0.3.0": + version: 0.3.0 + resolution: "mkdirp@npm:0.3.0" + checksum: 10c0/cd9e54878490571df79770de1cdceba48ab6682c004616666d23a38315feaf5822d443aeb500ac298a12d7f6f5e11dc05cea3207d500e547d938218bf22d8629 + languageName: node + linkType: hard + +"mkdirp@npm:0.3.5": + version: 0.3.5 + resolution: "mkdirp@npm:0.3.5" + checksum: 10c0/73b9ea9e94ef3cb465d9846289131ed202a2a6402b62dc9a9425609514e5a1819ac1990406c58c55fc8fa73890d7bfdf4e3540f3b6aa2b9d32702374be7f4387 + languageName: node + linkType: hard + +"mkdirp@npm:0.5.1": + version: 0.5.1 + resolution: "mkdirp@npm:0.5.1" + dependencies: + minimist: "npm:0.0.8" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/e5ff572d761240a06dbfc69e1ea303d5482815a1f66033b999bd9d78583fcdc9ef63e99e61d396bbd57eca45b388af80a7f7f35f63510619c991c9d44c75341c + languageName: node + linkType: hard + +"mkdirp@npm:>=0.5 0, mkdirp@npm:^0.5.0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.4, mkdirp@npm:~0.5.1": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: "npm:^1.2.6" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -3873,6 +10638,24 @@ __metadata: languageName: node linkType: hard +"mocha@npm:~1.19.0": + version: 1.19.0 + resolution: "mocha@npm:1.19.0" + dependencies: + commander: "npm:2.0.0" + debug: "npm:*" + diff: "npm:1.0.7" + glob: "npm:3.2.3" + growl: "npm:1.7.x" + jade: "npm:0.26.3" + mkdirp: "npm:0.3.5" + bin: + _mocha: ./bin/_mocha + mocha: ./bin/mocha + checksum: 10c0/f1c5469b505356c67072b9bcabb01d384e3f7dd2da111592859963b3fbed184c9883328b97ff9b6f9e0f734412f22a73a83df5ec1bb3f02978ccedfde031d782 + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -3907,6 +10690,23 @@ __metadata: languageName: node linkType: hard +"multiparty@npm:2.2.0": + version: 2.2.0 + resolution: "multiparty@npm:2.2.0" + dependencies: + readable-stream: "npm:~1.1.9" + stream-counter: "npm:~0.2.0" + checksum: 10c0/5a0b7c403728285452378537ffc7f41017af104ee7f4dddf8953bfc91d0f08fc7787a463a6af297a248a8f52f491c09f364e7bcada78ebb21efccdcb1700bd7f + languageName: node + linkType: hard + +"mute-stream@npm:0.0.5": + version: 0.0.5 + resolution: "mute-stream@npm:0.0.5" + checksum: 10c0/562d334db46e4334f473e9e9c4993df7227fa1ba0c3f7eb453e1db666b0f0e3be45315b4d01bfa722784752e51acf72e37bb982d0bd2768fe6a431eb4dbb17ab + languageName: node + linkType: hard + "mute-stream@npm:0.0.8": version: 0.0.8 resolution: "mute-stream@npm:0.0.8" @@ -3914,6 +10714,67 @@ __metadata: languageName: node linkType: hard +"mysql-events@npm:0.0.7": + version: 0.0.7 + resolution: "mysql-events@npm:0.0.7" + dependencies: + underscore: "npm:1.8.3" + zongji: "npm:0.3.2" + checksum: 10c0/a6c05e40913f64294bfbc1b7c01fb8c6b37c139d42a352eaa995db5be27e84763887b74259a3c58ac476fdeb337c477364a5737efb6f8efdecc543a1b86da4d3 + languageName: node + linkType: hard + +"mysql@npm:^2.10.0, mysql@npm:^2.18.1": + version: 2.18.1 + resolution: "mysql@npm:2.18.1" + dependencies: + bignumber.js: "npm:9.0.0" + readable-stream: "npm:2.3.7" + safe-buffer: "npm:5.1.2" + sqlstring: "npm:2.3.1" + checksum: 10c0/146aee0fde379e222b0a66194f61e5761123123f48729785c862e18b46531fe29bf96174ee991216f8fb49bbd278defec79bd5e6265c30af7a65a60a5e53321d + languageName: node + linkType: hard + +"mysql@npm:~2.5.5": + version: 2.5.5 + resolution: "mysql@npm:2.5.5" + dependencies: + bignumber.js: "npm:2.0.0" + readable-stream: "npm:~1.1.13" + require-all: "npm:~1.0.0" + checksum: 10c0/bb09e5418436344770603d534a11f22ad2939478bdac80b8024faa5b5eaa31196bc0cfd028b67eb02d1bc0e00281c66a36136b072ce7505f6d8e550402baedcc + languageName: node + linkType: hard + +"nan@npm:^2.12.1": + version: 2.24.0 + resolution: "nan@npm:2.24.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/6f9828a15464999ccefcae61b0f94f1f37067048a56363966e892cc6a194e3500966ae6964dd5a6a8acc5e1a849d60d620b120a84bc66c60445379a930c5b0f8 + languageName: node + linkType: hard + +"nanomatch@npm:^1.2.9": + version: 1.2.13 + resolution: "nanomatch@npm:1.2.13" + dependencies: + arr-diff: "npm:^4.0.0" + array-unique: "npm:^0.3.2" + define-property: "npm:^2.0.2" + extend-shallow: "npm:^3.0.2" + fragment-cache: "npm:^0.2.1" + is-windows: "npm:^1.0.2" + kind-of: "npm:^6.0.2" + object.pick: "npm:^1.3.0" + regex-not: "npm:^1.0.0" + snapdragon: "npm:^0.8.1" + to-regex: "npm:^3.0.1" + checksum: 10c0/0f5cefa755ca2e20c86332821995effb24acb79551ddaf51c1b9112628cad234a0d8fd9ac6aa56ad1f8bfad6ff6ae86e851acb960943249d9fa44b091479953a + languageName: node + linkType: hard + "napi-build-utils@npm:^1.0.1": version: 1.0.2 resolution: "napi-build-utils@npm:1.0.2" @@ -3928,6 +10789,22 @@ __metadata: languageName: node linkType: hard +"ncp@npm:^2.0.0": + version: 2.0.0 + resolution: "ncp@npm:2.0.0" + bin: + ncp: ./bin/ncp + checksum: 10c0/d515babf9d3205ab9252e7d640af7c3e1a880317016d41f2fce2e6b9c8f60eb8bb6afde30e8c4f8e1e3fa551465f094433c3f364b25a85d6a28ec52c1ad6e067 + languageName: node + linkType: hard + +"negotiator@npm:0.3.0": + version: 0.3.0 + resolution: "negotiator@npm:0.3.0" + checksum: 10c0/b7fa62c76f1dc8ba1cb106fab8d006dac6b3204b60121fc6717b83a6616b65f06ce6da1283e2fabc587eb3b91b1e879d991c37195ab6c334e320bd33481e5d71 + languageName: node + linkType: hard + "negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -3942,6 +10819,48 @@ __metadata: languageName: node linkType: hard +"netrc@npm:^0.1.3": + version: 0.1.4 + resolution: "netrc@npm:0.1.4" + checksum: 10c0/899319db24c69c127771eaf24b74c3d68011c2736009ce6d75d4b1028e7ea3ac278e6af992602b937f364298fbefb7c74aaa749fa837e67b77a085430e19207c + languageName: node + linkType: hard + +"next-tick@npm:^1.1.0": + version: 1.1.0 + resolution: "next-tick@npm:1.1.0" + checksum: 10c0/3ba80dd805fcb336b4f52e010992f3e6175869c8d88bf4ff0a81d5d66e6049f89993463b28211613e58a6b7fe93ff5ccbba0da18d4fa574b96289e8f0b577f28 + languageName: node + linkType: hard + +"nice-try@npm:^1.0.4": + version: 1.0.5 + resolution: "nice-try@npm:1.0.5" + checksum: 10c0/95568c1b73e1d0d4069a3e3061a2102d854513d37bcfda73300015b7ba4868d3b27c198d1dbbd8ebdef4112fc2ed9e895d4a0f2e1cce0bd334f2a1346dc9205f + languageName: node + linkType: hard + +"nightmare@npm:^2.10.0": + version: 2.10.0 + resolution: "nightmare@npm:2.10.0" + dependencies: + debug: "npm:^2.2.0" + deep-defaults: "npm:^1.0.3" + defaults: "npm:^1.0.2" + electron: "npm:^1.4.4" + enqueue: "npm:^1.0.2" + function-source: "npm:^0.1.0" + jsesc: "npm:^0.5.0" + minstache: "npm:^1.2.0" + mkdirp: "npm:^0.5.1" + once: "npm:^1.3.3" + rimraf: "npm:^2.4.3" + sliced: "npm:1.0.1" + split2: "npm:^2.0.1" + checksum: 10c0/5c28a86a9855365c86bfe3826cb753c356b3db24fb74c2b31b57436eeb02ed6fea4d1ff5edebf248d3c1bc690642c184e37d7723b3c26c5ecfb816628e7d6b3d + languageName: node + linkType: hard + "node-abi@npm:^3.3.0": version: 3.71.0 resolution: "node-abi@npm:3.71.0" @@ -3951,6 +10870,34 @@ __metadata: languageName: node linkType: hard +"node-domexception@npm:^1.0.0": + version: 1.0.0 + resolution: "node-domexception@npm:1.0.0" + checksum: 10c0/5e5d63cda29856402df9472335af4bb13875e1927ad3be861dc5ebde38917aecbf9ae337923777af52a48c426b70148815e890a5d72760f1b4d758cc671b1a2b + languageName: node + linkType: hard + +"node-fetch@npm:3.3.2": + version: 3.3.2 + resolution: "node-fetch@npm:3.3.2" + dependencies: + data-uri-to-buffer: "npm:^4.0.0" + fetch-blob: "npm:^3.1.4" + formdata-polyfill: "npm:^4.0.10" + checksum: 10c0/f3d5e56190562221398c9f5750198b34cf6113aa304e34ee97c94fd300ec578b25b2c2906edba922050fce983338fde0d5d34fcb0fc3336ade5bd0e429ad7538 + languageName: node + linkType: hard + +"node-fetch@npm:^1.0.1": + version: 1.7.3 + resolution: "node-fetch@npm:1.7.3" + dependencies: + encoding: "npm:^0.1.11" + is-stream: "npm:^1.0.1" + checksum: 10c0/5a6b56b3edf909ccd20414355867d24f15f1885da3b26be90840241c46e63754ebf4697050f897daab676e3952d969611ffe1d4bc4506cf50f70837e20ad5328 + languageName: node + linkType: hard + "node-fetch@npm:^2.6.7": version: 2.6.12 resolution: "node-fetch@npm:2.6.12" @@ -3965,6 +10912,20 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^2.6.9": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 + languageName: node + linkType: hard + "node-forge@npm:^1.3.1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -3992,6 +10953,13 @@ __metadata: languageName: node linkType: hard +"nofilter@npm:^3.1.0": + version: 3.1.0 + resolution: "nofilter@npm:3.1.0" + checksum: 10c0/92459f3864a067b347032263f0b536223cbfc98153913b5dce350cb39c8470bc1813366e41993f22c33cc6400c0f392aa324a4b51e24c22040635c1cdb046499 + languageName: node + linkType: hard + "nopt@npm:^7.0.0": version: 7.2.1 resolution: "nopt@npm:7.2.1" @@ -4012,6 +10980,18 @@ __metadata: languageName: node linkType: hard +"normalize-package-data@npm:^2.3.2": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 + languageName: node + linkType: hard + "normalize-package-data@npm:^3.0.2": version: 3.0.3 resolution: "normalize-package-data@npm:3.0.3" @@ -4031,6 +11011,17 @@ __metadata: languageName: node linkType: hard +"normalize-url@npm:2.0.1": + version: 2.0.1 + resolution: "normalize-url@npm:2.0.1" + dependencies: + prepend-http: "npm:^2.0.0" + query-string: "npm:^5.0.1" + sort-keys: "npm:^2.0.0" + checksum: 10c0/a1fe89ca96cfb48000d031432ced9b6aaba5be18e49ce784426096ac51fcc775744b51df6a6eb79a0af3f86681ab26834afcae58eff28c84833db64824bdd494 + languageName: node + linkType: hard + "normalize-url@npm:^6.0.1": version: 6.1.0 resolution: "normalize-url@npm:6.1.0" @@ -4038,6 +11029,92 @@ __metadata: languageName: node linkType: hard +"npm-run-all@npm:^4.1.5": + version: 4.1.5 + resolution: "npm-run-all@npm:4.1.5" + dependencies: + ansi-styles: "npm:^3.2.1" + chalk: "npm:^2.4.1" + cross-spawn: "npm:^6.0.5" + memorystream: "npm:^0.3.1" + minimatch: "npm:^3.0.4" + pidtree: "npm:^0.3.0" + read-pkg: "npm:^3.0.0" + shell-quote: "npm:^1.6.1" + string.prototype.padend: "npm:^3.0.0" + bin: + npm-run-all: bin/npm-run-all/index.js + run-p: bin/run-p/index.js + run-s: bin/run-s/index.js + checksum: 10c0/736ee39bd35454d3efaa4a2e53eba6c523e2e17fba21a18edcce6b221f5cab62000bef16bb6ae8aff9e615831e6b0eb25ab51d52d60e6fa6f4ea880e4c6d31f4 + languageName: node + linkType: hard + +"npm-run-path@npm:^2.0.0": + version: 2.0.2 + resolution: "npm-run-path@npm:2.0.2" + dependencies: + path-key: "npm:^2.0.0" + checksum: 10c0/95549a477886f48346568c97b08c4fda9cdbf7ce8a4fbc2213f36896d0d19249e32d68d7451bdcbca8041b5fba04a6b2c4a618beaf19849505c05b700740f1de + languageName: node + linkType: hard + +"nugget@npm:^2.0.0": + version: 2.2.0 + resolution: "nugget@npm:2.2.0" + dependencies: + debug: "npm:^2.1.3" + minimist: "npm:^1.1.0" + pretty-bytes: "npm:^4.0.2" + progress-stream: "npm:^1.1.0" + request: "npm:^2.45.0" + single-line-log: "npm:^1.1.2" + throttleit: "npm:0.0.2" + bin: + nugget: bin.js + checksum: 10c0/5e7d912b6fc7317a9f12698dd1fb15ee6378f8886f413ae3adee3260cc6d4e9aadc5afe533de0dc5fa1a32bc6a8aba810285bfb4e96fcc26fdd1fbff750ed4c1 + languageName: node + linkType: hard + +"number-is-nan@npm:^1.0.0": + version: 1.0.1 + resolution: "number-is-nan@npm:1.0.1" + checksum: 10c0/cb97149006acc5cd512c13c1838223abdf202e76ddfa059c5e8e7507aff2c3a78cd19057516885a2f6f5b576543dc4f7b6f3c997cc7df53ae26c260855466df5 + languageName: node + linkType: hard + +"oauth-sign@npm:~0.9.0": + version: 0.9.0 + resolution: "oauth-sign@npm:0.9.0" + checksum: 10c0/fc92a516f6ddbb2699089a2748b04f55c47b6ead55a77cd3a2cbbce5f7af86164cb9425f9ae19acfd066f1ad7d3a96a67b8928c6ea946426f6d6c29e448497c2 + languageName: node + linkType: hard + +"object-assign-shim@npm:^1.0.0": + version: 1.0.0 + resolution: "object-assign-shim@npm:1.0.0" + checksum: 10c0/7d86e143b80566ee993cfb23afdf97489775df341f75b301208ae5fe4c9c3c66ee703f3c20cc12089e2560fb587fbed1fe4303c4c3dfb3646689af1773b647ef + languageName: node + linkType: hard + +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + +"object-copy@npm:^0.1.0": + version: 0.1.0 + resolution: "object-copy@npm:0.1.0" + dependencies: + copy-descriptor: "npm:^0.1.0" + define-property: "npm:^0.2.5" + kind-of: "npm:^3.0.3" + checksum: 10c0/79314b05e9d626159a04f1d913f4c4aba9eae8848511cf5f4c8e3b04bb3cc313b65f60357f86462c959a14c2d58380fedf89b6b32ecec237c452a5ef3900a293 + languageName: node + linkType: hard + "object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": version: 1.12.3 resolution: "object-inspect@npm:1.12.3" @@ -4052,6 +11129,13 @@ __metadata: languageName: node linkType: hard +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 + languageName: node + linkType: hard + "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" @@ -4059,6 +11143,22 @@ __metadata: languageName: node linkType: hard +"object-keys@npm:~0.4.0": + version: 0.4.0 + resolution: "object-keys@npm:0.4.0" + checksum: 10c0/91b5eefd2e0374b3d19000d4ea21d94b9f616c28a1e58f1c4f3e1fd6486a9f53ac00aa10e5ef85536be477dbd0f506bdeee6418e5fc86cc91ab0748655b08f5b + languageName: node + linkType: hard + +"object-visit@npm:^1.0.0": + version: 1.0.1 + resolution: "object-visit@npm:1.0.1" + dependencies: + isobject: "npm:^3.0.0" + checksum: 10c0/086b475bda24abd2318d2b187c3e928959b89f5cb5883d6fe5a42d03719b61fc18e765f658de9ac8730e67ba9ff26d61e73d991215948ff9ecefe771e0071029 + languageName: node + linkType: hard + "object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": version: 4.1.4 resolution: "object.assign@npm:4.1.4" @@ -4071,6 +11171,32 @@ __metadata: languageName: node linkType: hard +"object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc + languageName: node + linkType: hard + +"object.defaults@npm:^1.1.0": + version: 1.1.0 + resolution: "object.defaults@npm:1.1.0" + dependencies: + array-each: "npm:^1.0.1" + array-slice: "npm:^1.0.0" + for-own: "npm:^1.0.0" + isobject: "npm:^3.0.0" + checksum: 10c0/9ed5c41ce500c2dce2e6f8baa71b0e73b013dcd57c02e545dd85b46e52140af707e2b05c31f6126209f8b15709f10817ddbe6fb5c13f8d873d811694f28ee3fd + languageName: node + linkType: hard + "object.entries@npm:^1.1.2": version: 1.1.6 resolution: "object.entries@npm:1.1.6" @@ -4105,6 +11231,25 @@ __metadata: languageName: node linkType: hard +"object.map@npm:^1.0.0": + version: 1.0.1 + resolution: "object.map@npm:1.0.1" + dependencies: + for-own: "npm:^1.0.0" + make-iterator: "npm:^1.0.0" + checksum: 10c0/f5dff48d3aa6604e8c1983c988a1314b8858181cbedc1671a83c8db6f247a97f31a7acb7ec1b85a72a785149bc34ffbd284d953d902fef7a3c19e2064959a0aa + languageName: node + linkType: hard + +"object.pick@npm:^1.2.0, object.pick@npm:^1.3.0": + version: 1.3.0 + resolution: "object.pick@npm:1.3.0" + dependencies: + isobject: "npm:^3.0.1" + checksum: 10c0/cd316ec986e49895a28f2df9182de9cdeee57cd2a952c122aacc86344c28624fe002d9affc4f48b5014ec7c033da9942b08821ddb44db8c5bac5b3ec54bdc31e + languageName: node + linkType: hard + "object.values@npm:^1.1.6": version: 1.1.6 resolution: "object.values@npm:1.1.6" @@ -4116,7 +11261,14 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1": +"octokit-pagination-methods@npm:^1.1.0": + version: 1.1.0 + resolution: "octokit-pagination-methods@npm:1.1.0" + checksum: 10c0/e8b2b346e7ad91c1b10a3d8be76d8aa33889b4df0bd5c28106dc2e8b5498185bbb5bd884ef07a57b09a5c54003deb2814280bab6ed6991e9e650c5cdc9879924 + languageName: node + linkType: hard + +"on-finished@npm:2.4.1, on-finished@npm:~2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -4125,7 +11277,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.3.3, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -4134,6 +11286,13 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^1.0.0": + version: 1.1.0 + resolution: "onetime@npm:1.1.0" + checksum: 10c0/612a15af7966d9df486fe7a91da115b383137f3794709785deb13ecbcabbd9ad1fa983f4ba1f6076c143d454a7da5e6590e8da4d411ff7f06c8a180eb45011f5 + languageName: node + linkType: hard + "onetime@npm:^5.1.0": version: 5.1.2 resolution: "onetime@npm:5.1.2" @@ -4143,6 +11302,16 @@ __metadata: languageName: node linkType: hard +"open@npm:^7.4.2": + version: 7.4.2 + resolution: "open@npm:7.4.2" + dependencies: + is-docker: "npm:^2.0.0" + is-wsl: "npm:^2.1.1" + checksum: 10c0/77573a6a68f7364f3a19a4c80492712720746b63680ee304555112605ead196afe91052bd3c3d165efdf4e9d04d255e87de0d0a77acec11ef47fd5261251813f + languageName: node + linkType: hard + "open@npm:^8.2.1": version: 8.4.2 resolution: "open@npm:8.4.2" @@ -4154,7 +11323,31 @@ __metadata: languageName: node linkType: hard -"optionator@npm:^0.9.1": +"optimist@npm:^0.6.1": + version: 0.6.1 + resolution: "optimist@npm:0.6.1" + dependencies: + minimist: "npm:~0.0.1" + wordwrap: "npm:~0.0.2" + checksum: 10c0/8cb417328121e732dbfb4d94d53bb39b1406446b55323ed4ce787decc52394927e051ba879eb3ffa3171fe22a35ce13b460114b60effcead77443ee87c2f9b0f + languageName: node + linkType: hard + +"optionator@npm:^0.8.1": + version: 0.8.3 + resolution: "optionator@npm:0.8.3" + dependencies: + deep-is: "npm:~0.1.3" + fast-levenshtein: "npm:~2.0.6" + levn: "npm:~0.3.0" + prelude-ls: "npm:~1.1.2" + type-check: "npm:~0.3.2" + word-wrap: "npm:~1.2.3" + checksum: 10c0/ad7000ea661792b3ec5f8f86aac28895850988926f483b5f308f59f4607dfbe24c05df2d049532ee227c040081f39401a268cf7bbf3301512f74c4d760dc6dd8 + languageName: node + linkType: hard + +"optionator@npm:^0.9.1, optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" dependencies: @@ -4202,13 +11395,61 @@ __metadata: languageName: node linkType: hard -"os-tmpdir@npm:~1.0.2": +"os-homedir@npm:^1.0.0, os-homedir@npm:^1.0.1": + version: 1.0.2 + resolution: "os-homedir@npm:1.0.2" + checksum: 10c0/6be4aa67317ee247b8d46142e243fb4ef1d2d65d3067f54bfc5079257a2f4d4d76b2da78cba7af3cb3f56dbb2e4202e0c47f26171d11ca1ed4008d842c90363f + languageName: node + linkType: hard + +"os-locale@npm:^1.4.0": + version: 1.4.0 + resolution: "os-locale@npm:1.4.0" + dependencies: + lcid: "npm:^1.0.0" + checksum: 10c0/302173159d562000ddf982ed75c493a0d861e91372c9e1b13aab21590ff2e1ba264a41995b29be8dc5278a6127ffcd2ad5591779e8164a570fc5fa6c0787b057 + languageName: node + linkType: hard + +"os-locale@npm:^3.0.0": + version: 3.1.0 + resolution: "os-locale@npm:3.1.0" + dependencies: + execa: "npm:^1.0.0" + lcid: "npm:^2.0.0" + mem: "npm:^4.0.0" + checksum: 10c0/db017958884d111af9060613f55aa8a41d67d7210a96cd8e20ac2bc93daed945f6d6dbb0e2085355fe954258fe42e82bfc180c5b6bdbc90151d135d435dde2da + languageName: node + linkType: hard + +"os-name@npm:^3.1.0": + version: 3.1.0 + resolution: "os-name@npm:3.1.0" + dependencies: + macos-release: "npm:^2.2.0" + windows-release: "npm:^3.1.0" + checksum: 10c0/da45495c391606afbefc4fcc5bf2ac37f92a32280a2ec8ed66d723b52a71783d65c1ad9e63f5f4a6d172f90e904de854627588cce9555bcad417d0e615d7e217 + languageName: node + linkType: hard + +"os-tmpdir@npm:^1.0.0, os-tmpdir@npm:^1.0.1, os-tmpdir@npm:~1.0.2": version: 1.0.2 resolution: "os-tmpdir@npm:1.0.2" checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 languageName: node linkType: hard +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a + languageName: node + linkType: hard + "p-any@npm:^3.0.0": version: 3.0.0 resolution: "p-any@npm:3.0.0" @@ -4219,6 +11460,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^0.4.0": + version: 0.4.1 + resolution: "p-cancelable@npm:0.4.1" + checksum: 10c0/cc066ac107958fa2549f1c270e00ec1b25cfbeda867f93599a414806b3631cd9451533acb2bda3efda4bf4a54a2f9d6cc51dd6d06c08c25b806b3dfe5ff69b29 + languageName: node + linkType: hard + "p-cancelable@npm:^2.0.0": version: 2.1.1 resolution: "p-cancelable@npm:2.1.1" @@ -4226,6 +11474,22 @@ __metadata: languageName: node linkType: hard +"p-defer@npm:^1.0.0": + version: 1.0.0 + resolution: "p-defer@npm:1.0.0" + checksum: 10c0/ed603c3790e74b061ac2cb07eb6e65802cf58dce0fbee646c113a7b71edb711101329ad38f99e462bd2e343a74f6e9366b496a35f1d766c187084d3109900487 + languageName: node + linkType: hard + +"p-event@npm:^5.0.1": + version: 5.0.1 + resolution: "p-event@npm:5.0.1" + dependencies: + p-timeout: "npm:^5.0.2" + checksum: 10c0/2317171489537f316661fa863f3bb711b2ceb89182937238422cec10223cbb958c432d6c26a238446a622d788187bdd295b1d8ecedbe2e467e045930d60202b0 + languageName: node + linkType: hard + "p-finally@npm:^1.0.0": version: 1.0.0 resolution: "p-finally@npm:1.0.0" @@ -4233,6 +11497,29 @@ __metadata: languageName: node linkType: hard +"p-is-promise@npm:^1.1.0": + version: 1.1.0 + resolution: "p-is-promise@npm:1.1.0" + checksum: 10c0/b3f945a18e3e16a7a5fda131250f7a96f59ceb6fdceee87576044790b99b97a5ab5d4a9ae878d2746f762b99efc0a8c1e3b21b5269e3537fbfdb443a38eeb9bf + languageName: node + linkType: hard + +"p-is-promise@npm:^2.0.0": + version: 2.1.0 + resolution: "p-is-promise@npm:2.1.0" + checksum: 10c0/115c50960739c26e9b3e8a3bd453341a3b02a2e5ba41109b904ff53deb0b941ef81b196e106dc11f71698f591b23055c82d81188b7b670e9d5e28bc544b0674d + languageName: node + linkType: hard + +"p-limit@npm:^2.0.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: "npm:^2.0.0" + checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 + languageName: node + linkType: hard + "p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" @@ -4251,6 +11538,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^3.0.0": + version: 3.0.0 + resolution: "p-locate@npm:3.0.0" + dependencies: + p-limit: "npm:^2.0.0" + checksum: 10c0/7b7f06f718f19e989ce6280ed4396fb3c34dabdee0df948376483032f9d5ec22fdf7077ec942143a75827bb85b11da72016497fc10dac1106c837ed593969ee8 + languageName: node + linkType: hard + "p-locate@npm:^5.0.0": version: 5.0.0 resolution: "p-locate@npm:5.0.0" @@ -4278,7 +11574,7 @@ __metadata: languageName: node linkType: hard -"p-map@npm:^5.1.0": +"p-map@npm:^5.1.0, p-map@npm:^5.5.0": version: 5.5.0 resolution: "p-map@npm:5.5.0" dependencies: @@ -4297,6 +11593,15 @@ __metadata: languageName: node linkType: hard +"p-timeout@npm:^2.0.1": + version: 2.0.1 + resolution: "p-timeout@npm:2.0.1" + dependencies: + p-finally: "npm:^1.0.0" + checksum: 10c0/26f7baa19a9a60c694e73d2727d169b357bb91e91112dfe50daa513230573ddf157b2f2c1779fb66da0f84ae952d39969f70a0cb1818f7c109ad8d4df49f99a3 + languageName: node + linkType: hard + "p-timeout@npm:^3.2.0": version: 3.2.0 resolution: "p-timeout@npm:3.2.0" @@ -4306,6 +11611,20 @@ __metadata: languageName: node linkType: hard +"p-timeout@npm:^5.0.2": + version: 5.1.0 + resolution: "p-timeout@npm:5.1.0" + checksum: 10c0/1b026cf9d5878c64bec4341ca9cda8ec6b8b3aea8a57885ca0fe2b35753a20d767fb6f9d3aa41e1252f42bc95432c05ea33b6b18f271fb10bfb0789591850a41 + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f + languageName: node + linkType: hard + "package-json-from-dist@npm:^1.0.0": version: 1.0.1 resolution: "package-json-from-dist@npm:1.0.1" @@ -4322,6 +11641,36 @@ __metadata: languageName: node linkType: hard +"parse-filepath@npm:^1.0.1": + version: 1.0.2 + resolution: "parse-filepath@npm:1.0.2" + dependencies: + is-absolute: "npm:^1.0.0" + map-cache: "npm:^0.2.0" + path-root: "npm:^0.1.1" + checksum: 10c0/37bbd225fa864257246777efbdf72a9305c4ae12110bf467d11994e93f8be60dd309dcef68124a2c78c5d3b4e64e1c36fcc2560e2ea93fd97767831e7a446805 + languageName: node + linkType: hard + +"parse-json@npm:2.2.0, parse-json@npm:^2.2.0": + version: 2.2.0 + resolution: "parse-json@npm:2.2.0" + dependencies: + error-ex: "npm:^1.2.0" + checksum: 10c0/7a90132aa76016f518a3d5d746a21b3f1ad0f97a68436ed71b6f995b67c7151141f5464eea0c16c59aec9b7756519a0e3007a8f98cf3714632d509ec07736df6 + languageName: node + linkType: hard + +"parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-json@npm:4.0.0" + dependencies: + error-ex: "npm:^1.3.1" + json-parse-better-errors: "npm:^1.0.1" + checksum: 10c0/8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 + languageName: node + linkType: hard + "parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -4334,6 +11683,20 @@ __metadata: languageName: node linkType: hard +"parse-ms@npm:^3.0.0": + version: 3.0.0 + resolution: "parse-ms@npm:3.0.0" + checksum: 10c0/056b4a32a9d3749f3f4cfffefb45c45540491deaa8e1d8ad43c2ddde7ba04edd076bd1b298f521238bb5fb084a9b2c4a2ebb78aefa651afbc4c2b0af4232fc54 + languageName: node + linkType: hard + +"parse-passwd@npm:^1.0.0": + version: 1.0.0 + resolution: "parse-passwd@npm:1.0.0" + checksum: 10c0/1c05c05f95f184ab9ca604841d78e4fe3294d46b8e3641d305dcc28e930da0e14e602dbda9f3811cd48df5b0e2e27dbef7357bf0d7c40e41b18c11c3a8b8d17b + languageName: node + linkType: hard + "parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -4341,6 +11704,53 @@ __metadata: languageName: node linkType: hard +"pascalcase@npm:^0.1.1": + version: 0.1.1 + resolution: "pascalcase@npm:0.1.1" + checksum: 10c0/48dfe90618e33810bf58211d8f39ad2c0262f19ad6354da1ba563935b5f429f36409a1fb9187c220328f7a4dc5969917f8e3e01ee089b5f1627b02aefe39567b + languageName: node + linkType: hard + +"patch-package@npm:^8.0.1": + version: 8.0.1 + resolution: "patch-package@npm:8.0.1" + dependencies: + "@yarnpkg/lockfile": "npm:^1.1.0" + chalk: "npm:^4.1.2" + ci-info: "npm:^3.7.0" + cross-spawn: "npm:^7.0.3" + find-yarn-workspace-root: "npm:^2.0.0" + fs-extra: "npm:^10.0.0" + json-stable-stringify: "npm:^1.0.2" + klaw-sync: "npm:^6.0.0" + minimist: "npm:^1.2.6" + open: "npm:^7.4.2" + semver: "npm:^7.5.3" + slash: "npm:^2.0.0" + tmp: "npm:^0.2.4" + yaml: "npm:^2.2.2" + bin: + patch-package: index.js + checksum: 10c0/6dd7cdd8b814902f1a66bc9082bd5a5a484956563538a694ff1de2e7f4cc14a13480739f5f04e0d1747395d6f1b651eb1ddbc39687ce5ff8a3927f212cffd2ac + languageName: node + linkType: hard + +"path-exists@npm:^2.0.0, path-exists@npm:^2.1.0": + version: 2.1.0 + resolution: "path-exists@npm:2.1.0" + dependencies: + pinkie-promise: "npm:^2.0.0" + checksum: 10c0/87352f1601c085d5a6eb202f60e5c016c1b790bd0bc09398af446ed3f5c4510b4531ff99cf8acac2d91868886e792927b4292f768b35a83dce12588fb7cbb46e + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 + languageName: node + linkType: hard + "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -4355,13 +11765,27 @@ __metadata: languageName: node linkType: hard -"path-is-absolute@npm:^1.0.0": +"path-is-absolute@npm:^1.0.0, path-is-absolute@npm:^1.0.1": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 languageName: node linkType: hard +"path-is-inside@npm:^1.0.1": + version: 1.0.2 + resolution: "path-is-inside@npm:1.0.2" + checksum: 10c0/7fdd4b41672c70461cce734fc222b33e7b447fa489c7c4377c95e7e6852d83d69741f307d88ec0cc3b385b41cb4accc6efac3c7c511cd18512e95424f5fa980c + languageName: node + linkType: hard + +"path-key@npm:^2.0.0, path-key@npm:^2.0.1": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b + languageName: node + linkType: hard + "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -4376,6 +11800,22 @@ __metadata: languageName: node linkType: hard +"path-root-regex@npm:^0.1.0": + version: 0.1.2 + resolution: "path-root-regex@npm:0.1.2" + checksum: 10c0/27651a234f280c70d982dd25c35550f74a4284cde6b97237aab618cb4b5745682d18cdde1160617bb4a4b6b8aec4fbc911c4a2ad80d01fa4c7ee74dae7af2337 + languageName: node + linkType: hard + +"path-root@npm:^0.1.1": + version: 0.1.1 + resolution: "path-root@npm:0.1.1" + dependencies: + path-root-regex: "npm:^0.1.0" + checksum: 10c0/aed5cd290df84c46c7730f6a363e95e47a23929b51ab068a3818d69900da3e89dc154cdfd0c45c57b2e02f40c094351bc862db70c2cb00b7e6bd47039a227813 + languageName: node + linkType: hard + "path-scurry@npm:^1.11.1": version: 1.11.1 resolution: "path-scurry@npm:1.11.1" @@ -4393,6 +11833,40 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:6.3.0": + version: 6.3.0 + resolution: "path-to-regexp@npm:6.3.0" + checksum: 10c0/73b67f4638b41cde56254e6354e46ae3a2ebc08279583f6af3d96fe4664fc75788f74ed0d18ca44fa4a98491b69434f9eee73b97bb5314bd1b5adb700f5c18d6 + languageName: node + linkType: hard + +"path-to-regexp@npm:~0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: 10c0/1c6ff10ca169b773f3bba943bbc6a07182e332464704572962d277b900aeee81ac6aa5d060ff9e01149636c30b1f63af6e69dd7786ba6e0ddb39d4dee1f0645b + languageName: node + linkType: hard + +"path-type@npm:^1.0.0": + version: 1.1.0 + resolution: "path-type@npm:1.1.0" + dependencies: + graceful-fs: "npm:^4.1.2" + pify: "npm:^2.0.0" + pinkie-promise: "npm:^2.0.0" + checksum: 10c0/2b8c348cb52bbc0c0568afa10a0a5d8f6233adfe5ae75feb56064f6aed6324ab74185c61c2545f4e52ca08acdc76005f615da4e127ed6eecb866002cf491f350 + languageName: node + linkType: hard + +"path-type@npm:^3.0.0": + version: 3.0.0 + resolution: "path-type@npm:3.0.0" + dependencies: + pify: "npm:^3.0.0" + checksum: 10c0/1332c632f1cac15790ebab8dd729b67ba04fc96f81647496feb1c2975d862d046f41e4b975dbd893048999b2cc90721f72924ad820acc58c78507ba7141a8e56 + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -4400,7 +11874,54 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 + languageName: node + linkType: hard + +"pause-stream@npm:0.0.11, pause-stream@npm:^0.0.11": + version: 0.0.11 + resolution: "pause-stream@npm:0.0.11" + dependencies: + through: "npm:~2.3" + checksum: 10c0/86f12c64cdaaa8e45ebaca4e39a478e1442db8b4beabc280b545bfaf79c0e2f33c51efb554aace5c069cc441c7b924ba484837b345eaa4ba6fc940d62f826802 + languageName: node + linkType: hard + +"pause@npm:0.0.1": + version: 0.0.1 + resolution: "pause@npm:0.0.1" + checksum: 10c0/f362655dfa7f44b946302c5a033148852ed5d05f744bd848b1c7eae6a543f743e79c7751ee896ba519fd802affdf239a358bb2ea5ca1b1c1e4e916279f83ab75 + languageName: node + linkType: hard + +"paypal-rest-sdk@npm:^1.7.1": + version: 1.8.1 + resolution: "paypal-rest-sdk@npm:1.8.1" + dependencies: + buffer-crc32: "npm:^0.2.3" + semver: "npm:^5.0.3" + checksum: 10c0/39b696615628fee6d8900b81146ab9bb1084ee28738c2d3f8442a847362bfcf240d91798e74b3862e2cc7ae18c98b3d6a740c0e3356e3aec4a0dd0c7b235a1c3 + languageName: node + linkType: hard + +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 + languageName: node + linkType: hard + +"performance-now@npm:^2.1.0": + version: 2.1.0 + resolution: "performance-now@npm:2.1.0" + checksum: 10c0/22c54de06f269e29f640e0e075207af57de5052a3d15e360c09b9a8663f393f6f45902006c1e71aa8a5a1cdfb1a47fe268826f8496d6425c362f00f5bc3e85d9 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 @@ -4414,6 +11935,85 @@ __metadata: languageName: node linkType: hard +"pidtree@npm:^0.3.0": + version: 0.3.1 + resolution: "pidtree@npm:0.3.1" + bin: + pidtree: bin/pidtree.js + checksum: 10c0/cd69b0182f749f45ab48584e3442c48c5dc4512502c18d5b0147a33b042c41a4db4269b9ce2f7c48f11833ee5e79d81f5ebc6f7bf8372d4ea55726f60dc505a1 + languageName: node + linkType: hard + +"pify@npm:^2.0.0": + version: 2.3.0 + resolution: "pify@npm:2.3.0" + checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 + languageName: node + linkType: hard + +"pinkie-promise@npm:^2.0.0": + version: 2.0.1 + resolution: "pinkie-promise@npm:2.0.1" + dependencies: + pinkie: "npm:^2.0.0" + checksum: 10c0/11b5e5ce2b090c573f8fad7b517cbca1bb9a247587306f05ae71aef6f9b2cd2b923c304aa9663c2409cfde27b367286179f1379bc4ec18a3fbf2bb0d473b160a + languageName: node + linkType: hard + +"pinkie@npm:^2.0.0": + version: 2.0.4 + resolution: "pinkie@npm:2.0.4" + checksum: 10c0/25228b08b5597da42dc384221aa0ce56ee0fbf32965db12ba838e2a9ca0193c2f0609c45551ee077ccd2060bf109137fdb185b00c6d7e0ed7e35006d20fdcbc6 + languageName: node + linkType: hard + +"pkg-conf@npm:^4.0.0": + version: 4.0.0 + resolution: "pkg-conf@npm:4.0.0" + dependencies: + find-up: "npm:^6.0.0" + load-json-file: "npm:^7.0.0" + checksum: 10c0/27d027609f27228edcde121f6f707b4ba1f5488e95e98f2e58652ae4e99792081bd1de67d591f4a0f05b02c0b66d745591d49f82041cbc8d41e2238ef5d73eb4 + languageName: node + linkType: hard + +"plur@npm:^5.1.0": + version: 5.1.0 + resolution: "plur@npm:5.1.0" + dependencies: + irregular-plurals: "npm:^3.3.0" + checksum: 10c0/26bb622b8545fcfd47bbf56fbcca66c08693708a232e403fa3589e00003c56c14231ac57c7588ca5db83ef4be1f61383402c4ea954000768f779f8aef6eb6da8 + languageName: node + linkType: hard + +"pluralize@npm:^1.2.1": + version: 1.2.1 + resolution: "pluralize@npm:1.2.1" + checksum: 10c0/0721d81ad8bde6878c4a8defcc4830ba91320a37d47717fa6aef1b18d01db67c49665e55e3833ee0fd33e1a35a9f77d367415086b5c7ee92eaf04b99df43e87a + languageName: node + linkType: hard + +"posix-character-classes@npm:^0.1.0": + version: 0.1.1 + resolution: "posix-character-classes@npm:0.1.1" + checksum: 10c0/cce88011548a973b4af58361cd8f5f7b5a6faff8eef0901565802f067bcabf82597e920d4c97c22068464be3cbc6447af589f6cc8a7d813ea7165be60a0395bc + languageName: node + linkType: hard + +"possible-typed-array-names@npm:^1.0.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196 + languageName: node + linkType: hard + "prebuild-install@npm:^7.1.1": version: 7.1.2 resolution: "prebuild-install@npm:7.1.2" @@ -4443,6 +12043,20 @@ __metadata: languageName: node linkType: hard +"prelude-ls@npm:~1.1.2": + version: 1.1.2 + resolution: "prelude-ls@npm:1.1.2" + checksum: 10c0/7284270064f74e0bb7f04eb9bff7be677e4146417e599ccc9c1200f0f640f8b11e592d94eb1b18f7aa9518031913bb42bea9c86af07ba69902864e61005d6f18 + languageName: node + linkType: hard + +"prepend-http@npm:^2.0.0": + version: 2.0.0 + resolution: "prepend-http@npm:2.0.0" + checksum: 10c0/b023721ffd967728e3a25e3a80dd73827e9444e586800ab90a21b3a8e67f362d28023085406ad53a36db1e4d98cb10e43eb37d45c6b733140a9165ead18a0987 + languageName: node + linkType: hard + "prepend-http@npm:^3.0.1": version: 3.0.1 resolution: "prepend-http@npm:3.0.1" @@ -4459,7 +12073,16 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.8.4": +"prettier@npm:^1.18.2": + version: 1.19.1 + resolution: "prettier@npm:1.19.1" + bin: + prettier: ./bin-prettier.js + checksum: 10c0/12efb4e486c1e1d006e9eadd3b6585fc6beb9481dc801080fc23d3e75ec599d88c6fea1b40aef167128069e8fe76b4205bb8306ad145575d1b051b8fa70cfaae + languageName: node + linkType: hard + +"prettier@npm:^2.5.1, prettier@npm:^2.8.4": version: 2.8.8 resolution: "prettier@npm:2.8.8" bin: @@ -4468,6 +12091,29 @@ __metadata: languageName: node linkType: hard +"pretty-bytes@npm:^4.0.2": + version: 4.0.2 + resolution: "pretty-bytes@npm:4.0.2" + checksum: 10c0/b2e0bd22d78c9d46e589e62a5b604eec26f2f3adf2b3255b791883318ce205cc71be49b0f0dac4a0d37191d7ddddf6e870df543ee2226092daba92b1a35c0984 + languageName: node + linkType: hard + +"pretty-ms@npm:^8.0.0": + version: 8.0.0 + resolution: "pretty-ms@npm:8.0.0" + dependencies: + parse-ms: "npm:^3.0.0" + checksum: 10c0/e960d633ecca45445cf5c6dffc0f5e4bef6744c92449ab0e8c6c704800675ab71e181c5e02ece5265e02137a33e313d3f3e355fbf8ea30b4b5b23de423329f8d + languageName: node + linkType: hard + +"private@npm:^0.1.8": + version: 0.1.8 + resolution: "private@npm:0.1.8" + checksum: 10c0/829a23723e5fd3105c72b2dadeeb65743a430f7e6967a8a6f3e49392a1b3ea52975a255376d8c513b0c988bdf162f1a5edf9d9bac27d1ab11f8dba8cdb58880e + languageName: node + linkType: hard + "proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": version: 4.2.0 resolution: "proc-log@npm:4.2.0" @@ -4475,6 +12121,30 @@ __metadata: languageName: node linkType: hard +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + +"progress-stream@npm:^1.1.0": + version: 1.2.0 + resolution: "progress-stream@npm:1.2.0" + dependencies: + speedometer: "npm:~0.1.2" + through2: "npm:~0.2.3" + checksum: 10c0/f658747bbbdbbd0807fbb26943fee34bac7f99fab686a0a2630e38806a8e8dfd406729827d1667690ba9ac4f02c517644311bbedf7e4f9644f947c67b8baa813 + languageName: node + linkType: hard + +"progress@npm:^1.1.8": + version: 1.1.8 + resolution: "progress@npm:1.1.8" + checksum: 10c0/e50b51e5cc292d18eff0a9ec7ed267b7d39e2af712a238d5387f8b3e15631e25f504f493cbeb7e7b7f2e4c7d3154cdc4569b87dd5e736449cd8876ba04701f0a + languageName: node + linkType: hard + "progress@npm:^2.0.0": version: 2.0.3 resolution: "progress@npm:2.0.3" @@ -4482,6 +12152,22 @@ __metadata: languageName: node linkType: hard +"promise-make-counter@npm:^1.0.2": + version: 1.0.2 + resolution: "promise-make-counter@npm:1.0.2" + dependencies: + promise-make-naked: "npm:^3.0.2" + checksum: 10c0/23a3355e8d8f3b6c04bc8c64096b6978209120bc556e0bf78b122df7b66e803337f158ee2a04c0941a07cb8fd773ba7f6ea692ef4b92d64c6f5bca2129ea435c + languageName: node + linkType: hard + +"promise-make-naked@npm:^3.0.2": + version: 3.0.2 + resolution: "promise-make-naked@npm:3.0.2" + checksum: 10c0/da5bd927f413d6ea4c17009e6541f706e2e2975cc0b421e28251c9c59e134c2263b0412724b91315acc17bf09d3591d0402e1bf2aedc60eae3d02685313aa848 + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -4492,6 +12178,27 @@ __metadata: languageName: node linkType: hard +"promise@npm:^7.1.1": + version: 7.3.1 + resolution: "promise@npm:7.3.1" + dependencies: + asap: "npm:~2.0.3" + checksum: 10c0/742e5c0cc646af1f0746963b8776299701ad561ce2c70b49365d62c8db8ea3681b0a1bf0d4e2fe07910bf72f02d39e51e8e73dc8d7503c3501206ac908be107f + languageName: node + linkType: hard + +"proper-lockfile@npm:^1.1.2": + version: 1.2.0 + resolution: "proper-lockfile@npm:1.2.0" + dependencies: + err-code: "npm:^1.0.0" + extend: "npm:^3.0.0" + graceful-fs: "npm:^4.1.2" + retry: "npm:^0.10.0" + checksum: 10c0/acb2cb1043d40b8fe2240ea49a6ad35081435e8a5ae5fd0ae2ec983058cf3634ec65b2eb8019121bcad80cf5d406e4b962b2842b343067311e9bb2231b0cb372 + languageName: node + linkType: hard + "proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" @@ -4502,6 +12209,33 @@ __metadata: languageName: node linkType: hard +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + +"ps-tree@npm:^1.2.0": + version: 1.2.0 + resolution: "ps-tree@npm:1.2.0" + dependencies: + event-stream: "npm:=3.3.4" + bin: + ps-tree: ./bin/ps-tree.js + checksum: 10c0/9d1c159e0890db5aa05f84d125193c2190a6c4ecd457596fd25e7611f8f747292a846459dcc0244e27d45529d4cea6d1010c3a2a087fad02624d12fdb7d97c22 + languageName: node + linkType: hard + +"psl@npm:^1.1.28": + version: 1.15.0 + resolution: "psl@npm:1.15.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10c0/d8d45a99e4ca62ca12ac3c373e63d80d2368d38892daa40cfddaa1eb908be98cd549ac059783ef3a56cfd96d57ae8e2fd9ae53d1378d90d42bc661ff924e102a + languageName: node + linkType: hard + "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -4512,13 +12246,41 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0": +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 languageName: node linkType: hard +"pure-rand@npm:^6.1.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 + languageName: node + linkType: hard + +"put@npm:0.0.6": + version: 0.0.6 + resolution: "put@npm:0.0.6" + checksum: 10c0/f1d69198e41eaaa2839f5c09ba9523a3f2b59d3a523c8da7d1ad9edc040fd0dd52556362c187440971ab5496260e908c1834a0953b7fe9f9ebf8ec3b17e2a9e5 + languageName: node + linkType: hard + +"q@npm:~1.0.1": + version: 1.0.1 + resolution: "q@npm:1.0.1" + checksum: 10c0/c4b6bfe48f065267308ef62faefe3831176134e15bfbec9636cf20905689d55de32f5af76284a2e4bed1086377f721d69e47fafb9ef2d5a73ad57ae03b6130ec + languageName: node + linkType: hard + +"qs@npm:0.6.6": + version: 0.6.6 + resolution: "qs@npm:0.6.6" + checksum: 10c0/1a441426c09a4d42dc613dbcd2a28f51005a9fabd2062b5e9f72515d85fcfdcfbf0e778a430ba98cbc21636b59695f03c4220b7c123745b394440c5d7fd86f0b + languageName: node + linkType: hard + "qs@npm:6.13.0": version: 6.13.0 resolution: "qs@npm:6.13.0" @@ -4537,6 +12299,33 @@ __metadata: languageName: node linkType: hard +"qs@npm:~6.14.0": + version: 6.14.1 + resolution: "qs@npm:6.14.1" + dependencies: + side-channel: "npm:^1.1.0" + checksum: 10c0/0e3b22dc451f48ce5940cbbc7c7d9068d895074f8c969c0801ac15c1313d1859c4d738e46dc4da2f498f41a9ffd8c201bd9fb12df67799b827db94cc373d2613 + languageName: node + linkType: hard + +"qs@npm:~6.5.2": + version: 6.5.3 + resolution: "qs@npm:6.5.3" + checksum: 10c0/6631d4f2fa9d315e480662646745a4aa3a708817fbffe2cbdacec8ab9be130f92740c66191770fe9b704bc5fa9c1cc1f6596f55ad132fef7bd3ad1582f199eb0 + languageName: node + linkType: hard + +"query-string@npm:^5.0.1": + version: 5.1.1 + resolution: "query-string@npm:5.1.1" + dependencies: + decode-uri-component: "npm:^0.2.0" + object-assign: "npm:^4.1.0" + strict-uri-encode: "npm:^1.0.0" + checksum: 10c0/25adf37fe9a5b749da55ef91192d190163c44283826b425fa86eeb1fa567cf500a32afc2c602d4f661839d86ca49c2f8d49433b3c1b44b9129a37a5d3da55f89 + languageName: node + linkType: hard + "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -4558,6 +12347,13 @@ __metadata: languageName: node linkType: hard +"range-parser@npm:0.0.4": + version: 0.0.4 + resolution: "range-parser@npm:0.0.4" + checksum: 10c0/4b14854023f5f1bc6fdf98795be012ee84e7862ec7fcc4aa74fbc33003befad757517eec203ba3c556837d99691ce86b768dc78c40726391369128f56537d38d + languageName: node + linkType: hard + "range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" @@ -4565,6 +12361,15 @@ __metadata: languageName: node linkType: hard +"raw-body@npm:1.1.2": + version: 1.1.2 + resolution: "raw-body@npm:1.1.2" + dependencies: + bytes: "npm:~0.2.1" + checksum: 10c0/a8a530325f9c17ffdcb046eb5a19944f480c14ce2e239280258627e73f910a449fab0f5370b986f2eee15e9e250b0bd5a025a3e38f8006e304e06342ce8e6a10 + languageName: node + linkType: hard + "raw-body@npm:2.5.2": version: 2.5.2 resolution: "raw-body@npm:2.5.2" @@ -4577,7 +12382,19 @@ __metadata: languageName: node linkType: hard -"rc@npm:^1.2.7": +"raw-body@npm:~2.5.3": + version: 2.5.3 + resolution: "raw-body@npm:2.5.3" + dependencies: + bytes: "npm:~3.1.2" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + unpipe: "npm:~1.0.0" + checksum: 10c0/449844344fc90547fb994383a494b83300e4f22199f146a79f68d78a199a8f2a923ea9fd29c3be979bfd50291a3884733619ffc15ba02a32e703b612f8d3f74a + languageName: node + linkType: hard + +"rc@npm:^1.1.2, rc@npm:^1.2.7": version: 1.2.8 resolution: "rc@npm:1.2.8" dependencies: @@ -4591,6 +12408,36 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:15.3.1": + version: 15.3.1 + resolution: "react-dom@npm:15.3.1" + peerDependencies: + react: ^15.3.1 + checksum: 10c0/240713b0a2f8c512fe7291e4a642429608731404e0638004d90b55a1644ef87c720d1a603baa34aa6baaf4d98f5dcaf1d5742a1d75991bee7b9cb1f2a7ac7027 + languageName: node + linkType: hard + +"react@npm:15.3.1": + version: 15.3.1 + resolution: "react@npm:15.3.1" + dependencies: + fbjs: "npm:^0.8.4" + loose-envify: "npm:^1.1.0" + object-assign: "npm:^4.1.0" + checksum: 10c0/6e0843ca82fea03db28fc0749ce2597abe3b296797f5c193e9804df155edcf80027864e9a8f0c3f5f83b901555d38d37fe467ed6be2e3dd7611d1e5fecbade41 + languageName: node + linkType: hard + +"read-pkg-up@npm:^1.0.1": + version: 1.0.1 + resolution: "read-pkg-up@npm:1.0.1" + dependencies: + find-up: "npm:^1.0.0" + read-pkg: "npm:^1.0.0" + checksum: 10c0/36c4fc8bd73edf77a4eeb497b6e43010819ea4aef64cbf8e393439fac303398751c5a299feab84e179a74507e3a1416e1ed033a888b1dac3463bf46d1765f7ac + languageName: node + linkType: hard + "read-pkg-up@npm:^8.0.0": version: 8.0.0 resolution: "read-pkg-up@npm:8.0.0" @@ -4602,6 +12449,28 @@ __metadata: languageName: node linkType: hard +"read-pkg@npm:^1.0.0": + version: 1.1.0 + resolution: "read-pkg@npm:1.1.0" + dependencies: + load-json-file: "npm:^1.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^1.0.0" + checksum: 10c0/51fce9f7066787dc7688ea7014324cedeb9f38daa7dace4f1147d526f22354a07189ef728710bc97e27fcf5ed3a03b68ad8b60afb4251984640b6f09c180d572 + languageName: node + linkType: hard + +"read-pkg@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg@npm:3.0.0" + dependencies: + load-json-file: "npm:^4.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^3.0.0" + checksum: 10c0/65acf2df89fbcd506b48b7ced56a255ba00adf7ecaa2db759c86cc58212f6fd80f1f0b7a85c848551a5d0685232e9b64f45c1fd5b48d85df2761a160767eeb93 + languageName: node + linkType: hard + "read-pkg@npm:^6.0.0": version: 6.0.0 resolution: "read-pkg@npm:6.0.0" @@ -4614,6 +12483,36 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:2.3.7": + version: 2.3.7 + resolution: "readable-stream@npm:2.3.7" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/1708755e6cf9daff6ff60fa5b4575636472289c5b95d38058a91f94732b8d024a940a0d4d955639195ce42c22cab16973ee8fea8deedd24b5fec3dd596465f86 + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.2, readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa + languageName: node + linkType: hard + "readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" @@ -4625,6 +12524,18 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:~1.1.13, readable-stream@npm:~1.1.8, readable-stream@npm:~1.1.9": + version: 1.1.14 + resolution: "readable-stream@npm:1.1.14" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.1" + isarray: "npm:0.0.1" + string_decoder: "npm:~0.10.x" + checksum: 10c0/b7f41b16b305103d598e3c8964fa30d52d6e0b5d9fdad567588964521691c24b279c7a8bb71f11927c3613acf355bac72d8396885a43d50425b2caafd49bc83d + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -4634,6 +12545,26 @@ __metadata: languageName: node linkType: hard +"readline2@npm:^1.0.1": + version: 1.0.1 + resolution: "readline2@npm:1.0.1" + dependencies: + code-point-at: "npm:^1.0.0" + is-fullwidth-code-point: "npm:^1.0.0" + mute-stream: "npm:0.0.5" + checksum: 10c0/8b245192a925d5829d0b243c89dfc70646f4842f9ee968528f8b2f60b1c3277446cc007a4a2a1c91360dc1a7a8025d9b30567b6684bee4962179428e1ac02d86 + languageName: node + linkType: hard + +"rechoir@npm:^0.6.2": + version: 0.6.2 + resolution: "rechoir@npm:0.6.2" + dependencies: + resolve: "npm:^1.1.6" + checksum: 10c0/22c4bb32f4934a9468468b608417194f7e3ceba9a508512125b16082c64f161915a28467562368eeb15dc16058eb5b7c13a20b9eb29ff9927d1ebb3b5aa83e84 + languageName: node + linkType: hard + "recursive-readdir@npm:^2.2.2": version: 2.2.3 resolution: "recursive-readdir@npm:2.2.3" @@ -4643,6 +12574,53 @@ __metadata: languageName: node linkType: hard +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" + which-builtin-type: "npm:^1.2.1" + checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.11.0": + version: 0.11.1 + resolution: "regenerator-runtime@npm:0.11.1" + checksum: 10c0/69cfa839efcf2d627fe358bf302ab8b24e5f182cb69f13e66f0612d3640d7838aad1e55662135e3ef2c1cc4322315b757626094fab13a48f9a64ab4bdeb8795b + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.13.4": + version: 0.13.11 + resolution: "regenerator-runtime@npm:0.13.11" + checksum: 10c0/12b069dc774001fbb0014f6a28f11c09ebfe3c0d984d88c9bced77fdb6fedbacbca434d24da9ae9371bfbf23f754869307fb51a4c98a8b8b18e5ef748677ca24 + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.9.5": + version: 0.9.6 + resolution: "regenerator-runtime@npm:0.9.6" + checksum: 10c0/cf22c42daea52d6dcca06bf9bed1566a015707a5a1f367a850f3023db87a130b593000eceabd5f5482abf301e344c7ef7effdfa815fc4699d235530ab31720f9 + languageName: node + linkType: hard + +"regex-not@npm:^1.0.0, regex-not@npm:^1.0.2": + version: 1.0.2 + resolution: "regex-not@npm:1.0.2" + dependencies: + extend-shallow: "npm:^3.0.2" + safe-regex: "npm:^1.1.0" + checksum: 10c0/a0f8d6045f63b22e9759db10e248369c443b41cedd7dba0922d002b66c2734bc2aef0d98c4d45772d1f756245f4c5203856b88b9624bba2a58708858a8d485d6 + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.5.0": version: 1.5.0 resolution: "regexp.prototype.flags@npm:1.5.0" @@ -4654,6 +12632,20 @@ __metadata: languageName: node linkType: hard +"regexp.prototype.flags@npm:^1.5.4": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 + languageName: node + linkType: hard + "regexpp@npm:^3.1.0": version: 3.2.0 resolution: "regexpp@npm:3.2.0" @@ -4668,6 +12660,29 @@ __metadata: languageName: node linkType: hard +"repeat-element@npm:^1.1.2": + version: 1.1.4 + resolution: "repeat-element@npm:1.1.4" + checksum: 10c0/81aa8d82bc845780803ef52df3533fa399974b99df571d0bb86e91f0ffca9ee4b9c4e8e5e72af087938cc28d2aef93d106a6d01da685d72ce96455b90a9f9f69 + languageName: node + linkType: hard + +"repeat-string@npm:^1.5.2, repeat-string@npm:^1.6.1": + version: 1.6.1 + resolution: "repeat-string@npm:1.6.1" + checksum: 10c0/87fa21bfdb2fbdedc44b9a5b118b7c1239bdd2c2c1e42742ef9119b7d412a5137a1d23f1a83dc6bb686f4f27429ac6f542e3d923090b44181bafa41e8ac0174d + languageName: node + linkType: hard + +"repeating@npm:^2.0.0": + version: 2.0.1 + resolution: "repeating@npm:2.0.1" + dependencies: + is-finite: "npm:^1.0.0" + checksum: 10c0/7f5cd293ec47d9c074ef0852800d5ff5c49028ce65242a7528d84f32bd2fe200b142930562af58c96d869c5a3046e87253030058e45231acaa129c1a7087d2e7 + languageName: node + linkType: hard + "replace-buffer@npm:^1.2.1": version: 1.2.1 resolution: "replace-buffer@npm:1.2.1" @@ -4675,6 +12690,48 @@ __metadata: languageName: node linkType: hard +"request@npm:^2.30.0, request@npm:^2.45.0, request@npm:^2.58.0, request@npm:^2.67.0, request@npm:^2.74.0": + version: 2.88.2 + resolution: "request@npm:2.88.2" + dependencies: + aws-sign2: "npm:~0.7.0" + aws4: "npm:^1.8.0" + caseless: "npm:~0.12.0" + combined-stream: "npm:~1.0.6" + extend: "npm:~3.0.2" + forever-agent: "npm:~0.6.1" + form-data: "npm:~2.3.2" + har-validator: "npm:~5.1.3" + http-signature: "npm:~1.2.0" + is-typedarray: "npm:~1.0.0" + isstream: "npm:~0.1.2" + json-stringify-safe: "npm:~5.0.1" + mime-types: "npm:~2.1.19" + oauth-sign: "npm:~0.9.0" + performance-now: "npm:^2.1.0" + qs: "npm:~6.5.2" + safe-buffer: "npm:^5.1.2" + tough-cookie: "npm:~2.5.0" + tunnel-agent: "npm:^0.6.0" + uuid: "npm:^3.3.2" + checksum: 10c0/0ec66e7af1391e51ad231de3b1c6c6aef3ebd0a238aa50d4191c7a792dcdb14920eea8d570c702dc5682f276fe569d176f9b8ebc6031a3cf4a630a691a431a63 + languageName: node + linkType: hard + +"require-all@npm:~1.0.0": + version: 1.0.0 + resolution: "require-all@npm:1.0.0" + checksum: 10c0/ab04e9ff2db43f2b0ab0904dbe80b105339bc66645b361c6ca014bf34d4a13a41241343c028431dba1155394825d8d410132f559e5841f08fc818828416510fe + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + "require-from-string@npm:^2.0.2": version: 2.0.2 resolution: "require-from-string@npm:2.0.2" @@ -4682,6 +12739,30 @@ __metadata: languageName: node linkType: hard +"require-main-filename@npm:^1.0.1": + version: 1.0.1 + resolution: "require-main-filename@npm:1.0.1" + checksum: 10c0/1ab87efb72a0e223a667154e92f29ca753fd42eb87f22db142b91c86d134e29ecf18af929111ccd255fd340b57d84a9d39489498d8dfd5136b300ded30a5f0b6 + languageName: node + linkType: hard + +"require-text@npm:^0.0.1": + version: 0.0.1 + resolution: "require-text@npm:0.0.1" + checksum: 10c0/b15b83559dece3ab49a271ec9d02262a8dba298375a2d33ea9e1cac7d13acdbda510710c21ce7a5b70ddc5f7f91e6294c1f40212e2238c520eab7dfe8d5b0d23 + languageName: node + linkType: hard + +"require-uncached@npm:^1.0.2": + version: 1.0.3 + resolution: "require-uncached@npm:1.0.3" + dependencies: + caller-path: "npm:^0.1.0" + resolve-from: "npm:^1.0.0" + checksum: 10c0/74def8a3e47bde90f0288fbcd46fdd9874810758a9bec5822f16fe8664b290bdab572fa2724eedcbcd725dad0c1b6cfdba2b2efd42f88f91da1214c4839e6466 + languageName: node + linkType: hard + "requireindex@npm:~1.1.0": version: 1.1.0 resolution: "requireindex@npm:1.1.0" @@ -4703,6 +12784,32 @@ __metadata: languageName: node linkType: hard +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + +"resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1": + version: 1.0.1 + resolution: "resolve-dir@npm:1.0.1" + dependencies: + expand-tilde: "npm:^2.0.0" + global-modules: "npm:^1.0.0" + checksum: 10c0/8197ed13e4a51d9cd786ef6a09fc83450db016abe7ef3311ca39389b3e508d77c26fe0cf0483a9b407b8caa2764bb5ccc52cf6a017ded91492a416475a56066f + languageName: node + linkType: hard + +"resolve-from@npm:^1.0.0": + version: 1.0.1 + resolution: "resolve-from@npm:1.0.1" + checksum: 10c0/593ed3612f1421471ef9c00e54f4d56d7cf965f8135a7e92b5c5715602ef640fe48d75258aca91e6cae361dd1e512e7c2cdf4cc65df85e7f6506c12992ffc46f + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -4710,6 +12817,33 @@ __metadata: languageName: node linkType: hard +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resolve-url@npm:^0.2.1": + version: 0.2.1 + resolution: "resolve-url@npm:0.2.1" + checksum: 10c0/c285182cfcddea13a12af92129ce0569be27fb0074ffaefbd3ba3da2eac2acecdfc996d435c4982a9fa2b4708640e52837c9153a5ab9255886a00b0b9e8d2a54 + languageName: node + linkType: hard + +"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.10.0": + version: 1.22.11 + resolution: "resolve@npm:1.22.11" + dependencies: + is-core-module: "npm:^2.16.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/f657191507530f2cbecb5815b1ee99b20741ea6ee02a59c57028e9ec4c2c8d7681afcc35febbd554ac0ded459db6f2d8153382c53a2f266cee2575e512674409 + languageName: node + linkType: hard + "resolve@npm:^1.22.3, resolve@npm:^1.22.4": version: 1.22.4 resolution: "resolve@npm:1.22.4" @@ -4723,6 +12857,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin": + version: 1.22.11 + resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.16.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/ee5b182f2e37cb1165465e58c6abc797fec0a80b5ba3231607beb4677db0c9291ac010c47cf092b6daa2b7f518d69a0e21888e7e2b633f68d501a874212a8c63 + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A^1.22.3#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.4 resolution: "resolve@patch:resolve@npm%3A1.22.4#optional!builtin::version=1.22.4&hash=c3c19d" @@ -4736,12 +12883,31 @@ __metadata: languageName: node linkType: hard +"responselike@npm:1.0.2": + version: 1.0.2 + resolution: "responselike@npm:1.0.2" + dependencies: + lowercase-keys: "npm:^1.0.0" + checksum: 10c0/1c2861d1950790da96159ca490eda645130eaf9ccc4d76db20f685ba944feaf30f45714b4318f550b8cd72990710ad68355ff15c41da43ed9a93c102c0ffa403 + languageName: node + linkType: hard + "responselike@npm:^2.0.0": version: 2.0.1 resolution: "responselike@npm:2.0.1" dependencies: - lowercase-keys: "npm:^2.0.0" - checksum: 10c0/360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + lowercase-keys: "npm:^2.0.0" + checksum: 10c0/360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + languageName: node + linkType: hard + +"restore-cursor@npm:^1.0.1": + version: 1.0.1 + resolution: "restore-cursor@npm:1.0.1" + dependencies: + exit-hook: "npm:^1.0.0" + onetime: "npm:^1.0.0" + checksum: 10c0/5bab0d0131b91d5f4445cccf8e43dfde39c4de007c4792be5d03ea245439a96162a307285dd6684e81cc43ff205ec85ba21daa07ceae827b18a4f32ddaf7b7b1 languageName: node linkType: hard @@ -4765,6 +12931,20 @@ __metadata: languageName: node linkType: hard +"ret@npm:~0.1.10": + version: 0.1.15 + resolution: "ret@npm:0.1.15" + checksum: 10c0/01f77cad0f7ea4f955852c03d66982609893edc1240c0c964b4c9251d0f9fb6705150634060d169939b096d3b77f4c84d6b6098a5b5d340160898c8581f1f63f + languageName: node + linkType: hard + +"retry@npm:^0.10.0": + version: 0.10.1 + resolution: "retry@npm:0.10.1" + checksum: 10c0/d5a7cbc7eca5589a4cf048355150c6746965ace4193080c46b34fe92059506ce39887f5d2bbc58d1d14ecf3b53c5c86d01bd82d158eac9b58aa2f075c2ae7b21 + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -4779,6 +12959,26 @@ __metadata: languageName: node linkType: hard +"right-align@npm:^0.1.1": + version: 0.1.3 + resolution: "right-align@npm:0.1.3" + dependencies: + align-text: "npm:^0.1.1" + checksum: 10c0/8fdafcb1e4cadd03d392f2a2185ab39265deb80bbe37c6ee4b0a552937c84a10fae5afd7ab4623734f7c5356b1d748daf4130529a2fbc8caa311b6257473ec95 + languageName: node + linkType: hard + +"rimraf@npm:2, rimraf@npm:^2.2.8, rimraf@npm:^2.3.2, rimraf@npm:^2.4.3, rimraf@npm:^2.4.4, rimraf@npm:^2.5.4, rimraf@npm:^2.6.2": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 + languageName: node + linkType: hard + "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -4790,6 +12990,37 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:~2.2.6": + version: 2.2.8 + resolution: "rimraf@npm:2.2.8" + bin: + rimraf: ./bin.js + checksum: 10c0/5d3ce4c1e874d184dbd416371730819f565ae6bd920f61c742a0704d6e23ae2c95f45f0d8bc20a4f9068342101f9c1656906fb086a18497f4a0f03db3c1610fa + languageName: node + linkType: hard + +"rimraf@npm:~2.6.2": + version: 2.6.3 + resolution: "rimraf@npm:2.6.3" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 10c0/f1e646f8c567795f2916aef7aadf685b543da6b9a53e482bb04b07472c7eef2b476045ba1e29f401c301c66b630b22b815ab31fdd60c5e1ae6566ff523debf45 + languageName: node + linkType: hard + +"rollup@npm:^0.36.3": + version: 0.36.4 + resolution: "rollup@npm:0.36.4" + dependencies: + source-map-support: "npm:^0.4.0" + bin: + rollup: ./bin/rollup + checksum: 10c0/600ae5a4f75766d5386c08cea58bc8b9612b0229706f7a1de5b1098c1d85253873e8e926f04b579a38c8ed34add698280f8d058910744cd66b9a0490fa866020 + languageName: node + linkType: hard + "root-workspace-0b6124@workspace:.": version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." @@ -4818,6 +13049,34 @@ __metadata: languageName: node linkType: hard +"rrule@npm:2.4.1": + version: 2.4.1 + resolution: "rrule@npm:2.4.1" + dependencies: + luxon: "npm:^1.3.3" + dependenciesMeta: + luxon: + optional: true + checksum: 10c0/e59b842da4ab1dbd33d669c5fb1c34f629719f4474ccb80f4fec8dbd2fdcecce520bc13430a6a621430d7659940830e1b0ae7d82d919aa85f0c3c03328e95be0 + languageName: node + linkType: hard + +"rsvp@npm:^3.0.13, rsvp@npm:^3.0.17, rsvp@npm:^3.0.18, rsvp@npm:^3.1.0": + version: 3.6.2 + resolution: "rsvp@npm:3.6.2" + checksum: 10c0/258c75eff146821f9c1d438535ed1a95384e4de12dc681647b0fcf9dee594cbb40eb43279ce4eee733fa440bc6a21177042ea137d80dcb386443b35dd904f161 + languageName: node + linkType: hard + +"run-async@npm:^0.1.0": + version: 0.1.0 + resolution: "run-async@npm:0.1.0" + dependencies: + once: "npm:^1.3.0" + checksum: 10c0/059e76d49f56d30e71e6baab6844bb8729889d0e28b4a2e586e8bb18163cc71c7aba16172ab77ae40f3f0a63bb502babdb71907277e9b8aac3ecd7498f5a0c41 + languageName: node + linkType: hard + "run-async@npm:^2.3.0, run-async@npm:^2.4.0": version: 2.4.1 resolution: "run-async@npm:2.4.1" @@ -4834,6 +13093,13 @@ __metadata: languageName: node linkType: hard +"rx-lite@npm:^3.1.2": + version: 3.1.2 + resolution: "rx-lite@npm:3.1.2" + checksum: 10c0/be2ce693f96cfe0b6dc2a5bb1fe28613edd0226238043f783facf97c76e91cde46c2f25a1b18337c97f27bba610d696d96b55040ba7a10088480902ba179fa03 + languageName: node + linkType: hard + "rxjs@npm:^6.5.3": version: 6.6.7 resolution: "rxjs@npm:6.6.7" @@ -4864,13 +13130,43 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + has-symbols: "npm:^1.1.0" + isarray: "npm:^2.0.5" + checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d + languageName: node + linkType: hard + +"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 languageName: node linkType: hard +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 + languageName: node + linkType: hard + "safe-regex-test@npm:^1.0.0": version: 1.0.0 resolution: "safe-regex-test@npm:1.0.0" @@ -4882,13 +13178,58 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 + languageName: node + linkType: hard + +"safe-regex@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex@npm:1.1.0" + dependencies: + ret: "npm:~0.1.10" + checksum: 10c0/547d58aa5184cbef368fd5ed5f28d20f911614748c5da6b35f53fd6626396707587251e6e3d1e3010fd3ff1212e413841b8825eaa5f317017ca62a30899af31a + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 languageName: node linkType: hard +"sax@npm:>=0.1.1, sax@npm:>=0.6.0": + version: 1.4.4 + resolution: "sax@npm:1.4.4" + checksum: 10c0/acb642f2de02ad6ae157cbf91fb026acea80cdf92e88c0aec2aa350c7db3479f62a7365c34a58e3b70a72ce11fa856a02c38cfd27f49e83c18c9c7e1d52aee55 + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.0.1, semver@npm:^5.0.3, semver@npm:^5.1.0, semver@npm:^5.3.0, semver@npm:^5.5.0, semver@npm:^5.5.1": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + +"semver@npm:^4.3.3": + version: 4.3.6 + resolution: "semver@npm:4.3.6" + bin: + semver: ./bin/semver + checksum: 10c0/d5ee7e9e9672c92428e742de84c11b055f7382fa8442b26e4673959d03f3642d468d291980b8661c537ebfce61a5b25ebe3e92f2debf1ce582bffe57b8beb945 + languageName: node + linkType: hard + "semver@npm:^6.0.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -4907,6 +13248,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.3.2, semver@npm:^7.5.3, semver@npm:^7.7.3": + version: 7.7.3 + resolution: "semver@npm:7.7.3" + bin: + semver: bin/semver.js + checksum: 10c0/4afe5c986567db82f44c8c6faef8fe9df2a9b1d98098fc1721f57c696c4c21cebd572f297fc21002f81889492345b8470473bc6f4aff5fb032a6ea59ea2bc45e + languageName: node + linkType: hard + "semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" @@ -4918,6 +13268,18 @@ __metadata: languageName: node linkType: hard +"send@npm:0.1.4": + version: 0.1.4 + resolution: "send@npm:0.1.4" + dependencies: + debug: "npm:*" + fresh: "npm:0.2.0" + mime: "npm:~1.2.9" + range-parser: "npm:0.0.4" + checksum: 10c0/bb51605f6a8889c74dac1ac43f09961eb5e79ff083338aa265c8c50c590483431d2f45a8bb62a847ade9678a12f0b46c67eee2cb0287e4da181a189fb02fb29e + languageName: node + linkType: hard + "send@npm:0.19.0": version: 0.19.0 resolution: "send@npm:0.19.0" @@ -4939,6 +13301,36 @@ __metadata: languageName: node linkType: hard +"send@npm:~0.19.0, send@npm:~0.19.1": + version: 0.19.2 + resolution: "send@npm:0.19.2" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.1" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:~2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:~2.0.2" + checksum: 10c0/20c2389fe0fdf3fc499938cac598bc32272287e993c4960717381a10de8550028feadfb9076f959a3a3ebdea42e1f690e116f0d16468fa56b9fd41866d3dc267 + languageName: node + linkType: hard + +"serialize-error@npm:^7.0.1": + version: 7.0.1 + resolution: "serialize-error@npm:7.0.1" + dependencies: + type-fest: "npm:^0.13.1" + checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + languageName: node + linkType: hard + "serve-static@npm:1.16.2": version: 1.16.2 resolution: "serve-static@npm:1.16.2" @@ -4951,6 +13343,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:~1.16.2": + version: 1.16.3 + resolution: "serve-static@npm:1.16.3" + dependencies: + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:~0.19.1" + checksum: 10c0/36320397a073c71bedf58af48a4a100fe6d93f07459af4d6f08b9a7217c04ce2a4939e0effd842dc7bece93ffcd59eb52f58c4fff2a8e002dc29ae6b219cd42b + languageName: node + linkType: hard + "server-destroy@npm:^1.0.1": version: 1.0.1 resolution: "server-destroy@npm:1.0.1" @@ -4958,7 +13362,34 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.2.1": +"ses@npm:^0.18.8": + version: 0.18.8 + resolution: "ses@npm:0.18.8" + dependencies: + "@endo/env-options": "npm:^0.1.4" + checksum: 10c0/2c5c5e40f6a8edee081e1c62b65316128823070a68858c6ee45810fb14464d14a9f82499bf4d1cb274b46e35e199f7c55565755236a708d25ace493da206083f + languageName: node + linkType: hard + +"ses@npm:^1.14.0": + version: 1.14.0 + resolution: "ses@npm:1.14.0" + dependencies: + "@endo/cache-map": "npm:^1.1.0" + "@endo/env-options": "npm:^1.1.11" + "@endo/immutable-arraybuffer": "npm:^1.1.2" + checksum: 10c0/51336ab196e2211bb576ef72ef762a5a6f11f45db35b301a9176085116c17c02674d42e340fc76d9ac0d5b3dcabdfdc0c00c2386858960544386b5befd31324d + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.1, set-function-length@npm:^1.2.2": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" dependencies: @@ -4972,13 +13403,148 @@ __metadata: languageName: node linkType: hard -"setprototypeof@npm:1.2.0": +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a + languageName: node + linkType: hard + +"set-value@npm:^2.0.0, set-value@npm:^2.0.1": + version: 2.0.1 + resolution: "set-value@npm:2.0.1" + dependencies: + extend-shallow: "npm:^2.0.1" + is-extendable: "npm:^0.1.1" + is-plain-object: "npm:^2.0.3" + split-string: "npm:^3.0.1" + checksum: 10c0/4c40573c4f6540456e4b38b95f570272c4cfbe1d12890ad4057886da8535047cd772dfadf5b58e2e87aa244dfb4c57e3586f6716b976fc47c5144b6b09e1811b + languageName: node + linkType: hard + +"setimmediate@npm:^1.0.5, setimmediate@npm:~1.0.4": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0, setprototypeof@npm:~1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc languageName: node linkType: hard +"sharp@npm:^0.34.5": + version: 0.34.5 + resolution: "sharp@npm:0.34.5" + dependencies: + "@img/colour": "npm:^1.0.0" + "@img/sharp-darwin-arm64": "npm:0.34.5" + "@img/sharp-darwin-x64": "npm:0.34.5" + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + "@img/sharp-linux-arm": "npm:0.34.5" + "@img/sharp-linux-arm64": "npm:0.34.5" + "@img/sharp-linux-ppc64": "npm:0.34.5" + "@img/sharp-linux-riscv64": "npm:0.34.5" + "@img/sharp-linux-s390x": "npm:0.34.5" + "@img/sharp-linux-x64": "npm:0.34.5" + "@img/sharp-linuxmusl-arm64": "npm:0.34.5" + "@img/sharp-linuxmusl-x64": "npm:0.34.5" + "@img/sharp-wasm32": "npm:0.34.5" + "@img/sharp-win32-arm64": "npm:0.34.5" + "@img/sharp-win32-ia32": "npm:0.34.5" + "@img/sharp-win32-x64": "npm:0.34.5" + detect-libc: "npm:^2.1.2" + semver: "npm:^7.7.3" + dependenciesMeta: + "@img/sharp-darwin-arm64": + optional: true + "@img/sharp-darwin-x64": + optional: true + "@img/sharp-libvips-darwin-arm64": + optional: true + "@img/sharp-libvips-darwin-x64": + optional: true + "@img/sharp-libvips-linux-arm": + optional: true + "@img/sharp-libvips-linux-arm64": + optional: true + "@img/sharp-libvips-linux-ppc64": + optional: true + "@img/sharp-libvips-linux-riscv64": + optional: true + "@img/sharp-libvips-linux-s390x": + optional: true + "@img/sharp-libvips-linux-x64": + optional: true + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + "@img/sharp-libvips-linuxmusl-x64": + optional: true + "@img/sharp-linux-arm": + optional: true + "@img/sharp-linux-arm64": + optional: true + "@img/sharp-linux-ppc64": + optional: true + "@img/sharp-linux-riscv64": + optional: true + "@img/sharp-linux-s390x": + optional: true + "@img/sharp-linux-x64": + optional: true + "@img/sharp-linuxmusl-arm64": + optional: true + "@img/sharp-linuxmusl-x64": + optional: true + "@img/sharp-wasm32": + optional: true + "@img/sharp-win32-arm64": + optional: true + "@img/sharp-win32-ia32": + optional: true + "@img/sharp-win32-x64": + optional: true + checksum: 10c0/fd79e29df0597a7d5704b8461c51f944ead91a5243691697be6e8243b966402beda53ddc6f0a53b96ea3cb8221f0b244aa588114d3ebf8734fb4aefd41ab802f + languageName: node + linkType: hard + +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: "npm:^1.0.0" + checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -4988,6 +13554,13 @@ __metadata: languageName: node linkType: hard +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 + languageName: node + linkType: hard + "shebang-regex@npm:^3.0.0": version: 3.0.0 resolution: "shebang-regex@npm:3.0.0" @@ -4995,6 +13568,70 @@ __metadata: languageName: node linkType: hard +"shell-quote@npm:^1.6.1": + version: 1.8.3 + resolution: "shell-quote@npm:1.8.3" + checksum: 10c0/bee87c34e1e986cfb4c30846b8e6327d18874f10b535699866f368ade11ea4ee45433d97bf5eada22c4320c27df79c3a6a7eb1bf3ecfc47f2c997d9e5e2672fd + languageName: node + linkType: hard + +"shelljs@npm:^0.6.0": + version: 0.6.1 + resolution: "shelljs@npm:0.6.1" + bin: + shjs: ./bin/shjs + checksum: 10c0/812f4b50b4c3f6f94f6a6e08bd6d5828bc8b6bb619a7681d4ced67bf4ce0989ec91d30fd3c87a5661884d94afae639a3db2e4a0d8f18f725a3d048cad35c827a + languageName: node + linkType: hard + +"shelljs@npm:^0.8.4": + version: 0.8.5 + resolution: "shelljs@npm:0.8.5" + dependencies: + glob: "npm:^7.0.0" + interpret: "npm:^1.0.0" + rechoir: "npm:^0.6.2" + bin: + shjs: bin/shjs + checksum: 10c0/feb25289a12e4bcd04c40ddfab51aff98a3729f5c2602d5b1a1b95f6819ec7804ac8147ebd8d9a85dfab69d501bcf92d7acef03247320f51c1552cec8d8e2382 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + "side-channel@npm:^1.0.4": version: 1.0.4 resolution: "side-channel@npm:1.0.4" @@ -5018,7 +13655,27 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.2": +"side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 + languageName: node + linkType: hard + +"sigmund@npm:~1.0.0": + version: 1.0.1 + resolution: "sigmund@npm:1.0.1" + checksum: 10c0/0cc9cf0acf4ee1e29bc324ec60b81865c30c4cf6738c6677646b101df1b1b1663759106d96de4199648e5fff3d1d2468ba06ec437cfcef16ee8ff19133fcbb9d + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 @@ -5050,6 +13707,29 @@ __metadata: languageName: node linkType: hard +"single-line-log@npm:^1.1.2": + version: 1.1.2 + resolution: "single-line-log@npm:1.1.2" + dependencies: + string-width: "npm:^1.0.1" + checksum: 10c0/aee9b9cc55b40fa10e476ab718c5ecd3050a2086723acb7a34552793b24b7c7867095eb718528762be3df44e079d21b1a894c7bcee8cef1965fb3dd18a742722 + languageName: node + linkType: hard + +"slash@npm:^1.0.0": + version: 1.0.0 + resolution: "slash@npm:1.0.0" + checksum: 10c0/3944659885d905480f98810542fd314f3e1006eaad25ec78227a7835a469d9ed66fc3dd90abc7377dd2e71f4b5473e8f766bd08198fdd25152a80792e9ed464c + languageName: node + linkType: hard + +"slash@npm:^2.0.0": + version: 2.0.0 + resolution: "slash@npm:2.0.0" + checksum: 10c0/f83dbd3cb62c41bb8fcbbc6bf5473f3234b97fa1d008f571710a9d3757a28c7169e1811cad1554ccb1cc531460b3d221c9a7b37f549398d9a30707f0a5af9193 + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -5057,6 +13737,31 @@ __metadata: languageName: node linkType: hard +"slash@npm:^4.0.0": + version: 4.0.0 + resolution: "slash@npm:4.0.0" + checksum: 10c0/b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 + languageName: node + linkType: hard + +"slice-ansi@npm:0.0.4": + version: 0.0.4 + resolution: "slice-ansi@npm:0.0.4" + checksum: 10c0/997d4cc73e34aa8c0f60bdb71701b16c062cc4acd7a95e3b10e8c05d790eb5e735d9b470270dc6f443b1ba21492db7ceb849d5c93011d1256061bf7ed7216c7a + languageName: node + linkType: hard + +"slice-ansi@npm:^2.1.0": + version: 2.1.0 + resolution: "slice-ansi@npm:2.1.0" + dependencies: + ansi-styles: "npm:^3.2.0" + astral-regex: "npm:^1.0.0" + is-fullwidth-code-point: "npm:^2.0.0" + checksum: 10c0/c317b21ec9e3d3968f3d5b548cbfc2eae331f58a03f1352621020799cbe695b3611ee972726f8f32d4ca530065a5ec9c74c97fde711c1f41b4a1585876b2c191 + languageName: node + linkType: hard + "slice-ansi@npm:^4.0.0": version: 4.0.0 resolution: "slice-ansi@npm:4.0.0" @@ -5078,6 +13783,20 @@ __metadata: languageName: node linkType: hard +"sliced@npm:0.0.5": + version: 0.0.5 + resolution: "sliced@npm:0.0.5" + checksum: 10c0/1a8683977646495563809d12841d0e0bb58b10fd42ca3a7fec30e1c1308c3a2b3aaa23f2bb21c99cb10b3a43b6e556bd98b74dda05e7bcb6d4be26e5a601a066 + languageName: node + linkType: hard + +"sliced@npm:1.0.1": + version: 1.0.1 + resolution: "sliced@npm:1.0.1" + checksum: 10c0/42f93fdc87b79492704d6af45efaafe407384812467514f6763ec823fedb32f7cbe8addd85bfebc6eff094f79fab899225b82690ab57c62d1959c4f6bbc6f5b1 + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -5085,6 +13804,42 @@ __metadata: languageName: node linkType: hard +"snapdragon-node@npm:^2.0.1": + version: 2.1.1 + resolution: "snapdragon-node@npm:2.1.1" + dependencies: + define-property: "npm:^1.0.0" + isobject: "npm:^3.0.0" + snapdragon-util: "npm:^3.0.1" + checksum: 10c0/7616e6a1ca054afe3ad8defda17ebe4c73b0800d2e0efd635c44ee1b286f8ac7900517314b5330862ce99b28cd2782348ee78bae573ff0f55832ad81d9657f3f + languageName: node + linkType: hard + +"snapdragon-util@npm:^3.0.1": + version: 3.0.1 + resolution: "snapdragon-util@npm:3.0.1" + dependencies: + kind-of: "npm:^3.2.0" + checksum: 10c0/4441856d343399ba7f37f79681949d51b922e290fcc07e7bc94655a50f584befa4fb08f40c3471cd160e004660161964d8ff140cba49baa59aa6caba774240e3 + languageName: node + linkType: hard + +"snapdragon@npm:^0.8.1": + version: 0.8.2 + resolution: "snapdragon@npm:0.8.2" + dependencies: + base: "npm:^0.11.1" + debug: "npm:^2.2.0" + define-property: "npm:^0.2.5" + extend-shallow: "npm:^2.0.1" + map-cache: "npm:^0.2.2" + source-map: "npm:^0.5.6" + source-map-resolve: "npm:^0.5.0" + use: "npm:^3.1.0" + checksum: 10c0/dfdac1f73d47152d72fc07f4322da09bbddfa31c1c9c3ae7346f252f778c45afa5b03e90813332f02f04f6de8003b34a168c456f8bb719024d092f932520ffca + languageName: node + linkType: hard + "socks-proxy-agent@npm:^8.0.3": version: 8.0.4 resolution: "socks-proxy-agent@npm:8.0.4" @@ -5106,6 +13861,69 @@ __metadata: languageName: node linkType: hard +"sort-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "sort-keys@npm:2.0.0" + dependencies: + is-plain-obj: "npm:^1.0.0" + checksum: 10c0/c11a6313995cb67ccf35fed4b1f6734176cc1d1e350ee311c061a2340ada4f7e23b046db064d518b63adba98c0f763739920c59fb4659a0b8482ec7a1f255081 + languageName: node + linkType: hard + +"source-map-resolve@npm:^0.5.0": + version: 0.5.3 + resolution: "source-map-resolve@npm:0.5.3" + dependencies: + atob: "npm:^2.1.2" + decode-uri-component: "npm:^0.2.0" + resolve-url: "npm:^0.2.1" + source-map-url: "npm:^0.4.0" + urix: "npm:^0.1.0" + checksum: 10c0/410acbe93882e058858d4c1297be61da3e1533f95f25b95903edddc1fb719654e705663644677542d1fb78a66390238fad1a57115fc958a0724cf9bb509caf57 + languageName: node + linkType: hard + +"source-map-support@npm:^0.4.0, source-map-support@npm:^0.4.15": + version: 0.4.18 + resolution: "source-map-support@npm:0.4.18" + dependencies: + source-map: "npm:^0.5.6" + checksum: 10c0/cd9f0309c1632b1e01a7715a009e0b036d565f3af8930fa8cda2a06aeec05ad1d86180e743b7e1f02cc3c97abe8b6d8de7c3878c2d8e01e86e17f876f7ecf98e + languageName: node + linkType: hard + +"source-map-support@npm:~0.2.8": + version: 0.2.10 + resolution: "source-map-support@npm:0.2.10" + dependencies: + source-map: "npm:0.1.32" + checksum: 10c0/692f7987e0b03f6c58e9a870353e0b2de7d6ee47dabf659d96dc15d13d91f738de99df7397e500eee435d54e2137c28be0ff1090a7a20d838fc6fd8fa7a07642 + languageName: node + linkType: hard + +"source-map-url@npm:^0.4.0": + version: 0.4.1 + resolution: "source-map-url@npm:0.4.1" + checksum: 10c0/f8af0678500d536c7f643e32094d6718a4070ab4ca2d2326532512cfbe2d5d25a45849b4b385879326f2d7523bb3b686d0360dd347a3cda09fd89a5c28d4bc58 + languageName: node + linkType: hard + +"source-map@npm:0.1.32": + version: 0.1.32 + resolution: "source-map@npm:0.1.32" + dependencies: + amdefine: "npm:>=0.0.4" + checksum: 10c0/e1040d238f23fc234214aff4e4fd4662e50732cb73a0a804eeec24c93979e5fb227c062805ea032aa94569ccd5d42eebb88e12d67069c181148f863f8456901b + languageName: node + linkType: hard + +"source-map@npm:^0.5.3, source-map@npm:^0.5.6, source-map@npm:^0.5.7, source-map@npm:~0.5.1": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + "spdx-correct@npm:^3.0.0": version: 3.2.0 resolution: "spdx-correct@npm:3.2.0" @@ -5140,6 +13958,13 @@ __metadata: languageName: node linkType: hard +"speedometer@npm:~0.1.2": + version: 0.1.4 + resolution: "speedometer@npm:0.1.4" + checksum: 10c0/27830c0d8ec5b4443cbdca8cd934ce7c7a6a4466d407dc10157e6f7d9c53ff9bb599cbf9cd8d28eeb21db35198709aee2c10b54051a3442bc727bad06f2f3b46 + languageName: node + linkType: hard + "split-lines@npm:^3.0.0": version: 3.0.0 resolution: "split-lines@npm:3.0.0" @@ -5147,6 +13972,42 @@ __metadata: languageName: node linkType: hard +"split-string@npm:^3.0.1, split-string@npm:^3.0.2": + version: 3.1.0 + resolution: "split-string@npm:3.1.0" + dependencies: + extend-shallow: "npm:^3.0.0" + checksum: 10c0/72d7cd625445c7af215130e1e2bc183013bb9dd48a074eda1d35741e2b0dcb355e6df5b5558a62543a24dcec37dd1d6eb7a6228ff510d3c9de0f3dc1d1da8a70 + languageName: node + linkType: hard + +"split2@npm:^2.0.1": + version: 2.2.0 + resolution: "split2@npm:2.2.0" + dependencies: + through2: "npm:^2.0.2" + checksum: 10c0/c844ed7b02ef29435c726de4cf5617d3d31f61ec3028ae89b8eae223609197f6daefde5269e893e65ee0745b0d250f329d65454b984ca1f5c3b1dd577b17c991 + languageName: node + linkType: hard + +"split@npm:0.3": + version: 0.3.3 + resolution: "split@npm:0.3.3" + dependencies: + through: "npm:2" + checksum: 10c0/88c09b1b4de84953bf5d6c153123a1fbb20addfea9381f70d27b4eb6b2bfbadf25d313f8f5d3fd727d5679b97bfe54da04766b91010f131635bf49e51d5db3fc + languageName: node + linkType: hard + +"split@npm:^1.0.1": + version: 1.0.1 + resolution: "split@npm:1.0.1" + dependencies: + through: "npm:2" + checksum: 10c0/7f489e7ed5ff8a2e43295f30a5197ffcb2d6202c9cf99357f9690d645b19c812bccf0be3ff336fea5054cda17ac96b91d67147d95dbfc31fbb5804c61962af85 + languageName: node + linkType: hard + "sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" @@ -5161,6 +14022,34 @@ __metadata: languageName: node linkType: hard +"sqlstring@npm:2.3.1": + version: 2.3.1 + resolution: "sqlstring@npm:2.3.1" + checksum: 10c0/8c188effb480ca810f5a2c74deb034b99f5831aa1acfb372fab7029172e0e1f5add19195ad82416d3fd88a0646317a4d15a31e012d7b02da20f5e7e173deee24 + languageName: node + linkType: hard + +"sshpk@npm:^1.7.0": + version: 1.18.0 + resolution: "sshpk@npm:1.18.0" + dependencies: + asn1: "npm:~0.2.3" + assert-plus: "npm:^1.0.0" + bcrypt-pbkdf: "npm:^1.0.0" + dashdash: "npm:^1.12.0" + ecc-jsbn: "npm:~0.1.1" + getpass: "npm:^0.1.1" + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.0.2" + tweetnacl: "npm:~0.14.0" + bin: + sshpk-conv: bin/sshpk-conv + sshpk-sign: bin/sshpk-sign + sshpk-verify: bin/sshpk-verify + checksum: 10c0/e516e34fa981cfceef45fd2e947772cc70dbd57523e5c608e2cd73752ba7f8a99a04df7c3ed751588e8d91956b6f16531590b35d3489980d1c54c38bebcd41b1 + languageName: node + linkType: hard + "ssri@npm:^10.0.0": version: 10.0.6 resolution: "ssri@npm:10.0.6" @@ -5170,6 +14059,25 @@ __metadata: languageName: node linkType: hard +"stack-utils@npm:^2.0.6": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"static-extend@npm:^0.1.1": + version: 0.1.2 + resolution: "static-extend@npm:0.1.2" + dependencies: + define-property: "npm:^0.2.5" + object-copy: "npm:^0.1.0" + checksum: 10c0/284f5865a9e19d079f1badbcd70d5f9f82e7a08393f818a220839cd5f71729e89105e1c95322bd28e833161d484cee671380ca443869ae89578eef2bf55c0653 + languageName: node + linkType: hard + "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -5177,6 +14085,13 @@ __metadata: languageName: node linkType: hard +"statuses@npm:~2.0.1, statuses@npm:~2.0.2": + version: 2.0.2 + resolution: "statuses@npm:2.0.2" + checksum: 10c0/a9947d98ad60d01f6b26727570f3bcceb6c8fa789da64fe6889908fe2e294d57503b14bf2b5af7605c2d36647259e856635cd4c49eab41667658ec9d0080ec3f + languageName: node + linkType: hard + "stdin-discarder@npm:^0.1.0": version: 0.1.0 resolution: "stdin-discarder@npm:0.1.0" @@ -5186,7 +14101,52 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.3": +"stop-iteration-iterator@npm:^1.1.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + internal-slot: "npm:^1.1.0" + checksum: 10c0/de4e45706bb4c0354a4b1122a2b8cc45a639e86206807ce0baf390ee9218d3ef181923fa4d2b67443367c491aa255c5fbaa64bb74648e3c5b48299928af86c09 + languageName: node + linkType: hard + +"stream-combiner@npm:^0.2.2": + version: 0.2.2 + resolution: "stream-combiner@npm:0.2.2" + dependencies: + duplexer: "npm:~0.1.1" + through: "npm:~2.3.4" + checksum: 10c0/b5d2782fbfa9251c88e01af1b1f54bc183673a776989dce2842b345be7fc3ce7eb2eade363b3c198ba0e5153a20a96e0014d0d0e884153f885d7ee919f22b639 + languageName: node + linkType: hard + +"stream-combiner@npm:~0.0.4": + version: 0.0.4 + resolution: "stream-combiner@npm:0.0.4" + dependencies: + duplexer: "npm:~0.1.1" + checksum: 10c0/8075a94c0eb0f20450a8236cb99d4ce3ea6e6a4b36d8baa7440b1a08cde6ffd227debadffaecd80993bd334282875d0e927ab5b88484625e01970dd251004ff5 + languageName: node + linkType: hard + +"stream-counter@npm:~0.2.0": + version: 0.2.0 + resolution: "stream-counter@npm:0.2.0" + dependencies: + readable-stream: "npm:~1.1.8" + checksum: 10c0/ac005ba284a61d1e55ef3a106d6703b500c653007ddfa51fe5c965eacdfaf7bbc50c451a7bdfb0bbbb848009deb65816916320caac997a0a7f8470f95d03c58a + languageName: node + linkType: hard + +"strict-uri-encode@npm:^1.0.0": + version: 1.1.0 + resolution: "strict-uri-encode@npm:1.1.0" + checksum: 10c0/eb8a4109ba2588239787389313ba58ec49e043d4c64a1d44716defe5821a68ae49abe0cdefed9946ca9fc2a4af7ecf321da92422b0a67258ec0a3638b053ae62 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -5197,6 +14157,38 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^1.0.1, string-width@npm:^1.0.2": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: "npm:^1.0.0" + is-fullwidth-code-point: "npm:^1.0.0" + strip-ansi: "npm:^3.0.0" + checksum: 10c0/c558438baed23a9ab9370bb6a939acbdb2b2ffc517838d651aad0f5b2b674fb85d460d9b1d0b6a4c210dffd09e3235222d89a5bd4c0c1587f78b2bb7bc00c65e + languageName: node + linkType: hard + +"string-width@npm:^2.0.0, string-width@npm:^2.1.1": + version: 2.1.1 + resolution: "string-width@npm:2.1.1" + dependencies: + is-fullwidth-code-point: "npm:^2.0.0" + strip-ansi: "npm:^4.0.0" + checksum: 10c0/e5f2b169fcf8a4257a399f95d069522f056e92ec97dbdcb9b0cdf14d688b7ca0b1b1439a1c7b9773cd79446cbafd582727279d6bfdd9f8edd306ea5e90e5b610 + languageName: node + linkType: hard + +"string-width@npm:^3.0.0": + version: 3.1.0 + resolution: "string-width@npm:3.1.0" + dependencies: + emoji-regex: "npm:^7.0.1" + is-fullwidth-code-point: "npm:^2.0.0" + strip-ansi: "npm:^5.1.0" + checksum: 10c0/85fa0d4f106e7999bb68c1c640c76fa69fb8c069dab75b009e29c123914e2d3b532e6cfa4b9d1bd913176fc83dedd7a2d7bf40d21a81a8a1978432cedfb65b91 + languageName: node + linkType: hard + "string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" @@ -5208,6 +14200,33 @@ __metadata: languageName: node linkType: hard +"string.prototype.padend@npm:^3.0.0": + version: 3.1.6 + resolution: "string.prototype.padend@npm:3.1.6" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/8f2c8c1f3db1efcdc210668c80c87f2cea1253d6029ff296a172b5e13edc9adebeed4942d023de8d31f9b13b69f3f5d73de7141959b1f09817fba5f527e83be1 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-object-atoms: "npm:^1.0.0" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 + languageName: node + linkType: hard + "string.prototype.trim@npm:^1.2.7": version: 1.2.7 resolution: "string.prototype.trim@npm:1.2.7" @@ -5230,6 +14249,18 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 + languageName: node + linkType: hard + "string.prototype.trimstart@npm:^1.0.6": version: 1.0.6 resolution: "string.prototype.trimstart@npm:1.0.6" @@ -5241,6 +14272,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -5250,6 +14292,22 @@ __metadata: languageName: node linkType: hard +"string_decoder@npm:~0.10.x": + version: 0.10.31 + resolution: "string_decoder@npm:0.10.31" + checksum: 10c0/1c628d78f974aa7539c496029f48e7019acc32487fc695464f9d6bdfec98edd7d933a06b3216bc2016918f6e75074c611d84430a53cb0e43071597d6c1ac5e25 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -5259,6 +14317,33 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": + version: 3.0.1 + resolution: "strip-ansi@npm:3.0.1" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: 10c0/f6e7fbe8e700105dccf7102eae20e4f03477537c74b286fd22cfc970f139002ed6f0d9c10d0e21aa9ed9245e0fa3c9275930e8795c5b947da136e4ecb644a70f + languageName: node + linkType: hard + +"strip-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-ansi@npm:4.0.0" + dependencies: + ansi-regex: "npm:^3.0.0" + checksum: 10c0/d75d9681e0637ea316ddbd7d4d3be010b1895a17e885155e0ed6a39755ae0fd7ef46e14b22162e66a62db122d3a98ab7917794e255532ab461bb0a04feb03e7d + languageName: node + linkType: hard + +"strip-ansi@npm:^5.1.0": + version: 5.2.0 + resolution: "strip-ansi@npm:5.2.0" + dependencies: + ansi-regex: "npm:^4.1.0" + checksum: 10c0/de4658c8a097ce3b15955bc6008f67c0790f85748bdc025b7bc8c52c7aee94bc4f9e50624516150ed173c3db72d851826cd57e7a85fe4e4bb6dbbebd5d297fdf + languageName: node + linkType: hard + "strip-ansi@npm:^7.0.1": version: 7.1.0 resolution: "strip-ansi@npm:7.1.0" @@ -5268,6 +14353,15 @@ __metadata: languageName: node linkType: hard +"strip-bom@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-bom@npm:2.0.0" + dependencies: + is-utf8: "npm:^0.2.0" + checksum: 10c0/4fcbb248af1d5c1f2d710022b7d60245077e7942079bfb7ef3fc8c1ae78d61e96278525ba46719b15ab12fced5c7603777105bc898695339d7c97c64d300ed0b + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -5282,6 +14376,20 @@ __metadata: languageName: node linkType: hard +"strip-eof@npm:^1.0.0": + version: 1.0.0 + resolution: "strip-eof@npm:1.0.0" + checksum: 10c0/f336beed8622f7c1dd02f2cbd8422da9208fae81daf184f73656332899978919d5c0ca84dc6cfc49ad1fc4dd7badcde5412a063cf4e0d7f8ed95a13a63f68f45 + languageName: node + linkType: hard + +"strip-json-comments@npm:2.0.1, strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + "strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -5289,10 +14397,55 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:~2.0.1": - version: 2.0.1 - resolution: "strip-json-comments@npm:2.0.1" - checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 +"strip-json-comments@npm:~1.0.1": + version: 1.0.4 + resolution: "strip-json-comments@npm:1.0.4" + bin: + strip-json-comments: cli.js + checksum: 10c0/8388f352771ea508977f519758cc725670710e388ca24333bf61c7aaf073f40d99961b6b802432787ea5e5e2bf7dcbca9c391d6d7c5774f17495bf567ba08df4 + languageName: node + linkType: hard + +"stubborn-fs@npm:^1.2.5": + version: 1.2.5 + resolution: "stubborn-fs@npm:1.2.5" + checksum: 10c0/0676befd9901d4dd4e162700fa0396f11d523998589cd6b61b06d1021db811dc4c1e6713869748c6cfa49d58beb9b6f0dc5b6aca6b075811b949e1602ce1e26f + languageName: node + linkType: hard + +"sumchecker@npm:^1.2.0": + version: 1.3.1 + resolution: "sumchecker@npm:1.3.1" + dependencies: + debug: "npm:^2.2.0" + es6-promise: "npm:^4.0.5" + checksum: 10c0/5c57d99ed0a3b3ccd3a50c471467b03fcaa6b9843c078c2fcc4c47e17ff233d16eead02efae23366dff92fd5d110712357c68f3a166ecd3fbf2ddfa03d2aef68 + languageName: node + linkType: hard + +"supertap@npm:^3.0.1": + version: 3.0.1 + resolution: "supertap@npm:3.0.1" + dependencies: + indent-string: "npm:^5.0.0" + js-yaml: "npm:^3.14.1" + serialize-error: "npm:^7.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/8164674f2e280cab875f0fef5bb36c15553c13e29697ff92f4e0d6bc62149f0303a89eee47535413ed145ea72e14a24d065bab233059d48a499ec5ebb4566b0f + languageName: node + linkType: hard + +"supports-color@npm:^10.0.0": + version: 10.2.2 + resolution: "supports-color@npm:10.2.2" + checksum: 10c0/fb28dd7e0cdf80afb3f2a41df5e068d60c8b4f97f7140de2eaed5b42e075d82a0e980b20a2c0efd2b6d73cfacb55555285d8cc719fa0472220715aefeaa1da7c + languageName: node + linkType: hard + +"supports-color@npm:^2.0.0": + version: 2.0.0 + resolution: "supports-color@npm:2.0.0" + checksum: 10c0/570e0b63be36cccdd25186350a6cb2eaad332a95ff162fa06d9499982315f2fe4217e69dd98e862fbcd9c81eaff300a825a1fe7bf5cc752e5b84dfed042b0dda languageName: node linkType: hard @@ -5321,6 +14474,73 @@ __metadata: languageName: node linkType: hard +"systemjs-builder@npm:0.15.36, systemjs-builder@npm:^0.15.0": + version: 0.15.36 + resolution: "systemjs-builder@npm:0.15.36" + dependencies: + babel-core: "npm:^6.9.0" + babel-plugin-transform-cjs-system-wrapper: "npm:^0.3.0" + babel-plugin-transform-es2015-modules-systemjs: "npm:^6.6.5" + babel-plugin-transform-global-system-wrapper: "npm:0.0.1" + babel-plugin-transform-system-register: "npm:0.0.1" + bluebird: "npm:^3.3.4" + data-uri-to-buffer: "npm:0.0.4" + es6-template-strings: "npm:^2.0.0" + glob: "npm:^7.0.3" + mkdirp: "npm:^0.5.1" + rollup: "npm:^0.36.3" + source-map: "npm:^0.5.3" + systemjs: "npm:^0.19.43" + traceur: "npm:0.0.105" + uglify-js: "npm:~2.7.5" + checksum: 10c0/3997fdb866dcd94d95644dc3b318d1c7cd7fc9c8d40364b81735864c0d66a2811a5bffd3be1b17b9a11f5b8fb1807ec465ffbf7b5ebf57789f51ce6fbc4c9a3e + languageName: node + linkType: hard + +"systemjs@npm:0.19.46": + version: 0.19.46 + resolution: "systemjs@npm:0.19.46" + dependencies: + when: "npm:^3.7.5" + checksum: 10c0/cec06a2edbf58772f8147b77653afcb20e37c9701236c40f8b981a95cab45e97ad71894ecfd3a6588d77025b0d5b4d6bd2073124471b466cb032ca99017cf7e0 + languageName: node + linkType: hard + +"systemjs@npm:^0.19.43": + version: 0.19.47 + resolution: "systemjs@npm:0.19.47" + dependencies: + when: "npm:^3.7.5" + checksum: 10c0/4ba2529245ae72226836c1c96704974351eeb0b561ff9eb9ee44e327d1ec69d13a23cbaacfeb27624190391432f152a5e17c0a80390492a2f08e687d90cfc62f + languageName: node + linkType: hard + +"table@npm:^3.7.8": + version: 3.8.3 + resolution: "table@npm:3.8.3" + dependencies: + ajv: "npm:^4.7.0" + ajv-keywords: "npm:^1.0.0" + chalk: "npm:^1.1.1" + lodash: "npm:^4.0.0" + slice-ansi: "npm:0.0.4" + string-width: "npm:^2.0.0" + checksum: 10c0/e63dc4a44c173c8bd736bf97843851c8695db345cda7626da5d95908eb933bb5cd8ed2ddff348d3af0f0b26e5dfc7882a44aafcff1b224b269c6e6a8510395d4 + languageName: node + linkType: hard + +"table@npm:^5.0.2": + version: 5.4.6 + resolution: "table@npm:5.4.6" + dependencies: + ajv: "npm:^6.10.2" + lodash: "npm:^4.17.14" + slice-ansi: "npm:^2.1.0" + string-width: "npm:^3.0.0" + checksum: 10c0/87ad7b7cc926aa06e0e2a91a0fb4fcb8b365da87969bc5c74b54cae5d518a089245f44bf80f945ec1aa74c405782db15eeb1dd1926315d842cdc9dbb9371672e + languageName: node + linkType: hard + "table@npm:^6.0.9": version: 6.8.2 resolution: "table@npm:6.8.2" @@ -5359,6 +14579,17 @@ __metadata: languageName: node linkType: hard +"tar@npm:^2.2.1": + version: 2.2.2 + resolution: "tar@npm:2.2.2" + dependencies: + block-stream: "npm:*" + fstream: "npm:^1.0.12" + inherits: "npm:2" + checksum: 10c0/52da9fe8968c091680b697c5eb56762f932d706730b320bd8b4135ca32aaa2c7223bab1113bf33cca92e28964d579588d621ce262edf614c3afbe8a2cd2e1895 + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -5373,20 +14604,97 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0": +"temp-dir@npm:^3.0.0": + version: 3.0.0 + resolution: "temp-dir@npm:3.0.0" + checksum: 10c0/a86978a400984cd5f315b77ebf3fe53bb58c61f192278cafcb1f3fb32d584a21dc8e08b93171d7874b7cc972234d3455c467306cc1bfc4524b622e5ad3bfd671 + languageName: node + linkType: hard + +"temp@npm:0.8.3": + version: 0.8.3 + resolution: "temp@npm:0.8.3" + dependencies: + os-tmpdir: "npm:^1.0.0" + rimraf: "npm:~2.2.6" + checksum: 10c0/649453e503d073f5b8fc7f8a15f3847cbc949a4b41a07e75a43562de1d87a880211f5487b9e7e32ebc8b26140e4907389d22fd1ec74987a4f6c930e8ae9d3dbb + languageName: node + linkType: hard + +"terminal-table@npm:0.0.12": + version: 0.0.12 + resolution: "terminal-table@npm:0.0.12" + dependencies: + colors: "npm:^1.0.3" + eastasianwidth: "npm:^0.1.0" + checksum: 10c0/c447591d5d6457601c5b9939d045e58f49916888139b5a1f1506398088ff770af27e0b43738d862573b946a84669b4357b30e906a0bdac0cd3d6626cece095ea + languageName: node + linkType: hard + +"text-table@npm:^0.2.0, text-table@npm:~0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c languageName: node linkType: hard -"through@npm:^2.3.6": +"throttleit@npm:0.0.2": + version: 0.0.2 + resolution: "throttleit@npm:0.0.2" + checksum: 10c0/173f420a46ed65293b0254912439e2114ab8a6ec3cacb130334eb08c2630ad906954142048ddd8ea23dfb3e2ca0deee279f9d99e4dc1afce63aeaa9a0e8ca1c9 + languageName: node + linkType: hard + +"through2@npm:^2.0.2": + version: 2.0.5 + resolution: "through2@npm:2.0.5" + dependencies: + readable-stream: "npm:~2.3.6" + xtend: "npm:~4.0.1" + checksum: 10c0/cbfe5b57943fa12b4f8c043658c2a00476216d79c014895cef1ac7a1d9a8b31f6b438d0e53eecbb81054b93128324a82ecd59ec1a4f91f01f7ac113dcb14eade + languageName: node + linkType: hard + +"through2@npm:~0.2.3": + version: 0.2.3 + resolution: "through2@npm:0.2.3" + dependencies: + readable-stream: "npm:~1.1.9" + xtend: "npm:~2.1.1" + checksum: 10c0/c1ad571db0b2e483a6cbf30cc6c901221e83eec5cda6023271fc3db515dbde3f6aeaa48471a69000ba4d0809d12d4ce4869bfd223616c4b02816822114030677 + languageName: node + linkType: hard + +"through@npm:2, through@npm:^2.3.6, through@npm:^2.3.8, through@npm:~2.3, through@npm:~2.3.1, through@npm:~2.3.4": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc languageName: node linkType: hard +"time-zone@npm:^1.0.0": + version: 1.0.0 + resolution: "time-zone@npm:1.0.0" + checksum: 10c0/d00ebd885039109011b6e2423ebbf225160927333c2ade6d833e9cc4676db20759f1f3855fafde00d1bd668c243a6aa68938ce71fe58aab0d514e820d59c1d81 + languageName: node + linkType: hard + +"timed-out@npm:^4.0.1": + version: 4.0.1 + resolution: "timed-out@npm:4.0.1" + checksum: 10c0/86f03ffce5b80c5a066e02e59e411d3fbbfcf242b19290ba76817b4180abd1b85558489586b6022b798fb1cf26fc644c0ce0efb9c271d67ec83fada4b9542a56 + languageName: node + linkType: hard + +"tiny-readdir@npm:^2.7.2": + version: 2.7.4 + resolution: "tiny-readdir@npm:2.7.4" + dependencies: + promise-make-counter: "npm:^1.0.2" + checksum: 10c0/d58d5c8ae13440d76a16b3b8515c164143f3d0c0bc98bf3e59da09db99351b8f58c1c9a46b110e454fd25fa4aa49d8927f86a82d449f7713fac2913ef873eaa3 + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -5396,6 +14704,39 @@ __metadata: languageName: node linkType: hard +"tmp@npm:^0.2.4": + version: 0.2.5 + resolution: "tmp@npm:0.2.5" + checksum: 10c0/cee5bb7d674bb4ba3ab3f3841c2ca7e46daeb2109eec395c1ec7329a91d52fcb21032b79ac25161a37b2565c4858fefab927af9735926a113ef7bac9091a6e0e + languageName: node + linkType: hard + +"to-fast-properties@npm:^1.0.3": + version: 1.0.3 + resolution: "to-fast-properties@npm:1.0.3" + checksum: 10c0/78974a4f4528700d18e4c2bbf0b1fb1b19862dcc20a18dc5ed659843dea2dff4f933d167a11d3819865c1191042003aea65f7f035791af9e65d070f2e05af787 + languageName: node + linkType: hard + +"to-object-path@npm:^0.3.0": + version: 0.3.0 + resolution: "to-object-path@npm:0.3.0" + dependencies: + kind-of: "npm:^3.0.2" + checksum: 10c0/731832a977614c03a770363ad2bd9e9c82f233261861724a8e612bb90c705b94b1a290a19f52958e8e179180bb9b71121ed65e245691a421467726f06d1d7fc3 + languageName: node + linkType: hard + +"to-regex-range@npm:^2.1.0": + version: 2.1.1 + resolution: "to-regex-range@npm:2.1.1" + dependencies: + is-number: "npm:^3.0.0" + repeat-string: "npm:^1.6.1" + checksum: 10c0/440d82dbfe0b2e24f36dd8a9467240406ad1499fc8b2b0f547372c22ed1d092ace2a3eb522bb09bfd9c2f39bf1ca42eb78035cf6d2b8c9f5c78da3abc96cd949 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -5405,13 +14746,35 @@ __metadata: languageName: node linkType: hard -"toidentifier@npm:1.0.1": +"to-regex@npm:^3.0.1, to-regex@npm:^3.0.2": + version: 3.0.2 + resolution: "to-regex@npm:3.0.2" + dependencies: + define-property: "npm:^2.0.2" + extend-shallow: "npm:^3.0.2" + regex-not: "npm:^1.0.2" + safe-regex: "npm:^1.1.0" + checksum: 10c0/99d0b8ef397b3f7abed4bac757b0f0bb9f52bfd39167eb7105b144becfaa9a03756892352d01ac6a911f0c1ceef9f81db68c46899521a3eed054082042796120 + languageName: node + linkType: hard + +"toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 languageName: node linkType: hard +"tough-cookie@npm:~2.5.0": + version: 2.5.0 + resolution: "tough-cookie@npm:2.5.0" + dependencies: + psl: "npm:^1.1.28" + punycode: "npm:^2.1.1" + checksum: 10c0/e1cadfb24d40d64ca16de05fa8192bc097b66aeeb2704199b055ff12f450e4f30c927ce250f53d01f39baad18e1c11d66f65e545c5c6269de4c366fafa4c0543 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -5419,6 +14782,35 @@ __metadata: languageName: node linkType: hard +"traceur@npm:0.0.105": + version: 0.0.105 + resolution: "traceur@npm:0.0.105" + dependencies: + commander: "npm:2.9.x" + glob: "npm:5.0.x" + rsvp: "npm:^3.0.13" + semver: "npm:^4.3.3" + source-map-support: "npm:~0.2.8" + bin: + traceur: ./traceur + checksum: 10c0/6904d66ece9d3d7e27d4c84adf9b49355a4d46bc4fc18eb8a3d5a293cd8ae97576b7c4bb16bb60ab08756b4179804c91e0b259b25a4e10e47ec6f686ff2f9048 + languageName: node + linkType: hard + +"traverse@npm:>=0.3.0 <0.4": + version: 0.3.9 + resolution: "traverse@npm:0.3.9" + checksum: 10c0/05f04ff1002f08f19b033187124764e2713186c7a7c0ad88172368df993edc4fa7580e829e252cef6b38375317b69671932ee3820381398a9e375aad3797f607 + languageName: node + linkType: hard + +"trim-right@npm:^1.0.1": + version: 1.0.1 + resolution: "trim-right@npm:1.0.1" + checksum: 10c0/71989ec179c6b42a56e03db68e60190baabf39d32d4e1252fa1501c4e478398ae29d7191beffe015b9d9dc76f04f4b3a946bdb9949ad6b0c0b0c5db65f3eb672 + languageName: node + linkType: hard + "ts-api-utils@npm:^1.0.1": version: 1.0.2 resolution: "ts-api-utils@npm:1.0.2" @@ -5428,6 +14820,44 @@ __metadata: languageName: node linkType: hard +"ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + 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 + 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 + checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + "ts2gas@npm:^4.2.0": version: 4.2.0 resolution: "ts2gas@npm:4.2.0" @@ -5464,6 +14894,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.4.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0, tsutils@npm:~3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -5484,6 +14921,13 @@ __metadata: languageName: node linkType: hard +"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": + version: 0.14.5 + resolution: "tweetnacl@npm:0.14.5" + checksum: 10c0/4612772653512c7bc19e61923fbf42903f5e0389ec76a4a1f17195859d114671ea4aa3b734c2029ce7e1fa7e5cc8b80580f67b071ecf0b46b5636d030a0102a2 + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -5493,6 +14937,22 @@ __metadata: languageName: node linkType: hard +"type-check@npm:~0.3.2": + version: 0.3.2 + resolution: "type-check@npm:0.3.2" + dependencies: + prelude-ls: "npm:~1.1.2" + checksum: 10c0/776217116b2b4e50e368c7ee0c22c0a85e982881c16965b90d52f216bc296d6a52ef74f9202d22158caacc092a7645b0b8d5fe529a96e3fe35d0fb393966c875 + languageName: node + linkType: hard + +"type-fest@npm:^0.13.1": + version: 0.13.1 + resolution: "type-fest@npm:0.13.1" + checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b + languageName: node + linkType: hard + "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" @@ -5531,6 +14991,13 @@ __metadata: languageName: node linkType: hard +"type@npm:^2.7.2": + version: 2.7.3 + resolution: "type@npm:2.7.3" + checksum: 10c0/dec6902c2c42fcb86e3adf8cdabdf80e5ef9de280872b5fd547351e9cca2fe58dd2aa6d2547626ddff174145db272f62d95c7aa7038e27c11315657d781a688d + languageName: node + linkType: hard + "typed-array-buffer@npm:^1.0.0": version: 1.0.0 resolution: "typed-array-buffer@npm:1.0.0" @@ -5542,6 +15009,17 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 + languageName: node + linkType: hard + "typed-array-byte-length@npm:^1.0.0": version: 1.0.0 resolution: "typed-array-byte-length@npm:1.0.0" @@ -5554,6 +15032,19 @@ __metadata: languageName: node linkType: hard +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e + languageName: node + linkType: hard + "typed-array-byte-offset@npm:^1.0.0": version: 1.0.0 resolution: "typed-array-byte-offset@npm:1.0.0" @@ -5567,6 +15058,21 @@ __metadata: languageName: node linkType: hard +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.9" + checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 + languageName: node + linkType: hard + "typed-array-length@npm:^1.0.4": version: 1.0.4 resolution: "typed-array-length@npm:1.0.4" @@ -5578,7 +15084,35 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.4.2, typescript@npm:^4.8.4": +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + reflect.getprototypeof: "npm:^1.0.6" + checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295 + languageName: node + linkType: hard + +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: 10c0/6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 + languageName: node + linkType: hard + +"typescript-compiler@npm:^1.4.1-2": + version: 1.4.1 + resolution: "typescript-compiler@npm:1.4.1" + checksum: 10c0/63a5710e8b6ce97d9f92107131ea5dcecbe244b29edb9aa40475bb04096efa3124c945dd774a572605309366ba0d28b0d2de6959dfb576742b22677d8abd01c6 + languageName: node + linkType: hard + +"typescript@npm:^4.0.5, typescript@npm:^4.1.3, typescript@npm:^4.4.2, typescript@npm:^4.8.4": version: 4.9.5 resolution: "typescript@npm:4.9.5" bin: @@ -5588,7 +15122,17 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~5.1.3": +"typescript@npm:~4.4.4": + version: 4.4.4 + resolution: "typescript@npm:4.4.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/7cd160bbfdf99404238c296db0d56352c7e1d57e367f02640ca36f254f3fa47f74bfc76615e0010c2688a443d9e7403e2d26c79d98ab450d924b17c950732486 + languageName: node + linkType: hard + +"typescript@npm:~5.1.3, typescript@npm:~5.1.6": version: 5.1.6 resolution: "typescript@npm:5.1.6" bin: @@ -5598,7 +15142,17 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^4.4.2#optional!builtin, typescript@patch:typescript@npm%3A^4.8.4#optional!builtin": +"typescript@npm:~5.9.3": + version: 5.9.3 + resolution: "typescript@npm:5.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^4.0.5#optional!builtin, typescript@patch:typescript@npm%3A^4.1.3#optional!builtin, typescript@patch:typescript@npm%3A^4.4.2#optional!builtin, typescript@patch:typescript@npm%3A^4.8.4#optional!builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" bin: @@ -5608,7 +15162,17 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A~5.1.3#optional!builtin": +"typescript@patch:typescript@npm%3A~4.4.4#optional!builtin": + version: 4.4.4 + resolution: "typescript@patch:typescript@npm%3A4.4.4#optional!builtin::version=4.4.4&hash=bbeadb" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/5eb1f150ac8d9a1bf79b971dcabe4158e10666d19733a1e9d36ea6b2c9f60e129889fe02c945b7b863d94749f582e633115a9dcb3c607e435246fdecb957dc27 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A~5.1.3#optional!builtin, typescript@patch:typescript@npm%3A~5.1.6#optional!builtin": version: 5.1.6 resolution: "typescript@patch:typescript@npm%3A5.1.6#optional!builtin::version=5.1.6&hash=5da071" bin: @@ -5618,6 +15182,69 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A~5.9.3#optional!builtin": + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430 + languageName: node + linkType: hard + +"ua-parser-js@npm:^0.7.30": + version: 0.7.41 + resolution: "ua-parser-js@npm:0.7.41" + bin: + ua-parser-js: script/cli.js + checksum: 10c0/b134bc0d8da10c76e07740a0ade61c193fd4c4d120ba2cb2530e26931f6b550dd60b6e801d8891f6d9c23dfebadf5590294739069edff94396f173cc8cc5767e + languageName: node + linkType: hard + +"uglify-js@npm:^2.6.1": + version: 2.8.29 + resolution: "uglify-js@npm:2.8.29" + dependencies: + source-map: "npm:~0.5.1" + uglify-to-browserify: "npm:~1.0.0" + yargs: "npm:~3.10.0" + dependenciesMeta: + uglify-to-browserify: + optional: true + bin: + uglifyjs: bin/uglifyjs + checksum: 10c0/e2e5d67a551975d70aef4b693d369934b4917b17dd2a36270cabd8df884eeb59cb517d9a0a52ca996f11f3b3e202f9563bf620089ffa73d804d08619e338f080 + languageName: node + linkType: hard + +"uglify-js@npm:~2.7.5": + version: 2.7.5 + resolution: "uglify-js@npm:2.7.5" + dependencies: + async: "npm:~0.2.6" + source-map: "npm:~0.5.1" + uglify-to-browserify: "npm:~1.0.0" + yargs: "npm:~3.10.0" + bin: + uglifyjs: bin/uglifyjs + checksum: 10c0/8d067f61e97af65bd2f6fe78e480d6727fe6ccc5a56dbb869d707d2c77bdc6dedca5f93e868c4beb379471c115dceb45e8f48b10bdb3ffad6feeddac06d3f2a2 + languageName: node + linkType: hard + +"uglify-to-browserify@npm:~1.0.0": + version: 1.0.2 + resolution: "uglify-to-browserify@npm:1.0.2" + checksum: 10c0/7927b554c2cbc110f3e6a5f8f5ed430710e72adadd9dc900fc3393b6d67f281048f2dfd1b2da3df9e88b9308b215247688d16337dccd5202d56636173a83ce16 + languageName: node + linkType: hard + +"uid2@npm:0.0.3": + version: 0.0.3 + resolution: "uid2@npm:0.0.3" + checksum: 10c0/b4b1d5b74ec21ccad48f4c91b2e91551020d4d987d3973dbab396537c798b1aba9f2bd64f2347a7dfd70560c19c9df92a163c9375f6dae9aeae9f2903b7f5410 + languageName: node + linkType: hard + "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -5630,6 +15257,67 @@ __metadata: languageName: node linkType: hard +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 + languageName: node + linkType: hard + +"unc-path-regex@npm:^0.1.2": + version: 0.1.2 + resolution: "unc-path-regex@npm:0.1.2" + checksum: 10c0/bf9c781c4e2f38e6613ea17a51072e4b416840fbe6eeb244597ce9b028fac2fb6cfd3dde1f14111b02c245e665dc461aab8168ecc30b14364d02caa37f812996 + languageName: node + linkType: hard + +"underscore@npm:1.8.3": + version: 1.8.3 + resolution: "underscore@npm:1.8.3" + checksum: 10c0/b9f8c5756252e01c057859c4b0932dc0bea73122121bbe465f1e1fa975ca6c3b6a3c8b967b7918d374686f9f1beb96c0d5c5d52788fc1328992bff02dba3599c + languageName: node + linkType: hard + +"undici-types@npm:~7.16.0": + version: 7.16.0 + resolution: "undici-types@npm:7.16.0" + checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a + languageName: node + linkType: hard + +"undici@npm:7.18.2": + version: 7.18.2 + resolution: "undici@npm:7.18.2" + checksum: 10c0/4ff0722799f5e06fde5d1e58d318b1d78ba9a477836ad3e7374e9ac30ca20d1ab3282952d341635bf69b8e74b5c1cf366e595b3a96810e0dbf74e622dad7b5f9 + languageName: node + linkType: hard + +"unenv@npm:2.0.0-rc.24": + version: 2.0.0-rc.24 + resolution: "unenv@npm:2.0.0-rc.24" + dependencies: + pathe: "npm:^2.0.3" + checksum: 10c0/e8556b4287fcf647f23db790eea2782cc79f182370718680e3aba4753d5fb7177abf5d6df489c8f74f7e3ad6cd554b8623cc01caf3e6f2d5548e69178adb1691 + languageName: node + linkType: hard + +"union-value@npm:^1.0.0": + version: 1.0.1 + resolution: "union-value@npm:1.0.1" + dependencies: + arr-union: "npm:^3.1.0" + get-value: "npm:^2.0.6" + is-extendable: "npm:^0.1.1" + set-value: "npm:^2.0.1" + checksum: 10c0/8758d880cb9545f62ce9cfb9b791b2b7a206e0ff5cc4b9d7cd6581da2c6839837fbb45e639cf1fd8eef3cae08c0201b614b7c06dd9f5f70d9dbe7c5fe2fbf592 + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -5648,6 +15336,29 @@ __metadata: languageName: node linkType: hard +"universal-user-agent@npm:^4.0.0": + version: 4.0.1 + resolution: "universal-user-agent@npm:4.0.1" + dependencies: + os-name: "npm:^3.1.0" + checksum: 10c0/e590abd8decb36400d1a630da5957e61f0356492bf413e12f78c169cade915080b03dbfbe8fa62c557bd73413edc681de580ad84488565bf30a9d509fd1b311f + languageName: node + linkType: hard + +"universal-user-agent@npm:^6.0.0": + version: 6.0.1 + resolution: "universal-user-agent@npm:6.0.1" + checksum: 10c0/5c9c46ffe19a975e11e6443640ed4c9e0ce48fcc7203325757a8414ac49940ebb0f4667f2b1fa561489d1eb22cb2d05a0f7c82ec20c5cba42e58e188fb19b187 + languageName: node + linkType: hard + +"universalify@npm:^0.1.0": + version: 0.1.2 + resolution: "universalify@npm:0.1.2" + checksum: 10c0/e70e0339f6b36f34c9816f6bf9662372bd241714dc77508d231d08386d94f2c4aa1ba1318614f92015f40d45aae1b9075cd30bd490efbe39387b60a76ca3f045 + languageName: node + linkType: hard + "universalify@npm:^2.0.0": version: 2.0.0 resolution: "universalify@npm:2.0.0" @@ -5662,6 +15373,33 @@ __metadata: languageName: node linkType: hard +"unset-value@npm:^1.0.0": + version: 1.0.0 + resolution: "unset-value@npm:1.0.0" + dependencies: + has-value: "npm:^0.3.1" + isobject: "npm:^3.0.0" + checksum: 10c0/68a796dde4a373afdbf017de64f08490a3573ebee549136da0b3a2245299e7f65f647ef70dc13c4ac7f47b12fba4de1646fa0967a365638578fedce02b9c0b1f + languageName: node + linkType: hard + +"unzipper@npm:^0.9.3": + version: 0.9.15 + resolution: "unzipper@npm:0.9.15" + dependencies: + big-integer: "npm:^1.6.17" + binary: "npm:~0.3.0" + bluebird: "npm:~3.4.1" + buffer-indexof-polyfill: "npm:~1.0.0" + duplexer2: "npm:~0.1.4" + fstream: "npm:^1.0.12" + listenercount: "npm:~1.0.1" + readable-stream: "npm:~2.3.6" + setimmediate: "npm:~1.0.4" + checksum: 10c0/9a7ca4e36ce1c99dbd111d51cd50bdd7872f1ab5213aa5fbc43787e00ffbad0ea73d24f941affae5619e55af6c30f3c0735c746cb2dbdf45ba7a8fcefaeb6260 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -5671,6 +15409,22 @@ __metadata: languageName: node linkType: hard +"urix@npm:^0.1.0": + version: 0.1.0 + resolution: "urix@npm:0.1.0" + checksum: 10c0/264f1b29360c33c0aec5fb9819d7e28f15d1a3b83175d2bcc9131efe8583f459f07364957ae3527f1478659ec5b2d0f1ad401dfb625f73e4d424b3ae35fc5fc0 + languageName: node + linkType: hard + +"url-parse-lax@npm:^3.0.0": + version: 3.0.0 + resolution: "url-parse-lax@npm:3.0.0" + dependencies: + prepend-http: "npm:^2.0.0" + checksum: 10c0/16f918634d41a4fab9e03c5f9702968c9930f7c29aa1a8c19a6dc01f97d02d9b700ab9f47f8da0b9ace6e0c0e99c27848994de1465b494bced6940c653481e55 + languageName: node + linkType: hard + "url-parse@npm:^1.5.10": version: 1.5.10 resolution: "url-parse@npm:1.5.10" @@ -5681,14 +15435,37 @@ __metadata: languageName: node linkType: hard -"url-template@npm:^2.0.8": - version: 2.0.8 - resolution: "url-template@npm:2.0.8" - checksum: 10c0/56a15057eacbcf05d52b0caed8279c8451b3dd9d32856a1fdd91c6dc84dcb1646f12bafc756b7ade62ca5b1564da8efd7baac5add35868bafb43eb024c62805b +"url-template@npm:^2.0.8": + version: 2.0.8 + resolution: "url-template@npm:2.0.8" + checksum: 10c0/56a15057eacbcf05d52b0caed8279c8451b3dd9d32856a1fdd91c6dc84dcb1646f12bafc756b7ade62ca5b1564da8efd7baac5add35868bafb43eb024c62805b + languageName: node + linkType: hard + +"url-to-options@npm:^1.0.1": + version: 1.0.1 + resolution: "url-to-options@npm:1.0.1" + checksum: 10c0/3d8143bbc2ab0ead3cbc0c60803c274847bf69aa3ef8b2b77a7d58b1739de01efbfbcd7d7b15c8b6b540bb266ae10895a50a1477ce2d9895dfa2c67243e39c51 + languageName: node + linkType: hard + +"use@npm:^3.1.0": + version: 3.1.1 + resolution: "use@npm:3.1.1" + checksum: 10c0/75b48673ab80d5139c76922630d5a8a44e72ed58dbaf54dee1b88352d10e1c1c1fc332066c782d8ae9a56503b85d3dc67ff6d2ffbd9821120466d1280ebb6d6e + languageName: node + linkType: hard + +"user-home@npm:^2.0.0": + version: 2.0.0 + resolution: "user-home@npm:2.0.0" + dependencies: + os-homedir: "npm:^1.0.0" + checksum: 10c0/cbcb251c64f0dce8f3a598049afa5dadd42c928f9834c8720227ee17ededa819296582f9964d963974787f00a4d4cd68e90fd69bc5d8df528d666a6882f84b0c languageName: node linkType: hard -"util-deprecate@npm:^1.0.1": +"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 @@ -5702,6 +15479,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^3.3.2": + version: 3.4.0 + resolution: "uuid@npm:3.4.0" + bin: + uuid: ./bin/uuid + checksum: 10c0/1c13950df865c4f506ebfe0a24023571fa80edf2e62364297a537c80af09c618299797bbf2dbac6b1f8ae5ad182ba474b89db61e0e85839683991f7e08795347 + languageName: node + linkType: hard + "uuid@npm:^8.0.0": version: 8.3.2 resolution: "uuid@npm:8.3.2" @@ -5711,6 +15497,22 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^9.0.1": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" + bin: + uuid: dist/bin/uuid + checksum: 10c0/1607dd32ac7fc22f2d8f77051e6a64845c9bce5cd3dd8aa0070c074ec73e666a1f63c7b4e0f4bf2bc8b9d59dc85a15e17807446d9d2b17c8485fbc2147b27f9b + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + "v8-compile-cache@npm:^2.0.3": version: 2.4.0 resolution: "v8-compile-cache@npm:2.4.0" @@ -5735,6 +15537,28 @@ __metadata: languageName: node linkType: hard +"verror@npm:1.10.0": + version: 1.10.0 + resolution: "verror@npm:1.10.0" + dependencies: + assert-plus: "npm:^1.0.0" + core-util-is: "npm:1.0.2" + extsprintf: "npm:^1.2.0" + checksum: 10c0/37ccdf8542b5863c525128908ac80f2b476eed36a32cb944de930ca1e2e78584cc435c4b9b4c68d0fc13a47b45ff364b4be43aa74f8804f9050140f660fb660d + languageName: node + linkType: hard + +"watcher@npm:^2.3.0": + version: 2.3.1 + resolution: "watcher@npm:2.3.1" + dependencies: + dettle: "npm:^1.0.2" + stubborn-fs: "npm:^1.2.5" + tiny-readdir: "npm:^2.7.2" + checksum: 10c0/1349ca8dfd5901bf73a66e3f158f5ed3ec450abd55a98746cb1f4d03dc334f8313f039f422b9a2bc7e4065f6d303a8e0887555e7f2e8f58a0d643cf2cf699d88 + languageName: node + linkType: hard + "wcwidth@npm:^1.0.1": version: 1.0.1 resolution: "wcwidth@npm:1.0.1" @@ -5744,6 +15568,13 @@ __metadata: languageName: node linkType: hard +"web-streams-polyfill@npm:^3.0.3": + version: 3.3.3 + resolution: "web-streams-polyfill@npm:3.3.3" + checksum: 10c0/64e855c47f6c8330b5436147db1c75cb7e7474d924166800e8e2aab5eb6c76aac4981a84261dd2982b3e754490900b99791c80ae1407a9fa0dcff74f82ea3a7f + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -5751,6 +15582,29 @@ __metadata: languageName: node linkType: hard +"webpod@npm:^0": + version: 0.0.2 + resolution: "webpod@npm:0.0.2" + bin: + webpod: dist/index.js + checksum: 10c0/92b5920be7a8a080839221ce70e5d18f5cac86455af9ee20a54e77ee5c577746981c6d70afc2510df15061d3e3ea8c47f9fc36c2be01f47fd7630db1c9e5cba0 + languageName: node + linkType: hard + +"well-known-symbols@npm:^2.0.0": + version: 2.0.0 + resolution: "well-known-symbols@npm:2.0.0" + checksum: 10c0/cb6c12e98877e8952ec28d13ae6f4fdb54ae1cb49b16a728720276dadd76c930e6cb0e174af3a4620054dd2752546f842540122920c6e31410208abd4958ee6b + languageName: node + linkType: hard + +"whatwg-fetch@npm:>=0.10.0": + version: 3.6.20 + resolution: "whatwg-fetch@npm:3.6.20" + checksum: 10c0/fa972dd14091321d38f36a4d062298df58c2248393ef9e8b154493c347c62e2756e25be29c16277396046d6eaa4b11bd174f34e6403fff6aaca9fb30fa1ff46d + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -5761,6 +15615,13 @@ __metadata: languageName: node linkType: hard +"when@npm:^3.7.5": + version: 3.7.8 + resolution: "when@npm:3.7.8" + checksum: 10c0/de42359a40d93d00890be87e6955928c247c026572e5b9ab141e1c62369bfe2832770c1dab00429d5823bc63850d1432de0aa0be963e95f0ca03c03f9a76022d + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.0.2": version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" @@ -5774,6 +15635,66 @@ __metadata: languageName: node linkType: hard +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: "npm:^1.1.0" + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.1.0" + is-finalizationregistry: "npm:^1.1.0" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.2.1" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.1.0" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.16" + checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 + languageName: node + linkType: hard + +"which-module@npm:^1.0.0": + version: 1.0.0 + resolution: "which-module@npm:1.0.0" + checksum: 10c0/ce5088fb12dae0b6d5997b6221342943ff6275c3b2cd9c569f04ec23847c71013d254c6127d531010dccc22c0fc0f8dce2b6ecf6898941a60b576adb2018af22 + languageName: node + linkType: hard + +"which-module@npm:^2.0.0": + version: 2.0.1 + resolution: "which-module@npm:2.0.1" + checksum: 10c0/087038e7992649eaffa6c7a4f3158d5b53b14cf5b6c1f0e043dccfacb1ba179d12f17545d5b85ebd94a42ce280a6fe65d0cbcab70f4fc6daad1dfae85e0e6a3e + languageName: node + linkType: hard + "which-typed-array@npm:^1.1.10, which-typed-array@npm:^1.1.11": version: 1.1.11 resolution: "which-typed-array@npm:1.1.11" @@ -5787,6 +15708,32 @@ __metadata: languageName: node linkType: hard +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": + version: 1.1.20 + resolution: "which-typed-array@npm:1.1.20" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + for-each: "npm:^0.3.5" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/16fcdada95c8afb821cd1117f0ab50b4d8551677ac08187f21d4e444530913c9ffd2dac634f0c1183345f96344b69280f40f9a8bc52164ef409e555567c2604b + languageName: node + linkType: hard + +"which@npm:^1.0.9, which@npm:^1.1.1, which@npm:^1.2.14, which@npm:^1.2.9, which@npm:^1.3.1": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 + languageName: node + linkType: hard + "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -5798,6 +15745,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^3.0.0": + version: 3.0.1 + resolution: "which@npm:3.0.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: bin/which.js + checksum: 10c0/15263b06161a7c377328fd2066cb1f093f5e8a8f429618b63212b5b8847489be7bcab0ab3eb07f3ecc0eda99a5a7ea52105cf5fa8266bedd083cc5a9f6da24f1 + languageName: node + linkType: hard + "which@npm:^4.0.0": version: 4.0.0 resolution: "which@npm:4.0.0" @@ -5809,14 +15767,107 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:^1.2.5": +"window-size@npm:0.1.0": + version: 0.1.0 + resolution: "window-size@npm:0.1.0" + checksum: 10c0/4753f1d55afde8e89f49ab161a5c5bff9a5e025443a751f6e9654168c319cf9e429ac9ed19e12241cdf0fb9d7fdc4af220abd18f05ad8e254899d331f798723e + languageName: node + linkType: hard + +"window-size@npm:^0.2.0": + version: 0.2.0 + resolution: "window-size@npm:0.2.0" + bin: + window-size: cli.js + checksum: 10c0/378c9d7a1c903ca57f08db40dd8960252f566910ea9dea6d8552e9d61cebe9e536dcabc1b5a6edb776eebe8e5bcbcfb5b27ba13fe128625bc2033516acdc95cc + languageName: node + linkType: hard + +"windows-release@npm:^3.1.0": + version: 3.3.3 + resolution: "windows-release@npm:3.3.3" + dependencies: + execa: "npm:^1.0.0" + checksum: 10c0/d81add605d94583724f0e7f4257e5f074cc3e6583b69ff79852cc191fa9e4686412476928adb28799fb27929db7eb1f07b282348ae072c80f6973ea42dc6dc74 + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.5, word-wrap@npm:~1.2.3": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 languageName: node linkType: hard -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wordwrap@npm:0.0.2": + version: 0.0.2 + resolution: "wordwrap@npm:0.0.2" + checksum: 10c0/a697f8d4de35aa5fc09c84756a471a72cf602abcd8f45e132a28b0140369a4abd142676db4daa64632f10472cd7d6fa89daa308914b84ba6a5f43e35b6711501 + languageName: node + linkType: hard + +"wordwrap@npm:~0.0.2": + version: 0.0.3 + resolution: "wordwrap@npm:0.0.3" + checksum: 10c0/b3b212f8b2167091f59bc60929ada2166eb157abb6c8c82e2a705fe5aa5876440c3966ab39eb6c7bcb2ff0ac0c8d9fba726a9c2057b83bd65cdc1858f9d816ce + languageName: node + linkType: hard + +"workerd@npm:1.20260120.0": + version: 1.20260120.0 + resolution: "workerd@npm:1.20260120.0" + dependencies: + "@cloudflare/workerd-darwin-64": "npm:1.20260120.0" + "@cloudflare/workerd-darwin-arm64": "npm:1.20260120.0" + "@cloudflare/workerd-linux-64": "npm:1.20260120.0" + "@cloudflare/workerd-linux-arm64": "npm:1.20260120.0" + "@cloudflare/workerd-windows-64": "npm:1.20260120.0" + dependenciesMeta: + "@cloudflare/workerd-darwin-64": + optional: true + "@cloudflare/workerd-darwin-arm64": + optional: true + "@cloudflare/workerd-linux-64": + optional: true + "@cloudflare/workerd-linux-arm64": + optional: true + "@cloudflare/workerd-windows-64": + optional: true + bin: + workerd: bin/workerd + checksum: 10c0/16af885068618dc1006bc0523528031c1e22dd8ac338d3aefced1cc754511983d82b36dc5135c4f6e39101f0f7fc554a1869aa672d8deb1d2e50b5701c766dd2 + languageName: node + linkType: hard + +"wrangler@npm:^4.59.2": + version: 4.60.0 + resolution: "wrangler@npm:4.60.0" + dependencies: + "@cloudflare/kv-asset-handler": "npm:0.4.2" + "@cloudflare/unenv-preset": "npm:2.11.0" + blake3-wasm: "npm:2.1.5" + esbuild: "npm:0.27.0" + fsevents: "npm:~2.3.2" + miniflare: "npm:4.20260120.0" + path-to-regexp: "npm:6.3.0" + unenv: "npm:2.0.0-rc.24" + workerd: "npm:1.20260120.0" + peerDependencies: + "@cloudflare/workers-types": ^4.20260120.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@cloudflare/workers-types": + optional: true + bin: + wrangler: bin/wrangler.js + wrangler2: bin/wrangler.js + checksum: 10c0/21fd7af6959c168446e5ebb68f62401087502e027d502d0f2940a7fce2745912a0f266f5892cd0b28dacdf768366a53291da298c2024fbf65700059081705571 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" dependencies: @@ -5827,6 +15878,16 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^2.0.0": + version: 2.1.0 + resolution: "wrap-ansi@npm:2.1.0" + dependencies: + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.1" + checksum: 10c0/1a47367eef192fc9ecaf00238bad5de8987c3368082b619ab36c5e2d6d7b0a2aef95a2ca65840be598c56ced5090a3ba487956c7aee0cac7c45017502fa980fb + languageName: node + linkType: hard + "wrap-ansi@npm:^6.0.1": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" @@ -5856,6 +15917,138 @@ __metadata: languageName: node linkType: hard +"write-file-atomic@npm:^5.0.1": + version: 5.0.1 + resolution: "write-file-atomic@npm:5.0.1" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^4.0.1" + checksum: 10c0/e8c850a8e3e74eeadadb8ad23c9d9d63e4e792bd10f4836ed74189ef6e996763959f1249c5650e232f3c77c11169d239cbfc8342fc70f3fe401407d23810505d + languageName: node + linkType: hard + +"write@npm:^0.2.1": + version: 0.2.1 + resolution: "write@npm:0.2.1" + dependencies: + mkdirp: "npm:^0.5.1" + checksum: 10c0/9559b4ca2e6641a903dce10789c7491669e320fab5d503676b86d9829cdfe4f42a1d3d0a0dc23fb2120853bd2a96e069db30315da433f366ae5de9e477ab3b0a + languageName: node + linkType: hard + +"ws@npm:8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 + languageName: node + linkType: hard + +"ws@npm:^5.2.3": + version: 5.2.4 + resolution: "ws@npm:5.2.4" + dependencies: + async-limiter: "npm:~1.0.0" + checksum: 10c0/14e84e4209f86ab68b01b9ebf42c88f81f26a64ff4886ef65d27c734c9b90b8d7e84712da3c3f7a922a4ab58bf0b96544d32ae28ebbd620fcda3027dd5bc7604 + languageName: node + linkType: hard + +"xkeychain@npm:0.0.6": + version: 0.0.6 + resolution: "xkeychain@npm:0.0.6" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/10dde2e3e29ad2ae3e5c9bde100cb5a61383605cbdc801de54ab5f0dee4f2977783c4fb7e05715140bcf5618e94c20717634fb9e038b51d086433a2f5998ed5b + languageName: node + linkType: hard + +"xml2js@npm:0.1.14": + version: 0.1.14 + resolution: "xml2js@npm:0.1.14" + dependencies: + sax: "npm:>=0.1.1" + checksum: 10c0/d27c8faa3141d94fce66b26647534d6c160dccf2bee70dadad130fef820a287a053a38b0582f3ecd0876f9c564896e9ce681fa283489c8ad6d07c900b348c5c6 + languageName: node + linkType: hard + +"xml2js@npm:^0.4.17, xml2js@npm:^0.4.7": + version: 0.4.23 + resolution: "xml2js@npm:0.4.23" + dependencies: + sax: "npm:>=0.6.0" + xmlbuilder: "npm:~11.0.0" + checksum: 10c0/a3f41c9afc46d5bd0bea4070e5108777b605fd5ce2ebb978a68fd4c75513978ad5939f8135664ffea6f1adb342f391b1ba1584ed7955123b036e9ab8a1d26566 + languageName: node + linkType: hard + +"xml2js@npm:^0.6.2": + version: 0.6.2 + resolution: "xml2js@npm:0.6.2" + dependencies: + sax: "npm:>=0.6.0" + xmlbuilder: "npm:~11.0.0" + checksum: 10c0/e98a84e9c172c556ee2c5afa0fc7161b46919e8b53ab20de140eedea19903ed82f7cd5b1576fb345c84f0a18da1982ddf65908129b58fc3d7cbc658ae232108f + languageName: node + linkType: hard + +"xml@npm:^1.0.0": + version: 1.0.1 + resolution: "xml@npm:1.0.1" + checksum: 10c0/04bcc9b8b5e7b49392072fbd9c6b0f0958bd8e8f8606fee460318e43991349a68cbc5384038d179ff15aef7d222285f69ca0f067f53d071084eb14c7fdb30411 + languageName: node + linkType: hard + +"xmlbuilder@npm:~11.0.0": + version: 11.0.1 + resolution: "xmlbuilder@npm:11.0.1" + checksum: 10c0/74b979f89a0a129926bc786b913459bdbcefa809afaa551c5ab83f89b1915bdaea14c11c759284bb9b931e3b53004dbc2181e21d3ca9553eeb0b2a7b4e40c35b + languageName: node + linkType: hard + +"xtend@npm:^4.0.0, xtend@npm:~4.0.1": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + +"xtend@npm:~2.1.1": + version: 2.1.2 + resolution: "xtend@npm:2.1.2" + dependencies: + object-keys: "npm:~0.4.0" + checksum: 10c0/5b0289152e845041cfcb07d5fb31873a71e4fa9c0279299f9cce0e2a210a0177d071aac48546c998df2a44ff2c19d1cde8a9ab893e27192a0c2061c2837d8cb5 + languageName: node + linkType: hard + +"y18n@npm:^3.2.1": + version: 3.2.2 + resolution: "y18n@npm:3.2.2" + checksum: 10c0/08dc1880f6f766057ed25cd61ef0c7dab3db93639db9a7487a84f75dac7a349dface8dff8d1d8b7bdf50969fcd69ab858ab26b06968b4e4b12ee60d195233c46 + languageName: node + linkType: hard + +"y18n@npm:^3.2.1 || ^4.0.0": + version: 4.0.3 + resolution: "y18n@npm:4.0.3" + checksum: 10c0/308a2efd7cc296ab2c0f3b9284fd4827be01cfeb647b3ba18230e3a416eb1bc887ac050de9f8c4fd9e7856b2e8246e05d190b53c96c5ad8d8cb56dffb6f81024 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" @@ -5863,6 +16056,128 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.2.2, yaml@npm:^2.8.0": + version: 2.8.2 + resolution: "yaml@npm:2.8.2" + bin: + yaml: bin.mjs + checksum: 10c0/703e4dc1e34b324aa66876d63618dcacb9ed49f7e7fe9b70f1e703645be8d640f68ab84f12b86df8ac960bac37acf5513e115de7c970940617ce0343c8c9cd96 + languageName: node + linkType: hard + +"yargs-parser@npm:^11.1.1": + version: 11.1.1 + resolution: "yargs-parser@npm:11.1.1" + dependencies: + camelcase: "npm:^5.0.0" + decamelize: "npm:^1.2.0" + checksum: 10c0/970101d8140b4a28f465e61949e62fd43daca3eaf079682b7873f7372deeba602e3b2ddfb9970480bcf4001e91b849eb9a61e543e604b88d03f734a8749db2c6 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs-parser@npm:^3.2.0": + version: 3.2.0 + resolution: "yargs-parser@npm:3.2.0" + dependencies: + camelcase: "npm:^3.0.0" + lodash.assign: "npm:^4.1.0" + checksum: 10c0/6cfc31e035bfea06a19cd741041473e5f7fd198670cbfdf3dd3db3ae07193d6f1a74f943544e534284a91d7157437a92e9aae5ab5c9d41889c95ff7a9d84b628 + languageName: node + linkType: hard + +"yargs@npm:5.0.0": + version: 5.0.0 + resolution: "yargs@npm:5.0.0" + dependencies: + cliui: "npm:^3.2.0" + decamelize: "npm:^1.1.1" + get-caller-file: "npm:^1.0.1" + lodash.assign: "npm:^4.2.0" + os-locale: "npm:^1.4.0" + read-pkg-up: "npm:^1.0.1" + require-directory: "npm:^2.1.1" + require-main-filename: "npm:^1.0.1" + set-blocking: "npm:^2.0.0" + string-width: "npm:^1.0.2" + which-module: "npm:^1.0.0" + window-size: "npm:^0.2.0" + y18n: "npm:^3.2.1" + yargs-parser: "npm:^3.2.0" + checksum: 10c0/844fe880c392479f36a3290c00670c204e4ffacb1d2ae6a973c9ff88b9a87c0257557e63447445c6edccca98927685315d88fd8bef4e63f2c28a14df7d3e0837 + languageName: node + linkType: hard + +"yargs@npm:^12.0.2": + version: 12.0.5 + resolution: "yargs@npm:12.0.5" + dependencies: + cliui: "npm:^4.0.0" + decamelize: "npm:^1.2.0" + find-up: "npm:^3.0.0" + get-caller-file: "npm:^1.0.1" + os-locale: "npm:^3.0.0" + require-directory: "npm:^2.1.1" + require-main-filename: "npm:^1.0.1" + set-blocking: "npm:^2.0.0" + string-width: "npm:^2.0.0" + which-module: "npm:^2.0.0" + y18n: "npm:^3.2.1 || ^4.0.0" + yargs-parser: "npm:^11.1.1" + checksum: 10c0/4cb2dd471ceb18bcbe5994f25e93ae817a7897966ada8ac9401ded1d1540b05640018d19b49d76ecb40079cbe81c2ae2efe78592c2301bd0bc80808b3b0c70d3 + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yargs@npm:~3.10.0": + version: 3.10.0 + resolution: "yargs@npm:3.10.0" + dependencies: + camelcase: "npm:^1.0.2" + cliui: "npm:^2.1.0" + decamelize: "npm:^1.0.0" + window-size: "npm:0.1.0" + checksum: 10c0/df727126b4e664987c5bb1f346fbde24d2d5e6bd435d081d816f1f5890811ceb82f90ac7e6eb849eae749dde6fe5a2eda2c6f2b22021824976399fb4362413c1 + languageName: node + linkType: hard + +"yauzl@npm:^2.10.0, yauzl@npm:^2.3.1": + version: 2.10.0 + resolution: "yauzl@npm:2.10.0" + dependencies: + buffer-crc32: "npm:~0.2.3" + fd-slicer: "npm:~1.1.0" + checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -5876,3 +16191,67 @@ __metadata: checksum: 10c0/856117aa15cf5103d2a2fb173f0ab4acb12b4b4d0ed3ab249fdbbf612e55d1cadfd27a6110940e24746fb0a78cf640b522cc8bca76f30a3b00b66e90cf82abe0 languageName: node linkType: hard + +"youch-core@npm:^0.3.3": + version: 0.3.3 + resolution: "youch-core@npm:0.3.3" + dependencies: + "@poppinss/exception": "npm:^1.2.2" + error-stack-parser-es: "npm:^1.0.5" + checksum: 10c0/fe101a037a6cfaaa4e80e3d062ff33d4b087b65e3407e65220b453c9b2a66c87ea348a7da0239b61623d929d8fa0a9e139486eaa690ef5605bb49947a2fa82f6 + languageName: node + linkType: hard + +"youch@npm:4.1.0-beta.10": + version: 4.1.0-beta.10 + resolution: "youch@npm:4.1.0-beta.10" + dependencies: + "@poppinss/colors": "npm:^4.1.5" + "@poppinss/dumper": "npm:^0.6.4" + "@speed-highlight/core": "npm:^1.2.7" + cookie: "npm:^1.0.2" + youch-core: "npm:^0.3.3" + checksum: 10c0/588d65aa5837a46c8473cf57a9129115383f57aad5899915d37005950decfefc66bec85b8a1262dbefd623a122c279095074655889317311a554f9c2e290a5b3 + languageName: node + linkType: hard + +"zod@npm:^3.25.76": + version: 3.25.76 + resolution: "zod@npm:3.25.76" + checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c + languageName: node + linkType: hard + +"zongji@npm:0.3.2": + version: 0.3.2 + resolution: "zongji@npm:0.3.2" + dependencies: + mysql: "npm:~2.5.5" + checksum: 10c0/98aa8053bc348ee52b653d1d6283ba50807f84eea5a0fbf2260d9e94935880b707daa8de034cac65e12b79219ad18ad7de73960e14e598afca27a31a68bce84f + languageName: node + linkType: hard + +"zx@npm:^7.0.8": + version: 7.2.4 + resolution: "zx@npm:7.2.4" + dependencies: + "@types/fs-extra": "npm:^11.0.4" + "@types/minimist": "npm:^1.2.5" + "@types/node": "npm:^24.0.3" + "@types/ps-tree": "npm:^1.1.6" + "@types/which": "npm:^3.0.4" + chalk: "npm:^5.4.1" + fs-extra: "npm:^11.3.0" + fx: "npm:*" + globby: "npm:^13.2.2" + minimist: "npm:^1.2.8" + node-fetch: "npm:3.3.2" + ps-tree: "npm:^1.2.0" + webpod: "npm:^0" + which: "npm:^3.0.0" + yaml: "npm:^2.8.0" + bin: + zx: build/cli.js + checksum: 10c0/1ed7c035f0b49d1fa261e06d89c8e450ac7ad7e35b9d7a89234220b80ef879ec86cda2b397060a167924ead476ecfae573230baa9c6c249a6d2f54b822f891f6 + languageName: node + linkType: hard From 63bf5ee18d3fc0c03c2c288342b17b5b9603ab6b Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 23 Jan 2026 17:34:05 -0600 Subject: [PATCH 33/77] build(fincaps): temporarily drop local @endo/cli dev dependency --- packages/fincaps/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/fincaps/package.json b/packages/fincaps/package.json index 085a462..0abd1a3 100644 --- a/packages/fincaps/package.json +++ b/packages/fincaps/package.json @@ -9,7 +9,6 @@ "lint:types": "tsc -p jsconfig.json" }, "devDependencies": { - "@endo/cli": "/home/connolly/projects/endo/packages/cli", "@fast-check/ava": "^1.1.5", "@types/google-spreadsheet": "^4.0.0", "ava": "^5.3.1", From a623c48f0bc2331f23b718ad1916904e414a4f47 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 24 Jan 2026 07:21:15 -0600 Subject: [PATCH 34/77] feat(ertp-ledgerguise): refine ERTP escrow etc. - add better-sqlite3 SqlDatabase shim and expose typed deposit facets - add mockMakeGuid helper and replace ad-hoc GUID counters in tests - move generated JS artifacts out of src/test and ignore dist outputs - refine IssuerKit typing (reserve ERTP name; add NatIssuerKit) - rework escrow-ertp API (give/want, payouts, refunds on failure/cancel, allSettled) - expand escrow-ertp tests (refunds, insufficient offer, cancellation) and DRY setup - add amount helpers in escrow tests (amount, $, fund) and simplify assertions --- packages/ertp-ledgerguise/.gitignore | 1 + packages/ertp-ledgerguise/CONTRIBUTING.md | 24 +- packages/ertp-ledgerguise/src/endo-types.ts | 15 + packages/ertp-ledgerguise/src/ertp-types.ts | 174 +++++++++++ packages/ertp-ledgerguise/src/escrow-ertp.ts | 116 ++++++++ packages/ertp-ledgerguise/src/guids.ts | 9 + packages/ertp-ledgerguise/src/index.ts | 6 +- packages/ertp-ledgerguise/src/purse.ts | 13 +- packages/ertp-ledgerguise/src/sqlite-shim.ts | 35 +++ packages/ertp-ledgerguise/src/types.ts | 8 +- .../ertp-ledgerguise/test/adversarial.test.ts | 72 +++-- .../ertp-ledgerguise/test/community.test.ts | 25 +- .../ertp-ledgerguise/test/escrow-ertp.test.ts | 275 ++++++++++++++++++ packages/ertp-ledgerguise/test/escrow.test.ts | 22 +- .../ertp-ledgerguise/test/ledgerguise.test.ts | 99 +++---- packages/ertp-ledgerguise/tsconfig.json | 5 +- 16 files changed, 768 insertions(+), 131 deletions(-) create mode 100644 packages/ertp-ledgerguise/src/endo-types.ts create mode 100644 packages/ertp-ledgerguise/src/ertp-types.ts create mode 100644 packages/ertp-ledgerguise/src/escrow-ertp.ts create mode 100644 packages/ertp-ledgerguise/src/sqlite-shim.ts create mode 100644 packages/ertp-ledgerguise/test/escrow-ertp.test.ts diff --git a/packages/ertp-ledgerguise/.gitignore b/packages/ertp-ledgerguise/.gitignore index 6ab860d..a9b5cde 100644 --- a/packages/ertp-ledgerguise/.gitignore +++ b/packages/ertp-ledgerguise/.gitignore @@ -1,2 +1,3 @@ community1.db community1.db.*.log +dist/ diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index 27439d9..768f528 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -8,6 +8,20 @@ Thanks for your interest in contributing! This package provides an ERTP facade o - Relevant ERTP note: mint/purse patterns and amount math are treated as stable, foundational properties for escrow reasoning. - Vbank bridge flow: `packages/cosmic-swingset/README-bridge.md` in agoric-sdk (ERTP transfer via vbank). +## Status checklist + +- [ ] Create an ERTP-compatible facade backed by a GnuCash SQLite DB. + - [x] Establish contributor/agent guidance in `CONTRIBUTING` (planning phases, ocap IO injection, freeze API surface, testing discipline). + - [x] Build a minimal ERTP-like API (issuer/brand/purse/payment) mapped to GnuCash accounts/splits. + - [x] Add tests for canonical ERTP flows (Alice->Bob $10), persistence, and adversarial cases. + - [x] Implement escrow semantics in GnuCash (holding account, tx/split rules). + - [x] Add a pure-ERTP escrow module and unit tests (no DB). + - [x] Build the community story/simulation (chart placement, contributions, reports). + - [x] Keep ocap/no-ambient-IO, freeze API surfaces, no CJS, docs aligned to API. + - [x] Restore `lint:types` after changing `tsconfig.json` `lib` to `ESNext` (SqlDatabase type mismatch with better-sqlite3). + - [x] Abstract: define a backend-agnostic SqlDatabase interface for sync sqlite. + - [x] Concrete: add a better-sqlite3 shim and use it in tests. + ## Planning - Brainstorm and write down the initial motivation (ERTP + GnuCash insight). @@ -49,6 +63,15 @@ Thanks for your interest in contributing! This package provides an ERTP facade o - No CommonJS in this package (source, tests, scripts). Use ESM everywhere. - TODO: use full extensions in module specifiers. +## Entry points and structure + +- `src/index.ts`: main facade entry points; table of contents in file header. +- `src/escrow.ts`: GnuCash-backed escrow logic. +- `src/escrow-ertp.ts`: ERTP-only escrow (no DB). +- `src/jessie-tools.ts`: freeze helpers and Nat guard. +- `src/sql/`: schema and SQL helpers. +- `test/`: canonical flow, persistence, adversarial, escrow, and community tests. + ## Agent Tactics the mutable let point is not agent tactics; it's code style. likewise API @@ -111,7 +134,6 @@ Consequences: - Update package docs or README when behavior or public API changes. ## TODO - - Consider Flow B (accrual then payout): record contributor payable before minting. - Consider periodic minting (budgeted supply) vs per-contribution minting. - Consider a read-only openIssuerKit facade with a reduced capability surface: diff --git a/packages/ertp-ledgerguise/src/endo-types.ts b/packages/ertp-ledgerguise/src/endo-types.ts new file mode 100644 index 0000000..0aaebaf --- /dev/null +++ b/packages/ertp-ledgerguise/src/endo-types.ts @@ -0,0 +1,15 @@ +export type Key = unknown; +export type Pattern = unknown; +export const PASS_STYLE = /** @type {'Symbol(passStyle)'} */ ( + /** @type {unknown} */ (Symbol.for('passStyle')) +); +export type RemotableObject = { + [PASS_STYLE]?: string; + [Symbol.toStringTag]?: string; + [key: string]: unknown; + [key: symbol]: unknown; +}; +export type ERef = T | PromiseLike; +export type LatestTopic = unknown; +export type CopySet = Readonly>; +export type CopyBag = Readonly>; diff --git a/packages/ertp-ledgerguise/src/ertp-types.ts b/packages/ertp-ledgerguise/src/ertp-types.ts new file mode 100644 index 0000000..53c1c1d --- /dev/null +++ b/packages/ertp-ledgerguise/src/ertp-types.ts @@ -0,0 +1,174 @@ +import type { + CopyBag, + CopySet, + ERef, + Key, + LatestTopic, + Pattern, + RemotableObject, +} from './endo-types'; + +// #region from @agoric/internal +declare const tag: 'Symbol(tag)'; +type TagContainer = { + readonly [tag]: Token; +}; +type Tag = TagContainer<{ + [K in Token]: TagMetadata; +}>; +type Tagged = Type & + Tag; + +type TypeTag = Tagged; +// #endregion from @agoric/internal + +export type AssetKind = 'nat' | 'set' | 'copySet' | 'copyBag'; + +export type NatAmount = { + brand: Brand<'nat'>; + value: bigint; +}; + +export type SetAmount = { + brand: Brand<'set'>; + value: K[]; +}; + +export type CopySetAmount = { + brand: Brand<'copySet'>; + value: CopySet; +}; + +export type CopyBagAmount = { + brand: Brand<'copyBag'>; + value: CopyBag; +}; + +export type AnyAmount = { + brand: Brand; + value: any; +}; + +export type Amount< + K extends AssetKind = AssetKind, + M extends Key = Key, +> = K extends 'nat' + ? NatAmount + : K extends 'set' + ? SetAmount + : K extends 'copySet' + ? CopySetAmount + : K extends 'copyBag' + ? CopyBagAmount + : AnyAmount; + +export type NatValue = bigint; +export type SetValue = K[]; + +export type AssetValueForKind< + K extends AssetKind, + M extends Key = Key, +> = K extends 'nat' + ? NatValue + : K extends 'set' + ? SetValue + : K extends 'copySet' + ? CopySet + : K extends 'copyBag' + ? CopyBag + : never; + +type BrandMethods = { + isMyIssuer: (allegedIssuer: ERef>) => Promise; + getAllegedName: () => string; + getDisplayInfo: () => DisplayInfo; + getAmountShape: () => Pattern; +}; + +export type Brand = RemotableObject & + BrandMethods; + +type IssuerIsLive = (payment: ERef) => Promise; +type IssuerGetAmountOf = ( + payment: ERef>, +) => Promise>; +type IssuerBurn = ( + payment: ERef, + optAmountShape?: Pattern, +) => Promise; + +type IssuerMethods = { + getBrand: () => Brand; + getAllegedName: () => string; + getAssetKind: () => K; + getDisplayInfo: () => DisplayInfo; + makeEmptyPurse: () => Purse; + isLive: IssuerIsLive; + getAmountOf: IssuerGetAmountOf; + burn: IssuerBurn; +}; + +export type Issuer< + K extends AssetKind = AssetKind, + M extends Key = Key, +> = RemotableObject & IssuerMethods; + +export type Mint = { + getIssuer: () => Issuer; + mintPayment: (newAmount: Amount) => Payment; +}; + +export type IssuerKit = { + mint: Mint; + mintRecoveryPurse: Purse; + issuer: Issuer; + brand: Brand; + displayInfo: DisplayInfo; +}; + +type DepositFacetReceive< + K extends AssetKind = AssetKind, + M extends Key = Key, +> = (payment: Payment, optAmountShape?: Pattern) => Amount; +export type DepositFacet< + K extends AssetKind = AssetKind, + M extends Key = Key, +> = { + receive: DepositFacetReceive; +}; + +export type Purse< + K extends AssetKind = AssetKind, + M extends Key = Key, +> = RemotableObject & PurseMethods; + +type PurseMethods = { + getAllegedBrand: () => Brand; + getCurrentAmount: () => Amount; + getCurrentAmountNotifier: () => LatestTopic>; + deposit:

>( + payment: P, + optAmountShape?: Pattern, + ) => P extends Payment ? Amount : never; + getDepositFacet: () => DepositFacet; + withdraw: (amount: Amount) => Payment; + getRecoverySet: () => CopySet>; + recoverAll: () => Amount; +}; + +export type Payment< + K extends AssetKind = AssetKind, + M extends Key = Key, +> = RemotableObject & + TypeTag< + { + getAllegedBrand: () => Brand; + }, + 'Set-like value type', + M + >; + +export type DisplayInfo = { + decimalPlaces?: number | undefined; + assetKind: K; +}; diff --git a/packages/ertp-ledgerguise/src/escrow-ertp.ts b/packages/ertp-ledgerguise/src/escrow-ertp.ts new file mode 100644 index 0000000..e1a3d3c --- /dev/null +++ b/packages/ertp-ledgerguise/src/escrow-ertp.ts @@ -0,0 +1,116 @@ +/** + * @file ERTP-only escrow exchange adapted from escrow2013.js (no Qjoin, no E). + * @see ./escrow.ts + */ + +import type { AssetKind, DepositFacet, Issuer, Payment, Purse, Amount } from './ertp-types'; +import { defaultZone } from './jessie-tools'; +import type { Zone } from './jessie-tools'; + +type EscrowParty = { + give: Promise>; + want: Amount; + payouts: { + refund: DepositFacet; + want: DepositFacet; + }; + cancellationP: Promise; +}; + +const failOnly = (cancellationP: Promise) => + Promise.resolve(cancellationP).then(cancellation => { + throw cancellation; + }); + +/** + * Create an ERTP-only escrow exchange without vat- or E-based messaging. + */ +export const makeErtpEscrow = < + KindA extends AssetKind = AssetKind, + KindB extends AssetKind = AssetKind, +>({ + issuers, + zone = defaultZone, +}: { + issuers: { A: Issuer; B: Issuer }; + zone?: Zone; +}) => { + const { exo } = zone; + return exo('ErtpEscrow', { + escrowExchange: ( + a: EscrowParty, + b: EscrowParty, + ) => { + const escrows: { A: Purse; B: Purse } = { + A: issuers.A.makeEmptyPurse(), + B: issuers.B.makeEmptyPurse(), + }; + const depositPs = { + A: Promise.resolve(a.give).then(payment => escrows.A.deposit(payment)), + B: Promise.resolve(b.give).then(payment => escrows.B.deposit(payment)), + }; + const depositsP: Promise<{ A: Amount; B: Amount }> = Promise.all([ + depositPs.A, + depositPs.B, + ]).then(([A, B]) => ({ A, B })); + const depositsSettledP: Promise<{ + A: PromiseSettledResult>; + B: PromiseSettledResult>; + }> = Promise.allSettled([depositPs.A, depositPs.B]).then(([A, B]) => ({ A, B })); + const decisionP = Promise.race([ + depositsP, + failOnly(a.cancellationP), + failOnly(b.cancellationP), + ]); + const payoutOne = ( + payout: DepositFacet, + escrow: Purse, + amount: Amount, + ) => Promise.resolve().then(() => payout.receive(escrow.withdraw(amount))); + const assertEnough = (have: Amount, want: Amount, who: string) => { + if (have.brand !== want.brand) { + throw new Error(`amount brand mismatch: ${who}`); + } + if (have.value < want.value) { + throw new Error(`insufficient offer: ${who}`); + } + }; + const payoutBoth = ( + payouts: { A: DepositFacet; B: DepositFacet }, + amounts: { A: Amount; B: Amount }, + ) => + Promise.all([ + payoutOne(payouts.A, escrows.A, amounts.A), + payoutOne(payouts.B, escrows.B, amounts.B), + ]); + return decisionP.then( + amounts => { + try { + assertEnough(amounts.A, b.want, 'party A'); + assertEnough(amounts.B, a.want, 'party B'); + } catch (error) { + return payoutBoth({ A: a.payouts.refund, B: b.payouts.refund }, amounts).then( + () => { + throw error; + }, + ); + } + return payoutBoth({ A: b.payouts.want, B: a.payouts.want }, amounts); + }, + error => + depositsSettledP.then(settled => { + const refunds: Promise[] = []; + if (settled.A.status === 'fulfilled') { + refunds.push(payoutOne(a.payouts.refund, escrows.A, settled.A.value)); + } + if (settled.B.status === 'fulfilled') { + refunds.push(payoutOne(b.payouts.refund, escrows.B, settled.B.value)); + } + return Promise.all(refunds).then(() => { + throw error; + }); + }), + ); + }, + }); +}; diff --git a/packages/ertp-ledgerguise/src/guids.ts b/packages/ertp-ledgerguise/src/guids.ts index d24cf97..0e8fb7e 100644 --- a/packages/ertp-ledgerguise/src/guids.ts +++ b/packages/ertp-ledgerguise/src/guids.ts @@ -7,3 +7,12 @@ export const asGuid = (value: string): Guid => value as Guid; export const makeDeterministicGuid = (seed: string): Guid => asGuid(createHash('sha256').update(seed).digest('hex').slice(0, 32)); + +export const mockMakeGuid = (start: bigint = 0n): (() => Guid) => { + let counter = start; + return () => { + const guid = counter; + counter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; +}; diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 9c498d4..10b23b1 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -7,7 +7,6 @@ * @see openIssuerKit */ -import type { IssuerKit } from '@agoric/ertp'; import type { SqlDatabase } from './sql-db'; import { gcEmptySql } from './sql/gc_empty'; import { defaultZone, Nat } from './jessie-tools'; @@ -18,6 +17,7 @@ import type { AmountLike, CreateIssuerConfig, Guid, + NatIssuerKit, IssuerKitForCommodity, IssuerKitWithPurseGuids, OpenIssuerConfig, @@ -39,10 +39,12 @@ export type { IssuerKitForCommodity, IssuerKitWithGuid, IssuerKitWithPurseGuids, + NatIssuerKit, } from './types'; export { asGuid } from './guids'; export { makeChartFacet } from './chart'; export { makeEscrow } from './escrow'; +export { wrapBetterSqlite3Database } from './sqlite-shim'; export type { SqlDatabase, SqlStatement } from './sql-db'; export type { Zone } from './jessie-tools'; @@ -220,7 +222,7 @@ const makeIssuerKitForCommodity = ({ mint, mintRecoveryPurse, displayInfo, - }) as unknown as IssuerKit; + }) as unknown as NatIssuerKit; const mintInfo = exo('MintInfoAccess', { getMintInfo: () => ({ holdingAccountGuid: balanceAccountGuid, diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index 0684756..266260f 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -54,7 +54,7 @@ export const makePurseFactory = ({ const buildPurse = (accountGuid: Guid, name: string): AccountPurse => { const brand = getBrand(); - const deposit = (payment: object) => { + const deposit = (payment: object, _optAmountShape?: unknown) => { const record = paymentRecords.get(payment); if (!record?.live) throw new Error('payment not live'); Nat(record.amount); @@ -81,7 +81,16 @@ export const makePurseFactory = ({ return makePayment(amount, accountGuid, txGuid, holdingSplitGuid, checkNumber); }; const getCurrentAmount = () => makeAmount(getAccountBalance(db, accountGuid)); - const purse = exo('Purse', { deposit, withdraw, getCurrentAmount }); + const depositFacet = exo('DepositFacet', { + receive: (payment: object, optAmountShape?: unknown) => + deposit(payment, optAmountShape), + }); + const purse = exo('Purse', { + deposit, + withdraw, + getCurrentAmount, + getDepositFacet: () => depositFacet, + }); purseGuids.set(purse, accountGuid); return purse; }; diff --git a/packages/ertp-ledgerguise/src/sqlite-shim.ts b/packages/ertp-ledgerguise/src/sqlite-shim.ts new file mode 100644 index 0000000..60c1dde --- /dev/null +++ b/packages/ertp-ledgerguise/src/sqlite-shim.ts @@ -0,0 +1,35 @@ +import type { Database } from 'better-sqlite3'; +import type { SqlDatabase, SqlStatement } from './sql-db'; + +type BetterSqliteStatement = { + run: (...args: any[]) => unknown; + get: (...args: any[]) => unknown; + all: (...args: any[]) => unknown; +}; + +const wrapStatement = ( + statement: BetterSqliteStatement, +): SqlStatement => { + const call = (method: keyof BetterSqliteStatement, params: unknown[]) => { + if (params.length === 0) { + return statement[method](); + } + if (params.length === 1) { + return statement[method](params[0]); + } + return statement[method](params); + }; + return { + run: (...params: unknown[]) => call('run', params), + get: (...params: unknown[]) => call('get', params) as TRow | undefined, + all: (...params: unknown[]) => call('all', params) as TRow[], + }; +}; + +export const wrapBetterSqlite3Database = (db: Database): SqlDatabase => ({ + exec: (sql: string) => { + db.exec(sql); + }, + prepare: (sql: string) => + wrapStatement(db.prepare(sql) as BetterSqliteStatement), +}); diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index 8759ada..b48d592 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -1,4 +1,4 @@ -import type { IssuerKit } from '@agoric/ertp'; +import type { IssuerKit } from './ertp-types'; import type { SqlDatabase } from './sql-db'; import type { Guid } from './guids'; import type { Zone } from './jessie-tools'; @@ -39,6 +39,8 @@ export type OpenIssuerConfig = { nowMs: () => number; }; +export type NatIssuerKit = IssuerKit<'nat'>; + export type AmountLike = { brand: unknown; value: bigint }; export type AccountPurse = { @@ -53,14 +55,14 @@ export type AccountPurseAccess = { }; export type IssuerKitForCommodity = { - kit: IssuerKit; + kit: NatIssuerKit; accounts: AccountPurseAccess; purseGuids: WeakMap; payments: PaymentAccess; mintInfo: MintInfoAccess; }; -export type IssuerKitWithGuid = IssuerKit & { commodityGuid: Guid }; +export type IssuerKitWithGuid = NatIssuerKit & { commodityGuid: Guid }; export type IssuerKitWithPurseGuids = IssuerKitWithGuid & { purses: { diff --git a/packages/ertp-ledgerguise/test/adversarial.test.ts b/packages/ertp-ledgerguise/test/adversarial.test.ts index 58637a2..7e4be19 100644 --- a/packages/ertp-ledgerguise/test/adversarial.test.ts +++ b/packages/ertp-ledgerguise/test/adversarial.test.ts @@ -5,12 +5,20 @@ import test from 'ava'; import Database from 'better-sqlite3'; -import type { Brand, NatAmount } from '@agoric/ertp'; -import { asGuid, createIssuerKit, initGnuCashSchema, openIssuerKit } from '../src/index'; +import type { Brand, NatAmount } from '../src/ertp-types'; +import { + asGuid, + createIssuerKit, + initGnuCashSchema, + openIssuerKit, + wrapBetterSqlite3Database, +} from '../src/index'; +import { mockMakeGuid } from '../src/guids'; +import type { SqlDatabase } from '../src/sql-db'; import { makeTestClock } from './helpers/clock'; const seedAccountBalance = ( - db: import('better-sqlite3').Database, + db: SqlDatabase, accountGuid: string, commodityGuid: string, amount: bigint, @@ -42,16 +50,12 @@ const seedAccountBalance = ( test('rejects negative withdraw amounts', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS', @@ -68,8 +72,9 @@ test('rejects negative withdraw amounts', t => { test('makeEmptyPurse rejects account GUID collisions', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); const commodityGuid = asGuid('a'.repeat(32)); @@ -94,8 +99,9 @@ test('makeEmptyPurse rejects account GUID collisions', t => { test('createIssuerKit rejects commodity GUID collisions', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); const existingGuid = asGuid('f'.repeat(32)); @@ -121,16 +127,12 @@ test('createIssuerKit rejects commodity GUID collisions', t => { test('withdraw rejects wrong-brand amounts', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const nowMs = makeTestClock(); const bucks = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const credits = freeze({ namespace: 'COMMODITY', mnemonic: 'CREDITS' }); @@ -152,16 +154,12 @@ test('withdraw rejects wrong-brand amounts', t => { test('openAccountPurse rejects wrong-commodity accounts', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const nowMs = makeTestClock(); const bucks = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const credits = freeze({ namespace: 'COMMODITY', mnemonic: 'CREDITS' }); @@ -184,16 +182,12 @@ test('openAccountPurse rejects wrong-commodity accounts', t => { test('openAccountPurse rejects the holding account', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const nowMs = makeTestClock(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const created = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts index 68f1013..3a494de 100644 --- a/packages/ertp-ledgerguise/test/community.test.ts +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -11,22 +11,24 @@ import test, { TestFn } from 'ava'; import Database from 'better-sqlite3'; -import type { Brand, NatAmount } from '@agoric/ertp'; +import type { SqlDatabase } from '../src/sql-db'; +import type { Brand, NatAmount } from '../src/ertp-types'; import type { Guid } from '../src/types'; import { - asGuid, createIssuerKit, initGnuCashSchema, makeChartFacet, makeEscrow, + wrapBetterSqlite3Database, } from '../src/index'; -import { makeDeterministicGuid } from '../src/guids'; +import { makeDeterministicGuid, mockMakeGuid } from '../src/guids'; import { makeTestClock } from './helpers/clock'; type PurseLike = ReturnType['issuer']['makeEmptyPurse']>; type CommunityContext = { - db: import('better-sqlite3').Database; + db: SqlDatabase; + closeDb: () => void; kit: ReturnType; chart: ReturnType; escrow: ReturnType; @@ -51,7 +53,7 @@ const sharedState: { const serial = test.serial as TestFn; const getTotalForAccountType = ( - db: import('better-sqlite3').Database, + db: SqlDatabase, commodityGuid: Guid, accountType: string, excludeGuids: Guid[] = [], @@ -76,15 +78,11 @@ const getTotalForAccountType = ( serial.before(t => { const { freeze } = Object; const dbPath = process.env.ERTP_DB ?? ':memory:'; - const db = new Database(dbPath); + const rawDb = new Database(dbPath); + const db = wrapBetterSqlite3Database(rawDb); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const nowMs = makeTestClock(Date.UTC(2020, 0, 1, 9, 15), 1); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); @@ -107,6 +105,7 @@ serial.before(t => { t.context = { db, + closeDb: () => rawDb.close(), kit, chart, escrow, @@ -116,7 +115,7 @@ serial.before(t => { }); serial.after(t => { - t.context.db.close(); + t.context.closeDb(); }); serial('stage 1: create the community root account', t => { diff --git a/packages/ertp-ledgerguise/test/escrow-ertp.test.ts b/packages/ertp-ledgerguise/test/escrow-ertp.test.ts new file mode 100644 index 0000000..7141aaa --- /dev/null +++ b/packages/ertp-ledgerguise/test/escrow-ertp.test.ts @@ -0,0 +1,275 @@ +/** + * @file ERTP-only escrow exchange tests. + * @see ../src/escrow-ertp.ts + */ + +import test, { type ExecutionContext } from 'ava'; +import Database from 'better-sqlite3'; +import type { IssuerKit, NatAmount, Payment, Purse } from '../src/ertp-types'; +import { makeErtpEscrow } from '../src/escrow-ertp'; +import { createIssuerKit, initGnuCashSchema } from '../src/index'; +import { mockMakeGuid } from '../src/guids'; +import { wrapBetterSqlite3Database } from '../src/sqlite-shim'; +import { makeTestClock } from './helpers/clock'; + +type Dollars = `$${string}`; +const numeral = (amt: Dollars) => amt.replace(/[$,]/g, ''); + +const onlyERTP = >(kit: T): IssuerKit<'nat'> => ({ + mint: kit.mint, + mintRecoveryPurse: kit.mintRecoveryPurse, + issuer: kit.issuer, + brand: kit.brand, + displayInfo: kit.displayInfo, +}); + +const withAmountUtils = (kit: IssuerKit<'nat'>) => ({ + ...kit, + amount: (value: bigint): NatAmount => ({ brand: kit.brand, value }), + $: (amt: Dollars): NatAmount => ({ + brand: kit.brand, + value: BigInt(numeral(amt)), // XXX should support decimals with parseRatio + }), + fund: (purse: Purse<'nat'>, value: bigint) => + purse.deposit(kit.mint.mintPayment({ brand: kit.brand, value })), +}); + +const makeScenario = (t: ExecutionContext) => { + const { freeze } = Object; + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); + initGnuCashSchema(db); + + const makeGuid = mockMakeGuid(); + const nowMs = makeTestClock(); + const money = withAmountUtils( + onlyERTP( + createIssuerKit( + freeze({ + db, + commodity: { namespace: 'COMMODITY', mnemonic: 'BUCKS' }, + makeGuid, + nowMs, + }), + ), + ), + ); + const stock = withAmountUtils( + onlyERTP( + createIssuerKit( + freeze({ + db, + commodity: { namespace: 'COMMODITY', mnemonic: 'SHARES' }, + makeGuid, + nowMs, + }), + ), + ), + ); + + const purses = { + alice: { + money: money.issuer.makeEmptyPurse(), + stock: stock.issuer.makeEmptyPurse(), + }, + bob: { + money: money.issuer.makeEmptyPurse(), + stock: stock.issuer.makeEmptyPurse(), + }, + }; + + const escrow = makeErtpEscrow({ + issuers: { + A: money.issuer, + B: stock.issuer, + }, + }); + + return { money, stock, purses, escrow }; +}; + +test('ertp escrow swaps money for stock', async t => { + const { money, stock, purses, escrow } = makeScenario(t); + const { $ } = money; + const { alice, bob } = purses; + money.fund(alice.money, 10n); + stock.fund(bob.stock, 3n); + + const aliceOffer = { + give: Promise.resolve(alice.money.withdraw($('$7'))), + want: stock.amount(2n), + payouts: { + refund: alice.money.getDepositFacet(), + want: alice.stock.getDepositFacet(), + }, + cancellationP: new Promise(() => {}), + }; + const bobOffer = { + give: Promise.resolve(bob.stock.withdraw(stock.amount(2n))), + want: money.amount(7n), + payouts: { + refund: bob.stock.getDepositFacet(), + want: bob.money.getDepositFacet(), + }, + cancellationP: new Promise(() => {}), + }; + + await escrow.escrowExchange(aliceOffer, bobOffer); + + t.deepEqual( + { + aliceMoney: alice.money.getCurrentAmount(), + bobMoney: bob.money.getCurrentAmount(), + aliceStock: alice.stock.getCurrentAmount(), + bobStock: bob.stock.getCurrentAmount(), + }, + { + aliceMoney: money.amount(3n), + bobMoney: money.amount(7n), + aliceStock: stock.amount(2n), + bobStock: stock.amount(1n), + }, + ); +}); + +test('escrow refunds fulfilled deposits when the other side fails', async t => { + const { money, stock, purses, escrow } = makeScenario(t); + const { $ } = money; + const { alice, bob } = purses; + money.fund(alice.money, 10n); + stock.fund(bob.stock, 3n); + + const aliceOffer = { + give: Promise.resolve(alice.money.withdraw($('$7'))), + want: stock.amount(2n), + payouts: { + refund: alice.money.getDepositFacet(), + want: alice.stock.getDepositFacet(), + }, + cancellationP: new Promise(() => {}), + }; + const bobOffer = { + give: Promise.reject(new Error('offer failed')), + want: money.amount(7n), + payouts: { + refund: bob.stock.getDepositFacet(), + want: bob.money.getDepositFacet(), + }, + cancellationP: new Promise(() => {}), + }; + + await t.throwsAsync(escrow.escrowExchange(aliceOffer, bobOffer), { + message: /offer failed/, + }); + + t.deepEqual( + { + aliceMoney: alice.money.getCurrentAmount(), + aliceStock: alice.stock.getCurrentAmount(), + bobMoney: bob.money.getCurrentAmount(), + bobStock: bob.stock.getCurrentAmount(), + }, + { + aliceMoney: money.amount(10n), + aliceStock: stock.amount(0n), + bobMoney: money.amount(0n), + bobStock: stock.amount(3n), + }, + ); +}); + +test('escrow refunds deposits on cancellation', async t => { + const { money, stock, purses, escrow } = makeScenario(t); + const { $ } = money; + const { alice, bob } = purses; + money.fund(alice.money, 10n); + stock.fund(bob.stock, 3n); + + const bobGivePaymentP = Promise.withResolvers>(); + + const aliceOffer = { + give: Promise.resolve(alice.money.withdraw($('$7'))), + want: stock.amount(2n), + payouts: { + refund: alice.money.getDepositFacet(), + want: alice.stock.getDepositFacet(), + }, + cancellationP: new Promise(() => {}), + }; + const bobOffer = { + give: bobGivePaymentP.promise, + want: money.amount(7n), + payouts: { + refund: bob.stock.getDepositFacet(), + want: bob.money.getDepositFacet(), + }, + cancellationP: Promise.resolve(new Error('cancelled')), + }; + + const exchangeP = escrow.escrowExchange(aliceOffer, bobOffer); + + bobGivePaymentP.resolve(bob.stock.withdraw(stock.amount(2n))); + await t.throwsAsync(exchangeP, { message: /cancelled/ }); + + t.deepEqual( + { + aliceMoney: alice.money.getCurrentAmount(), + aliceStock: alice.stock.getCurrentAmount(), + bobMoney: bob.money.getCurrentAmount(), + bobStock: bob.stock.getCurrentAmount(), + }, + { + aliceMoney: money.amount(10n), + aliceStock: stock.amount(0n), + bobMoney: money.amount(0n), + bobStock: stock.amount(3n), + }, + ); +}); + +test('escrow rejects when a party gives less than wanted', async t => { + const { money, stock, purses, escrow } = makeScenario(t); + const { $ } = money; + const { alice, bob } = purses; + money.fund(alice.money, 10n); + stock.fund(bob.stock, 3n); + + const aliceOffer = { + give: Promise.resolve(alice.money.withdraw($('$6'))), + want: stock.amount(2n), + payouts: { + refund: alice.money.getDepositFacet(), + want: alice.stock.getDepositFacet(), + }, + cancellationP: new Promise(() => {}), + }; + const bobOffer = { + give: Promise.resolve(bob.stock.withdraw(stock.amount(2n))), + want: money.amount(7n), + payouts: { + refund: bob.stock.getDepositFacet(), + want: bob.money.getDepositFacet(), + }, + cancellationP: new Promise(() => {}), + }; + + await t.throwsAsync(escrow.escrowExchange(aliceOffer, bobOffer), { + message: /insufficient offer: party A/, + }); + + t.deepEqual( + { + aliceMoney: alice.money.getCurrentAmount(), + aliceStock: alice.stock.getCurrentAmount(), + bobMoney: bob.money.getCurrentAmount(), + bobStock: bob.stock.getCurrentAmount(), + }, + { + aliceMoney: money.amount(10n), + aliceStock: stock.amount(0n), + bobMoney: money.amount(0n), + bobStock: stock.amount(3n), + }, + ); +}); diff --git a/packages/ertp-ledgerguise/test/escrow.test.ts b/packages/ertp-ledgerguise/test/escrow.test.ts index e1df964..542035d 100644 --- a/packages/ertp-ledgerguise/test/escrow.test.ts +++ b/packages/ertp-ledgerguise/test/escrow.test.ts @@ -5,23 +5,25 @@ import test from 'ava'; import Database from 'better-sqlite3'; -import type { Brand, NatAmount } from '@agoric/ertp'; -import { asGuid, createIssuerKit, initGnuCashSchema, makeEscrow } from '../src/index'; +import type { Brand, NatAmount } from '../src/ertp-types'; +import { + createIssuerKit, + initGnuCashSchema, + makeEscrow, + wrapBetterSqlite3Database, +} from '../src/index'; +import { mockMakeGuid } from '../src/guids'; import { makeDeterministicGuid } from '../src/guids'; import { makeTestClock } from './helpers/clock'; test('escrow swaps two purses with a single holding account', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const nowMs = makeTestClock(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index c149cb5..a7e9f6a 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -5,13 +5,20 @@ import test from 'ava'; import Database from 'better-sqlite3'; -import type { Brand, NatAmount } from '@agoric/ertp'; -import { asGuid, createIssuerKit, initGnuCashSchema, openIssuerKit } from '../src/index'; +import type { Brand, NatAmount } from '../src/ertp-types'; +import { + createIssuerKit, + initGnuCashSchema, + openIssuerKit, + wrapBetterSqlite3Database, +} from '../src/index'; +import { mockMakeGuid } from '../src/guids'; import { makeTestClock } from './helpers/clock'; test('initGnuCashSchema creates GnuCash tables', t => { - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); @@ -25,16 +32,12 @@ test('initGnuCashSchema creates GnuCash tables', t => { test('brand.isMyIssuer rejects unrelated issuers', async t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS', @@ -49,16 +52,12 @@ test('brand.isMyIssuer rejects unrelated issuers', async t => { test('alice sends 10 to bob', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS', @@ -80,16 +79,12 @@ test('alice sends 10 to bob', t => { test('deposit returns the payment amount', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS', @@ -109,16 +104,12 @@ test('deposit returns the payment amount', t => { test('alice-to-bob transfer records a single transaction', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS', @@ -165,16 +156,12 @@ test('alice-to-bob transfer records a single transaction', t => { test('payments can be reified by check number', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS', @@ -207,16 +194,12 @@ test('payments can be reified by check number', t => { test('check numbers increment on collisions', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const nowMs = (() => { const fixed = Date.UTC(2020, 0, 1, 9, 15); return () => fixed; @@ -240,16 +223,12 @@ test('check numbers increment on collisions', t => { test('createIssuerKit persists balances across re-open', t => { const { freeze } = Object; - const db = new Database(':memory:'); - t.teardown(() => db.close()); + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); initGnuCashSchema(db); - let guidCounter = 0n; - const makeGuid = () => { - const guid = guidCounter; - guidCounter += 1n; - return asGuid(guid.toString(16).padStart(32, '0')); - }; + const makeGuid = mockMakeGuid(); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS', diff --git a/packages/ertp-ledgerguise/tsconfig.json b/packages/ertp-ledgerguise/tsconfig.json index 94a16fd..55abdc1 100644 --- a/packages/ertp-ledgerguise/tsconfig.json +++ b/packages/ertp-ledgerguise/tsconfig.json @@ -5,7 +5,10 @@ "moduleResolution": "Node", "esModuleInterop": true, "strict": true, - "skipLibCheck": true + "skipLibCheck": true, + "lib": ["ESNext"], + "rootDir": ".", + "outDir": "dist" }, "include": [ "src/**/*.ts", From a995f22cdaeace0e5e4059b9fe87b6a333d7e2b9 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 24 Jan 2026 10:52:12 -0600 Subject: [PATCH 35/77] feat(ertp-ledgerguise): mutual-consent escrow flow - export EscrowParty type from escrow-ertp - add escrow-db mutual-consent test with issue board, mailbox, and vote gating - add narrative logging and readable balance snapshots in escrow-db test - extract amount helpers into test/ertp-tools and reuse in escrow-ertp test - remove obsolete escrow.test --- packages/ertp-ledgerguise/src/escrow-ertp.ts | 2 +- packages/ertp-ledgerguise/test/ertp-tools.ts | 23 + .../ertp-ledgerguise/test/escrow-db.test.ts | 410 ++++++++++++++++++ .../ertp-ledgerguise/test/escrow-ertp.test.ts | 17 +- packages/ertp-ledgerguise/test/escrow.test.ts | 58 --- 5 files changed, 436 insertions(+), 74 deletions(-) create mode 100644 packages/ertp-ledgerguise/test/ertp-tools.ts create mode 100644 packages/ertp-ledgerguise/test/escrow-db.test.ts delete mode 100644 packages/ertp-ledgerguise/test/escrow.test.ts diff --git a/packages/ertp-ledgerguise/src/escrow-ertp.ts b/packages/ertp-ledgerguise/src/escrow-ertp.ts index e1a3d3c..6726c35 100644 --- a/packages/ertp-ledgerguise/src/escrow-ertp.ts +++ b/packages/ertp-ledgerguise/src/escrow-ertp.ts @@ -7,7 +7,7 @@ import type { AssetKind, DepositFacet, Issuer, Payment, Purse, Amount } from './ import { defaultZone } from './jessie-tools'; import type { Zone } from './jessie-tools'; -type EscrowParty = { +export type EscrowParty = { give: Promise>; want: Amount; payouts: { diff --git a/packages/ertp-ledgerguise/test/ertp-tools.ts b/packages/ertp-ledgerguise/test/ertp-tools.ts new file mode 100644 index 0000000..051e95d --- /dev/null +++ b/packages/ertp-ledgerguise/test/ertp-tools.ts @@ -0,0 +1,23 @@ +import type { DepositFacet, IssuerKit, NatAmount, Purse } from '../src/ertp-types'; + +type Dollars = `$${string}`; +const numeral = (amt: Dollars) => amt.replace(/[$,]/g, ''); + +export const withAmountUtils = (kit: IssuerKit<'nat'>) => ({ + ...kit, + amount: (value: bigint): NatAmount => ({ brand: kit.brand, value }), + $: (amt: Dollars): NatAmount => ({ brand: kit.brand, value: BigInt(numeral(amt)) }), + fund: (purse: Purse<'nat'>, value: bigint) => + purse.deposit(kit.mint.mintPayment({ brand: kit.brand, value })), + fundDeposit: (deposit: DepositFacet<'nat'>, value: bigint) => + deposit.receive(kit.mint.mintPayment({ brand: kit.brand, value })), +}); + +export const ertpOnly = >(kit: T) => ({ + issuer: kit.issuer, + brand: kit.brand, + amount: (value: bigint): NatAmount => ({ brand: kit.brand, value }), + $: (amt: Dollars): NatAmount => ({ brand: kit.brand, value: BigInt(numeral(amt)) }), + mintRecoveryPurse: kit.mintRecoveryPurse, + displayInfo: kit.displayInfo, +}); diff --git a/packages/ertp-ledgerguise/test/escrow-db.test.ts b/packages/ertp-ledgerguise/test/escrow-db.test.ts new file mode 100644 index 0000000..09410dd --- /dev/null +++ b/packages/ertp-ledgerguise/test/escrow-db.test.ts @@ -0,0 +1,410 @@ +/** + * @file Minimal escrow tests. + * @see ../src/escrow.ts + */ + +import test from 'ava'; +import Database from 'better-sqlite3'; +import type { EscrowParty } from '../src/escrow-ertp'; +import type { NatAmount, Payment } from '../src/ertp-types'; +import { + createIssuerKit, + initGnuCashSchema, + wrapBetterSqlite3Database, +} from '../src/index'; +// TODO: move mockMakeGuid and makeTestClock to test/test-io.ts +import { mockMakeGuid } from '../src/guids'; +import { makeTestClock } from './helpers/clock'; +import { ertpOnly, withAmountUtils } from './ertp-tools'; +import { makeErtpEscrow } from '../src/escrow-ertp'; + +const makeKit = ({ + db, + mnemonic, + makeGuid, + nowMs, +}: { + db: ReturnType; + mnemonic: string; + makeGuid: ReturnType; + nowMs: ReturnType; +}) => + withAmountUtils( + createIssuerKit( + Object.freeze({ + db, + commodity: { namespace: 'COMMODITY', mnemonic }, + makeGuid, + nowMs, + }), + ), + ); + +type VoteResolver = ReturnType>['resolve']; +type IssueIntent = { + title: string; + price: NatAmount; +}; +type EscrowMailbox = { + submitA: (offer: EscrowParty<'nat', 'nat'>) => Promise; + submitB: (offer: EscrowParty<'nat', 'nat'>) => Promise; + offerBP: Promise; + doneP: Promise; +}; + +const makeVoteCounter = ( + count: number, + stock: ReturnType, +) => { + const votes = Array.from({ length: count }, () => + Promise.withResolvers(), + ); + const receiptP = Promise.all(votes.map(({ promise }) => promise)).then(() => + stock.mint.mintPayment(stock.amount(1n)), + ); + return Object.assign(votes, { receiptP }); +}; + +const makeEscrowMailbox = ( + escrow: ReturnType>, +) => { + let offerA: EscrowParty<'nat', 'nat'> | undefined; + let offerB: EscrowParty<'nat', 'nat'> | undefined; + let started = false; + const done = Promise.withResolvers(); + const offerBReady = Promise.withResolvers(); + const maybeStart = () => { + if (started || !offerA || !offerB) return; + started = true; + void escrow + .escrowExchange(offerA, offerB) + .then(() => done.resolve()) + .catch(err => done.reject(err)); + }; + const submitA = async (offer: EscrowParty<'nat', 'nat'>) => { + offerA = offer; + maybeStart(); + }; + const submitB = async (offer: EscrowParty<'nat', 'nat'>) => { + offerB = offer; + offerBReady.resolve(); + maybeStart(); + }; + return { + submitA, + submitB, + offerBP: offerBReady.promise, + doneP: done.promise, + }; +}; + +const formatBalances = ( + balances: { + carl: { money: NatAmount; stock: NatAmount }; + vince: { money: NatAmount; stock: NatAmount }; + }, + labels: { moneyName: string; stockName: string }, +) => { + const formatParty = (party: { money: NatAmount; stock: NatAmount }) => ({ + money: `$${party.money.value}`, + stock: `${party.stock.value} ${labels.stockName}`, + }); + return { + carl: JSON.stringify(formatParty(balances.carl)), + vince: JSON.stringify(formatParty(balances.vince)), + }; +}; + + + +type WellKnown = { + money: ReturnType; + stock: ReturnType; + issues: ReturnType< + typeof Promise.withResolvers<{ + escrow: ReturnType>; + mailbox: EscrowMailbox; + intent: IssueIntent; + }> + >; +}; + +const makeClient = ({ + money, + stock, + issues, + castVote, + log, + give = money.$('$50'), + want = stock.amount(1n), + title = 'wash my windows', +}: WellKnown & { + castVote: VoteResolver; + log: (message: string) => void; + give?: NatAmount; + want?: NatAmount; + title?: string; +}) => { + const { freeze } = Object; + const escrow = makeErtpEscrow({ + issuers: { + A: money.issuer, + B: stock.issuer, + }, + }); + const purses = { + money: money.issuer.makeEmptyPurse(), + stock: stock.issuer.makeEmptyPurse(), + }; + const moneyDeposit = purses.money.getDepositFacet(); + const stockDeposit = purses.stock.getDepositFacet(); + const makeOffer = (): EscrowParty<'nat', 'nat'> => + freeze({ + give: Promise.resolve(purses.money.withdraw(give)), + want, + payouts: freeze({ + refund: moneyDeposit, + want: stockDeposit, + }), + cancellationP: new Promise(() => {}), + }); + const mailbox = makeEscrowMailbox(escrow); + const getBalances = () => ({ + money: purses.money.getCurrentAmount(), + stock: purses.stock.getCurrentAmount(), + }); + const run = () => { + const offer = makeOffer(); + log(`posts issue "${title}" for ${give.value}n.`); + issues.resolve({ + escrow, + mailbox, + intent: { title, price: give }, + }); + log('submits his offer to the escrow mailbox.'); + return mailbox + .submitA(offer) + .then(() => mailbox.offerBP) + .then(() => { + log('votes to approve after Vince submits his offer.'); + castVote(); + }) + .then(() => mailbox.doneP); + }; + return freeze({ + moneyDeposit, + stockDeposit, + getBalances, + run, + }); +}; + +const makeVendor = ({ + money, + stock, + issues, + castVote, + giveReceiptP, + log, + want = money.amount(50n), +}: WellKnown & { + castVote: VoteResolver; + giveReceiptP: Promise>; + log: (message: string) => void; + want?: NatAmount; +}) => { + const { freeze } = Object; + const purses = { + money: money.issuer.makeEmptyPurse(), + stock: stock.issuer.makeEmptyPurse(), + }; + const moneyDeposit = purses.money.getDepositFacet(); + const stockDeposit = purses.stock.getDepositFacet(); + const makeOffer = (): EscrowParty<'nat', 'nat'> => + freeze({ + give: giveReceiptP, + want, + payouts: freeze({ + refund: stockDeposit, + want: moneyDeposit, + }), + cancellationP: new Promise(() => {}), + }); + const getBalances = () => ({ + money: purses.money.getCurrentAmount(), + stock: purses.stock.getCurrentAmount(), + }); + const run = async () => { + log('receives the issue.'); + const { mailbox } = await issues.promise; + log('submits his offer to the escrow mailbox.'); + await mailbox.submitB(makeOffer()); + log('votes to approve the issue.'); + castVote(); + log('waits for escrow to complete.'); + await mailbox.doneP; + }; + return freeze({ + moneyDeposit, + stockDeposit, + makeOffer, + getBalances, + run, + }); +}; + +/** + * client Carl joins the community + * Carl posts "wash my windows" as an issue; offers $15 + * vendor Vince joins the community (un-ordered w.r.t. Carl) + * Vince does the work; nominates himself for the payout + * Carl agrees (endorses the nomination) + * Vince gets paid + */ +test('escrow for services rendered (mutual consent receipt)', async t => { + const { freeze } = Object; + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); + initGnuCashSchema(db); + + const makeGuid = mockMakeGuid(); + const nowMs = makeTestClock(); + const money = makeKit({ db, mnemonic: 'BUCKS', makeGuid, nowMs }); + const stock = makeKit({ db, mnemonic: 'SHARES', makeGuid, nowMs }); + const issues = Promise.withResolvers<{ + escrow: ReturnType>; + mailbox: EscrowMailbox; + intent: IssueIntent; + }>(); + const votes = makeVoteCounter(2, stock); + const wellKnown: WellKnown = { + money: ertpOnly(money), + stock: ertpOnly(stock), + issues, + }; + + // Scope: each party runs in its own minimal-capability slice. + // POLA: parties only get ERTP facets + escrow, not DB access or admin knobs. + t.log( + 'Policy: community members may post issues; early resolves waste effort but do not move funds.', + ); + + t.log('Carl and Vince receive community capabilities (including voting).'); + const carl = makeClient({ + ...wellKnown, + castVote: votes[0].resolve, + log: msg => t.log(`Carl: ${msg}`), + }); + + // TODO: model community membership/voting as a distinct issuer + counting flow. + + const vince = makeVendor({ + ...wellKnown, + castVote: votes[1].resolve, + giveReceiptP: votes.receiptP, + log: msg => t.log(`Vince: ${msg}`), + }); + t.log('Carl has 50 bucks available for the offer.'); + money.fundDeposit(carl.moneyDeposit, 50n); + const balancesBefore = { + carl: carl.getBalances(), + vince: vince.getBalances(), + }; + const labels = { + moneyName: money.issuer.getAllegedName(), + stockName: stock.issuer.getAllegedName(), + }; + t.log('Balances before escrow', formatBalances(balancesBefore, labels)); + await Promise.all([carl.run(), vince.run()]); + const balancesAfter = { + carl: carl.getBalances(), + vince: vince.getBalances(), + }; + t.log('Balances after escrow', formatBalances(balancesAfter, labels)); + + t.log('Escrow completes; verify final balances.'); + t.deepEqual( + balancesAfter, + { + carl: { + money: money.amount(0n), + stock: stock.amount(1n), + }, + vince: { + money: money.amount(50n), + stock: stock.amount(0n), + }, + }, + ); +}); + +test('escrow swaps two purses with a single holding account', async t => { + const { freeze } = Object; + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); + initGnuCashSchema(db); + + const makeGuid = mockMakeGuid(); + const nowMs = makeTestClock(); + const money = makeKit({ db, mnemonic: 'BUCKS', makeGuid, nowMs }); + const { $ } = money; + + const stock = makeKit({ db, mnemonic: 'SHARES', makeGuid, nowMs }); + + const escrow = makeErtpEscrow({ + issuers: { + A: money.issuer, + B: stock.issuer, + }, + }); + + const alice = { + money: money.issuer.makeEmptyPurse(), + stock: stock.issuer.makeEmptyPurse(), + }; + const bob = { + money: money.issuer.makeEmptyPurse(), + stock: stock.issuer.makeEmptyPurse(), + }; + + money.fund(alice.money, 5n); + stock.fund(bob.stock, 4n); + + const aliceOffer = { + give: Promise.resolve(alice.money.withdraw($('$3'))), + want: stock.amount(2n), + payouts: { + refund: alice.money.getDepositFacet(), + want: alice.stock.getDepositFacet(), + }, + cancellationP: new Promise(() => {}), + }; + const bobOffer = { + give: Promise.resolve(bob.stock.withdraw(stock.amount(2n))), + want: money.amount(3n), + payouts: { + refund: bob.stock.getDepositFacet(), + want: bob.money.getDepositFacet(), + }, + cancellationP: new Promise(() => {}), + }; + + await escrow.escrowExchange(aliceOffer, bobOffer); + + t.deepEqual( + { + aliceMoney: alice.money.getCurrentAmount(), + bobMoney: bob.money.getCurrentAmount(), + aliceStock: alice.stock.getCurrentAmount(), + bobStock: bob.stock.getCurrentAmount(), + }, + { + aliceMoney: money.amount(2n), + bobMoney: money.amount(3n), + aliceStock: stock.amount(2n), + bobStock: stock.amount(2n), + }, + ); +}); diff --git a/packages/ertp-ledgerguise/test/escrow-ertp.test.ts b/packages/ertp-ledgerguise/test/escrow-ertp.test.ts index 7141aaa..33f9d24 100644 --- a/packages/ertp-ledgerguise/test/escrow-ertp.test.ts +++ b/packages/ertp-ledgerguise/test/escrow-ertp.test.ts @@ -5,15 +5,13 @@ import test, { type ExecutionContext } from 'ava'; import Database from 'better-sqlite3'; -import type { IssuerKit, NatAmount, Payment, Purse } from '../src/ertp-types'; +import type { IssuerKit, Payment } from '../src/ertp-types'; import { makeErtpEscrow } from '../src/escrow-ertp'; import { createIssuerKit, initGnuCashSchema } from '../src/index'; import { mockMakeGuid } from '../src/guids'; import { wrapBetterSqlite3Database } from '../src/sqlite-shim'; import { makeTestClock } from './helpers/clock'; - -type Dollars = `$${string}`; -const numeral = (amt: Dollars) => amt.replace(/[$,]/g, ''); +import { withAmountUtils } from './ertp-tools'; const onlyERTP = >(kit: T): IssuerKit<'nat'> => ({ mint: kit.mint, @@ -23,17 +21,6 @@ const onlyERTP = >(kit: T): IssuerKit<'nat'> => ({ displayInfo: kit.displayInfo, }); -const withAmountUtils = (kit: IssuerKit<'nat'>) => ({ - ...kit, - amount: (value: bigint): NatAmount => ({ brand: kit.brand, value }), - $: (amt: Dollars): NatAmount => ({ - brand: kit.brand, - value: BigInt(numeral(amt)), // XXX should support decimals with parseRatio - }), - fund: (purse: Purse<'nat'>, value: bigint) => - purse.deposit(kit.mint.mintPayment({ brand: kit.brand, value })), -}); - const makeScenario = (t: ExecutionContext) => { const { freeze } = Object; const rawDb = new Database(':memory:'); diff --git a/packages/ertp-ledgerguise/test/escrow.test.ts b/packages/ertp-ledgerguise/test/escrow.test.ts deleted file mode 100644 index 542035d..0000000 --- a/packages/ertp-ledgerguise/test/escrow.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file Minimal escrow tests. - * @see ../src/escrow.ts - */ - -import test from 'ava'; -import Database from 'better-sqlite3'; -import type { Brand, NatAmount } from '../src/ertp-types'; -import { - createIssuerKit, - initGnuCashSchema, - makeEscrow, - wrapBetterSqlite3Database, -} from '../src/index'; -import { mockMakeGuid } from '../src/guids'; -import { makeDeterministicGuid } from '../src/guids'; -import { makeTestClock } from './helpers/clock'; - -test('escrow swaps two purses with a single holding account', t => { - const { freeze } = Object; - const rawDb = new Database(':memory:'); - const db = wrapBetterSqlite3Database(rawDb); - t.teardown(() => rawDb.close()); - initGnuCashSchema(db); - - const makeGuid = mockMakeGuid(); - const nowMs = makeTestClock(); - const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); - const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); - const brand = kit.brand as Brand<'nat'>; - const bucks = (value: bigint): NatAmount => freeze({ brand, value }); - - const holdingAccountGuid = makeDeterministicGuid(`ledgerguise-balance:${kit.commodityGuid}`); - const escrow = makeEscrow({ - db, - commodityGuid: kit.commodityGuid, - holdingAccountGuid, - getPurseGuid: kit.purses.getGuid, - brand: kit.brand, - makeGuid, - nowMs, - }); - - const alice = kit.issuer.makeEmptyPurse(); - const bob = kit.issuer.makeEmptyPurse(); - alice.deposit(kit.mint.mintPayment(bucks(5n))); - bob.deposit(kit.mint.mintPayment(bucks(4n))); - - const offer = escrow.makeOffer( - { fromPurse: alice, toPurse: bob, amount: bucks(3n) }, - { fromPurse: bob, toPurse: alice, amount: bucks(2n) }, - 'issue-123', - ); - offer.accept(); - - t.is(alice.getCurrentAmount().value, 4n); - t.is(bob.getCurrentAmount().value, 5n); -}); From c70169028073c52489a48e41d84db660183c6c48 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 24 Jan 2026 10:52:28 -0600 Subject: [PATCH 36/77] feat(ertp-ledgerguise): tag ERTP facets by commodity - add defaultZone toStringTag tagging and getInterfaceOf helper - tag Brand/Issuer/Mint/Payment with " ..." - tag Purse/DepositFacet with " ..." - pass commodityLabel through purse factory to avoid recomputing names --- packages/ertp-ledgerguise/src/index.ts | 9 +++++---- packages/ertp-ledgerguise/src/jessie-tools.ts | 19 ++++++++++++++++++- packages/ertp-ledgerguise/src/purse.ts | 6 ++++-- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 10b23b1..498df1f 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -112,7 +112,7 @@ const makeIssuerKitForCommodity = ({ checkNumber: string, ) => { const amountValue = assertAmount(amount); - const payment = exo('Payment', { + const payment = exo(`${commodityLabel} Payment`, { __getAllegedInterface__: () => { // TODO: return ERTP interface metadata once defined. throw new Error('not implemented'); @@ -158,6 +158,7 @@ const makeIssuerKitForCommodity = ({ const { ensurePurse, makeNewPurse, openPurse, purseGuids } = makePurseFactory({ db, commodityGuid, + commodityLabel, makeAmount, makePayment, livePayments, @@ -166,13 +167,13 @@ const makeIssuerKitForCommodity = ({ getBrand: () => brand, zone, }); - const brand = exo('Brand', { + const brand = exo(`${commodityLabel} Brand`, { isMyIssuer: async (allegedIssuer: object) => allegedIssuer === issuer, getAllegedName: () => getAllegedName(), getDisplayInfo: () => displayInfo, getAmountShape: () => amountShape, }); - const issuer = exo('Issuer', { + const issuer = exo(`${commodityLabel} Issuer`, { getBrand: () => brand, getAllegedName: () => getAllegedName(), getAssetKind: () => 'nat' as const, @@ -196,7 +197,7 @@ const makeIssuerKitForCommodity = ({ return makeAmount(record.amount); }, }); - const mint = exo('Mint', { + const mint = exo(`${commodityLabel} Mint`, { getIssuer: () => issuer, mintPayment: (amount: AmountLike) => { const amountValue = assertAmount(amount); diff --git a/packages/ertp-ledgerguise/src/jessie-tools.ts b/packages/ertp-ledgerguise/src/jessie-tools.ts index fe11250..ab1f358 100644 --- a/packages/ertp-ledgerguise/src/jessie-tools.ts +++ b/packages/ertp-ledgerguise/src/jessie-tools.ts @@ -18,7 +18,24 @@ export type Zone = { }; export const defaultZone: Zone = { - exo: (_interfaceName, methods) => freezeProps(methods), + exo: (interfaceName, methods) => + freezeProps( + Object.defineProperty(methods, Symbol.toStringTag, { + value: `?${interfaceName}?`, + }), + ), +}; + +export const getInterfaceOf = (val: unknown): string | undefined => { + if ((typeof val !== 'object' && typeof val !== 'function') || val === null) { + return undefined; + } + const tag = (val as Record)[Symbol.toStringTag]; + if (typeof tag !== 'string') { + return undefined; + } + const match = /^\?(.*)\?$/.exec(tag); + return match ? match[1] : undefined; }; export const Nat = (specimen: bigint) => { diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index 266260f..62cadbd 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -13,6 +13,7 @@ import type { SqlDatabase } from './sql-db'; type PurseFactoryOptions = { db: SqlDatabase; commodityGuid: Guid; + commodityLabel: string; makeAmount: (value: bigint) => AmountLike; makePayment: ( amount: AmountLike, @@ -41,6 +42,7 @@ type PurseFactoryOptions = { export const makePurseFactory = ({ db, commodityGuid, + commodityLabel, makeAmount, makePayment, livePayments, @@ -81,11 +83,11 @@ export const makePurseFactory = ({ return makePayment(amount, accountGuid, txGuid, holdingSplitGuid, checkNumber); }; const getCurrentAmount = () => makeAmount(getAccountBalance(db, accountGuid)); - const depositFacet = exo('DepositFacet', { + const depositFacet = exo(`${commodityLabel} DepositFacet`, { receive: (payment: object, optAmountShape?: unknown) => deposit(payment, optAmountShape), }); - const purse = exo('Purse', { + const purse = exo(`${commodityLabel} Purse`, { deposit, withdraw, getCurrentAmount, From a04ef809795be5c13ee744d620ee061fd6a7d796 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 24 Jan 2026 11:00:24 -0600 Subject: [PATCH 37/77] docs(ertp-ledgerguise): clarify agent tactics - document commit ritual under agent tactics - separate general tactics from commit ritual - add checklist item for persisting escrow state changes --- packages/ertp-ledgerguise/CONTRIBUTING.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index 768f528..d8e8d3f 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -21,6 +21,7 @@ Thanks for your interest in contributing! This package provides an ERTP facade o - [x] Restore `lint:types` after changing `tsconfig.json` `lib` to `ESNext` (SqlDatabase type mismatch with better-sqlite3). - [x] Abstract: define a backend-agnostic SqlDatabase interface for sync sqlite. - [x] Concrete: add a better-sqlite3 shim and use it in tests. + - [ ] Figure out how to persist escrow exchanges at each state change. ## Planning @@ -77,6 +78,16 @@ Thanks for your interest in contributing! This package provides an ERTP facade o the mutable let point is not agent tactics; it's code style. likewise API surface stuff. make a new subsection for the API surface freezing stuff. +### Commit Ritual + +- Propose commit boundaries before committing when multiple changes are in play. +- Use conventional commit headers and focus the subject on the most important user-facing change. +- Provide a draft commit message for review before creating the commit. +- In the body, detail all changes with indented bullets. +- Only commit after explicit user approval. + +### General Tactics + - Always check for static errors before running tests. - Always run all tests relevant to any code changes before asking the user for further input. - When fixing a bug, capture it with a failing test before applying the fix. From 7b875d2d7d1ac9c9611e7438ed18c6ad2e8bcf69 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 24 Jan 2026 12:36:55 -0600 Subject: [PATCH 38/77] chore(ertp-ledgerguise): switch to ESM test setup - mark package as module and use ts-blank-space for AVA TS ESM - adopt NodeNext module resolution in tsconfig - add .js extensions for local imports in src/test - fix ava type-only import for TestFn --- packages/ertp-ledgerguise/package.json | 18 ++++++---- packages/ertp-ledgerguise/src/chart.ts | 10 +++--- packages/ertp-ledgerguise/src/db-helpers.ts | 4 +-- packages/ertp-ledgerguise/src/ertp-types.ts | 2 +- packages/ertp-ledgerguise/src/escrow-ertp.ts | 6 ++-- packages/ertp-ledgerguise/src/escrow.ts | 10 +++--- packages/ertp-ledgerguise/src/index.ts | 34 +++++++++---------- packages/ertp-ledgerguise/src/purse.ts | 10 +++--- packages/ertp-ledgerguise/src/sqlite-shim.ts | 2 +- packages/ertp-ledgerguise/src/types.ts | 10 +++--- .../ertp-ledgerguise/test/adversarial.test.ts | 10 +++--- .../ertp-ledgerguise/test/community.test.ts | 15 ++++---- packages/ertp-ledgerguise/test/ertp-tools.ts | 2 +- .../ertp-ledgerguise/test/escrow-db.test.ts | 14 ++++---- .../ertp-ledgerguise/test/escrow-ertp.test.ts | 14 ++++---- packages/ertp-ledgerguise/tsconfig.json | 4 +-- 16 files changed, 85 insertions(+), 80 deletions(-) diff --git a/packages/ertp-ledgerguise/package.json b/packages/ertp-ledgerguise/package.json index 55f3252..7175d1d 100644 --- a/packages/ertp-ledgerguise/package.json +++ b/packages/ertp-ledgerguise/package.json @@ -2,6 +2,7 @@ "name": "@finquick/ertp-ledgerguise", "version": "0.0.1", "private": true, + "type": "module", "scripts": { "codegen:sql": "node scripts/codegen-sql.mjs", "lint:types": "tsc -p tsconfig.json --noEmit --incremental", @@ -9,15 +10,18 @@ "check": "npm run lint:types && npm run test" }, "ava": { + "extensions": { + "js": true, + "ts": "module" + }, "files": [ - "test/**/*.test.ts" + "test/**/*.test.*" ], - "extensions": [ - "ts" + "nodeArguments": [ + "--import=ts-blank-space/register", + "--no-warnings" ], - "require": [ - "ts-node/register/transpile-only" - ] + "require": [] }, "dependencies": { "@agoric/ertp": "0.16.3-dev-dc67c18.0.dc67c18", @@ -26,7 +30,7 @@ "devDependencies": { "@types/better-sqlite3": "^7.6.1", "ava": "^5.3.1", - "ts-node": "^10.9.2", + "ts-blank-space": "^0.6.2", "typescript": "~5.9.3" } } diff --git a/packages/ertp-ledgerguise/src/chart.ts b/packages/ertp-ledgerguise/src/chart.ts index ba41c7c..d3efcd2 100644 --- a/packages/ertp-ledgerguise/src/chart.ts +++ b/packages/ertp-ledgerguise/src/chart.ts @@ -1,8 +1,8 @@ -import { defaultZone } from './jessie-tools'; -import type { Zone } from './jessie-tools'; -import type { SqlDatabase } from './sql-db'; -import type { ChartFacet, Guid } from './types'; -import { requireAccountCommodity } from './db-helpers'; +import { defaultZone } from './jessie-tools.js'; +import type { Zone } from './jessie-tools.js'; +import type { SqlDatabase } from './sql-db.js'; +import type { ChartFacet, Guid } from './types.js'; +import { requireAccountCommodity } from './db-helpers.js'; /** * @file Chart facet for placing purse accounts into a community chart of accounts. diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index 3027d19..4af260b 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -1,5 +1,5 @@ -import type { SqlDatabase } from './sql-db'; -import type { CommoditySpec, Guid } from './types'; +import type { SqlDatabase } from './sql-db.js'; +import type { CommoditySpec, Guid } from './types.js'; export const ensureCommodityRow = ( db: SqlDatabase, diff --git a/packages/ertp-ledgerguise/src/ertp-types.ts b/packages/ertp-ledgerguise/src/ertp-types.ts index 53c1c1d..e2781a4 100644 --- a/packages/ertp-ledgerguise/src/ertp-types.ts +++ b/packages/ertp-ledgerguise/src/ertp-types.ts @@ -6,7 +6,7 @@ import type { LatestTopic, Pattern, RemotableObject, -} from './endo-types'; +} from './endo-types.js'; // #region from @agoric/internal declare const tag: 'Symbol(tag)'; diff --git a/packages/ertp-ledgerguise/src/escrow-ertp.ts b/packages/ertp-ledgerguise/src/escrow-ertp.ts index 6726c35..033a432 100644 --- a/packages/ertp-ledgerguise/src/escrow-ertp.ts +++ b/packages/ertp-ledgerguise/src/escrow-ertp.ts @@ -3,9 +3,9 @@ * @see ./escrow.ts */ -import type { AssetKind, DepositFacet, Issuer, Payment, Purse, Amount } from './ertp-types'; -import { defaultZone } from './jessie-tools'; -import type { Zone } from './jessie-tools'; +import type { AssetKind, DepositFacet, Issuer, Payment, Purse, Amount } from './ertp-types.js'; +import { defaultZone } from './jessie-tools.js'; +import type { Zone } from './jessie-tools.js'; export type EscrowParty = { give: Promise>; diff --git a/packages/ertp-ledgerguise/src/escrow.ts b/packages/ertp-ledgerguise/src/escrow.ts index ffca84f..f55f8e4 100644 --- a/packages/ertp-ledgerguise/src/escrow.ts +++ b/packages/ertp-ledgerguise/src/escrow.ts @@ -1,8 +1,8 @@ -import { defaultZone, Nat } from './jessie-tools'; -import type { Zone } from './jessie-tools'; -import type { AmountLike, EscrowFacet, Guid } from './types'; -import type { SqlDatabase } from './sql-db'; -import { requireAccountCommodity } from './db-helpers'; +import { defaultZone, Nat } from './jessie-tools.js'; +import type { Zone } from './jessie-tools.js'; +import type { AmountLike, EscrowFacet, Guid } from './types.js'; +import type { SqlDatabase } from './sql-db.js'; +import { requireAccountCommodity } from './db-helpers.js'; /** * @file Minimal two-party escrow layered on ERTP-style purses. diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 498df1f..b9262e4 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -7,11 +7,11 @@ * @see openIssuerKit */ -import type { SqlDatabase } from './sql-db'; -import { gcEmptySql } from './sql/gc_empty'; -import { defaultZone, Nat } from './jessie-tools'; -import type { Zone } from './jessie-tools'; -import { makeDeterministicGuid } from './guids'; +import type { SqlDatabase } from './sql-db.js'; +import { gcEmptySql } from './sql/gc_empty.js'; +import { defaultZone, Nat } from './jessie-tools.js'; +import type { Zone } from './jessie-tools.js'; +import { makeDeterministicGuid } from './guids.js'; import type { AccountPurse, AmountLike, @@ -21,17 +21,17 @@ import type { IssuerKitForCommodity, IssuerKitWithPurseGuids, OpenIssuerConfig, -} from './types'; -import { makeChartFacet } from './chart'; +} from './types.js'; +import { makeChartFacet } from './chart.js'; import { createCommodityRow, ensureAccountRow, getAccountBalance, getCommodityAllegedName, makeTransferRecorder, -} from './db-helpers'; -import { makePurseFactory } from './purse'; -import { makeEscrow } from './escrow'; +} from './db-helpers.js'; +import { makePurseFactory } from './purse.js'; +import { makeEscrow } from './escrow.js'; export type { CommoditySpec, @@ -40,13 +40,13 @@ export type { IssuerKitWithGuid, IssuerKitWithPurseGuids, NatIssuerKit, -} from './types'; -export { asGuid } from './guids'; -export { makeChartFacet } from './chart'; -export { makeEscrow } from './escrow'; -export { wrapBetterSqlite3Database } from './sqlite-shim'; -export type { SqlDatabase, SqlStatement } from './sql-db'; -export type { Zone } from './jessie-tools'; +} from './types.js'; +export { asGuid } from './guids.js'; +export { makeChartFacet } from './chart.js'; +export { makeEscrow } from './escrow.js'; +export { wrapBetterSqlite3Database } from './sqlite-shim.js'; +export type { SqlDatabase, SqlStatement } from './sql-db.js'; +export type { Zone } from './jessie-tools.js'; /** * Initialize an empty sqlite database with the GnuCash schema. diff --git a/packages/ertp-ledgerguise/src/purse.ts b/packages/ertp-ledgerguise/src/purse.ts index 62cadbd..8968167 100644 --- a/packages/ertp-ledgerguise/src/purse.ts +++ b/packages/ertp-ledgerguise/src/purse.ts @@ -1,14 +1,14 @@ -import { Nat } from './jessie-tools'; -import type { Zone } from './jessie-tools'; +import { Nat } from './jessie-tools.js'; +import type { Zone } from './jessie-tools.js'; import { createAccountRow, ensureAccountRow, getAccountBalance, makeTransferRecorder, requireAccountCommodity, -} from './db-helpers'; -import type { AccountPurse, AmountLike, Guid } from './types'; -import type { SqlDatabase } from './sql-db'; +} from './db-helpers.js'; +import type { AccountPurse, AmountLike, Guid } from './types.js'; +import type { SqlDatabase } from './sql-db.js'; type PurseFactoryOptions = { db: SqlDatabase; diff --git a/packages/ertp-ledgerguise/src/sqlite-shim.ts b/packages/ertp-ledgerguise/src/sqlite-shim.ts index 60c1dde..f7497e7 100644 --- a/packages/ertp-ledgerguise/src/sqlite-shim.ts +++ b/packages/ertp-ledgerguise/src/sqlite-shim.ts @@ -1,5 +1,5 @@ import type { Database } from 'better-sqlite3'; -import type { SqlDatabase, SqlStatement } from './sql-db'; +import type { SqlDatabase, SqlStatement } from './sql-db.js'; type BetterSqliteStatement = { run: (...args: any[]) => unknown; diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index b48d592..4e6b56d 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -1,7 +1,7 @@ -import type { IssuerKit } from './ertp-types'; -import type { SqlDatabase } from './sql-db'; -import type { Guid } from './guids'; -import type { Zone } from './jessie-tools'; +import type { IssuerKit } from './ertp-types.js'; +import type { SqlDatabase } from './sql-db.js'; +import type { Guid } from './guids.js'; +import type { Zone } from './jessie-tools.js'; export type CommoditySpec = { namespace?: string; @@ -114,4 +114,4 @@ export type EscrowFacet = { }; }; -export type { Guid } from './guids'; +export type { Guid } from './guids.js'; diff --git a/packages/ertp-ledgerguise/test/adversarial.test.ts b/packages/ertp-ledgerguise/test/adversarial.test.ts index 7e4be19..16d65e1 100644 --- a/packages/ertp-ledgerguise/test/adversarial.test.ts +++ b/packages/ertp-ledgerguise/test/adversarial.test.ts @@ -5,17 +5,17 @@ import test from 'ava'; import Database from 'better-sqlite3'; -import type { Brand, NatAmount } from '../src/ertp-types'; +import type { Brand, NatAmount } from '../src/ertp-types.js'; import { asGuid, createIssuerKit, initGnuCashSchema, openIssuerKit, wrapBetterSqlite3Database, -} from '../src/index'; -import { mockMakeGuid } from '../src/guids'; -import type { SqlDatabase } from '../src/sql-db'; -import { makeTestClock } from './helpers/clock'; +} from '../src/index.js'; +import { mockMakeGuid } from '../src/guids.js'; +import type { SqlDatabase } from '../src/sql-db.js'; +import { makeTestClock } from './helpers/clock.js'; const seedAccountBalance = ( db: SqlDatabase, diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts index 3a494de..8967b22 100644 --- a/packages/ertp-ledgerguise/test/community.test.ts +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -9,20 +9,21 @@ * If ERTP_DB is set, the test writes the sqlite database at that path. */ -import test, { TestFn } from 'ava'; +import test from 'ava'; +import type { TestFn } from 'ava'; import Database from 'better-sqlite3'; -import type { SqlDatabase } from '../src/sql-db'; -import type { Brand, NatAmount } from '../src/ertp-types'; -import type { Guid } from '../src/types'; +import type { SqlDatabase } from '../src/sql-db.js'; +import type { Brand, NatAmount } from '../src/ertp-types.js'; +import type { Guid } from '../src/types.js'; import { createIssuerKit, initGnuCashSchema, makeChartFacet, makeEscrow, wrapBetterSqlite3Database, -} from '../src/index'; -import { makeDeterministicGuid, mockMakeGuid } from '../src/guids'; -import { makeTestClock } from './helpers/clock'; +} from '../src/index.js'; +import { makeDeterministicGuid, mockMakeGuid } from '../src/guids.js'; +import { makeTestClock } from './helpers/clock.js'; type PurseLike = ReturnType['issuer']['makeEmptyPurse']>; diff --git a/packages/ertp-ledgerguise/test/ertp-tools.ts b/packages/ertp-ledgerguise/test/ertp-tools.ts index 051e95d..2b266a1 100644 --- a/packages/ertp-ledgerguise/test/ertp-tools.ts +++ b/packages/ertp-ledgerguise/test/ertp-tools.ts @@ -1,4 +1,4 @@ -import type { DepositFacet, IssuerKit, NatAmount, Purse } from '../src/ertp-types'; +import type { DepositFacet, IssuerKit, NatAmount, Purse } from '../src/ertp-types.js'; type Dollars = `$${string}`; const numeral = (amt: Dollars) => amt.replace(/[$,]/g, ''); diff --git a/packages/ertp-ledgerguise/test/escrow-db.test.ts b/packages/ertp-ledgerguise/test/escrow-db.test.ts index 09410dd..226e408 100644 --- a/packages/ertp-ledgerguise/test/escrow-db.test.ts +++ b/packages/ertp-ledgerguise/test/escrow-db.test.ts @@ -5,18 +5,18 @@ import test from 'ava'; import Database from 'better-sqlite3'; -import type { EscrowParty } from '../src/escrow-ertp'; -import type { NatAmount, Payment } from '../src/ertp-types'; +import type { EscrowParty } from '../src/escrow-ertp.js'; +import type { NatAmount, Payment } from '../src/ertp-types.js'; import { createIssuerKit, initGnuCashSchema, wrapBetterSqlite3Database, -} from '../src/index'; +} from '../src/index.js'; // TODO: move mockMakeGuid and makeTestClock to test/test-io.ts -import { mockMakeGuid } from '../src/guids'; -import { makeTestClock } from './helpers/clock'; -import { ertpOnly, withAmountUtils } from './ertp-tools'; -import { makeErtpEscrow } from '../src/escrow-ertp'; +import { mockMakeGuid } from '../src/guids.js'; +import { makeTestClock } from './helpers/clock.js'; +import { ertpOnly, withAmountUtils } from './ertp-tools.js'; +import { makeErtpEscrow } from '../src/escrow-ertp.js'; const makeKit = ({ db, diff --git a/packages/ertp-ledgerguise/test/escrow-ertp.test.ts b/packages/ertp-ledgerguise/test/escrow-ertp.test.ts index 33f9d24..64dcc9b 100644 --- a/packages/ertp-ledgerguise/test/escrow-ertp.test.ts +++ b/packages/ertp-ledgerguise/test/escrow-ertp.test.ts @@ -5,13 +5,13 @@ import test, { type ExecutionContext } from 'ava'; import Database from 'better-sqlite3'; -import type { IssuerKit, Payment } from '../src/ertp-types'; -import { makeErtpEscrow } from '../src/escrow-ertp'; -import { createIssuerKit, initGnuCashSchema } from '../src/index'; -import { mockMakeGuid } from '../src/guids'; -import { wrapBetterSqlite3Database } from '../src/sqlite-shim'; -import { makeTestClock } from './helpers/clock'; -import { withAmountUtils } from './ertp-tools'; +import type { IssuerKit, Payment } from '../src/ertp-types.js'; +import { makeErtpEscrow } from '../src/escrow-ertp.js'; +import { createIssuerKit, initGnuCashSchema } from '../src/index.js'; +import { mockMakeGuid } from '../src/guids.js'; +import { wrapBetterSqlite3Database } from '../src/sqlite-shim.js'; +import { makeTestClock } from './helpers/clock.js'; +import { withAmountUtils } from './ertp-tools.js'; const onlyERTP = >(kit: T): IssuerKit<'nat'> => ({ mint: kit.mint, diff --git a/packages/ertp-ledgerguise/tsconfig.json b/packages/ertp-ledgerguise/tsconfig.json index 55abdc1..2be9584 100644 --- a/packages/ertp-ledgerguise/tsconfig.json +++ b/packages/ertp-ledgerguise/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { "target": "ES2020", - "module": "CommonJS", - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "esModuleInterop": true, "strict": true, "skipLibCheck": true, From cb9ede961a970d74824b1e3459490fc5b0aeca87 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 24 Jan 2026 12:47:26 -0600 Subject: [PATCH 39/77] test(ertp-ledgerguise): add CSV fixtures and snapshot view - add CSV fixtures for withdraw/deposit and escrow-commit shapes - connect withdraw/deposit fixture to a ledger test - snapshot formatted row strings for readable table diffs - add fixture README and a brief design note on plan/interpreter pattern - document async asset reading preference in CONTRIBUTING --- packages/ertp-ledgerguise/CONTRIBUTING.md | 1 + packages/ertp-ledgerguise/DESIGN.md | 74 ++++++++ .../ertp-ledgerguise/test/fixtures/README.md | 22 +++ .../test/fixtures/escrow-commit-splits.csv | 5 + .../fixtures/escrow-commit-transactions.csv | 3 + .../test/fixtures/withdraw-deposit-splits.csv | 3 + .../withdraw-deposit-transactions.csv | 2 + .../ertp-ledgerguise/test/ledgerguise.test.ts | 174 +++++++++++++++++- .../test/snapshots/ledgerguise.test.ts.md | 22 +++ 9 files changed, 302 insertions(+), 4 deletions(-) create mode 100644 packages/ertp-ledgerguise/DESIGN.md create mode 100644 packages/ertp-ledgerguise/test/fixtures/README.md create mode 100644 packages/ertp-ledgerguise/test/fixtures/escrow-commit-splits.csv create mode 100644 packages/ertp-ledgerguise/test/fixtures/escrow-commit-transactions.csv create mode 100644 packages/ertp-ledgerguise/test/fixtures/withdraw-deposit-splits.csv create mode 100644 packages/ertp-ledgerguise/test/fixtures/withdraw-deposit-transactions.csv create mode 100644 packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.md diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index d8e8d3f..5b57013 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -91,6 +91,7 @@ the mutable let point is not agent tactics; it's code style. likewise API - Always check for static errors before running tests. - Always run all tests relevant to any code changes before asking the user for further input. - When fixing a bug, capture it with a failing test before applying the fix. +- Avoid `readFileSync` unless critical; prefer async filesystem reads and document any sync IO. - Prefer avoiding mutable `let` for tests; use an IIFE or other pattern so types can be inferred. - Freeze API surface before use: any object literal, array literal, or function literal that escapes its creation context should be frozen (use `const { freeze } = Object;` and `freeze(...)`). Source: Jessie README, "Must freeze API Surface Before Use": https://github.com/endojs/Jessie/blob/main/README.md - Only freeze values you create (literals/functions). Do not freeze objects you receive from elsewhere (e.g., kit or purse objects returned by libraries); treat them as already-sealed API surfaces. diff --git a/packages/ertp-ledgerguise/DESIGN.md b/packages/ertp-ledgerguise/DESIGN.md new file mode 100644 index 0000000..fc7db28 --- /dev/null +++ b/packages/ertp-ledgerguise/DESIGN.md @@ -0,0 +1,74 @@ +# DESIGN + +## Goal + +Make the ERTP-to-GnuCash mapping readable directly from code by separating +declarative "plans" (relational intent) from effectful execution (SQL/Drizzle), +so intent can be reviewed without reading SQL and refactors do not blur +semantics. + +## Pattern: Plan + Interpreter + +- Define a small set of *plan steps* that represent relational intent + (select, retarget, mark reconciled). +- Build pure plan constructors in the domain layer. +- Execute plans in a single interpreter that performs SQL/Drizzle updates. + +This keeps specs readable in code while isolating imperative DB effects. + +### Example: Deposit (plan) + +- Find payment's holding split (by tx + holding account). +- Retarget that split to destination account. +- Mark affected splits reconciled. + +### Example: Deposit (interpreter) + +- Resolve the "hold split" via a select. +- Apply updates with a single SQL/Drizzle update per step. + +## Mapping: ERTP message -> Relational intent + +Treat each ERTP message as a plan of relational rewrites: + +- `withdraw(amount)` -> create holding transaction + splits +- `deposit(payment)` -> retarget holding split + reconcile +- `escrow.commit` -> finalize both sides' holds +- `escrow.cancel` -> revert holds to source accounts + +The intent should be described as plan steps, not inline SQL. + +## Static checks vs tests + +Plans make some checks static: + +- Plan shape checks (deposit must include retarget + reconcile). +- Capability discipline (no ambient IO or DB access leaks in plans). +- Data-flow invariants (hold IDs are produced before finalize steps). + +Still needs runtime tests: + +- Actual DB state changes and schema constraints. +- Ordering/race effects and promise timing. +- End-to-end integration against real sqlite backends. + +Use static checks for structure and capability hygiene, and keep a small set +of runtime tests for correctness. + +## Clock Injection + +Timestamped rows (e.g., `post_date`, `enter_date`) must read from an injected +clock capability, not ambient `Date.now()`. This keeps tests deterministic and +preserves ocap discipline. + +## Operational Notes + +- The interpreter can be swapped (Drizzle, better-sqlite3, D1). +- Plans are stable documentation: they are the spec. +- Tests should assert outcomes; plan shapes can be snapshot-tested if needed. + +## Next Steps (non-exhaustive) + +- Implement `planDeposit` and `runPlan`. +- Refactor `transferRecorder.finalizeHold` to use the plan/interpreter. +- Consider a small RA-inspired DSL only if plan shapes become repetitive. diff --git a/packages/ertp-ledgerguise/test/fixtures/README.md b/packages/ertp-ledgerguise/test/fixtures/README.md new file mode 100644 index 0000000..bc1cfdd --- /dev/null +++ b/packages/ertp-ledgerguise/test/fixtures/README.md @@ -0,0 +1,22 @@ +# Fixtures: ERTP to GnuCash Table Shapes + +These CSVs are example-first specs for how ERTP actions map into GnuCash SQL +tables. They are not exhaustive; they show the intended *shape* and example +values for key rows. + +## Conventions + +- GUIDs are illustrative placeholders (not real UUIDs). +- `comm-USD` is a placeholder for the commodity GUID used in tests. +- `acct-source` is the payment source account (holding/balance). +- `acct-dest` is the destination purse account. +- `value_num` / `value_denom` use GnuCash numeric representation. +- `reconcile_state` uses `n` (not reconciled) and `c` (cleared/reconciled). +- Dates are example timestamps. + +## Files + +- `withdraw-deposit-transactions.csv` and `withdraw-deposit-splits.csv` + show the final post-deposit state for a single payment. +- `escrow-commit-transactions.csv` and `escrow-commit-splits.csv` + show the final post-commit state for a two-party escrow. diff --git a/packages/ertp-ledgerguise/test/fixtures/escrow-commit-splits.csv b/packages/ertp-ledgerguise/test/fixtures/escrow-commit-splits.csv new file mode 100644 index 0000000..9fe0b4b --- /dev/null +++ b/packages/ertp-ledgerguise/test/fixtures/escrow-commit-splits.csv @@ -0,0 +1,5 @@ +guid,tx_guid,account_guid,value_num,value_denom,memo,reconcile_state +split-money-hold,tx-escrow-money,acct-vendor-money,10000,1,hold->commit,c +split-money-src,tx-escrow-money,acct-client-money,-10000,1,escrow withdraw,c +split-stock-hold,tx-escrow-stock,acct-client-stock,20,1,hold->commit,c +split-stock-src,tx-escrow-stock,acct-vendor-stock,-20,1,escrow withdraw,c diff --git a/packages/ertp-ledgerguise/test/fixtures/escrow-commit-transactions.csv b/packages/ertp-ledgerguise/test/fixtures/escrow-commit-transactions.csv new file mode 100644 index 0000000..db6e6ec --- /dev/null +++ b/packages/ertp-ledgerguise/test/fixtures/escrow-commit-transactions.csv @@ -0,0 +1,3 @@ +guid,currency_guid,num,post_date,enter_date,description +tx-escrow-money,comm-USD,20260124-0101,2026-01-24 00:05:00,2026-01-24 00:05:00,ledgerguise escrow money 10000 +tx-escrow-stock,comm-STOCK,20260124-0102,2026-01-24 00:05:00,2026-01-24 00:05:00,ledgerguise escrow stock 20 diff --git a/packages/ertp-ledgerguise/test/fixtures/withdraw-deposit-splits.csv b/packages/ertp-ledgerguise/test/fixtures/withdraw-deposit-splits.csv new file mode 100644 index 0000000..c8a7ad2 --- /dev/null +++ b/packages/ertp-ledgerguise/test/fixtures/withdraw-deposit-splits.csv @@ -0,0 +1,3 @@ +guid,tx_guid,account_guid,value_num,value_denom,memo,reconcile_state +split-hold-001,tx-hold-001,acct-dest,5000,1,hold->deposit,c +split-src-001,tx-hold-001,acct-source,-5000,1,withdraw,c diff --git a/packages/ertp-ledgerguise/test/fixtures/withdraw-deposit-transactions.csv b/packages/ertp-ledgerguise/test/fixtures/withdraw-deposit-transactions.csv new file mode 100644 index 0000000..0f383b4 --- /dev/null +++ b/packages/ertp-ledgerguise/test/fixtures/withdraw-deposit-transactions.csv @@ -0,0 +1,2 @@ +guid,currency_guid,num,post_date,enter_date,description +tx-hold-001,comm-USD,00:00,2026-01-24 00:00:00,2026-01-24 00:00:00,ledgerguise 5000 diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index a7e9f6a..26fda0f 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -5,15 +5,42 @@ import test from 'ava'; import Database from 'better-sqlite3'; -import type { Brand, NatAmount } from '../src/ertp-types'; +import { readFile } from 'node:fs/promises'; +import { createRequire } from 'node:module'; +import type { Brand, NatAmount } from '../src/ertp-types.js'; import { createIssuerKit, initGnuCashSchema, openIssuerKit, wrapBetterSqlite3Database, -} from '../src/index'; -import { mockMakeGuid } from '../src/guids'; -import { makeTestClock } from './helpers/clock'; +} from '../src/index.js'; +import { mockMakeGuid } from '../src/guids.js'; +import { makeTestClock } from './helpers/clock.js'; + +const nodeRequire = createRequire(import.meta.url); +const asset = (spec: string) => readFile(nodeRequire.resolve(spec), 'utf8'); +const parseCsv = (text: string): Record[] => { + const trimmed = text.trim(); + if (!trimmed) return []; + const lines = trimmed.split(/\r?\n/); + const headers = lines[0]?.split(',') ?? []; + return lines.slice(1).filter(Boolean).map(line => { + const values = line.split(','); + return headers.reduce( + (row, header, index) => ({ ...row, [header]: values[index] ?? '' }), + {} as Record, + ); + }); +}; +const toRowStrings = (rows: Record[], columns: string[]) => { + const widths = columns.map(column => + Math.max(column.length, ...rows.map(row => String(row[column] ?? '').length)), + ); + const format = (row: Record) => + columns.map((column, index) => String(row[column] ?? '').padEnd(widths[index])).join(' | '); + const header = Object.fromEntries(columns.map(column => [column, column])); + return [format(header), ...rows.map(format)]; +}; test('initGnuCashSchema creates GnuCash tables', t => { const rawDb = new Database(':memory:'); @@ -102,6 +129,145 @@ test('deposit returns the payment amount', t => { t.is(secondDeposit.value, 3n); }); +test('fixture: withdraw-deposit matches ledger rows', async t => { + const { freeze } = Object; + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); + initGnuCashSchema(db); + + const makeGuid = mockMakeGuid(); + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const nowMs = (() => { + const fixed = Date.UTC(2026, 0, 24, 0, 0); + return () => fixed; + })(); + const issuedKit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const brand = issuedKit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + const purse = issuedKit.issuer.makeEmptyPurse(); + const payment = issuedKit.mint.mintPayment(bucks(5000n)); + purse.deposit(payment); + + const { holdingAccountGuid } = issuedKit.mintInfo.getMintInfo(); + const destAccountGuid = issuedKit.purses.getGuid(purse); + const expectedTx = parseCsv( + await asset('./fixtures/withdraw-deposit-transactions.csv'), + )[0]; + const expectedSplits = parseCsv( + await asset('./fixtures/withdraw-deposit-splits.csv'), + ); + const normalize = (row: Record) => { + const resolved = { ...row }; + if (resolved.currency_guid === 'comm-USD') { + resolved.currency_guid = issuedKit.commodityGuid; + } + if (resolved.account_guid === 'acct-source') { + resolved.account_guid = holdingAccountGuid; + } + if (resolved.account_guid === 'acct-dest') { + resolved.account_guid = destAccountGuid; + } + return resolved; + }; + + const txRows = db + .prepare< + [], + { + guid: string; + currency_guid: string; + num: string; + post_date: string; + enter_date: string; + description: string; + } + >('SELECT guid, currency_guid, num, post_date, enter_date, description FROM transactions') + .all(); + t.is(txRows.length, 1); + const actualTx = txRows[0]; + const expectedTxNormalized = normalize(expectedTx); + t.deepEqual( + { + currency_guid: actualTx.currency_guid, + num: actualTx.num, + post_date: actualTx.post_date, + enter_date: actualTx.enter_date, + description: actualTx.description, + }, + { + currency_guid: expectedTxNormalized.currency_guid, + num: expectedTxNormalized.num, + post_date: expectedTxNormalized.post_date, + enter_date: expectedTxNormalized.enter_date, + description: expectedTxNormalized.description, + }, + ); + + const splitRows = db + .prepare< + [string], + { + account_guid: string; + value_num: string; + value_denom: string; + reconcile_state: string; + } + >( + [ + 'SELECT account_guid, value_num, value_denom, reconcile_state', + 'FROM splits', + 'WHERE tx_guid = ?', + ].join(' '), + ) + .all(actualTx.guid); + const actualSplits = splitRows + .map(row => ({ + account_guid: row.account_guid, + value_num: String(row.value_num), + value_denom: String(row.value_denom), + reconcile_state: row.reconcile_state, + })) + .sort((left, right) => left.account_guid.localeCompare(right.account_guid)); + const expectedSplitRows = expectedSplits + .map(row => normalize(row)) + .map(row => ({ + account_guid: row.account_guid, + value_num: row.value_num, + value_denom: row.value_denom, + reconcile_state: row.reconcile_state, + })) + .sort((left, right) => left.account_guid.localeCompare(right.account_guid)); + t.deepEqual(actualSplits, expectedSplitRows); + t.snapshot( + toRowStrings( + [ + { + currency_guid: actualTx.currency_guid, + num: actualTx.num, + post_date: actualTx.post_date, + enter_date: actualTx.enter_date, + description: actualTx.description, + }, + ], + ['currency_guid', 'num', 'post_date', 'enter_date', 'description'], + ), + 'withdraw-deposit transactions', + ); + t.snapshot( + toRowStrings(actualSplits, [ + 'account_guid', + 'value_num', + 'value_denom', + 'reconcile_state', + ]), + 'withdraw-deposit splits', + ); +}); + test('alice-to-bob transfer records a single transaction', t => { const { freeze } = Object; const rawDb = new Database(':memory:'); diff --git a/packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.md new file mode 100644 index 0000000..4ddd418 --- /dev/null +++ b/packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.md @@ -0,0 +1,22 @@ +# Snapshot report for `test/ledgerguise.test.ts` + +The actual snapshot is saved in `ledgerguise.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## fixture: withdraw-deposit matches ledger rows + +> withdraw-deposit transactions + + [ + 'currency_guid | num | post_date | enter_date | description ', + '00000000000000000000000000000000 | 00:00 | 2026-01-24 00:00:00 | 2026-01-24 00:00:00 | ledgerguise 5000', + ] + +> withdraw-deposit splits + + [ + 'account_guid | value_num | value_denom | reconcile_state', + '00000000000000000000000000000001 | 5000 | 1 | c ', + '4ef94b1359f917d83e0fe843dce22274 | -5000 | 1 | c ', + ] From 1b5c5ca33b63251d52a9bc5b294f8128bbd34b7f Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 24 Jan 2026 12:59:25 -0600 Subject: [PATCH 40/77] test(ertp-ledgerguise): shorten GUIDs in community snapshots - snapshot account/register GUIDs using trailing 12 chars - skip book root GUID in register path labels --- .../ertp-ledgerguise/test/community.test.ts | 121 ++++++++ .../test/snapshots/community.test.ts.md | 269 ++++++++++++++++++ 2 files changed, 390 insertions(+) create mode 100644 packages/ertp-ledgerguise/test/snapshots/community.test.ts.md diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts index 8967b22..c72593d 100644 --- a/packages/ertp-ledgerguise/test/community.test.ts +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -75,6 +75,19 @@ const getTotalForAccountType = ( ) as { total: string } | undefined; return BigInt(row?.total ?? '0'); }; +const toRowStrings = ( + rows: Record[], + columns: string[], +): string[] => { + const widths = columns.map(column => + Math.max(column.length, ...rows.map(row => String(row[column] ?? '').length)), + ); + const format = (row: Record) => + columns.map((column, index) => String(row[column] ?? '').padEnd(widths[index])).join(' | '); + const header = Object.fromEntries(columns.map(column => [column, column])); + return [format(header), ...rows.map(format)]; +}; +const shortGuid = (value: string) => value.slice(-12); serial.before(t => { const { freeze } = Object; @@ -304,4 +317,112 @@ serial('stage 4: run balance sheet and income statement', t => { t.is(getTotalForAccountType(db, kit.commodityGuid, 'EQUITY'), 0n); t.is(getTotalForAccountType(db, kit.commodityGuid, 'EXPENSE'), 0n); t.is(getTotalForAccountType(db, kit.commodityGuid, 'INCOME'), 0n); + + const accounts = db + .prepare< + [string], + { + guid: string; + name: string; + parent_guid: string | null; + account_type: string; + placeholder: number; + } + >( + [ + 'SELECT guid, name, parent_guid, account_type, placeholder', + 'FROM accounts', + 'WHERE commodity_guid = ?', + 'ORDER BY guid', + ].join(' '), + ) + .all(kit.commodityGuid); + const book = db + .prepare<[], { root_account_guid: string }>( + 'SELECT root_account_guid FROM books LIMIT 1', + ) + .get(); + const rootGuid = book?.root_account_guid ?? ''; + t.snapshot( + toRowStrings( + accounts.map(row => ({ + guid: shortGuid(row.guid), + name: row.name, + parent_guid: row.parent_guid ? shortGuid(row.parent_guid) : '', + account_type: row.account_type, + placeholder: row.placeholder ? '1' : '0', + })), + ['guid', 'name', 'parent_guid', 'account_type', 'placeholder'], + ), + 'accounts view', + ); + + const registerColumns = ['tx_guid', 'num', 'description', 'value_num', 'reconcile_state']; + const accountByGuid = new Map(accounts.map(account => [account.guid, account])); + const accountLabelCache = new Map(); + const toAccountLabel = (guid: string): string => { + const cached = accountLabelCache.get(guid); + if (cached) return cached; + const account = accountByGuid.get(guid); + if (!account) return guid; + const label = + account.parent_guid && account.parent_guid !== '' && account.parent_guid !== rootGuid + ? `${toAccountLabel(account.parent_guid)}:${account.name}` + : account.name; + accountLabelCache.set(guid, label); + return label; + }; + for (const account of accounts) { + const registerRows = db + .prepare< + [string], + { + tx_guid: string; + num: string; + description: string; + value_num: string; + reconcile_state: string; + } + >( + [ + 'SELECT splits.tx_guid, transactions.num, transactions.description,', + 'splits.value_num, splits.reconcile_state', + 'FROM splits JOIN transactions ON splits.tx_guid = transactions.guid', + 'WHERE splits.account_guid = ?', + 'ORDER BY splits.tx_guid, splits.guid', + ].join(' '), + ) + .all(account.guid); + t.snapshot( + toRowStrings( + registerRows.map(row => ({ + tx_guid: shortGuid(row.tx_guid), + num: row.num, + description: row.description, + value_num: row.value_num, + reconcile_state: row.reconcile_state, + })), + registerColumns, + ), + `register: ${toAccountLabel(account.guid)}`, + ); + } + + const balanceSheetRows = ['STOCK', 'EQUITY'].map(accountType => ({ + account_type: accountType, + total: getTotalForAccountType(db, kit.commodityGuid, accountType, [holdingGuid]).toString(), + })); + t.snapshot( + toRowStrings(balanceSheetRows, ['account_type', 'total']), + 'balance sheet', + ); + + const incomeStatementRows = ['INCOME', 'EXPENSE'].map(accountType => ({ + account_type: accountType, + total: getTotalForAccountType(db, kit.commodityGuid, accountType, [holdingGuid]).toString(), + })); + t.snapshot( + toRowStrings(incomeStatementRows, ['account_type', 'total']), + 'income statement', + ); }); diff --git a/packages/ertp-ledgerguise/test/snapshots/community.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/community.test.ts.md new file mode 100644 index 0000000..7fd9009 --- /dev/null +++ b/packages/ertp-ledgerguise/test/snapshots/community.test.ts.md @@ -0,0 +1,269 @@ +# Snapshot report for `test/community.test.ts` + +The actual snapshot is saved in `community.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## stage 4: run balance sheet and income statement + +> accounts view + + [ + 'guid | name | parent_guid | account_type | placeholder', + '000000000001 | Org1 | e7ee18a10171 | STOCK | 0 ', + '000000000002 | BUCKS Mint | e7ee18a10171 | STOCK | 1 ', + '000000000003 | Treasury | 000000000001 | STOCK | 0 ', + '000000000007 | Work | 000000000001 | STOCK | 0 ', + '000000000008 | In | 000000000001 | STOCK | 0 ', + '000000000009 | Out | 000000000001 | STOCK | 0 ', + '00000000000a | Alice | 000000000008 | STOCK | 0 ', + '00000000000b | Alice | 000000000009 | STOCK | 0 ', + '00000000000c | Bob | 000000000008 | STOCK | 0 ', + '00000000000d | Bob | 000000000009 | STOCK | 0 ', + '00000000000e | Carol | 000000000008 | STOCK | 0 ', + '00000000000f | Carol | 000000000009 | STOCK | 0 ', + '000000000010 | Dave | 000000000008 | STOCK | 0 ', + '000000000011 | Dave | 000000000009 | STOCK | 0 ', + '000000000012 | Peggy | 000000000008 | STOCK | 0 ', + '000000000013 | Peggy | 000000000009 | STOCK | 0 ', + '000000000014 | Mallory | 000000000008 | STOCK | 0 ', + '000000000015 | Mallory | 000000000009 | STOCK | 0 ', + '000000000016 | Eve | 000000000008 | STOCK | 0 ', + '000000000017 | Eve | 000000000009 | STOCK | 0 ', + 'aec41e1716bb | BUCKS Mint Recovery | 000000000002 | STOCK | 0 ', + 'e843dce22274 | BUCKS Mint Holding | 000000000002 | STOCK | 0 ', + ] + +> register: Org1 + + [ + 'tx_guid | num | description | value_num | reconcile_state', + ] + +> register: BUCKS Mint + + [ + 'tx_guid | num | description | value_num | reconcile_state', + ] + +> register: Org1:Treasury + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '000000000004 | 09:15 | ledgerguise 10000 | 10000 | c ', + '000000000018 | issue-123 | #123: improve treasury report | -1 | c ', + '00000000001d | issue-124 | #124: refactor chart placement | -2 | c ', + '000000000022 | issue-125 | #125: audit mint recovery | -3 | c ', + '000000000027 | issue-126 | #126: document escrow flow | -4 | c ', + '00000000002c | issue-127 | #127: tighten adversarial tests | -5 | c ', + '000000000031 | issue-128 | #128: improve treasury report | -1 | c ', + '000000000036 | issue-129 | #129: refactor chart placement | -2 | c ', + '00000000003b | issue-130 | #130: audit mint recovery | -3 | c ', + '000000000040 | issue-131 | #131: document escrow flow | -4 | c ', + '000000000045 | issue-132 | #132: tighten adversarial tests | -5 | c ', + '00000000004a | issue-133 | #133: improve treasury report | -1 | c ', + '00000000004f | issue-134 | #134: refactor chart placement | -2 | c ', + '000000000054 | issue-135 | #135: audit mint recovery | -3 | c ', + '000000000059 | issue-136 | #136: document escrow flow | -4 | c ', + '00000000005e | issue-137 | #137: tighten adversarial tests | -5 | c ', + '000000000063 | issue-138 | #138: improve treasury report | -1 | c ', + '000000000068 | issue-139 | #139: refactor chart placement | -2 | c ', + '00000000006d | issue-140 | #140: audit mint recovery | -3 | c ', + '000000000072 | issue-141 | #141: document escrow flow | -4 | c ', + '000000000077 | issue-142 | #142: tighten adversarial tests | -5 | c ', + '00000000007c | issue-143 | #143: improve treasury report | -1 | c ', + ] + +> register: Org1:Work + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '000000000018 | issue-123 | #123: improve treasury report | 1 | c ', + '00000000001d | issue-124 | #124: refactor chart placement | 2 | c ', + '000000000022 | issue-125 | #125: audit mint recovery | 3 | c ', + '000000000027 | issue-126 | #126: document escrow flow | 4 | c ', + '00000000002c | issue-127 | #127: tighten adversarial tests | 5 | c ', + '000000000031 | issue-128 | #128: improve treasury report | 1 | c ', + '000000000036 | issue-129 | #129: refactor chart placement | 2 | c ', + '00000000003b | issue-130 | #130: audit mint recovery | 3 | c ', + '000000000040 | issue-131 | #131: document escrow flow | 4 | c ', + '000000000045 | issue-132 | #132: tighten adversarial tests | 5 | c ', + '00000000004a | issue-133 | #133: improve treasury report | 1 | c ', + '00000000004f | issue-134 | #134: refactor chart placement | 2 | c ', + '000000000054 | issue-135 | #135: audit mint recovery | 3 | c ', + '000000000059 | issue-136 | #136: document escrow flow | 4 | c ', + '00000000005e | issue-137 | #137: tighten adversarial tests | 5 | c ', + '000000000063 | issue-138 | #138: improve treasury report | 1 | c ', + '000000000068 | issue-139 | #139: refactor chart placement | 2 | c ', + '00000000006d | issue-140 | #140: audit mint recovery | 3 | c ', + '000000000072 | issue-141 | #141: document escrow flow | 4 | c ', + '000000000077 | issue-142 | #142: tighten adversarial tests | 5 | c ', + '00000000007c | issue-143 | #143: improve treasury report | 1 | c ', + ] + +> register: Org1:In + + [ + 'tx_guid | num | description | value_num | reconcile_state', + ] + +> register: Org1:Out + + [ + 'tx_guid | num | description | value_num | reconcile_state', + ] + +> register: Org1:In:Alice + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '000000000018 | issue-123 | #123: improve treasury report | -1 | c ', + '00000000005e | issue-137 | #137: tighten adversarial tests | -5 | c ', + '000000000063 | issue-138 | #138: improve treasury report | -1 | c ', + ] + +> register: Org1:Out:Alice + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '000000000018 | issue-123 | #123: improve treasury report | 1 | c ', + '00000000005e | issue-137 | #137: tighten adversarial tests | 5 | c ', + '000000000063 | issue-138 | #138: improve treasury report | 1 | c ', + ] + +> register: Org1:In:Bob + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '00000000003b | issue-130 | #130: audit mint recovery | -3 | c ', + ] + +> register: Org1:Out:Bob + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '00000000003b | issue-130 | #130: audit mint recovery | 3 | c ', + ] + +> register: Org1:In:Carol + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '00000000001d | issue-124 | #124: refactor chart placement | -2 | c ', + '000000000022 | issue-125 | #125: audit mint recovery | -3 | c ', + '000000000068 | issue-139 | #139: refactor chart placement | -2 | c ', + ] + +> register: Org1:Out:Carol + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '00000000001d | issue-124 | #124: refactor chart placement | 2 | c ', + '000000000022 | issue-125 | #125: audit mint recovery | 3 | c ', + '000000000068 | issue-139 | #139: refactor chart placement | 2 | c ', + ] + +> register: Org1:In:Dave + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '000000000040 | issue-131 | #131: document escrow flow | -4 | c ', + '000000000045 | issue-132 | #132: tighten adversarial tests | -5 | c ', + ] + +> register: Org1:Out:Dave + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '000000000040 | issue-131 | #131: document escrow flow | 4 | c ', + '000000000045 | issue-132 | #132: tighten adversarial tests | 5 | c ', + ] + +> register: Org1:In:Peggy + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '000000000027 | issue-126 | #126: document escrow flow | -4 | c ', + '00000000006d | issue-140 | #140: audit mint recovery | -3 | c ', + '000000000072 | issue-141 | #141: document escrow flow | -4 | c ', + ] + +> register: Org1:Out:Peggy + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '000000000027 | issue-126 | #126: document escrow flow | 4 | c ', + '00000000006d | issue-140 | #140: audit mint recovery | 3 | c ', + '000000000072 | issue-141 | #141: document escrow flow | 4 | c ', + ] + +> register: Org1:In:Mallory + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '00000000004a | issue-133 | #133: improve treasury report | -1 | c ', + ] + +> register: Org1:Out:Mallory + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '00000000004a | issue-133 | #133: improve treasury report | 1 | c ', + ] + +> register: Org1:In:Eve + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '00000000002c | issue-127 | #127: tighten adversarial tests | -5 | c ', + '000000000031 | issue-128 | #128: improve treasury report | -1 | c ', + '000000000036 | issue-129 | #129: refactor chart placement | -2 | c ', + '00000000004f | issue-134 | #134: refactor chart placement | -2 | c ', + '000000000054 | issue-135 | #135: audit mint recovery | -3 | c ', + '000000000059 | issue-136 | #136: document escrow flow | -4 | c ', + '000000000077 | issue-142 | #142: tighten adversarial tests | -5 | c ', + '00000000007c | issue-143 | #143: improve treasury report | -1 | c ', + ] + +> register: Org1:Out:Eve + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '00000000002c | issue-127 | #127: tighten adversarial tests | 5 | c ', + '000000000031 | issue-128 | #128: improve treasury report | 1 | c ', + '000000000036 | issue-129 | #129: refactor chart placement | 2 | c ', + '00000000004f | issue-134 | #134: refactor chart placement | 2 | c ', + '000000000054 | issue-135 | #135: audit mint recovery | 3 | c ', + '000000000059 | issue-136 | #136: document escrow flow | 4 | c ', + '000000000077 | issue-142 | #142: tighten adversarial tests | 5 | c ', + '00000000007c | issue-143 | #143: improve treasury report | 1 | c ', + ] + +> register: BUCKS Mint:BUCKS Mint Recovery + + [ + 'tx_guid | num | description | value_num | reconcile_state', + ] + +> register: BUCKS Mint:BUCKS Mint Holding + + [ + 'tx_guid | num | description | value_num | reconcile_state', + '000000000004 | 09:15 | ledgerguise 10000 | -10000 | c ', + ] + +> balance sheet + + [ + 'account_type | total', + 'STOCK | 10000', + 'EQUITY | 0 ', + ] + +> income statement + + [ + 'account_type | total', + 'INCOME | 0 ', + 'EXPENSE | 0 ', + ] From b12129861c6c8f542952cde23fd48d51b04d0648 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 24 Jan 2026 14:09:14 -0600 Subject: [PATCH 41/77] test(ertp-ledgerguise): refine design-doc narrative - add withdraw hold snapshot and clarify transaction vs split tables - expand naming/chart prose and adjust headings - tighten snapshot fields and account-name joins - keep multi-commodity example as TODO --- .../ertp-ledgerguise/test/design-doc.test.ts | 372 ++++++++++++++++++ .../test/snapshots/design-doc.test.ts.md | 85 ++++ 2 files changed, 457 insertions(+) create mode 100644 packages/ertp-ledgerguise/test/design-doc.test.ts create mode 100644 packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts new file mode 100644 index 0000000..b96f4c4 --- /dev/null +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -0,0 +1,372 @@ +/** + * @file Snapshot-based design doc for ERTP->GnuCash mapping. + */ + +import test from 'ava'; +import type { ExecutionContext } from 'ava'; +import type { TestFn } from 'ava'; +import Database from 'better-sqlite3'; +import type { Brand, NatAmount } from '../src/ertp-types.js'; +import { + createIssuerKit, + initGnuCashSchema, + makeChartFacet, + wrapBetterSqlite3Database, +} from '../src/index.js'; +import type { Guid } from '../src/types.js'; +import { mockMakeGuid } from '../src/guids.js'; +import { makeTestClock } from './helpers/clock.js'; + +const toRowStrings = ( + rows: Record[], + columns: string[], +): string[] => { + if (rows.length === 0) return [columns.join(' | ')]; + const widths = columns.map(column => + Math.max( + column.length, + ...rows.map(row => String(row[column] ?? '').length), + ), + ); + const format = (row: Record) => + columns + .map((column, index) => String(row[column] ?? '').padEnd(widths[index])) + .join(' | '); + const header = Object.fromEntries(columns.map(column => [column, column])); + return [format(header), ...rows.map(format)]; +}; + +const shortGuid = (value: string) => value.slice(-12); + +type DesignContext = { + db: ReturnType; + kit: ReturnType; + purse: ReturnType< + ReturnType['issuer']['makeEmptyPurse'] + >; +}; + +let closeDb: (() => void) | undefined; + +const withDesignContext = (t: ExecutionContext) => { + const { freeze } = Object; + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + initGnuCashSchema(db); + + const makeGuid = mockMakeGuid(); + const nowMs = makeTestClock(Date.UTC(2026, 0, 24, 0, 0), 1); + const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); + const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const brand = kit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + + const purse = kit.issuer.makeEmptyPurse(); + const payment = kit.mint.mintPayment(bucks(5n)); + purse.deposit(payment); + + closeDb = () => rawDb.close(); + t.context = { db, kit, purse }; +}; + +const serial = test.serial as TestFn; + +serial.before(withDesignContext); +serial.after(() => closeDb?.()); + +serial('Mint and deposit (minimal DB impact)', t => { + const { db } = t.context; + const txRows = db + .prepare< + [], + { + guid: string; + num: string; + post_date: string | null; + enter_date: string | null; + } + >( + [ + 'SELECT guid, num, post_date, enter_date', + 'FROM transactions', + 'ORDER BY guid', + ].join(' '), + ) + .all() + .map(row => ({ + guid: shortGuid(row.guid), + num: row.num, + post_date: row.post_date?.split(' ')[0] ?? '', + enter_date: row.enter_date?.split(' ')[0] ?? '', + })); + const splitRows = db + .prepare< + [], + { + guid: string; + tx_guid: string; + account_guid: string; + value_num: string; + value_denom: string; + reconcile_state: string; + } + >( + [ + 'SELECT guid, tx_guid, account_guid, value_num, value_denom, reconcile_state', + 'FROM splits', + 'ORDER BY guid', + ].join(' '), + ) + .all() + .map(row => ({ + guid: shortGuid(row.guid), + tx_guid: shortGuid(row.tx_guid), + account_guid: shortGuid(row.account_guid), + value_num: row.value_num, + value_denom: row.value_denom, + reconcile_state: row.reconcile_state, + })); + t.snapshot( + toRowStrings(txRows, [ + 'guid', + 'currency_guid', + 'num', + 'post_date', + 'enter_date', + 'description', + ]), + [ + 'GnuCash is an accounting program; a bit like Quicken but based more on traditional double-entry accounting.', + 'ERTP is a flexible Electronic Rights protocol.', + 'ERTP is flexible enough that we can implement it on top of a GnuCash database.', + '', + 'We start with the smallest ERTP action that writes to the database: mint 5 BUCKS and deposit them into a purse.', + 'This creates one transaction and two splits, moving value from the mint holding account into the purse.', + ].join('\n'), + ); + t.snapshot( + toRowStrings(splitRows, [ + 'guid', + 'tx_guid', + 'account_guid', + 'value_num', + 'value_denom', + 'reconcile_state', + ]), + [ + 'Splits show the value move: one positive into the purse account and one negative out of the mint holding account.', + '', + 'Context: before the deposit we already created issuer and purse records:', + ' const { issuer } = makeIssuerKit("BUCKS");', + ' const purse = issuer.makeEmptyPurse();', + '', + 'Those actions touch other tables too:', + '- createIssuerKit inserts a commodity row (BUCKS) and creates mint recovery/holding accounts.', + '- makeEmptyPurse inserts an account row for the new purse (later named via ChartFacet).', + ].join('\n'), + ); +}); + +serial('ERTP is separate from naming', t => { + const { db, kit } = t.context; + const accounts = db + .prepare< + [string], + { + guid: string; + name: string; + parent_guid: string | null; + account_type: string; + placeholder: number; + } + >( + [ + 'SELECT guid, name, parent_guid, account_type, placeholder', + 'FROM accounts', + 'WHERE commodity_guid = ?', + 'ORDER BY guid', + ].join(' '), + ) + .all(kit.commodityGuid); + const accountsView = accounts + .filter(row => row.name === row.guid) + .map(row => ({ + guid: shortGuid(row.guid), + name: row.name, + parent_guid: row.parent_guid ? shortGuid(row.parent_guid) : '', + account_type: row.account_type, + placeholder: row.placeholder ? '1' : '0', + })); + t.snapshot( + toRowStrings(accountsView, [ + 'guid', + 'name', + 'parent_guid', + 'account_type', + 'placeholder', + ]), + [ + 'ERTP mints are separate from human-facing names.', + 'Anyone can create an ERTP `Mint`; if someone called it USD when it was not, that would be trouble.', + 'Until a chart names accounts, the ledger is correct but opaque to humans.', + ].join('\n'), + ); +}); + +serial('Giving names in the chart of accounts', t => { + const { db, kit, purse } = t.context; + const root = db + .prepare<[], { root_account_guid: string }>( + 'SELECT root_account_guid FROM books LIMIT 1', + ) + .get(); + const chart = makeChartFacet({ + db, + commodityGuid: kit.commodityGuid, + getPurseGuid: kit.purses.getGuid, + }); + chart.placePurse({ + purse, + name: 'Alice', + parentGuid: root?.root_account_guid as Guid, + accountType: 'STOCK', + }); + const accountsViewNamed = db + .prepare< + [string], + { + guid: string; + name: string; + parent_guid: string | null; + account_type: string; + placeholder: number; + } + >( + [ + 'SELECT guid, name, parent_guid, account_type, placeholder', + 'FROM accounts', + 'WHERE commodity_guid = ?', + 'ORDER BY guid', + ].join(' '), + ) + .all(kit.commodityGuid) + .map(row => ({ + guid: shortGuid(row.guid), + name: row.name, + parent_guid: row.parent_guid ? shortGuid(row.parent_guid) : '', + account_type: row.account_type, + placeholder: row.placeholder ? '1' : '0', + })); + t.snapshot( + toRowStrings(accountsViewNamed, [ + 'guid', + 'name', + 'parent_guid', + 'account_type', + 'placeholder', + ]), + [ + 'makeIssuerKit("BUCKS") was a simplification.', + 'The actual setup wires a chart facet so we can name accounts:', + ' const kit = createIssuerKit({ db, ... });', + ' const chart = makeChartFacet({ db, getPurseGuid: kit.purses.getGuid, ... });', + ' chart.placePurse({ purse, name: "Alice", parentGuid: rootGuid, accountType: "STOCK" });', + '', + 'Placing the purse under a parent account gives it a human name and a path (e.g., Org1:Alice).', + ].join('\n'), + ); +}); + +serial('Withdraw creates a hold', t => { + const { freeze } = Object; + const { db, kit, purse } = t.context; + const brand = kit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + + purse.withdraw(bucks(2n)); + + const txRows = db + .prepare< + [], + { + guid: string; + currency_guid: string; + num: string; + post_date: string | null; + enter_date: string | null; + description: string; + } + >( + [ + 'SELECT guid, currency_guid, num, post_date, enter_date, description', + 'FROM transactions', + 'ORDER BY guid', + ].join(' '), + ) + .all() + .map(row => ({ + guid: shortGuid(row.guid), + currency_guid: shortGuid(row.currency_guid), + num: row.num, + post_date: row.post_date?.split(' ')[0] ?? '', + enter_date: row.enter_date?.split(' ')[0] ?? '', + description: row.description, + })); + const splitRows = db + .prepare< + [], + { + guid: string; + tx_guid: string; + account_guid: string; + account_name: string; + value_num: string; + value_denom: string; + reconcile_state: string; + } + >( + [ + 'SELECT splits.guid, splits.tx_guid, splits.account_guid, accounts.name AS account_name,', + 'splits.value_num, splits.value_denom, splits.reconcile_state', + 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', + 'ORDER BY splits.guid', + ].join(' '), + ) + .all() + .map(row => ({ + guid: shortGuid(row.guid), + tx_guid: shortGuid(row.tx_guid), + account_guid: shortGuid(row.account_guid), + account_name: row.account_name, + value_num: row.value_num, + value_denom: row.value_denom, + reconcile_state: row.reconcile_state, + })); + t.snapshot( + toRowStrings(txRows, [ + 'guid', + 'num', + 'post_date', + 'enter_date', + ]), + [ + 'Withdraw removes value from the purse by creating a new hold transaction, in addition to the earlier mint/deposit transaction.', + 'The split table shows the line items for that new transaction.', + 'The hold keeps value in a dedicated holding account until deposit or cancel.', + ].join('\n'), + ); + t.snapshot( + toRowStrings(splitRows, [ + 'guid', + 'tx_guid', + 'account_guid', + 'account_name', + 'value_num', + 'value_denom', + 'reconcile_state', + ]), + 'Hold splits show the value leaving the purse and landing in the holding account.', + ); +}); + +test.todo('Multi-commodity swaps: show ledger rows for two brands'); diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md new file mode 100644 index 0000000..698b438 --- /dev/null +++ b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md @@ -0,0 +1,85 @@ +# Snapshot report for `test/design-doc.test.ts` + +The actual snapshot is saved in `design-doc.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## Mint and deposit (minimal DB impact) + +> GnuCash is an accounting program; a bit like Quicken but based more on traditional double-entry accounting. +> ERTP is a flexible Electronic Rights protocol. +> ERTP is flexible enough that we can implement it on top of a GnuCash database. +> +> We start with the smallest ERTP action that writes to the database: mint 5 BUCKS and deposit them into a purse. +> This creates one transaction and two splits, moving value from the mint holding account into the purse. + + [ + 'guid | currency_guid | num | post_date | enter_date | description', + '000000000002 | | 00:00 | 2026-01-24 | 2026-01-24 | ', + ] + +> Splits show the value move: one positive into the purse account and one negative out of the mint holding account. +> +> Context: before the deposit we already created issuer and purse records: +> const { issuer } = makeIssuerKit("BUCKS"); +> const purse = issuer.makeEmptyPurse(); +> +> Those actions touch other tables too: +> - createIssuerKit inserts a commodity row (BUCKS) and creates mint recovery/holding accounts. +> - makeEmptyPurse inserts an account row for the new purse (later named via ChartFacet). + + [ + 'guid | tx_guid | account_guid | value_num | value_denom | reconcile_state', + '000000000003 | 000000000002 | 000000000001 | 5 | 1 | c ', + '000000000004 | 000000000002 | e843dce22274 | -5 | 1 | c ', + ] + +## ERTP is separate from naming + +> ERTP mints are separate from human-facing names. +> Anyone can create an ERTP `Mint`; if someone called it USD when it was not, that would be trouble. +> Until a chart names accounts, the ledger is correct but opaque to humans. + + [ + 'guid | name | parent_guid | account_type | placeholder', + '000000000001 | 00000000000000000000000000000001 | | ASSET | 0 ', + ] + +## Giving names in the chart of accounts + +> makeIssuerKit("BUCKS") was a simplification. +> The actual setup wires a chart facet so we can name accounts: +> const kit = createIssuerKit({ db, ... }); +> const chart = makeChartFacet({ db, getPurseGuid: kit.purses.getGuid, ... }); +> chart.placePurse({ purse, name: "Alice", parentGuid: rootGuid, accountType: "STOCK" }); +> +> Placing the purse under a parent account gives it a human name and a path (e.g., Org1:Alice). + + [ + 'guid | name | parent_guid | account_type | placeholder', + '000000000001 | Alice | e7ee18a10171 | STOCK | 0 ', + 'aec41e1716bb | BUCKS Mint Recovery | | STOCK | 0 ', + 'e843dce22274 | BUCKS Mint Holding | | STOCK | 0 ', + ] + +## Withdraw creates a hold + +> Withdraw removes value from the purse by creating a new hold transaction, in addition to the earlier mint/deposit transaction. +> The split table shows the line items for that new transaction. +> The hold keeps value in a dedicated holding account until deposit or cancel. + + [ + 'guid | num | post_date | enter_date', + '000000000002 | 00:00 | 2026-01-24 | 2026-01-24', + '000000000005 | 00:00.2 | 2026-01-25 | 2026-01-25', + ] + +> Hold splits show the value leaving the purse and landing in the holding account. + + [ + 'guid | tx_guid | account_guid | account_name | value_num | value_denom | reconcile_state', + '000000000003 | 000000000002 | 000000000001 | Alice | 5 | 1 | c ', + '000000000004 | 000000000002 | e843dce22274 | BUCKS Mint Holding | -5 | 1 | c ', + '000000000006 | 000000000005 | e843dce22274 | BUCKS Mint Holding | 2 | 1 | n ', + '000000000007 | 000000000005 | 000000000001 | Alice | -2 | 1 | n ', + ] From ec28e90f3b597ed39d88b97516fe7ddf949365e7 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 24 Jan 2026 21:30:57 -0600 Subject: [PATCH 42/77] commit ava .snap files --- .../test/snapshots/community.test.ts.snap | Bin 0 -> 2198 bytes .../test/snapshots/design-doc.test.ts.snap | Bin 0 -> 1724 bytes .../test/snapshots/ledgerguise.test.ts.snap | Bin 0 -> 433 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/ertp-ledgerguise/test/snapshots/community.test.ts.snap create mode 100644 packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap create mode 100644 packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.snap diff --git a/packages/ertp-ledgerguise/test/snapshots/community.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/community.test.ts.snap new file mode 100644 index 0000000000000000000000000000000000000000..79713c4ae6e9bba8042be73769670c45942e4e8b GIT binary patch literal 2198 zcmb7?X*|@68pnr0j4hf^vP8$8G`2#>5>3?Dvu{HNlVmANm>9AQCLEPz3WYf$Te#V0 zPPP-1k!6I2A+l#Q6Mwhioax;Ax%a-k&ztA>efAfRg{#FW=iB}fcS6GNo{G_ffI)>U=R&8~@F_>Tf({q(H(`)YlT&4wuf0|7U zCD2>w=JI|D{q|0P3N0uWb6el*a1F_^#OLIiU0x{kAkgcpg5qLo#33&;_D)w48wFJ>BnR@#B$P zB3UmK1~Qiy{a!FdX+Z|IgF6DtcYX!9=!W_k=3eGb2*ZnQEAKQo04V9icEHcH*PtD> z>aDdA+B(DF#ASHRN$lAl*~xYS+^Ed`4#yg=E_cl*cni*UoE<$z7QtU;9E3MM;*2#4czcrwUb>2v|2aULH zQa`M`w27{}Xc_weD#B`Mbo}7fX(-lU&^8}3Z9Bqdrb!SFlV&M0oXEa>2qIoxAf|bG z(SRLLUGGQBu7Wg+i($4io6A>JF!xvYEsh+d&jn+|oPQ0d5k|oKpfC@h6wO~seT5kp zSFDhSIT<1P-HFiOuWLdOwG!hu(~9dlPBx}8JNFVg#w>UU;xK^!QV1Tq;-Cfy|C`Iy6eSEB>0i;z1tbQCLondU~TP9wzsh&(u!J-9@gV zBlpaJp5wzvUIn+TV8xSM)>|yL9<2WQ+4Xa=`k)~;x8M)KF`b$phPa$lKhsOLI^?&jIYl_M_2K>+HpPSlrq$T#-zU1W!8yuzD`+xgk`N4(GIz}*q z&ThFj1lC|QtO|XPFl|9ee2tYnW}^X$wg(L*t~iu3%5$ap91*c`t8jpQse0Yjh(MMy zky7<0Q-b54Il}s~*4~||C^;3>J0f*SS6LWD196P(IwX5-B7$EiJIEdyAJjWV?B3Xb zIjXh7&58`VX8PC4b<$PW%as&yBk`-)T_F|qBv4~DkJ?a5R8o|M<3_`elv4F4rz_Xf zg;K0rum0kqkC3#gIUav2yVSVpuH75&Rg*mTScCv+NY z&QIP3dEJ03HkQ~dIBxHNW-Kyc1p#pQFHn7$ADMUo!| zL9b;P>e;Kifl8J7hO;U4rzZv`O=YlFRUsAnSctO5_mZZw_r5MoUnq(DWzc6i;c46_ z7gY*w5QDfjfOrB{DkHj{Ai4PZcNsSwuND1gXNqY}n1uBN%+B}Z0ir_x~KH7TG!M zOD}wNl)CefCHcPAhTYO@X%8Zwaplrn4qK6ia#)_%``u7nwoJ{hsy_RAW~~Li$gIj_ ziTe2B5~1>;qYRPg8NNH{+%{`L-w>Sa8SNh0G06oUw~egLg|6?uFRT7G3QI2Q`%bmK z7lK;#jb`u@^~Po%FU$`6r^4CMsEua{lbzxta~f=~IPD1B0g0BgUiW_1;Ee!Sxul7; ZORL*D`$9US*I@fkFyWnwZl@Ut^cSjQN}~V( literal 0 HcmV?d00001 diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap new file mode 100644 index 0000000000000000000000000000000000000000..5e556a67091b4de3966f5512d63ba6466599e23a GIT binary patch literal 1724 zcmV;t21EHlRzV0uiwQncl?k4*<`OXTEVY^%`Ri?He>ADpMUQJue}}Iyk`ub1wr+6>((t6bXc&# zf;ZVa!3O(vu*rg(ZwH@@a}h(e<`Ct^po(T^{{0+Op8EHhw(czE4rznRp(%EAh|xwy zWKL*RDi4BMdv~$=Fo)$ehi-S!?ZO=T-Tv*pZf~!@-`+G9NG= znKd+qod-`(pLjzsl6WD865)Zw$Qi9f1W&~{ahB{l9cj4`uZ2Rgmxay9I9zCf^!8wXS2NDG2Zxs+%fcvC#01C;8GaA?74FIOoU zKuY*JfcwvmADt}W%q5tDP)-AfEH`BEG!YgegPb&Jg%l)ZODpuPn`*F`6wdBKswWin z370v-$mrA?_T~~TWBRWQWnqQ>E$kE+{!{RE1H?D>8Dj&+*bBzk8^I+&-fRQ;^A?cZ z#o6M`ymF+1wfFgqz+FAZs5I>iMp{Ke;+b{a;R>WbZ$SD358)+*H?}>P!$HHN-V*eq zEFGBE83}w=-($kiC_~w^@%C6nCb}*eBwPs!~|QZ zt20VqAUTC&?&Wmu2*xjiK-lRVYvu654Pb~PszDFa5{pv=E)DW{R>Cg^VQr4a8!Ajw zYD{bg9e_wH>)?4M^9|gEl%M0re)~wc?JW=Yt(~J+*|4(*%Z@FS*G%VikF@deQ#dV8wk^3s1B#~@!$fd6PPlQu=MlP{uxd8% zRs>}+{SxFRtBXzHAjIISH>?bI7>CMZH$#>t-4CoJ{fv zDR^jB3iQiX33gw-dabrJhkGX{4^A6Bs$D!6Klvb1CM|G-tym^`%GKV8N0eAPs0};! z)QoC{*uMY*rPFKqin{+-M<7OEb&7?QlmveV&rUvsX@ZKLr`&?lZnxxmoy!=8#LvES zg`H>02}uy7tQU4`SnYbKNQ}p5DEW~#1|#QtqR#l&Ia1f~j@ue4?>!Wg`UoJD*HLJv zZdIyYgPHFen7Mg}G4?yg*xwmr|7DE*`7&a^(ZD`00CF4x1$;}#h1NfEUT%mEJ( zdv|!R+dCwolheQu2;&hggtdHxK*W7s`3l3QH&RoUR&`M1;pO3|a zD$D^dYOoBCioK{yU>n16xC@_|ac|(gsR@1hg>Xr1__S^?ylA{D_l5th8?~M@#=gId z%~wXPZo4A=9pM$Xgq50W5^%r12f)j30xMP3)NoK~2>Z>C4wg0*t~+(a4AQh?+w*IY zs$n^Y`0nhxEQPf>4(}2t^0>G{R8u!{BLy1Y9Nw?z?8Qe#rT7857%Kb#W($563PCtb zZQ0$q^M+SG_nw?1W|i;c2*emuIbysreCNJ3RNiPqB^aTsrtpn_HlXp^Zy96vemJJ`4cA~)L*IltC4UTquH{!2#m^J|UhYxw?`%%PPXnyEjjsNNH!Gacwv4 ztU$6CeF@L{0KT1f1Gq#)WiB)Qntb2%*Vk;6J9QtP-jEFCIEykfqtfGmPYq49m(xgN z;esLlAW2Oy@Er9RJ@;-JOt7*D6G!3sO>0T=j-5B*5EjLbSW^JNB>=nwK!+W)+5WZn za?V&iwOTD;$G{rEPN2gYaLSs%_S;`T0;Lr zuDHgayeY^yyHvh%8CwU79mOjy#9-MIkz7V1j*@gG{im*|jY|`dUkD*Emm|z)XIq%b zOB!+i*d(qGOaZg`$QDk_PcD2GJNqQ-- bc(k_P;lBES=@$P` Date: Sun, 25 Jan 2026 17:13:21 -0600 Subject: [PATCH 43/77] docs(ertp-ledgerguise): restructure contributor guidance with design docs - Rewrite CONTRIBUTING.md: welcoming tone, agent tactics, design section - Split detailed design content into docs-dev/: - escrow-accounting.md (ledger transactions, AMIX state machine) - integration.md (account codes, cross-system integration) - ocap-discipline.md (capability patterns, IBIS decisions) - sealer-unsealer.md (secure escrow identification) - plan-interpreter.md (aspirational pattern) - Add AMIX system summary for LLM context - README: note contributions welcome Co-Authored-By: Claude Opus 4.5 --- packages/ertp-ledgerguise/CONTRIBUTING.md | 227 +++++---------- packages/ertp-ledgerguise/README.md | 2 +- .../docs-dev/amix-gimix-background.md | 275 ++++++++++++++++++ .../docs-dev/escrow-accounting.md | 108 +++++++ .../ertp-ledgerguise/docs-dev/integration.md | 110 +++++++ .../docs-dev/ocap-discipline.md | 116 ++++++++ .../plan-interpreter.md} | 16 +- .../docs-dev/sealer-unsealer.md | 70 +++++ 8 files changed, 760 insertions(+), 164 deletions(-) create mode 100644 packages/ertp-ledgerguise/docs-dev/amix-gimix-background.md create mode 100644 packages/ertp-ledgerguise/docs-dev/escrow-accounting.md create mode 100644 packages/ertp-ledgerguise/docs-dev/integration.md create mode 100644 packages/ertp-ledgerguise/docs-dev/ocap-discipline.md rename packages/ertp-ledgerguise/{DESIGN.md => docs-dev/plan-interpreter.md} (84%) create mode 100644 packages/ertp-ledgerguise/docs-dev/sealer-unsealer.md diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index 5b57013..f9799a8 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -1,170 +1,93 @@ # CONTRIBUTING -Thanks for your interest in contributing! This package provides an ERTP facade over a GnuCash SQLite database. These notes apply to contributors, including agents. +Thanks for your interest in contributing! This package provides an ERTP facade over a GnuCash SQLite database. -## Background +Before submitting changes, please run: -- Agoric PR: "SPIKE: toward correct-by-construction Zoe2 escrow" (#8184) https://github.com/Agoric/agoric-sdk/pull/8184 - - Relevant ERTP note: mint/purse patterns and amount math are treated as stable, foundational properties for escrow reasoning. -- Vbank bridge flow: `packages/cosmic-swingset/README-bridge.md` in agoric-sdk (ERTP transfer via vbank). +```sh +yarn check # runs yarn lint && yarn test +``` -## Status checklist +We use conventional commits (e.g., `feat:`, `fix:`, `test:`, `docs:`). -- [ ] Create an ERTP-compatible facade backed by a GnuCash SQLite DB. - - [x] Establish contributor/agent guidance in `CONTRIBUTING` (planning phases, ocap IO injection, freeze API surface, testing discipline). - - [x] Build a minimal ERTP-like API (issuer/brand/purse/payment) mapped to GnuCash accounts/splits. - - [x] Add tests for canonical ERTP flows (Alice->Bob $10), persistence, and adversarial cases. - - [x] Implement escrow semantics in GnuCash (holding account, tx/split rules). - - [x] Add a pure-ERTP escrow module and unit tests (no DB). - - [x] Build the community story/simulation (chart placement, contributions, reports). - - [x] Keep ocap/no-ambient-IO, freeze API surfaces, no CJS, docs aligned to API. - - [x] Restore `lint:types` after changing `tsconfig.json` `lib` to `ESNext` (SqlDatabase type mismatch with better-sqlite3). - - [x] Abstract: define a backend-agnostic SqlDatabase interface for sync sqlite. - - [x] Concrete: add a better-sqlite3 shim and use it in tests. - - [ ] Figure out how to persist escrow exchanges at each state change. +## Background -## Planning +- Agoric PR: "SPIKE: toward correct-by-construction Zoe2 escrow" (#8184) https://github.com/Agoric/agoric-sdk/pull/8184 +- Vbank bridge flow: `packages/cosmic-swingset/README-bridge.md` in agoric-sdk -- Brainstorm and write down the initial motivation (ERTP + GnuCash insight). -- Scaffold the canonical “Alice sends Bob $10” ERTP test so it fails. -- Make the test pass (starting with the simplest implementation, even if it is not DB-backed yet). -- Capture each new design constraint as a failing test, then make it pass. -- Design adversarial tests that probe for theft, destruction, or misdirection of funds. +## Design -## Scope +ERTP concepts map to GnuCash: -- Keep changes limited to this package unless the user asks for cross-package updates. -- Prefer small, targeted edits; avoid refactors unless explicitly requested. +| ERTP | GnuCash | +| ------- | ------------------------------------------------------------ | +| Brand | Commodity | +| Purse | Account | +| Payment | Transaction + splits (`reconcile_state='n'` until deposited) | +| Amount | Brand + `value_num / value_denom` | -## Data and DB safety +Detailed design docs are in `docs-dev/`: -- Treat the GnuCash SQLite file as production-like data; do not run destructive SQL. -- When inspecting schema/data, use read-only queries. -- Do not migrate or alter schemas unless explicitly requested. -- TODO: set migrations aside for now; start with in-memory databases. +- `escrow-accounting.md` - Ledger transactions, payment holds, AMIX state machine +- `integration.md` - Account codes, cross-system integration +- `ocap-discipline.md` - Clock injection, freezing, capability patterns +- `sealer-unsealer.md` - Secure escrow account identification + +The primary documentation of how ERTP is embedded in GnuCash is `test/snapshots/design-doc.test.ts.md`, integrated with the test suite. ## Code style -- Follow existing patterns in this package. -- Add succinct comments only when logic is non-obvious. -- Keep files ASCII unless the file already uses Unicode. -- Avoid functions with more than 3 positional arguments; prefer a single options/config object with named properties. -- Use JSDoc docstrings when attaching documentation to declarations or parameters; reserve `//` comments for implementation details. +We use ESM (no CommonJS). Avoid more than 3 positional arguments; use an options object instead. Freeze API surfaces before use—see [jessie-tools](https://www.npmjs.com/package/jessie-tools) for the API or `docs-dev/ocap-discipline.md` for rationale. ## Testing -- If tests exist, prefer the smallest relevant test(s). -- Never create or modify real ledger data during tests; use fixtures or in-memory DBs when possible. - -## Tooling - -- Use `rg` for searches. -- Avoid network access unless explicitly requested. -- Use `npm run codegen:sql` to regenerate `src/sql/gc_empty.ts` from `sql/gc_empty.sql`. Keep codegen scripts ESM (no `.cjs`). -- No CommonJS in this package (source, tests, scripts). Use ESM everywhere. -- TODO: use full extensions in module specifiers. - -## Entry points and structure - -- `src/index.ts`: main facade entry points; table of contents in file header. -- `src/escrow.ts`: GnuCash-backed escrow logic. -- `src/escrow-ertp.ts`: ERTP-only escrow (no DB). -- `src/jessie-tools.ts`: freeze helpers and Nat guard. -- `src/sql/`: schema and SQL helpers. -- `test/`: canonical flow, persistence, adversarial, escrow, and community tests. - -## Agent Tactics - -the mutable let point is not agent tactics; it's code style. likewise API - surface stuff. make a new subsection for the API surface freezing stuff. - -### Commit Ritual - -- Propose commit boundaries before committing when multiple changes are in play. -- Use conventional commit headers and focus the subject on the most important user-facing change. -- Provide a draft commit message for review before creating the commit. -- In the body, detail all changes with indented bullets. -- Only commit after explicit user approval. - -### General Tactics - -- Always check for static errors before running tests. -- Always run all tests relevant to any code changes before asking the user for further input. -- When fixing a bug, capture it with a failing test before applying the fix. -- Avoid `readFileSync` unless critical; prefer async filesystem reads and document any sync IO. -- Prefer avoiding mutable `let` for tests; use an IIFE or other pattern so types can be inferred. -- Freeze API surface before use: any object literal, array literal, or function literal that escapes its creation context should be frozen (use `const { freeze } = Object;` and `freeze(...)`). Source: Jessie README, "Must freeze API Surface Before Use": https://github.com/endojs/Jessie/blob/main/README.md -- Only freeze values you create (literals/functions). Do not freeze objects you receive from elsewhere (e.g., kit or purse objects returned by libraries); treat them as already-sealed API surfaces. -- TODO: add static analysis to enforce API surface freezing. - -## IBIS: Sync vs async DB access - -Issue: Should the GnuCash-backed ERTP facade use synchronous or asynchronous DB access? - -Position A (sync DB access): -- Closer to ERTP's synchronous semantics (e.g., brand/purse/amount operations are typically sync). -- Easier to reason about atomicity in a single vat/turn; fewer interleavings. -- Aligns with Node bindings like `better-sqlite3` and some WASM in-memory modes. - -Position B (async DB access): -- Required in many environments (Cloudflare Workers/D1, OPFS-backed WASM, remote sqlite). -- Matches vbank's observed split: synchronous "grab/give" bridge calls, but asynchronous balance updates (end_block). -- Avoids blocking the event loop in hosted environments; better scalability. - -Discussion: -- ERTP APIs are sync, but can be backed by async IO by pushing IO to injected capabilities and keeping synchronous facade operations limited to preloaded or cached data. -- A hybrid model is possible: sync for hot reads/derived state, async for persistence and reconciliation, similar to vbank's immediate bridge actions plus later balance update notifications. - -Decision: Start with synchronous DB access, but keep IO injected so async backends can be added later. - -Consequences: -- Tests should allow in-memory sync adapters first, with async-capable adapters introduced later. -- The facade should avoid hidden filesystem opens; pass DB capabilities explicitly (ocap discipline). - -## IBIS: Payment holds vs immediate transfers - -Issue: How should in-flight payments be represented in the GnuCash ledger? - -Position A (account-to-account only, no holds): -- Only record direct account-to-account transfers at deposit time. -- Avoids “hold” rows but loses in-flight payment durability and makes GC destroy value. -- Requires deferred ledger writes, which hides exposure windows. - -Position B (mutable hold transaction): -- Record a hold transaction at withdraw time from source to a holding account. -- On deposit, update the holding split to the destination account and mark splits cleared. -- Preserves a single transaction per payment while keeping a durable record. - -Decision: Use the mutable hold transaction approach with a holding account and reconcile-state updates. - -Consequences: -- Transfers remain auditable via a single tx with two splits after deposit. -- We accept that split destination mutation is part of the model and must be tested. - -## Documentation - -- Update package docs or README when behavior or public API changes. - -## TODO -- Consider Flow B (accrual then payout): record contributor payable before minting. -- Consider periodic minting (budgeted supply) vs per-contribution minting. -- Consider a read-only openIssuerKit facade with a reduced capability surface: - - No account access (no make/open purse). - - No mint access. - - No escrow access. - - Expose brand and displayInfo for identification. - - Expose issuer.getAmountOf / issuer.isLive for payment inspection. - - Optional: read-only chart/balance reporting facet (account tree, balances, recent txs). - - Keep payment reification behind a separate explicit capability if needed. -- Consider generalizing escrow beyond a single brand (e.g., $ for stock). Two design options: - - Dual-transaction escrow (one transaction per brand): - - Use one holding account per brand; write two transactions with a shared offer ID/check number. - - Each transaction stays single-commodity (currency_guid matches the brand commodity). - - Accept/cancel retargets each brand's holding split to the destination/source account. - - Pros: avoids TRADING accounts; preserves current ledger invariants. - - Cons: two txs to correlate; needs shared offer ID and consistency checks. - - Single-transaction with TRADING splits: - - Create a single transaction with both commodities plus balancing splits to a TRADING account. - - Leverages GnuCash's multi-commodity transaction model. - - Pros: one tx per offer; native to GnuCash if configured correctly. - - Cons: requires TRADING accounts and correct valuation; more complex and harder to audit. +We use in-memory databases for tests—never modify real ledger files. When fixing bugs, please capture them as failing tests first. + +## Data safety + +Please treat GnuCash SQLite files as production data. Use read-only queries when exploring; avoid destructive SQL. + +## Agent tactics + +These guidelines help AI agents contribute effectively: + +- Run `yarn check`: + - Before your first change in a session + - After each change + - Fix minor issues. + - Stop and ask about significant or unexpected challenges. + - Never present work as complete that doesn't pass `yarn check`. +- Consider checking `yarn lint:types` before running tests to catch type errors early. +- Test-driven development is valued, but not required when tests are not cost-effective + (e.g. early prototyping or if developing a test would be probihibitvely expensive) + - When fixing a bug, we know a test is cost-effective; capture it with a failing test before applying the fix. +- Freeze API surfaces before returning them. Per Jessie conventions, use `Object.freeze()`: + ```js + const { freeze } = Object; + return freeze({ + method1, + method2, + }); + ``` + `freezeProps()` or `zone.exo()` can be handy. +- Before committing: + - Review work to see whether atomic commits should be separated + - Propose commit headings for review + - Focus each heading on the most significant impact—don't water it down (e.g., "lots of updates") + - Enumerate ancillary changes in the commit body + +## Status and future work + +**Done:** + +- [x] ERTP-like API (issuer/brand/purse/payment) mapped to GnuCash +- [x] Escrow prototype with async funding via `Promise` +- [x] Account hierarchy with placeholder parents and codes +- [x] Ocap discipline: injected clock/db, frozen API surfaces + +**To do:** + +- [ ] Solidify escrow API +- [ ] Persist escrow state at each transition (crash recovery) +- [ ] Read-only issuer facade (brand/displayInfo only) +- [ ] Multi-commodity escrow diff --git a/packages/ertp-ledgerguise/README.md b/packages/ertp-ledgerguise/README.md index 6b78703..e547ca8 100644 --- a/packages/ertp-ledgerguise/README.md +++ b/packages/ertp-ledgerguise/README.md @@ -16,7 +16,7 @@ ERTP-compatible facade over a GnuCash SQLite database. ## Status -Early sketch; API surface and mappings are expected to evolve. +Early sketch; API surface and mappings are expected to evolve. Contributions welcome—see `CONTRIBUTING.md` for what's done and what remains. ## Name diff --git a/packages/ertp-ledgerguise/docs-dev/amix-gimix-background.md b/packages/ertp-ledgerguise/docs-dev/amix-gimix-background.md new file mode 100644 index 0000000..085b424 --- /dev/null +++ b/packages/ertp-ledgerguise/docs-dev/amix-gimix-background.md @@ -0,0 +1,275 @@ +# Provenance + +This document summarizes the GiMiX presentation, which reimagines the **American Information Exchange (AMIX)** system from 1984. + +**AMIX (1984)** +- Designed by Chip Morningstar and Randy Farmer +- Wikipedia: https://en.wikipedia.org/wiki/American_Information_Exchange + +**GiMiX (2023)** +- Repository: https://github.com/agoric-labs/gimix +- Presentation PDF: https://github.com/agoric-labs/gimix/files/13417710/GiMiX_.AMiX.with.GitHub.pdf +- Agoric Internal Hackathon 2023 + +--- + +# Purpose of This Summary + +This document summarizes the *GiMiX: AMiX with GitHub* presentation for the specific purpose of **prompting another LLM to design a similar system**. The emphasis is on **conceptual architecture, roles, state transitions, and invariants**, not on Agoric- or Zoe-specific implementation details. Smart contract mechanics are treated as secondary, except where they materially constrain or inform the overall design. + +--- + +# High-Level Concept + +GiMiX is a modern reimagining of the **American Information Exchange (AMIX)** model, applied to **open-source software work** and implemented using **blockchain escrow plus GitHub as an off-chain arbiter**. + +The system enables: +- A requester (maintainer or sponsor) to post a *work agreement* tied to a GitHub issue +- A developer to deliver work by submitting a GitHub PR +- Automated or semi-automated verification (via a GitHub oracle) +- Trust-minimized release of payment upon verified acceptance + +The core idea is to **reuse GitHub’s existing social and governance mechanisms** (issue assignment, PR approval, merge rules) while using on-chain logic strictly for **escrow, incentives, and settlement**. + +--- + +# Actors and Roles + +## Requester ("Alice") +- Proposes work tied to a GitHub issue +- Supplies funds up-front (escrow) +- Defines acceptance criteria indirectly via GitHub repo rules +- Ultimately authorizes or relies on GitHub’s merge process for acceptance + +## Worker / Developer ("Bob") +- Performs work off-chain +- Submits a PR that closes the referenced issue +- Claims payment by proving delivery and acceptance + +## GitHub Oracle +- Off-chain service with read access to GitHub +- Verifies factual claims: + - PR exists + - PR is authored by the expected party + - PR is approved according to repo rules + - PR is merged + - PR closes the specified issue +- Reports verified facts to the on-chain system + +## On-chain Escrow / Agreement Logic +- Holds funds +- Tracks job state +- Releases funds based on oracle-confirmed events + +--- + +# Mapping to Classical AMIX + +The design is explicitly inspired by **Basic AMIX Consulting**, where economic exchange is modeled as a *state machine* with explicit transitions. + +The GiMiX system maps software development to AMIX concepts: + +| AMIX Concept | GiMiX Interpretation | +|-------------|---------------------| +| Negotiation | Issue discussion & assignment (off-chain) | +| Agreement | Work agreement + escrow creation | +| Delivery | PR submission | +| Acceptance | PR approval + merge | +| Payment | On-chain fund release | + +--- + +# AMIX State Diagram (Detailed) + +The presentation includes a **Basic AMIX Consulting State Diagram** (see slide with AMIX diagram). Below is a detailed reconstruction, adapted to GiMiX. + +## States + +### 1. Start +- No relationship exists yet +- No funds committed +- No expectations set + +**Entry conditions**: None + +**Exit triggers**: +- Parties begin negotiation (off-chain) + +--- + +### 2. Negotiation +- Parties discuss scope, expectations, and feasibility +- In GiMiX: happens primarily on GitHub issue comments +- No binding commitments yet + +**Key properties**: +- Cheap to enter and exit +- No on-chain state required + +**Exit triggers**: +- Requester proposes a formal agreement + +--- + +### 3. Agreement +- A binding agreement is created +- Funds are escrowed +- Acceptance criteria are fixed *implicitly* by referencing: + - A specific GitHub issue + - The repository’s PR approval and merge rules + +**In GiMiX**: +- A work agreement references `issueUrl` +- Payment is locked on-chain + +**Invariants**: +- Funds cannot be reclaimed without following exit rules +- Acceptance authority is delegated to GitHub governance + +**Possible exits**: +- Delivery +- Deadline expiration +- Cancellation (if allowed) + +--- + +### 4. Ready / Committed (AMIX intermediate state) +- Agreement exists +- Both parties are committed +- Work has not yet been delivered + +This is sometimes implicit but important: +- Funds are locked +- Worker has incentive to act + +--- + +### 5. Delivery +- Worker submits work +- In GiMiX: PR submission that claims to close the issue + +**Verification inputs**: +- PR URL +- Issue URL +- GitHub metadata (author, assignee, status) + +**Key check** (as shown in slides): +``` +pull.author === issue.assignee && +pull.status === 'merged' && +issue.status === 'closed' +``` + +**Exit triggers**: +- Successful verification → Acceptance +- Failure or dispute → Deadlock or renegotiation + +--- + +### 6. Acceptance +- The requester (or delegated authority) accepts delivery +- In GiMiX, this is *not* an explicit on-chain action +- Acceptance is inferred from GitHub: + - PR approved + - PR merged + +**Critical design insight**: +Acceptance authority is **outsourced to GitHub**, reducing on-chain complexity and subjective judgment. + +--- + +### 7. Payment +- Funds are released to the worker +- Settlement is final + +**Properties**: +- Atomic with acceptance confirmation +- No further recourse + +--- + +### 8. Dead / Cancelled / Failed +- Agreement terminates without successful delivery +- Causes may include: + - Deadline expiration + - Mutual abandonment + - Superseding work + +**Outcome**: +- Funds may be reclaimed or redistributed according to rules + +--- + +# Key Design Principles + +## 1. Minimize On-chain Semantics +- The chain does *not* decide code quality +- The chain does *not* mediate disputes +- It only enforces escrow and state transitions + +## 2. Delegate Judgment to Existing Institutions +- GitHub already solves: + - Identity (accounts) + - Reputation + - Review processes + - Governance rules + +GiMiX treats GitHub as the **arbiter of acceptance truth**. + +## 3. Explicit State Transitions +- Each phase has: + - Clear entry conditions + - Clear exit triggers + - Minimal ambiguity + +This is directly inherited from AMIX thinking. + +## 4. Capability-Oriented Trust +- Oracles are powerful but constrained +- Oracles can only redirect funds already committed +- They cannot mint value or steal beyond escrowed amounts + +--- + +# Threat Model (Conceptual) + +- Requester can edit issues → mitigated by relying on merge events, not comments +- Worker can submit bad code → mitigated by repo rules +- Oracle can misreport → bounded by escrow limits +- Front-running PRs → inherent risk, accepted as low-impact + +--- + +# What an LLM Should Reproduce + +When prompting another LLM to build a similar system, ensure it: + +1. Models the workflow as an **explicit state machine** +2. Separates **negotiation**, **delivery**, **acceptance**, and **payment** +3. Uses an existing platform (e.g., GitHub, GitLab) as the *acceptance oracle* +4. Keeps on-chain (or core system) logic minimal and mechanical +5. Treats escrow as the primary enforcement mechanism +6. Clearly defines invariants at each state transition + +--- + +# What Is Intentionally De-emphasized + +- Smart contract APIs +- Language-specific tooling +- UI screenshots +- Deployment mechanics + +These are implementation details, not architectural essence. + +--- + +# Core Takeaway + +GiMiX demonstrates that **AMIX-style consulting markets** can be reimplemented today by combining: +- A strict state-machine mental model +- Existing social coding platforms for judgment +- Cryptographic escrow for incentives + +The novelty is not the contract—it is the *delegation of acceptance authority* and the disciplined separation of concerns. + diff --git a/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md b/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md new file mode 100644 index 0000000..0fd1027 --- /dev/null +++ b/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md @@ -0,0 +1,108 @@ +# Escrow Accounting Model + +How ERTP escrow maps to double-entry bookkeeping in GnuCash. + +## Core Principle + +The `escrow-ertp.ts` logic uses a two-purse system for atomic swaps, which maps cleanly to a double-entry ledger. Each escrow arrangement is treated as a temporary holder of assets, with its own accounts within the ledger. + +## Account Hierarchy + +An account hierarchy under `Escrow` is created for each deal, ensuring funds are never commingled. For an arrangement identified as `deal-123` to swap `Moola` and `Stock`: + +``` +Escrow + deal-123 + Moola + Stock +``` + +## Transaction Lifecycle + +### 1. Funding (Async, Separate Transactions) + +Parties fund asynchronously via `Promise`. Alice may fund before Bob, or vice versa. + +**Alice deposits 10 Moola:** + +| Account | Debit | Credit | +|----------------------------|-------|--------| +| Escrow:deal-123:Moola | +10 | | +| Alice:Moola | | -10 | + +**Bob deposits 1 Stock:** + +| Account | Debit | Credit | +|----------------------------|-------|--------| +| Escrow:deal-123:Stock | +1 | | +| Bob:Stock | | -1 | + +### 2. Settlement (Single Atomic Transaction) + +To preserve atomicity on the ledger, the swap is recorded as a single transaction with four splits. + +**"Settle deal-123: Alice gets Stock, Bob gets Moola"** + +| Account | Debit | Credit | +|----------------------------|-------|--------| +| Bob:Moola | +10 | | +| Escrow:deal-123:Moola | | -10 | +| Alice:Stock | +1 | | +| Escrow:deal-123:Stock | | -1 | + +### 3. Cancellation (Single Atomic Transaction) + +A cancellation returns funds to their owners as a single atomic transaction. + +**"Cancel deal-123: Assets returned"** + +| Account | Debit | Credit | +|----------------------------|-------|--------| +| Alice:Moola | +10 | | +| Escrow:deal-123:Moola | | -10 | +| Bob:Stock | +1 | | +| Escrow:deal-123:Stock | | -1 | + +## AMIX State Machine + +The escrow follows the AMIX (American Information Exchange) state machine pattern: + +``` +Agreement → [Party A Funds] → [Party B Funds] → Settlement + ↓ ↓ + (cancellation triggers refund) +``` + +See `docs-dev/gi_mi_x_ami_x_system_summary_for_llm_prompting.md` for the full AMIX model. + +## IBIS: Payment Holds vs Immediate Transfers + +**Issue:** How should in-flight payments be represented in the GnuCash ledger? + +**Position A (no holds):** +- Only record transfers at deposit time +- Simpler model, fewer rows +- But: loses in-flight payment durability; if process crashes, value disappears + +**Position B (mutable hold transaction):** +- `withdraw()` creates a hold transaction with `reconcile_state='n'` +- `deposit()` retargets the split to the destination and sets `reconcile_state='c'` +- Preserves a single transaction per payment with durable record + +**Decision:** Use mutable hold transactions. + +**Consequences:** +- Transfers remain auditable as single transactions after deposit +- Split destination mutation is part of the model (tested in `design-doc.test.ts`) +- The `reconcile_state` column serves double duty: GnuCash reconciliation + hold tracking + +## Implementation Notes + +- Funding uses `Promise` to model async timing +- The `reconcile_state` column tracks hold status: `'n'` = pending, `'c'` = cleared +- Escrow purses are created via `issuer.makeEmptyPurse()` and optionally named via `chartFacet.placePurse()` + +## See Also + +- `test/snapshots/design-doc.test.ts.md` - Executable documentation showing ledger state at each step +- `sealer-unsealer.md` - Secure identification of escrow accounts diff --git a/packages/ertp-ledgerguise/docs-dev/integration.md b/packages/ertp-ledgerguise/docs-dev/integration.md new file mode 100644 index 0000000..5d0dc04 --- /dev/null +++ b/packages/ertp-ledgerguise/docs-dev/integration.md @@ -0,0 +1,110 @@ +# Cross-System Integration + +How ertp-ledgerguise integrates with external systems via GnuCash's standard fields. + +## Account Codes + +GnuCash accounts have a `code` field designed for cross-system integration. Use it to maintain stable identifiers across systems. + +### Setting Account Codes + +```js +chart.placePurse({ + purse, + name: 'Checking', + parentGuid: bankGuid, + accountType: 'BANK', + code: '1110', // Stable identifier for external systems +}); +``` + +### Typical Numbering Conventions + +| Range | Category | +|-------|----------| +| 1000-1999 | Assets | +| 2000-2999 | Liabilities | +| 3000-3999 | Equity | +| 4000-4999 | Income | +| 5000-5999 | Cost of Goods Sold | +| 6000-6999 | Expenses | + +Within a category, use hierarchical numbering: +- `1000` Assets (placeholder) +- `1100` Bank (placeholder) +- `1110` Checking +- `1120` Savings + +### Querying by Code + +```sql +SELECT * FROM accounts WHERE code = '1110'; +``` + +## Transaction Numbers (Check Numbers) + +The `transactions.num` field stores check numbers or other reference numbers for cross-system reconciliation. + +### Use Cases + +- Check numbers from bank statements +- Invoice numbers from billing systems +- Reference IDs from payment processors +- Correlation IDs for distributed transactions + +### Setting Transaction Numbers + +Transaction numbers are set during `withdraw()` operations via the `nowMs` clock, which generates sequential identifiers. Custom reference numbers can be set by querying and updating the transaction after creation. + +## GUIDs + +GnuCash uses 32-character hex GUIDs as primary keys. These are: +- Globally unique +- Stable across exports/imports +- Suitable for distributed systems + +### GUID Generation + +The `makeGuid` capability injected into `createIssuerKit` controls GUID generation: + +```js +// Deterministic (for testing) +import { mockMakeGuid } from './guids.js'; +const makeGuid = mockMakeGuid(); + +// Random (for production) +import { makeDeterministicGuid } from './guids.js'; +const makeGuid = makeDeterministicGuid(); +``` + +## Integration Patterns + +### 1. Bank Reconciliation + +Use account codes to map GnuCash accounts to bank accounts, then reconcile by matching: +- Transaction dates (`post_date`) +- Amounts (`value_num / value_denom`) +- Reference numbers (`num`) + +### 2. External Ledger Sync + +Export transactions with: +- Account codes (not GUIDs) for portability +- ISO dates from `post_date` +- Rational amounts (`value_num / value_denom`) + +### 3. Audit Trail + +The `enter_date` field records when a transaction was created (vs `post_date` which is the effective date). Use this for audit trails and debugging. + +### 4. Multi-System Escrow + +For escrow spanning multiple systems: +1. Create escrow accounts with agreed-upon codes +2. Use transaction `num` fields for correlation IDs +3. Query by code to verify state across systems + +## See Also + +- `test/snapshots/design-doc.test.ts.md` - Shows account codes in the hierarchy test +- GnuCash documentation on account codes diff --git a/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md b/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md new file mode 100644 index 0000000..c8c9d72 --- /dev/null +++ b/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md @@ -0,0 +1,116 @@ +# Object-Capability (Ocap) Discipline + +Guidelines for maintaining capability discipline in ertp-ledgerguise. + +## Core Principles + +1. **No ambient authority** - All capabilities must be explicitly passed +2. **Freeze API surfaces** - Objects that escape their creation context must be frozen +3. **Inject, don't import** - IO capabilities come from parameters, not imports + +## Clock Injection + +Timestamped rows (e.g., `post_date`, `enter_date`) must read from an injected clock capability, not ambient `Date.now()`. + +```js +// Good: clock is injected +const kit = createIssuerKit({ + db, + commodity, + makeGuid, + nowMs: () => Date.now(), // Injected capability +}); + +// Testing: deterministic clock +const nowMs = makeTestClock(Date.UTC(2026, 0, 25), 1); +const kit = createIssuerKit({ db, commodity, makeGuid, nowMs }); +``` + +This keeps tests deterministic and preserves ocap discipline. + +## Database Injection + +The database is passed as a capability, never opened from a path: + +```js +// Good: db is injected +const kit = createIssuerKit({ db, ... }); + +// Bad: ambient filesystem access +const db = openDatabase('/path/to/file.gnucash'); // Don't do this +``` + +## Freezing API Surfaces + +From the Jessie guidelines: any object literal, array literal, or function literal that escapes its creation context should be frozen. + +```js +const { freeze } = Object; + +// Good: freeze before returning +return freeze({ + escrowExchange, + getSealedPurses: () => freeze({ + A: sealers.A.seal(escrows.A), + B: sealers.B.seal(escrows.B), + }), +}); + +// Only freeze values you create +// Don't freeze objects received from elsewhere +``` + +## Capability Attenuation + +The sealer/unsealer pattern demonstrates capability attenuation: + +- A `Purse` has full authority (deposit, withdraw, getBalance) +- A sealed purse token has no authority (it's inert) +- The `purses.getGuidFromSealed()` method provides read-only access to the GUID + +This allows sharing identification without sharing authority. + +## Zone Pattern + +The `zone` parameter provides controlled object creation: + +```js +const kit = createIssuerKit({ + db, + commodity, + makeGuid, + nowMs, + zone, // Controls how objects are created (exo, etc.) +}); +``` + +This enables future integration with durable storage or virtual objects. + +## IBIS: Sync vs Async DB Access + +**Issue:** Should the GnuCash-backed ERTP facade use synchronous or asynchronous DB access? + +**Position A (sync):** +- Closer to ERTP's synchronous semantics (brand/purse/amount operations are typically sync) +- Easier to reason about atomicity in a single vat/turn +- Aligns with `better-sqlite3` and some WASM in-memory modes + +**Position B (async):** +- Required in some environments (Cloudflare Workers/D1, OPFS-backed WASM) +- Matches vbank's pattern: sync bridge calls, async balance updates +- Avoids blocking the event loop in hosted environments + +**Decision:** Start with synchronous DB access via injected capability. + +**Consequences:** +- The `db` capability is sync (`better-sqlite3` style) +- Async environments would need a different adapter that pre-loads data or uses a different injection pattern +- Tests use in-memory sync adapters + +This is not "async on top of sync"—rather, the injection point allows swapping the entire DB capability for environments with different constraints. + +## See Also + +- Jessie README: https://github.com/endojs/Jessie +- `sealer-unsealer.md` - Example of capability attenuation +- CONTRIBUTING.md - Agent tactics for maintaining ocap discipline diff --git a/packages/ertp-ledgerguise/DESIGN.md b/packages/ertp-ledgerguise/docs-dev/plan-interpreter.md similarity index 84% rename from packages/ertp-ledgerguise/DESIGN.md rename to packages/ertp-ledgerguise/docs-dev/plan-interpreter.md index fc7db28..e3e3b04 100644 --- a/packages/ertp-ledgerguise/DESIGN.md +++ b/packages/ertp-ledgerguise/docs-dev/plan-interpreter.md @@ -1,4 +1,6 @@ -# DESIGN +# Plan + Interpreter Pattern + +**Status: Aspirational - not yet implemented** ## Goal @@ -7,7 +9,7 @@ declarative "plans" (relational intent) from effectful execution (SQL/Drizzle), so intent can be reviewed without reading SQL and refactors do not blur semantics. -## Pattern: Plan + Interpreter +## Pattern - Define a small set of *plan steps* that represent relational intent (select, retarget, mark reconciled). @@ -33,8 +35,6 @@ Treat each ERTP message as a plan of relational rewrites: - `withdraw(amount)` -> create holding transaction + splits - `deposit(payment)` -> retarget holding split + reconcile -- `escrow.commit` -> finalize both sides' holds -- `escrow.cancel` -> revert holds to source accounts The intent should be described as plan steps, not inline SQL. @@ -55,19 +55,13 @@ Still needs runtime tests: Use static checks for structure and capability hygiene, and keep a small set of runtime tests for correctness. -## Clock Injection - -Timestamped rows (e.g., `post_date`, `enter_date`) must read from an injected -clock capability, not ambient `Date.now()`. This keeps tests deterministic and -preserves ocap discipline. - ## Operational Notes - The interpreter can be swapped (Drizzle, better-sqlite3, D1). - Plans are stable documentation: they are the spec. - Tests should assert outcomes; plan shapes can be snapshot-tested if needed. -## Next Steps (non-exhaustive) +## Next Steps - Implement `planDeposit` and `runPlan`. - Refactor `transferRecorder.finalizeHold` to use the plan/interpreter. diff --git a/packages/ertp-ledgerguise/docs-dev/sealer-unsealer.md b/packages/ertp-ledgerguise/docs-dev/sealer-unsealer.md new file mode 100644 index 0000000..1b2006d --- /dev/null +++ b/packages/ertp-ledgerguise/docs-dev/sealer-unsealer.md @@ -0,0 +1,70 @@ +# Sealer/Unsealer Pattern + +Secure identification of escrow accounts without leaking withdrawal authority. + +## Problem + +To implement the atomic swap accounting model, we need to identify the account GUIDs of the internal escrow purses (the ones created by `makeErtpEscrow`) in a secure, object-capability (ocap) compliant manner. + +We cannot simply return the `Purse` objects themselves, as this would leak the authority to withdraw funds, violating security principles. + +## Solution + +The solution leverages a "sealer/unsealer" pattern using a shared `WeakMap`: + +### 1. `createIssuerKit` Enhancements + +- Internally, `createIssuerKit` creates a private `sealer` and `unsealer` pair that shares a secret `WeakMap`. +- The `sealer` can turn a powerful object (like a `Purse`) into an inert, unforgeable "token" (a sealed object). +- The `unsealer` can later retrieve the original object from its corresponding token. +- The `issuerKit` returns the `sealer` object at its top level, allowing authorized parties to create sealed tokens. +- The existing `purses` facet is enhanced with a new method: `getGuidFromSealed(sealedPurse)`. This `purses` facet acts as the "unsealer". + +### 2. `makeErtpEscrow` Integration + +- The `makeErtpEscrow` function accepts the `sealer` object (obtained from an `issuerKit`) as a parameter. +- After creating its internal escrow purses, `makeErtpEscrow` uses this provided `sealer` to create inert, sealed tokens for these internal purses. +- `makeErtpEscrow` provides a new method, `getSealedPurses()`, which safely returns these `sealedPurse` tokens. + +### 3. Client-Side Orchestration + +```js +// 1. Create issuerKits, obtaining sealer and purses facet +const moolaKit = createIssuerKit({ db, ... }); +const stockKit = createIssuerKit({ db, ... }); + +// 2. Create escrow instance, passing sealers +const escrow = makeErtpEscrow({ + issuers: { A: moolaKit.issuer, B: stockKit.issuer }, + sealers: { A: moolaKit.sealer, B: stockKit.sealer }, +}); + +// 3. Execute exchange +await escrow.escrowExchange(aliceOffer, bobOffer); + +// 4. Get sealed tokens (inert, no withdrawal authority) +const sealed = escrow.getSealedPurses(); + +// 5. Securely retrieve account GUIDs via the purses facet +const moolaEscrowGuid = moolaKit.purses.getGuidFromSealed(sealed.A); +const stockEscrowGuid = stockKit.purses.getGuidFromSealed(sealed.B); +``` + +## Security Properties + +- The sealed token is **inert**: it cannot be used to withdraw funds +- The sealed token is **unforgeable**: only the original sealer can create valid tokens +- Only the matching unsealer (via `purses.getGuidFromSealed`) can extract information +- The `account_guid` is safe to expose: it identifies but does not authorize + +## Use Cases + +These `account_guid`s allow us to: +- Query the ledger for escrow-related splits +- Build reports showing escrow state +- Integrate with external systems using the account's `code` field + +## See Also + +- `escrow-accounting.md` - How escrow maps to ledger transactions +- Jessie README on capability discipline: https://github.com/endojs/Jessie From 4784693ea8fe99c7d192f460b26dd3c15ad4c8bb Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 25 Jan 2026 17:13:51 -0600 Subject: [PATCH 44/77] feat(ertp-ledgerguise): add sealer/unsealer pattern for secure escrow identification - Add makeSealerUnsealerPair for capability attenuation - Export sealer from createIssuerKit for escrow integration - Add purses.getGuidFromSealed() to retrieve account GUIDs securely - Make sealers optional in makeErtpEscrow (backwards compatible) - Fix openIssuerKit to create unsealer - Export makeEscrow from index.ts - Fix bug in depositsSettledP destructuring Co-Authored-By: Claude Opus 4.5 --- packages/ertp-ledgerguise/src/escrow-ertp.ts | 161 ++++++++++--------- packages/ertp-ledgerguise/src/escrow.ts | 3 +- packages/ertp-ledgerguise/src/index.ts | 47 +++++- 3 files changed, 136 insertions(+), 75 deletions(-) diff --git a/packages/ertp-ledgerguise/src/escrow-ertp.ts b/packages/ertp-ledgerguise/src/escrow-ertp.ts index 033a432..df3e12d 100644 --- a/packages/ertp-ledgerguise/src/escrow-ertp.ts +++ b/packages/ertp-ledgerguise/src/escrow-ertp.ts @@ -7,6 +7,11 @@ import type { AssetKind, DepositFacet, Issuer, Payment, Purse, Amount } from './ import { defaultZone } from './jessie-tools.js'; import type { Zone } from './jessie-tools.js'; +const { freeze } = Object; + +/** Sealer can turn an object into an inert token. */ +export type Sealer = Readonly<{ seal: (obj: object) => object }>; + export type EscrowParty = { give: Promise>; want: Amount; @@ -31,86 +36,98 @@ export const makeErtpEscrow = < >({ issuers, zone = defaultZone, + sealers, }: { issuers: { A: Issuer; B: Issuer }; zone?: Zone; + sealers?: { A: Sealer; B: Sealer }; }) => { const { exo } = zone; - return exo('ErtpEscrow', { - escrowExchange: ( - a: EscrowParty, - b: EscrowParty, - ) => { - const escrows: { A: Purse; B: Purse } = { - A: issuers.A.makeEmptyPurse(), - B: issuers.B.makeEmptyPurse(), - }; - const depositPs = { - A: Promise.resolve(a.give).then(payment => escrows.A.deposit(payment)), - B: Promise.resolve(b.give).then(payment => escrows.B.deposit(payment)), - }; - const depositsP: Promise<{ A: Amount; B: Amount }> = Promise.all([ - depositPs.A, - depositPs.B, - ]).then(([A, B]) => ({ A, B })); - const depositsSettledP: Promise<{ - A: PromiseSettledResult>; - B: PromiseSettledResult>; - }> = Promise.allSettled([depositPs.A, depositPs.B]).then(([A, B]) => ({ A, B })); - const decisionP = Promise.race([ - depositsP, - failOnly(a.cancellationP), - failOnly(b.cancellationP), + const escrows: { A: Purse; B: Purse } = { + A: issuers.A.makeEmptyPurse(), + B: issuers.B.makeEmptyPurse(), + }; + + const escrowExchange = ( // <<< WRAPPED IN FUNCTION + a: EscrowParty, + b: EscrowParty, + ) => { + const depositPs = { + A: Promise.resolve(a.give).then(payment => escrows.A.deposit(payment)), + B: Promise.resolve(b.give).then(payment => escrows.B.deposit(payment)), + }; + const depositsP: Promise<{ A: Amount; B: Amount }> = Promise.all([ + depositPs.A, + depositPs.B, + ]).then(([A, B]) => ({ A, B })); + const depositsSettledP: Promise<{ + A: PromiseSettledResult>; + B: PromiseSettledResult>; + }> = Promise.allSettled([depositPs.A, depositPs.B]).then(([A, B]) => ({ A, B })); + const decisionP = Promise.race([ + depositsP, + failOnly(a.cancellationP), + failOnly(b.cancellationP), + ]); + const payoutOne = ( + payout: DepositFacet, + escrow: Purse, + amount: Amount, + ) => Promise.resolve().then(() => payout.receive(escrow.withdraw(amount))); + const assertEnough = (have: Amount, want: Amount, who: string) => { + if (have.brand !== want.brand) { + throw new Error(`amount brand mismatch: ${who}`); + } + if (have.value < want.value) { + throw new Error(`insufficient offer: ${who}`); + } + }; + const payoutBoth = ( + payouts: { A: DepositFacet; B: DepositFacet }, + amounts: { A: Amount; B: Amount }, + ) => + Promise.all([ + payoutOne(payouts.A, escrows.A, amounts.A), + payoutOne(payouts.B, escrows.B, amounts.B), ]); - const payoutOne = ( - payout: DepositFacet, - escrow: Purse, - amount: Amount, - ) => Promise.resolve().then(() => payout.receive(escrow.withdraw(amount))); - const assertEnough = (have: Amount, want: Amount, who: string) => { - if (have.brand !== want.brand) { - throw new Error(`amount brand mismatch: ${who}`); - } - if (have.value < want.value) { - throw new Error(`insufficient offer: ${who}`); + return decisionP.then( + amounts => { + try { + assertEnough(amounts.A, b.want, 'party A'); + assertEnough(amounts.B, a.want, 'party B'); + } catch (error) { + return payoutBoth({ A: a.payouts.refund, B: b.payouts.refund }, amounts).then( + () => { + throw error; + }, + ); } - }; - const payoutBoth = ( - payouts: { A: DepositFacet; B: DepositFacet }, - amounts: { A: Amount; B: Amount }, - ) => - Promise.all([ - payoutOne(payouts.A, escrows.A, amounts.A), - payoutOne(payouts.B, escrows.B, amounts.B), - ]); - return decisionP.then( - amounts => { - try { - assertEnough(amounts.A, b.want, 'party A'); - assertEnough(amounts.B, a.want, 'party B'); - } catch (error) { - return payoutBoth({ A: a.payouts.refund, B: b.payouts.refund }, amounts).then( - () => { - throw error; - }, - ); + return payoutBoth({ A: b.payouts.want, B: a.payouts.want }, amounts); + }, + error => + depositsSettledP.then(settled => { + const refunds: Promise[] = []; + if (settled.A.status === 'fulfilled') { + refunds.push(payoutOne(a.payouts.refund, escrows.A, settled.A.value)); } - return payoutBoth({ A: b.payouts.want, B: a.payouts.want }, amounts); - }, - error => - depositsSettledP.then(settled => { - const refunds: Promise[] = []; - if (settled.A.status === 'fulfilled') { - refunds.push(payoutOne(a.payouts.refund, escrows.A, settled.A.value)); - } - if (settled.B.status === 'fulfilled') { - refunds.push(payoutOne(b.payouts.refund, escrows.B, settled.B.value)); - } - return Promise.all(refunds).then(() => { - throw error; - }); - }), - ); + if (settled.B.status === 'fulfilled') { + refunds.push(payoutOne(b.payouts.refund, escrows.B, settled.B.value)); + } + return Promise.all(refunds).then(() => { + throw error; + }); + }), + ); + }; // <<< END escrowExchange function + + return freeze({ + escrowExchange, + getSealedPurses: () => { + if (!sealers) throw new Error('sealers not provided'); + return freeze({ + A: sealers.A.seal(escrows.A), + B: sealers.B.seal(escrows.B), + }); }, }); }; diff --git a/packages/ertp-ledgerguise/src/escrow.ts b/packages/ertp-ledgerguise/src/escrow.ts index f55f8e4..eed970b 100644 --- a/packages/ertp-ledgerguise/src/escrow.ts +++ b/packages/ertp-ledgerguise/src/escrow.ts @@ -5,7 +5,8 @@ import type { SqlDatabase } from './sql-db.js'; import { requireAccountCommodity } from './db-helpers.js'; /** - * @file Minimal two-party escrow layered on ERTP-style purses. + * @file This implementation is "all over the floor" and is not production ready. + * See escrow-ertp.ts for a more solid, ERTP-only escrow exchange. */ type EscrowRecord = { diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index b9262e4..ce9536f 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -31,7 +31,37 @@ import { makeTransferRecorder, } from './db-helpers.js'; import { makePurseFactory } from './purse.js'; -import { makeEscrow } from './escrow.js'; +// import { makeEscrow } from './escrow.js'; // This is the old, "all over the floor" escrow +import { makeErtpEscrow } from './escrow-ertp.js'; // Use the solid escrow-ertp + +// Internal helper for sealer/unsealer pattern +const makeSealerUnsealerPair = () => { + const sealedToReal = new WeakMap(); + const realToSealed = new WeakMap(); + + const sealer = Object.freeze({ + seal: (obj: object): object => { + if (realToSealed.has(obj)) return realToSealed.get(obj)!; // Return existing sealed object + const sealedObj = Object.freeze({}); // Create an inert token + sealedToReal.set(sealedObj, obj); + realToSealed.set(obj, sealedObj); + return sealedObj; + }, + }); + + const unsealer = Object.freeze({ + unseal: (sealedObj: object): object => { + if (!sealedToReal.has(sealedObj)) { + throw new Error("That's not my sealed object!"); + } + return sealedToReal.get(sealedObj)!; + }, + }); + return { sealer, unsealer }; +}; + +export type Sealer = ReturnType['sealer']; +export type Unsealer = ReturnType['unsealer']; export type { CommoditySpec, @@ -43,6 +73,7 @@ export type { } from './types.js'; export { asGuid } from './guids.js'; export { makeChartFacet } from './chart.js'; +export { makeErtpEscrow } from './escrow-ertp.js'; export { makeEscrow } from './escrow.js'; export { wrapBetterSqlite3Database } from './sqlite-shim.js'; export type { SqlDatabase, SqlStatement } from './sql-db.js'; @@ -73,12 +104,14 @@ const makeIssuerKitForCommodity = ({ makeGuid, nowMs, zone, + unsealer, // <<< ADDED }: { db: SqlDatabase; commodityGuid: Guid; makeGuid: () => Guid; nowMs: () => number; zone: Zone; + unsealer: Unsealer; // <<< ADDED }): IssuerKitForCommodity => { const { exo } = zone; const { freeze } = Object; @@ -318,12 +351,14 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG // TODO: consider validation of DB capability and schema. const commodityGuid = makeGuid(); createCommodityRow({ db, guid: commodityGuid, commodity }); + const { sealer, unsealer } = makeSealerUnsealerPair(); // <<< ADDED const { kit, purseGuids, payments, mintInfo } = makeIssuerKitForCommodity({ db, commodityGuid, makeGuid, nowMs, zone, + unsealer, // <<< ADDED }); const purses = zone.exo('PurseGuids', { getGuid: (purse: unknown) => { @@ -331,6 +366,12 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG if (!guid) throw new Error('unknown purse'); return guid; }, + getGuidFromSealed: (sealedPurse: object) => { + const purse = unsealer.unseal(sealedPurse) as AccountPurse; + const guid = purseGuids.get(purse); + if (!guid) throw new Error('unknown sealed purse'); + return guid; + }, }); return Object.freeze({ ...kit, @@ -338,6 +379,7 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG purses, payments, mintInfo, + sealer, // <<< ADDED }) as IssuerKitWithPurseGuids; }; @@ -350,5 +392,6 @@ export const openIssuerKit = (config: OpenIssuerConfig): IssuerKitForCommodity = // TODO: consider validation of DB capability and schema. // TODO: verify commodity record matches expected issuer/brand metadata. // TODO: add a commodity-vs-currency option (namespace, fraction defaults, and naming rules). - return makeIssuerKitForCommodity({ db, commodityGuid, makeGuid, nowMs, zone }); + const { unsealer } = makeSealerUnsealerPair(); + return makeIssuerKitForCommodity({ db, commodityGuid, makeGuid, nowMs, zone, unsealer }); }; From cab93389a3f00da637265f5165ecb814392a0313 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 25 Jan 2026 17:14:08 -0600 Subject: [PATCH 45/77] feat(ertp-ledgerguise): add account codes to chart placement - Add optional `code` parameter to placePurse() and placeAccount() - Update ChartFacet type to include code field - Enables cross-system integration via GnuCash account codes Co-Authored-By: Claude Opus 4.5 --- packages/ertp-ledgerguise/src/chart.ts | 12 ++++++++++-- packages/ertp-ledgerguise/src/types.ts | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/ertp-ledgerguise/src/chart.ts b/packages/ertp-ledgerguise/src/chart.ts index d3efcd2..68d0525 100644 --- a/packages/ertp-ledgerguise/src/chart.ts +++ b/packages/ertp-ledgerguise/src/chart.ts @@ -29,12 +29,14 @@ export const makeChartFacet = ({ parentGuid, accountType, placeholder, + code, }: { accountGuid: Guid; name: string; parentGuid: Guid | null; accountType: string; placeholder: boolean; + code: string | null; }) => { requireAccountCommodity({ db, accountGuid, commodityGuid }); if (parentGuid !== null) { @@ -47,10 +49,10 @@ export const makeChartFacet = ({ } db.prepare( [ - 'UPDATE accounts SET name = ?, account_type = ?, parent_guid = ?, placeholder = ?', + 'UPDATE accounts SET name = ?, account_type = ?, parent_guid = ?, placeholder = ?, code = ?', 'WHERE guid = ?', ].join(' '), - ).run(name, accountType, parentGuid, placeholder ? 1 : 0, accountGuid); + ).run(name, accountType, parentGuid, placeholder ? 1 : 0, code, accountGuid); }; return exo('ChartFacet', { @@ -60,12 +62,14 @@ export const makeChartFacet = ({ parentGuid = null, accountType = 'ASSET', placeholder = false, + code = null, }: { purse: unknown; name: string; parentGuid?: Guid | null; accountType?: string; placeholder?: boolean; + code?: string | null; }) => { const purseGuid = getPurseGuid(purse); updateAccount({ @@ -74,6 +78,7 @@ export const makeChartFacet = ({ parentGuid, accountType, placeholder, + code, }); }, placeAccount: ({ @@ -82,12 +87,14 @@ export const makeChartFacet = ({ parentGuid = null, accountType = 'ASSET', placeholder = false, + code = null, }: { accountGuid: Guid; name: string; parentGuid?: Guid | null; accountType?: string; placeholder?: boolean; + code?: string | null; }) => { updateAccount({ accountGuid, @@ -95,6 +102,7 @@ export const makeChartFacet = ({ parentGuid, accountType, placeholder, + code, }); }, }); diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index 4e6b56d..066c423 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -91,6 +91,7 @@ export type ChartFacet = { parentGuid?: Guid | null; accountType?: string; placeholder?: boolean; + code?: string | null; }) => void; placeAccount: (args: { accountGuid: Guid; @@ -98,6 +99,7 @@ export type ChartFacet = { parentGuid?: Guid | null; accountType?: string; placeholder?: boolean; + code?: string | null; }) => void; }; From b03378eb19d66df7d1547bee299cc400dcb2fcf1 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 25 Jan 2026 17:14:47 -0600 Subject: [PATCH 46/77] test(ertp-ledgerguise): add async escrow and account hierarchy snapshots - Add "Withdraw creates a hold" test showing reconcile_state tracking - Add "Escrow exchange: async funding" test with AMIX-style state machine - Add "Building account hierarchies" test with placeholder parents and codes - Snapshots serve as executable documentation of ledger state transitions Co-Authored-By: Claude Opus 4.5 --- .../ertp-ledgerguise/test/design-doc.test.ts | 343 +++++++++++++++++- .../test/snapshots/design-doc.test.ts.md | 73 ++++ .../test/snapshots/design-doc.test.ts.snap | Bin 1724 -> 2672 bytes 3 files changed, 415 insertions(+), 1 deletion(-) diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index b96f4c4..f0a8bc4 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -6,7 +6,7 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import type { TestFn } from 'ava'; import Database from 'better-sqlite3'; -import type { Brand, NatAmount } from '../src/ertp-types.js'; +import type { Brand, NatAmount, Payment } from '../src/ertp-types.js'; import { createIssuerKit, initGnuCashSchema, @@ -15,6 +15,7 @@ import { } from '../src/index.js'; import type { Guid } from '../src/types.js'; import { mockMakeGuid } from '../src/guids.js'; +// Note: makeErtpEscrow is used elsewhere; this test manually simulates escrow steps import { makeTestClock } from './helpers/clock.js'; const toRowStrings = ( @@ -277,6 +278,99 @@ serial('Giving names in the chart of accounts', t => { ); }); +serial('Building account hierarchies with placeholder parents', t => { + const { freeze } = Object; + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + initGnuCashSchema(db); + + const makeGuid = mockMakeGuid(); + const now = makeTestClock(Date.UTC(2026, 0, 25, 0, 0), 1); + + const moolaKit = createIssuerKit( + freeze({ + db, + commodity: freeze({ namespace: 'COMMODITY', mnemonic: 'USD' }), + makeGuid, + nowMs: now, + }), + ); + + const chart = makeChartFacet({ + db, + commodityGuid: moolaKit.commodityGuid, + getPurseGuid: moolaKit.purses.getGuid, + }); + + const root = db + .prepare<[], { root_account_guid: string }>( + 'SELECT root_account_guid FROM books LIMIT 1', + ) + .get(); + const rootGuid = root?.root_account_guid as Guid; + + // Build a traditional chart of accounts hierarchy with account codes + const assets = moolaKit.issuer.makeEmptyPurse(); + const bank = moolaKit.issuer.makeEmptyPurse(); + const checking = moolaKit.issuer.makeEmptyPurse(); + const savings = moolaKit.issuer.makeEmptyPurse(); + const expenses = moolaKit.issuer.makeEmptyPurse(); + const food = moolaKit.issuer.makeEmptyPurse(); + + chart.placePurse({ purse: assets, name: 'Assets', parentGuid: rootGuid, accountType: 'ASSET', placeholder: true, code: '1000' }); + const assetsGuid = moolaKit.purses.getGuid(assets); + + chart.placePurse({ purse: bank, name: 'Bank', parentGuid: assetsGuid, accountType: 'BANK', placeholder: true, code: '1100' }); + const bankGuid = moolaKit.purses.getGuid(bank); + + chart.placePurse({ purse: checking, name: 'Checking', parentGuid: bankGuid, accountType: 'BANK', code: '1110' }); + chart.placePurse({ purse: savings, name: 'Savings', parentGuid: bankGuid, accountType: 'BANK', code: '1120' }); + + chart.placePurse({ purse: expenses, name: 'Expenses', parentGuid: rootGuid, accountType: 'EXPENSE', placeholder: true, code: '6000' }); + const expensesGuid = moolaKit.purses.getGuid(expenses); + + chart.placePurse({ purse: food, name: 'Food', parentGuid: expensesGuid, accountType: 'EXPENSE', code: '6100' }); + + // Query showing how guid/parent_guid form the tree, with codes for cross-system integration + const accounts = db + .prepare< + [string], + { guid: string; name: string; parent_guid: string | null; placeholder: number; code: string | null } + >( + `SELECT guid, name, parent_guid, placeholder, code + FROM accounts + WHERE commodity_guid = ? + ORDER BY code, name`, + ) + .all(moolaKit.commodityGuid) + .filter(row => !row.name.includes('Mint')) // exclude internal accounts + .map(row => ({ + code: row.code ?? '', + name: row.name, + parent_guid: row.parent_guid ? shortGuid(row.parent_guid) : '', + placeholder: row.placeholder ? 'Y' : '', + })); + + t.snapshot( + toRowStrings(accounts, ['code', 'name', 'parent_guid', 'placeholder']), + [ + 'The accounts table forms a tree via guid and parent_guid columns.', + 'Account codes (1000, 1100, etc.) enable cross-system integration.', + 'Placeholder accounts (Y) group children; leaf accounts hold balances.', + '', + 'Tree structure:', + ' 1000 Assets (placeholder)', + ' 1100 Bank (placeholder)', + ' 1110 Checking', + ' 1120 Savings', + ' 6000 Expenses (placeholder)', + ' 6100 Food', + ].join('\n'), + ); + + rawDb.close(); +}); + serial('Withdraw creates a hold', t => { const { freeze } = Object; const { db, kit, purse } = t.context; @@ -369,4 +463,251 @@ serial('Withdraw creates a hold', t => { ); }); +/** + * Helper to snapshot splits, tracking which ones are new since last call. + * Shows full account paths (e.g., Alice:Moola) instead of just names. + */ +const makeSplitTracker = (db: ReturnType) => { + const seenGuids = new Set(); + + // Build a map of guid -> full path for all accounts + const buildPathMap = () => { + const accounts = db + .prepare<[], { guid: string; name: string; parent_guid: string | null }>( + 'SELECT guid, name, parent_guid FROM accounts', + ) + .all(); + const guidToAccount = new Map(accounts.map(a => [a.guid, a])); + + const getPath = (guid: string): string => { + const acc = guidToAccount.get(guid); + if (!acc) return '?'; + if (!acc.parent_guid) return acc.name; + const parent = guidToAccount.get(acc.parent_guid); + if (!parent || parent.name === 'Root Account') return acc.name; + return `${getPath(acc.parent_guid)}:${acc.name}`; + }; + + return new Map(accounts.map(a => [a.guid, getPath(a.guid)])); + }; + + const getAllSplits = () => { + const pathMap = buildPathMap(); + return db + .prepare< + [], + { + split_guid: string; + tx_guid: string; + account_guid: string; + value_num: string; + value_denom: string; + reconcile_state: string; + } + >( + ` + SELECT s.guid as split_guid, s.tx_guid, s.account_guid, + s.value_num, s.value_denom, s.reconcile_state + FROM splits s + ORDER BY s.tx_guid, s.account_guid + `, + ) + .all() + .map(row => ({ + ...row, + account_path: pathMap.get(row.account_guid) ?? row.account_guid, + })); + }; + + return { + /** Get only splits added since the last call to getNewSplits */ + getNewSplits: () => { + const allSplits = getAllSplits(); + const newSplits = allSplits.filter(row => !seenGuids.has(row.split_guid)); + for (const row of allSplits) { + seenGuids.add(row.split_guid); + } + return newSplits.map(row => ({ + tx_guid: shortGuid(row.tx_guid), + account: row.account_path, + value_num: row.value_num, + value_denom: row.value_denom, + reconcile_state: row.reconcile_state, + })); + }, + }; +}; + +const splitColumns = [ + 'tx_guid', + 'account', + 'value_num', + 'value_denom', + 'reconcile_state', +]; + +serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { + const { freeze } = Object; + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + initGnuCashSchema(db); + + const makeGuid = mockMakeGuid(); + const now = makeTestClock(Date.UTC(2026, 0, 25, 0, 0), 1); + + const moolaKit = createIssuerKit( + freeze({ + db, + commodity: freeze({ namespace: 'COMMODITY', mnemonic: 'Moola' }), + makeGuid, + nowMs: now, + }), + ); + const stockKit = createIssuerKit( + freeze({ + db, + commodity: freeze({ namespace: 'COMMODITY', mnemonic: 'Stock' }), + makeGuid, + nowMs: now, + }), + ); + + const moola = (v: bigint) => freeze({ brand: moolaKit.brand, value: v }); + const stock = (v: bigint) => freeze({ brand: stockKit.brand, value: v }); + + // Create purses for Alice and Bob with human-readable names + const chart = makeChartFacet({ + db, + commodityGuid: moolaKit.commodityGuid, + getPurseGuid: moolaKit.purses.getGuid, + }); + const stockChart = makeChartFacet({ + db, + commodityGuid: stockKit.commodityGuid, + getPurseGuid: stockKit.purses.getGuid, + }); + const root = db + .prepare<[], { root_account_guid: string }>( + 'SELECT root_account_guid FROM books LIMIT 1', + ) + .get(); + const rootGuid = root?.root_account_guid as Guid; + + // Create placeholder parent accounts for hierarchy + const alicePlaceholder = moolaKit.issuer.makeEmptyPurse(); + const bobPlaceholder = moolaKit.issuer.makeEmptyPurse(); + const escrowPlaceholder = moolaKit.issuer.makeEmptyPurse(); + + chart.placePurse({ purse: alicePlaceholder, name: 'Alice', parentGuid: rootGuid, accountType: 'ASSET', placeholder: true }); + chart.placePurse({ purse: bobPlaceholder, name: 'Bob', parentGuid: rootGuid, accountType: 'ASSET', placeholder: true }); + chart.placePurse({ purse: escrowPlaceholder, name: 'Escrow', parentGuid: rootGuid, accountType: 'ASSET', placeholder: true }); + + const aliceGuid = moolaKit.purses.getGuid(alicePlaceholder); + const bobGuid = moolaKit.purses.getGuid(bobPlaceholder); + const escrowGuid = moolaKit.purses.getGuid(escrowPlaceholder); + + // Create leaf purses under the hierarchy + const aliceMoola = moolaKit.issuer.makeEmptyPurse(); + const bobMoola = moolaKit.issuer.makeEmptyPurse(); + const aliceStock = stockKit.issuer.makeEmptyPurse(); + const bobStock = stockKit.issuer.makeEmptyPurse(); + + chart.placePurse({ purse: aliceMoola, name: 'Moola', parentGuid: aliceGuid, accountType: 'ASSET' }); + chart.placePurse({ purse: bobMoola, name: 'Moola', parentGuid: bobGuid, accountType: 'ASSET' }); + stockChart.placePurse({ purse: aliceStock, name: 'Stock', parentGuid: aliceGuid, accountType: 'STOCK' }); + stockChart.placePurse({ purse: bobStock, name: 'Stock', parentGuid: bobGuid, accountType: 'STOCK' }); + + // Track splits incrementally - only show new splits at each state + const tracker = makeSplitTracker(db); + tracker.getNewSplits(); // Clear any setup splits + + // === SETUP: Parties have assets in their purses === + aliceMoola.deposit(moolaKit.mint.mintPayment(moola(10n))); + bobStock.deposit(stockKit.mint.mintPayment(stock(1n))); + tracker.getNewSplits(); // Clear setup splits + + // === AMIX STATE: Agreement === + // Escrow is created. Parties will provide Promise, not immediate payments. + // This models async funding: Alice may fund before Bob, or vice versa. + const escrowMoola = moolaKit.issuer.makeEmptyPurse(); + const escrowStock = stockKit.issuer.makeEmptyPurse(); + chart.placePurse({ purse: escrowMoola, name: 'Moola', parentGuid: escrowGuid, accountType: 'ASSET' }); + stockChart.placePurse({ purse: escrowStock, name: 'Stock', parentGuid: escrowGuid, accountType: 'STOCK' }); + + // Deferred resolvers - these simulate async funding decisions + let resolveAliceFunding!: (payment: Payment<'nat'>) => void; + let resolveBobFunding!: (payment: Payment<'nat'>) => void; + const aliceFundingP = new Promise>(r => { resolveAliceFunding = r; }); + const bobFundingP = new Promise>(r => { resolveBobFunding = r; }); + + // Escrow starts waiting for both deposits (via promises) + const escrowDepositPs = { + moola: aliceFundingP.then(p => escrowMoola.deposit(p)), + stock: bobFundingP.then(p => escrowStock.deposit(p)), + }; + + t.snapshot( + toRowStrings(tracker.getNewSplits(), splitColumns), + [ + 'Escrow follows the AMIX state machine (American Information Exchange, 1984).', + 'AMIX models exchange as: Agreement → Funding → Settlement (or Cancellation).', + '', + 'STATE: Agreement', + 'Escrow purses exist but are empty. Both parties hold Promise.', + 'Funding happens asynchronously - Alice may fund before Bob, or vice versa.', + 'No ledger changes yet.', + ].join('\n'), + ); + + // === AMIX STATE: Alice funds (first mover) === + const alicePayment = aliceMoola.withdraw(moola(10n)); + resolveAliceFunding(alicePayment); + await escrowDepositPs.moola; // Wait for Alice's deposit to complete + + t.snapshot( + toRowStrings(tracker.getNewSplits(), splitColumns), + [ + 'STATE: Alice Funds (first mover)', + 'Alice withdraws from her purse and deposits to escrow.', + 'Her payment creates a hold, then deposit retargets it to escrow.', + 'Escrow now holds 10 Moola; still waiting for Bob.', + ].join('\n'), + ); + + // === AMIX STATE: Bob funds (second mover) === + const bobPayment = bobStock.withdraw(stock(1n)); + resolveBobFunding(bobPayment); + await escrowDepositPs.stock; // Wait for Bob's deposit to complete + + t.snapshot( + toRowStrings(tracker.getNewSplits(), splitColumns), + [ + 'STATE: Bob Funds (second mover)', + 'Bob withdraws from his purse and deposits to escrow.', + 'His payment creates a hold, then deposit retargets it to escrow.', + 'Both parties funded - escrow can now settle.', + ].join('\n'), + ); + + // === AMIX STATE: Settlement === + // In real escrow2013, this happens automatically via Promise.all resolution. + // Here we manually perform the settlement to show the ledger changes. + const stockForAlice = escrowStock.withdraw(stock(1n)); + const moolaForBob = escrowMoola.withdraw(moola(10n)); + aliceStock.deposit(stockForAlice); + bobMoola.deposit(moolaForBob); + + t.snapshot( + toRowStrings(tracker.getNewSplits(), splitColumns), + [ + 'STATE: Settlement', + 'Escrow pays out to counterparties.', + 'Alice gets Stock (what she wanted); Bob gets Moola (what he wanted).', + 'Four new splits: escrow withdraws create holds, deposits finalize them.', + ].join('\n'), + ); + + rawDb.close(); +}); + test.todo('Multi-commodity swaps: show ledger rows for two brands'); diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md index 698b438..3890fbe 100644 --- a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md @@ -62,6 +62,30 @@ Generated by [AVA](https://avajs.dev). 'e843dce22274 | BUCKS Mint Holding | | STOCK | 0 ', ] +## Building account hierarchies with placeholder parents + +> The accounts table forms a tree via guid and parent_guid columns. +> Account codes (1000, 1100, etc.) enable cross-system integration. +> Placeholder accounts (Y) group children; leaf accounts hold balances. +> +> Tree structure: +> 1000 Assets (placeholder) +> 1100 Bank (placeholder) +> 1110 Checking +> 1120 Savings +> 6000 Expenses (placeholder) +> 6100 Food + + [ + 'code | name | parent_guid | placeholder', + '1000 | Assets | e7ee18a10171 | Y ', + '1100 | Bank | 000000000001 | Y ', + '1110 | Checking | 000000000002 | ', + '1120 | Savings | 000000000002 | ', + '6000 | Expenses | e7ee18a10171 | Y ', + '6100 | Food | 000000000005 | ', + ] + ## Withdraw creates a hold > Withdraw removes value from the purse by creating a new hold transaction, in addition to the earlier mint/deposit transaction. @@ -83,3 +107,52 @@ Generated by [AVA](https://avajs.dev). '000000000006 | 000000000005 | e843dce22274 | BUCKS Mint Holding | 2 | 1 | n ', '000000000007 | 000000000005 | 000000000001 | Alice | -2 | 1 | n ', ] + +## Escrow exchange: async funding (AMIX-style state machine) + +> Escrow follows the AMIX state machine (American Information Exchange, 1984). +> AMIX models exchange as: Agreement → Funding → Settlement (or Cancellation). +> +> STATE: Agreement +> Escrow purses exist but are empty. Both parties hold Promise. +> Funding happens asynchronously - Alice may fund before Bob, or vice versa. +> No ledger changes yet. + + [ + 'tx_guid | account | value_num | value_denom | reconcile_state', + ] + +> STATE: Alice Funds (first mover) +> Alice withdraws from her purse and deposits to escrow. +> Her payment creates a hold, then deposit retargets it to escrow. +> Escrow now holds 10 Moola; still waiting for Bob. + + [ + 'tx_guid | account | value_num | value_denom | reconcile_state', + '000000000011 | Alice:Moola | -10 | 1 | c ', + '000000000011 | Escrow:Moola | 10 | 1 | c ', + ] + +> STATE: Bob Funds (second mover) +> Bob withdraws from his purse and deposits to escrow. +> His payment creates a hold, then deposit retargets it to escrow. +> Both parties funded - escrow can now settle. + + [ + 'tx_guid | account | value_num | value_denom | reconcile_state', + '000000000014 | Bob:Stock | -1 | 1 | c ', + '000000000014 | Escrow:Stock | 1 | 1 | c ', + ] + +> STATE: Settlement +> Escrow pays out to counterparties. +> Alice gets Stock (what she wanted); Bob gets Moola (what he wanted). +> Four new splits: escrow withdraws create holds, deposits finalize them. + + [ + 'tx_guid | account | value_num | value_denom | reconcile_state', + '000000000017 | Alice:Stock | 1 | 1 | c ', + '000000000017 | Escrow:Stock | -1 | 1 | c ', + '00000000001a | Bob:Moola | 10 | 1 | c ', + '00000000001a | Escrow:Moola | -10 | 1 | c ', + ] diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap index 5e556a67091b4de3966f5512d63ba6466599e23a..efa2fb90949e22a846e5225160433b3fb4ed4080 100644 GIT binary patch literal 2672 zcmV-$3Xk`3G{!#eo=d$^Vc`u7N?7B_x`@do@VrEJkwZfGsbQ)#(weD-*b(pzS+33t2LiC z8pXF~pM91!0@k?38eeD6HLkI5HP%?;#y1J)%@tHxCX^k?PK6Jm&KxV1?eXNXq z7;}sCfYPGQpJouFiL@A7p`v7lx11Y(u-6Wl;)^|WF!3=ZBpK6H*?kl>lSmnkQMtYDEzP4cR?fut|7I0=qn1Ya20f%v>$>H%x7>G1-vZN%^ zAxY!C&|EuFV8)5CrUj`wrBgrUNro`cDs_&XyOBy_dgqTa_d;)TKRJfqZ+uh%@%2r{ zSdTIG8Ds2gjSGOhRtNGsH6Yuwhx1=%#X<^LyEQ)~a2MZWl!~4-MoLB^!H33ji%XDx zrvm909E2ATUU}@m47MsO>MTG%TI53E=h`Yio6COi_T~$5gxzj;o8E40UD8iMqQ4!v zAc7gGi3>~~#Z;YQ&jsE=M4VzRbY(;d3^Y#Skh^gzvjpSEK_Co*eI+fP*&g(9Kpb>1 z^;n!B@I)hzryhPW2xBtT&Qb1~LZf5T3jiV|jfF?Wn2+HOr2GV5b&szJ+q~)Eesg`N z9Gu&@knna{4AWj?5p zlNJf*eP%G`8s~g1=xe8A$~ohNM@WZXMc8w zNRc$aHP+5@l%-s540uF=rHz^}*p*Y_3aNh%1PZ6K@*!pa4|hNez^D}SQAtAZxA6AS zU6_ne()S5BAeC)-tyftRL!b27Wv(!ITUwD21S#sd-x5|W2bBclA!-VKq_oD!x}2!S z{G$vhYq*7*5-Q)lFHXxXfRN5cZk@7~H@yNgUsN!2<2GaLWyaXA7-RopjQ!vuVZUC- z&Vx%}XAv$}!^?vj7#%T??b3F6nQ_0-{zgP|fu3`E39EU9jA!kO^| z4BBiA6QR+Ra2${dfl);XUlpCagWS~P9se?L`%Odn4`&|Lr9(q9_51Ca;xmYO$UgZEf2BWq*lrs^1C>mj%lnr z*PG6AaG2y8FwdQtj47dcOQoI<#VIk&0?#?K+SbD5@_yYYc@=B_Sz+xncNt^fV~qWrG4@Bs*jj_J-3DVnYB2W2MGStr z&fr$0VyrTEiLU4Iv(;(49%0uQv}P3<-#>?atxm_y-sAG50Q(}}SIl0k%&1dKPzNb{Yyzi~mofYOZ z&S{w!Jyd9oC+R8$&b_Nvu)sK!SXphg`V{eV%X`QN|69X}!kkEV7wK z(in#$kD_J;aq9t{fy0SI$?`jT+i905D1Ym=i`WJLE?i}>mW{Z8P&hnwC+`Y7iZ!2< zwIR=I=A~BuKdZW=M~tyAE-J*9x}a(i3S@_kN+;W*a)!rw_g^&3$aNx6ySncAvPGUx z%9EVyeLXd(cQSctB_x8dm>OT0bL$*0O?N9fK^zxrr-eX_F=bMWm-^<+RdvN`l&0(% zVNx{E*M3`p##1jb#`eCdw|>tU+i5WNy9Q%h*Dip_jXFe5uGB~ukCm$INxJKk3N|k8 zu2+<5PttN%onPE?uc))G(1$OjnyT|#%W8cY=iSHdT&{M0eUWP$bh=aUr{v022vSJjdwx>` zl_Z7e&^{J-0L|SLwV(?7RY{54rBpcZC((k=i?=t|!@$i13}5nAhSEt^WizLTNE*E$VE!^7Z#DmvhN!v>~k%bUo%t8(n8jIqC7Img~#t(Z?Pj`u4xEP2>_L#c#226ozy zVcuMi)Vi-(BNW2AvDk&2yLvpU)1YC{$}FSx$ze#)Sr}W_c_nq zXQNwB7`);-7>A8o(d2G8WSJ;6TCRsw=uxts8}O)i3SUicY*hcP<&lbK$W$hevL^YV30G_|n5;PxT9M7}{D~po3o2u_4Sw z*q{+lf{g_^A~C@jHvHTC(n3w>a>FL`|6lxjRr&Qx#@Ig?W3M+D`^`no@>2QrKY_<~ zsU996SBT=d@Yr64$CYunw#qQ~fc9z!SCOTqa;I*%rgxVXQV-}qctFo{WSRc>)VP0) zSOqSOs6E0$uYnGT`B60|)HawA!h}nU@%oOVh#QeFEgvx-5C->Drd_9z7gD_fuXFnN e`(`J1tvPcBLh?lX(ESr84gU*BnYS>N9smHnk}@v< literal 1724 zcmV;t21EHlRzV0uiwQncl?k4*<`OXTEVY^%`Ri?He>ADpMUQJue}}Iyk`ub1wr+6>((t6bXc&# zf;ZVa!3O(vu*rg(ZwH@@a}h(e<`Ct^po(T^{{0+Op8EHhw(czE4rznRp(%EAh|xwy zWKL*RDi4BMdv~$=Fo)$ehi-S!?ZO=T-Tv*pZf~!@-`+G9NG= znKd+qod-`(pLjzsl6WD865)Zw$Qi9f1W&~{ahB{l9cj4`uZ2Rgmxay9I9zCf^!8wXS2NDG2Zxs+%fcvC#01C;8GaA?74FIOoU zKuY*JfcwvmADt}W%q5tDP)-AfEH`BEG!YgegPb&Jg%l)ZODpuPn`*F`6wdBKswWin z370v-$mrA?_T~~TWBRWQWnqQ>E$kE+{!{RE1H?D>8Dj&+*bBzk8^I+&-fRQ;^A?cZ z#o6M`ymF+1wfFgqz+FAZs5I>iMp{Ke;+b{a;R>WbZ$SD358)+*H?}>P!$HHN-V*eq zEFGBE83}w=-($kiC_~w^@%C6nCb}*eBwPs!~|QZ zt20VqAUTC&?&Wmu2*xjiK-lRVYvu654Pb~PszDFa5{pv=E)DW{R>Cg^VQr4a8!Ajw zYD{bg9e_wH>)?4M^9|gEl%M0re)~wc?JW=Yt(~J+*|4(*%Z@FS*G%VikF@deQ#dV8wk^3s1B#~@!$fd6PPlQu=MlP{uxd8% zRs>}+{SxFRtBXzHAjIISH>?bI7>CMZH$#>t-4CoJ{fv zDR^jB3iQiX33gw-dabrJhkGX{4^A6Bs$D!6Klvb1CM|G-tym^`%GKV8N0eAPs0};! z)QoC{*uMY*rPFKqin{+-M<7OEb&7?QlmveV&rUvsX@ZKLr`&?lZnxxmoy!=8#LvES zg`H>02}uy7tQU4`SnYbKNQ}p5DEW~#1|#QtqR#l&Ia1f~j@ue4?>!Wg`UoJD*HLJv zZdIyYgPHFen7Mg}G4?yg*xwmr|7DE*`7&a^(ZD`00CF4x1$;}#h1NfEUT%mEJ( zdv|!R+dCwolheQu2;&hggtdHxK*W7s`3l3QH&RoUR&`M1;pO3|a zD$D^dYOoBCioK{yU>n16xC@_|ac|(gsR@1hg>Xr1__S^?ylA{D_l5th8?~M@#=gId z%~wXPZo4A=9pM$Xgq50W5^%r12f)j30xMP3)NoK~2>Z>C4wg0*t~+(a4AQh?+w*IY zs$n^Y`0nhxEQPf>4(}2t^0>G{R8u!{BLy1Y9Nw?z?8Qe#rT7857%Kb#W($563PCtb zZQ0$q^M+SG_nw?1W|i;c2*emuIbysreCNJ3RNiPqB^aTsrtpn_HlXp^Zy96vemJJ`4cA~)L*IltC4UTquH{!2#m^J|UhYxw?`% Date: Sun, 25 Jan 2026 22:14:44 -0600 Subject: [PATCH 47/77] refactor(ertp-ledgerguise): make sealer/unsealer properly typed - Extract to src/sealer.ts with parametric Sealed, Sealer, Unsealer - Unsealer.unseal takes unknown, returns T (sound typing) - Remove unsound cast in getGuidFromSealed - Delete docs-dev/sealer-unsealer.md (content in module JSDoc) - Document POLA facet separation on createIssuerKit/openIssuerKit Co-Authored-By: Claude Opus 4.5 --- .../docs-dev/sealer-unsealer.md | 70 ------------------- packages/ertp-ledgerguise/src/index.ts | 60 +++++++--------- packages/ertp-ledgerguise/src/sealer.ts | 65 +++++++++++++++++ 3 files changed, 92 insertions(+), 103 deletions(-) delete mode 100644 packages/ertp-ledgerguise/docs-dev/sealer-unsealer.md create mode 100644 packages/ertp-ledgerguise/src/sealer.ts diff --git a/packages/ertp-ledgerguise/docs-dev/sealer-unsealer.md b/packages/ertp-ledgerguise/docs-dev/sealer-unsealer.md deleted file mode 100644 index 1b2006d..0000000 --- a/packages/ertp-ledgerguise/docs-dev/sealer-unsealer.md +++ /dev/null @@ -1,70 +0,0 @@ -# Sealer/Unsealer Pattern - -Secure identification of escrow accounts without leaking withdrawal authority. - -## Problem - -To implement the atomic swap accounting model, we need to identify the account GUIDs of the internal escrow purses (the ones created by `makeErtpEscrow`) in a secure, object-capability (ocap) compliant manner. - -We cannot simply return the `Purse` objects themselves, as this would leak the authority to withdraw funds, violating security principles. - -## Solution - -The solution leverages a "sealer/unsealer" pattern using a shared `WeakMap`: - -### 1. `createIssuerKit` Enhancements - -- Internally, `createIssuerKit` creates a private `sealer` and `unsealer` pair that shares a secret `WeakMap`. -- The `sealer` can turn a powerful object (like a `Purse`) into an inert, unforgeable "token" (a sealed object). -- The `unsealer` can later retrieve the original object from its corresponding token. -- The `issuerKit` returns the `sealer` object at its top level, allowing authorized parties to create sealed tokens. -- The existing `purses` facet is enhanced with a new method: `getGuidFromSealed(sealedPurse)`. This `purses` facet acts as the "unsealer". - -### 2. `makeErtpEscrow` Integration - -- The `makeErtpEscrow` function accepts the `sealer` object (obtained from an `issuerKit`) as a parameter. -- After creating its internal escrow purses, `makeErtpEscrow` uses this provided `sealer` to create inert, sealed tokens for these internal purses. -- `makeErtpEscrow` provides a new method, `getSealedPurses()`, which safely returns these `sealedPurse` tokens. - -### 3. Client-Side Orchestration - -```js -// 1. Create issuerKits, obtaining sealer and purses facet -const moolaKit = createIssuerKit({ db, ... }); -const stockKit = createIssuerKit({ db, ... }); - -// 2. Create escrow instance, passing sealers -const escrow = makeErtpEscrow({ - issuers: { A: moolaKit.issuer, B: stockKit.issuer }, - sealers: { A: moolaKit.sealer, B: stockKit.sealer }, -}); - -// 3. Execute exchange -await escrow.escrowExchange(aliceOffer, bobOffer); - -// 4. Get sealed tokens (inert, no withdrawal authority) -const sealed = escrow.getSealedPurses(); - -// 5. Securely retrieve account GUIDs via the purses facet -const moolaEscrowGuid = moolaKit.purses.getGuidFromSealed(sealed.A); -const stockEscrowGuid = stockKit.purses.getGuidFromSealed(sealed.B); -``` - -## Security Properties - -- The sealed token is **inert**: it cannot be used to withdraw funds -- The sealed token is **unforgeable**: only the original sealer can create valid tokens -- Only the matching unsealer (via `purses.getGuidFromSealed`) can extract information -- The `account_guid` is safe to expose: it identifies but does not authorize - -## Use Cases - -These `account_guid`s allow us to: -- Query the ledger for escrow-related splits -- Build reports showing escrow state -- Integrate with external systems using the account's `code` field - -## See Also - -- `escrow-accounting.md` - How escrow maps to ledger transactions -- Jessie README on capability discipline: https://github.com/endojs/Jessie diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index ce9536f..846071d 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -32,36 +32,11 @@ import { } from './db-helpers.js'; import { makePurseFactory } from './purse.js'; // import { makeEscrow } from './escrow.js'; // This is the old, "all over the floor" escrow -import { makeErtpEscrow } from './escrow-ertp.js'; // Use the solid escrow-ertp +import { makeErtpEscrow } from './escrow-ertp.js'; +import { makeSealerUnsealerPair } from './sealer.js'; +import type { Sealed, Sealer, Unsealer } from './sealer.js'; -// Internal helper for sealer/unsealer pattern -const makeSealerUnsealerPair = () => { - const sealedToReal = new WeakMap(); - const realToSealed = new WeakMap(); - - const sealer = Object.freeze({ - seal: (obj: object): object => { - if (realToSealed.has(obj)) return realToSealed.get(obj)!; // Return existing sealed object - const sealedObj = Object.freeze({}); // Create an inert token - sealedToReal.set(sealedObj, obj); - realToSealed.set(obj, sealedObj); - return sealedObj; - }, - }); - - const unsealer = Object.freeze({ - unseal: (sealedObj: object): object => { - if (!sealedToReal.has(sealedObj)) { - throw new Error("That's not my sealed object!"); - } - return sealedToReal.get(sealedObj)!; - }, - }); - return { sealer, unsealer }; -}; - -export type Sealer = ReturnType['sealer']; -export type Unsealer = ReturnType['unsealer']; +export type { Sealed, Sealer, Unsealer } from './sealer.js'; export type { CommoditySpec, @@ -343,7 +318,20 @@ const makeIssuerKitForCommodity = ({ /** * Create a new GnuCash commodity entry and return an ERTP kit bound to it. - * The returned kit includes `commodityGuid` and a `purses.getGuid()` facet. + * + * ## Facet Separation (POLA) + * + * The returned kit provides separate facets rather than expanding Issuer/Purse interfaces: + * + * - `issuer`, `brand`, `mint` - Standard ERTP interfaces (portable, no DB coupling) + * - `purses.getGuid(purse)` - Maps purse → account GUID (requires DB knowledge) + * - `purses.getGuidFromSealed(token)` - Unseal + map (for escrow identification) + * - `sealer` - Create inert tokens from purses (for secure sharing) + * - `payments` - Reify payments by check number (DB-specific recovery) + * + * This separation keeps ERTP interfaces clean and portable. DB-specific operations + * live in separate facets that can be withheld from code that doesn't need them. + * A caller with only `issuer` cannot learn account GUIDs or reify payments. */ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseGuids => { const { db, commodity, makeGuid, nowMs } = config; @@ -351,7 +339,7 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG // TODO: consider validation of DB capability and schema. const commodityGuid = makeGuid(); createCommodityRow({ db, guid: commodityGuid, commodity }); - const { sealer, unsealer } = makeSealerUnsealerPair(); // <<< ADDED + const { sealer, unsealer } = makeSealerUnsealerPair(); const { kit, purseGuids, payments, mintInfo } = makeIssuerKitForCommodity({ db, commodityGuid, @@ -366,8 +354,8 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG if (!guid) throw new Error('unknown purse'); return guid; }, - getGuidFromSealed: (sealedPurse: object) => { - const purse = unsealer.unseal(sealedPurse) as AccountPurse; + getGuidFromSealed: (sealedPurse: unknown) => { + const purse = unsealer.unseal(sealedPurse); const guid = purseGuids.get(purse); if (!guid) throw new Error('unknown sealed purse'); return guid; @@ -385,6 +373,12 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG /** * Open an existing commodity by GUID and return the kit plus account access. + * + * Like `createIssuerKit`, returns separate facets for POLA. Unlike `createIssuerKit`, + * this does not return a `sealer` since opening an existing commodity does not grant + * the authority to create new sealed tokens for its purses. + * + * @see createIssuerKit for facet separation rationale */ export const openIssuerKit = (config: OpenIssuerConfig): IssuerKitForCommodity => { const { db, commodityGuid, makeGuid, nowMs } = config; diff --git a/packages/ertp-ledgerguise/src/sealer.ts b/packages/ertp-ledgerguise/src/sealer.ts new file mode 100644 index 0000000..35298f9 --- /dev/null +++ b/packages/ertp-ledgerguise/src/sealer.ts @@ -0,0 +1,65 @@ +/** + * @file Sealer/unsealer pattern for capability attenuation. + * @see makeSealerUnsealerPair + */ + +const { freeze } = Object; + +/** An inert token representing a sealed value of type T (phantom type for branding). */ +export type Sealed = { readonly __sealed?: T }; + +export type Sealer = { seal: (obj: T) => Sealed }; +export type Unsealer = { unseal: (sealedObj: unknown) => T }; + +/** + * Create a matched sealer/unsealer pair sharing a secret WeakMap. + * + * A sealer and unsealer work like public key cryptography conceptually. + * You give something to the sealer and it puts that into a box (an inert token) + * that only the corresponding unsealer can open. + * + * This enables sharing identification without sharing authority: + * - The sealed token has no methods - it's just proof you know an unforgeable identity + * - Only the matching unsealer can retrieve the original object + * + * @example + * ```ts + * const { sealer, unsealer } = makeSealerUnsealerPair(); + * + * // Seal a powerful object into an inert token + * const token = sealer.seal(purse); // token: Sealed, no methods + * + * // Only the matching unsealer can retrieve the original + * const original = unsealer.unseal(token); // original: Purse + * ``` + * + * @see docs-dev/ocap-discipline.md for rationale + */ +export const makeSealerUnsealerPair = (): { + sealer: Sealer; + unsealer: Unsealer; +} => { + const sealedToReal = new WeakMap(); + const realToSealed = new WeakMap>(); + + const sealer: Sealer = freeze({ + seal: (obj: T): Sealed => { + if (realToSealed.has(obj)) return realToSealed.get(obj)!; + const sealedObj = freeze({}) as Sealed; + sealedToReal.set(sealedObj, obj); + realToSealed.set(obj, sealedObj); + return sealedObj; + }, + }); + + const unsealer: Unsealer = freeze({ + unseal: (sealedObj: unknown): T => { + if (!sealedToReal.has(sealedObj as object)) { + throw new Error("That's not my sealed object!"); + } + return sealedToReal.get(sealedObj as object)!; + }, + }); + + return { sealer, unsealer }; +}; From c382d935ee3eb4a65147281ca726ca2e5ee368fc Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 25 Jan 2026 22:14:57 -0600 Subject: [PATCH 48/77] docs(ertp-ledgerguise): restructure ocap-discipline around POLA - Core Principles: inject first (ambient authority under it), then encapsulation - Encapsulation section: freezing, zone pattern, actors (encapsulated state) - Increased Cooperation with Limited Vulnerability: capability-based security - Sealer/unsealer as key attenuation pattern with public-key analogy - Move sync/async DB IBIS to escrow-accounting.md - Add escrow account identification section to escrow-accounting.md - Document actor encapsulation pattern in escrow-db.test.ts JSDoc - Add JSDoc convention guidance to CONTRIBUTING.md Co-Authored-By: Claude Opus 4.5 --- packages/ertp-ledgerguise/CONTRIBUTING.md | 7 +- .../docs-dev/escrow-accounting.md | 58 +++++++++++- .../docs-dev/ocap-discipline.md | 90 +++++++++++-------- .../ertp-ledgerguise/test/escrow-db.test.ts | 25 +++++- 4 files changed, 137 insertions(+), 43 deletions(-) diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index f9799a8..da6d6c9 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -30,8 +30,7 @@ Detailed design docs are in `docs-dev/`: - `escrow-accounting.md` - Ledger transactions, payment holds, AMIX state machine - `integration.md` - Account codes, cross-system integration -- `ocap-discipline.md` - Clock injection, freezing, capability patterns -- `sealer-unsealer.md` - Secure escrow account identification +- `ocap-discipline.md` - Capability injection, encapsulation, sealer/unsealer The primary documentation of how ERTP is embedded in GnuCash is `test/snapshots/design-doc.test.ts.md`, integrated with the test suite. @@ -39,10 +38,14 @@ The primary documentation of how ERTP is embedded in GnuCash is `test/snapshots/ We use ESM (no CommonJS). Avoid more than 3 positional arguments; use an options object instead. Freeze API surfaces before use—see [jessie-tools](https://www.npmjs.com/package/jessie-tools) for the API or `docs-dev/ocap-discipline.md` for rationale. +For JSDoc, put detailed documentation on the exported functions/classes so it appears when hovering over call sites. Keep `@file` comments brief (one line) with `@see` links to the main entrypoints. + ## Testing We use in-memory databases for tests—never modify real ledger files. When fixing bugs, please capture them as failing tests first. +For multi-party scenarios, encapsulate each actor to follow POLA (Principle of Least Authority). Actors own their purses privately and expose only narrow interfaces (e.g., deposit facets). See `test/escrow-db.test.ts` for an example and `docs-dev/ocap-discipline.md` for rationale. + ## Data safety Please treat GnuCash SQLite files as production data. Use read-only queries when exploring; avoid destructive SQL. diff --git a/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md b/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md index 0fd1027..4a3ecd0 100644 --- a/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md +++ b/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md @@ -73,7 +73,7 @@ Agreement → [Party A Funds] → [Party B Funds] → Settlement (cancellation triggers refund) ``` -See `docs-dev/gi_mi_x_ami_x_system_summary_for_llm_prompting.md` for the full AMIX model. +See `amix-gimix-background.md` for the full AMIX model. ## IBIS: Payment Holds vs Immediate Transfers @@ -96,6 +96,57 @@ See `docs-dev/gi_mi_x_ami_x_system_summary_for_llm_prompting.md` for the full AM - Split destination mutation is part of the model (tested in `design-doc.test.ts`) - The `reconcile_state` column serves double duty: GnuCash reconciliation + hold tracking +## IBIS: Sync vs Async DB Access + +The hold transaction model above assumes we can atomically write to the database. This raises the question of sync vs async access. + +**Issue:** Should the GnuCash-backed ERTP facade use synchronous or asynchronous DB access? + +**Position A (sync):** +- Closer to ERTP's synchronous semantics (brand/purse/amount operations are typically sync) +- Easier to reason about atomicity in a single vat/turn +- Aligns with `better-sqlite3` and some WASM in-memory modes + +**Position B (async):** +- Required in some environments (Cloudflare Workers/D1, OPFS-backed WASM) +- Matches vbank's pattern: sync bridge calls, async balance updates +- Avoids blocking the event loop in hosted environments + +**Decision:** Start with synchronous DB access via injected capability. + +**Consequences:** +- The `db` capability is sync (`better-sqlite3` style) +- Async environments would need a different adapter that pre-loads data or uses a different injection pattern +- Tests use in-memory sync adapters + +This is not "async on top of sync"—rather, the injection point allows swapping the entire DB capability for environments with different constraints. + +## Escrow Account Identification + +To query ledger rows for an escrow arrangement, we need the account GUIDs of the escrow purses. But returning the `Purse` objects would leak withdrawal authority (POLA violation). + +The sealer/unsealer pattern solves this: + +```js +// Escrow creates internal purses, seals them +const escrow = makeErtpEscrow({ + issuers: { A: moolaKit.issuer, B: stockKit.issuer }, + sealers: { A: moolaKit.sealer, B: stockKit.sealer }, +}); + +// Get sealed tokens (inert, no withdrawal authority) +const sealed = escrow.getSealedPurses(); + +// Retrieve account GUIDs via the issuerKit's purses facet +const moolaEscrowGuid = moolaKit.purses.getGuidFromSealed(sealed.A); +const stockEscrowGuid = stockKit.purses.getGuidFromSealed(sealed.B); + +// Now we can query the ledger for these accounts +db.prepare('SELECT * FROM splits WHERE account_guid = ?').all(moolaEscrowGuid); +``` + +The `account_guid` is safe to expose: it identifies but does not authorize. + ## Implementation Notes - Funding uses `Promise` to model async timing @@ -104,5 +155,6 @@ See `docs-dev/gi_mi_x_ami_x_system_summary_for_llm_prompting.md` for the full AM ## See Also -- `test/snapshots/design-doc.test.ts.md` - Executable documentation showing ledger state at each step -- `sealer-unsealer.md` - Secure identification of escrow accounts +- `test/snapshots/design-doc.test.ts.md` - Ledger state at each escrow step +- `src/sealer.ts` - Sealer/unsealer implementation +- `ocap-discipline.md` - Capability patterns and rationale diff --git a/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md b/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md index c8c9d72..50a20ce 100644 --- a/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md +++ b/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md @@ -4,11 +4,14 @@ Guidelines for maintaining capability discipline in ertp-ledgerguise. ## Core Principles -1. **No ambient authority** - All capabilities must be explicitly passed -2. **Freeze API surfaces** - Objects that escape their creation context must be frozen -3. **Inject, don't import** - IO capabilities come from parameters, not imports +1. **Inject, don't import** - IO capabilities come from parameters, not imports + - This implies **no ambient authority**: all capabilities must be explicitly passed +2. **Encapsulation** - Objects protect their internal state and communicate by messages + - **Freeze API surfaces** to enforce encapsulation at runtime -## Clock Injection +## Capability Injection + +### Clock Injection Timestamped rows (e.g., `post_date`, `enter_date`) must read from an injected clock capability, not ambient `Date.now()`. @@ -28,7 +31,7 @@ const kit = createIssuerKit({ db, commodity, makeGuid, nowMs }); This keeps tests deterministic and preserves ocap discipline. -## Database Injection +### Database Injection The database is passed as a capability, never opened from a path: @@ -40,7 +43,11 @@ const kit = createIssuerKit({ db, ... }); const db = openDatabase('/path/to/file.gnucash'); // Don't do this ``` -## Freezing API Surfaces +See `escrow-accounting.md` for the sync vs async DB access decision. + +## Encapsulation + +### Freezing API Surfaces From the Jessie guidelines: any object literal, array literal, or function literal that escapes its creation context should be frozen. @@ -60,19 +67,9 @@ return freeze({ // Don't freeze objects received from elsewhere ``` -## Capability Attenuation - -The sealer/unsealer pattern demonstrates capability attenuation: - -- A `Purse` has full authority (deposit, withdraw, getBalance) -- A sealed purse token has no authority (it's inert) -- The `purses.getGuidFromSealed()` method provides read-only access to the GUID +### Zone Pattern -This allows sharing identification without sharing authority. - -## Zone Pattern - -The `zone` parameter provides controlled object creation: +The `zone` parameter provides controlled object creation with built-in hardening: ```js const kit = createIssuerKit({ @@ -84,33 +81,54 @@ const kit = createIssuerKit({ }); ``` -This enables future integration with durable storage or virtual objects. +`zone.exo()` creates frozen objects with method-only interfaces. This enables future integration with durable storage or virtual objects while enforcing encapsulation. + +### Actors + +An **actor** is an object with encapsulated state that communicates only by messages (method calls). In multi-party scenarios (like escrow), each participant should be modeled as an actor: -## IBIS: Sync vs Async DB Access +- Private purses owned by the actor, not leaked to callers +- Narrow interface exposed (e.g., `run()`, `getBalances()`) +- Communication via deposit facets, not direct purse access -**Issue:** Should the GnuCash-backed ERTP facade use synchronous or asynchronous DB access? +This follows the Principle of Least Authority (POLA): give each object only the capabilities it needs. See `test/escrow-db.test.ts` for an example of actor encapsulation in tests. -**Position A (sync):** -- Closer to ERTP's synchronous semantics (brand/purse/amount operations are typically sync) -- Easier to reason about atomicity in a single vat/turn -- Aligns with `better-sqlite3` and some WASM in-memory modes +## Increased Cooperation with Limited Vulnerability -**Position B (async):** -- Required in some environments (Cloudflare Workers/D1, OPFS-backed WASM) -- Matches vbank's pattern: sync bridge calls, async balance updates -- Avoids blocking the event loop in hosted environments +> Capability-based security enables the concise composition of powerful patterns of cooperation without vulnerability. + +The escrow pattern in `escrow-accounting.md` demonstrates this: two mutually distrusting parties can swap assets atomically. Each party funds the escrow with a `Promise`, and settlement only occurs when both have funded. Neither party needs to trust the other—the escrow mechanism enforces the protocol. + +A key pattern enabling this is **capability attenuation**: reducing the authority of an object before sharing it. + +### Sealer/Unsealer Pattern + +A sealer and unsealer work like public key cryptography conceptually. You give something to the sealer and it puts that into a box that only the corresponding unsealer can open. + +```js +const { sealer, unsealer } = makeSealerUnsealerPair(); + +// Seal a powerful object into an inert token +const token = sealer.seal(purse); // token has no authority + +// Only the matching unsealer can retrieve the original +const original = unsealer.unseal(token); // returns the purse +``` -**Decision:** Start with synchronous DB access via injected capability. +This allows sharing identification without sharing authority: -**Consequences:** -- The `db` capability is sync (`better-sqlite3` style) -- Async environments would need a different adapter that pre-loads data or uses a different injection pattern -- Tests use in-memory sync adapters +| What you have | Authority | +|---------------|-----------| +| Purse | Full: deposit, withdraw, getBalance | +| Sealed token | No methods | +| Unsealer | Can retrieve original to inspect it | -This is not "async on top of sync"—rather, the injection point allows swapping the entire DB capability for environments with different constraints. +See `src/sealer.ts` for the implementation and `escrow-accounting.md` for how it's used to identify escrow accounts without leaking withdrawal authority. ## See Also - Jessie README: https://github.com/endojs/Jessie -- `sealer-unsealer.md` - Example of capability attenuation +- `src/sealer.ts` - Sealer/unsealer implementation +- `escrow-accounting.md` - Escrow as cooperation without vulnerability +- `test/escrow-db.test.ts` - Actor encapsulation in tests - CONTRIBUTING.md - Agent tactics for maintaining ocap discipline diff --git a/packages/ertp-ledgerguise/test/escrow-db.test.ts b/packages/ertp-ledgerguise/test/escrow-db.test.ts index 226e408..1fb8361 100644 --- a/packages/ertp-ledgerguise/test/escrow-db.test.ts +++ b/packages/ertp-ledgerguise/test/escrow-db.test.ts @@ -1,6 +1,27 @@ /** - * @file Minimal escrow tests. - * @see ../src/escrow.ts + * @file Escrow tests demonstrating actor encapsulation. + * + * ## Actor Encapsulation (POLA) + * + * Multi-party tests should encapsulate each actor's state and behavior in a + * factory function. This follows the Principle of Least Authority (POLA): + * + * - Actors own their purses privately; they expose only deposit facets to others + * - Actors expose narrow interfaces (e.g., `run()`, `getBalances()`) not raw purses + * - The test orchestrates actors without accessing their internal state + * + * Compare `makeClient` and `makeVendor` below: each creates private purses, + * exposes only what counterparties need, and encapsulates the escrow protocol. + * The test reads as a narrative: "Carl and Vince run their protocols." + * + * Anti-pattern (avoid in multi-party tests): + * ```js + * const alicePurse = issuer.makeEmptyPurse(); // leaked to test scope + * const bobPurse = issuer.makeEmptyPurse(); // leaked to test scope + * // test manually orchestrates withdraws/deposits + * ``` + * + * @see ../docs-dev/ocap-discipline.md */ import test from 'ava'; From c1a9eee576aad92a1c4d723fafa3a3c08fdc7864 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 26 Jan 2026 17:40:44 -0600 Subject: [PATCH 49/77] fixup! test(ertp-ledgerguise): add async escrow and account hierarchy snapshots --- .../ertp-ledgerguise/test/design-doc.test.ts | 3 ++- .../test/snapshots/design-doc.test.ts.md | 14 +++++++------- .../test/snapshots/design-doc.test.ts.snap | Bin 2672 -> 2694 bytes 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index f0a8bc4..d605c88 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -345,6 +345,7 @@ serial('Building account hierarchies with placeholder parents', t => { .all(moolaKit.commodityGuid) .filter(row => !row.name.includes('Mint')) // exclude internal accounts .map(row => ({ + guid: shortGuid(row.guid), code: row.code ?? '', name: row.name, parent_guid: row.parent_guid ? shortGuid(row.parent_guid) : '', @@ -352,7 +353,7 @@ serial('Building account hierarchies with placeholder parents', t => { })); t.snapshot( - toRowStrings(accounts, ['code', 'name', 'parent_guid', 'placeholder']), + toRowStrings(accounts, ['guid', 'code', 'name', 'parent_guid', 'placeholder']), [ 'The accounts table forms a tree via guid and parent_guid columns.', 'Account codes (1000, 1100, etc.) enable cross-system integration.', diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md index 3890fbe..c822a44 100644 --- a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md @@ -77,13 +77,13 @@ Generated by [AVA](https://avajs.dev). > 6100 Food [ - 'code | name | parent_guid | placeholder', - '1000 | Assets | e7ee18a10171 | Y ', - '1100 | Bank | 000000000001 | Y ', - '1110 | Checking | 000000000002 | ', - '1120 | Savings | 000000000002 | ', - '6000 | Expenses | e7ee18a10171 | Y ', - '6100 | Food | 000000000005 | ', + 'guid | code | name | parent_guid | placeholder', + '000000000001 | 1000 | Assets | e7ee18a10171 | Y ', + '000000000002 | 1100 | Bank | 000000000001 | Y ', + '000000000003 | 1110 | Checking | 000000000002 | ', + '000000000004 | 1120 | Savings | 000000000002 | ', + '000000000005 | 6000 | Expenses | e7ee18a10171 | Y ', + '000000000006 | 6100 | Food | 000000000005 | ', ] ## Withdraw creates a hold diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap index efa2fb90949e22a846e5225160433b3fb4ed4080..cb2ba32784e6e91c1b0c64b8095793740dc1cba0 100644 GIT binary patch literal 2694 zcmV;13VHQGRzVg~lnY!_eeZ5G zC)NT8?jMT?00000000BkSzBu)#}%%Tc5SCgFvfwr1Ih;m4VXj!{BCv(V=TV@Q=o zP!g=>v7l-51Y(u-6I@4W^|XQ*2K#Rx9XLZUNbpqj6NLQ)Bde7Z5xgyiBWuX6Rgp^O z!^^=aRW=-f9dQd2gosOWX@V(A3&Og2s4=Jka46PA{-vpgLGUhuv0Pi22ummkCgn+j z#)31&BU*rm*TSL!tK7H(qz5VSYZG=K?7eu9wcYZ5#EA%$ElXLj}#zz$rU)x}e z^%!HHF~+{txPZv3bt1o0BeFexIDaxLCQ{Ja&G{jbyZ9ZWRCK2?QZf<=J~WnFT%hzj z6-vM8D13(DmD>)?V6!r#&Kc@QXJetTv$D+2#-bg(weeycVYl1eqPOdtm$Xv^(LWBI z6Tyts#5pGSVyaHC=N#`SB2KX8y3(UW1{x=E$lW-VS)%ddC=dq0o{|<%Z4df5pcr&C z^<11F@I)hzr=ET>2xBtT&QNZeT%%*t3jiV|jfF?Wn2+H$r2H6PbGNSx+q~iEeq(LB z9Gqj^_Me0_d_NuA=>a`&u5Aaw(MY)k64@z^vSILh5f~74G(xA4a z5s^w$6$?8BttQZPb69gLC}PTO4K3sZ_4I|>9+@y$hqDu#gO^I@um?)J{gXKHD{Cg) zq6W!RjNwFZ*c)+e@A3%kT395T?-v4PaLhFcxQkoKQz3`*B=hqkK)wc9|;-9!M(^q9A!aw_DPx<*1TiJVZ^-kCfIJS(g*l zn17TZWeqoRQ&Q!J_ryuL1Q60;HioUnK4%927%iyn;__b6}!GG1u%T@4;1o6A&dg^${!B7z+1|s4lmQ*)5;mmjf z25mNmiO^_DIu1yMz^I}Gay~35G}rTEVc~XNUYm~~?zbQeL-@EN=Q(gL`*Wr9gNJCH zdfv-K+#}e~X`~5@? z-f+mlL6U30Ja=X?riA8^NW2i7I9Lr$7(;8I}Mmw|1<3~uIowtqTCY0zA1 z&z@Qac9X#JJ-e$^ytrqZ%Ud|i^&*e|yt<-_CMCtN8qw7+jt#E*tFR+dNtQ}Vsh;jc zCId~PLCg8C1!$vi4NyARNGoI3&D7Yu*}y~E)@c7e$h3IbAi0BZ)ZuO(hGdBf2gL20-Qb%O!J#H@Nec!7%^>vlF<3^=r zZc*LDc<@kI#sP6Z^#%DF5NyJm9O2eL$p~T^@g+Xw5v~#py z`9ART&Fg!>Q(^MHmKt-UW0Vkf6;;7pTPlg2Fdk@?3WF~n@F{`35(dQ-Mtn?(HFxDm zE2%P*Okv$~G38U|-{J^sSM^(@mM8S`1hwH|a9;lw z?=4r%Cl|+il`t&hu=l1?33n0LX+I_cFA}~waPB;hOtt(aMa_ryR|OlKZ^(rPnggMY zbqASxEy&+Yd^$J&goYZSGTMF4a|h?><`V|5x>m_?qgFJzqZC;tN{yE5Ar*R*tmgop zl~Uz3fuW_jRc?c^B1vGvg{vDVi|?xb|1CXSj!^yHp;ghb7wFC2~#yAW|B z@~Pz`<^#guuFACQH1a~KSMYTnKK@|a$z5w6IRhbiB7W-r+mnX>1;i#sLH-^905A?f A?*IS* literal 2672 zcmV-$3Xk`3G{!#eo=d$^Vc`u7N?7B_x`@do@VrEJkwZfGsbQ)#(weD-*b(pzS+33t2LiC z8pXF~pM91!0@k?38eeD6HLkI5HP%?;#y1J)%@tHxCX^k?PK6Jm&KxV1?eXNXq z7;}sCfYPGQpJouFiL@A7p`v7lx11Y(u-6Wl;)^|WF!3=ZBpK6H*?kl>lSmnkQMtYDEzP4cR?fut|7I0=qn1Ya20f%v>$>H%x7>G1-vZN%^ zAxY!C&|EuFV8)5CrUj`wrBgrUNro`cDs_&XyOBy_dgqTa_d;)TKRJfqZ+uh%@%2r{ zSdTIG8Ds2gjSGOhRtNGsH6Yuwhx1=%#X<^LyEQ)~a2MZWl!~4-MoLB^!H33ji%XDx zrvm909E2ATUU}@m47MsO>MTG%TI53E=h`Yio6COi_T~$5gxzj;o8E40UD8iMqQ4!v zAc7gGi3>~~#Z;YQ&jsE=M4VzRbY(;d3^Y#Skh^gzvjpSEK_Co*eI+fP*&g(9Kpb>1 z^;n!B@I)hzryhPW2xBtT&Qb1~LZf5T3jiV|jfF?Wn2+HOr2GV5b&szJ+q~)Eesg`N z9Gu&@knna{4AWj?5p zlNJf*eP%G`8s~g1=xe8A$~ohNM@WZXMc8w zNRc$aHP+5@l%-s540uF=rHz^}*p*Y_3aNh%1PZ6K@*!pa4|hNez^D}SQAtAZxA6AS zU6_ne()S5BAeC)-tyftRL!b27Wv(!ITUwD21S#sd-x5|W2bBclA!-VKq_oD!x}2!S z{G$vhYq*7*5-Q)lFHXxXfRN5cZk@7~H@yNgUsN!2<2GaLWyaXA7-RopjQ!vuVZUC- z&Vx%}XAv$}!^?vj7#%T??b3F6nQ_0-{zgP|fu3`E39EU9jA!kO^| z4BBiA6QR+Ra2${dfl);XUlpCagWS~P9se?L`%Odn4`&|Lr9(q9_51Ca;xmYO$UgZEf2BWq*lrs^1C>mj%lnr z*PG6AaG2y8FwdQtj47dcOQoI<#VIk&0?#?K+SbD5@_yYYc@=B_Sz+xncNt^fV~qWrG4@Bs*jj_J-3DVnYB2W2MGStr z&fr$0VyrTEiLU4Iv(;(49%0uQv}P3<-#>?atxm_y-sAG50Q(}}SIl0k%&1dKPzNb{Yyzi~mofYOZ z&S{w!Jyd9oC+R8$&b_Nvu)sK!SXphg`V{eV%X`QN|69X}!kkEV7wK z(in#$kD_J;aq9t{fy0SI$?`jT+i905D1Ym=i`WJLE?i}>mW{Z8P&hnwC+`Y7iZ!2< zwIR=I=A~BuKdZW=M~tyAE-J*9x}a(i3S@_kN+;W*a)!rw_g^&3$aNx6ySncAvPGUx z%9EVyeLXd(cQSctB_x8dm>OT0bL$*0O?N9fK^zxrr-eX_F=bMWm-^<+RdvN`l&0(% zVNx{E*M3`p##1jb#`eCdw|>tU+i5WNy9Q%h*Dip_jXFe5uGB~ukCm$INxJKk3N|k8 zu2+<5PttN%onPE?uc))G(1$OjnyT|#%W8cY=iSHdT&{M0eUWP$bh=aUr{v022vSJjdwx>` zl_Z7e&^{J-0L|SLwV(?7RY{54rBpcZC((k=i?=t|!@$i13}5nAhSEt^WizLTNE*E$VE!^7Z#DmvhN!v>~k%bUo%t8(n8jIqC7Img~#t(Z?Pj`u4xEP2>_L#c#226ozy zVcuMi)Vi-(BNW2AvDk&2yLvpU)1YC{$}FSx$ze#)Sr}W_c_nq zXQNwB7`);-7>A8o(d2G8WSJ;6TCRsw=uxts8}O)i3SUicY*hcP<&lbK$W$hevL^YV30G_|n5;PxT9M7}{D~po3o2u_4Sw z*q{+lf{g_^A~C@jHvHTC(n3w>a>FL`|6lxjRr&Qx#@Ig?W3M+D`^`no@>2QrKY_<~ zsU996SBT=d@Yr64$CYunw#qQ~fc9z!SCOTqa;I*%rgxVXQV-}qctFo{WSRc>)VP0) zSOqSOs6E0$uYnGT`B60|)HawA!h}nU@%oOVh#QeFEgvx-5C->Drd_9z7gD_fuXFnN e`(`J1tvPcBLh?lX(ESr84gU*BnYS>N9smHnk}@v< From 6287d06667972cc21cb39b01b4ac124dd952fff0 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 28 Jan 2026 18:12:18 -0600 Subject: [PATCH 50/77] refactor(ertp-ledgerguise): consolidate mock IO utilities Create test/mock-io.ts with: - makeTestClock: deterministic clock advancing by fixed step - mockMakeGuid: sequential hex GUID generator - makeTestDb: in-memory GnuCash database setup Remove test/helpers/clock.ts and update imports. Co-Authored-By: Claude Opus 4.5 --- .../ertp-ledgerguise/test/adversarial.test.ts | 2 +- .../ertp-ledgerguise/test/escrow-db.test.ts | 2 +- .../ertp-ledgerguise/test/escrow-ertp.test.ts | 2 +- .../ertp-ledgerguise/test/helpers/clock.ts | 14 ----- .../ertp-ledgerguise/test/ledgerguise.test.ts | 2 +- packages/ertp-ledgerguise/test/mock-io.ts | 51 +++++++++++++++++++ 6 files changed, 55 insertions(+), 18 deletions(-) delete mode 100644 packages/ertp-ledgerguise/test/helpers/clock.ts create mode 100644 packages/ertp-ledgerguise/test/mock-io.ts diff --git a/packages/ertp-ledgerguise/test/adversarial.test.ts b/packages/ertp-ledgerguise/test/adversarial.test.ts index 16d65e1..a479029 100644 --- a/packages/ertp-ledgerguise/test/adversarial.test.ts +++ b/packages/ertp-ledgerguise/test/adversarial.test.ts @@ -15,7 +15,7 @@ import { } from '../src/index.js'; import { mockMakeGuid } from '../src/guids.js'; import type { SqlDatabase } from '../src/sql-db.js'; -import { makeTestClock } from './helpers/clock.js'; +import { makeTestClock } from './mock-io.js'; const seedAccountBalance = ( db: SqlDatabase, diff --git a/packages/ertp-ledgerguise/test/escrow-db.test.ts b/packages/ertp-ledgerguise/test/escrow-db.test.ts index 1fb8361..e346414 100644 --- a/packages/ertp-ledgerguise/test/escrow-db.test.ts +++ b/packages/ertp-ledgerguise/test/escrow-db.test.ts @@ -35,7 +35,7 @@ import { } from '../src/index.js'; // TODO: move mockMakeGuid and makeTestClock to test/test-io.ts import { mockMakeGuid } from '../src/guids.js'; -import { makeTestClock } from './helpers/clock.js'; +import { makeTestClock } from './mock-io.js'; import { ertpOnly, withAmountUtils } from './ertp-tools.js'; import { makeErtpEscrow } from '../src/escrow-ertp.js'; diff --git a/packages/ertp-ledgerguise/test/escrow-ertp.test.ts b/packages/ertp-ledgerguise/test/escrow-ertp.test.ts index 64dcc9b..46d2cb0 100644 --- a/packages/ertp-ledgerguise/test/escrow-ertp.test.ts +++ b/packages/ertp-ledgerguise/test/escrow-ertp.test.ts @@ -10,7 +10,7 @@ import { makeErtpEscrow } from '../src/escrow-ertp.js'; import { createIssuerKit, initGnuCashSchema } from '../src/index.js'; import { mockMakeGuid } from '../src/guids.js'; import { wrapBetterSqlite3Database } from '../src/sqlite-shim.js'; -import { makeTestClock } from './helpers/clock.js'; +import { makeTestClock } from './mock-io.js'; import { withAmountUtils } from './ertp-tools.js'; const onlyERTP = >(kit: T): IssuerKit<'nat'> => ({ diff --git a/packages/ertp-ledgerguise/test/helpers/clock.ts b/packages/ertp-ledgerguise/test/helpers/clock.ts deleted file mode 100644 index 8623844..0000000 --- a/packages/ertp-ledgerguise/test/helpers/clock.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const makeTestClock = ( - startMs = Date.UTC(2020, 0, 1, 9, 15), - stepDays = 3, -) => { - const stepMs = stepDays * 24 * 60 * 60 * 1000; - return (() => { - let now = startMs; - return () => { - const current = now; - now += stepMs; - return current; - }; - })(); -}; diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index 26fda0f..fb20646 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -15,7 +15,7 @@ import { wrapBetterSqlite3Database, } from '../src/index.js'; import { mockMakeGuid } from '../src/guids.js'; -import { makeTestClock } from './helpers/clock.js'; +import { makeTestClock } from './mock-io.js'; const nodeRequire = createRequire(import.meta.url); const asset = (spec: string) => readFile(nodeRequire.resolve(spec), 'utf8'); diff --git a/packages/ertp-ledgerguise/test/mock-io.ts b/packages/ertp-ledgerguise/test/mock-io.ts new file mode 100644 index 0000000..51f5749 --- /dev/null +++ b/packages/ertp-ledgerguise/test/mock-io.ts @@ -0,0 +1,51 @@ +/** + * @file Mock IO for deterministic testing. + * + * Provides mock versions of IO capabilities (clock, GUID generation, database) + * for tests that need deterministic behavior. + */ + +import Database from 'better-sqlite3'; +import { initGnuCashSchema, wrapBetterSqlite3Database } from '../src/index.js'; +import type { Guid } from '../src/types.js'; + +const asGuid = (value: string): Guid => value as Guid; + +/** + * Create a deterministic clock that advances by a fixed step on each call. + */ +export const makeTestClock = ( + startMs = Date.UTC(2020, 0, 1, 9, 15), + stepDays = 3, +) => { + const stepMs = stepDays * 24 * 60 * 60 * 1000; + let now = startMs; + return () => { + const current = now; + now += stepMs; + return current; + }; +}; + +/** + * Create a deterministic GUID generator that produces sequential hex strings. + */ +export const mockMakeGuid = (start: bigint = 0n): (() => Guid) => { + let counter = start; + return () => { + const guid = counter; + counter += 1n; + return asGuid(guid.toString(16).padStart(32, '0')); + }; +}; + +/** + * Create an in-memory GnuCash database for testing. + * Returns the wrapped db and a close function for teardown. + */ +export const makeTestDb = () => { + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + initGnuCashSchema(db); + return { db, close: () => rawDb.close() }; +}; From fb84fec3cd71e8acb6fcf5bf51cf863a7de15caf Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 28 Jan 2026 18:12:52 -0600 Subject: [PATCH 51/77] feat(ertp-ledgerguise): placePurse takes sealed token (POLA) Chart placement now accepts sealed tokens instead of raw purses, preventing authority leakage. The bookkeeper who places accounts doesn't need withdrawal capability. API changes: - ChartFacet.placePurse({ sealedPurse, ... }) replaces ({ purse, ... }) - makeChartFacet takes getGuidFromSealed instead of getPurseGuid - IssuerKitWithPurseGuids adds sealer and purses.getGuidFromSealed Co-Authored-By: Claude Opus 4.5 --- .../docs-dev/escrow-accounting.md | 2 +- .../ertp-ledgerguise/docs-dev/integration.md | 12 ++++++++- packages/ertp-ledgerguise/src/chart.ts | 10 ++++---- packages/ertp-ledgerguise/src/index.ts | 4 +-- packages/ertp-ledgerguise/src/types.ts | 4 ++- .../ertp-ledgerguise/test/community.test.ts | 25 +++++++++++-------- 6 files changed, 36 insertions(+), 21 deletions(-) diff --git a/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md b/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md index 4a3ecd0..a41c987 100644 --- a/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md +++ b/packages/ertp-ledgerguise/docs-dev/escrow-accounting.md @@ -151,7 +151,7 @@ The `account_guid` is safe to expose: it identifies but does not authorize. - Funding uses `Promise` to model async timing - The `reconcile_state` column tracks hold status: `'n'` = pending, `'c'` = cleared -- Escrow purses are created via `issuer.makeEmptyPurse()` and optionally named via `chartFacet.placePurse()` +- Escrow purses are created via `issuer.makeEmptyPurse()` and optionally named via `chartFacet.placePurse({ sealedPurse, ... })` ## See Also diff --git a/packages/ertp-ledgerguise/docs-dev/integration.md b/packages/ertp-ledgerguise/docs-dev/integration.md index 5d0dc04..64da535 100644 --- a/packages/ertp-ledgerguise/docs-dev/integration.md +++ b/packages/ertp-ledgerguise/docs-dev/integration.md @@ -9,13 +9,23 @@ GnuCash accounts have a `code` field designed for cross-system integration. Use ### Setting Account Codes ```js +// Using sealed token (POLA: no withdrawal authority leaked) chart.placePurse({ - purse, + sealedPurse: sealer.seal(purse), name: 'Checking', parentGuid: bankGuid, accountType: 'BANK', code: '1110', // Stable identifier for external systems }); + +// Or using GUID directly (if you already know the account GUID) +chart.placeAccount({ + accountGuid, + name: 'Checking', + parentGuid: bankGuid, + accountType: 'BANK', + code: '1110', +}); ``` ### Typical Numbering Conventions diff --git a/packages/ertp-ledgerguise/src/chart.ts b/packages/ertp-ledgerguise/src/chart.ts index 68d0525..a0249a8 100644 --- a/packages/ertp-ledgerguise/src/chart.ts +++ b/packages/ertp-ledgerguise/src/chart.ts @@ -14,12 +14,12 @@ import { requireAccountCommodity } from './db-helpers.js'; export const makeChartFacet = ({ db, commodityGuid, - getPurseGuid, + getGuidFromSealed, zone = defaultZone, }: { db: SqlDatabase; commodityGuid: Guid; - getPurseGuid: (purse: unknown) => Guid; + getGuidFromSealed: (sealedPurse: unknown) => Guid; zone?: Zone; }): ChartFacet => { const { exo } = zone; @@ -57,21 +57,21 @@ export const makeChartFacet = ({ return exo('ChartFacet', { placePurse: ({ - purse, + sealedPurse, name, parentGuid = null, accountType = 'ASSET', placeholder = false, code = null, }: { - purse: unknown; + sealedPurse: unknown; name: string; parentGuid?: Guid | null; accountType?: string; placeholder?: boolean; code?: string | null; }) => { - const purseGuid = getPurseGuid(purse); + const purseGuid = getGuidFromSealed(sealedPurse); updateAccount({ accountGuid: purseGuid, name, diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 846071d..bfe9ceb 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -339,7 +339,7 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG // TODO: consider validation of DB capability and schema. const commodityGuid = makeGuid(); createCommodityRow({ db, guid: commodityGuid, commodity }); - const { sealer, unsealer } = makeSealerUnsealerPair(); + const { sealer, unsealer } = makeSealerUnsealerPair(); const { kit, purseGuids, payments, mintInfo } = makeIssuerKitForCommodity({ db, commodityGuid, @@ -355,7 +355,7 @@ export const createIssuerKit = (config: CreateIssuerConfig): IssuerKitWithPurseG return guid; }, getGuidFromSealed: (sealedPurse: unknown) => { - const purse = unsealer.unseal(sealedPurse); + const purse = unsealer.unseal(sealedPurse) as AccountPurse; const guid = purseGuids.get(purse); if (!guid) throw new Error('unknown sealed purse'); return guid; diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index 066c423..aa650cb 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -67,7 +67,9 @@ export type IssuerKitWithGuid = NatIssuerKit & { commodityGuid: Guid }; export type IssuerKitWithPurseGuids = IssuerKitWithGuid & { purses: { getGuid: (purse: unknown) => Guid; + getGuidFromSealed: (sealedPurse: unknown) => Guid; }; + sealer: { seal: (purse: unknown) => unknown }; payments: PaymentAccess; mintInfo: MintInfoAccess; }; @@ -86,7 +88,7 @@ export type MintInfoAccess = { export type ChartFacet = { placePurse: (args: { - purse: unknown; + sealedPurse: unknown; name: string; parentGuid?: Guid | null; accountType?: string; diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts index c72593d..3529a1d 100644 --- a/packages/ertp-ledgerguise/test/community.test.ts +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -23,7 +23,7 @@ import { wrapBetterSqlite3Database, } from '../src/index.js'; import { makeDeterministicGuid, mockMakeGuid } from '../src/guids.js'; -import { makeTestClock } from './helpers/clock.js'; +import { makeTestClock } from './mock-io.js'; type PurseLike = ReturnType['issuer']['makeEmptyPurse']>; @@ -103,8 +103,9 @@ serial.before(t => { const chart = makeChartFacet({ db, commodityGuid: kit.commodityGuid, - getPurseGuid: kit.purses.getGuid, + getGuidFromSealed: kit.purses.getGuidFromSealed, }); + const { sealer } = kit; const escrow = makeEscrow({ db, commodityGuid: kit.commodityGuid, @@ -134,6 +135,7 @@ serial.after(t => { serial('stage 1: create the community root account', t => { const { chart, kit, bucks } = t.context as CommunityContext; + const { sealer } = kit; const rootPurse = kit.issuer.makeEmptyPurse(); const gnucashRoot = t.context.db .prepare<[], { root_account_guid: string }>( @@ -143,7 +145,7 @@ serial('stage 1: create the community root account', t => { t.truthy(gnucashRoot?.root_account_guid); // GnuCash only shows commodity balances under STOCK/MUTUAL-style subtrees. chart.placePurse({ - purse: rootPurse, + sealedPurse: sealer.seal(rootPurse), name: 'Org1', parentGuid: gnucashRoot!.root_account_guid as Guid, accountType: 'STOCK', @@ -155,7 +157,7 @@ serial('stage 1: create the community root account', t => { const mintParentPurse = kit.issuer.makeEmptyPurse(); const commodityLabel = kit.brand.getAllegedName(); chart.placePurse({ - purse: mintParentPurse, + sealedPurse: sealer.seal(mintParentPurse), name: `${commodityLabel} Mint`, parentGuid: gnucashRoot!.root_account_guid as Guid, accountType: 'STOCK', @@ -170,7 +172,7 @@ serial('stage 1: create the community root account', t => { accountType: 'STOCK', }); chart.placePurse({ - purse: kit.mintRecoveryPurse, + sealedPurse: sealer.seal(kit.mintRecoveryPurse), name: `${commodityLabel} Mint Recovery`, parentGuid: mintParentGuid, accountType: 'STOCK', @@ -178,7 +180,7 @@ serial('stage 1: create the community root account', t => { const treasuryPurse = kit.issuer.makeEmptyPurse(); chart.placePurse({ - purse: treasuryPurse, + sealedPurse: sealer.seal(treasuryPurse), name: 'Treasury', parentGuid: rootGuid, accountType: 'STOCK', @@ -189,7 +191,7 @@ serial('stage 1: create the community root account', t => { const workPurse = kit.issuer.makeEmptyPurse(); chart.placePurse({ - purse: workPurse, + sealedPurse: sealer.seal(workPurse), name: 'Work', parentGuid: rootGuid, accountType: 'STOCK', @@ -207,10 +209,11 @@ serial('stage 1: create the community root account', t => { serial('stage 2: add member purses to the chart', t => { const { chart, kit } = t.context as CommunityContext; + const { sealer } = kit; t.truthy(sharedState.rootGuid); const inPurse = kit.issuer.makeEmptyPurse(); chart.placePurse({ - purse: inPurse, + sealedPurse: sealer.seal(inPurse), name: 'In', parentGuid: sharedState.rootGuid, accountType: 'STOCK', @@ -219,7 +222,7 @@ serial('stage 2: add member purses to the chart', t => { sharedState.inParentGuid = inGuid; const outPurse = kit.issuer.makeEmptyPurse(); chart.placePurse({ - purse: outPurse, + sealedPurse: sealer.seal(outPurse), name: 'Out', parentGuid: sharedState.rootGuid, accountType: 'STOCK', @@ -230,7 +233,7 @@ serial('stage 2: add member purses to the chart', t => { for (const name of members) { const inMember = kit.issuer.makeEmptyPurse(); chart.placePurse({ - purse: inMember, + sealedPurse: sealer.seal(inMember), name, parentGuid: inGuid, accountType: 'STOCK', @@ -238,7 +241,7 @@ serial('stage 2: add member purses to the chart', t => { sharedState.inPurses.set(name, inMember); const outMember = kit.issuer.makeEmptyPurse(); chart.placePurse({ - purse: outMember, + sealedPurse: sealer.seal(outMember), name, parentGuid: outGuid, accountType: 'STOCK', From d4d96e600b1eb2e0f3a37e52a147a03e6e7b1d62 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 28 Jan 2026 18:13:19 -0600 Subject: [PATCH 52/77] refactor(ertp-ledgerguise): actor encapsulation in escrow test Apply POLA pattern to the escrow exchange test: - Add makeParty factory: purses are private, only deposit facets and sealed tokens exposed - Add makeEscrowHolder factory for escrow's encapsulated purses - Use object patterns: parties = { alice, bob }, charts = { moola, stock } - DRY kit creation with makeKit(mnemonic) helper - Use makeTestDb() for database setup Parties return sealed tokens for chart placement - they don't need chart authority. Settlement happens through deposit facets. Co-Authored-By: Claude Opus 4.5 --- .../ertp-ledgerguise/test/design-doc.test.ts | 265 +++++++++++------- .../test/snapshots/design-doc.test.ts.md | 5 +- .../test/snapshots/design-doc.test.ts.snap | Bin 2694 -> 2727 bytes 3 files changed, 174 insertions(+), 96 deletions(-) diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index d605c88..26f86b0 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -5,18 +5,10 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import type { TestFn } from 'ava'; -import Database from 'better-sqlite3'; import type { Brand, NatAmount, Payment } from '../src/ertp-types.js'; -import { - createIssuerKit, - initGnuCashSchema, - makeChartFacet, - wrapBetterSqlite3Database, -} from '../src/index.js'; +import { createIssuerKit, makeChartFacet, wrapBetterSqlite3Database } from '../src/index.js'; import type { Guid } from '../src/types.js'; -import { mockMakeGuid } from '../src/guids.js'; -// Note: makeErtpEscrow is used elsewhere; this test manually simulates escrow steps -import { makeTestClock } from './helpers/clock.js'; +import { makeTestClock, mockMakeGuid, makeTestDb } from './mock-io.js'; const toRowStrings = ( rows: Record[], @@ -51,9 +43,7 @@ let closeDb: (() => void) | undefined; const withDesignContext = (t: ExecutionContext) => { const { freeze } = Object; - const rawDb = new Database(':memory:'); - const db = wrapBetterSqlite3Database(rawDb); - initGnuCashSchema(db); + const { db, close } = makeTestDb(); const makeGuid = mockMakeGuid(); const nowMs = makeTestClock(Date.UTC(2026, 0, 24, 0, 0), 1); @@ -66,7 +56,7 @@ const withDesignContext = (t: ExecutionContext) => { const payment = kit.mint.mintPayment(bucks(5n)); purse.deposit(payment); - closeDb = () => rawDb.close(); + closeDb = close; t.context = { db, kit, purse }; }; @@ -224,10 +214,10 @@ serial('Giving names in the chart of accounts', t => { const chart = makeChartFacet({ db, commodityGuid: kit.commodityGuid, - getPurseGuid: kit.purses.getGuid, + getGuidFromSealed: kit.purses.getGuidFromSealed, }); chart.placePurse({ - purse, + sealedPurse: kit.sealer.seal(purse), name: 'Alice', parentGuid: root?.root_account_guid as Guid, accountType: 'STOCK', @@ -270,19 +260,19 @@ serial('Giving names in the chart of accounts', t => { 'makeIssuerKit("BUCKS") was a simplification.', 'The actual setup wires a chart facet so we can name accounts:', ' const kit = createIssuerKit({ db, ... });', - ' const chart = makeChartFacet({ db, getPurseGuid: kit.purses.getGuid, ... });', - ' chart.placePurse({ purse, name: "Alice", parentGuid: rootGuid, accountType: "STOCK" });', + ' const chart = makeChartFacet({ db, getGuidFromSealed: kit.purses.getGuidFromSealed, ... });', + ' chart.placePurse({ sealedPurse: kit.sealer.seal(purse), name: "Alice", ... });', '', 'Placing the purse under a parent account gives it a human name and a path (e.g., Org1:Alice).', + 'The sealed token identifies the purse without leaking withdrawal authority.', ].join('\n'), ); }); serial('Building account hierarchies with placeholder parents', t => { const { freeze } = Object; - const rawDb = new Database(':memory:'); - const db = wrapBetterSqlite3Database(rawDb); - initGnuCashSchema(db); + const { db, close } = makeTestDb(); + t.teardown(close); const makeGuid = mockMakeGuid(); const now = makeTestClock(Date.UTC(2026, 0, 25, 0, 0), 1); @@ -299,8 +289,9 @@ serial('Building account hierarchies with placeholder parents', t => { const chart = makeChartFacet({ db, commodityGuid: moolaKit.commodityGuid, - getPurseGuid: moolaKit.purses.getGuid, + getGuidFromSealed: moolaKit.purses.getGuidFromSealed, }); + const { sealer } = moolaKit; const root = db .prepare<[], { root_account_guid: string }>( @@ -317,19 +308,19 @@ serial('Building account hierarchies with placeholder parents', t => { const expenses = moolaKit.issuer.makeEmptyPurse(); const food = moolaKit.issuer.makeEmptyPurse(); - chart.placePurse({ purse: assets, name: 'Assets', parentGuid: rootGuid, accountType: 'ASSET', placeholder: true, code: '1000' }); + chart.placePurse({ sealedPurse: sealer.seal(assets), name: 'Assets', parentGuid: rootGuid, accountType: 'ASSET', placeholder: true, code: '1000' }); const assetsGuid = moolaKit.purses.getGuid(assets); - chart.placePurse({ purse: bank, name: 'Bank', parentGuid: assetsGuid, accountType: 'BANK', placeholder: true, code: '1100' }); + chart.placePurse({ sealedPurse: sealer.seal(bank), name: 'Bank', parentGuid: assetsGuid, accountType: 'BANK', placeholder: true, code: '1100' }); const bankGuid = moolaKit.purses.getGuid(bank); - chart.placePurse({ purse: checking, name: 'Checking', parentGuid: bankGuid, accountType: 'BANK', code: '1110' }); - chart.placePurse({ purse: savings, name: 'Savings', parentGuid: bankGuid, accountType: 'BANK', code: '1120' }); + chart.placePurse({ sealedPurse: sealer.seal(checking), name: 'Checking', parentGuid: bankGuid, accountType: 'BANK', code: '1110' }); + chart.placePurse({ sealedPurse: sealer.seal(savings), name: 'Savings', parentGuid: bankGuid, accountType: 'BANK', code: '1120' }); - chart.placePurse({ purse: expenses, name: 'Expenses', parentGuid: rootGuid, accountType: 'EXPENSE', placeholder: true, code: '6000' }); + chart.placePurse({ sealedPurse: sealer.seal(expenses), name: 'Expenses', parentGuid: rootGuid, accountType: 'EXPENSE', placeholder: true, code: '6000' }); const expensesGuid = moolaKit.purses.getGuid(expenses); - chart.placePurse({ purse: food, name: 'Food', parentGuid: expensesGuid, accountType: 'EXPENSE', code: '6100' }); + chart.placePurse({ sealedPurse: sealer.seal(food), name: 'Food', parentGuid: expensesGuid, accountType: 'EXPENSE', code: '6100' }); // Query showing how guid/parent_guid form the tree, with codes for cross-system integration const accounts = db @@ -368,8 +359,6 @@ serial('Building account hierarchies with placeholder parents', t => { ' 6100 Food', ].join('\n'), ); - - rawDb.close(); }); serial('Withdraw creates a hold', t => { @@ -547,46 +536,120 @@ const splitColumns = [ 'reconcile_state', ]; +/** + * Factory for a party (Alice or Bob) with encapsulated purses. + * Follows POLA: purses are private, only deposit facets and sealed tokens exposed. + * Returns sealed tokens for chart placement - party doesn't need chart authority. + */ +const makeParty = ({ + name, + moolaIssuer, + stockIssuer, + moolaSealer, + stockSealer, +}: { + name: string; + moolaIssuer: ReturnType['issuer']; + stockIssuer: ReturnType['issuer']; + moolaSealer: ReturnType['sealer']; + stockSealer: ReturnType['sealer']; +}) => { + const { freeze } = Object; + // Private purses - not leaked to test scope + const moola = moolaIssuer.makeEmptyPurse(); + const stock = stockIssuer.makeEmptyPurse(); + + return freeze({ + name, + // Sealed tokens for chart placement (no withdrawal authority) + sealedMoola: moolaSealer.seal(moola), + sealedStock: stockSealer.seal(stock), + // Deposit facets for receiving funds (safe to share) + moolaDeposit: moola.getDepositFacet(), + stockDeposit: stock.getDepositFacet(), + // Funding escrow: party withdraws internally, returns payment + fundMoola: (amount: NatAmount) => moola.withdraw(amount), + fundStock: (amount: NatAmount) => stock.withdraw(amount), + // Inspection (safe to share) + getBalances: () => ({ + moola: moola.getCurrentAmount(), + stock: stock.getCurrentAmount(), + }), + }); +}; + +/** + * Factory for escrow holder with encapsulated purses. + * Escrow owns its purses; parties interact via deposit facets. + * Returns sealed tokens for chart placement. + */ +const makeEscrowHolder = ({ + moolaIssuer, + stockIssuer, + moolaSealer, + stockSealer, +}: { + moolaIssuer: ReturnType['issuer']; + stockIssuer: ReturnType['issuer']; + moolaSealer: ReturnType['sealer']; + stockSealer: ReturnType['sealer']; +}) => { + const { freeze } = Object; + const moola = moolaIssuer.makeEmptyPurse(); + const stock = stockIssuer.makeEmptyPurse(); + + return freeze({ + // Sealed tokens for chart placement + sealedMoola: moolaSealer.seal(moola), + sealedStock: stockSealer.seal(stock), + // Deposit facets for parties to fund escrow + moolaDeposit: moola.getDepositFacet(), + stockDeposit: stock.getDepositFacet(), + // Settlement: escrow withdraws and pays out + settleTo: (alice: ReturnType, bob: ReturnType, amounts: { stock: NatAmount; moola: NatAmount }) => { + const stockPayment = stock.withdraw(amounts.stock); + const moolaPayment = moola.withdraw(amounts.moola); + alice.stockDeposit.receive(stockPayment); + bob.moolaDeposit.receive(moolaPayment); + }, + }); +}; + serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { const { freeze } = Object; - const rawDb = new Database(':memory:'); - const db = wrapBetterSqlite3Database(rawDb); - initGnuCashSchema(db); + const { db, close } = makeTestDb(); + t.teardown(close); const makeGuid = mockMakeGuid(); const now = makeTestClock(Date.UTC(2026, 0, 25, 0, 0), 1); - const moolaKit = createIssuerKit( - freeze({ + const makeKit = (mnemonic: string) => + createIssuerKit(freeze({ db, - commodity: freeze({ namespace: 'COMMODITY', mnemonic: 'Moola' }), + commodity: freeze({ namespace: 'COMMODITY', mnemonic }), makeGuid, nowMs: now, + })); + + const moola = makeKit('Moola'); + const stock = makeKit('Stock'); + + const moolaAmt = (v: bigint) => freeze({ brand: moola.brand, value: v }); + const stockAmt = (v: bigint) => freeze({ brand: stock.brand, value: v }); + + // Chart facets for naming accounts + const charts = { + moola: makeChartFacet({ + db, + commodityGuid: moola.commodityGuid, + getGuidFromSealed: moola.purses.getGuidFromSealed, }), - ); - const stockKit = createIssuerKit( - freeze({ + stock: makeChartFacet({ db, - commodity: freeze({ namespace: 'COMMODITY', mnemonic: 'Stock' }), - makeGuid, - nowMs: now, + commodityGuid: stock.commodityGuid, + getGuidFromSealed: stock.purses.getGuidFromSealed, }), - ); - - const moola = (v: bigint) => freeze({ brand: moolaKit.brand, value: v }); - const stock = (v: bigint) => freeze({ brand: stockKit.brand, value: v }); - - // Create purses for Alice and Bob with human-readable names - const chart = makeChartFacet({ - db, - commodityGuid: moolaKit.commodityGuid, - getPurseGuid: moolaKit.purses.getGuid, - }); - const stockChart = makeChartFacet({ - db, - commodityGuid: stockKit.commodityGuid, - getPurseGuid: stockKit.purses.getGuid, - }); + }; const root = db .prepare<[], { root_account_guid: string }>( 'SELECT root_account_guid FROM books LIMIT 1', @@ -595,45 +658,64 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { const rootGuid = root?.root_account_guid as Guid; // Create placeholder parent accounts for hierarchy - const alicePlaceholder = moolaKit.issuer.makeEmptyPurse(); - const bobPlaceholder = moolaKit.issuer.makeEmptyPurse(); - const escrowPlaceholder = moolaKit.issuer.makeEmptyPurse(); - - chart.placePurse({ purse: alicePlaceholder, name: 'Alice', parentGuid: rootGuid, accountType: 'ASSET', placeholder: true }); - chart.placePurse({ purse: bobPlaceholder, name: 'Bob', parentGuid: rootGuid, accountType: 'ASSET', placeholder: true }); - chart.placePurse({ purse: escrowPlaceholder, name: 'Escrow', parentGuid: rootGuid, accountType: 'ASSET', placeholder: true }); + const placeholders = { + alice: moola.issuer.makeEmptyPurse(), + bob: moola.issuer.makeEmptyPurse(), + escrow: moola.issuer.makeEmptyPurse(), + }; - const aliceGuid = moolaKit.purses.getGuid(alicePlaceholder); - const bobGuid = moolaKit.purses.getGuid(bobPlaceholder); - const escrowGuid = moolaKit.purses.getGuid(escrowPlaceholder); + for (const [name, purse] of Object.entries(placeholders)) { + charts.moola.placePurse({ + sealedPurse: moola.sealer.seal(purse), + name: name.charAt(0).toUpperCase() + name.slice(1), + parentGuid: rootGuid, + accountType: 'ASSET', + placeholder: true, + }); + } + + const parentGuids = { + alice: moola.purses.getGuid(placeholders.alice), + bob: moola.purses.getGuid(placeholders.bob), + escrow: moola.purses.getGuid(placeholders.escrow), + }; - // Create leaf purses under the hierarchy - const aliceMoola = moolaKit.issuer.makeEmptyPurse(); - const bobMoola = moolaKit.issuer.makeEmptyPurse(); - const aliceStock = stockKit.issuer.makeEmptyPurse(); - const bobStock = stockKit.issuer.makeEmptyPurse(); + // Create encapsulated actors - purses are private to each + const partyConfig = { + moolaIssuer: moola.issuer, + stockIssuer: stock.issuer, + moolaSealer: moola.sealer, + stockSealer: stock.sealer, + }; + const parties = { + alice: makeParty({ name: 'Alice', ...partyConfig }), + bob: makeParty({ name: 'Bob', ...partyConfig }), + }; - chart.placePurse({ purse: aliceMoola, name: 'Moola', parentGuid: aliceGuid, accountType: 'ASSET' }); - chart.placePurse({ purse: bobMoola, name: 'Moola', parentGuid: bobGuid, accountType: 'ASSET' }); - stockChart.placePurse({ purse: aliceStock, name: 'Stock', parentGuid: aliceGuid, accountType: 'STOCK' }); - stockChart.placePurse({ purse: bobStock, name: 'Stock', parentGuid: bobGuid, accountType: 'STOCK' }); + // Place party purses in chart (parties return sealed tokens, don't need chart authority) + for (const [name, party] of Object.entries(parties)) { + const parentGuid = parentGuids[name as keyof typeof parentGuids]; + charts.moola.placePurse({ sealedPurse: party.sealedMoola, name: 'Moola', parentGuid, accountType: 'ASSET' }); + charts.stock.placePurse({ sealedPurse: party.sealedStock, name: 'Stock', parentGuid, accountType: 'STOCK' }); + } // Track splits incrementally - only show new splits at each state const tracker = makeSplitTracker(db); tracker.getNewSplits(); // Clear any setup splits // === SETUP: Parties have assets in their purses === - aliceMoola.deposit(moolaKit.mint.mintPayment(moola(10n))); - bobStock.deposit(stockKit.mint.mintPayment(stock(1n))); + parties.alice.moolaDeposit.receive(moola.mint.mintPayment(moolaAmt(10n))); + parties.bob.stockDeposit.receive(stock.mint.mintPayment(stockAmt(1n))); tracker.getNewSplits(); // Clear setup splits // === AMIX STATE: Agreement === // Escrow is created. Parties will provide Promise, not immediate payments. // This models async funding: Alice may fund before Bob, or vice versa. - const escrowMoola = moolaKit.issuer.makeEmptyPurse(); - const escrowStock = stockKit.issuer.makeEmptyPurse(); - chart.placePurse({ purse: escrowMoola, name: 'Moola', parentGuid: escrowGuid, accountType: 'ASSET' }); - stockChart.placePurse({ purse: escrowStock, name: 'Stock', parentGuid: escrowGuid, accountType: 'STOCK' }); + const escrow = makeEscrowHolder(partyConfig); + + // Place escrow purses in chart + charts.moola.placePurse({ sealedPurse: escrow.sealedMoola, name: 'Moola', parentGuid: parentGuids.escrow, accountType: 'ASSET' }); + charts.stock.placePurse({ sealedPurse: escrow.sealedStock, name: 'Stock', parentGuid: parentGuids.escrow, accountType: 'STOCK' }); // Deferred resolvers - these simulate async funding decisions let resolveAliceFunding!: (payment: Payment<'nat'>) => void; @@ -643,8 +725,8 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { // Escrow starts waiting for both deposits (via promises) const escrowDepositPs = { - moola: aliceFundingP.then(p => escrowMoola.deposit(p)), - stock: bobFundingP.then(p => escrowStock.deposit(p)), + moola: aliceFundingP.then(p => escrow.moolaDeposit.receive(p)), + stock: bobFundingP.then(p => escrow.stockDeposit.receive(p)), }; t.snapshot( @@ -661,7 +743,7 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { ); // === AMIX STATE: Alice funds (first mover) === - const alicePayment = aliceMoola.withdraw(moola(10n)); + const alicePayment = parties.alice.fundMoola(moolaAmt(10n)); resolveAliceFunding(alicePayment); await escrowDepositPs.moola; // Wait for Alice's deposit to complete @@ -676,7 +758,7 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { ); // === AMIX STATE: Bob funds (second mover) === - const bobPayment = bobStock.withdraw(stock(1n)); + const bobPayment = parties.bob.fundStock(stockAmt(1n)); resolveBobFunding(bobPayment); await escrowDepositPs.stock; // Wait for Bob's deposit to complete @@ -691,12 +773,9 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { ); // === AMIX STATE: Settlement === - // In real escrow2013, this happens automatically via Promise.all resolution. + // In real escrow, this happens automatically via Promise.all resolution. // Here we manually perform the settlement to show the ledger changes. - const stockForAlice = escrowStock.withdraw(stock(1n)); - const moolaForBob = escrowMoola.withdraw(moola(10n)); - aliceStock.deposit(stockForAlice); - bobMoola.deposit(moolaForBob); + escrow.settleTo(parties.alice, parties.bob, { stock: stockAmt(1n), moola: moolaAmt(10n) }); t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), @@ -707,8 +786,6 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { 'Four new splits: escrow withdraws create holds, deposits finalize them.', ].join('\n'), ); - - rawDb.close(); }); test.todo('Multi-commodity swaps: show ledger rows for two brands'); diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md index c822a44..da5adaf 100644 --- a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md @@ -50,10 +50,11 @@ Generated by [AVA](https://avajs.dev). > makeIssuerKit("BUCKS") was a simplification. > The actual setup wires a chart facet so we can name accounts: > const kit = createIssuerKit({ db, ... }); -> const chart = makeChartFacet({ db, getPurseGuid: kit.purses.getGuid, ... }); -> chart.placePurse({ purse, name: "Alice", parentGuid: rootGuid, accountType: "STOCK" }); +> const chart = makeChartFacet({ db, getGuidFromSealed: kit.purses.getGuidFromSealed, ... }); +> chart.placePurse({ sealedPurse: kit.sealer.seal(purse), name: "Alice", ... }); > > Placing the purse under a parent account gives it a human name and a path (e.g., Org1:Alice). +> The sealed token identifies the purse without leaking withdrawal authority. [ 'guid | name | parent_guid | account_type | placeholder', diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap index cb2ba32784e6e91c1b0c64b8095793740dc1cba0..ffb40c97df9c8b91598d1045ef336620adc96c2c 100644 GIT binary patch literal 2727 zcmV;Y3Rv|)RzVr>AWt7h3nOp zT{vsn93P7a00000000BkSzBu)#}%%Tc5SCgFvfwr7V2r+ri#i#l* zt)5w3SO}zH+3D`;b57Oy&UY^QY|xiFI<}vDj!rmoaB@!;- z&Mt^#%p=zlR`IbNX=i`&c^q@c-}`!%JE(8!PO)jaAmT{#@gYVJc!Mt{FtBF{q;HL;rjRDoyT9Dy5g2NQ&dD{`sC1eF8fyd8QBdH@`XeUX33)G!F%MX-(=2NU5)3W80zlxQ7z zRXm~%ERXu)Z}t`O3Lgz&WqyASqWKRkmoH^KyjavC^{Q$q@mM#4g5kdq{>kPb=N zTnl~cCK~Km3TM|K(I<53CtRio1EUkK*sB|98PmJ`C^IeeHq(<~`2EI56%b$BV2t$` zW1lg`zSXz@$g6cAzf%LUJAF8RGAj%zVC`*wNZ>Ah$EY;j8H}`wgv5u|afb_#ey0NI z7d?c}AiQ$hff;O8Eb5$resne#3Oy^!^lU8Z!CMs95tc+=hf7<7@u*b>W&fJlt=zw#&tt zjNADqAuZoe#%_8*&zr67AUGOnzd-^!#ZelKK)VqdaJ(;lXz5OQ!si0O>aZX@1Te&e>Aj_6ExEoYG-7_U>(jHHWywpotHh(#-E?UNxrkD6miPSn>$z@X#y-=m)hBY@dI1YH4W(JBNq+N0l5^51!LM`$Hs8 zTHpq2XE{m}uGR-UBFEB3Z5ZsRDa8u0e+C3{rq{}RK;-v1MjIXMY;|t-`!LJ% zurK=F&Uv6-8C^#HYAL^#3M%qn&FSST@{0uVkL7&oamc|^5hDg7;zX8IH+bSqxde+Y z9m7Nzv?Uw|#6nX7!JcVc*_hsJ+G#foqJ{;I89}) zh*3E)5R|P-jZ{2RdX~tK$rieg4WDocJar>&gqxOezqy-=v&Gv;py4JOkx*ZUR>CRY z#S$J^i7Pzt%pJzqj~HXWW{mxnG1hJ{_Hl!;uNsVfZ{-3`c)HFB+x4zR$5^F?1wJ^B z0Jduc&}sXgWXD=`c3JShe@?Vlg;AZ>>3CtgTpbs&c2?UGVXMo8z37E?NZ8&8Bk#wB zst^{1U0Wt>!wc(@utQEPZ{bqHt}hd|2{X8vo!S2B7?nkPsWW?OnXsEAEIYHiTE~lL zwz<41#EgM5M#<_ms*w`nAZHMLMdZ=o>&Xf_A}!NIQIgK#PGGXoBp9rD|E&SKC~N^L zFE%pT+I2g%E^D7~XmS=jsKiBSOY{8}42@355RHV44XSMl#CZz!l`{0X+io!ShX!Mt7o~;kb%-2aX$DZ-Rtm}|84MiP z$a(>67gd>0GA*bozj#`(q(r>J2w@>jRh8ddWb4Z)?>=_tYPs@j%am^|D!!p1gQFD){(TJ-d_JG@|ieQjt zpEq~jeC@q;>!#9=1sy`dqmfWpnGgRmXWpMx!fR!XG1k3^aU1n;x?RLi87o%_kb?T& z%QrR9QWm5``#8G;XznCv1T_b*DN5WvrNVxG5^KDERo4E&dgj#1k3n1I_J>Uvey?=|L*skuc z5nGXrVa}#yUS5HLW0fQ*=-^pZQQDR7QKA z^ZY0ty***@s&AD%HflwaAI_*UQ5tmI45`qgWIY#pbA;~q4xNsUbAs+%(u?Q9V`C1FOm2vU4v$^kFTi1GYjJ@NdQr!Q zuoq#2Ry+wd&d?E&3C6IVzs=??dO~vo<(Ce=^42XfXD>izamo<=6iN z9$O`Q1Nu)npyxTVOn-c8 z{oiz)2Jc2RIl{u613eJ4qiRm5ZLlMR30Dr|*0v83zald&TQOe{26uI8e5a8WQoRDN h^YF<><(}@==8-cHic9fR|M#OL{4XvPaidTl0009BDSiL| literal 2694 zcmV;13VHQGRzVg~lnY!_eeZ5G zC)NT8?jMT?00000000BkSzBu)#}%%Tc5SCgFvfwr1Ih;m4VXj!{BCv(V=TV@Q=o zP!g=>v7l-51Y(u-6I@4W^|XQ*2K#Rx9XLZUNbpqj6NLQ)Bde7Z5xgyiBWuX6Rgp^O z!^^=aRW=-f9dQd2gosOWX@V(A3&Og2s4=Jka46PA{-vpgLGUhuv0Pi22ummkCgn+j z#)31&BU*rm*TSL!tK7H(qz5VSYZG=K?7eu9wcYZ5#EA%$ElXLj}#zz$rU)x}e z^%!HHF~+{txPZv3bt1o0BeFexIDaxLCQ{Ja&G{jbyZ9ZWRCK2?QZf<=J~WnFT%hzj z6-vM8D13(DmD>)?V6!r#&Kc@QXJetTv$D+2#-bg(weeycVYl1eqPOdtm$Xv^(LWBI z6Tyts#5pGSVyaHC=N#`SB2KX8y3(UW1{x=E$lW-VS)%ddC=dq0o{|<%Z4df5pcr&C z^<11F@I)hzr=ET>2xBtT&QNZeT%%*t3jiV|jfF?Wn2+H$r2H6PbGNSx+q~iEeq(LB z9Gqj^_Me0_d_NuA=>a`&u5Aaw(MY)k64@z^vSILh5f~74G(xA4a z5s^w$6$?8BttQZPb69gLC}PTO4K3sZ_4I|>9+@y$hqDu#gO^I@um?)J{gXKHD{Cg) zq6W!RjNwFZ*c)+e@A3%kT395T?-v4PaLhFcxQkoKQz3`*B=hqkK)wc9|;-9!M(^q9A!aw_DPx<*1TiJVZ^-kCfIJS(g*l zn17TZWeqoRQ&Q!J_ryuL1Q60;HioUnK4%927%iyn;__b6}!GG1u%T@4;1o6A&dg^${!B7z+1|s4lmQ*)5;mmjf z25mNmiO^_DIu1yMz^I}Gay~35G}rTEVc~XNUYm~~?zbQeL-@EN=Q(gL`*Wr9gNJCH zdfv-K+#}e~X`~5@? z-f+mlL6U30Ja=X?riA8^NW2i7I9Lr$7(;8I}Mmw|1<3~uIowtqTCY0zA1 z&z@Qac9X#JJ-e$^ytrqZ%Ud|i^&*e|yt<-_CMCtN8qw7+jt#E*tFR+dNtQ}Vsh;jc zCId~PLCg8C1!$vi4NyARNGoI3&D7Yu*}y~E)@c7e$h3IbAi0BZ)ZuO(hGdBf2gL20-Qb%O!J#H@Nec!7%^>vlF<3^=r zZc*LDc<@kI#sP6Z^#%DF5NyJm9O2eL$p~T^@g+Xw5v~#py z`9ART&Fg!>Q(^MHmKt-UW0Vkf6;;7pTPlg2Fdk@?3WF~n@F{`35(dQ-Mtn?(HFxDm zE2%P*Okv$~G38U|-{J^sSM^(@mM8S`1hwH|a9;lw z?=4r%Cl|+il`t&hu=l1?33n0LX+I_cFA}~waPB;hOtt(aMa_ryR|OlKZ^(rPnggMY zbqASxEy&+Yd^$J&goYZSGTMF4a|h?><`V|5x>m_?qgFJzqZC;tN{yE5Ar*R*tmgop zl~Uz3fuW_jRc?c^B1vGvg{vDVi|?xb|1CXSj!^yHp;ghb7wFC2~#yAW|B z@~Pz`<^#guuFACQH1a~KSMYTnKK@|a$z5w6IRhbiB7W-r+mnX>1;i#sLH-^905A?f A?*IS* From 94bb59a95e1eaf2690a678a459e3d5151ed0f93a Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 28 Jan 2026 18:18:38 -0600 Subject: [PATCH 53/77] fixup! refactor(ertp-ledgerguise): actor encapsulation in escrow test simplify verbose ReturnType patterns --- .../ertp-ledgerguise/test/community.test.ts | 14 +++++------ .../ertp-ledgerguise/test/design-doc.test.ts | 24 +++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts index 3529a1d..f497b44 100644 --- a/packages/ertp-ledgerguise/test/community.test.ts +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -13,7 +13,7 @@ import test from 'ava'; import type { TestFn } from 'ava'; import Database from 'better-sqlite3'; import type { SqlDatabase } from '../src/sql-db.js'; -import type { Brand, NatAmount } from '../src/ertp-types.js'; +import type { Brand, NatAmount, Purse } from '../src/ertp-types.js'; import type { Guid } from '../src/types.js'; import { createIssuerKit, @@ -25,8 +25,6 @@ import { import { makeDeterministicGuid, mockMakeGuid } from '../src/guids.js'; import { makeTestClock } from './mock-io.js'; -type PurseLike = ReturnType['issuer']['makeEmptyPurse']>; - type CommunityContext = { db: SqlDatabase; closeDb: () => void; @@ -38,14 +36,14 @@ type CommunityContext = { }; const sharedState: { - rootPurse?: PurseLike; + rootPurse?: Purse<'nat'>; rootGuid?: Guid; - treasuryPurse?: PurseLike; - workPurse?: PurseLike; + treasuryPurse?: Purse<'nat'>; + workPurse?: Purse<'nat'>; inParentGuid?: Guid; outParentGuid?: Guid; - inPurses: Map; - outPurses: Map; + inPurses: Map>; + outPurses: Map>; } = { inPurses: new Map(), outPurses: new Map(), diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index 26f86b0..39e3169 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -5,11 +5,13 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import type { TestFn } from 'ava'; -import type { Brand, NatAmount, Payment } from '../src/ertp-types.js'; +import type { Brand, Issuer, NatAmount, Payment, Purse } from '../src/ertp-types.js'; import { createIssuerKit, makeChartFacet, wrapBetterSqlite3Database } from '../src/index.js'; import type { Guid } from '../src/types.js'; import { makeTestClock, mockMakeGuid, makeTestDb } from './mock-io.js'; +type SealFn = { seal: (obj: unknown) => unknown }; + const toRowStrings = ( rows: Record[], columns: string[], @@ -34,9 +36,7 @@ const shortGuid = (value: string) => value.slice(-12); type DesignContext = { db: ReturnType; kit: ReturnType; - purse: ReturnType< - ReturnType['issuer']['makeEmptyPurse'] - >; + purse: Purse<'nat'>; }; let closeDb: (() => void) | undefined; @@ -549,10 +549,10 @@ const makeParty = ({ stockSealer, }: { name: string; - moolaIssuer: ReturnType['issuer']; - stockIssuer: ReturnType['issuer']; - moolaSealer: ReturnType['sealer']; - stockSealer: ReturnType['sealer']; + moolaIssuer: Issuer<'nat'>; + stockIssuer: Issuer<'nat'>; + moolaSealer: SealFn; + stockSealer: SealFn; }) => { const { freeze } = Object; // Private purses - not leaked to test scope @@ -589,10 +589,10 @@ const makeEscrowHolder = ({ moolaSealer, stockSealer, }: { - moolaIssuer: ReturnType['issuer']; - stockIssuer: ReturnType['issuer']; - moolaSealer: ReturnType['sealer']; - stockSealer: ReturnType['sealer']; + moolaIssuer: Issuer<'nat'>; + stockIssuer: Issuer<'nat'>; + moolaSealer: SealFn; + stockSealer: SealFn; }) => { const { freeze } = Object; const moola = moolaIssuer.makeEmptyPurse(); From ee7e60541f6e75ffa5deaceda2c2dbf76718c304 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 28 Jan 2026 18:27:00 -0600 Subject: [PATCH 54/77] refactor(ertp-ledgerguise): use template literals for SQL and prose Replace .join(' ') and .join('\n') patterns with template literals for better readability. SQL queries and snapshot prose are now multi-line strings instead of array concatenations. Co-Authored-By: Claude Opus 4.5 --- packages/ertp-ledgerguise/src/chart.ts | 10 +- packages/ertp-ledgerguise/src/db-helpers.ts | 75 +++---- packages/ertp-ledgerguise/src/escrow.ts | 25 +-- packages/ertp-ledgerguise/src/index.ts | 24 +- .../ertp-ledgerguise/test/adversarial.test.ts | 50 ++--- .../ertp-ledgerguise/test/community.test.ts | 40 ++-- .../ertp-ledgerguise/test/design-doc.test.ts | 209 ++++++++---------- .../ertp-ledgerguise/test/ledgerguise.test.ts | 32 ++- 8 files changed, 201 insertions(+), 264 deletions(-) diff --git a/packages/ertp-ledgerguise/src/chart.ts b/packages/ertp-ledgerguise/src/chart.ts index a0249a8..1586dd9 100644 --- a/packages/ertp-ledgerguise/src/chart.ts +++ b/packages/ertp-ledgerguise/src/chart.ts @@ -47,12 +47,10 @@ export const makeChartFacet = ({ throw new Error('parent account not found'); } } - db.prepare( - [ - 'UPDATE accounts SET name = ?, account_type = ?, parent_guid = ?, placeholder = ?, code = ?', - 'WHERE guid = ?', - ].join(' '), - ).run(name, accountType, parentGuid, placeholder ? 1 : 0, code, accountGuid); + db.prepare(` + UPDATE accounts SET name = ?, account_type = ?, parent_guid = ?, placeholder = ?, code = ? + WHERE guid = ? + `).run(name, accountType, parentGuid, placeholder ? 1 : 0, code, accountGuid); }; return exo('ChartFacet', { diff --git a/packages/ertp-ledgerguise/src/db-helpers.ts b/packages/ertp-ledgerguise/src/db-helpers.ts index 4af260b..8c5c3ba 100644 --- a/packages/ertp-ledgerguise/src/db-helpers.ts +++ b/packages/ertp-ledgerguise/src/db-helpers.ts @@ -13,13 +13,11 @@ export const ensureCommodityRow = ( fraction = 1, quoteFlag = 0, } = commodity; - const insert = db.prepare( - [ - 'INSERT OR IGNORE INTO commodities(', - 'guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz', - ') VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL)', - ].join(' '), - ); + const insert = db.prepare(` + INSERT OR IGNORE INTO commodities( + guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz + ) VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL) + `); insert.run(guid, namespace, mnemonic, fullname, fraction, quoteFlag); }; @@ -45,13 +43,11 @@ export const createCommodityRow = ({ fraction = 1, quoteFlag = 0, } = commodity; - const insert = db.prepare( - [ - 'INSERT INTO commodities(', - 'guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz', - ') VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL)', - ].join(' '), - ); + const insert = db.prepare(` + INSERT INTO commodities( + guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz + ) VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL) + `); insert.run(guid, namespace, mnemonic, fullname, fraction, quoteFlag); }; @@ -70,13 +66,12 @@ export const ensureAccountRow = ({ accountType?: string; parentGuid?: Guid | null; }): void => { - db.prepare( - [ - 'INSERT OR IGNORE INTO accounts(', - 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', - ') VALUES (?, ?, ?, ?, ?, ?, ?, NULL, NULL, 0, 0)', - ].join(' '), - ).run(accountGuid, name, accountType, commodityGuid, 1, 0, parentGuid); + db.prepare(` + INSERT OR IGNORE INTO accounts( + guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, + parent_guid, code, description, hidden, placeholder + ) VALUES (?, ?, ?, ?, ?, ?, ?, NULL, NULL, 0, 0) + `).run(accountGuid, name, accountType, commodityGuid, 1, 0, parentGuid); }; export const createAccountRow = ({ @@ -100,13 +95,12 @@ export const createAccountRow = ({ if (row) { throw new Error('account already exists'); } - db.prepare( - [ - 'INSERT INTO accounts(', - 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', - ') VALUES (?, ?, ?, ?, ?, ?, ?, NULL, NULL, 0, 0)', - ].join(' '), - ).run(accountGuid, name, accountType, commodityGuid, 1, 0, parentGuid); + db.prepare(` + INSERT INTO accounts( + guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, + parent_guid, code, description, hidden, placeholder + ) VALUES (?, ?, ?, ?, ?, ?, ?, NULL, NULL, 0, 0) + `).run(accountGuid, name, accountType, commodityGuid, 1, 0, parentGuid); }; export const requireAccountCommodity = ({ @@ -201,14 +195,12 @@ export const makeTransferRecorder = ({ reconcileState = 'n', ) => { const splitGuid = makeGuid(); - db.prepare( - [ - 'INSERT INTO splits(', - 'guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date,', - 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', - ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', - ].join(' '), - ).run( + db.prepare(` + INSERT INTO splits( + guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date, + value_num, value_denom, quantity_num, quantity_denom, lot_guid + ) VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL) + `).run( splitGuid, txGuid, accountGuid, @@ -230,13 +222,10 @@ export const makeTransferRecorder = ({ nowMsValue: number, ) => { const seconds = Math.floor(nowMsValue / 1000); - db.prepare( - [ - 'INSERT INTO transactions(', - 'guid, currency_guid, num, post_date, enter_date, description', - ") VALUES (?, ?, ?, datetime(date(?, 'unixepoch')), datetime(date(?, 'unixepoch')), ?)", - ].join(' '), - ).run( + db.prepare(` + INSERT INTO transactions(guid, currency_guid, num, post_date, enter_date, description) + VALUES (?, ?, ?, datetime(date(?, 'unixepoch')), datetime(date(?, 'unixepoch')), ?) + `).run( txGuid, commodityGuid, checkNumber, diff --git a/packages/ertp-ledgerguise/src/escrow.ts b/packages/ertp-ledgerguise/src/escrow.ts index eed970b..d232e1b 100644 --- a/packages/ertp-ledgerguise/src/escrow.ts +++ b/packages/ertp-ledgerguise/src/escrow.ts @@ -57,14 +57,12 @@ export const makeEscrow = ({ reconcileState = 'n', ) => { const splitGuid = makeGuid(); - db.prepare( - [ - 'INSERT INTO splits(', - 'guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date,', - 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', - ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', - ].join(' '), - ).run( + db.prepare(` + INSERT INTO splits( + guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date, + value_num, value_denom, quantity_num, quantity_denom, lot_guid + ) VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL) + `).run( splitGuid, txGuid, accountGuid, @@ -114,13 +112,10 @@ export const makeEscrow = ({ requireAccountCommodity({ db, accountGuid: rightToAccountGuid, commodityGuid }); const txGuid = makeGuid(); const seconds = Math.floor(nowMs() / 1000); - db.prepare( - [ - 'INSERT INTO transactions(', - 'guid, currency_guid, num, post_date, enter_date, description', - ") VALUES (?, ?, ?, datetime(date(?, 'unixepoch')), datetime(date(?, 'unixepoch')), ?)", - ].join(' '), - ).run(txGuid, commodityGuid, checkNumber, seconds, seconds, description); + db.prepare(` + INSERT INTO transactions(guid, currency_guid, num, post_date, enter_date, description) + VALUES (?, ?, ?, datetime(date(?, 'unixepoch')), datetime(date(?, 'unixepoch')), ?) + `).run(txGuid, commodityGuid, checkNumber, seconds, seconds, description); const leftHoldingSplitGuid = recordSplit(txGuid, holdingAccountGuid, leftAmount, 'n'); const rightHoldingSplitGuid = recordSplit(txGuid, holdingAccountGuid, rightAmount, 'n'); recordSplit(txGuid, leftAccountGuid, -leftAmount, 'n'); diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index bfe9ceb..5629953 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -259,13 +259,11 @@ const makeIssuerKitForCommodity = ({ .prepare< [string, string], { guid: string; account_guid: string; quantity_num: string; reconcile_state: string } - >( - [ - 'SELECT guid, account_guid, quantity_num, reconcile_state', - 'FROM splits', - 'WHERE tx_guid = ? AND account_guid = ?', - ].join(' '), - ) + >(` + SELECT guid, account_guid, quantity_num, reconcile_state + FROM splits + WHERE tx_guid = ? AND account_guid = ? + `) .get(txGuid, balanceAccountGuid); if (!holdingSplit) { throw new Error('payment not live'); @@ -277,13 +275,11 @@ const makeIssuerKitForCommodity = ({ .prepare< [string, string], { account_guid: string } - >( - [ - 'SELECT account_guid', - 'FROM splits', - 'WHERE tx_guid = ? AND account_guid != ?', - ].join(' '), - ) + >(` + SELECT account_guid + FROM splits + WHERE tx_guid = ? AND account_guid != ? + `) .get(txGuid, balanceAccountGuid); if (!sourceSplit) { throw new Error('payment missing source split'); diff --git a/packages/ertp-ledgerguise/test/adversarial.test.ts b/packages/ertp-ledgerguise/test/adversarial.test.ts index a479029..31bbd9c 100644 --- a/packages/ertp-ledgerguise/test/adversarial.test.ts +++ b/packages/ertp-ledgerguise/test/adversarial.test.ts @@ -23,29 +23,23 @@ const seedAccountBalance = ( commodityGuid: string, amount: bigint, ) => { - db.prepare( - [ - 'INSERT INTO accounts(', - 'guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, parent_guid, code, description, hidden, placeholder', - ') VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0)', - ].join(' '), - ).run(accountGuid, 'Victim', 'ASSET', commodityGuid, 1, 0); + db.prepare(` + INSERT INTO accounts( + guid, name, account_type, commodity_guid, commodity_scu, non_std_scu, + parent_guid, code, description, hidden, placeholder + ) VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 0, 0) + `).run(accountGuid, 'Victim', 'ASSET', commodityGuid, 1, 0); const txGuid = asGuid('c'.repeat(32)); - db.prepare( - [ - 'INSERT INTO transactions(', - 'guid, currency_guid, num, post_date, enter_date, description', - ') VALUES (?, ?, ?, ?, ?, ?)', - ].join(' '), - ).run(txGuid, commodityGuid, '', '1970-01-01 00:00:00', '1970-01-01 00:00:00', 'seed'); - db.prepare( - [ - 'INSERT INTO splits(', - 'guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date,', - 'value_num, value_denom, quantity_num, quantity_denom, lot_guid', - ') VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL)', - ].join(' '), - ).run(asGuid('d'.repeat(32)), txGuid, accountGuid, '', '', 'n', amount.toString(), 1, amount.toString(), 1); + db.prepare(` + INSERT INTO transactions(guid, currency_guid, num, post_date, enter_date, description) + VALUES (?, ?, ?, ?, ?, ?) + `).run(txGuid, commodityGuid, '', '1970-01-01 00:00:00', '1970-01-01 00:00:00', 'seed'); + db.prepare(` + INSERT INTO splits( + guid, tx_guid, account_guid, memo, action, reconcile_state, reconcile_date, + value_num, value_denom, quantity_num, quantity_denom, lot_guid + ) VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL) + `).run(asGuid('d'.repeat(32)), txGuid, accountGuid, '', '', 'n', amount.toString(), 1, amount.toString(), 1); }; test('rejects negative withdraw amounts', t => { @@ -105,13 +99,11 @@ test('createIssuerKit rejects commodity GUID collisions', t => { initGnuCashSchema(db); const existingGuid = asGuid('f'.repeat(32)); - db.prepare( - [ - 'INSERT INTO commodities(', - 'guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz', - ') VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL)', - ].join(' '), - ).run(existingGuid, 'COMMODITY', 'BUCKS', 'BUCKS', 1, 0); + db.prepare(` + INSERT INTO commodities( + guid, namespace, mnemonic, fullname, cusip, fraction, quote_flag, quote_source, quote_tz + ) VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, NULL) + `).run(existingGuid, 'COMMODITY', 'BUCKS', 'BUCKS', 1, 0); const makeGuid = () => existingGuid; const commodity = freeze({ diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts index f497b44..8257ce6 100644 --- a/packages/ertp-ledgerguise/test/community.test.ts +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -61,13 +61,11 @@ const getTotalForAccountType = ( ? ` AND accounts.guid NOT IN (${excludeGuids.map(() => '?').join(', ')})` : ''; const row = db - .prepare( - [ - 'SELECT COALESCE(SUM(quantity_num), 0) AS total', - 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', - `WHERE accounts.account_type = ? AND accounts.commodity_guid = ?${filters}`, - ].join(' '), - ) + .prepare(` + SELECT COALESCE(SUM(quantity_num), 0) AS total + FROM splits JOIN accounts ON splits.account_guid = accounts.guid + WHERE accounts.account_type = ? AND accounts.commodity_guid = ?${filters} + `) .get( ...([accountType, commodityGuid, ...excludeGuids] as string[]), ) as { total: string } | undefined; @@ -330,12 +328,12 @@ serial('stage 4: run balance sheet and income statement', t => { placeholder: number; } >( - [ - 'SELECT guid, name, parent_guid, account_type, placeholder', - 'FROM accounts', - 'WHERE commodity_guid = ?', - 'ORDER BY guid', - ].join(' '), +` + SELECT guid, name, parent_guid, account_type, placeholder + FROM accounts + WHERE commodity_guid = ? + ORDER BY guid + `, ) .all(kit.commodityGuid); const book = db @@ -384,15 +382,13 @@ serial('stage 4: run balance sheet and income statement', t => { value_num: string; reconcile_state: string; } - >( - [ - 'SELECT splits.tx_guid, transactions.num, transactions.description,', - 'splits.value_num, splits.reconcile_state', - 'FROM splits JOIN transactions ON splits.tx_guid = transactions.guid', - 'WHERE splits.account_guid = ?', - 'ORDER BY splits.tx_guid, splits.guid', - ].join(' '), - ) + >(` + SELECT splits.tx_guid, transactions.num, transactions.description, + splits.value_num, splits.reconcile_state + FROM splits JOIN transactions ON splits.tx_guid = transactions.guid + WHERE splits.account_guid = ? + ORDER BY splits.tx_guid, splits.guid + `) .all(account.guid); t.snapshot( toRowStrings( diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index 39e3169..ce57bd2 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -76,13 +76,11 @@ serial('Mint and deposit (minimal DB impact)', t => { post_date: string | null; enter_date: string | null; } - >( - [ - 'SELECT guid, num, post_date, enter_date', - 'FROM transactions', - 'ORDER BY guid', - ].join(' '), - ) + >(` + SELECT guid, num, post_date, enter_date + FROM transactions + ORDER BY guid + `) .all() .map(row => ({ guid: shortGuid(row.guid), @@ -101,13 +99,11 @@ serial('Mint and deposit (minimal DB impact)', t => { value_denom: string; reconcile_state: string; } - >( - [ - 'SELECT guid, tx_guid, account_guid, value_num, value_denom, reconcile_state', - 'FROM splits', - 'ORDER BY guid', - ].join(' '), - ) + >(` + SELECT guid, tx_guid, account_guid, value_num, value_denom, reconcile_state + FROM splits + ORDER BY guid + `) .all() .map(row => ({ guid: shortGuid(row.guid), @@ -126,14 +122,12 @@ serial('Mint and deposit (minimal DB impact)', t => { 'enter_date', 'description', ]), - [ - 'GnuCash is an accounting program; a bit like Quicken but based more on traditional double-entry accounting.', - 'ERTP is a flexible Electronic Rights protocol.', - 'ERTP is flexible enough that we can implement it on top of a GnuCash database.', - '', - 'We start with the smallest ERTP action that writes to the database: mint 5 BUCKS and deposit them into a purse.', - 'This creates one transaction and two splits, moving value from the mint holding account into the purse.', - ].join('\n'), +`GnuCash is an accounting program; a bit like Quicken but based more on traditional double-entry accounting. +ERTP is a flexible Electronic Rights protocol. +ERTP is flexible enough that we can implement it on top of a GnuCash database. + +We start with the smallest ERTP action that writes to the database: mint 5 BUCKS and deposit them into a purse. +This creates one transaction and two splits, moving value from the mint holding account into the purse.`, ); t.snapshot( toRowStrings(splitRows, [ @@ -144,17 +138,15 @@ serial('Mint and deposit (minimal DB impact)', t => { 'value_denom', 'reconcile_state', ]), - [ - 'Splits show the value move: one positive into the purse account and one negative out of the mint holding account.', - '', - 'Context: before the deposit we already created issuer and purse records:', - ' const { issuer } = makeIssuerKit("BUCKS");', - ' const purse = issuer.makeEmptyPurse();', - '', - 'Those actions touch other tables too:', - '- createIssuerKit inserts a commodity row (BUCKS) and creates mint recovery/holding accounts.', - '- makeEmptyPurse inserts an account row for the new purse (later named via ChartFacet).', - ].join('\n'), +`Splits show the value move: one positive into the purse account and one negative out of the mint holding account. + +Context: before the deposit we already created issuer and purse records: + const { issuer } = makeIssuerKit("BUCKS"); + const purse = issuer.makeEmptyPurse(); + +Those actions touch other tables too: +- createIssuerKit inserts a commodity row (BUCKS) and creates mint recovery/holding accounts. +- makeEmptyPurse inserts an account row for the new purse (later named via ChartFacet).`, ); }); @@ -171,12 +163,12 @@ serial('ERTP is separate from naming', t => { placeholder: number; } >( - [ - 'SELECT guid, name, parent_guid, account_type, placeholder', - 'FROM accounts', - 'WHERE commodity_guid = ?', - 'ORDER BY guid', - ].join(' '), +` + SELECT guid, name, parent_guid, account_type, placeholder + FROM accounts + WHERE commodity_guid = ? + ORDER BY guid + `, ) .all(kit.commodityGuid); const accountsView = accounts @@ -196,11 +188,9 @@ serial('ERTP is separate from naming', t => { 'account_type', 'placeholder', ]), - [ - 'ERTP mints are separate from human-facing names.', - 'Anyone can create an ERTP `Mint`; if someone called it USD when it was not, that would be trouble.', - 'Until a chart names accounts, the ledger is correct but opaque to humans.', - ].join('\n'), +`ERTP mints are separate from human-facing names. +Anyone can create an ERTP \`Mint\`; if someone called it USD when it was not, that would be trouble. +Until a chart names accounts, the ledger is correct but opaque to humans.`, ); }); @@ -233,12 +223,12 @@ serial('Giving names in the chart of accounts', t => { placeholder: number; } >( - [ - 'SELECT guid, name, parent_guid, account_type, placeholder', - 'FROM accounts', - 'WHERE commodity_guid = ?', - 'ORDER BY guid', - ].join(' '), +` + SELECT guid, name, parent_guid, account_type, placeholder + FROM accounts + WHERE commodity_guid = ? + ORDER BY guid + `, ) .all(kit.commodityGuid) .map(row => ({ @@ -256,16 +246,14 @@ serial('Giving names in the chart of accounts', t => { 'account_type', 'placeholder', ]), - [ - 'makeIssuerKit("BUCKS") was a simplification.', - 'The actual setup wires a chart facet so we can name accounts:', - ' const kit = createIssuerKit({ db, ... });', - ' const chart = makeChartFacet({ db, getGuidFromSealed: kit.purses.getGuidFromSealed, ... });', - ' chart.placePurse({ sealedPurse: kit.sealer.seal(purse), name: "Alice", ... });', - '', - 'Placing the purse under a parent account gives it a human name and a path (e.g., Org1:Alice).', - 'The sealed token identifies the purse without leaking withdrawal authority.', - ].join('\n'), +`makeIssuerKit("BUCKS") was a simplification. +The actual setup wires a chart facet so we can name accounts: + const kit = createIssuerKit({ db, ... }); + const chart = makeChartFacet({ db, getGuidFromSealed: kit.purses.getGuidFromSealed, ... }); + chart.placePurse({ sealedPurse: kit.sealer.seal(purse), name: "Alice", ... }); + +Placing the purse under a parent account gives it a human name and a path (e.g., Org1:Alice). +The sealed token identifies the purse without leaking withdrawal authority.`, ); }); @@ -345,19 +333,17 @@ serial('Building account hierarchies with placeholder parents', t => { t.snapshot( toRowStrings(accounts, ['guid', 'code', 'name', 'parent_guid', 'placeholder']), - [ - 'The accounts table forms a tree via guid and parent_guid columns.', - 'Account codes (1000, 1100, etc.) enable cross-system integration.', - 'Placeholder accounts (Y) group children; leaf accounts hold balances.', - '', - 'Tree structure:', - ' 1000 Assets (placeholder)', - ' 1100 Bank (placeholder)', - ' 1110 Checking', - ' 1120 Savings', - ' 6000 Expenses (placeholder)', - ' 6100 Food', - ].join('\n'), +`The accounts table forms a tree via guid and parent_guid columns. +Account codes (1000, 1100, etc.) enable cross-system integration. +Placeholder accounts (Y) group children; leaf accounts hold balances. + +Tree structure: + 1000 Assets (placeholder) + 1100 Bank (placeholder) + 1110 Checking + 1120 Savings + 6000 Expenses (placeholder) + 6100 Food`, ); }); @@ -380,12 +366,11 @@ serial('Withdraw creates a hold', t => { enter_date: string | null; description: string; } - >( - [ - 'SELECT guid, currency_guid, num, post_date, enter_date, description', - 'FROM transactions', - 'ORDER BY guid', - ].join(' '), + >(` + SELECT guid, currency_guid, num, post_date, enter_date, description + FROM transactions + ORDER BY guid + `, ) .all() .map(row => ({ @@ -409,12 +394,12 @@ serial('Withdraw creates a hold', t => { reconcile_state: string; } >( - [ - 'SELECT splits.guid, splits.tx_guid, splits.account_guid, accounts.name AS account_name,', - 'splits.value_num, splits.value_denom, splits.reconcile_state', - 'FROM splits JOIN accounts ON splits.account_guid = accounts.guid', - 'ORDER BY splits.guid', - ].join(' '), +` + SELECT splits.guid, splits.tx_guid, splits.account_guid, accounts.name AS account_name, + splits.value_num, splits.value_denom, splits.reconcile_state + FROM splits JOIN accounts ON splits.account_guid = accounts.guid + ORDER BY splits.guid + `, ) .all() .map(row => ({ @@ -433,11 +418,9 @@ serial('Withdraw creates a hold', t => { 'post_date', 'enter_date', ]), - [ - 'Withdraw removes value from the purse by creating a new hold transaction, in addition to the earlier mint/deposit transaction.', - 'The split table shows the line items for that new transaction.', - 'The hold keeps value in a dedicated holding account until deposit or cancel.', - ].join('\n'), +`Withdraw removes value from the purse by creating a new hold transaction, in addition to the earlier mint/deposit transaction. +The split table shows the line items for that new transaction. +The hold keeps value in a dedicated holding account until deposit or cancel.`, ); t.snapshot( toRowStrings(splitRows, [ @@ -731,15 +714,13 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), - [ - 'Escrow follows the AMIX state machine (American Information Exchange, 1984).', - 'AMIX models exchange as: Agreement → Funding → Settlement (or Cancellation).', - '', - 'STATE: Agreement', - 'Escrow purses exist but are empty. Both parties hold Promise.', - 'Funding happens asynchronously - Alice may fund before Bob, or vice versa.', - 'No ledger changes yet.', - ].join('\n'), +`Escrow follows the AMIX state machine (American Information Exchange, 1984). +AMIX models exchange as: Agreement → Funding → Settlement (or Cancellation). + +STATE: Agreement +Escrow purses exist but are empty. Both parties hold Promise. +Funding happens asynchronously - Alice may fund before Bob, or vice versa. +No ledger changes yet.`, ); // === AMIX STATE: Alice funds (first mover) === @@ -749,12 +730,10 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), - [ - 'STATE: Alice Funds (first mover)', - 'Alice withdraws from her purse and deposits to escrow.', - 'Her payment creates a hold, then deposit retargets it to escrow.', - 'Escrow now holds 10 Moola; still waiting for Bob.', - ].join('\n'), +`STATE: Alice Funds (first mover) +Alice withdraws from her purse and deposits to escrow. +Her payment creates a hold, then deposit retargets it to escrow. +Escrow now holds 10 Moola; still waiting for Bob.`, ); // === AMIX STATE: Bob funds (second mover) === @@ -764,12 +743,10 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), - [ - 'STATE: Bob Funds (second mover)', - 'Bob withdraws from his purse and deposits to escrow.', - 'His payment creates a hold, then deposit retargets it to escrow.', - 'Both parties funded - escrow can now settle.', - ].join('\n'), +`STATE: Bob Funds (second mover) +Bob withdraws from his purse and deposits to escrow. +His payment creates a hold, then deposit retargets it to escrow. +Both parties funded - escrow can now settle.`, ); // === AMIX STATE: Settlement === @@ -779,12 +756,10 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), - [ - 'STATE: Settlement', - 'Escrow pays out to counterparties.', - 'Alice gets Stock (what she wanted); Bob gets Moola (what he wanted).', - 'Four new splits: escrow withdraws create holds, deposits finalize them.', - ].join('\n'), +`STATE: Settlement +Escrow pays out to counterparties. +Alice gets Stock (what she wanted); Bob gets Moola (what he wanted). +Four new splits: escrow withdraws create holds, deposits finalize them.`, ); }); diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index fb20646..3b7610a 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -216,13 +216,11 @@ test('fixture: withdraw-deposit matches ledger rows', async t => { value_denom: string; reconcile_state: string; } - >( - [ - 'SELECT account_guid, value_num, value_denom, reconcile_state', - 'FROM splits', - 'WHERE tx_guid = ?', - ].join(' '), - ) + >(` + SELECT account_guid, value_num, value_denom, reconcile_state + FROM splits + WHERE tx_guid = ? + `) .all(actualTx.guid); const actualSplits = splitRows .map(row => ({ @@ -297,17 +295,15 @@ test('alice-to-bob transfer records a single transaction', t => { .prepare< [string, string], { tx_guid: string; alice_count: number; bob_count: number; split_count: number } - >( - [ - 'SELECT tx_guid,', - 'SUM(CASE WHEN account_guid = ? THEN 1 ELSE 0 END) AS alice_count,', - 'SUM(CASE WHEN account_guid = ? THEN 1 ELSE 0 END) AS bob_count,', - 'COUNT(*) AS split_count', - 'FROM splits', - 'GROUP BY tx_guid', - 'HAVING alice_count > 0 AND bob_count > 0', - ].join(' '), - ) + >(` + SELECT tx_guid, + SUM(CASE WHEN account_guid = ? THEN 1 ELSE 0 END) AS alice_count, + SUM(CASE WHEN account_guid = ? THEN 1 ELSE 0 END) AS bob_count, + COUNT(*) AS split_count + FROM splits + GROUP BY tx_guid + HAVING alice_count > 0 AND bob_count > 0 + `) .all(aliceGuid, bobGuid); t.is(txRows.length, 1); t.is(txRows[0].split_count, 2); From 995faf86f950841daa5828b38260e13cc90e047c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 28 Jan 2026 21:39:13 -0600 Subject: [PATCH 55/77] refactor(ertp-ledgerguise): escrow test with async coordination MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Parties use async run(offer) with Promise resolver pattern - Escrow awaits payments via Promise.withResolvers, deposits, settles - Coordination facet (getCoordination) exposes void promises for observability - Separate moolaDeposited/stockDeposited from moolaPayment/stockPayment to avoid leaking Payment authority - No data properties mixed with methods (ocap discipline) - Document "closely held vs widely shared" in ocap-discipline.md - Snapshots show AMIX state machine: Agreement → Funding → Settlement Co-Authored-By: Claude Opus 4.5 --- .../docs-dev/ocap-discipline.md | 26 + .../ertp-ledgerguise/test/design-doc.test.ts | 823 +++++++++--------- .../test/snapshots/design-doc.test.ts.md | 52 +- .../test/snapshots/design-doc.test.ts.snap | Bin 2727 -> 2532 bytes 4 files changed, 462 insertions(+), 439 deletions(-) diff --git a/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md b/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md index 50a20ce..3c2c0c5 100644 --- a/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md +++ b/packages/ertp-ledgerguise/docs-dev/ocap-discipline.md @@ -93,6 +93,32 @@ An **actor** is an object with encapsulated state that communicates only by mess This follows the Principle of Least Authority (POLA): give each object only the capabilities it needs. See `test/escrow-db.test.ts` for an example of actor encapsulation in tests. +### Closely Held vs Widely Shared + +Capabilities fall into two categories based on how they're distributed: + +| Category | Description | Examples | +|----------|-------------|----------| +| **Closely held** | Kept private within an actor; not shared | Purses, private keys, unsealer | +| **Widely shared** | Freely given to counterparties | Deposit facets, sealed tokens, brand | + +A purse is closely held—only its owner can withdraw from it. But the purse's deposit facet is widely shared—anyone can deposit into it. This asymmetry enables safe cooperation: you can receive payments without risking your balance. + +```js +const makeParty = ({ issuer, sealer }) => { + // Closely held by the party + const purse = issuer.makeEmptyPurse(); + + return freeze({ + // Widely shared - safe to give to counterparties + getDepositFacet: () => purse.getDepositFacet(), + getSealedPurse: () => sealer.seal(purse), + // Closely held - requires party's cooperation + fund: (amount) => purse.withdraw(amount), + }); +}; +``` + ## Increased Cooperation with Limited Vulnerability > Capability-based security enables the concise composition of powerful patterns of cooperation without vulnerability. diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index ce57bd2..e56678c 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -2,18 +2,119 @@ * @file Snapshot-based design doc for ERTP->GnuCash mapping. */ -import test from 'ava'; -import type { ExecutionContext } from 'ava'; import type { TestFn } from 'ava'; -import type { Brand, Issuer, NatAmount, Payment, Purse } from '../src/ertp-types.js'; -import { createIssuerKit, makeChartFacet, wrapBetterSqlite3Database } from '../src/index.js'; +import test from 'ava'; +import type { Brand, Issuer, NatAmount, Payment } from '../src/ertp-types.js'; +import { + createIssuerKit, + makeChartFacet, + type Sealer, + wrapBetterSqlite3Database, +} from '../src/index.js'; import type { Guid } from '../src/types.js'; -import { makeTestClock, mockMakeGuid, makeTestDb } from './mock-io.js'; +import { makeTestClock, makeTestDb, mockMakeGuid } from './mock-io.js'; + +// #region DB query helpers + +// GnuCash table row types for typed queries +type TransactionRow = { + guid: string; + currency_guid: string; + num: string; + post_date: string | null; + enter_date: string | null; + description: string; +}; + +type SplitRow = { + guid: string; + tx_guid: string; + account_guid: string; + memo: string; + action: string; + reconcile_state: string; + reconcile_date: string | null; + value_num: string; + value_denom: string; + quantity_num: string; + quantity_denom: string; +}; + +type AccountRow = { + guid: string; + name: string; + account_type: string; + commodity_guid: string; + parent_guid: string | null; + code: string | null; + description: string | null; + placeholder: number; + hidden: number; +}; + +type BooksRow = { + root_account_guid: string; +}; + +// Named subsets for common query patterns +type AccountPath = Pick; +type AccountView = Pick< + AccountRow, + 'guid' | 'name' | 'parent_guid' | 'account_type' | 'placeholder' +>; +type AccountWithCode = Pick< + AccountRow, + 'guid' | 'name' | 'parent_guid' | 'placeholder' | 'code' +>; +type SplitEntry = Pick< + SplitRow, + | 'guid' + | 'tx_guid' + | 'account_guid' + | 'value_num' + | 'value_denom' + | 'reconcile_state' +>; + +// Column lists for snapshots +const accountViewCols = ['guid', 'name', 'parent_guid', 'account_type', 'placeholder']; +const splitEntryCols = ['guid', 'tx_guid', 'account_guid', 'value_num', 'value_denom', 'reconcile_state']; + +// Row mappers with sensible defaults +const GUID_KEYS = [ + 'guid', + 'tx_guid', + 'account_guid', + 'currency_guid', + 'parent_guid', + 'commodity_guid', +]; +const DATE_KEYS = ['post_date', 'enter_date', 'reconcile_date']; + +const shortGuids = + (keys: string[] = GUID_KEYS) => + (row: T): T => { + const r = { ...row } as Record; + for (const k of keys) { + if (k in r && typeof r[k] === 'string') + r[k] = (r[k] as string).slice(-12); + } + return r as T; + }; -type SealFn = { seal: (obj: unknown) => unknown }; +const shortDates = + (keys: string[] = DATE_KEYS) => + (row: T): T => { + const r = { ...row } as Record; + for (const k of keys) { + if (k in r && typeof r[k] === 'string') + r[k] = (r[k] as string).split(' ')[0]; + } + return r as T; + }; const toRowStrings = ( - rows: Record[], + rows: Record[], columns: string[], ): string[] => { if (rows.length === 0) return [columns.join(' | ')]; @@ -23,7 +124,7 @@ const toRowStrings = ( ...rows.map(row => String(row[column] ?? '').length), ), ); - const format = (row: Record) => + const format = (row: Record) => columns .map((column, index) => String(row[column] ?? '').padEnd(widths[index])) .join(' | '); @@ -31,17 +132,9 @@ const toRowStrings = ( return [format(header), ...rows.map(format)]; }; -const shortGuid = (value: string) => value.slice(-12); - -type DesignContext = { - db: ReturnType; - kit: ReturnType; - purse: Purse<'nat'>; -}; - -let closeDb: (() => void) | undefined; +// #endregion -const withDesignContext = (t: ExecutionContext) => { +const makeDesignContext = () => { const { freeze } = Object; const { db, close } = makeTestDb(); @@ -49,96 +142,51 @@ const withDesignContext = (t: ExecutionContext) => { const nowMs = makeTestClock(Date.UTC(2026, 0, 24, 0, 0), 1); const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'BUCKS' }); const kit = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); - const brand = kit.brand as Brand<'nat'>; - const bucks = (value: bigint): NatAmount => freeze({ brand, value }); - const purse = kit.issuer.makeEmptyPurse(); - const payment = kit.mint.mintPayment(bucks(5n)); - purse.deposit(payment); - closeDb = close; - t.context = { db, kit, purse }; + return { db, kit, purse, close }; }; -const serial = test.serial as TestFn; +const serial = test.serial as TestFn>; + +serial.before(t => (t.context = makeDesignContext())); +serial.after(t => t.context.close()); + +serial('Mint and deposit', t => { + const { freeze } = Object; + const { db, kit, purse } = t.context; + const brand = kit.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); -serial.before(withDesignContext); -serial.after(() => closeDb?.()); + purse.deposit(kit.mint.mintPayment(bucks(5n))); -serial('Mint and deposit (minimal DB impact)', t => { - const { db } = t.context; const txRows = db - .prepare< - [], - { - guid: string; - num: string; - post_date: string | null; - enter_date: string | null; - } - >(` - SELECT guid, num, post_date, enter_date - FROM transactions - ORDER BY guid - `) + .prepare<[], Omit>( + `SELECT guid, num, post_date, enter_date FROM transactions ORDER BY guid`, + ) .all() - .map(row => ({ - guid: shortGuid(row.guid), - num: row.num, - post_date: row.post_date?.split(' ')[0] ?? '', - enter_date: row.enter_date?.split(' ')[0] ?? '', - })); + .map(shortGuids()) + .map(shortDates()); const splitRows = db - .prepare< - [], - { - guid: string; - tx_guid: string; - account_guid: string; - value_num: string; - value_denom: string; - reconcile_state: string; - } - >(` - SELECT guid, tx_guid, account_guid, value_num, value_denom, reconcile_state - FROM splits - ORDER BY guid - `) + .prepare<[], SplitEntry>( + `SELECT guid, tx_guid, account_guid, value_num, value_denom, reconcile_state + FROM splits ORDER BY guid`, + ) .all() - .map(row => ({ - guid: shortGuid(row.guid), - tx_guid: shortGuid(row.tx_guid), - account_guid: shortGuid(row.account_guid), - value_num: row.value_num, - value_denom: row.value_denom, - reconcile_state: row.reconcile_state, - })); + .map(shortGuids()); + t.snapshot( - toRowStrings(txRows, [ - 'guid', - 'currency_guid', - 'num', - 'post_date', - 'enter_date', - 'description', - ]), -`GnuCash is an accounting program; a bit like Quicken but based more on traditional double-entry accounting. + toRowStrings(txRows, ['guid', 'num', 'post_date', 'enter_date']), + `GnuCash is an accounting program; a bit like Quicken but based more on traditional double-entry accounting. ERTP is a flexible Electronic Rights protocol. ERTP is flexible enough that we can implement it on top of a GnuCash database. -We start with the smallest ERTP action that writes to the database: mint 5 BUCKS and deposit them into a purse. +Let's mint 5 BUCKS and deposit them into a purse, then see how that's reflected in the GnuCash DB. This creates one transaction and two splits, moving value from the mint holding account into the purse.`, ); t.snapshot( - toRowStrings(splitRows, [ - 'guid', - 'tx_guid', - 'account_guid', - 'value_num', - 'value_denom', - 'reconcile_state', - ]), -`Splits show the value move: one positive into the purse account and one negative out of the mint holding account. + toRowStrings(splitRows, splitEntryCols), + `Splits show the value move: one positive into the purse account and one negative out of the mint holding account. Context: before the deposit we already created issuer and purse records: const { issuer } = makeIssuerKit("BUCKS"); @@ -146,61 +194,39 @@ Context: before the deposit we already created issuer and purse records: Those actions touch other tables too: - createIssuerKit inserts a commodity row (BUCKS) and creates mint recovery/holding accounts. -- makeEmptyPurse inserts an account row for the new purse (later named via ChartFacet).`, +- makeEmptyPurse inserts an account row for the new purse.`, ); }); serial('ERTP is separate from naming', t => { const { db, kit } = t.context; const accounts = db - .prepare< - [string], - { - guid: string; - name: string; - parent_guid: string | null; - account_type: string; - placeholder: number; - } - >( -` - SELECT guid, name, parent_guid, account_type, placeholder - FROM accounts - WHERE commodity_guid = ? - ORDER BY guid - `, + .prepare<[string], AccountView>( + ` + SELECT guid, name, parent_guid, account_type, placeholder + FROM accounts WHERE commodity_guid = ? ORDER BY guid + `, ) .all(kit.commodityGuid); const accountsView = accounts .filter(row => row.name === row.guid) - .map(row => ({ - guid: shortGuid(row.guid), - name: row.name, - parent_guid: row.parent_guid ? shortGuid(row.parent_guid) : '', - account_type: row.account_type, - placeholder: row.placeholder ? '1' : '0', - })); + .map(shortGuids()) + .map(row => ({ ...row, placeholder: row.placeholder ? '1' : '0' })); t.snapshot( - toRowStrings(accountsView, [ - 'guid', - 'name', - 'parent_guid', - 'account_type', - 'placeholder', - ]), -`ERTP mints are separate from human-facing names. + toRowStrings(accountsView, accountViewCols), + `ERTP mints are separate from human-facing names. Anyone can create an ERTP \`Mint\`; if someone called it USD when it was not, that would be trouble. -Until a chart names accounts, the ledger is correct but opaque to humans.`, +Until we give accounts names, the ledger is correct but opaque to humans.`, ); }); serial('Giving names in the chart of accounts', t => { const { db, kit, purse } = t.context; const root = db - .prepare<[], { root_account_guid: string }>( - 'SELECT root_account_guid FROM books LIMIT 1', - ) + .prepare<[], BooksRow>('SELECT root_account_guid FROM books LIMIT 1') .get(); + + // Name the purse "Alice" in the chart of accounts const chart = makeChartFacet({ db, commodityGuid: kit.commodityGuid, @@ -212,47 +238,25 @@ serial('Giving names in the chart of accounts', t => { parentGuid: root?.root_account_guid as Guid, accountType: 'STOCK', }); + const accountsViewNamed = db - .prepare< - [string], - { - guid: string; - name: string; - parent_guid: string | null; - account_type: string; - placeholder: number; - } - >( -` - SELECT guid, name, parent_guid, account_type, placeholder - FROM accounts - WHERE commodity_guid = ? - ORDER BY guid - `, + .prepare<[string], AccountView>( + ` + SELECT guid, name, parent_guid, account_type, placeholder + FROM accounts WHERE commodity_guid = ? ORDER BY guid + `, ) .all(kit.commodityGuid) - .map(row => ({ - guid: shortGuid(row.guid), - name: row.name, - parent_guid: row.parent_guid ? shortGuid(row.parent_guid) : '', - account_type: row.account_type, - placeholder: row.placeholder ? '1' : '0', - })); + .map(shortGuids()) + .map(row => ({ ...row, placeholder: row.placeholder ? '1' : '0' })); t.snapshot( - toRowStrings(accountsViewNamed, [ - 'guid', - 'name', - 'parent_guid', - 'account_type', - 'placeholder', - ]), -`makeIssuerKit("BUCKS") was a simplification. -The actual setup wires a chart facet so we can name accounts: - const kit = createIssuerKit({ db, ... }); - const chart = makeChartFacet({ db, getGuidFromSealed: kit.purses.getGuidFromSealed, ... }); + toRowStrings(accountsViewNamed, accountViewCols), + `The actual setup passes { db, ... } to connect to a GnuCash database. +Using other columns in that same database, we can give accounts human-readable names: + const chart = makeChartFacet({ db, ... }); chart.placePurse({ sealedPurse: kit.sealer.seal(purse), name: "Alice", ... }); -Placing the purse under a parent account gives it a human name and a path (e.g., Org1:Alice). +Placing the purse under a parent account gives it a name and a path (e.g., Org1:Alice). The sealed token identifies the purse without leaking withdrawal authority.`, ); }); @@ -265,13 +269,9 @@ serial('Building account hierarchies with placeholder parents', t => { const makeGuid = mockMakeGuid(); const now = makeTestClock(Date.UTC(2026, 0, 25, 0, 0), 1); + const commodity = freeze({ namespace: 'COMMODITY', mnemonic: 'USD' }); const moolaKit = createIssuerKit( - freeze({ - db, - commodity: freeze({ namespace: 'COMMODITY', mnemonic: 'USD' }), - makeGuid, - nowMs: now, - }), + freeze({ db, commodity, makeGuid, nowMs: now }), ); const chart = makeChartFacet({ @@ -282,9 +282,7 @@ serial('Building account hierarchies with placeholder parents', t => { const { sealer } = moolaKit; const root = db - .prepare<[], { root_account_guid: string }>( - 'SELECT root_account_guid FROM books LIMIT 1', - ) + .prepare<[], BooksRow>('SELECT root_account_guid FROM books LIMIT 1') .get(); const rootGuid = root?.root_account_guid as Guid; @@ -296,46 +294,77 @@ serial('Building account hierarchies with placeholder parents', t => { const expenses = moolaKit.issuer.makeEmptyPurse(); const food = moolaKit.issuer.makeEmptyPurse(); - chart.placePurse({ sealedPurse: sealer.seal(assets), name: 'Assets', parentGuid: rootGuid, accountType: 'ASSET', placeholder: true, code: '1000' }); + chart.placePurse({ + sealedPurse: sealer.seal(assets), + name: 'Assets', + parentGuid: rootGuid, + accountType: 'ASSET', + placeholder: true, + code: '1000', + }); const assetsGuid = moolaKit.purses.getGuid(assets); - chart.placePurse({ sealedPurse: sealer.seal(bank), name: 'Bank', parentGuid: assetsGuid, accountType: 'BANK', placeholder: true, code: '1100' }); + chart.placePurse({ + sealedPurse: sealer.seal(bank), + name: 'Bank', + parentGuid: assetsGuid, + accountType: 'BANK', + placeholder: true, + code: '1100', + }); const bankGuid = moolaKit.purses.getGuid(bank); - chart.placePurse({ sealedPurse: sealer.seal(checking), name: 'Checking', parentGuid: bankGuid, accountType: 'BANK', code: '1110' }); - chart.placePurse({ sealedPurse: sealer.seal(savings), name: 'Savings', parentGuid: bankGuid, accountType: 'BANK', code: '1120' }); + chart.placePurse({ + sealedPurse: sealer.seal(checking), + name: 'Checking', + parentGuid: bankGuid, + accountType: 'BANK', + code: '1110', + }); + chart.placePurse({ + sealedPurse: sealer.seal(savings), + name: 'Savings', + parentGuid: bankGuid, + accountType: 'BANK', + code: '1120', + }); - chart.placePurse({ sealedPurse: sealer.seal(expenses), name: 'Expenses', parentGuid: rootGuid, accountType: 'EXPENSE', placeholder: true, code: '6000' }); + chart.placePurse({ + sealedPurse: sealer.seal(expenses), + name: 'Expenses', + parentGuid: rootGuid, + accountType: 'EXPENSE', + placeholder: true, + code: '6000', + }); const expensesGuid = moolaKit.purses.getGuid(expenses); - chart.placePurse({ sealedPurse: sealer.seal(food), name: 'Food', parentGuid: expensesGuid, accountType: 'EXPENSE', code: '6100' }); + chart.placePurse({ + sealedPurse: sealer.seal(food), + name: 'Food', + parentGuid: expensesGuid, + accountType: 'EXPENSE', + code: '6100', + }); // Query showing how guid/parent_guid form the tree, with codes for cross-system integration const accounts = db - .prepare< - [string], - { guid: string; name: string; parent_guid: string | null; placeholder: number; code: string | null } - >( - `SELECT guid, name, parent_guid, placeholder, code - FROM accounts - WHERE commodity_guid = ? - ORDER BY code, name`, + .prepare<[string], AccountWithCode>( + ` + SELECT guid, name, parent_guid, placeholder, code + FROM accounts WHERE commodity_guid = ? ORDER BY code, name + `, ) .all(moolaKit.commodityGuid) .filter(row => !row.name.includes('Mint')) // exclude internal accounts - .map(row => ({ - guid: shortGuid(row.guid), - code: row.code ?? '', - name: row.name, - parent_guid: row.parent_guid ? shortGuid(row.parent_guid) : '', - placeholder: row.placeholder ? 'Y' : '', - })); + .map(shortGuids()) + .map(row => ({ ...row, placeholder: row.placeholder ? '1' : '0' })); t.snapshot( toRowStrings(accounts, ['guid', 'code', 'name', 'parent_guid', 'placeholder']), -`The accounts table forms a tree via guid and parent_guid columns. + `The accounts table forms a tree via guid and parent_guid columns. Account codes (1000, 1100, etc.) enable cross-system integration. -Placeholder accounts (Y) group children; leaf accounts hold balances. +Placeholder accounts (1) group children; leaf accounts (0) hold balances. Tree structure: 1000 Assets (placeholder) @@ -356,82 +385,35 @@ serial('Withdraw creates a hold', t => { purse.withdraw(bucks(2n)); const txRows = db - .prepare< - [], - { - guid: string; - currency_guid: string; - num: string; - post_date: string | null; - enter_date: string | null; - description: string; - } - >(` - SELECT guid, currency_guid, num, post_date, enter_date, description + .prepare<[], Omit>( + ` + SELECT guid, currency_guid, num, post_date, enter_date FROM transactions ORDER BY guid `, ) .all() - .map(row => ({ - guid: shortGuid(row.guid), - currency_guid: shortGuid(row.currency_guid), - num: row.num, - post_date: row.post_date?.split(' ')[0] ?? '', - enter_date: row.enter_date?.split(' ')[0] ?? '', - description: row.description, - })); + .map(shortGuids()) + .map(shortDates()); const splitRows = db - .prepare< - [], - { - guid: string; - tx_guid: string; - account_guid: string; - account_name: string; - value_num: string; - value_denom: string; - reconcile_state: string; - } - >( -` - SELECT splits.guid, splits.tx_guid, splits.account_guid, accounts.name AS account_name, - splits.value_num, splits.value_denom, splits.reconcile_state - FROM splits JOIN accounts ON splits.account_guid = accounts.guid - ORDER BY splits.guid - `, + .prepare<[], SplitEntry & { account_name: string }>( + ` + SELECT splits.guid, splits.tx_guid, splits.account_guid, accounts.name AS account_name, + splits.value_num, splits.value_denom, splits.reconcile_state + FROM splits JOIN accounts ON splits.account_guid = accounts.guid + ORDER BY splits.guid + `, ) .all() - .map(row => ({ - guid: shortGuid(row.guid), - tx_guid: shortGuid(row.tx_guid), - account_guid: shortGuid(row.account_guid), - account_name: row.account_name, - value_num: row.value_num, - value_denom: row.value_denom, - reconcile_state: row.reconcile_state, - })); + .map(shortGuids()); t.snapshot( - toRowStrings(txRows, [ - 'guid', - 'num', - 'post_date', - 'enter_date', - ]), -`Withdraw removes value from the purse by creating a new hold transaction, in addition to the earlier mint/deposit transaction. + toRowStrings(txRows, ['guid', 'num', 'post_date', 'enter_date']), + `Withdraw removes value from the purse by creating a new hold transaction, in addition to the earlier mint/deposit transaction. The split table shows the line items for that new transaction. The hold keeps value in a dedicated holding account until deposit or cancel.`, ); t.snapshot( - toRowStrings(splitRows, [ - 'guid', - 'tx_guid', - 'account_guid', - 'account_name', - 'value_num', - 'value_denom', - 'reconcile_state', - ]), + toRowStrings(splitRows, ['guid', 'tx_guid', 'account_guid', 'account_name', 'value_num', 'value_denom', 'reconcile_state']), 'Hold splits show the value leaving the purse and landing in the holding account.', ); }); @@ -446,7 +428,7 @@ const makeSplitTracker = (db: ReturnType) => { // Build a map of guid -> full path for all accounts const buildPathMap = () => { const accounts = db - .prepare<[], { guid: string; name: string; parent_guid: string | null }>( + .prepare<[], Pick>( 'SELECT guid, name, parent_guid FROM accounts', ) .all(); @@ -464,26 +446,16 @@ const makeSplitTracker = (db: ReturnType) => { return new Map(accounts.map(a => [a.guid, getPath(a.guid)])); }; + type SplitWithPath = Omit & { split_guid: string }; const getAllSplits = () => { const pathMap = buildPathMap(); return db - .prepare< - [], - { - split_guid: string; - tx_guid: string; - account_guid: string; - value_num: string; - value_denom: string; - reconcile_state: string; - } - >( + .prepare<[], SplitWithPath>( ` SELECT s.guid as split_guid, s.tx_guid, s.account_guid, s.value_num, s.value_denom, s.reconcile_state - FROM splits s - ORDER BY s.tx_guid, s.account_guid - `, + FROM splits s ORDER BY s.tx_guid, s.account_guid + `, ) .all() .map(row => ({ @@ -500,8 +472,8 @@ const makeSplitTracker = (db: ReturnType) => { for (const row of allSplits) { seenGuids.add(row.split_guid); } - return newSplits.map(row => ({ - tx_guid: shortGuid(row.tx_guid), + return newSplits.map(shortGuids(['tx_guid'])).map(row => ({ + tx_guid: row.tx_guid, account: row.account_path, value_num: row.value_num, value_denom: row.value_denom, @@ -519,86 +491,102 @@ const splitColumns = [ 'reconcile_state', ]; +/** An offer describes what a party should give and how to deliver it. */ +type Offer = { give: NatAmount; resolve: (payment: Payment<'nat'>) => void }; + /** * Factory for a party (Alice or Bob) with encapsulated purses. - * Follows POLA: purses are private, only deposit facets and sealed tokens exposed. - * Returns sealed tokens for chart placement - party doesn't need chart authority. + * When run(offer) is called, the party decides to accept and fund accordingly. */ -const makeParty = ({ - name, - moolaIssuer, - stockIssuer, - moolaSealer, - stockSealer, -}: { - name: string; - moolaIssuer: Issuer<'nat'>; - stockIssuer: Issuer<'nat'>; - moolaSealer: SealFn; - stockSealer: SealFn; -}) => { +const makeParty = ( + moolaIssuer: Issuer<'nat'>, + stockIssuer: Issuer<'nat'>, + moolaSealer: Sealer, + stockSealer: Sealer, +) => { const { freeze } = Object; - // Private purses - not leaked to test scope + // Closely held by the party const moola = moolaIssuer.makeEmptyPurse(); const stock = stockIssuer.makeEmptyPurse(); + const moolaBrand = moola.getCurrentAmount().brand; + return freeze({ - name, - // Sealed tokens for chart placement (no withdrawal authority) - sealedMoola: moolaSealer.seal(moola), - sealedStock: stockSealer.seal(stock), - // Deposit facets for receiving funds (safe to share) - moolaDeposit: moola.getDepositFacet(), - stockDeposit: stock.getDepositFacet(), - // Funding escrow: party withdraws internally, returns payment - fundMoola: (amount: NatAmount) => moola.withdraw(amount), - fundStock: (amount: NatAmount) => stock.withdraw(amount), - // Inspection (safe to share) - getBalances: () => ({ - moola: moola.getCurrentAmount(), - stock: stock.getCurrentAmount(), - }), + getSealedMoola: () => moolaSealer.seal(moola), + getSealedStock: () => stockSealer.seal(stock), + getMoolaDeposit: () => moola.getDepositFacet(), + getStockDeposit: () => stock.getDepositFacet(), + getBalances: () => ({ moola: moola.getCurrentAmount(), stock: stock.getCurrentAmount() }), + // Party decides to participate by accepting the offer + run: async (offer: Offer) => { + const purse = offer.give.brand === moolaBrand ? moola : stock; + offer.resolve(purse.withdraw(offer.give)); + }, }); }; /** * Factory for escrow holder with encapsulated purses. - * Escrow owns its purses; parties interact via deposit facets. - * Returns sealed tokens for chart placement. + * Escrow owns its purses; parties deliver payments via Promise resolvers. + * When run() is called, escrow awaits payments and settles. */ -const makeEscrowHolder = ({ - moolaIssuer, - stockIssuer, - moolaSealer, - stockSealer, -}: { - moolaIssuer: Issuer<'nat'>; - stockIssuer: Issuer<'nat'>; - moolaSealer: SealFn; - stockSealer: SealFn; -}) => { +const makeEscrowHolder = ( + moolaIssuer: Issuer<'nat'>, + stockIssuer: Issuer<'nat'>, + moolaSealer: Sealer, + stockSealer: Sealer, + terms: { + aliceGives: NatAmount; + bobGives: NatAmount; + }, + settlement: { + aliceGetsStockAt: { receive: (p: Payment<'nat'>) => NatAmount }; + bobGetsMoolaAt: { receive: (p: Payment<'nat'>) => NatAmount }; + }, +) => { const { freeze } = Object; const moola = moolaIssuer.makeEmptyPurse(); const stock = stockIssuer.makeEmptyPurse(); + // Payment delivery promises (parties resolve these) + const moolaPayment = Promise.withResolvers>(); + const stockPayment = Promise.withResolvers>(); + + // Deposit completion promises (for test observability - resolve to void, not Payment) + const moolaDeposited = Promise.withResolvers(); + const stockDeposited = Promise.withResolvers(); + return freeze({ - // Sealed tokens for chart placement - sealedMoola: moolaSealer.seal(moola), - sealedStock: stockSealer.seal(stock), - // Deposit facets for parties to fund escrow - moolaDeposit: moola.getDepositFacet(), - stockDeposit: stock.getDepositFacet(), - // Settlement: escrow withdraws and pays out - settleTo: (alice: ReturnType, bob: ReturnType, amounts: { stock: NatAmount; moola: NatAmount }) => { - const stockPayment = stock.withdraw(amounts.stock); - const moolaPayment = moola.withdraw(amounts.moola); - alice.stockDeposit.receive(stockPayment); - bob.moolaDeposit.receive(moolaPayment); + getSealedMoola: () => moolaSealer.seal(moola), + getSealedStock: () => stockSealer.seal(stock), + getMoolaResolver: () => moolaPayment.resolve, + getStockResolver: () => stockPayment.resolve, + // Coordination facet for test observability (no authority leaked) + getCoordination: () => + freeze({ + moolaDeposited: moolaDeposited.promise, + stockDeposited: stockDeposited.promise, + }), + // Escrow awaits payments, deposits, and settles + run: async () => { + await Promise.all([ + moolaPayment.promise.then(p => { + moola.deposit(p); + moolaDeposited.resolve(); + }), + stockPayment.promise.then(p => { + stock.deposit(p); + stockDeposited.resolve(); + }), + ]); + // Settle: Alice gets stock, Bob gets moola + settlement.aliceGetsStockAt.receive(stock.withdraw(terms.bobGives)); + settlement.bobGetsMoolaAt.receive(moola.withdraw(terms.aliceGives)); }, }); }; -serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { +serial('Escrow exchange (AMIX-style state machine)', async t => { const { freeze } = Object; const { db, close } = makeTestDb(); t.teardown(close); @@ -607,12 +595,14 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { const now = makeTestClock(Date.UTC(2026, 0, 25, 0, 0), 1); const makeKit = (mnemonic: string) => - createIssuerKit(freeze({ - db, - commodity: freeze({ namespace: 'COMMODITY', mnemonic }), - makeGuid, - nowMs: now, - })); + createIssuerKit( + freeze({ + db, + commodity: freeze({ namespace: 'COMMODITY', mnemonic }), + makeGuid, + nowMs: now, + }), + ); const moola = makeKit('Moola'); const stock = makeKit('Stock'); @@ -634,9 +624,7 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { }), }; const root = db - .prepare<[], { root_account_guid: string }>( - 'SELECT root_account_guid FROM books LIMIT 1', - ) + .prepare<[], BooksRow>('SELECT root_account_guid FROM books LIMIT 1') .get(); const rootGuid = root?.root_account_guid as Guid; @@ -663,103 +651,118 @@ serial('Escrow exchange: async funding (AMIX-style state machine)', async t => { escrow: moola.purses.getGuid(placeholders.escrow), }; - // Create encapsulated actors - purses are private to each - const partyConfig = { - moolaIssuer: moola.issuer, - stockIssuer: stock.issuer, - moolaSealer: moola.sealer, - stockSealer: stock.sealer, - }; - const parties = { - alice: makeParty({ name: 'Alice', ...partyConfig }), - bob: makeParty({ name: 'Bob', ...partyConfig }), - }; + // === AMIX STATE: Agreement === + // Create parties first - they don't know about escrow yet + const alice = makeParty( + moola.issuer, + stock.issuer, + moola.sealer as Sealer, + stock.sealer as Sealer, + ); + const bob = makeParty( + moola.issuer, + stock.issuer, + moola.sealer as Sealer, + stock.sealer as Sealer, + ); + + // Create escrow with terms and settlement destinations + const escrow = makeEscrowHolder( + moola.issuer, + stock.issuer, + moola.sealer as Sealer, + stock.sealer as Sealer, + { aliceGives: moolaAmt(10n), bobGives: stockAmt(1n) }, + { + aliceGetsStockAt: alice.getStockDeposit(), + bobGetsMoolaAt: bob.getMoolaDeposit(), + }, + ); + + // Define offers - what each party gives and how to deliver it + const aliceOffer: Offer = { give: moolaAmt(10n), resolve: escrow.getMoolaResolver() }; + const bobOffer: Offer = { give: stockAmt(1n), resolve: escrow.getStockResolver() }; - // Place party purses in chart (parties return sealed tokens, don't need chart authority) - for (const [name, party] of Object.entries(parties)) { - const parentGuid = parentGuids[name as keyof typeof parentGuids]; - charts.moola.placePurse({ sealedPurse: party.sealedMoola, name: 'Moola', parentGuid, accountType: 'ASSET' }); - charts.stock.placePurse({ sealedPurse: party.sealedStock, name: 'Stock', parentGuid, accountType: 'STOCK' }); + // Place all purses in the chart + for (const [name, party] of Object.entries({ Alice: alice, Bob: bob })) { + const parentGuid = parentGuids[name.toLowerCase() as keyof typeof parentGuids]; + charts.moola.placePurse({ + sealedPurse: party.getSealedMoola(), + name: 'Moola', + parentGuid, + accountType: 'ASSET', + }); + charts.stock.placePurse({ + sealedPurse: party.getSealedStock(), + name: 'Stock', + parentGuid, + accountType: 'STOCK', + }); } + charts.moola.placePurse({ + sealedPurse: escrow.getSealedMoola(), + name: 'Moola', + parentGuid: parentGuids.escrow, + accountType: 'ASSET', + }); + charts.stock.placePurse({ + sealedPurse: escrow.getSealedStock(), + name: 'Stock', + parentGuid: parentGuids.escrow, + accountType: 'STOCK', + }); // Track splits incrementally - only show new splits at each state const tracker = makeSplitTracker(db); tracker.getNewSplits(); // Clear any setup splits - // === SETUP: Parties have assets in their purses === - parties.alice.moolaDeposit.receive(moola.mint.mintPayment(moolaAmt(10n))); - parties.bob.stockDeposit.receive(stock.mint.mintPayment(stockAmt(1n))); - tracker.getNewSplits(); // Clear setup splits - - // === AMIX STATE: Agreement === - // Escrow is created. Parties will provide Promise, not immediate payments. - // This models async funding: Alice may fund before Bob, or vice versa. - const escrow = makeEscrowHolder(partyConfig); - - // Place escrow purses in chart - charts.moola.placePurse({ sealedPurse: escrow.sealedMoola, name: 'Moola', parentGuid: parentGuids.escrow, accountType: 'ASSET' }); - charts.stock.placePurse({ sealedPurse: escrow.sealedStock, name: 'Stock', parentGuid: parentGuids.escrow, accountType: 'STOCK' }); - - // Deferred resolvers - these simulate async funding decisions - let resolveAliceFunding!: (payment: Payment<'nat'>) => void; - let resolveBobFunding!: (payment: Payment<'nat'>) => void; - const aliceFundingP = new Promise>(r => { resolveAliceFunding = r; }); - const bobFundingP = new Promise>(r => { resolveBobFunding = r; }); - - // Escrow starts waiting for both deposits (via promises) - const escrowDepositPs = { - moola: aliceFundingP.then(p => escrow.moolaDeposit.receive(p)), - stock: bobFundingP.then(p => escrow.stockDeposit.receive(p)), - }; + // Fund parties' purses (they receive assets from elsewhere) + alice.getMoolaDeposit().receive(moola.mint.mintPayment(moolaAmt(10n))); + bob.getStockDeposit().receive(stock.mint.mintPayment(stockAmt(1n))); + tracker.getNewSplits(); // Clear funding splits t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), -`Escrow follows the AMIX state machine (American Information Exchange, 1984). + `Escrow follows the AMIX state machine (American Information Exchange, 1984). AMIX models exchange as: Agreement → Funding → Settlement (or Cancellation). STATE: Agreement -Escrow purses exist but are empty. Both parties hold Promise. -Funding happens asynchronously - Alice may fund before Bob, or vice versa. +Parties and escrow exist. Offers are defined but not yet accepted. No ledger changes yet.`, ); - // === AMIX STATE: Alice funds (first mover) === - const alicePayment = parties.alice.fundMoola(moolaAmt(10n)); - resolveAliceFunding(alicePayment); - await escrowDepositPs.moola; // Wait for Alice's deposit to complete + // === AMIX STATE: Funding === + // Escrow starts waiting for payments + const escrowDone = escrow.run(); + const coord = escrow.getCoordination(); + + // Alice decides to fund + await alice.run(aliceOffer); + await coord.moolaDeposited; t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), -`STATE: Alice Funds (first mover) -Alice withdraws from her purse and deposits to escrow. -Her payment creates a hold, then deposit retargets it to escrow. -Escrow now holds 10 Moola; still waiting for Bob.`, + `STATE: Alice Funds (first mover) +Alice accepts her offer and funds escrow with 10 Moola. +Escrow now holds moola; still waiting for Bob.`, ); - // === AMIX STATE: Bob funds (second mover) === - const bobPayment = parties.bob.fundStock(stockAmt(1n)); - resolveBobFunding(bobPayment); - await escrowDepositPs.stock; // Wait for Bob's deposit to complete - + // Bob decides to fund + await bob.run(bobOffer); + await coord.stockDeposited; t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), -`STATE: Bob Funds (second mover) -Bob withdraws from his purse and deposits to escrow. -His payment creates a hold, then deposit retargets it to escrow. -Both parties funded - escrow can now settle.`, + `STATE: Bob Funds (second mover) +Bob accepts his offer and funds escrow with 1 Stock. +Both parties funded - escrow settles.`, ); - // === AMIX STATE: Settlement === - // In real escrow, this happens automatically via Promise.all resolution. - // Here we manually perform the settlement to show the ledger changes. - escrow.settleTo(parties.alice, parties.bob, { stock: stockAmt(1n), moola: moolaAmt(10n) }); - + // Await settlement + await escrowDone; t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), -`STATE: Settlement -Escrow pays out to counterparties. -Alice gets Stock (what she wanted); Bob gets Moola (what he wanted). -Four new splits: escrow withdraws create holds, deposits finalize them.`, + `STATE: Settlement +Alice gets Stock (what she wanted); Bob gets Moola (what he wanted).`, ); }); diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md index da5adaf..9946571 100644 --- a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md @@ -4,18 +4,18 @@ The actual snapshot is saved in `design-doc.test.ts.snap`. Generated by [AVA](https://avajs.dev). -## Mint and deposit (minimal DB impact) +## Mint and deposit > GnuCash is an accounting program; a bit like Quicken but based more on traditional double-entry accounting. > ERTP is a flexible Electronic Rights protocol. > ERTP is flexible enough that we can implement it on top of a GnuCash database. > -> We start with the smallest ERTP action that writes to the database: mint 5 BUCKS and deposit them into a purse. +> Let's mint 5 BUCKS and deposit them into a purse, then see how that's reflected in the GnuCash DB. > This creates one transaction and two splits, moving value from the mint holding account into the purse. [ - 'guid | currency_guid | num | post_date | enter_date | description', - '000000000002 | | 00:00 | 2026-01-24 | 2026-01-24 | ', + 'guid | num | post_date | enter_date', + '000000000002 | 00:00 | 2026-01-24 | 2026-01-24', ] > Splits show the value move: one positive into the purse account and one negative out of the mint holding account. @@ -26,7 +26,7 @@ Generated by [AVA](https://avajs.dev). > > Those actions touch other tables too: > - createIssuerKit inserts a commodity row (BUCKS) and creates mint recovery/holding accounts. -> - makeEmptyPurse inserts an account row for the new purse (later named via ChartFacet). +> - makeEmptyPurse inserts an account row for the new purse. [ 'guid | tx_guid | account_guid | value_num | value_denom | reconcile_state', @@ -38,7 +38,7 @@ Generated by [AVA](https://avajs.dev). > ERTP mints are separate from human-facing names. > Anyone can create an ERTP `Mint`; if someone called it USD when it was not, that would be trouble. -> Until a chart names accounts, the ledger is correct but opaque to humans. +> Until we give accounts names, the ledger is correct but opaque to humans. [ 'guid | name | parent_guid | account_type | placeholder', @@ -47,13 +47,12 @@ Generated by [AVA](https://avajs.dev). ## Giving names in the chart of accounts -> makeIssuerKit("BUCKS") was a simplification. -> The actual setup wires a chart facet so we can name accounts: -> const kit = createIssuerKit({ db, ... }); -> const chart = makeChartFacet({ db, getGuidFromSealed: kit.purses.getGuidFromSealed, ... }); +> The actual setup passes { db, ... } to connect to a GnuCash database. +> Using other columns in that same database, we can give accounts human-readable names: +> const chart = makeChartFacet({ db, ... }); > chart.placePurse({ sealedPurse: kit.sealer.seal(purse), name: "Alice", ... }); > -> Placing the purse under a parent account gives it a human name and a path (e.g., Org1:Alice). +> Placing the purse under a parent account gives it a name and a path (e.g., Org1:Alice). > The sealed token identifies the purse without leaking withdrawal authority. [ @@ -67,7 +66,7 @@ Generated by [AVA](https://avajs.dev). > The accounts table forms a tree via guid and parent_guid columns. > Account codes (1000, 1100, etc.) enable cross-system integration. -> Placeholder accounts (Y) group children; leaf accounts hold balances. +> Placeholder accounts (1) group children; leaf accounts (0) hold balances. > > Tree structure: > 1000 Assets (placeholder) @@ -79,12 +78,12 @@ Generated by [AVA](https://avajs.dev). [ 'guid | code | name | parent_guid | placeholder', - '000000000001 | 1000 | Assets | e7ee18a10171 | Y ', - '000000000002 | 1100 | Bank | 000000000001 | Y ', - '000000000003 | 1110 | Checking | 000000000002 | ', - '000000000004 | 1120 | Savings | 000000000002 | ', - '000000000005 | 6000 | Expenses | e7ee18a10171 | Y ', - '000000000006 | 6100 | Food | 000000000005 | ', + '000000000001 | 1000 | Assets | e7ee18a10171 | 1 ', + '000000000002 | 1100 | Bank | 000000000001 | 1 ', + '000000000003 | 1110 | Checking | 000000000002 | 0 ', + '000000000004 | 1120 | Savings | 000000000002 | 0 ', + '000000000005 | 6000 | Expenses | e7ee18a10171 | 1 ', + '000000000006 | 6100 | Food | 000000000005 | 0 ', ] ## Withdraw creates a hold @@ -109,14 +108,13 @@ Generated by [AVA](https://avajs.dev). '000000000007 | 000000000005 | 000000000001 | Alice | -2 | 1 | n ', ] -## Escrow exchange: async funding (AMIX-style state machine) +## Escrow exchange (AMIX-style state machine) > Escrow follows the AMIX state machine (American Information Exchange, 1984). > AMIX models exchange as: Agreement → Funding → Settlement (or Cancellation). > > STATE: Agreement -> Escrow purses exist but are empty. Both parties hold Promise. -> Funding happens asynchronously - Alice may fund before Bob, or vice versa. +> Parties and escrow exist. Offers are defined but not yet accepted. > No ledger changes yet. [ @@ -124,9 +122,8 @@ Generated by [AVA](https://avajs.dev). ] > STATE: Alice Funds (first mover) -> Alice withdraws from her purse and deposits to escrow. -> Her payment creates a hold, then deposit retargets it to escrow. -> Escrow now holds 10 Moola; still waiting for Bob. +> Alice accepts her offer and funds escrow with 10 Moola. +> Escrow now holds moola; still waiting for Bob. [ 'tx_guid | account | value_num | value_denom | reconcile_state', @@ -135,9 +132,8 @@ Generated by [AVA](https://avajs.dev). ] > STATE: Bob Funds (second mover) -> Bob withdraws from his purse and deposits to escrow. -> His payment creates a hold, then deposit retargets it to escrow. -> Both parties funded - escrow can now settle. +> Bob accepts his offer and funds escrow with 1 Stock. +> Both parties funded - escrow settles. [ 'tx_guid | account | value_num | value_denom | reconcile_state', @@ -146,9 +142,7 @@ Generated by [AVA](https://avajs.dev). ] > STATE: Settlement -> Escrow pays out to counterparties. > Alice gets Stock (what she wanted); Bob gets Moola (what he wanted). -> Four new splits: escrow withdraws create holds, deposits finalize them. [ 'tx_guid | account | value_num | value_denom | reconcile_state', diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap index ffb40c97df9c8b91598d1045ef336620adc96c2c..da19df6bb568c30cb8b83291071aef21ba82e050 100644 GIT binary patch literal 2532 zcmVgulV`>Lv64hM+}56q{ZqZKy6@dF_(a2Y{_V`YRDM)I+Vl{LTo zJc_vGAAYgS-e7cjZ+goe#@G$USjHH8$Gh^jcX>-|KJ~ov-_@&EnddWaiFsdR?|4h> z8{RVWF2C&sqfA6lUdJG_)cuZ?vCkrIk#100)b6hM-1DmMJF}|?$I$8YI~_QNUZ;0s zwbNbgt(~~Rgby&8dSBd?*$y``2m@RK4?~qnE93~qT8%VMH-W=ISV+VH!jCc$9-xFl zW?{e$Mvy9vpd?t$BVmP-Jb_4Mg9KMmT0N~<4E)^>_8+^6V3^>M7$gY035HfHDMI)_ zjACnOUaLZt%!XHkQL1bdgN?a`2|~yvh;*D_iqe9x&JQ&PH3Sajx+q5EYT*0tqkY#v zN)cU$?I%0;_v(=a8)FJWS_K@&nKrmWk0cmGh}FbR`>p|vL-H9T5RwK|Gu_?}{QX!M z2sLtx29!kF7ioA%JL4v^69s0R2y0d#Rfn|Ehdjv;hFYc0obxYMNks38-OJsgx6ZL3 zhu%-TPiok^w8j|gGsa#r#@_PIz~6Ece@`3uvq#TnPmW7R@@L1n&(8>><^Kq!qC1VD zlA%cOnX!v-`m~1A>kg+4*j85;j$ys#Q5T?g7s83FoM&m#JZtmw;LWw`QHZ@>Z-d^h zuAg(Bk~e?eb3p`?BLj;lrs@#;F7UZp9AYDMRYVC4G*04(yKySBgxps_An^SiB`qG= zJ`8Y3w4>C_|6i0G{Q4sOe|cg3|EQ_|JViL|I)*XVIHP3A zP&*wXy-awBv_GilIQUV6Wu4P68gg>xt-Zb7{n>4&$&aJIxJ{&B8Q>Zldl_dbm#ae_ zQtW7jtKF!N;%Gna2N#=g%O`yFHKpNz4eo~7NFn%H@G4(yzS%f;~WumOgx zM1;)=jsZ6iyEl2a)7_v!d;5=e?k~j1oK`>N7_N1(yV1Qd7{GCnn_cPkK|%Ef1kYuE zxw79-`zm+=G)+H4GCZVVcD4$)u*f*^nwgql!ENmz1~#e7}z z#E=8IP=+eWQdwY$TQC&Ka_CA~^qjt4yc%(<&zMG&;1r`>LfmKwBiU_3@LqX}Knrk9#O!+iHen4K( zeWdw>C%`isD=qA_V)6QRCQepcu|Umr7?V-@v`&t~{{^gGifXKW^EPAbhm5h`FvkAI z80&b9z3>?OlgHRMm(F1L8%>69HW(hN2`Q)+1wkoHX0Oxr|+2 zWNaOd;YPk^yGLV`MEUdV*_B1cZjiBj&+aG{&F|UzV(}5V_!Ju83M?vWQYxdYMubDb z!J)wwfHia!8WZ?i1>6Zt23iDz6&Jr1KpO^aKo`E0DtLYrwM{c^A@K-sF{x$VjI3;YVXT44teIN1&R`HuR;(|gUDRg4;<3dELT9oHC`rL`YzZZ37&lzK1 zo>djjb!DA}rveu_7pNC^~t~-!#hndl7*mG|7iWhO$kxI+A)pP7@20Pn~U|J zXjz;ByMo+dqt-dEP(I{Qe!u`lJB3^)0<|kL->Z7~*+)gLpf;_b2lZ-smPmv|5EfHY zGy>eZiRV6do*W>KOW(;6h%geN>#>@Bdge;Z(i^2IU5A*I4g1m`YS6gyJ;vDfe~Z7b z7-O3rV}JA*TR$r`Ty8?-;6jaid0Q(HU#FWtXbAQk*v_gOU#G>dPkwfbzo6*5K;J)? zs_K*9m{;ucOx}Ct%H`t8FD;sUV?nw&$F{HbX8%u}yy)m2li$VBRrAy%L8q$qQw|wH z!lhei(HAw(Gs^PoJG&;NjvSA|n9C7DYwN+i4_A$y5@iW>kn%7V65BJW{Z%2gKd7E51& z?ssplwFBRMnW_jAGusz#`mi<9m>+lk_0!MbPL}U5{og}ti<8in(y-%nCvo=Mf$#6_ zZ|(2azV{zTL4%qAd6sW9;u2&VqLrYuf9}*WDUXDyH-wD3x%>k#6S|963vxnuc?96qc#tKBw#y z;oKsFhR{Mi<_p8(#$3^)uZLI9CF{fUQ({)-{mQ z^Gz^TBneEoaA}#6|B(KNw^0dyM`5 ztRtzps^otX){Tm?MPM(m`=^F=V?L}G#>?^|!@K}uAu(_fEtsnUnuZ%9b8hu2fcUfk u;w+OCsxqPuEZ>LL#GOjT2oo+XM(s_9TQ?$~Hy<$@5c~(TG8}MI9RL8YFWWo- literal 2727 zcmV;Y3Rv|)RzVr>AWt7h3nOp zT{vsn93P7a00000000BkSzBu)#}%%Tc5SCgFvfwr7V2r+ri#i#l* zt)5w3SO}zH+3D`;b57Oy&UY^QY|xiFI<}vDj!rmoaB@!;- z&Mt^#%p=zlR`IbNX=i`&c^q@c-}`!%JE(8!PO)jaAmT{#@gYVJc!Mt{FtBF{q;HL;rjRDoyT9Dy5g2NQ&dD{`sC1eF8fyd8QBdH@`XeUX33)G!F%MX-(=2NU5)3W80zlxQ7z zRXm~%ERXu)Z}t`O3Lgz&WqyASqWKRkmoH^KyjavC^{Q$q@mM#4g5kdq{>kPb=N zTnl~cCK~Km3TM|K(I<53CtRio1EUkK*sB|98PmJ`C^IeeHq(<~`2EI56%b$BV2t$` zW1lg`zSXz@$g6cAzf%LUJAF8RGAj%zVC`*wNZ>Ah$EY;j8H}`wgv5u|afb_#ey0NI z7d?c}AiQ$hff;O8Eb5$resne#3Oy^!^lU8Z!CMs95tc+=hf7<7@u*b>W&fJlt=zw#&tt zjNADqAuZoe#%_8*&zr67AUGOnzd-^!#ZelKK)VqdaJ(;lXz5OQ!si0O>aZX@1Te&e>Aj_6ExEoYG-7_U>(jHHWywpotHh(#-E?UNxrkD6miPSn>$z@X#y-=m)hBY@dI1YH4W(JBNq+N0l5^51!LM`$Hs8 zTHpq2XE{m}uGR-UBFEB3Z5ZsRDa8u0e+C3{rq{}RK;-v1MjIXMY;|t-`!LJ% zurK=F&Uv6-8C^#HYAL^#3M%qn&FSST@{0uVkL7&oamc|^5hDg7;zX8IH+bSqxde+Y z9m7Nzv?Uw|#6nX7!JcVc*_hsJ+G#foqJ{;I89}) zh*3E)5R|P-jZ{2RdX~tK$rieg4WDocJar>&gqxOezqy-=v&Gv;py4JOkx*ZUR>CRY z#S$J^i7Pzt%pJzqj~HXWW{mxnG1hJ{_Hl!;uNsVfZ{-3`c)HFB+x4zR$5^F?1wJ^B z0Jduc&}sXgWXD=`c3JShe@?Vlg;AZ>>3CtgTpbs&c2?UGVXMo8z37E?NZ8&8Bk#wB zst^{1U0Wt>!wc(@utQEPZ{bqHt}hd|2{X8vo!S2B7?nkPsWW?OnXsEAEIYHiTE~lL zwz<41#EgM5M#<_ms*w`nAZHMLMdZ=o>&Xf_A}!NIQIgK#PGGXoBp9rD|E&SKC~N^L zFE%pT+I2g%E^D7~XmS=jsKiBSOY{8}42@355RHV44XSMl#CZz!l`{0X+io!ShX!Mt7o~;kb%-2aX$DZ-Rtm}|84MiP z$a(>67gd>0GA*bozj#`(q(r>J2w@>jRh8ddWb4Z)?>=_tYPs@j%am^|D!!p1gQFD){(TJ-d_JG@|ieQjt zpEq~jeC@q;>!#9=1sy`dqmfWpnGgRmXWpMx!fR!XG1k3^aU1n;x?RLi87o%_kb?T& z%QrR9QWm5``#8G;XznCv1T_b*DN5WvrNVxG5^KDERo4E&dgj#1k3n1I_J>Uvey?=|L*skuc z5nGXrVa}#yUS5HLW0fQ*=-^pZQQDR7QKA z^ZY0ty***@s&AD%HflwaAI_*UQ5tmI45`qgWIY#pbA;~q4xNsUbAs+%(u?Q9V`C1FOm2vU4v$^kFTi1GYjJ@NdQr!Q zuoq#2Ry+wd&d?E&3C6IVzs=??dO~vo<(Ce=^42XfXD>izamo<=6iN z9$O`Q1Nu)npyxTVOn-c8 z{oiz)2Jc2RIl{u613eJ4qiRm5ZLlMR30Dr|*0v83zald&TQOe{26uI8e5a8WQoRDN h^YF<><(}@==8-cHic9fR|M#OL{4XvPaidTl0009BDSiL| From e78ac11c4f9d753cd594d9e0c5e95ce34d3d9e59 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 28 Jan 2026 22:03:30 -0600 Subject: [PATCH 56/77] refactor(ertp-ledgerguise): use escrow-ertp in design-doc test Replace inline makeEscrowHolder with makeErtpEscrow from escrow-ertp. Party.offer() builds EscrowParty for escrow-ertp. Add withCoordination utility for test observability. Fix Sealer type in types.ts. Co-Authored-By: Claude Opus 4.5 --- packages/ertp-ledgerguise/src/types.ts | 3 +- .../ertp-ledgerguise/test/design-doc.test.ts | 210 ++++++++---------- .../test/snapshots/design-doc.test.ts.md | 8 +- .../test/snapshots/design-doc.test.ts.snap | Bin 2532 -> 2532 bytes 4 files changed, 98 insertions(+), 123 deletions(-) diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index aa650cb..8f2954d 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -1,4 +1,5 @@ import type { IssuerKit } from './ertp-types.js'; +import type { Sealer } from './sealer.js'; import type { SqlDatabase } from './sql-db.js'; import type { Guid } from './guids.js'; import type { Zone } from './jessie-tools.js'; @@ -69,7 +70,7 @@ export type IssuerKitWithPurseGuids = IssuerKitWithGuid & { getGuid: (purse: unknown) => Guid; getGuidFromSealed: (sealedPurse: unknown) => Guid; }; - sealer: { seal: (purse: unknown) => unknown }; + sealer: Sealer; payments: PaymentAccess; mintInfo: MintInfoAccess; }; diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index e56678c..2ae6952 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -4,7 +4,8 @@ import type { TestFn } from 'ava'; import test from 'ava'; -import type { Brand, Issuer, NatAmount, Payment } from '../src/ertp-types.js'; +import type { Brand, DepositFacet, Issuer, NatAmount, Payment } from '../src/ertp-types.js'; +import { makeErtpEscrow, type EscrowParty } from '../src/escrow-ertp.js'; import { createIssuerKit, makeChartFacet, @@ -491,12 +492,22 @@ const splitColumns = [ 'reconcile_state', ]; -/** An offer describes what a party should give and how to deliver it. */ -type Offer = { give: NatAmount; resolve: (payment: Payment<'nat'>) => void }; +/** + * Tap a promise to signal when it resolves (for test observability). + */ +const withCoordination = (paymentP: Promise) => { + const { freeze } = Object; + const deposited = Promise.withResolvers(); + const observed = paymentP.then(p => { + deposited.resolve(); + return p; + }); + return freeze({ promise: observed, deposited: deposited.promise }); +}; /** * Factory for a party (Alice or Bob) with encapsulated purses. - * When run(offer) is called, the party decides to accept and fund accordingly. + * Party can create EscrowParty offers for escrow-ertp. */ const makeParty = ( moolaIssuer: Issuer<'nat'>, @@ -516,72 +527,38 @@ const makeParty = ( getSealedStock: () => stockSealer.seal(stock), getMoolaDeposit: () => moola.getDepositFacet(), getStockDeposit: () => stock.getDepositFacet(), - getBalances: () => ({ moola: moola.getCurrentAmount(), stock: stock.getCurrentAmount() }), - // Party decides to participate by accepting the offer - run: async (offer: Offer) => { - const purse = offer.give.brand === moolaBrand ? moola : stock; - offer.resolve(purse.withdraw(offer.give)); - }, - }); -}; - -/** - * Factory for escrow holder with encapsulated purses. - * Escrow owns its purses; parties deliver payments via Promise resolvers. - * When run() is called, escrow awaits payments and settles. - */ -const makeEscrowHolder = ( - moolaIssuer: Issuer<'nat'>, - stockIssuer: Issuer<'nat'>, - moolaSealer: Sealer, - stockSealer: Sealer, - terms: { - aliceGives: NatAmount; - bobGives: NatAmount; - }, - settlement: { - aliceGetsStockAt: { receive: (p: Payment<'nat'>) => NatAmount }; - bobGetsMoolaAt: { receive: (p: Payment<'nat'>) => NatAmount }; - }, -) => { - const { freeze } = Object; - const moola = moolaIssuer.makeEmptyPurse(); - const stock = stockIssuer.makeEmptyPurse(); - - // Payment delivery promises (parties resolve these) - const moolaPayment = Promise.withResolvers>(); - const stockPayment = Promise.withResolvers>(); - - // Deposit completion promises (for test observability - resolve to void, not Payment) - const moolaDeposited = Promise.withResolvers(); - const stockDeposited = Promise.withResolvers(); - - return freeze({ - getSealedMoola: () => moolaSealer.seal(moola), - getSealedStock: () => stockSealer.seal(stock), - getMoolaResolver: () => moolaPayment.resolve, - getStockResolver: () => stockPayment.resolve, - // Coordination facet for test observability (no authority leaked) - getCoordination: () => - freeze({ - moolaDeposited: moolaDeposited.promise, - stockDeposited: stockDeposited.promise, - }), - // Escrow awaits payments, deposits, and settles - run: async () => { - await Promise.all([ - moolaPayment.promise.then(p => { - moola.deposit(p); - moolaDeposited.resolve(); - }), - stockPayment.promise.then(p => { - stock.deposit(p); - stockDeposited.resolve(); - }), - ]); - // Settle: Alice gets stock, Bob gets moola - settlement.aliceGetsStockAt.receive(stock.withdraw(terms.bobGives)); - settlement.bobGetsMoolaAt.receive(moola.withdraw(terms.aliceGives)); + getBalances: () => + freeze({ moola: moola.getCurrentAmount(), stock: stock.getCurrentAmount() }), + + /** + * Build an EscrowParty for escrow-ertp. + * Returns { party, run, deposited } - call run() when party decides to fund. + */ + offer: ( + giveAmt: NatAmount, + wantAmt: NatAmount, + wantDeposit: DepositFacet<'nat'>, + ) => { + const payment = Promise.withResolvers>(); + const coord = withCoordination(payment.promise); + const givePurse = giveAmt.brand === moolaBrand ? moola : stock; + const refundDeposit = + giveAmt.brand === moolaBrand + ? moola.getDepositFacet() + : stock.getDepositFacet(); + + return freeze({ + party: freeze({ + give: coord.promise, + want: wantAmt, + payouts: freeze({ refund: refundDeposit, want: wantDeposit }), + cancellationP: new Promise(() => {}), + }) as EscrowParty<'nat', 'nat'>, + run: async () => { + payment.resolve(givePurse.withdraw(giveAmt)); + }, + deposited: coord.deposited, + }); }, }); }; @@ -652,40 +629,31 @@ serial('Escrow exchange (AMIX-style state machine)', async t => { }; // === AMIX STATE: Agreement === - // Create parties first - they don't know about escrow yet - const alice = makeParty( - moola.issuer, - stock.issuer, - moola.sealer as Sealer, - stock.sealer as Sealer, - ); - const bob = makeParty( - moola.issuer, - stock.issuer, - moola.sealer as Sealer, - stock.sealer as Sealer, - ); - - // Create escrow with terms and settlement destinations - const escrow = makeEscrowHolder( - moola.issuer, - stock.issuer, - moola.sealer as Sealer, - stock.sealer as Sealer, - { aliceGives: moolaAmt(10n), bobGives: stockAmt(1n) }, - { - aliceGetsStockAt: alice.getStockDeposit(), - bobGetsMoolaAt: bob.getMoolaDeposit(), - }, - ); + // Create parties + const parties = { + alice: makeParty( + moola.issuer, + stock.issuer, + moola.sealer, + stock.sealer, + ), + bob: makeParty( + moola.issuer, + stock.issuer, + moola.sealer, + stock.sealer, + ), + }; - // Define offers - what each party gives and how to deliver it - const aliceOffer: Offer = { give: moolaAmt(10n), resolve: escrow.getMoolaResolver() }; - const bobOffer: Offer = { give: stockAmt(1n), resolve: escrow.getStockResolver() }; + // Create escrow using escrow-ertp + const escrow = makeErtpEscrow({ + issuers: { A: moola.issuer, B: stock.issuer }, + sealers: { A: moola.sealer, B: stock.sealer }, + }); - // Place all purses in the chart - for (const [name, party] of Object.entries({ Alice: alice, Bob: bob })) { - const parentGuid = parentGuids[name.toLowerCase() as keyof typeof parentGuids]; + // Place party purses in chart + for (const [name, party] of Object.entries(parties)) { + const parentGuid = parentGuids[name as keyof typeof parentGuids]; charts.moola.placePurse({ sealedPurse: party.getSealedMoola(), name: 'Moola', @@ -699,14 +667,17 @@ serial('Escrow exchange (AMIX-style state machine)', async t => { accountType: 'STOCK', }); } + + // Place escrow purses in chart + const sealedEscrow = escrow.getSealedPurses(); charts.moola.placePurse({ - sealedPurse: escrow.getSealedMoola(), + sealedPurse: sealedEscrow.A, name: 'Moola', parentGuid: parentGuids.escrow, accountType: 'ASSET', }); charts.stock.placePurse({ - sealedPurse: escrow.getSealedStock(), + sealedPurse: sealedEscrow.B, name: 'Stock', parentGuid: parentGuids.escrow, accountType: 'STOCK', @@ -717,10 +688,16 @@ serial('Escrow exchange (AMIX-style state machine)', async t => { tracker.getNewSplits(); // Clear any setup splits // Fund parties' purses (they receive assets from elsewhere) - alice.getMoolaDeposit().receive(moola.mint.mintPayment(moolaAmt(10n))); - bob.getStockDeposit().receive(stock.mint.mintPayment(stockAmt(1n))); + parties.alice.getMoolaDeposit().receive(moola.mint.mintPayment(moolaAmt(10n))); + parties.bob.getStockDeposit().receive(stock.mint.mintPayment(stockAmt(1n))); tracker.getNewSplits(); // Clear funding splits + // Build offers - A gives moola, wants stock; B gives stock, wants moola + const offers = freeze({ + A: parties.alice.offer(moolaAmt(10n), stockAmt(1n), parties.alice.getStockDeposit()), + B: parties.bob.offer(stockAmt(1n), moolaAmt(10n), parties.bob.getMoolaDeposit()), + }); + t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), `Escrow follows the AMIX state machine (American Information Exchange, 1984). @@ -732,14 +709,12 @@ No ledger changes yet.`, ); // === AMIX STATE: Funding === - // Escrow starts waiting for payments - const escrowDone = escrow.run(); - - const coord = escrow.getCoordination(); + // Start the exchange - escrow waits for payments + const exchangeP = escrow.escrowExchange(offers.A.party, offers.B.party); - // Alice decides to fund - await alice.run(aliceOffer); - await coord.moolaDeposited; + // Parties fund in any order (sequential here for observable intermediate states) + await offers.A.run(); + await offers.A.deposited; t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), `STATE: Alice Funds (first mover) @@ -747,9 +722,8 @@ Alice accepts her offer and funds escrow with 10 Moola. Escrow now holds moola; still waiting for Bob.`, ); - // Bob decides to fund - await bob.run(bobOffer); - await coord.stockDeposited; + await offers.B.run(); + await offers.B.deposited; t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), `STATE: Bob Funds (second mover) @@ -757,8 +731,8 @@ Bob accepts his offer and funds escrow with 1 Stock. Both parties funded - escrow settles.`, ); - // Await settlement - await escrowDone; + // Settlement + await exchangeP; t.snapshot( toRowStrings(tracker.getNewSplits(), splitColumns), `STATE: Settlement diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md index 9946571..303b73d 100644 --- a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md @@ -146,8 +146,8 @@ Generated by [AVA](https://avajs.dev). [ 'tx_guid | account | value_num | value_denom | reconcile_state', - '000000000017 | Alice:Stock | 1 | 1 | c ', - '000000000017 | Escrow:Stock | -1 | 1 | c ', - '00000000001a | Bob:Moola | 10 | 1 | c ', - '00000000001a | Escrow:Moola | -10 | 1 | c ', + '000000000017 | Bob:Moola | 10 | 1 | c ', + '000000000017 | Escrow:Moola | -10 | 1 | c ', + '00000000001a | Alice:Stock | 1 | 1 | c ', + '00000000001a | Escrow:Stock | -1 | 1 | c ', ] diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap index da19df6bb568c30cb8b83291071aef21ba82e050..266ded3ecfb1b7355f431272244ed37c850af31f 100644 GIT binary patch delta 145 zcmV;C0B--}6XX*zK~_N^Q*L2!b7*gLAa*kf0|2ReJ=m0l#LgY|-EUua5*4Y_VgEqU z#G22ru(Ge+4ZN{3T?thptOa4=BFs89tQ+%`y|5N6FEY$4ktv{f0ldsr0ZqdVAf6lH z1rVPWK%8ZgLRCi8f#p_P6L%^VBTTro7_~PYZrzA{r}7cA0l|L&>sR;eQyl;R{zpET delta 145 zcmV;C0B--}6XX*zK~_N^Q*L2!b7*gLAa*kf0|4Pz;L`gt`$dwvh1;6br(zr!r{A+m z#3UW*QKL%mT-mWQT?ti+vPEDou=}Tmbz?rP7sku-BE!4@Vj(eb5iOXj0-A;!B6Du_ zDuDR30OBl@6sj_!4lLh?*2JAk#RwBFEk^B4hg&xypEn;d8xZ^lvoaiTQyl;RlbSvA From f56e7fd97d917c0d7abfd7f07de0dfdd8012d757 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 28 Jan 2026 22:07:36 -0600 Subject: [PATCH 57/77] fix(ertp-ledgerguise): filter hold splits in withdraw test Show only reconcile_state='n' splits to match prose about hold splits. Previously showed all splits including earlier mint/deposit. Co-Authored-By: Claude Opus 4.5 --- .../ertp-ledgerguise/test/design-doc.test.ts | 8 ++++---- .../test/snapshots/design-doc.test.ts.md | 5 +---- .../test/snapshots/design-doc.test.ts.snap | Bin 2532 -> 2491 bytes 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index 2ae6952..0d9d1c5 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -396,12 +396,13 @@ serial('Withdraw creates a hold', t => { .all() .map(shortGuids()) .map(shortDates()); - const splitRows = db + const holdSplits = db .prepare<[], SplitEntry & { account_name: string }>( ` SELECT splits.guid, splits.tx_guid, splits.account_guid, accounts.name AS account_name, splits.value_num, splits.value_denom, splits.reconcile_state FROM splits JOIN accounts ON splits.account_guid = accounts.guid + WHERE splits.reconcile_state = 'n' ORDER BY splits.guid `, ) @@ -410,12 +411,11 @@ serial('Withdraw creates a hold', t => { t.snapshot( toRowStrings(txRows, ['guid', 'num', 'post_date', 'enter_date']), `Withdraw removes value from the purse by creating a new hold transaction, in addition to the earlier mint/deposit transaction. -The split table shows the line items for that new transaction. The hold keeps value in a dedicated holding account until deposit or cancel.`, ); t.snapshot( - toRowStrings(splitRows, ['guid', 'tx_guid', 'account_guid', 'account_name', 'value_num', 'value_denom', 'reconcile_state']), - 'Hold splits show the value leaving the purse and landing in the holding account.', + toRowStrings(holdSplits, ['guid', 'tx_guid', 'account_guid', 'account_name', 'value_num', 'value_denom', 'reconcile_state']), + `Hold splits (reconcile_state='n') show value leaving the purse and landing in the holding account.`, ); }); diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md index 303b73d..6c799fb 100644 --- a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md @@ -89,7 +89,6 @@ Generated by [AVA](https://avajs.dev). ## Withdraw creates a hold > Withdraw removes value from the purse by creating a new hold transaction, in addition to the earlier mint/deposit transaction. -> The split table shows the line items for that new transaction. > The hold keeps value in a dedicated holding account until deposit or cancel. [ @@ -98,12 +97,10 @@ Generated by [AVA](https://avajs.dev). '000000000005 | 00:00.2 | 2026-01-25 | 2026-01-25', ] -> Hold splits show the value leaving the purse and landing in the holding account. +> Hold splits (reconcile_state='n') show value leaving the purse and landing in the holding account. [ 'guid | tx_guid | account_guid | account_name | value_num | value_denom | reconcile_state', - '000000000003 | 000000000002 | 000000000001 | Alice | 5 | 1 | c ', - '000000000004 | 000000000002 | e843dce22274 | BUCKS Mint Holding | -5 | 1 | c ', '000000000006 | 000000000005 | e843dce22274 | BUCKS Mint Holding | 2 | 1 | n ', '000000000007 | 000000000005 | 000000000001 | Alice | -2 | 1 | n ', ] diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap index 266ded3ecfb1b7355f431272244ed37c850af31f..51d2cb8924f25f0fc289f50f7d762ae21aeb6b03 100644 GIT binary patch literal 2491 zcmV;s2}JfmRzVTFuEFVHdfn=v73yslri>B+Q~ZcVq4bW8TMj()j$IO!v5nKp5Z>co3*mS|Nup(rT!AvJD*i!a^*L5Pp=3;0Pu3 zQwx1=FoZ;D1SP?09ttaz!|(&|aYqVMg$fB3{r1cMk)L_bE@k1?=XNfE&N zVi;LN^I8?Ccs9Hoj8dh;2yDbHj1dAZK_sIX6OqeIj400JeAg%`z`mv9>reuVek?E_(( z*Bn2twYJN_nT^}|Cq50|Peyj~gq}BB+n#qADYrlZy8)}xAOdA0)L?l(MtY=r-g@p} zITr|NP+O9PKqZL^g`I#_V`w@bT5bger`*=iLXJ^S-mUGC@x67JcWh?76gOvkptRdR ziQ|G(nc|;(tB@UoBd$q!9W^CSgdEP~{}%-ZzrIZWUtL)LKdkFNPY_PKrZD0fXOt`$ zY9}M4moX2J_6PL>2S2Q_tbO`LL*{4RIXKuqoZYtT{5biW+e8YM0j{yOmr6{#gF7%Ll_m~w15(+wJVB^5 z4xvvH?DCQCJ(X6(#FQcNt-ws?fYW-2F&v_%;0H=;46Ms^YQ#TI5v8dH+~S>fXNv|M96sKAuoNQ;TK$M)u+hQJR_A8F57Rt1yVC3Zoa!|Qp3DAf zX}_lS75hKP733oJiyZK$!^p{9%40BS(-DlgF=*fgg#9(}eIH&DY62xCVaZh%i*?CU zLk?s@8K^i-WR4|n!B8ZNp=(9aGmqblO{D##vKbg>8lS;2llMLPf0qYnn-v!`ji*<> z13@O}FTfy=F?4r5I1<)(548JfI?ZgYx!HPf%^~92%%Jxq&e%Ome5nj68|5%8#hBJ& zh`l_6Er~r1vJo`VANp(XSPwfrH$jUEEX*APtEdzeAxbL-g3?Pl*I3wy@@b6xh`gZt zQ1da5fu}Z7TG&a+;?3Pu%vW2HK+Sa!kx}}zN{-zBC9GZvE3AI=4rAE*U%Eq}c|}W$f}Y zW1BFAo7tZ2pNvov<sEo225sn21 zhXz*wR?v}ajPLE_a3?SsXc7$8T>RDmZQ!>6r8667Wz4#n7@IXnIMkeKJm0ar;6>?6 zv(tj1R_O?WNW`H=xlKeIR7SL0uDpdlkGTve{d|i3S8t|pjyby&IRE0Cj$!%Z`Z*{7W{7Yqs_USyaxPBxnUZqFEaH`H`D5V z-my3VcJ;V}Mx}9Hqjbo_?0f<8ZVI`M1!`AgzFW5NvyZY=;Y=MNj*7|25`-9v!1YM= zK09?KVqs2cO1A;VWyAf4Wug5eW9-I-8}6eEHQdE*rL_AhUHDN=fodT>yIz_?x8nPJ z%Pi+hsRck)C*N8kcJujSNwGPF_3rHdsgvhe?33U5!3#8NyL0=xyxz(>`3xj6I+dt) z?J|UzOSkmA&ae09MLF@EeG^cJi6=qC&8xE5;$UP!h=XiY|W(OSGjcj zyn?TlHO5%?EXiopado=@QVE)iAf-qzZ{@2Ps5n;RthS#%8uJ-1J~)s4+Xf`}-%K!re66Vfuf7*5)UBO{HPa@i2Dw zTfXNV9PS+MSHAb2aBZnxqex*90b#5Uj|T(PSsNPSKu8Q-S0|N)3A#cQM;1fhd!&j6 zF!RvR`;z*1mQnvx#@IhEtm^lcbN#E+`d)=PC3kucm5RAzO{e`D)|_>kRyUlXBezTy z3T^!V)L*G2dow<+ufnggMYbth=LG{oa99!BMV=opXlZ)Yxv!Vw>5n8arQX zf0oB~SM`g?8d_RdgqB{EffeTTz=Ctb_jVPvVL8WX9EPx73^h(GOc~C9SHgMadyKJN z#@KHeV_!1H-fJ-S`?Iq3<^M@oxAL&&goTSR>(sDrEmHQvTClpzFfT!M$88I{{^D^dXOU= F002dI#e4t& literal 2532 zcmVsMZ(ny36{*u<|3J~in$NJX zvaj6@ydR4Q00000000BkSW9ml#}V!!CD|S%5DW*%C5M85z`FrC-d&NRvWxgulV`>Lv64hM+}56q{ZqZKy6@dF_(a2Y{_V`YRDM)I+Vl{LTo zJc_vGAAYgS-e7cjZ+goe#@G$USjHH8$Gh^jcX>-|KJ~ov-_@&EnddWaiFsdR?|4h> z8{RVWF2C&sqfA6lUdJG_)cuZ?vCkrIk#100)b6hM-1DmMJF}|?$I$8YI~_QNUZ;0s zwbNbgt(~~Rgby&8dSBd?*$y``2m@RK4?~qnE93~qT8%VMH-W=ISV+VH!jCc$9-xFl zW?{e$Mvy9vpd?t$BVmP-Jb_4Mg9KMmT0N~<4E)^>_8+^6V3^>M7$gY035HfHDMI)_ zjACnOUaLZt%!XHkQL1bdgN?a`2|~yvh;*D_iqe9x&JQ&PH3Sajx+q5EYT*0tqkY#v zN)cU$?I%0;_v(=a8)FJWS_K@&nKrmWk0cmGh}FbR`>p|vL-H9T5RwK|Gu_?}{QX!M z2sLtx29!kF7ioA%JL4v^69s0R2y0d#Rfn|Ehdjv;hFYc0obxYMNks38-OJsgx6ZL3 zhu%-TPiok^w8j|gGsa#r#@_PIz~6Ece@`3uvq#TnPmW7R@@L1n&(8>><^Kq!qC1VD zlA%cOnX!v-`m~1A>kg+4*j85;j$ys#Q5T?g7s83FoM&m#JZtmw;LWw`QHZ@>Z-d^h zuAg(Bk~e?eb3p`?BLj;lrs@#;F7UZp9AYDMRYVC4G*04(yKySBgxps_An^SiB`qG= zJ`8Y3w4>C_|6i0G{Q4sOe|cg3|EQ_|JViL|I)*XVIHP3A zP&*wXy-awBv_GilIQUV6Wu4P68gg>xt-Zb7{n>4&$&aJIxJ{&B8Q>Zldl_dbm#ae_ zQtW7jtKF!N;%Gna2N#=g%O`yFHKpNz4eo~7NFn%H@G4(yzS%f;~WumOgx zM1;)=jsZ6iyEl2a)7_v!d;5=e?k~j1oK`>N7_N1(yV1Qd7{GCnn_cPkK|%Ef1kYuE zxw79-`zm+=G)+H4GCZVVcD4$)u*f*^nwgql!ENmz1~#e7}z z#E=8IP=+eWQdwY$TQC&Ka_CA~^qjt4yc%(<&zMG&;1r`>LfmKwBiU_3@LqX}Knrk9#O!+iHen4K( zeWdw>C%`isD=qA_V)6QRCQepcu|Umr7?V-@v`&t~{{^gGifXKW^EPAbhm5h`FvkAI z80&b9z3>?OlgHRMm(F1L8%>69HW(hN2`Q)+1wkoHX0Oxr|+2 zWNaOd;YPk^yGLV`MEUdV*_B1cZjiBj&+aG{&F|UzV(}5V_!Ju83M?vWQYxdYMubDb z!J)wwfHia!8WZ?i1>6Zt23iDz6&Jr1KpO^aKo`E0DtLYrwM{c^A@K-sF{x$VjI3;YVXT44teIN1&R`HuR;(|gUDRg4;<3dELT9oHC`rL`YzZZ37&lzK1 zo>djjb!DA}rveu_7pNC^~t~-!#hndl7*mG|7iWhO$kxI+A)pP7@20Pn~U|J zXjz;ByMo+dqt-dEP(I{Qe!u`lJB3^)0<|kL->Z7~*+)gLpf;_b2lZ-smPmv|5EfHY zGy>eZiRV6do*W>KOW(;6h%geN>#>@Bdge;Z(i^2IU5A*I4g1m`YS6gyJ;vDfe~Z7b z7-O3rV}JA*TR$r`Ty8?-;6jaid0Q(HU#FWtXbAQk*v_gOU#G>dPkwfbzo6*5K;J)? zs_K*9m{;ucOx}Ct%H`t8FD;sUV?nw&$F{HbX8%u}yy)m2li$VBRrAy%L8q$qQw|wH z!lhei(HAw(Gs^PoJG&;NjvSA|n9C7DYwN+i4_A$y5@iW>kn%7V65BJW{Z%2gKd7E51& z?ssplwFBRMnW_jAGusz#`mi<9m>+lk_0!MbPL}U5{og}ti<8in(y-%nCvo=Mf$#6_ zZ|(2azV{zTL4%qAd6sW9;u2&VqLrYuf9}*WDUXDyH-wD3x%>k#6S|963vxnuc?96qc#tKBw#y z;oKsFhR{Mi<_p8(#$3^)uZLI9CF{fUQ({)-{mQ z^Gz^TBneEoaA}#6|B(KNw^0dyM`5 ztRtzps^otX){P>p1!3VL%sMr!8}pRCuof&YGR!NHDWG@(yv$VrO~VZ!o*Ur>5T6!6 uoMn Date: Wed, 28 Jan 2026 22:09:43 -0600 Subject: [PATCH 58/77] style(ertp-ledgerguise): right-justify numeric columns in snapshots Detect columns where all values match /^-?\d+$/ and use padStart instead of padEnd for cleaner table alignment. Co-Authored-By: Claude Opus 4.5 --- .../ertp-ledgerguise/test/design-doc.test.ts | 15 ++++-- .../test/snapshots/design-doc.test.ts.md | 44 +++++++++--------- .../test/snapshots/design-doc.test.ts.snap | Bin 2491 -> 2488 bytes 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index 0d9d1c5..88f77b8 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -125,12 +125,21 @@ const toRowStrings = ( ...rows.map(row => String(row[column] ?? '').length), ), ); - const format = (row: Record) => + // Right-justify columns where all values are numeric + const isNumeric = columns.map(column => + rows.every(row => /^-?\d+$/.test(String(row[column] ?? ''))), + ); + const format = (row: Record, isHeader = false) => columns - .map((column, index) => String(row[column] ?? '').padEnd(widths[index])) + .map((column, index) => { + const val = String(row[column] ?? ''); + return isNumeric[index] && !isHeader + ? val.padStart(widths[index]) + : val.padEnd(widths[index]); + }) .join(' | '); const header = Object.fromEntries(columns.map(column => [column, column])); - return [format(header), ...rows.map(format)]; + return [format(header, true), ...rows.map(row => format(row))]; }; // #endregion diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md index 6c799fb..76befc9 100644 --- a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md @@ -30,8 +30,8 @@ Generated by [AVA](https://avajs.dev). [ 'guid | tx_guid | account_guid | value_num | value_denom | reconcile_state', - '000000000003 | 000000000002 | 000000000001 | 5 | 1 | c ', - '000000000004 | 000000000002 | e843dce22274 | -5 | 1 | c ', + '000000000003 | 000000000002 | 000000000001 | 5 | 1 | c ', + '000000000004 | 000000000002 | e843dce22274 | -5 | 1 | c ', ] ## ERTP is separate from naming @@ -42,7 +42,7 @@ Generated by [AVA](https://avajs.dev). [ 'guid | name | parent_guid | account_type | placeholder', - '000000000001 | 00000000000000000000000000000001 | | ASSET | 0 ', + '000000000001 | 00000000000000000000000000000001 | | ASSET | 0', ] ## Giving names in the chart of accounts @@ -57,9 +57,9 @@ Generated by [AVA](https://avajs.dev). [ 'guid | name | parent_guid | account_type | placeholder', - '000000000001 | Alice | e7ee18a10171 | STOCK | 0 ', - 'aec41e1716bb | BUCKS Mint Recovery | | STOCK | 0 ', - 'e843dce22274 | BUCKS Mint Holding | | STOCK | 0 ', + '000000000001 | Alice | e7ee18a10171 | STOCK | 0', + 'aec41e1716bb | BUCKS Mint Recovery | | STOCK | 0', + 'e843dce22274 | BUCKS Mint Holding | | STOCK | 0', ] ## Building account hierarchies with placeholder parents @@ -78,12 +78,12 @@ Generated by [AVA](https://avajs.dev). [ 'guid | code | name | parent_guid | placeholder', - '000000000001 | 1000 | Assets | e7ee18a10171 | 1 ', - '000000000002 | 1100 | Bank | 000000000001 | 1 ', - '000000000003 | 1110 | Checking | 000000000002 | 0 ', - '000000000004 | 1120 | Savings | 000000000002 | 0 ', - '000000000005 | 6000 | Expenses | e7ee18a10171 | 1 ', - '000000000006 | 6100 | Food | 000000000005 | 0 ', + '000000000001 | 1000 | Assets | e7ee18a10171 | 1', + '000000000002 | 1100 | Bank | 000000000001 | 1', + '000000000003 | 1110 | Checking | 000000000002 | 0', + '000000000004 | 1120 | Savings | 000000000002 | 0', + '000000000005 | 6000 | Expenses | e7ee18a10171 | 1', + '000000000006 | 6100 | Food | 000000000005 | 0', ] ## Withdraw creates a hold @@ -101,8 +101,8 @@ Generated by [AVA](https://avajs.dev). [ 'guid | tx_guid | account_guid | account_name | value_num | value_denom | reconcile_state', - '000000000006 | 000000000005 | e843dce22274 | BUCKS Mint Holding | 2 | 1 | n ', - '000000000007 | 000000000005 | 000000000001 | Alice | -2 | 1 | n ', + '000000000006 | 000000000005 | e843dce22274 | BUCKS Mint Holding | 2 | 1 | n ', + '000000000007 | 000000000005 | 000000000001 | Alice | -2 | 1 | n ', ] ## Escrow exchange (AMIX-style state machine) @@ -124,8 +124,8 @@ Generated by [AVA](https://avajs.dev). [ 'tx_guid | account | value_num | value_denom | reconcile_state', - '000000000011 | Alice:Moola | -10 | 1 | c ', - '000000000011 | Escrow:Moola | 10 | 1 | c ', + '000000000011 | Alice:Moola | -10 | 1 | c ', + '000000000011 | Escrow:Moola | 10 | 1 | c ', ] > STATE: Bob Funds (second mover) @@ -134,8 +134,8 @@ Generated by [AVA](https://avajs.dev). [ 'tx_guid | account | value_num | value_denom | reconcile_state', - '000000000014 | Bob:Stock | -1 | 1 | c ', - '000000000014 | Escrow:Stock | 1 | 1 | c ', + '000000000014 | Bob:Stock | -1 | 1 | c ', + '000000000014 | Escrow:Stock | 1 | 1 | c ', ] > STATE: Settlement @@ -143,8 +143,8 @@ Generated by [AVA](https://avajs.dev). [ 'tx_guid | account | value_num | value_denom | reconcile_state', - '000000000017 | Bob:Moola | 10 | 1 | c ', - '000000000017 | Escrow:Moola | -10 | 1 | c ', - '00000000001a | Alice:Stock | 1 | 1 | c ', - '00000000001a | Escrow:Stock | -1 | 1 | c ', + '000000000017 | Bob:Moola | 10 | 1 | c ', + '000000000017 | Escrow:Moola | -10 | 1 | c ', + '00000000001a | Alice:Stock | 1 | 1 | c ', + '00000000001a | Escrow:Stock | -1 | 1 | c ', ] diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap index 51d2cb8924f25f0fc289f50f7d762ae21aeb6b03..1e9cece9349167dd16897d6d78df3836d36e0eac 100644 GIT binary patch literal 2488 zcmV;p2}kxpRzVOcnH$WWD-I) zA7mzBSqWv!-OujQbXR$+s>fq8kpQ9Pz6TCS9I_I3F3WBC1K`9Tzy*#R_soZ0^@rPS zC(bAbL|^Rgu735Z-tYH&@70UpAXdSV`Sf$N!p1nhC!_@~LkMxKjIhE;J~olE=9iy` zA-DX)FV@*xjIPGpjr9&=>>6V%WsJSoxbSY{{EpUq+GrI2E?&II8Xjw`vBuZfdyO^r zjmA1_oPW3Bk5Umrah-xp6Zbn-#y$KWE(gPgoRifA^a#6!4XOr zq!tF;U!KKutG?%bfcCP1 zgd%zsb|3HEJ*Y+&Y=j92X%%o7r`lkf9!W5W5UGiq_ObzuL-H9z5RwLzGu_D-NeM*p^opPD_8TR{jIfn*ipnVxF~S^K358gV#5&gaP(?y{*le z?TwZ56ukNCfeRv-3>lb5F;U0ZcY)8;;uve8DKMICFH&g0>0<%DQWS< z_F;fSq8$w_z&k9c@8%q;YWDK-QE?p zdCBqPQfs>$oY}aMf8x{d{bX#X59xWcwe5L_k#Y+pup6){4I)rBLJgJ=Vx&i^?``A` zmUDrS2DK$w2vm}&P}nJGHG!t{q2*RkaLR2BE#w&W^!?f%8QE>1E6Vr2Rp?z`>7dEbF}b>dujZX5KkC*gu@z&aO_zkCVT-O{8EM;2LXt8KnuA z8$%vY>}a9J_jcrz=s=pD#hN1Ktb9y4_~UI5Loh1AY*ZW*!Yw>LxCs+dY2pAkAeC+B z2|}fD2m_K}mydk!v9uy4ri_Sh1!gh_oYq5(;RrPaKTuj@U|ptDWBy5sU{&V0DWUT1 z+v2!fLXi%Fh-=5>VuB@@`LcqU^Vb<;-)D^djxqKx#@J6+Y4^E0cJ99hcIM%7HoV-g zfng^WL4AT#z%9h?b>8iCw`kD8;e)-qOEI#b)%Q6Dn_cW~b*~KuaGK|4S9(3lsa}KN zYuR5f?bp=4V*dxZf}F*Ekpup87&*C1c?R*_zaGjyzkNfTRcG9thktI zJiYQA2r@x`1_pVIp}XtDk+8mdpxsZ?X=bbKX6wTxhloovgWkh9WA`lar81;!l*6zT zV_J(L_VNt2B=$7OM$klm? zc|rG~<`W(RPi>^Mu+x&oS9en}Uu{JKHP=BzM(NWkIdcD(uzD@5u=?$rjIkdw#(u*X z`v+sJ(_rj*gRwt182jeh3WmQ`XZUuF;eiUVO7sPGzlzS=H9B`Yu2a}C2CZ2}<=NF; z;BM6z6;|D@Gq%g+QSRAGGf8)Ws8wTEoUtw$+lw%8aa<_lmazWZGGm+0SdWYyaMEl8 zuVw7~GGkOEUd#4u|747kDE~Tpc43*ZYh*0jvs+4qi+gr;x%h}od~ywN1r`-G36)V+ zBf_!Z;LzX-zzRBYjq$ym9PR`r15JWK+r_U9Xam0mD4p3rD`Pgy)Yz;+!ja}wEAmfpN-XNU{j5xUk;WzD4P{L zw>-D2v}X=wi|-%--9fIW&9S6xS&u-a-Ep`I2Vz!7UfxuzHlP&pJiRy zGsf7LtE$31J9z$U7D%z^)#5(5N)dZAync%+41e@1~IJSfF+_=KEy}Kl><470%QV;<%WcEJ28& z2waa;@3T`^A{OS9rgR%%TsGW)SQgqpGRCf)x#2!KQ^Q@{R!X}!>B5g{3RDa6>UwFW zNxg-ZSJRF zGY<{DFR6cX8TCJ7jQ#V>s(yPp*WaAhw=2{sxzoR=RLp0r*>E-0JZn~+rqvB+=*TUX z##S57>GNY%|-ZbEaM=wm-{b zyQ>C8WDPAXEJ8~!%D@Wq>cE0?!}oR-wP88OX&i>IQ4BRsD@+;Ae^TFuEFVHdfn=v73yslri>B+Q~ZcVq4bW8TMj()j$IO!v5nKp5Z>co3*mS|Nup(rT!AvJD*i!a^*L5Pp=3;0Pu3 zQwx1=FoZ;D1SP?09ttaz!|(&|aYqVMg$fB3{r1cMk)L_bE@k1?=XNfE&N zVi;LN^I8?Ccs9Hoj8dh;2yDbHj1dAZK_sIX6OqeIj400JeAg%`z`mv9>reuVek?E_(( z*Bn2twYJN_nT^}|Cq50|Peyj~gq}BB+n#qADYrlZy8)}xAOdA0)L?l(MtY=r-g@p} zITr|NP+O9PKqZL^g`I#_V`w@bT5bger`*=iLXJ^S-mUGC@x67JcWh?76gOvkptRdR ziQ|G(nc|;(tB@UoBd$q!9W^CSgdEP~{}%-ZzrIZWUtL)LKdkFNPY_PKrZD0fXOt`$ zY9}M4moX2J_6PL>2S2Q_tbO`LL*{4RIXKuqoZYtT{5biW+e8YM0j{yOmr6{#gF7%Ll_m~w15(+wJVB^5 z4xvvH?DCQCJ(X6(#FQcNt-ws?fYW-2F&v_%;0H=;46Ms^YQ#TI5v8dH+~S>fXNv|M96sKAuoNQ;TK$M)u+hQJR_A8F57Rt1yVC3Zoa!|Qp3DAf zX}_lS75hKP733oJiyZK$!^p{9%40BS(-DlgF=*fgg#9(}eIH&DY62xCVaZh%i*?CU zLk?s@8K^i-WR4|n!B8ZNp=(9aGmqblO{D##vKbg>8lS;2llMLPf0qYnn-v!`ji*<> z13@O}FTfy=F?4r5I1<)(548JfI?ZgYx!HPf%^~92%%Jxq&e%Ome5nj68|5%8#hBJ& zh`l_6Er~r1vJo`VANp(XSPwfrH$jUEEX*APtEdzeAxbL-g3?Pl*I3wy@@b6xh`gZt zQ1da5fu}Z7TG&a+;?3Pu%vW2HK+Sa!kx}}zN{-zBC9GZvE3AI=4rAE*U%Eq}c|}W$f}Y zW1BFAo7tZ2pNvov<sEo225sn21 zhXz*wR?v}ajPLE_a3?SsXc7$8T>RDmZQ!>6r8667Wz4#n7@IXnIMkeKJm0ar;6>?6 zv(tj1R_O?WNW`H=xlKeIR7SL0uDpdlkGTve{d|i3S8t|pjyby&IRE0Cj$!%Z`Z*{7W{7Yqs_USyaxPBxnUZqFEaH`H`D5V z-my3VcJ;V}Mx}9Hqjbo_?0f<8ZVI`M1!`AgzFW5NvyZY=;Y=MNj*7|25`-9v!1YM= zK09?KVqs2cO1A;VWyAf4Wug5eW9-I-8}6eEHQdE*rL_AhUHDN=fodT>yIz_?x8nPJ z%Pi+hsRck)C*N8kcJujSNwGPF_3rHdsgvhe?33U5!3#8NyL0=xyxz(>`3xj6I+dt) z?J|UzOSkmA&ae09MLF@EeG^cJi6=qC&8xE5;$UP!h=XiY|W(OSGjcj zyn?TlHO5%?EXiopado=@QVE)iAf-qzZ{@2Ps5n;RthS#%8uJ-1J~)s4+Xf`}-%K!re66Vfuf7*5)UBO{HPa@i2Dw zTfXNV9PS+MSHAb2aBZnxqex*90b#5Uj|T(PSsNPSKu8Q-S0|N)3A#cQM;1fhd!&j6 zF!RvR`;z*1mQnvx#@IhEtm^lcbN#E+`d)=PC3kucm5RAzO{e`D)|_>kRyUlXBezTy z3T^!V)L*G2dow<+ufnggMYbth=LG{oa99!BMV=opXlZ)Yxv!Vw>5n8arQX zf0oB~SM`g?8d_RdgqB{EffeTTz=Ctb_jVPvVL8WX9EPx73^h(GOc~C9SHgMadyKJN z#@KHeV_!1H-fJ-S`?Iq3<^M@oxAL&&goTSR>(sDrEmHQvTClpzFfT!M$88I{{^D^dXOU= F002dI#e4t& From 3bdc030c2e529ccbaa8916bc8c6e1a31101b0b22 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 28 Jan 2026 22:55:54 -0600 Subject: [PATCH 59/77] feat(ertp-ledgerguise): SettlementFacet consolidates stock trades - Add CommodityNamespace type ('CURRENCY' | 'COMMODITY') - SettlementFacet folds ERTP's separate transactions into one GnuCash stock-trade transaction with proper value/quantity - Derives exchange rate from transaction amounts - Sanity check ensures no live payments during consolidation - Custom description support for settlements - Test fixture: currency-moola-test.sql (verified in GnuCash GUI) GnuCash accepts non-ISO currencies (namespace='CURRENCY') for transaction valuation, enabling single-transaction commodity swaps. Co-Authored-By: Claude Opus 4.5 --- packages/ertp-ledgerguise/src/types.ts | 9 +- .../ertp-ledgerguise/test/design-doc.test.ts | 245 +++++++++++++++++- .../test/fixtures/currency-moola-test.sql | 63 +++++ .../test/snapshots/design-doc.test.ts.md | 20 ++ .../test/snapshots/design-doc.test.ts.snap | Bin 2488 -> 2810 bytes 5 files changed, 331 insertions(+), 6 deletions(-) create mode 100644 packages/ertp-ledgerguise/test/fixtures/currency-moola-test.sql diff --git a/packages/ertp-ledgerguise/src/types.ts b/packages/ertp-ledgerguise/src/types.ts index 8f2954d..166cd12 100644 --- a/packages/ertp-ledgerguise/src/types.ts +++ b/packages/ertp-ledgerguise/src/types.ts @@ -4,8 +4,15 @@ import type { SqlDatabase } from './sql-db.js'; import type { Guid } from './guids.js'; import type { Zone } from './jessie-tools.js'; +/** + * GnuCash commodity namespace. + * - 'CURRENCY': Used as transaction valuation currency (works with non-ISO mnemonics) + * - 'COMMODITY': Generic commodity, requires a currency for valuation + */ +export type CommodityNamespace = 'CURRENCY' | 'COMMODITY'; + export type CommoditySpec = { - namespace?: string; + namespace?: CommodityNamespace; mnemonic: string; fullname?: string; fraction?: number; diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index 88f77b8..f1584d4 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -92,13 +92,15 @@ const GUID_KEYS = [ ]; const DATE_KEYS = ['post_date', 'enter_date', 'reconcile_date']; +const shortGuid = (guid: string) => guid.slice(-12); + const shortGuids = (keys: string[] = GUID_KEYS) => (row: T): T => { const r = { ...row } as Record; for (const k of keys) { if (k in r && typeof r[k] === 'string') - r[k] = (r[k] as string).slice(-12); + r[k] = shortGuid(r[k] as string); } return r as T; }; @@ -580,18 +582,20 @@ serial('Escrow exchange (AMIX-style state machine)', async t => { const makeGuid = mockMakeGuid(); const now = makeTestClock(Date.UTC(2026, 0, 25, 0, 0), 1); - const makeKit = (mnemonic: string) => + const makeKit = (mnemonic: string, namespace: 'CURRENCY' | 'COMMODITY') => createIssuerKit( freeze({ db, - commodity: freeze({ namespace: 'COMMODITY', mnemonic }), + commodity: freeze({ namespace, mnemonic }), makeGuid, nowMs: now, }), ); - const moola = makeKit('Moola'); - const stock = makeKit('Stock'); + // Moola is CURRENCY (can be transaction valuation currency) + // Stock is COMMODITY (valued in terms of a currency) + const moola = makeKit('Moola', 'CURRENCY'); + const stock = makeKit('Stock', 'COMMODITY'); const moolaAmt = (v: bigint) => freeze({ brand: moola.brand, value: v }); const stockAmt = (v: bigint) => freeze({ brand: stock.brand, value: v }); @@ -749,4 +753,235 @@ Alice gets Stock (what she wanted); Bob gets Moola (what he wanted).`, ); }); +/** + * SettlementFacet consolidates multi-transaction settlements into one. + * Like ChartFacet names accounts, SettlementFacet creates proper GnuCash + * stock-trade transactions from ERTP settlements. + */ +const makeSettlementFacet = ({ + db, + currencyGuid, + makeSettlementRef, +}: { + db: ReturnType; + currencyGuid: Guid; + makeSettlementRef: () => string; +}) => { + const { freeze } = Object; + + const getMaxTxGuid = () => { + const row = db + .prepare<[], { max_guid: string | null }>( + 'SELECT MAX(guid) as max_guid FROM transactions', + ) + .get(); + return row?.max_guid ?? ''; + }; + + return freeze({ + /** + * Execute an async operation and consolidate created transactions. + * Folds commodity transactions into the currency transaction. + */ + settle: async ( + operation: () => Promise, + description?: string, + ) => { + const settlementRef = makeSettlementRef(); + const beforeGuid = getMaxTxGuid(); + const result = await operation(); + + // Find transactions created during operation + const newTxs = db + .prepare<[string], { guid: string; currency_guid: string }>( + 'SELECT guid, currency_guid FROM transactions WHERE guid > ?', + ) + .all(beforeGuid); + + if (newTxs.length < 2) { + // Nothing to consolidate + return freeze({ result, settlementRef, txGuid: newTxs[0]?.guid }); + } + + // Currency transaction is the survivor + const currencyTx = newTxs.find(tx => tx.currency_guid === currencyGuid); + const otherTxs = newTxs.filter(tx => tx.guid !== currencyTx?.guid); + + if (!currencyTx) { + throw new Error('No currency transaction found to consolidate into'); + } + + // Get the exchange rate from the currency transaction + // (sum of positive values = total currency amount in the trade) + const currencyTotal = db + .prepare<[string], { total: string }>( + `SELECT SUM(value_num) as total FROM splits + WHERE tx_guid = ? AND value_num > 0`, + ) + .get(currencyTx.guid); + const currencyAmount = BigInt(currencyTotal?.total ?? '0'); + + // Sanity check: only consolidate cleared transactions (no live payments) + const pendingSplits = db + .prepare<[string], { count: number }>( + `SELECT COUNT(*) as count FROM splits + WHERE tx_guid IN (${newTxs.map(() => '?').join(',')}) + AND reconcile_state != 'c'`, + ) + .get(...newTxs.map(tx => tx.guid)); + if (pendingSplits && pendingSplits.count > 0) { + throw new Error('Cannot consolidate: found pending (non-cleared) splits'); + } + + // Move splits from other transactions, updating value to currency terms + for (const tx of otherTxs) { + // Get the commodity amount (sum of positive quantities) + const commodityTotal = db + .prepare<[string], { total: string }>( + `SELECT SUM(quantity_num) as total FROM splits + WHERE tx_guid = ? AND quantity_num > 0`, + ) + .get(tx.guid); + const commodityAmount = BigInt(commodityTotal?.total ?? '1'); + + // Exchange rate: how much currency per commodity unit + const rate = currencyAmount / commodityAmount; + + // Update splits: value = quantity * rate (in currency terms) + db.prepare( + `UPDATE splits SET + tx_guid = ?, + value_num = quantity_num * ?, + value_denom = quantity_denom + WHERE tx_guid = ?`, + ).run(currencyTx.guid, rate.toString(), tx.guid); + + db.prepare('DELETE FROM transactions WHERE guid = ?').run(tx.guid); + } + + // Mark the consolidated transaction + if (description) { + db.prepare( + 'UPDATE transactions SET num = ?, description = ? WHERE guid = ?', + ).run(settlementRef, description, currencyTx.guid); + } else { + db.prepare('UPDATE transactions SET num = ? WHERE guid = ?').run( + settlementRef, + currencyTx.guid, + ); + } + + return freeze({ result, settlementRef, txGuid: currencyTx.guid }); + }, + }); +}; + +serial('Settlement links transactions (SettlementFacet)', async t => { + const { freeze } = Object; + const { db, close } = makeTestDb(); + t.teardown(close); + + const makeGuid = mockMakeGuid(); + const now = makeTestClock(Date.UTC(2026, 0, 26, 0, 0), 1); + + const makeKit = (mnemonic: string, namespace: 'CURRENCY' | 'COMMODITY') => + createIssuerKit( + freeze({ + db, + commodity: freeze({ namespace, mnemonic }), + makeGuid, + nowMs: now, + }), + ); + + const moola = makeKit('Moola', 'CURRENCY'); + const stock = makeKit('Stock', 'COMMODITY'); + + const moolaAmt = (v: bigint) => freeze({ brand: moola.brand, value: v }); + const stockAmt = (v: bigint) => freeze({ brand: stock.brand, value: v }); + + // Create parties with purses + const parties = { + alice: makeParty(moola.issuer, stock.issuer, moola.sealer, stock.sealer), + bob: makeParty(moola.issuer, stock.issuer, moola.sealer, stock.sealer), + }; + + // Create escrow + const escrow = makeErtpEscrow({ + issuers: { A: moola.issuer, B: stock.issuer }, + sealers: { A: moola.sealer, B: stock.sealer }, + }); + + // Fund parties + parties.alice.getMoolaDeposit().receive(moola.mint.mintPayment(moolaAmt(10n))); + parties.bob.getStockDeposit().receive(stock.mint.mintPayment(stockAmt(1n))); + + // Build offers + const offers = freeze({ + A: parties.alice.offer( + moolaAmt(10n), + stockAmt(1n), + parties.alice.getStockDeposit(), + ), + B: parties.bob.offer( + stockAmt(1n), + moolaAmt(10n), + parties.bob.getMoolaDeposit(), + ), + }); + + // SettlementFacet consolidates settlement into one GnuCash transaction + let refCounter = 0; + const settlement = makeSettlementFacet({ + db, + currencyGuid: moola.commodityGuid, + makeSettlementRef: () => `SETTLE-${String(++refCounter).padStart(4, '0')}`, + }); + + // Start exchange - parties fund + const exchangeP = escrow.escrowExchange(offers.A.party, offers.B.party); + await offers.A.run(); + await offers.B.run(); + + // SettlementFacet consolidates the ERTP deposits into one GnuCash transaction + const { settlementRef, txGuid } = await settlement.settle( + () => exchangeP, + 'Alice buys 1 Stock from Bob for 10 Moola', + ); + + // Query the consolidated transaction and its splits + const tx = db + .prepare<[string], { guid: string; num: string; description: string }>( + 'SELECT guid, num, description FROM transactions WHERE guid = ?', + ) + .get(txGuid!)!; + + const splits = db + .prepare< + [string], + { account_guid: string; value_num: string; quantity_num: string } + >( + `SELECT s.account_guid, s.value_num, s.quantity_num + FROM splits s WHERE s.tx_guid = ? ORDER BY s.value_num DESC`, + ) + .all(txGuid!) + .map(shortGuids(['account_guid'])); + + t.snapshot( + { + transaction: `${shortGuid(tx.guid)} | ${tx.num} | ${tx.description}`, + splits: toRowStrings(splits, ['account_guid', 'value_num', 'quantity_num']), + }, + `SettlementFacet consolidates ERTP settlements into one GnuCash transaction. +Like ChartFacet names accounts, SettlementFacet handles GnuCash stock-trade format. + +ERTP escrow creates separate transactions per commodity. SettlementFacet folds +them into one transaction with 4 splits - proper GnuCash stock-trade format. +Value is in currency (Moola); quantity is in account commodity.`, + ); + + t.is(settlementRef, 'SETTLE-0001'); + t.is(splits.length, 4, 'Consolidated transaction has 4 splits'); +}); + test.todo('Multi-commodity swaps: show ledger rows for two brands'); diff --git a/packages/ertp-ledgerguise/test/fixtures/currency-moola-test.sql b/packages/ertp-ledgerguise/test/fixtures/currency-moola-test.sql new file mode 100644 index 0000000..38080ba --- /dev/null +++ b/packages/ertp-ledgerguise/test/fixtures/currency-moola-test.sql @@ -0,0 +1,63 @@ +-- Test: Can GnuCash GUI handle a commodity used as transaction currency? +-- This creates a single-transaction Moola↔Stock swap. + +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; + +-- Schema (minimal) +CREATE TABLE gnclock ( Hostname varchar(255), PID int ); +CREATE TABLE versions(table_name text(50) PRIMARY KEY NOT NULL, table_version integer NOT NULL); +INSERT INTO versions VALUES('Gnucash',4000008); +INSERT INTO versions VALUES('Gnucash-Resave',19920); +INSERT INTO versions VALUES('books',1); +INSERT INTO versions VALUES('commodities',1); +INSERT INTO versions VALUES('accounts',1); +INSERT INTO versions VALUES('prices',3); +INSERT INTO versions VALUES('transactions',4); +INSERT INTO versions VALUES('splits',5); +INSERT INTO versions VALUES('slots',4); + +CREATE TABLE books(guid text(32) PRIMARY KEY NOT NULL, root_account_guid text(32) NOT NULL, root_template_guid text(32) NOT NULL); +CREATE TABLE commodities(guid text(32) PRIMARY KEY NOT NULL, namespace text(2048) NOT NULL, mnemonic text(2048) NOT NULL, fullname text(2048), cusip text(2048), fraction integer NOT NULL, quote_flag integer NOT NULL, quote_source text(2048), quote_tz text(2048)); +CREATE TABLE accounts(guid text(32) PRIMARY KEY NOT NULL, name text(2048) NOT NULL, account_type text(2048) NOT NULL, commodity_guid text(32), commodity_scu integer NOT NULL, non_std_scu integer NOT NULL, parent_guid text(32), code text(2048), description text(2048), hidden integer, placeholder integer); +CREATE TABLE prices(guid text(32) PRIMARY KEY NOT NULL, commodity_guid text(32) NOT NULL, currency_guid text(32) NOT NULL, date text(19) NOT NULL, source text(2048), type text(2048), value_num bigint NOT NULL, value_denom bigint NOT NULL); +CREATE TABLE transactions(guid text(32) PRIMARY KEY NOT NULL, currency_guid text(32) NOT NULL, num text(2048) NOT NULL, post_date text(19), enter_date text(19), description text(2048)); +CREATE TABLE splits(guid text(32) PRIMARY KEY NOT NULL, tx_guid text(32) NOT NULL, account_guid text(32) NOT NULL, memo text(2048) NOT NULL, action text(2048) NOT NULL, reconcile_state text(1) NOT NULL, reconcile_date text(19), value_num bigint NOT NULL, value_denom bigint NOT NULL, quantity_num bigint NOT NULL, quantity_denom bigint NOT NULL, lot_guid text(32)); +CREATE TABLE slots(id integer PRIMARY KEY AUTOINCREMENT NOT NULL, obj_guid text(32) NOT NULL, name text(4096) NOT NULL, slot_type integer NOT NULL, int64_val bigint, string_val text(4096), double_val float8, timespec_val text(19), guid_val text(32), numeric_val_num bigint, numeric_val_denom bigint, gdate_val text(8)); + +-- Book +INSERT INTO books VALUES('00000000000000000000000000000001','00000000000000000000000000000010','00000000000000000000000000000011'); + +-- Commodities: Moola (commodity, not currency!) and Stock +INSERT INTO commodities VALUES('00000000000000000000000000000020','CURRENCY','MOOLA','Moola Token',NULL,1,0,NULL,NULL); +INSERT INTO commodities VALUES('00000000000000000000000000000021','COMMODITY','STOCK','Stock Shares',NULL,1,0,NULL,NULL); + +-- Accounts +-- Root +INSERT INTO accounts VALUES('00000000000000000000000000000010','Root Account','ROOT','00000000000000000000000000000020',1,0,NULL,'','',0,0); +INSERT INTO accounts VALUES('00000000000000000000000000000011','Template Root','ROOT',NULL,0,0,NULL,'','',0,0); +-- Alice's accounts +INSERT INTO accounts VALUES('00000000000000000000000000000100','Alice Moola','ASSET','00000000000000000000000000000020',1,0,'00000000000000000000000000000010','','',0,0); +INSERT INTO accounts VALUES('00000000000000000000000000000101','Alice Stock','STOCK','00000000000000000000000000000021',1,0,'00000000000000000000000000000010','','',0,0); +-- Bob's accounts +INSERT INTO accounts VALUES('00000000000000000000000000000200','Bob Moola','ASSET','00000000000000000000000000000020',1,0,'00000000000000000000000000000010','','',0,0); +INSERT INTO accounts VALUES('00000000000000000000000000000201','Bob Stock','STOCK','00000000000000000000000000000021',1,0,'00000000000000000000000000000010','','',0,0); + +-- Price: 1 STOCK = 10 MOOLA +INSERT INTO prices VALUES('00000000000000000000000000000030','00000000000000000000000000000021','00000000000000000000000000000020','2026-01-28 00:00:00','user:price','last',10,1); + +-- Single transaction: Alice gives 10 Moola, gets 1 Stock; Bob gives 1 Stock, gets 10 Moola +-- Transaction currency is MOOLA (a commodity!) +INSERT INTO transactions VALUES('00000000000000000000000000000040','00000000000000000000000000000020','SWAP-001','2026-01-28 00:00:00','2026-01-28 00:00:00','Moola-Stock Swap'); + +-- Splits (value in Moola, quantity in account commodity) +-- Alice: -10 Moola +INSERT INTO splits VALUES('00000000000000000000000000000050','00000000000000000000000000000040','00000000000000000000000000000100','','','c',NULL,-10,1,-10,1,NULL); +-- Alice: +1 Stock (value=10 Moola, quantity=1 Stock) +INSERT INTO splits VALUES('00000000000000000000000000000051','00000000000000000000000000000040','00000000000000000000000000000101','','','c',NULL,10,1,1,1,NULL); +-- Bob: +10 Moola +INSERT INTO splits VALUES('00000000000000000000000000000052','00000000000000000000000000000040','00000000000000000000000000000200','','','c',NULL,10,1,10,1,NULL); +-- Bob: -1 Stock (value=-10 Moola, quantity=-1 Stock) +INSERT INTO splits VALUES('00000000000000000000000000000053','00000000000000000000000000000040','00000000000000000000000000000201','','','c',NULL,-10,1,-1,1,NULL); + +COMMIT; diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md index 76befc9..aa096e8 100644 --- a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md @@ -148,3 +148,23 @@ Generated by [AVA](https://avajs.dev). '00000000001a | Alice:Stock | 1 | 1 | c ', '00000000001a | Escrow:Stock | -1 | 1 | c ', ] + +## Settlement links transactions (SettlementFacet) + +> SettlementFacet consolidates ERTP settlements into one GnuCash transaction. +> Like ChartFacet names accounts, SettlementFacet handles GnuCash stock-trade format. +> +> ERTP escrow creates separate transactions per commodity. SettlementFacet folds +> them into one transaction with 4 splits - proper GnuCash stock-trade format. +> Value is in currency (Moola); quantity is in account commodity. + + { + splits: [ + 'account_guid | value_num | quantity_num', + '000000000004 | 10 | 10', + '000000000003 | 10 | 1', + '000000000006 | -10 | -10', + '000000000007 | -10 | -1', + ], + transaction: '000000000014 | SETTLE-0001 | Alice buys 1 Stock from Bob for 10 Moola', + } diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap index 1e9cece9349167dd16897d6d78df3836d36e0eac..23c6596207aa16fd59ccddd471e750aaf329a9da 100644 GIT binary patch literal 2810 zcmVDdtv4{)O}69HB@s$^%N{rtJ-DI zmzMJ@_aBQ000000000BkS?lZFI6PTGoo&yIYkP?YImmqNne*l~~apD3;Brb5}hh9~8 zPfyS6u2(rA`ZCkq)vsRH`@XNj%#Kw!hE8Xr(}81H z?X2Exce?G>wYd{ac@NWR@X1}7?Qk;$VSr2EajY_Fg&e?GtAXaDP2kWI7E*D5@a;^* z2PmPJS?FiLgRRoD%*@*%(PK7ls7^y>A=tG`n2z{+a&YbgasM3V)<*Vo2 zqPxzq$V2bD!Fv_#J-5af+hB}+#29-qI0Jtd>iBzH!=F8RGP`nIIO4Azd!L^WMvMOm zN=0WHV7P>N`1O^%>alqX;m03dWNf3y_ za7RgtM|J~x*eBZ2&;q;@1fFW-$ux&w0>YRKwVTLKO`*|=*$4q*C5?rr#hCZuHjMZI zzV1%n5VmpE@#AW9vmESg+|D0~X!!1EY^M+DdZW1+hWkV1UXZ|Uz^W`Bg0e%@V0kY^ zx}-M3cJ5#~7YJ!kTatxXjYcXFb_!Zepy7OIx;H2|<(7tC9EW zxH;Q>rQP~ToD`h$ihuOwLUs&}xhCOt)RcTA0feEQJ zaey0;%C_*{Jjjp zD(|={q4Jfx;;?*$VmpY3TstNg6D+~Zrxnaxyu}#%24n0OjIn<)#=du!c0X6g&i!Y= z&OBVshnM>`Fl?nFu1|0bxQ^Jp#k-yEIt|*}f3Wk$Qj9EU^?i=M2)v*_1%o`r#GP%xfv}OgpxsZyX=bzKX4`1!}J2AsMAdtK`W2U&88@q{8YK z?l8u_#Tfe;W9+Ytu};9)`vGIW4;cH>${7rQzRvK?8pC6iV3p_#>^_aon>9LjJFZgL zG6t<#M&;SjUEprj7$sKSt~0jH$&>8+ayT7nd2MB=M$Sv)!XHN}~L;tl6by#%_`^zhm<%)s1}zuA7NCuzCZKd?W37y7o2jwB zK*E9Ml;cH?8gW6PkmNcs`A#k(WiHBn zj=s?vdH)3dU|g{rKxv@39)zCbmRoAm|Y{0e1PggGQxrZqatg6W?EeyqZF;Q-Rv$n6H*4{OlpWRX9@z zh~r{%vIGexB6c-Wz0S^DiddLanzq{*)3V_H^|H|ZhB0>i+y(c+xeD&$w36C=mMZ+9 zra-k2pPetwG--9AWR~-()B>QYldmsMUfVC0B%8B({mjX8EcVFnyzv5!+UnfCCa*Pp zCGSC!qEm@#)h-iAxpc3d=lS*eyhta$x@%&pF!3lJaydX~Y`yvV+ihc~DG3}gcEsbM zkl36_$4_$U_+bTKD=o&@>RFNz)NysY08$B>^B|?zUS7=KqOa0aO?+-e?=k-d(AXNG z7L=2|E@}61`vUCduik?0*KVyfqtHD$QVFJJwl3Ukz}7&cZ{Pjprys&=nO|Z0zlYZ5 zoxO(Au;X}`I{VEi4EOf8_IE4KhYz{7l&?{wu!w*#Hi8HJK5AcvCfFAe6IazqWnqdg z5yi2^Bnt1Vq5$+B8oFOn|IRY%f5;g7+qqT!?sBewc3R)9P^aY1#+yo|e8!r#%cpEz<8TvauHU_9PQWQoP-o6{32ifK4 z-3~ZcqA-W8RDK&VFrw?5V5~?}m~i3t8S4IQtKR=@Y@H~p-o~C)@xis_!G&dpc_}hE z6wiT|g@UbacsUTyMtBay$2kyZJ4vo81F9&z)yBkiS%wG`E-fa_O@~`I!mpGcF&j|s z^RHHRs8q-UQ_VgNG-kJ5$ECTXVQ{6|I;NeTT7eG>$+`5P_kD~lfiwSm<;oQnyyTk4 zUkHNVGFHO#l22_|aG930xca$@N5!?>8r%1F_xJDZw&#+qUN$ua^?bTci$bDV2(4q* z-x*{7WQ?@}#xP*)mjPpcsxfQjOlDm><zIf4GoU4QG z(U;p<>o4zC7sYrB>T?abOz3M(VayN=+Vp|fcNjQ*i*i2X@>|ryWs`r72xHgQ%)jeI z3$yiUmkwv&Uh5xC-8QgRr0#9{JWLi(bMCRP^jsG;&a_4uPod#(+uSTMl@H)$6QpqQ Mzi2|p5Ck9q06b=cGXMYp literal 2488 zcmV;p2}kxpRzVOcnH$WWD-I) zA7mzBSqWv!-OujQbXR$+s>fq8kpQ9Pz6TCS9I_I3F3WBC1K`9Tzy*#R_soZ0^@rPS zC(bAbL|^Rgu735Z-tYH&@70UpAXdSV`Sf$N!p1nhC!_@~LkMxKjIhE;J~olE=9iy` zA-DX)FV@*xjIPGpjr9&=>>6V%WsJSoxbSY{{EpUq+GrI2E?&II8Xjw`vBuZfdyO^r zjmA1_oPW3Bk5Umrah-xp6Zbn-#y$KWE(gPgoRifA^a#6!4XOr zq!tF;U!KKutG?%bfcCP1 zgd%zsb|3HEJ*Y+&Y=j92X%%o7r`lkf9!W5W5UGiq_ObzuL-H9z5RwLzGu_D-NeM*p^opPD_8TR{jIfn*ipnVxF~S^K358gV#5&gaP(?y{*le z?TwZ56ukNCfeRv-3>lb5F;U0ZcY)8;;uve8DKMICFH&g0>0<%DQWS< z_F;fSq8$w_z&k9c@8%q;YWDK-QE?p zdCBqPQfs>$oY}aMf8x{d{bX#X59xWcwe5L_k#Y+pup6){4I)rBLJgJ=Vx&i^?``A` zmUDrS2DK$w2vm}&P}nJGHG!t{q2*RkaLR2BE#w&W^!?f%8QE>1E6Vr2Rp?z`>7dEbF}b>dujZX5KkC*gu@z&aO_zkCVT-O{8EM;2LXt8KnuA z8$%vY>}a9J_jcrz=s=pD#hN1Ktb9y4_~UI5Loh1AY*ZW*!Yw>LxCs+dY2pAkAeC+B z2|}fD2m_K}mydk!v9uy4ri_Sh1!gh_oYq5(;RrPaKTuj@U|ptDWBy5sU{&V0DWUT1 z+v2!fLXi%Fh-=5>VuB@@`LcqU^Vb<;-)D^djxqKx#@J6+Y4^E0cJ99hcIM%7HoV-g zfng^WL4AT#z%9h?b>8iCw`kD8;e)-qOEI#b)%Q6Dn_cW~b*~KuaGK|4S9(3lsa}KN zYuR5f?bp=4V*dxZf}F*Ekpup87&*C1c?R*_zaGjyzkNfTRcG9thktI zJiYQA2r@x`1_pVIp}XtDk+8mdpxsZ?X=bbKX6wTxhloovgWkh9WA`lar81;!l*6zT zV_J(L_VNt2B=$7OM$klm? zc|rG~<`W(RPi>^Mu+x&oS9en}Uu{JKHP=BzM(NWkIdcD(uzD@5u=?$rjIkdw#(u*X z`v+sJ(_rj*gRwt182jeh3WmQ`XZUuF;eiUVO7sPGzlzS=H9B`Yu2a}C2CZ2}<=NF; z;BM6z6;|D@Gq%g+QSRAGGf8)Ws8wTEoUtw$+lw%8aa<_lmazWZGGm+0SdWYyaMEl8 zuVw7~GGkOEUd#4u|747kDE~Tpc43*ZYh*0jvs+4qi+gr;x%h}od~ywN1r`-G36)V+ zBf_!Z;LzX-zzRBYjq$ym9PR`r15JWK+r_U9Xam0mD4p3rD`Pgy)Yz;+!ja}wEAmfpN-XNU{j5xUk;WzD4P{L zw>-D2v}X=wi|-%--9fIW&9S6xS&u-a-Ep`I2Vz!7UfxuzHlP&pJiRy zGsf7LtE$31J9z$U7D%z^)#5(5N)dZAync%+41e@1~IJSfF+_=KEy}Kl><470%QV;<%WcEJ28& z2waa;@3T`^A{OS9rgR%%TsGW)SQgqpGRCf)x#2!KQ^Q@{R!X}!>B5g{3RDa6>UwFW zNxg-ZSJRF zGY<{DFR6cX8TCJ7jQ#V>s(yPp*WaAhw=2{sxzoR=RLp0r*>E-0JZn~+rqvB+=*TUX z##S57>GNY%|-ZbEaM=wm-{b zyQ>C8WDPAXEJ8~!%D@Wq>cE0?!}oR-wP88OX&i>IQ4BRsD@+;Ae^ Date: Wed, 28 Jan 2026 23:44:44 -0600 Subject: [PATCH 60/77] refactor(ertp-ledgerguise): improve code organization - Promote SettlementFacet to src/settlement.ts (was inline in test) - Extract gnucash-tools.ts with table types and snapshot helpers - Deprecate escrow.ts more strongly (@deprecated JSDoc) - Update README with documentation section - Update CONTRIBUTING.md status (mark completed items) Co-Authored-By: Claude Opus 4.5 --- packages/ertp-ledgerguise/CONTRIBUTING.md | 9 +- packages/ertp-ledgerguise/README.md | 14 +- packages/ertp-ledgerguise/src/escrow.ts | 10 +- packages/ertp-ledgerguise/src/index.ts | 3 + packages/ertp-ledgerguise/src/settlement.ts | 152 ++++++++++ .../ertp-ledgerguise/test/design-doc.test.ts | 266 ++---------------- .../ertp-ledgerguise/test/gnucash-tools.ts | 171 +++++++++++ 7 files changed, 368 insertions(+), 257 deletions(-) create mode 100644 packages/ertp-ledgerguise/src/settlement.ts create mode 100644 packages/ertp-ledgerguise/test/gnucash-tools.ts diff --git a/packages/ertp-ledgerguise/CONTRIBUTING.md b/packages/ertp-ledgerguise/CONTRIBUTING.md index da6d6c9..58139de 100644 --- a/packages/ertp-ledgerguise/CONTRIBUTING.md +++ b/packages/ertp-ledgerguise/CONTRIBUTING.md @@ -84,13 +84,14 @@ These guidelines help AI agents contribute effectively: **Done:** - [x] ERTP-like API (issuer/brand/purse/payment) mapped to GnuCash -- [x] Escrow prototype with async funding via `Promise` -- [x] Account hierarchy with placeholder parents and codes +- [x] Escrow exchange with async funding via `Promise` (escrow-ertp.ts) +- [x] Account hierarchy with placeholder parents and codes (ChartFacet) - [x] Ocap discipline: injected clock/db, frozen API surfaces +- [x] Multi-commodity escrow with proper GnuCash stock-trade format (SettlementFacet) +- [x] Design doc as executable snapshot tests (test/snapshots/design-doc.test.ts.md) **To do:** -- [ ] Solidify escrow API - [ ] Persist escrow state at each transition (crash recovery) - [ ] Read-only issuer facade (brand/displayInfo only) -- [ ] Multi-commodity escrow +- [ ] Community rewards/budget voting (separate from escrow) diff --git a/packages/ertp-ledgerguise/README.md b/packages/ertp-ledgerguise/README.md index e547ca8..31e2e4d 100644 --- a/packages/ertp-ledgerguise/README.md +++ b/packages/ertp-ledgerguise/README.md @@ -14,9 +14,21 @@ ERTP-compatible facade over a GnuCash SQLite database. - A new UI or a full GnuCash replacement. - Automated bank/card syncing (handled elsewhere in finquick). +## Documentation + +The primary documentation is `test/snapshots/design-doc.test.ts.md` — a narrative snapshot-based design doc showing how ERTP concepts map to GnuCash: + +- Mint and deposit → transactions/splits +- Chart of accounts → ChartFacet for naming purses +- Withdraw creates hold → reconcile_state tracking +- Escrow exchange → AMIX-style state machine +- Settlement → SettlementFacet for GnuCash stock-trade format + +See also `docs-dev/` for background on escrow accounting, ocap discipline, and integration patterns. + ## Status -Early sketch; API surface and mappings are expected to evolve. Contributions welcome—see `CONTRIBUTING.md` for what's done and what remains. +Core ERTP→GnuCash mapping is stable. Contributions welcome—see `CONTRIBUTING.md` for guidelines. ## Name diff --git a/packages/ertp-ledgerguise/src/escrow.ts b/packages/ertp-ledgerguise/src/escrow.ts index d232e1b..0bc16a9 100644 --- a/packages/ertp-ledgerguise/src/escrow.ts +++ b/packages/ertp-ledgerguise/src/escrow.ts @@ -5,8 +5,13 @@ import type { SqlDatabase } from './sql-db.js'; import { requireAccountCommodity } from './db-helpers.js'; /** - * @file This implementation is "all over the floor" and is not production ready. - * See escrow-ertp.ts for a more solid, ERTP-only escrow exchange. + * @file DEPRECATED: Use escrow-ertp.ts instead. + * + * This implementation is "all over the floor" and is not production ready. + * It mixes ERTP concepts with raw DB access in ways that violate layering. + * + * @deprecated Use {@link makeErtpEscrow} from escrow-ertp.ts + * @see escrow-ertp.ts for the production-ready ERTP-only escrow exchange */ type EscrowRecord = { @@ -22,6 +27,7 @@ type EscrowRecord = { /** * Create a two-party escrow with a single holding account for the brand. + * @deprecated Use {@link makeErtpEscrow} from escrow-ertp.ts instead. */ export const makeEscrow = ({ db, diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 5629953..d1950c7 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -49,6 +49,9 @@ export type { export { asGuid } from './guids.js'; export { makeChartFacet } from './chart.js'; export { makeErtpEscrow } from './escrow-ertp.js'; +export { makeSettlementFacet } from './settlement.js'; +export type { SettlementFacet, SettlementResult } from './settlement.js'; +/** @deprecated Use {@link makeErtpEscrow} instead */ export { makeEscrow } from './escrow.js'; export { wrapBetterSqlite3Database } from './sqlite-shim.js'; export type { SqlDatabase, SqlStatement } from './sql-db.js'; diff --git a/packages/ertp-ledgerguise/src/settlement.ts b/packages/ertp-ledgerguise/src/settlement.ts new file mode 100644 index 0000000..1b4625a --- /dev/null +++ b/packages/ertp-ledgerguise/src/settlement.ts @@ -0,0 +1,152 @@ +/** + * @file SettlementFacet consolidates multi-transaction ERTP settlements + * into proper GnuCash stock-trade transactions. + * + * Like ChartFacet names accounts, SettlementFacet handles GnuCash-specific + * transaction formatting without polluting ERTP logic. + * + * @see ./chart.ts for the analogous pattern with accounts + */ + +import type { SqlDatabase } from './sql-db.js'; +import type { Guid } from './types.js'; + +const { freeze } = Object; + +export type SettlementResult = Readonly<{ + result: T; + settlementRef: string; + txGuid?: string; +}>; + +export type SettlementFacet = Readonly<{ + settle: ( + operation: () => Promise, + description?: string, + ) => Promise>; +}>; + +/** + * Create a settlement facet that consolidates ERTP settlements into + * proper GnuCash stock-trade transactions. + * + * ERTP escrow creates separate transactions per commodity. SettlementFacet + * folds them into one transaction with proper value/quantity splits: + * - Value is in currency terms (the transaction currency) + * - Quantity is in account commodity terms + * + * @param db - Database connection + * @param currencyGuid - GUID of the currency commodity (used as transaction currency) + * @param makeSettlementRef - Factory for settlement reference numbers + */ +export const makeSettlementFacet = ({ + db, + currencyGuid, + makeSettlementRef, +}: { + db: SqlDatabase; + currencyGuid: Guid; + makeSettlementRef: () => string; +}): SettlementFacet => { + const getMaxTxGuid = () => { + const row = db + .prepare<[], { max_guid: string | null }>( + 'SELECT MAX(guid) as max_guid FROM transactions', + ) + .get(); + return row?.max_guid ?? ''; + }; + + return freeze({ + settle: async ( + operation: () => Promise, + description?: string, + ): Promise> => { + const settlementRef = makeSettlementRef(); + const beforeGuid = getMaxTxGuid(); + const result = await operation(); + + // Find transactions created during operation + const newTxs = db + .prepare<[string], { guid: string; currency_guid: string }>( + 'SELECT guid, currency_guid FROM transactions WHERE guid > ?', + ) + .all(beforeGuid); + + if (newTxs.length < 2) { + // Nothing to consolidate + return freeze({ result, settlementRef, txGuid: newTxs[0]?.guid }); + } + + // Currency transaction is the survivor + const currencyTx = newTxs.find(tx => tx.currency_guid === currencyGuid); + const otherTxs = newTxs.filter(tx => tx.guid !== currencyTx?.guid); + + if (!currencyTx) { + throw new Error('No currency transaction found to consolidate into'); + } + + // Get the exchange rate from the currency transaction + // (sum of positive values = total currency amount in the trade) + const currencyTotal = db + .prepare<[string], { total: string }>( + `SELECT SUM(value_num) as total FROM splits + WHERE tx_guid = ? AND value_num > 0`, + ) + .get(currencyTx.guid); + const currencyAmount = BigInt(currencyTotal?.total ?? '0'); + + // Sanity check: only consolidate cleared transactions (no live payments) + const pendingSplits = db + .prepare<[string], { count: number }>( + `SELECT COUNT(*) as count FROM splits + WHERE tx_guid IN (${newTxs.map(() => '?').join(',')}) + AND reconcile_state != 'c'`, + ) + .get(...newTxs.map(tx => tx.guid)); + if (pendingSplits && pendingSplits.count > 0) { + throw new Error('Cannot consolidate: found pending (non-cleared) splits'); + } + + // Move splits from other transactions, updating value to currency terms + for (const tx of otherTxs) { + // Get the commodity amount (sum of positive quantities) + const commodityTotal = db + .prepare<[string], { total: string }>( + `SELECT SUM(quantity_num) as total FROM splits + WHERE tx_guid = ? AND quantity_num > 0`, + ) + .get(tx.guid); + const commodityAmount = BigInt(commodityTotal?.total ?? '1'); + + // Exchange rate: how much currency per commodity unit + const rate = currencyAmount / commodityAmount; + + // Update splits: value = quantity * rate (in currency terms) + db.prepare( + `UPDATE splits SET + tx_guid = ?, + value_num = quantity_num * ?, + value_denom = quantity_denom + WHERE tx_guid = ?`, + ).run(currencyTx.guid, rate.toString(), tx.guid); + + db.prepare('DELETE FROM transactions WHERE guid = ?').run(tx.guid); + } + + // Mark the consolidated transaction + if (description) { + db.prepare( + 'UPDATE transactions SET num = ?, description = ? WHERE guid = ?', + ).run(settlementRef, description, currencyTx.guid); + } else { + db.prepare('UPDATE transactions SET num = ? WHERE guid = ?').run( + settlementRef, + currencyTx.guid, + ); + } + + return freeze({ result, settlementRef, txGuid: currencyTx.guid }); + }, + }); +}; diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index f1584d4..1d0ceab 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -9,140 +9,29 @@ import { makeErtpEscrow, type EscrowParty } from '../src/escrow-ertp.js'; import { createIssuerKit, makeChartFacet, + makeSettlementFacet, type Sealer, wrapBetterSqlite3Database, } from '../src/index.js'; import type { Guid } from '../src/types.js'; import { makeTestClock, makeTestDb, mockMakeGuid } from './mock-io.js'; +import { + type AccountRow, + type AccountView, + type AccountWithCode, + type BooksRow, + type SplitEntry, + type SplitRow, + type TransactionRow, + accountViewCols, + shortDates, + shortGuid, + shortGuids, + splitEntryCols, + toRowStrings, +} from './gnucash-tools.js'; -// #region DB query helpers - -// GnuCash table row types for typed queries -type TransactionRow = { - guid: string; - currency_guid: string; - num: string; - post_date: string | null; - enter_date: string | null; - description: string; -}; - -type SplitRow = { - guid: string; - tx_guid: string; - account_guid: string; - memo: string; - action: string; - reconcile_state: string; - reconcile_date: string | null; - value_num: string; - value_denom: string; - quantity_num: string; - quantity_denom: string; -}; - -type AccountRow = { - guid: string; - name: string; - account_type: string; - commodity_guid: string; - parent_guid: string | null; - code: string | null; - description: string | null; - placeholder: number; - hidden: number; -}; - -type BooksRow = { - root_account_guid: string; -}; - -// Named subsets for common query patterns type AccountPath = Pick; -type AccountView = Pick< - AccountRow, - 'guid' | 'name' | 'parent_guid' | 'account_type' | 'placeholder' ->; -type AccountWithCode = Pick< - AccountRow, - 'guid' | 'name' | 'parent_guid' | 'placeholder' | 'code' ->; -type SplitEntry = Pick< - SplitRow, - | 'guid' - | 'tx_guid' - | 'account_guid' - | 'value_num' - | 'value_denom' - | 'reconcile_state' ->; - -// Column lists for snapshots -const accountViewCols = ['guid', 'name', 'parent_guid', 'account_type', 'placeholder']; -const splitEntryCols = ['guid', 'tx_guid', 'account_guid', 'value_num', 'value_denom', 'reconcile_state']; - -// Row mappers with sensible defaults -const GUID_KEYS = [ - 'guid', - 'tx_guid', - 'account_guid', - 'currency_guid', - 'parent_guid', - 'commodity_guid', -]; -const DATE_KEYS = ['post_date', 'enter_date', 'reconcile_date']; - -const shortGuid = (guid: string) => guid.slice(-12); - -const shortGuids = - (keys: string[] = GUID_KEYS) => - (row: T): T => { - const r = { ...row } as Record; - for (const k of keys) { - if (k in r && typeof r[k] === 'string') - r[k] = shortGuid(r[k] as string); - } - return r as T; - }; - -const shortDates = - (keys: string[] = DATE_KEYS) => - (row: T): T => { - const r = { ...row } as Record; - for (const k of keys) { - if (k in r && typeof r[k] === 'string') - r[k] = (r[k] as string).split(' ')[0]; - } - return r as T; - }; - -const toRowStrings = ( - rows: Record[], - columns: string[], -): string[] => { - if (rows.length === 0) return [columns.join(' | ')]; - const widths = columns.map(column => - Math.max( - column.length, - ...rows.map(row => String(row[column] ?? '').length), - ), - ); - // Right-justify columns where all values are numeric - const isNumeric = columns.map(column => - rows.every(row => /^-?\d+$/.test(String(row[column] ?? ''))), - ); - const format = (row: Record, isHeader = false) => - columns - .map((column, index) => { - const val = String(row[column] ?? ''); - return isNumeric[index] && !isHeader - ? val.padStart(widths[index]) - : val.padEnd(widths[index]); - }) - .join(' | '); - const header = Object.fromEntries(columns.map(column => [column, column])); - return [format(header, true), ...rows.map(row => format(row))]; -}; // #endregion @@ -753,129 +642,6 @@ Alice gets Stock (what she wanted); Bob gets Moola (what he wanted).`, ); }); -/** - * SettlementFacet consolidates multi-transaction settlements into one. - * Like ChartFacet names accounts, SettlementFacet creates proper GnuCash - * stock-trade transactions from ERTP settlements. - */ -const makeSettlementFacet = ({ - db, - currencyGuid, - makeSettlementRef, -}: { - db: ReturnType; - currencyGuid: Guid; - makeSettlementRef: () => string; -}) => { - const { freeze } = Object; - - const getMaxTxGuid = () => { - const row = db - .prepare<[], { max_guid: string | null }>( - 'SELECT MAX(guid) as max_guid FROM transactions', - ) - .get(); - return row?.max_guid ?? ''; - }; - - return freeze({ - /** - * Execute an async operation and consolidate created transactions. - * Folds commodity transactions into the currency transaction. - */ - settle: async ( - operation: () => Promise, - description?: string, - ) => { - const settlementRef = makeSettlementRef(); - const beforeGuid = getMaxTxGuid(); - const result = await operation(); - - // Find transactions created during operation - const newTxs = db - .prepare<[string], { guid: string; currency_guid: string }>( - 'SELECT guid, currency_guid FROM transactions WHERE guid > ?', - ) - .all(beforeGuid); - - if (newTxs.length < 2) { - // Nothing to consolidate - return freeze({ result, settlementRef, txGuid: newTxs[0]?.guid }); - } - - // Currency transaction is the survivor - const currencyTx = newTxs.find(tx => tx.currency_guid === currencyGuid); - const otherTxs = newTxs.filter(tx => tx.guid !== currencyTx?.guid); - - if (!currencyTx) { - throw new Error('No currency transaction found to consolidate into'); - } - - // Get the exchange rate from the currency transaction - // (sum of positive values = total currency amount in the trade) - const currencyTotal = db - .prepare<[string], { total: string }>( - `SELECT SUM(value_num) as total FROM splits - WHERE tx_guid = ? AND value_num > 0`, - ) - .get(currencyTx.guid); - const currencyAmount = BigInt(currencyTotal?.total ?? '0'); - - // Sanity check: only consolidate cleared transactions (no live payments) - const pendingSplits = db - .prepare<[string], { count: number }>( - `SELECT COUNT(*) as count FROM splits - WHERE tx_guid IN (${newTxs.map(() => '?').join(',')}) - AND reconcile_state != 'c'`, - ) - .get(...newTxs.map(tx => tx.guid)); - if (pendingSplits && pendingSplits.count > 0) { - throw new Error('Cannot consolidate: found pending (non-cleared) splits'); - } - - // Move splits from other transactions, updating value to currency terms - for (const tx of otherTxs) { - // Get the commodity amount (sum of positive quantities) - const commodityTotal = db - .prepare<[string], { total: string }>( - `SELECT SUM(quantity_num) as total FROM splits - WHERE tx_guid = ? AND quantity_num > 0`, - ) - .get(tx.guid); - const commodityAmount = BigInt(commodityTotal?.total ?? '1'); - - // Exchange rate: how much currency per commodity unit - const rate = currencyAmount / commodityAmount; - - // Update splits: value = quantity * rate (in currency terms) - db.prepare( - `UPDATE splits SET - tx_guid = ?, - value_num = quantity_num * ?, - value_denom = quantity_denom - WHERE tx_guid = ?`, - ).run(currencyTx.guid, rate.toString(), tx.guid); - - db.prepare('DELETE FROM transactions WHERE guid = ?').run(tx.guid); - } - - // Mark the consolidated transaction - if (description) { - db.prepare( - 'UPDATE transactions SET num = ?, description = ? WHERE guid = ?', - ).run(settlementRef, description, currencyTx.guid); - } else { - db.prepare('UPDATE transactions SET num = ? WHERE guid = ?').run( - settlementRef, - currencyTx.guid, - ); - } - - return freeze({ result, settlementRef, txGuid: currencyTx.guid }); - }, - }); -}; - serial('Settlement links transactions (SettlementFacet)', async t => { const { freeze } = Object; const { db, close } = makeTestDb(); diff --git a/packages/ertp-ledgerguise/test/gnucash-tools.ts b/packages/ertp-ledgerguise/test/gnucash-tools.ts new file mode 100644 index 0000000..419858e --- /dev/null +++ b/packages/ertp-ledgerguise/test/gnucash-tools.ts @@ -0,0 +1,171 @@ +/** + * @file GnuCash table types and test helpers for snapshot formatting. + */ + +// #region GnuCash table row types + +export type TransactionRow = { + guid: string; + currency_guid: string; + num: string; + post_date: string | null; + enter_date: string | null; + description: string; +}; + +export type SplitRow = { + guid: string; + tx_guid: string; + account_guid: string; + memo: string; + action: string; + reconcile_state: string; + reconcile_date: string | null; + value_num: string; + value_denom: string; + quantity_num: string; + quantity_denom: string; +}; + +export type AccountRow = { + guid: string; + name: string; + account_type: string; + commodity_guid: string; + parent_guid: string | null; + code: string | null; + description: string | null; + placeholder: number; + hidden: number; +}; + +export type BooksRow = { + root_account_guid: string; +}; + +// Named subsets for common query patterns +export type AccountPath = Pick; +export type AccountView = Pick< + AccountRow, + 'guid' | 'name' | 'parent_guid' | 'account_type' | 'placeholder' +>; +export type AccountWithCode = Pick< + AccountRow, + 'guid' | 'name' | 'parent_guid' | 'placeholder' | 'code' +>; +export type SplitEntry = Pick< + SplitRow, + | 'guid' + | 'tx_guid' + | 'account_guid' + | 'value_num' + | 'value_denom' + | 'reconcile_state' +>; + +// #endregion + +// #region Column lists for snapshots + +export const accountViewCols = [ + 'guid', + 'name', + 'parent_guid', + 'account_type', + 'placeholder', +]; + +export const splitEntryCols = [ + 'guid', + 'tx_guid', + 'account_guid', + 'value_num', + 'value_denom', + 'reconcile_state', +]; + +// #endregion + +// #region Row mappers + +const GUID_KEYS = [ + 'guid', + 'tx_guid', + 'account_guid', + 'currency_guid', + 'parent_guid', + 'commodity_guid', +]; + +const DATE_KEYS = ['post_date', 'enter_date', 'reconcile_date']; + +/** Truncate a GUID to its last 12 characters for readable snapshots. */ +export const shortGuid = (guid: string) => guid.slice(-12); + +/** + * Create a row mapper that truncates GUID fields to their last 12 characters. + * @param keys - GUID field names to truncate (defaults to common GnuCash GUID columns) + */ +export const shortGuids = + (keys: string[] = GUID_KEYS) => + (row: T): T => { + const r = { ...row } as Record; + for (const k of keys) { + if (k in r && typeof r[k] === 'string') + r[k] = shortGuid(r[k] as string); + } + return r as T; + }; + +/** + * Create a row mapper that truncates date fields to just the date portion. + * @param keys - Date field names to truncate (defaults to common GnuCash date columns) + */ +export const shortDates = + (keys: string[] = DATE_KEYS) => + (row: T): T => { + const r = { ...row } as Record; + for (const k of keys) { + if (k in r && typeof r[k] === 'string') + r[k] = (r[k] as string).split(' ')[0]; + } + return r as T; + }; + +// #endregion + +// #region Snapshot formatting + +/** + * Format rows as pipe-delimited strings for readable snapshots. + * Numeric columns are right-justified; others are left-justified. + */ +export const toRowStrings = ( + rows: Record[], + columns: string[], +): string[] => { + if (rows.length === 0) return [columns.join(' | ')]; + const widths = columns.map(column => + Math.max( + column.length, + ...rows.map(row => String(row[column] ?? '').length), + ), + ); + // Right-justify columns where all values are numeric + const isNumeric = columns.map(column => + rows.every(row => /^-?\d+$/.test(String(row[column] ?? ''))), + ); + const format = (row: Record, isHeader = false) => + columns + .map((column, index) => { + const val = String(row[column] ?? ''); + return isNumeric[index] && !isHeader + ? val.padStart(widths[index]) + : val.padEnd(widths[index]); + }) + .join(' | '); + const header = Object.fromEntries(columns.map(column => [column, column])); + return [format(header, true), ...rows.map(row => format(row))]; +}; + +// #endregion From 96fe26a13f1f6f0ae7437639fecdeb65f4fc1bf3 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 28 Jan 2026 23:49:20 -0600 Subject: [PATCH 61/77] fixup! refactor(ertp-ledgerguise): improve code organization Remove deprecated makeEscrow/EscrowFacet exports from index.ts. community.test.ts now imports directly from escrow.ts. Co-Authored-By: Claude Opus 4.5 --- packages/ertp-ledgerguise/src/index.ts | 3 --- packages/ertp-ledgerguise/test/community.test.ts | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index d1950c7..488ebb1 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -40,7 +40,6 @@ export type { Sealed, Sealer, Unsealer } from './sealer.js'; export type { CommoditySpec, - EscrowFacet, IssuerKitForCommodity, IssuerKitWithGuid, IssuerKitWithPurseGuids, @@ -51,8 +50,6 @@ export { makeChartFacet } from './chart.js'; export { makeErtpEscrow } from './escrow-ertp.js'; export { makeSettlementFacet } from './settlement.js'; export type { SettlementFacet, SettlementResult } from './settlement.js'; -/** @deprecated Use {@link makeErtpEscrow} instead */ -export { makeEscrow } from './escrow.js'; export { wrapBetterSqlite3Database } from './sqlite-shim.js'; export type { SqlDatabase, SqlStatement } from './sql-db.js'; export type { Zone } from './jessie-tools.js'; diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts index 8257ce6..ebea478 100644 --- a/packages/ertp-ledgerguise/test/community.test.ts +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -19,9 +19,10 @@ import { createIssuerKit, initGnuCashSchema, makeChartFacet, - makeEscrow, wrapBetterSqlite3Database, } from '../src/index.js'; +// Direct import of deprecated escrow (pending migration to makeErtpEscrow) +import { makeEscrow } from '../src/escrow.js'; import { makeDeterministicGuid, mockMakeGuid } from '../src/guids.js'; import { makeTestClock } from './mock-io.js'; From 131a840c73a7203a05353311e034cffb0c3d4d0e Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 5 Feb 2026 18:02:25 -0600 Subject: [PATCH 62/77] WIP: build misc --- packages/ertp-clerk/package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/ertp-clerk/package.json b/packages/ertp-clerk/package.json index df3bf23..efc8633 100644 --- a/packages/ertp-clerk/package.json +++ b/packages/ertp-clerk/package.json @@ -6,8 +6,11 @@ "main": "src/index.ts", "scripts": { "dev": "wrangler dev", + "lint:types": "tsc -p tsconfig.json --noEmit --incremental", "smoke": "node scripts/smoke.js", - "postinstall": "patch-package" + "postinstall": "patch-package", + "test": "npm run smoke", + "check": "npm run lint:types && npm run test" }, "dependencies": { "capnweb": "^0.4.0", @@ -16,6 +19,7 @@ "devDependencies": { "@types/node": "^24.0.0", "patch-package": "^8.0.1", + "typescript": "~5.9.3", "wrangler": "^4.59.2" } } From 2e52dfade06c7eaf2f3ea7299fac45134b217bb6 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 5 Feb 2026 18:03:04 -0600 Subject: [PATCH 63/77] WIP: types / docs misc --- packages/ertp-clerk/src/index.ts | 11 +++++++++-- packages/ertp-clerk/src/ledger-do.ts | 10 ++++------ packages/ertp-clerk/src/sql-adapter.ts | 7 ++----- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/ertp-clerk/src/index.ts b/packages/ertp-clerk/src/index.ts index 7b95807..287eb11 100644 --- a/packages/ertp-clerk/src/index.ts +++ b/packages/ertp-clerk/src/index.ts @@ -1,5 +1,12 @@ -import { LedgerDurableObject } from './ledger-do'; -import type { Env } from '../worker-configuration'; +/** + * @file Cloudflare Worker entry point for ertp-clerk. + * + * Ambient types like `Env` are generated by `wrangler types` into + * worker-configuration.d.ts. See: + * - https://developers.cloudflare.com/workers/ + * - https://developers.cloudflare.com/durable-objects/ + */ +import { LedgerDurableObject } from './ledger-do.js'; const { freeze } = Object; diff --git a/packages/ertp-clerk/src/ledger-do.ts b/packages/ertp-clerk/src/ledger-do.ts index c157822..3250520 100644 --- a/packages/ertp-clerk/src/ledger-do.ts +++ b/packages/ertp-clerk/src/ledger-do.ts @@ -1,17 +1,15 @@ import { RpcTarget, newWorkersRpcResponse } from 'capnweb'; import { drizzle, type DrizzleSqliteDODatabase } from 'drizzle-orm/durable-sqlite'; import { DurableObject } from 'cloudflare:workers'; -import type { DurableObjectState } from 'cloudflare:workers'; -import type { Env } from '../worker-configuration'; import { createIssuerKit, initGnuCashSchema, asGuid, type SqlDatabase, - type Guid, type Zone, } from '../../ertp-ledgerguise/src/index.js'; -import { makeSqlDatabaseFromStorage } from './sql-adapter'; +import type { Guid } from '../../ertp-ledgerguise/src/types.js'; +import { makeSqlDatabaseFromStorage } from './sql-adapter.js'; const { freeze } = Object; @@ -65,7 +63,7 @@ const normalizeArgForTarget = (arg: unknown, target: object): unknown => { }; const makeRpcZone = (): Zone => ({ - exo: (_interfaceName, methods) => { + exo: >(_interfaceName: string, methods: T): Readonly => { class ExoTarget extends RpcTarget {} for (const key of Reflect.ownKeys(methods)) { const value = (methods as Record)[key]; @@ -87,7 +85,7 @@ const makeRpcZone = (): Zone => ({ }); } freeze(ExoTarget.prototype); - return freeze(new ExoTarget()); + return freeze(new ExoTarget()) as unknown as Readonly; }, }); diff --git a/packages/ertp-clerk/src/sql-adapter.ts b/packages/ertp-clerk/src/sql-adapter.ts index c754a24..e2cbf08 100644 --- a/packages/ertp-clerk/src/sql-adapter.ts +++ b/packages/ertp-clerk/src/sql-adapter.ts @@ -1,10 +1,7 @@ import type { SqlDatabase } from '../../ertp-ledgerguise/src/index.js'; type SqlCursor> = { - next: () => IteratorResult; toArray: () => T[]; - one: () => T; - raw: () => SqlCursor; }; type SqlStorage = { @@ -15,10 +12,10 @@ const runExec = (sql: SqlStorage, statement: string, params: unknown[]) => { sql.exec(statement, ...params); }; -const toArray = (sql: SqlStorage, statement: string, params: unknown[]) => +const toArray = (sql: SqlStorage, statement: string, params: unknown[]): T[] => sql.exec(statement, ...params).toArray() as T[]; -const one = (sql: SqlStorage, statement: string, params: unknown[]) => { +const one = (sql: SqlStorage, statement: string, params: unknown[]): T | undefined => { const rows = toArray(sql, statement, params); return rows[0]; }; From b749d587533d7e0d3dc530586389d71a09a13ec9 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 5 Feb 2026 18:03:25 -0600 Subject: [PATCH 64/77] WIP: re-considering CapN Web vs. Waterken webkey --- packages/ertp-clerk/CONTRIBUTING.md | 43 ++++++---- packages/ertp-clerk/README.md | 6 +- .../ertp-clerk/docs-design/waterken-webkey.md | 78 +++++++++++++++++++ 3 files changed, 112 insertions(+), 15 deletions(-) create mode 100644 packages/ertp-clerk/docs-design/waterken-webkey.md diff --git a/packages/ertp-clerk/CONTRIBUTING.md b/packages/ertp-clerk/CONTRIBUTING.md index b88275f..5e61fd1 100644 --- a/packages/ertp-clerk/CONTRIBUTING.md +++ b/packages/ertp-clerk/CONTRIBUTING.md @@ -2,14 +2,30 @@ Thanks for your interest in contributing! This package will host the worker/service layer for ERTP-ledger access. +## Status checklist + +- [ ] Land a Worker-friendly remote capability protocol for ERTP access. + - [x] Scaffold worker package (wrangler, minimal README/CONTRIBUTING). + - [x] Add RPC bootstrap and entry points (Cap'n Web initial implementation). + - [x] Wrap ledgerguise facets for RPC and address identity/stub semantics (capnweb patch). + - [x] Provide smoke tests for the worker RPC. + - [ ] Re-validate end-to-end once ledgerguise is green again. + ## Scope - Keep changes limited to this package unless requested. - Prefer minimal, explicit interfaces for the worker API. +## Context + +- This worker depends on `@finquick/ertp-ledgerguise` behavior and types. Treat this package as a service layer, not the source of ledger semantics. +- End-to-end validation depends on ledgerguise tests passing and the DB backend choices for Workers (Durable Object SQLite vs D1). +- Design notes live in `docs-design/` (start with `docs-design/waterken-webkey.md`). + ## Development - `wrangler dev` +- Smoke test: `npm run smoke` (requires dev server running). ## capnweb identity patch @@ -17,16 +33,17 @@ We currently patch capnweb to preserve identity for export targets when a client ## TODO -- Define the Cap'n Web interface surface for issuer/brand/purse/payment facets. -- Decide how capability references will be issued and revoked. -- Choose deployment target (Cloudflare Workers, workerd, or both) and document local dev. -- Add request routing conventions (per-ledger DO instance vs per-commodity vs per-org). -- Add error taxonomy and map ledger errors to HTTP status codes. -- Confirm whether the wrangler dependency warning about rollup-plugin-inject is acceptable or needs remediation per best practices. -- Evaluate alternatives to loading capnweb from esm.sh (e.g., bundling locally). -- Replace better-sqlite3 with a Worker-compatible backend (Durable Object SQLite or D1) and keep IO injected. -- Use drizzle migrations for schema setup instead of inline bootstrap SQL. -- Investigate HTTP batch RPC support in wrangler/miniflare (smoke test uses WebSockets for now). -- Track the capnweb identity patch and remove it once upstream supports returning original export targets. -- Consider moving the External wrapper into ertp-ledgerguise (Far/exo-style) so facets are RPC-ready. -- Replace the relative import of ertp-ledgerguise src with a proper package build or bundler config. +- [x] Create protocol evaluation notes in `docs-design/` (Waterken web-key summary). +- [ ] Define the RPC interface surface for issuer/brand/purse/payment facets. +- [ ] Decide how capability references will be issued and revoked. +- [ ] Choose deployment target (Cloudflare Workers, workerd, or both) and document local dev. +- [ ] Add request routing conventions (per-ledger DO instance vs per-commodity vs per-org). +- [ ] Add error taxonomy and map ledger errors to HTTP status codes. +- [ ] Confirm whether the wrangler dependency warning about rollup-plugin-inject is acceptable or needs remediation per best practices. +- [ ] Evaluate alternatives to loading capnweb from esm.sh (e.g., bundling locally). +- [ ] Replace better-sqlite3 with a Worker-compatible backend (Durable Object SQLite or D1) and keep IO injected. +- [ ] Use drizzle migrations for schema setup instead of inline bootstrap SQL. +- [ ] Investigate HTTP batch RPC support in wrangler/miniflare (smoke test uses WebSockets for now). +- [ ] Track the capnweb identity patch and remove it once upstream supports returning original export targets. +- [ ] Consider moving the External wrapper into ertp-ledgerguise (Far/exo-style) so facets are RPC-ready. +- [ ] Replace the relative import of ertp-ledgerguise src with a proper package build or bundler config. diff --git a/packages/ertp-clerk/README.md b/packages/ertp-clerk/README.md index b76efd9..de42dc5 100644 --- a/packages/ertp-clerk/README.md +++ b/packages/ertp-clerk/README.md @@ -1,9 +1,11 @@ # ertp-clerk -ERTP ledger access over Cap'n Web, hosted as a Cloudflare Worker. +ERTP ledger access hosted as a Cloudflare Worker. The remote capability +protocol is WIP; see CONTRIBUTING. ## Usage - Visit `/` to load a small page that exposes `globalThis.bootstrap` in the browser console. - Call `await bootstrap.makeIssuerKit("BUCKS")` to obtain issuer facets backed by the durable ledger. -- POST or WebSocket requests to `/api` speak Cap'n Web RPC; other endpoints return 501/204. +- `/api` is the RPC endpoint. The concrete protocol is under active evaluation + (see `docs-design/waterken-webkey.md`). diff --git a/packages/ertp-clerk/docs-design/waterken-webkey.md b/packages/ertp-clerk/docs-design/waterken-webkey.md new file mode 100644 index 0000000..85ac61f --- /dev/null +++ b/packages/ertp-clerk/docs-design/waterken-webkey.md @@ -0,0 +1,78 @@ +# Waterken Web-Key Protocol and ERTP Fit + +## Context + +ERTP for Cloudflare Workers needs a robust remote capability protocol that preserves object identity across the network boundary, supports passing capabilities back to the service, and can be implemented in a Worker + Durable Objects environment. Cap'n Web (capnweb) currently requires an identity-preservation patch in `ertp-clerk` to keep `WeakMap`-based identity checks working. That makes Cap'n Web one possible strategy, not the only one. + +This note summarizes the Waterken web-key protocol and evaluates it for ERTP, based on: + +- The Waterken web-key paper (public spec). +- Capper implementation (`~/projects/Capper`) and the `ofxies` package usage in this repo. + +## Waterken Web-Key Summary (Protocol-Level) + +At a high level, a *web-key* is an unguessable HTTPS URL that *is* the permission to a resource. Key points from the Waterken design: + +- **Key material lives in the URL fragment** (`#...`) so it is not sent in the HTTP request and is not leaked via the `Referer` header. The browser loads a skeleton page, extracts the fragment, and then performs a follow-on HTTPS request where the key is placed in a query parameter. This yields a standard HTTPS request while keeping the key out of referrers and most logs. +- **Key-bearing URLs are the capability**. Distribution of the URL is distribution of authority. No additional login or password is required. +- **Protocol is browser-friendly**. It relies on client-side code plus HTTPS, so it works in existing browsers without special plugins. + +The paper does not define an RPC object model by itself; it specifies how to carry *permission* using URLs. Capper provides a concrete object-capability RPC on top of this convention. + +## Capper’s Concrete Web-Key RPC (Observed) + +Capper uses the Waterken convention as a capability transport and defines a JSON-over-HTTP RPC for invoking methods on exportable objects. + +Observed behavior in Capper: + +- **Webkey format**: `https://host/ocaps/#s=` (credential in fragment). See Capper’s README and `server.js`. +- **RPC request**: `POST /ocaps/?s=&q=` with JSON array body of arguments. +- **Capability passing**: Arguments that are object references are serialized as `{"@": ""}`. The server resolves these back to live objects via `webkeyToLive`. +- **RPC result**: JSON object with one of `{"=": value}`, `{"@": webkey}`, or `{"!": error}`. Capper also rewrites nested return values, replacing live objects with webkeys. + +The `ofxies` package demonstrates CLI flows using Capper’s conventions: `-make`, `-post`, `-drop`, and passing webkeys around as opaque authority-bearing strings (`packages/ofxies/README.md`, `packages/ofxies/server.js`). + +## Evaluation for ERTP in Cloudflare Workers + +### What ERTP needs + +ERTP relies on: + +- **Stable object identity** across a distributed boundary (e.g., payments/purses/issuers returned to clients and later passed back). In `ertp-ledgerguise`, identity checks use `WeakMap` to confirm “live” payments. +- **Capability passing** (issuers/brands/purses/payments as capabilities), including returning and accepting them in RPC arguments. +- **Revocation/attenuation** patterns (e.g., minting limited-purpose facets or dropping a payment). +- **Durability** for long-lived capabilities (brands, issuers, purses) and short-lived capabilities (payments). + +### Strengths of Waterken Web-Keys for ERTP + +- **Identity preservation is natural for sturdy refs**: the webkey credential can map back to the same persistent object, satisfying `WeakMap` identity checks so long as the server’s `cred -> object` mapping is stable. +- **Capability passing is first-class**: webkeys are explicitly designed as transferable permissions. Capper’s `{"@": webkey}` encoding maps well onto ERTP’s capability passing model. +- **Revocation aligns with ocap practice**: Capper’s `drop` plus state-based revocation patterns match ERTP’s expectations for revoking or exhausting payments. +- **Cloudflare Workers fit**: the protocol is just HTTPS + JSON, so a Worker + Durable Object can host it without special transports. + +### Gaps / Concerns + +- **Ephemeral identity**: Capper only encodes persistent exportable objects. ERTP has short-lived payments that may need to remain “live” during transfer. That implies payments must be backed by a persistent record (or a durable DO instance) to keep identity stable across round trips. +- **Object reference equality across domains**: webkeys are URLs. If two distinct URLs can refer to the same object (aliases), equality checks become ambiguous. The design should enforce a canonical webkey per object or normalize them before identity comparisons. +- **Lack of protocol-level pipelining**: Capper’s RPC is simple request/response without promise pipelining. ERTP doesn’t require pipelining, but it may affect latency-sensitive workflows. + +### Overall adequacy assessment + +Waterken web-keys, as concretely implemented by Capper, appear *adequate* as a remote capability substrate for ERTP in Cloudflare Workers, provided we: + +1. **Treat all remotely transferable ERTP facets as sturdy refs** with stable `cred -> object` mappings backed by Durable Object state or a database. +2. **Define a canonicalization rule** for webkeys to preserve identity semantics (one object == one canonical webkey). +3. **Document failure behaviors for ERTP methods**, given errors are sealed and any caller-visible signals should be returned as non-error values. + +Under these constraints, the Waterken web-key approach provides a simpler, Worker-friendly alternative to Cap'n Web while preserving the remote object identity ERTP needs. + +## Suggested next steps + +- Draft an ERTP-over-webkey interface spec (issuer/brand/purse/payment methods + error mapping). +- Decide on a canonical webkey scheme for Workers (path + fragment policy, or path + query-only if avoiding fragments on non-browser clients). +- Define how payments become durable (DO-backed, DB-backed, or explicitly minted to stable IDs). + +## References + +1. Close, Tyler. 2008. *Web-key: Mashing with Permission.* Web 2.0 Security & Privacy (W2SP 2008). https://waterken.sourceforge.net/web-key/web-key-w2sp08.pdf +2. Stiegler, Marc. 2014. *Capper* (software framework). https://github.com/marcsAtSkyhunter/Capper From 01aba20c13e7a794261a8fbd94be478f8f337e20 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 5 Feb 2026 19:30:59 -0600 Subject: [PATCH 65/77] WIP: refined design doc --- .../ertp-clerk/docs-design/waterken-webkey.md | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/packages/ertp-clerk/docs-design/waterken-webkey.md b/packages/ertp-clerk/docs-design/waterken-webkey.md index 85ac61f..2048f60 100644 --- a/packages/ertp-clerk/docs-design/waterken-webkey.md +++ b/packages/ertp-clerk/docs-design/waterken-webkey.md @@ -72,6 +72,101 @@ Under these constraints, the Waterken web-key approach provides a simpler, Worke - Decide on a canonical webkey scheme for Workers (path + fragment policy, or path + query-only if avoiding fragments on non-browser clients). - Define how payments become durable (DO-backed, DB-backed, or explicitly minted to stable IDs). +## Using GnuCash GUIDs as Webkey Material (IBIS) + +**Issue** + +Should GnuCash GUIDs be used as Waterken webkey credentials in the ERTP +Cloudflare Workers design? + +**Context / Observations** + +- `makeDeterministicGuid(seed)` hashes a seed string to a 32-hex GUID. +- `makeGuid()` is injected; in the Worker integration it is built from `crypto.randomUUID()`. +- Deterministic GUID seeds in `ertp-ledgerguise` include + `ledgerguise-balance:${commodityGuid}` and `ledgerguise:recovery:${commodityGuid}`. +- `purses.getGuid(purse)` and `purses.getGuidFromSealed(token)` intentionally reveal + account GUIDs to callers who hold those privileged facets. + +**Positions** + +1. **Use GnuCash GUIDs directly as webkey credentials.** +2. **Use deterministic GUIDs (hash of seed) as credentials.** +3. **Use random GUIDs as credentials.** +4. **Split identity (GUID) from capability (token).** +5. **GUID + MAC (stateless credential).** + +**Arguments** + +- Against (1): In this design, GUID disclosure is used for *identification* and + accounting (via privileged facets) without intending to grant purse access. + If GUIDs were credentials, those identification channels would become access + channels, collapsing the POLA separation between “identify” and “act.” +Comment (existence proof): `purses.getGuidFromSealed(token)` is intentionally +*identifying*; if “account GUID == webkey credential,” then a holder of the `purses` +facet plus a sealed token could construct a webkey that grants purse authority. +That turns identification-only authority into access authority. +- Against (2): Seeds include `commodityGuid`. Any party that learns `commodityGuid` + can derive the balance/recovery GUIDs exactly, which would confer authority to + anyone with that knowledge. +- Against (3): Random GUIDs are only safe if never exposed. In this codebase GUIDs + are exposed via privileged facets, so a random GUID should be treated as identity, + not as a capability secret, unless explicitly isolated. +- For (4): Preserves POLA and matches current code: GUIDs remain object IDs while + capability tokens are minted and handed out intentionally. +- For (5): Avoids per-token storage and keeps GUIDs as IDs, but pushes revocation + to MAC key rotation and requires careful key handling. + +**Decision** + +Do **not** use GnuCash GUIDs (deterministic or random) as webkey credentials in this +codebase. Treat GUIDs as object IDs only. Use a separate capability token for webkeys. + +**Parsimonious design** + +- **Split ID from capability**: map a separate random token (webkey credential) to a + GUID in server state. This is the simplest design that preserves POLA and matches + the current facet split. + +Constraint: do not add new tables; stay within the GnuCash schema. + +Within that constraint, the least invasive approach that preserves lookup +performance is to store the token → GUID mapping in the existing `slots` table +using the *indexed* `obj_guid` column for the token: + +- Store the **token** in `slots.obj_guid` (indexed). +- Store the **object GUID** in `slots.guid_val`. +- Use a dedicated `name` (e.g., `ledgerguise.webkey`) to disambiguate. + +Lookup flow: + +1. Incoming webkey token → lookup `slots` by `obj_guid` + `name`. +2. Resolve the owning object GUID from `guid_val`. +3. Route the request to the corresponding object/facet. + +Revocation is a slot delete. Rotation is a new slot with a new `obj_guid` token. + +Note: these slot rows are not attached to an object GUID via `obj_guid`, so any +tooling that expects `slots.obj_guid` to always be a real object GUID will ignore +them. If you need an object → token lookup, return the token at mint time (no +reverse lookup), or add a *second* non-indexed slot keyed by the object GUID. + +Additional clarifications: + +- This design **diverges from Capper**: Capper treats the credential as the object + identity (cred == id). Here the credential is a separate token that points to + the object GUID. +- Token → object mapping must be **persistent** to provide sturdy refs across + restarts; an in-memory map would make webkeys ephemeral. +- Object GUIDs are **not** part of the webkey protocol itself, but they are + exposed via privileged facets and admin flows. Split-ID preserves POLA by + letting those identifiers be shared without granting capability access. + +**Optional variant** + +- **GUID + MAC**: include the GUID plus an authenticator (e.g., HMAC) in the webkey to + avoid per-token storage, at the cost of key-rotation based revocation. + ## References 1. Close, Tyler. 2008. *Web-key: Mashing with Permission.* Web 2.0 Security & Privacy (W2SP 2008). https://waterken.sourceforge.net/web-key/web-key-w2sp08.pdf From 128a711531cb1b612a7cc97850521a2876954c96 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 02:54:30 -0600 Subject: [PATCH 66/77] refactor: SlotRow etc (WIP: move rather than copy) --- packages/ertp-ledgerguise/src/gnucash-schema.ts | 17 +++++++++++++++++ packages/ertp-ledgerguise/src/index.ts | 2 ++ 2 files changed, 19 insertions(+) create mode 100644 packages/ertp-ledgerguise/src/gnucash-schema.ts diff --git a/packages/ertp-ledgerguise/src/gnucash-schema.ts b/packages/ertp-ledgerguise/src/gnucash-schema.ts new file mode 100644 index 0000000..40e1c97 --- /dev/null +++ b/packages/ertp-ledgerguise/src/gnucash-schema.ts @@ -0,0 +1,17 @@ +export const SLOT_TYPE_GUID = 5; +export const SLOT_TYPE_STRING = 4; + +export type SlotRow = { + id: number; + obj_guid: string; + name: string; + slot_type: number; + int64_val: string | null; + string_val: string | null; + double_val: number | null; + timespec_val: string | null; + guid_val: string | null; + numeric_val_num: string | null; + numeric_val_denom: string | null; + gdate_val: string | null; +}; diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 488ebb1..50ebd0c 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -53,6 +53,8 @@ export type { SettlementFacet, SettlementResult } from './settlement.js'; export { wrapBetterSqlite3Database } from './sqlite-shim.js'; export type { SqlDatabase, SqlStatement } from './sql-db.js'; export type { Zone } from './jessie-tools.js'; +export type { SlotRow } from './gnucash-schema.js'; +export { SLOT_TYPE_GUID, SLOT_TYPE_STRING } from './gnucash-schema.js'; /** * Initialize an empty sqlite database with the GnuCash schema. From 8a1612b16f8b993101b0fdbc3c160ad4339a209d Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 02:55:14 -0600 Subject: [PATCH 67/77] fix: mint payments can be reified after reopen --- packages/ertp-ledgerguise/src/index.ts | 20 +++++------ .../ertp-ledgerguise/test/ledgerguise.test.ts | 35 +++++++++++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 50ebd0c..9789215 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -207,25 +207,25 @@ const makeIssuerKitForCommodity = ({ return makeAmount(record.amount); }, }); + const mintRecoveryGuid = makeDeterministicGuid(`ledgerguise:recovery:${commodityGuid}`); + ensureAccountRow({ + db, + accountGuid: mintRecoveryGuid, + name: `${commodityLabel} Mint Recovery`, + commodityGuid, + accountType: 'STOCK', + }); const mint = exo(`${commodityLabel} Mint`, { getIssuer: () => issuer, mintPayment: (amount: AmountLike) => { const amountValue = assertAmount(amount); const { txGuid, holdingSplitGuid, checkNumber } = transferRecorder.createHold({ - fromAccountGuid: balanceAccountGuid, + fromAccountGuid: mintRecoveryGuid, amount: amountValue, }); - return makePayment(amount, balanceAccountGuid, txGuid, holdingSplitGuid, checkNumber); + return makePayment(amount, mintRecoveryGuid, txGuid, holdingSplitGuid, checkNumber); }, }); - const mintRecoveryGuid = makeDeterministicGuid(`ledgerguise:recovery:${commodityGuid}`); - ensureAccountRow({ - db, - accountGuid: mintRecoveryGuid, - name: `${commodityLabel} Mint Recovery`, - commodityGuid, - accountType: 'STOCK', - }); const mintRecoveryPurse = openPurse(mintRecoveryGuid, `${commodityLabel} Mint Recovery`); const kit = freeze({ brand, diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index 3b7610a..2ac5684 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -354,6 +354,41 @@ test('payments can be reified by check number', t => { t.is(reopenedBob.getCurrentAmount().value, 10n); }); +test('mint payments can be reified after reopen', async t => { + const { freeze } = Object; + const rawDb = new Database(':memory:'); + const db = wrapBetterSqlite3Database(rawDb); + t.teardown(() => rawDb.close()); + initGnuCashSchema(db); + + const makeGuid = mockMakeGuid(); + const commodity = freeze({ + namespace: 'COMMODITY', + mnemonic: 'BUCKS', + }); + const infoP = Promise.withResolvers<{ commodityGuid: Guid; checkNumber: string }>(); + + { + const nowMs = makeTestClock(); + const created = createIssuerKit(freeze({ db, commodity, makeGuid, nowMs })); + const brand = created.brand as Brand<'nat'>; + const bucks = (value: bigint): NatAmount => freeze({ brand, value }); + const payment = created.mint.mintPayment(bucks(10n)); + const checkNumber = created.payments.getCheckNumber(payment); + infoP.resolve({ commodityGuid: created.commodityGuid, checkNumber }); + } + + { + const { commodityGuid, checkNumber } = await infoP.promise; + const reopened = openIssuerKit( + freeze({ db, commodityGuid, makeGuid, nowMs: makeTestClock() }), + ); + const reified = reopened.payments.openPayment(checkNumber); + const live = await reopened.kit.issuer.isLive(reified as never); + t.true(live); + } +}); + test('check numbers increment on collisions', t => { const { freeze } = Object; const rawDb = new Database(':memory:'); From 187e5b70b7656cbc8c0b349eea973e0f26974981 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 04:51:33 -0600 Subject: [PATCH 68/77] docs: recognizer/builder serialization --- ...fe-serialization-under-mutual-suspicion.md | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 packages/ertp-clerk/docs-design/safe-serialization-under-mutual-suspicion.md diff --git a/packages/ertp-clerk/docs-design/safe-serialization-under-mutual-suspicion.md b/packages/ertp-clerk/docs-design/safe-serialization-under-mutual-suspicion.md new file mode 100644 index 0000000..7ec4f08 --- /dev/null +++ b/packages/ertp-clerk/docs-design/safe-serialization-under-mutual-suspicion.md @@ -0,0 +1,46 @@ +# Safe Serialization Under Mutual Suspicion (Miller, 1998) — Summary + +This note summarizes the E Language paper "Safe Serialization Under Mutual Suspicion" (Mark S. Miller, October 3, 1998). The document is partially incomplete, but the core ideas are coherent and useful for capability systems. + +**Thesis** +Serialization can be made compatible with object‑capability security if it is expressed as ordinary object interactions, with explicit mechanisms to control authority, identity, and visibility across the serialization boundary. The system should provide general mechanisms that let different policy choices coexist, rather than baking in one privileged serializer. + +**Core Distinctions** +- **Portrayal vs depiction**: A portrayal is a live object graph of references that the serializer walks. A depiction is the serialized form (e.g., a program in Data‑E) that can reconstruct a graph later. The serializer is only allowed to get portrayals through public interfaces; it never peers into private state. +- **Mechanism vs policy**: The framework provides hooks for policy choices (what to serialize, how much to reveal, what authority to grant) without requiring god‑mode privileges. + +**Data‑E and Uneval** +- Data‑E is a subset of the E language used as a serialization format. A depiction is an executable expression that reconstructs the object graph when evaluated. +- The serializer is framed as a **recognizer** and the unserializer as a **builder**, with the recognizer producing a depiction and the builder evaluating it. +- **Uneval / uncall**: Objects can provide a portrayal via an “uncall” triple that names a reconstructing call (receiver, verb, args). A list of “uncallers” acts as the policy surface for what can be portrayed. + +**Exit Security (authority at the exits)** +- Serialization must not let objects **claim authority they do not have** (veracity). It also must not grant the serializer special introspection powers that bypass capability discipline. +- The design uses **named exit points** to represent references that the serializer does not traverse. These exits are reconnected during unserialization by controlled mappings (e.g., safe import points). +- The exit mechanism is how capability references are preserved or transformed across time/space/version boundaries without letting an attacker forge authority. + +**Subgraph Security (selective transparency)** +- Only a subgraph of the system should be serializable, and only to a serializer that has the right to see it. +- The paper uses **rights amplification** patterns to allow objects to reveal more to a trusted serializer than they would to arbitrary clients. + +**Entry Security (identity at the entries)** +- When unserializing, the new graph must be connected to the surrounding system in a controlled way. +- The paper explores how object identity can be preserved or deliberately changed (e.g., reincarnation), and how identity rights can be chained or transformed across serialization boundaries. + +**Relevance for ERTP / Webkeys** +- The portrayal/depiction split maps well to webkey protocols: a webkey is an exit point, not a data dump. +- Uncall/uneval patterns suggest a principled way to define what objects are exportable and how they are reconstructed without giving the serializer ambient authority. +- The emphasis on veracity and selective transparency aligns with OCAP requirements for ERTP in a hostile network. + +**Caveats** +- The paper is incomplete in places (some chapters flagged as not coherent). +- It is a conceptual framework, not a drop‑in protocol spec. It informs the design of serialization and capability exchange, but still needs concrete protocol decisions. + +**Sources** +- `/home/connolly/Downloads/commons-research/jhu-paper/www.erights.org/data/serial/jhu-paper/index.html` +- `/home/connolly/Downloads/commons-research/jhu-paper/www.erights.org/data/serial/jhu-paper/intro.html` +- `/home/connolly/Downloads/commons-research/jhu-paper/www.erights.org/data/serial/jhu-paper/deconstructing.html` +- `/home/connolly/Downloads/commons-research/jhu-paper/www.erights.org/data/serial/jhu-paper/recog-n-build.html` +- `/home/connolly/Downloads/commons-research/jhu-paper/www.erights.org/data/serial/jhu-paper/exit-security.html` +- `/home/connolly/Downloads/commons-research/jhu-paper/www.erights.org/data/serial/jhu-paper/subgraph-security.html` +- `/home/connolly/Downloads/commons-research/jhu-paper/www.erights.org/data/serial/jhu-paper/entry-security.html` From 9785390a04644c1192186723d2284899da17c678 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 04:52:11 -0600 Subject: [PATCH 69/77] chore: webkey stuff --- packages/ertp-clerk/src/webkey-client.js | 40 +++++++++++++ packages/ertp-clerk/src/webkey-codec.d.ts | 40 +++++++++++++ packages/ertp-clerk/src/webkey-codec.js | 59 ++++++++++++++++++++ packages/ertp-clerk/src/webkey-protocol.d.ts | 2 + packages/ertp-clerk/src/webkey-protocol.js | 11 ++++ 5 files changed, 152 insertions(+) create mode 100644 packages/ertp-clerk/src/webkey-client.js create mode 100644 packages/ertp-clerk/src/webkey-codec.d.ts create mode 100644 packages/ertp-clerk/src/webkey-codec.js create mode 100644 packages/ertp-clerk/src/webkey-protocol.d.ts create mode 100644 packages/ertp-clerk/src/webkey-protocol.js diff --git a/packages/ertp-clerk/src/webkey-client.js b/packages/ertp-clerk/src/webkey-client.js new file mode 100644 index 0000000..5bd9e87 --- /dev/null +++ b/packages/ertp-clerk/src/webkey-client.js @@ -0,0 +1,40 @@ +import { encodeClientValue, decodeClientValue } from './webkey-codec.js'; +import { extractToken } from './webkey-protocol.js'; + +const makeClient = (apiUrl) => { + const keyToProxy = (webkey, allegedInterface = 'Remotable') => { + const post = async (method, ...args) => { + const url = new URL(apiUrl); + const token = extractToken(webkey); + url.searchParams.set('s', token); + url.searchParams.set('q', method); + const res = await fetch(url, { + method: 'POST', + headers: { 'content-type': 'text/plain' }, + body: JSON.stringify(args.map(encodeClientValue)), + }); + const data = await res.json(); + if ('=' in data) return decodeClientValue(data['='], keyToProxy); + if ('@' in data) return keyToProxy(data['@']); + if ('!' in data) throw new Error(data['!']); + throw new Error('rpc error'); + }; + const target = { webkey, isProxy: true, post }; + Object.defineProperty(target, Symbol.toStringTag, { + value: allegedInterface, + writable: false, + enumerable: false, + configurable: false, + }); + return new Proxy(target, { + get(innerTarget, prop) { + if (prop in innerTarget) return innerTarget[prop]; + if (prop === 'then') return undefined; + return (...args) => innerTarget.post(prop, ...args); + }, + }); + }; + return { keyToProxy }; +}; + +export { makeClient }; diff --git a/packages/ertp-clerk/src/webkey-codec.d.ts b/packages/ertp-clerk/src/webkey-codec.d.ts new file mode 100644 index 0000000..1d433d2 --- /dev/null +++ b/packages/ertp-clerk/src/webkey-codec.d.ts @@ -0,0 +1,40 @@ +export function isRecord(value: unknown): value is Record; +export function isBigIntRecord( + value: unknown, +): value is { '+': string } | { '-': string }; +export function encodeBigInt(value: bigint): { '+': string } | { '-': string }; +export function decodeBigIntRecord( + value: { '+': string } | { '-': string }, +): bigint; +export function isWebkeyRef(value: unknown): value is { '@': string }; +export function encodeClientValue( + value: unknown, + options?: { + getProxyRef?: (value: unknown) => string | undefined | null; + }, +): WireEncoding; +export function decodeClientValue( + value: WireEncoding, + keyToProxy: (webkey: string) => unknown, +): unknown; + +export type WireEncodingRecord = { [key: string]: WireEncoding }; + +export type WireEncoding = + | null + | boolean + | number + | string + | { '+': `${number}` } + | { '-': `${number}` } + | { '@': string } + | { + call: { + receiver: WireEncoding; + method: string | null; + args: ReadonlyArray; + }; + } + | { get: { receiver: WireEncoding; key: string | number } } + | ReadonlyArray + | Readonly; diff --git a/packages/ertp-clerk/src/webkey-codec.js b/packages/ertp-clerk/src/webkey-codec.js new file mode 100644 index 0000000..c63c055 --- /dev/null +++ b/packages/ertp-clerk/src/webkey-codec.js @@ -0,0 +1,59 @@ +const isRecord = (value) => !!value && typeof value === 'object' && !Array.isArray(value); + +const isBigIntRecord = (value) => { + if (!isRecord(value)) return false; + const keys = Object.keys(value); + if (keys.length !== 1) return false; + if (keys[0] !== '+' && keys[0] !== '-') return false; + const entry = value[keys[0]]; + return typeof entry === 'string'; +}; + +const encodeBigInt = (value) => { + if (value < 0n) return { '-': (-value).toString() }; + return { '+': value.toString() }; +}; + +const decodeBigIntRecord = (value) => { + if ('+' in value) return BigInt(value['+']); + return -BigInt(value['-']); +}; + +const isWebkeyRef = (value) => isRecord(value) && '@' in value && typeof value['@'] === 'string'; + +const encodeClientValue = (value, options = {}) => { + const { getProxyRef } = options; + if (typeof value === 'bigint') return encodeBigInt(value); + const proxyRef = getProxyRef ? getProxyRef(value) : undefined; + if (proxyRef) return { '@': proxyRef }; + if (!getProxyRef && value && typeof value === 'object' && value.isProxy && value.webkey) { + return { '@': value.webkey }; + } + if (Array.isArray(value)) return value.map((entry) => encodeClientValue(entry, options)); + if (isRecord(value)) { + return Object.fromEntries( + Object.entries(value).map(([k, v]) => [k, encodeClientValue(v, options)]), + ); + } + return value; +}; + +const decodeClientValue = (value, keyToProxy) => { + if (isBigIntRecord(value)) return decodeBigIntRecord(value); + if (isWebkeyRef(value)) return keyToProxy(value['@']); + if (Array.isArray(value)) return value.map((entry) => decodeClientValue(entry, keyToProxy)); + if (isRecord(value)) { + return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, decodeClientValue(v, keyToProxy)])); + } + return value; +}; + +export { + isRecord, + isBigIntRecord, + encodeBigInt, + decodeBigIntRecord, + isWebkeyRef, + encodeClientValue, + decodeClientValue, +}; diff --git a/packages/ertp-clerk/src/webkey-protocol.d.ts b/packages/ertp-clerk/src/webkey-protocol.d.ts new file mode 100644 index 0000000..ac204b5 --- /dev/null +++ b/packages/ertp-clerk/src/webkey-protocol.d.ts @@ -0,0 +1,2 @@ +export function extractToken(webkey: string): string; +export function makeWebkey(origin: string, token: string): string; diff --git a/packages/ertp-clerk/src/webkey-protocol.js b/packages/ertp-clerk/src/webkey-protocol.js new file mode 100644 index 0000000..c343ead --- /dev/null +++ b/packages/ertp-clerk/src/webkey-protocol.js @@ -0,0 +1,11 @@ +const extractToken = (webkey) => { + const hashIndex = webkey.indexOf('#s='); + if (hashIndex >= 0) return webkey.slice(hashIndex + 3); + const queryIndex = webkey.indexOf('?s='); + if (queryIndex >= 0) return webkey.slice(queryIndex + 3); + return webkey; +}; + +const makeWebkey = (origin, token) => `${origin}/ocaps/#s=${token}`; + +export { extractToken, makeWebkey }; From 44ba7e28a65d49f0e000e105012223e17c785beb Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 04:52:35 -0600 Subject: [PATCH 70/77] build: ava test etc. --- packages/ertp-clerk/package.json | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/ertp-clerk/package.json b/packages/ertp-clerk/package.json index efc8633..de542d9 100644 --- a/packages/ertp-clerk/package.json +++ b/packages/ertp-clerk/package.json @@ -8,18 +8,32 @@ "dev": "wrangler dev", "lint:types": "tsc -p tsconfig.json --noEmit --incremental", "smoke": "node scripts/smoke.js", - "postinstall": "patch-package", - "test": "npm run smoke", + "test": "ava", "check": "npm run lint:types && npm run test" }, "dependencies": { - "capnweb": "^0.4.0", "drizzle-orm": "^0.44.5" }, "devDependencies": { "@types/node": "^24.0.0", - "patch-package": "^8.0.1", + "@types/better-sqlite3": "^7.6.1", + "ava": "^5.3.1", + "ts-blank-space": "^0.6.2", "typescript": "~5.9.3", "wrangler": "^4.59.2" + }, + "ava": { + "extensions": { + "js": true, + "ts": "module" + }, + "files": [ + "test/**/*.test.*" + ], + "nodeArguments": [ + "--import=ts-blank-space/register", + "--no-warnings" + ], + "require": [] } } From 6c9908de61b0257bdef2dae4b4ac5608da51cdb8 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 04:53:46 -0600 Subject: [PATCH 71/77] WIP: webkey docs rev --- packages/ertp-clerk/docs-design/waterken-webkey.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/ertp-clerk/docs-design/waterken-webkey.md b/packages/ertp-clerk/docs-design/waterken-webkey.md index 2048f60..249c6aa 100644 --- a/packages/ertp-clerk/docs-design/waterken-webkey.md +++ b/packages/ertp-clerk/docs-design/waterken-webkey.md @@ -2,7 +2,7 @@ ## Context -ERTP for Cloudflare Workers needs a robust remote capability protocol that preserves object identity across the network boundary, supports passing capabilities back to the service, and can be implemented in a Worker + Durable Objects environment. Cap'n Web (capnweb) currently requires an identity-preservation patch in `ertp-clerk` to keep `WeakMap`-based identity checks working. That makes Cap'n Web one possible strategy, not the only one. +ERTP for Cloudflare Workers needs a robust remote capability protocol that preserves object identity across the network boundary, supports passing capabilities back to the service, and can be implemented in a Worker + Durable Objects environment. Cap'n Web was an initial implementation strategy; this document focuses on Waterken web-keys for the current design. This note summarizes the Waterken web-key protocol and evaluates it for ERTP, based on: @@ -64,7 +64,7 @@ Waterken web-keys, as concretely implemented by Capper, appear *adequate* as a r 2. **Define a canonicalization rule** for webkeys to preserve identity semantics (one object == one canonical webkey). 3. **Document failure behaviors for ERTP methods**, given errors are sealed and any caller-visible signals should be returned as non-error values. -Under these constraints, the Waterken web-key approach provides a simpler, Worker-friendly alternative to Cap'n Web while preserving the remote object identity ERTP needs. +Under these constraints, the Waterken web-key approach provides a simpler, Worker-friendly protocol while preserving the remote object identity ERTP needs. ## Suggested next steps @@ -151,6 +151,10 @@ tooling that expects `slots.obj_guid` to always be a real object GUID will ignor them. If you need an object → token lookup, return the token at mint time (no reverse lookup), or add a *second* non-indexed slot keyed by the object GUID. +Mapping detail: for purse tokens, store the account GUID in `guid_val` and the +commodity GUID in `string_val`; for payment tokens, store the commodity GUID in +`guid_val` and the check number in `string_val`. + Additional clarifications: - This design **diverges from Capper**: Capper treats the credential as the object From 1df044e7b97d9b450f053d9a91af717208727107 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 04:56:26 -0600 Subject: [PATCH 72/77] WIP: code test working --- packages/ertp-clerk/CONTRIBUTING.md | 19 +- packages/ertp-clerk/README.md | 4 +- .../ertp-clerk/patches/capnweb+0.4.0.patch | 28 - packages/ertp-clerk/scripts/smoke.js | 60 +- packages/ertp-clerk/src/gnucash-zone.ts | 272 +++++++ packages/ertp-clerk/src/index.ts | 14 +- packages/ertp-clerk/src/ledger-codec.ts | 713 ++++++++++++++++++ packages/ertp-clerk/src/ledger-do.ts | 546 +++++++++++--- packages/ertp-clerk/test/ledger-codec.test.ts | 275 +++++++ packages/ertp-clerk/tsconfig.json | 19 + 10 files changed, 1784 insertions(+), 166 deletions(-) delete mode 100644 packages/ertp-clerk/patches/capnweb+0.4.0.patch create mode 100644 packages/ertp-clerk/src/gnucash-zone.ts create mode 100644 packages/ertp-clerk/src/ledger-codec.ts create mode 100644 packages/ertp-clerk/test/ledger-codec.test.ts create mode 100644 packages/ertp-clerk/tsconfig.json diff --git a/packages/ertp-clerk/CONTRIBUTING.md b/packages/ertp-clerk/CONTRIBUTING.md index 5e61fd1..97dcea3 100644 --- a/packages/ertp-clerk/CONTRIBUTING.md +++ b/packages/ertp-clerk/CONTRIBUTING.md @@ -4,10 +4,10 @@ Thanks for your interest in contributing! This package will host the worker/serv ## Status checklist -- [ ] Land a Worker-friendly remote capability protocol for ERTP access. +- [x] Land a Worker-friendly remote capability protocol for ERTP access. - [x] Scaffold worker package (wrangler, minimal README/CONTRIBUTING). - - [x] Add RPC bootstrap and entry points (Cap'n Web initial implementation). - - [x] Wrap ledgerguise facets for RPC and address identity/stub semantics (capnweb patch). + - [x] Add RPC bootstrap and entry points (webkey protocol). + - [x] Wrap ledgerguise facets for RPC and address identity semantics. - [x] Provide smoke tests for the worker RPC. - [ ] Re-validate end-to-end once ledgerguise is green again. @@ -27,23 +27,16 @@ Thanks for your interest in contributing! This package will host the worker/serv - `wrangler dev` - Smoke test: `npm run smoke` (requires dev server running). -## capnweb identity patch - -We currently patch capnweb to preserve identity for export targets when a client sends a capability back to the worker. Without this patch, payments arrive as new import stubs and fail `WeakMap` identity checks (`payment not live`). Track upstream status and remove the patch once capnweb offers a supported identity mapping hook. - ## TODO - [x] Create protocol evaluation notes in `docs-design/` (Waterken web-key summary). -- [ ] Define the RPC interface surface for issuer/brand/purse/payment facets. -- [ ] Decide how capability references will be issued and revoked. +- [x] Define the RPC interface surface for issuer/brand/purse/payment facets (MVP). +- [x] Document slots-based capability token mapping assumptions. +- [ ] Decide how capability references will be issued and revoked beyond MVP. - [ ] Choose deployment target (Cloudflare Workers, workerd, or both) and document local dev. - [ ] Add request routing conventions (per-ledger DO instance vs per-commodity vs per-org). -- [ ] Add error taxonomy and map ledger errors to HTTP status codes. - [ ] Confirm whether the wrangler dependency warning about rollup-plugin-inject is acceptable or needs remediation per best practices. -- [ ] Evaluate alternatives to loading capnweb from esm.sh (e.g., bundling locally). - [ ] Replace better-sqlite3 with a Worker-compatible backend (Durable Object SQLite or D1) and keep IO injected. - [ ] Use drizzle migrations for schema setup instead of inline bootstrap SQL. -- [ ] Investigate HTTP batch RPC support in wrangler/miniflare (smoke test uses WebSockets for now). -- [ ] Track the capnweb identity patch and remove it once upstream supports returning original export targets. - [ ] Consider moving the External wrapper into ertp-ledgerguise (Far/exo-style) so facets are RPC-ready. - [ ] Replace the relative import of ertp-ledgerguise src with a proper package build or bundler config. diff --git a/packages/ertp-clerk/README.md b/packages/ertp-clerk/README.md index de42dc5..6cc48a8 100644 --- a/packages/ertp-clerk/README.md +++ b/packages/ertp-clerk/README.md @@ -7,5 +7,5 @@ protocol is WIP; see CONTRIBUTING. - Visit `/` to load a small page that exposes `globalThis.bootstrap` in the browser console. - Call `await bootstrap.makeIssuerKit("BUCKS")` to obtain issuer facets backed by the durable ledger. -- `/api` is the RPC endpoint. The concrete protocol is under active evaluation - (see `docs-design/waterken-webkey.md`). +- `/api` is the RPC endpoint using a Waterken-style webkey protocol (see + `docs-design/waterken-webkey.md`). diff --git a/packages/ertp-clerk/patches/capnweb+0.4.0.patch b/packages/ertp-clerk/patches/capnweb+0.4.0.patch deleted file mode 100644 index 0d27187..0000000 --- a/packages/ertp-clerk/patches/capnweb+0.4.0.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff --git a/node_modules/capnweb/dist/index-workers.js b/node_modules/capnweb/dist/index-workers.js -index ff4527f..f5392b0 100644 ---- a/node_modules/capnweb/dist/index-workers.js -+++ b/node_modules/capnweb/dist/index-workers.js -@@ -1384,6 +1384,9 @@ var Evaluator = class _Evaluator { - return stub; - } - }; -+ if (!isPromise && value.length == 2 && hook instanceof TargetStubHook) { -+ return hook.getTarget(); -+ } - if (value.length == 2) { - if (isPromise) { - return addStub(hook.get([])); -diff --git a/node_modules/capnweb/dist/index.js b/node_modules/capnweb/dist/index.js -index b6f9cdc..e66777b 100644 ---- a/node_modules/capnweb/dist/index.js -+++ b/node_modules/capnweb/dist/index.js -@@ -1381,6 +1381,9 @@ var Evaluator = class _Evaluator { - return stub; - } - }; -+ if (!isPromise && value.length == 2 && hook instanceof TargetStubHook) { -+ return hook.getTarget(); -+ } - if (value.length == 2) { - if (isPromise) { - return addStub(hook.get([])); diff --git a/packages/ertp-clerk/scripts/smoke.js b/packages/ertp-clerk/scripts/smoke.js index b6f615c..9329c4b 100644 --- a/packages/ertp-clerk/scripts/smoke.js +++ b/packages/ertp-clerk/scripts/smoke.js @@ -1,24 +1,50 @@ -import { newWebSocketRpcSession } from 'capnweb'; +import { makeClient } from '../src/webkey-client.js'; const baseUrl = process.env.ERTP_CLERK_URL ?? 'http://localhost:8787'; const apiUrl = new URL('/api', baseUrl); -apiUrl.protocol = apiUrl.protocol === 'https:' ? 'wss:' : 'ws:'; -const socket = new WebSocket(apiUrl); -const api = newWebSocketRpcSession(socket); -const kit = await api.makeIssuerKit('BUCKS'); -const name = await kit.brand.getAllegedName(); -const alice = await kit.issuer.makeEmptyPurse(); -const bob = await kit.issuer.makeEmptyPurse(); -const amount = { brand: kit.brand, value: 10n }; -const payment = await kit.mint.mintPayment(amount); -await alice.deposit(payment); -const paymentToBob = await alice.withdraw(amount); -await bob.deposit(paymentToBob); -const aliceAmount = await alice.getCurrentAmount(); -const bobAmount = await bob.getCurrentAmount(); +const bootstrapUrl = new URL('/bootstrap', baseUrl); +bootstrapUrl.searchParams.set('format', 'json'); + +const { webkey } = await fetch(bootstrapUrl).then((res) => res.json()); +const client = makeClient(apiUrl); +const bootstrap = client.keyToProxy(webkey); +const { issuer, brand, payment: pmt1 } = await (async () => { + const kit = await bootstrap.makeIssuerKit('BUCKS'); + const amount = { brand: kit.brand, value: 10n }; + const payment = await kit.mint.mintPayment(amount); + return { issuer: kit.issuer, brand: kit.brand, payment }; +})(); + +const makeParty = async (issuer, name, counterpartyDepositFacet = null) => { + const purse = await issuer.makeEmptyPurse(); + return Object.freeze({ + name, + getDepositFacet: () => purse.getDepositFacet(), + getBalance: () => purse.getCurrentAmount(), + deposit: (payment) => purse.deposit(payment), + payCounterparty: async (amount) => { + if (!counterpartyDepositFacet) { + throw new Error('no counterparty deposit facet configured'); + } + const payment = await purse.withdraw(amount); + return counterpartyDepositFacet.receive(payment); + }, + }); +}; + +const amount = { brand, value: 10n }; +const bob = await makeParty(issuer, 'Bob'); +const bobDeposit = await bob.getDepositFacet(); +const alice = await makeParty(issuer, 'Alice', bobDeposit); + +await alice.deposit(pmt1); + +await alice.payCounterparty(amount); + +const aliceAmount = await alice.getBalance(); +const bobAmount = await bob.getBalance(); +const name = await brand.getAllegedName(); console.log('issuer kit brand:', name); console.log('alice amount:', aliceAmount); console.log('bob amount:', bobAmount); -socket.close(); -await new Promise((resolve) => socket.addEventListener('close', resolve, { once: true })); diff --git a/packages/ertp-clerk/src/gnucash-zone.ts b/packages/ertp-clerk/src/gnucash-zone.ts new file mode 100644 index 0000000..de404c2 --- /dev/null +++ b/packages/ertp-clerk/src/gnucash-zone.ts @@ -0,0 +1,272 @@ +import type { SlotRow, SqlDatabase } from '../../ertp-ledgerguise/src/index.js'; +import { + decodeBigIntRecord, + encodeBigInt, + isBigIntRecord, + isRecord, + isWebkeyRef, +} from './webkey-codec.js'; +import { extractToken, makeWebkey } from './webkey-protocol.js'; + +type TokenMetaBase = { reviver: string }; + +type ExportRuleContext = { + targetMeta: Meta; + methodName: string; + origin: string; + kit?: unknown; +} & Extra; + +type ExportRule = ( + value: unknown, + context: ExportRuleContext, +) => Promise; + +type ExportRules = Map< + string, + Map> +>; + +type Reifier = (meta: Meta) => object; + +type Reifiers = Map>; + +type Zone = { + exo: >( + name: string, + methods: T, + ) => Readonly; +}; + +type SlotCodecRow = Pick; + +type SlotCodec = { + encode: (meta: Meta) => { + name: string; + slotType: number; + guidVal: string | null; + stringVal: string | null; + }; + decode: (row: SlotCodecRow) => Meta; + bootstrapMeta: () => Meta; + equals?: (left: Meta, right: Meta) => boolean; +}; + +type GnuCashZoneRegistry = { + resolveToken: (token: string) => Promise<{ obj: object; meta: Meta }>; + ensureBootstrapToken: () => Promise; +}; + +type GnuCashZoneMarshal = { + hydrateValue: (value: unknown) => Promise; + exportValue: (value: unknown, context: ExportRuleContext) => Promise; +}; + +type GnuCashZoneKit = { + zone: Zone; + registry: GnuCashZoneRegistry; + marshal: GnuCashZoneMarshal; +}; + +type StorageLike = { + get: (key: string) => Promise; + put: (key: string, value: string) => Promise; +}; + +type GnuCashZoneArgs = { + db: SqlDatabase; + storage?: StorageLike; + exportRules: ExportRules; + reifiers: Reifiers; + makeToken: () => string; + slotCodec: SlotCodec; + buildMeta?: ( + interfaceName: string, + methods: Record, + ) => Meta | null; +}; + +const freezeProps = >( + obj: T, +): Readonly => { + for (const key of Reflect.ownKeys(obj)) { + const value = obj[key]; + if (typeof value === 'function') { + Object.freeze(value); + } + } + return Object.freeze(obj); +}; + +const makeGnuCashZoneKit = ({ + db, + storage, + exportRules, + reifiers, + makeToken, + slotCodec, + buildMeta, +}: GnuCashZoneArgs): GnuCashZoneKit => { + const liveToToken = new WeakMap(); + const tokenToLive = new Map(); + const tokenToMeta = new Map(); + const zone: Zone = { + exo: >( + interfaceName: string, + methods: T, + ): Readonly => { + const target = Object.defineProperty(methods, Symbol.toStringTag, { + value: `?${interfaceName}?`, + }); + const frozen = freezeProps(target); + const token = makeToken(); + liveToToken.set(frozen as object, token); + tokenToLive.set(token, frozen as object); + const meta = buildMeta ? buildMeta(interfaceName, methods) : null; + if (meta) { + insertSlot(token, meta); + tokenToMeta.set(token, meta); + } + return frozen as Readonly; + }, + }; + + const insertSlot = (token: string, meta: Meta) => { + const { name, slotType, guidVal, stringVal } = slotCodec.encode(meta); + db.prepare( + `INSERT INTO slots(obj_guid, name, slot_type, guid_val, string_val) + VALUES (?, ?, ?, ?, ?)`, + ).run(token, name, slotType, guidVal, stringVal); + }; + + const attachMeta = (token: string, meta: Meta) => { + const known = tokenToMeta.get(token); + if (known) { + if (slotCodec.equals && !slotCodec.equals(known, meta)) { + throw new Error('conflicting token metadata'); + } + return; + } + insertSlot(token, meta); + tokenToMeta.set(token, meta); + }; + + const resolveToken = async (token: string): Promise<{ obj: object; meta: Meta }> => { + const live = tokenToLive.get(token); + const meta = tokenToMeta.get(token); + if (live && meta) return { obj: live, meta }; + + const row = db + .prepare<[string], SlotCodecRow>('SELECT name, guid_val, string_val FROM slots WHERE obj_guid = ?') + .get(token); + if (!row) { + throw new Error('unknown capability'); + } + const parsed = slotCodec.decode(row); + + const reifier = reifiers.get(parsed.reviver); + if (!reifier) throw new Error('unknown capability reviver'); + const obj = reifier(parsed); + + tokenToLive.set(token, obj); + tokenToMeta.set(token, parsed); + liveToToken.set(obj, token); + return { obj, meta: parsed }; + }; + + const hydrateValue = async (value: unknown): Promise => { + if (isBigIntRecord(value)) { + return decodeBigIntRecord(value); + } + if (isWebkeyRef(value) && typeof value['@'] === 'string') { + const token = extractToken(value['@']); + const resolved = await resolveToken(token); + return resolved.obj; + } + if (Array.isArray(value)) { + return Promise.all(value.map(entry => hydrateValue(entry))); + } + if (isRecord(value)) { + const entries = await Promise.all( + Object.entries(value).map(async ([key, entry]) => [ + key, + await hydrateValue(entry), + ]), + ); + return Object.fromEntries(entries); + } + return value; + }; + + const exportValue = async ( + value: unknown, + context: ExportRuleContext, + ): Promise => { + if (typeof value === 'bigint') return encodeBigInt(value); + if (!value || typeof value !== 'object') return value; + if (Array.isArray(value)) { + return Promise.all(value.map(entry => exportValue(entry, context))); + } + const token = liveToToken.get(value as object); + if (token) { + if (!tokenToMeta.has(token)) { + const rules = exportRules.get(context.targetMeta.reviver); + const rule = rules?.get(context.methodName); + if (!rule) { + throw new Error('unexportable object'); + } + const meta = await rule(value, context); + if (!meta) { + throw new Error('unexportable object'); + } + attachMeta(token, meta); + } + return { '@': makeWebkey(context.origin, token) }; + } + if (isRecord(value)) { + const entries = await Promise.all( + Object.entries(value).map(async ([key, entry]) => [ + key, + await exportValue(entry, context), + ]), + ); + return Object.fromEntries(entries); + } + return value; + }; + + const ensureBootstrapToken = async (): Promise => { + const existing = await storage?.get('bootstrapToken'); + if (existing) return existing; + const token = makeToken(); + insertSlot(token, slotCodec.bootstrapMeta()); + if (storage) await storage.put('bootstrapToken', token); + return token; + }; + + return { + zone, + registry: { + resolveToken, + ensureBootstrapToken, + }, + marshal: { + hydrateValue, + exportValue, + }, + }; +}; + +export { makeGnuCashZoneKit }; +export type { + ExportRule, + ExportRuleContext, + ExportRules, + GnuCashZoneKit, + GnuCashZoneMarshal, + GnuCashZoneRegistry, + Reifier, + Reifiers, + TokenMetaBase, + SlotCodec, +}; diff --git a/packages/ertp-clerk/src/index.ts b/packages/ertp-clerk/src/index.ts index 287eb11..e26de6e 100644 --- a/packages/ertp-clerk/src/index.ts +++ b/packages/ertp-clerk/src/index.ts @@ -31,13 +31,6 @@ const html = ` `; -const bootstrapModule = `const { newWebSocketRpcSession } = await import('https://esm.sh/capnweb@0.4.0'); -const url = new URL('/api', globalThis.location.href); -url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'; -const bootstrap = newWebSocketRpcSession(url.toString()); -export { bootstrap }; -`; - const handler = { async fetch(request: Request, env: Env): Promise { const url = new URL(request.url); @@ -46,15 +39,10 @@ const handler = { headers: { 'content-type': 'text/html; charset=utf-8' }, }); } - if (url.pathname === '/bootstrap') { - return new Response(bootstrapModule, { - headers: { 'content-type': 'application/javascript; charset=utf-8' }, - }); - } if (url.pathname === '/favicon.ico') { return new Response(null, { status: 204 }); } - if (url.pathname === '/api') { + if (url.pathname === '/api' || url.pathname === '/bootstrap') { const stub = env.LEDGER.get(env.LEDGER.idFromName('default')); return stub.fetch(request); } diff --git a/packages/ertp-clerk/src/ledger-codec.ts b/packages/ertp-clerk/src/ledger-codec.ts new file mode 100644 index 0000000..117dc9d --- /dev/null +++ b/packages/ertp-clerk/src/ledger-codec.ts @@ -0,0 +1,713 @@ +import type { SqlDatabase } from '../../ertp-ledgerguise/src/index.js'; +import { asGuid, openIssuerKit } from '../../ertp-ledgerguise/src/index.js'; +import type { + AccountPurse, + Guid, + IssuerKitForCommodity, + IssuerKitWithPurseGuids, + PaymentAccess, +} from '../../ertp-ledgerguise/src/types.js'; +import { SLOT_TYPE_STRING } from '../../ertp-ledgerguise/src/gnucash-schema.js'; +import type { WireEncoding } from './webkey-codec.js'; +import { + decodeBigIntRecord, + encodeBigInt, + isBigIntRecord, + isRecord, +} from './webkey-codec.js'; + +type Depiction = WireEncoding; +type Uncall = readonly [ + receiver: unknown, + method: string | null, + args: ReadonlyArray, +]; + +type AssetChainStep = + | Readonly<{ get: string | number }> + | Readonly<{ call: { method: string | null; args: ReadonlyArray } }>; + +type RefCodec = { + makeRef: (token: string) => string; + parseRef: (ref: string) => string; +}; + +type KitRecord = { + commodityGuid: Guid; + kit: { issuer: object; brand: object; mint: object }; + payments: PaymentAccess; + purses?: IssuerKitWithPurseGuids['purses']; + purseGuids?: IssuerKitForCommodity['purseGuids']; + accounts: IssuerKitForCommodity['accounts']; + knownPurses: Set; + paymentByCheck: Map; + accountsWrapper?: IssuerKitForCommodity['accounts']; + paymentsWrapper?: IssuerKitForCommodity['payments']; +}; + +type LedgerCodecArgs = { + db: SqlDatabase; + nowMs: () => number; + makeGuid: () => Guid; + makeToken: () => string; + refCodec: RefCodec; +}; + +type CallRecord = { + call: { + receiver: Depiction; + method: string | null; + args: ReadonlyArray; + }; +}; + +type GetRecord = { + get: { + receiver: Depiction; + key: string | number; + }; +}; + +const { freeze } = Object; +const OPEN_ASSET_TOKEN = 'openAsset'; +const SLOT_NAME_WEBKEY = 'webkey'; + +const objectMap = ( + source: Record, + map: (value: unknown, key: string) => T, +): Readonly> => + freeze( + Object.fromEntries( + Object.entries(source).map(([key, value]) => [key, map(value, key)]), + ), + ); + +const isPassByCopyDefault = (value: unknown): boolean => { + if (value === null) return true; + const t = typeof value; + if (t !== 'object') return true; + if (Array.isArray(value)) return true; + if (!isRecord(value)) return false; + for (const entry of Object.values(value)) { + if (typeof entry === 'function') return false; + } + return true; +}; + +const isRefRecord = (value: unknown): value is { '@': string } => + isRecord(value) && '@' in value && typeof value['@'] === 'string'; + +const isCallRecord = (value: unknown): value is CallRecord => + isRecord(value) && 'call' in value && isRecord(value.call); + +const isGetRecord = (value: unknown): value is GetRecord => + isRecord(value) && 'get' in value && isRecord(value.get); + +const makeBuilder = (args: { + refCodec: RefCodec; + openAsset: (commodityGuid: string) => { + issuer: object; + brand: object; + mint: object; + accounts: IssuerKitForCommodity['accounts']; + payments: IssuerKitForCommodity['payments']; + }; + purseToGuid: WeakMap; + liveToToken: WeakMap; + tokenToLive: Map; + loadDepiction: (token: string) => Depiction; +}) => { + const { refCodec, openAsset, purseToGuid, liveToToken, tokenToLive, loadDepiction } = args; + const depositFacetByPurse = new WeakMap(); + const build = (depiction: Depiction): unknown => { + if (isBigIntRecord(depiction)) return decodeBigIntRecord(depiction); + if (isRefRecord(depiction)) { + const token = refCodec.parseRef(depiction['@']); + if (token === OPEN_ASSET_TOKEN) return openAsset; + const existing = tokenToLive.get(token); + if (existing) return existing; + const value = build(loadDepiction(token)); + if (value && typeof value === 'object') { + liveToToken.set(value as object, token); + tokenToLive.set(token, value as object); + } + return value; + } + if (isCallRecord(depiction)) { + const receiver = build(depiction.call.receiver); + const args = depiction.call.args.map(arg => build(arg)); + const methodName = depiction.call.method; + if (!methodName) { + if (typeof receiver !== 'function') + throw new Error('call target is not a function'); + return (receiver as (...innerArgs: unknown[]) => unknown)(...args); + } + if (methodName === 'getDepositFacet') { + const guid = purseToGuid.get(receiver as object); + if (guid) { + const existing = depositFacetByPurse.get(receiver as object); + if (existing) return existing; + const method = (receiver as { getDepositFacet: () => object }) + .getDepositFacet; + if (typeof method !== 'function') + throw new Error('unknown call target'); + const facet = method.call(receiver); + depositFacetByPurse.set(receiver as object, facet); + return facet; + } + } + const method = (receiver as Record)[methodName]; + if (typeof method !== 'function') throw new Error('unknown call target'); + return (method as (...innerArgs: unknown[]) => unknown)(...args); + } + if (isGetRecord(depiction)) { + const receiver = build(depiction.get.receiver) as Record; + const key = depiction.get.key; + return receiver[key]; + } + if (Array.isArray(depiction)) { + return freeze(depiction.map(entry => build(entry as Depiction))); + } + if (isRecord(depiction)) { + return objectMap(depiction, entry => build(entry as Depiction)); + } + return depiction; + }; + return freeze({ build }); +}; + +const makeLedgerCodec = ({ + db, + nowMs, + makeGuid, + makeToken: _makeToken, + refCodec, +}: LedgerCodecArgs) => { + const kits = new Map(); + const uncallersByObject = new WeakMap Uncall | null>(); + const purseToGuid = new WeakMap(); + const liveToToken = new WeakMap(); + const tokenToLive = new Map(); + const tokenToDepiction = new Map(); + + const openAsset = (commodityGuid: string) => { + const guid = asGuid(commodityGuid); + let kit = kits.get(guid); + if (!kit) { + const opened = openIssuerKit({ + db, + commodityGuid: guid, + makeGuid, + nowMs, + }); + const newKit: KitRecord = { + commodityGuid: guid, + kit: opened.kit, + payments: opened.payments, + accounts: opened.accounts, + purseGuids: opened.purseGuids, + knownPurses: new Set(), + paymentByCheck: new Map(), + }; + newKit.accountsWrapper = freeze({ + makeAccountPurse: newKit.accounts.makeAccountPurse, + openAccountPurse: (accountGuid: Guid | string) => { + const purseGuid = asGuid(String(accountGuid)); + const purse = newKit.accounts.openAccountPurse(purseGuid); + newKit.knownPurses.add(purse); + purseToGuid.set(purse, purseGuid); + return purse; + }, + }); + newKit.paymentsWrapper = freeze({ + getCheckNumber: newKit.payments.getCheckNumber, + openPayment: (checkNumber: string) => { + const existing = newKit.paymentByCheck.get(checkNumber); + if (existing) return existing; + const payment = newKit.payments.openPayment(checkNumber); + newKit.paymentByCheck.set(checkNumber, payment); + // registry handled by uncaller sidecar + return payment; + }, + }); + kits.set(guid, newKit); + uncallersByObject.set(opened.kit.issuer, () => [ + opened.kit.mint, + 'getIssuer', + [], + ]); + uncallersByObject.set(opened.kit.brand, () => [ + opened.kit.issuer, + 'getBrand', + [], + ]); + uncallersByObject.set(opened.kit.mint, () => [ + getAssetProp, + null, + [newKit.commodityGuid, 'mint'], + ]); + uncallersByObject.set(opened.accounts as object, () => [ + getAssetProp, + null, + [newKit.commodityGuid, 'accounts'], + ]); + uncallersByObject.set(opened.payments as object, () => [ + getAssetProp, + null, + [newKit.commodityGuid, 'payments'], + ]); + kit = newKit; + } + if (!kit) { + throw new Error('failed to open asset'); + } + return { + issuer: kit.kit.issuer, + brand: kit.kit.brand, + mint: kit.kit.mint, + accounts: kit.accountsWrapper ?? kit.accounts, + payments: kit.paymentsWrapper ?? kit.payments, + }; + }; + + const getAssetProp = (commodityGuid: Guid | string, key: string | number) => { + const asset = openAsset(String(commodityGuid)) as Record; + return asset[key]; + }; + + const callAssetProp = ( + commodityGuid: Guid | string, + key: string | number, + method: string | null, + args: ReadonlyArray, + ) => { + const receiver = getAssetProp(commodityGuid, key); + if (!method) { + if (typeof receiver !== 'function') + throw new Error('call target is not a function'); + return (receiver as (...innerArgs: unknown[]) => unknown)(...args); + } + const fn = (receiver as Record)[method]; + if (typeof fn !== 'function') throw new Error('unknown call target'); + return (fn as (...innerArgs: unknown[]) => unknown)(...args); + }; + + const callAssetChain = ( + commodityGuid: Guid | string, + steps: ReadonlyArray, + ) => { + let current: unknown = openAsset(String(commodityGuid)); + for (const step of steps) { + if ('get' in step) { + current = (current as Record)[step.get]; + continue; + } + const { method, args } = step.call; + if (!method) { + if (typeof current !== 'function') + throw new Error('call target is not a function'); + current = (current as (...innerArgs: unknown[]) => unknown)(...args); + continue; + } + const fn = (current as Record)[method]; + if (typeof fn !== 'function') throw new Error('unknown call target'); + current = (fn as (...innerArgs: unknown[]) => unknown)(...args); + } + return current; + }; + + const registerKit = ( + kit: + | IssuerKitWithPurseGuids + | { commodityGuid: Guid; kit: IssuerKitForCommodity }, + ) => { + if ('kit' in kit && 'accounts' in kit.kit) { + const record: KitRecord = { + commodityGuid: kit.commodityGuid, + kit: kit.kit.kit, + payments: kit.kit.payments, + accounts: kit.kit.accounts, + purseGuids: kit.kit.purseGuids, + knownPurses: new Set(), + paymentByCheck: new Map(), + }; + record.accountsWrapper = freeze({ + makeAccountPurse: record.accounts.makeAccountPurse, + openAccountPurse: (accountGuid: Guid | string) => { + const guid = asGuid(String(accountGuid)); + const purse = record.accounts.openAccountPurse(guid); + record.knownPurses.add(purse); + purseToGuid.set(purse, guid); + return purse; + }, + }); + record.paymentsWrapper = freeze({ + getCheckNumber: record.payments.getCheckNumber, + openPayment: (checkNumber: string) => { + const existing = record.paymentByCheck.get(checkNumber); + if (existing) return existing; + const payment = record.payments.openPayment(checkNumber); + record.paymentByCheck.set(checkNumber, payment); + // registry handled by uncaller sidecar + return payment; + }, + }); + kits.set(kit.commodityGuid, record); + uncallersByObject.set(record.kit.issuer, () => [ + record.kit.mint, + 'getIssuer', + [], + ]); + uncallersByObject.set(record.kit.brand, () => [ + record.kit.issuer, + 'getBrand', + [], + ]); + uncallersByObject.set(record.kit.mint, () => [ + getAssetProp, + null, + [record.commodityGuid, 'mint'], + ]); + uncallersByObject.set(record.accounts as object, () => [ + getAssetProp, + null, + [record.commodityGuid, 'accounts'], + ]); + uncallersByObject.set(record.payments as object, () => [ + getAssetProp, + null, + [record.commodityGuid, 'payments'], + ]); + return; + } + const localKit = kit as IssuerKitWithPurseGuids; + openAsset(String(localKit.commodityGuid)); + const record = kits.get(localKit.commodityGuid) as KitRecord; + record.kit = { + issuer: localKit.issuer, + brand: localKit.brand, + mint: localKit.mint, + }; + record.purses = localKit.purses; + record.payments = localKit.payments; + record.accountsWrapper = + record.accountsWrapper ?? + freeze({ + makeAccountPurse: record.accounts.makeAccountPurse, + openAccountPurse: (guid: Guid) => { + const purse = record.accounts.openAccountPurse(guid); + record.knownPurses.add(purse); + purseToGuid.set(purse, guid); + return purse; + }, + }); + record.paymentsWrapper = + record.paymentsWrapper ?? + freeze({ + getCheckNumber: record.payments.getCheckNumber, + openPayment: (checkNumber: string) => { + const existing = record.paymentByCheck.get(checkNumber); + if (existing) return existing; + const payment = record.payments.openPayment(checkNumber); + record.paymentByCheck.set(checkNumber, payment); + // registry handled by uncaller sidecar + return payment; + }, + }); + uncallersByObject.set(record.kit.issuer, () => [ + record.kit.mint, + 'getIssuer', + [], + ]); + uncallersByObject.set(record.kit.brand, () => [ + record.kit.issuer, + 'getBrand', + [], + ]); + uncallersByObject.set(record.kit.mint, () => [ + getAssetProp, + null, + [record.commodityGuid, 'mint'], + ]); + uncallersByObject.set(record.accounts as object, () => [ + getAssetProp, + null, + [record.commodityGuid, 'accounts'], + ]); + uncallersByObject.set(record.payments as object, () => [ + getAssetProp, + null, + [record.commodityGuid, 'payments'], + ]); + }; + + const depictCall = ( + receiver: Depiction, + method: string | null, + args: ReadonlyArray, + ): Depiction => + freeze({ + call: { + receiver, + method, + args: freeze(args), + }, + }); + + const depictGet = (receiver: Depiction, key: string | number): Depiction => + freeze({ + get: { + receiver, + key, + }, + }); + + const depictOpenAsset = (commodityGuid: Guid): Depiction => + depictCall(freeze({ '@': refCodec.makeRef(OPEN_ASSET_TOKEN) }), null, [ + String(commodityGuid), + ]); + + const portrayalToDepiction = ( + uncall: Uncall, + encodeArg: (value: unknown) => Depiction, + ): Depiction => { + const [receiver, method, args] = uncall; + if (receiver === openAsset) { + if (method) throw new Error('unexpected method for openAsset'); + const [commodityGuid] = args; + return depictOpenAsset(asGuid(String(commodityGuid))); + } + if (receiver === getAssetProp) { + if (method) throw new Error('unexpected method for getAssetProp'); + const [commodityGuid, key] = args as [Guid | string, string | number]; + return depictGet(depictOpenAsset(asGuid(String(commodityGuid))), key); + } + if (receiver === callAssetProp) { + if (method) throw new Error('unexpected method for callAssetProp'); + const [commodityGuid, key, innerMethod, innerArgs] = args as [ + Guid | string, + string | number, + string | null, + ReadonlyArray, + ]; + return depictCall( + depictGet(depictOpenAsset(asGuid(String(commodityGuid))), key), + innerMethod ?? null, + freeze((innerArgs ?? []).map(arg => encodeArg(arg))), + ); + } + if (receiver === callAssetChain) { + if (method) throw new Error('unexpected method for callAssetChain'); + const [commodityGuid, steps] = args as [ + Guid | string, + ReadonlyArray, + ]; + let current: Depiction = depictOpenAsset(asGuid(String(commodityGuid))); + for (const step of steps ?? []) { + if ('get' in step) { + current = depictGet(current, step.get); + continue; + } + const innerArgs = step.call.args ?? []; + current = depictCall( + current, + step.call.method ?? null, + freeze(innerArgs.map(arg => encodeArg(arg))), + ); + } + return current; + } + return depictCall( + encodeArg(receiver), + method ?? null, + freeze(args.map(arg => encodeArg(arg))), + ); + }; + + const insertSlot = (token: string, depiction: Depiction) => { + db.prepare( + `INSERT INTO slots(obj_guid, name, slot_type, guid_val, string_val) + VALUES (?, ?, ?, ?, ?)`, + ).run( + token, + SLOT_NAME_WEBKEY, + SLOT_TYPE_STRING, + null, + JSON.stringify(depiction), + ); + }; + + const loadDepiction = (token: string): Depiction => { + const cached = tokenToDepiction.get(token); + if (cached) return cached; + const row = db + .prepare<[string, string], { string_val: string | null }>( + 'SELECT string_val FROM slots WHERE obj_guid = ? AND name = ?', + ) + .get(token, SLOT_NAME_WEBKEY); + if (!row?.string_val) throw new Error('unknown capability'); + const depiction = JSON.parse(row.string_val) as Depiction; + tokenToDepiction.set(token, depiction); + return depiction; + }; + + const uncallers: Array<(value: unknown) => Uncall | null> = [ + (value: unknown) => { + const uncaller = uncallersByObject.get(value as object); + return uncaller ? uncaller() : null; + }, + (value: unknown) => { + const purse = value as AccountPurse; + for (const kit of kits.values()) { + try { + const accountGuid = kit.purses + ? kit.purses.getGuid(purse) + : kit.purseGuids?.get(purse); + if (!accountGuid) continue; + kit.knownPurses.add(purse); + purseToGuid.set(purse as object, accountGuid); + const uncall: Uncall = [ + callAssetProp, + null, + [ + kit.commodityGuid, + 'accounts', + 'openAccountPurse', + [String(accountGuid)], + ], + ]; + uncallersByObject.set(purse as object, () => uncall); + return uncall; + } catch { + // ignore + } + } + return null; + }, + (value: unknown) => { + const payment = value as object; + for (const kit of kits.values()) { + try { + const checkNumber = kit.payments.getCheckNumber(payment); + kit.paymentByCheck.set(checkNumber, payment); + const uncall: Uncall = [ + callAssetProp, + null, + [kit.commodityGuid, 'payments', 'openPayment', [checkNumber]], + ]; + uncallersByObject.set(payment, () => uncall); + return uncall; + } catch { + // ignore + } + } + return null; + }, + (value: unknown) => { + const depositFacet = value as object; + for (const kit of kits.values()) { + for (const purse of kit.knownPurses) { + const facet = ( + purse as unknown as { getDepositFacet: () => object } + ).getDepositFacet(); + if (facet === depositFacet) { + const accountGuid = kit.purses?.getGuid(purse as AccountPurse); + if (!accountGuid) return null; + const uncall: Uncall = [ + callAssetChain, + null, + [ + kit.commodityGuid, + [ + { get: 'accounts' }, + { + call: { + method: 'openAccountPurse', + args: [String(accountGuid)], + }, + }, + { call: { method: 'getDepositFacet', args: [] } }, + ], + ], + ]; + uncallersByObject.set(depositFacet, () => uncall); + return uncall; + } + } + } + return null; + }, + ]; + + const encodeArg = (value: unknown): Depiction => { + if (typeof value === 'bigint') return freeze(encodeBigInt(value)); + if (isBigIntRecord(value)) return freeze(value); + if (isRefRecord(value)) return freeze(value); + if (isPassByCopyDefault(value)) { + if (Array.isArray(value)) { + return freeze(value.map(entry => encodeArg(entry))); + } + if (isRecord(value)) { + return objectMap(value, entry => encodeArg(entry)); + } + return value as Depiction; + } + return recognize(value); + }; + + const depictObject = (value: unknown): Depiction => { + for (const uncaller of uncallers) { + const uncall = uncaller(value); + if (uncall) return portrayalToDepiction(uncall, encodeArg); + } + throw new Error('unregistered object'); + }; + + const recognize = (value: unknown): Depiction => { + if (typeof value === 'bigint') return freeze(encodeBigInt(value)); + if (isBigIntRecord(value)) return freeze(value); + if (isRefRecord(value)) return freeze(value); + if (isPassByCopyDefault(value)) { + if (Array.isArray(value)) { + return freeze(value.map(entry => recognize(entry))); + } + if (isRecord(value)) { + return objectMap(value, entry => recognize(entry)); + } + return value as Depiction; + } + const obj = value as object; + const existing = liveToToken.get(obj); + if (existing) return freeze({ '@': refCodec.makeRef(existing) }); + const depiction = depictObject(value); + const token = _makeToken(); + liveToToken.set(obj, token); + tokenToLive.set(token, obj); + tokenToDepiction.set(token, depiction); + insertSlot(token, depiction); + return freeze({ '@': refCodec.makeRef(token) }); + }; + + const { build } = makeBuilder({ + refCodec, + openAsset, + purseToGuid, + liveToToken, + tokenToLive, + loadDepiction, + }); + + const registerUncaller = (obj: object, uncaller: () => Uncall | null) => { + uncallersByObject.set(obj, uncaller); + }; + + return freeze({ + recognize, + build, + registerKit, + registerUncaller, + }); +}; + +export type { Depiction, RefCodec }; +export { makeLedgerCodec }; diff --git a/packages/ertp-clerk/src/ledger-do.ts b/packages/ertp-clerk/src/ledger-do.ts index 3250520..458e796 100644 --- a/packages/ertp-clerk/src/ledger-do.ts +++ b/packages/ertp-clerk/src/ledger-do.ts @@ -1,143 +1,503 @@ -import { RpcTarget, newWorkersRpcResponse } from 'capnweb'; -import { drizzle, type DrizzleSqliteDODatabase } from 'drizzle-orm/durable-sqlite'; import { DurableObject } from 'cloudflare:workers'; import { createIssuerKit, + openIssuerKit, initGnuCashSchema, + SLOT_TYPE_GUID, + SLOT_TYPE_STRING, asGuid, type SqlDatabase, - type Zone, } from '../../ertp-ledgerguise/src/index.js'; -import type { Guid } from '../../ertp-ledgerguise/src/types.js'; +import type { + AccountPurseAccess, + AccountPurse, + Guid, + IssuerKitForCommodity, + IssuerKitWithPurseGuids, + PaymentAccess, +} from '../../ertp-ledgerguise/src/types.js'; import { makeSqlDatabaseFromStorage } from './sql-adapter.js'; +import { makeGnuCashZoneKit } from './gnucash-zone.js'; +import { makeWebkey } from './webkey-protocol.js'; +import type { + ExportRules, + ExportRuleContext, + GnuCashZoneKit, + SlotCodec, + TokenMetaBase, +} from './gnucash-zone.js'; const { freeze } = Object; -const makeGuid = () => asGuid(crypto.randomUUID().replace(/-/g, '')); - -const isAmountLike = (value: unknown): value is { brand: unknown; value: unknown } => - !!value && typeof value === 'object' && 'brand' in value && 'value' in value; +type GnuCashTokenMeta = TokenMetaBase & { + commodityGuid?: Guid; + accountGuid?: Guid; + checkNumber?: string; +}; -const asAmountValue = (value: unknown): bigint => { - if (typeof value === 'bigint') return value; - if (typeof value === 'number') return BigInt(value); - if (typeof value === 'string') return BigInt(value); - throw new Error('amount value must be bigint-compatible'); +type GnuCashExportContext = { + commodityGuid?: Guid; }; -const normalizeAmountLike = ( - value: { brand: unknown; value: unknown }, - target: object, -) => { - const targetRecord = target as { - getBrand?: () => unknown; - getIssuer?: () => { getBrand?: () => unknown }; - getCurrentAmount?: () => { brand?: unknown }; +type ZoneKit = GnuCashZoneKit; + +const SLOT_PREFIX = 'ledgerguise.webkey.'; +const slotNameForReviver = (reviver: string) => `${SLOT_PREFIX}${reviver}`; + +const makeExportRules = (helpers: { + inferPurseGuid: (kit: KitRecord, purse: object) => Promise; +}): ExportRules => { + const rules: ExportRules = new Map(); + const forReviver = (reviver: string) => { + const table = new Map(); + rules.set(reviver, table); + return table; }; - const targetBrand = - targetRecord.getBrand?.() ?? - targetRecord.getIssuer?.()?.getBrand?.() ?? - targetRecord.getCurrentAmount?.()?.brand ?? - undefined; - return { - ...value, - brand: targetBrand ?? value.brand, - value: asAmountValue(value.value), + + const requireKit = ( + context: ExportRuleContext, + ): KitRecord => { + if (!context.kit) throw new Error('missing kit in export context'); + return context.kit as KitRecord; }; -}; -const normalizeArgForTarget = (arg: unknown, target: object): unknown => { - if (isAmountLike(arg)) { - return normalizeAmountLike(arg, target); - } - if (arg && typeof arg === 'object' && 'amount' in arg) { - const record = arg as { amount?: unknown }; - if (record.amount && isAmountLike(record.amount)) { + forReviver('issuer').set( + 'makeEmptyPurse', + async (purse: unknown, context: ExportRuleContext) => { + const kit = requireKit(context); + // Export rule only runs for known ERTP purse results. + const accountGuid = await helpers.inferPurseGuid(kit, purse as object); + return { reviver: 'purse', commodityGuid: context.commodityGuid, accountGuid }; + }, + ); + forReviver('issuer').set( + 'getBrand', + async (_brand: unknown, context: ExportRuleContext) => { + return { reviver: 'brand', commodityGuid: context.commodityGuid }; + }, + ); + + forReviver('mint').set( + 'mintPayment', + async (payment: unknown, context: ExportRuleContext) => { + const kit = requireKit(context); + // Export rule only runs for ERTP payment results. + const checkNumber = kit.payments.getCheckNumber(payment as object); + return { reviver: 'payment', commodityGuid: context.commodityGuid, checkNumber }; + }, + ); + forReviver('mint').set( + 'getIssuer', + async (_issuer: unknown, context: ExportRuleContext) => { + return { reviver: 'issuer', commodityGuid: context.commodityGuid }; + }, + ); + + forReviver('purse').set( + 'withdraw', + async (payment: unknown, context: ExportRuleContext) => { + const kit = requireKit(context); + // Export rule only runs for ERTP payment results. + const checkNumber = kit.payments.getCheckNumber(payment as object); + return { reviver: 'payment', commodityGuid: context.commodityGuid, checkNumber }; + }, + ); + forReviver('purse').set( + 'getDepositFacet', + async (_facet: unknown, context: ExportRuleContext) => { + if (!context.targetMeta.accountGuid) return null; return { - ...arg, - amount: normalizeAmountLike(record.amount, target), + reviver: 'depositFacet', + commodityGuid: context.commodityGuid, + accountGuid: context.targetMeta.accountGuid, }; - } - } - return arg; + }, + ); + + return rules; }; -const makeRpcZone = (): Zone => ({ - exo: >(_interfaceName: string, methods: T): Readonly => { - class ExoTarget extends RpcTarget {} - for (const key of Reflect.ownKeys(methods)) { - const value = (methods as Record)[key]; - if (typeof value === 'function') { - const wrappedMethod = function (this: object, ...args: unknown[]) { - return value(...args.map((arg) => normalizeArgForTarget(arg, this))); - }; - freeze(wrappedMethod); - Object.defineProperty(ExoTarget.prototype, key, { - value: wrappedMethod, - writable: false, - }); - continue; +const slotCodec: SlotCodec = { + encode: (meta) => { + const name = slotNameForReviver(meta.reviver); + let guidVal: string | null = null; + let stringVal: string | null = null; + let slotType = SLOT_TYPE_GUID; + if (meta.reviver === 'purse' || meta.reviver === 'depositFacet') { + if (!meta.accountGuid || !meta.commodityGuid) { + throw new Error('missing purse metadata'); } - Object.defineProperty(ExoTarget.prototype, key, { - get() { - return value; - }, - }); + guidVal = meta.accountGuid; + stringVal = meta.commodityGuid; + slotType = SLOT_TYPE_STRING; + } else if (meta.reviver === 'payment') { + if (!meta.commodityGuid || !meta.checkNumber) { + throw new Error('missing payment metadata'); + } + guidVal = meta.commodityGuid; + stringVal = meta.checkNumber; + slotType = SLOT_TYPE_STRING; + } else if (meta.reviver !== 'bootstrap') { + if (!meta.commodityGuid) { + throw new Error('missing commodity metadata'); + } + guidVal = meta.commodityGuid; } - freeze(ExoTarget.prototype); - return freeze(new ExoTarget()) as unknown as Readonly; + return { name, slotType, guidVal, stringVal }; }, -}); - -class Bootstrap extends RpcTarget { - constructor( - private readonly db: SqlDatabase, - private readonly makeGuid: () => Guid, - private readonly zone: Zone, - ) { - super(); - } + decode: (row) => { + if (!row.name.startsWith(SLOT_PREFIX)) { + throw new Error('unknown capability'); + } + const reviver = row.name.slice(SLOT_PREFIX.length); + if (reviver === 'purse' || reviver === 'depositFacet') { + if (!row.guid_val || !row.string_val) { + throw new Error('invalid purse token'); + } + return { + reviver, + accountGuid: asGuid(row.guid_val), + commodityGuid: asGuid(row.string_val), + }; + } + if (reviver === 'payment') { + if (!row.guid_val || !row.string_val) { + throw new Error('invalid payment token'); + } + return { + reviver, + commodityGuid: asGuid(row.guid_val), + checkNumber: row.string_val, + }; + } + if (reviver === 'bootstrap') { + return { reviver }; + } + if (!row.guid_val) { + throw new Error('invalid token'); + } + return { reviver, commodityGuid: asGuid(row.guid_val) }; + }, + bootstrapMeta: () => ({ reviver: 'bootstrap' }), + equals: (left, right) => + left.reviver === right.reviver && + left.commodityGuid === right.commodityGuid && + left.accountGuid === right.accountGuid && + left.checkNumber === right.checkNumber, +}; - makeIssuerKit(name: string) { - const kit = createIssuerKit({ - db: this.db, - commodity: { namespace: 'COMMODITY', mnemonic: name }, - makeGuid: this.makeGuid, - nowMs: () => Date.now(), - zone: this.zone, - }); - return kit; - } -} +type KitRecord = { + commodityGuid: Guid; + kit: { issuer: object; brand: object; mint: object }; + payments: PaymentAccess; + accounts: AccountPurseAccess; + purses?: IssuerKitWithPurseGuids['purses']; + purseGuids?: IssuerKitForCommodity['purseGuids']; +}; export class LedgerDurableObject extends DurableObject { + private readonly state: DurableObjectState; private readonly db: SqlDatabase; - private readonly drizzle: DrizzleSqliteDODatabase; private readonly ready: Promise; - private readonly bootstrap: Bootstrap; + private readonly kits = new Map(); + private readonly zone: ZoneKit['zone']; + private readonly zoneRegistry: ZoneKit['registry']; + private readonly zoneMarshal: ZoneKit['marshal']; + private readonly makeGuid: () => Guid; + private bootstrap: { makeIssuerKit: (name: string) => object } | null = null; + private currentCommodityGuid: Guid | null = null; constructor(ctx: DurableObjectState, env: Env) { super(ctx, env); + const randomUUID = crypto.randomUUID.bind(crypto); + const makeToken = () => randomUUID().replace(/-/g, ''); + this.makeGuid = () => asGuid(randomUUID().replace(/-/g, '')); + this.state = ctx; this.db = makeSqlDatabaseFromStorage(ctx.storage.sql); - this.drizzle = drizzle(ctx.storage, { logger: false }); - this.bootstrap = new Bootstrap(this.db, makeGuid, makeRpcZone()); + const zoneKit = makeGnuCashZoneKit({ + db: this.db, + storage: ctx.storage, + exportRules: makeExportRules({ + inferPurseGuid: (kit, purse) => this.inferPurseGuid(kit, purse), + }), + reifiers: this.makeReifiers(), + makeToken, + slotCodec, + buildMeta: (interfaceName: string) => { + const commodityGuid = this.currentCommodityGuid; + if (!commodityGuid) return null; + if (interfaceName.endsWith(' Brand')) return { reviver: 'brand', commodityGuid }; + if (interfaceName.endsWith(' Issuer')) return { reviver: 'issuer', commodityGuid }; + if (interfaceName.endsWith(' Mint')) return { reviver: 'mint', commodityGuid }; + return null; + }, + }); + this.zone = zoneKit.zone; + this.zoneRegistry = zoneKit.registry; + this.zoneMarshal = zoneKit.marshal; this.ready = this.ensureSchema(); } private async ensureSchema() { const row = this.db - .prepare<[string], { name: string }>( + .prepare( "SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?", ) .get('accounts'); if (!row) { - // TODO: replace schema bootstrap with drizzle migrations. initGnuCashSchema(this.db, { allowTransactionStatements: false }); } } + private makeBootstrap() { + if (this.bootstrap) return this.bootstrap; + this.bootstrap = freeze({ + makeIssuerKit: (name: string) => this.makeIssuerKit(name), + }); + return this.bootstrap; + } + + private makeIssuerKit(name: string) { + let createdCommodity: Guid | null = null; + const makeGuid = () => { + const guid = this.makeGuid(); + if (!createdCommodity) { + createdCommodity = guid; + this.currentCommodityGuid = guid; + } + return guid; + }; + const kit = createIssuerKit({ + db: this.db, + commodity: { namespace: 'COMMODITY', mnemonic: name }, + makeGuid, + nowMs: () => Date.now(), + zone: this.zone, + }); + this.currentCommodityGuid = null; + const record: KitRecord = { + commodityGuid: kit.commodityGuid, + kit: { issuer: kit.issuer, brand: kit.brand, mint: kit.mint }, + payments: kit.payments, + accounts: { + makeAccountPurse: (accountGuid: Guid) => + openIssuerKit({ + db: this.db, + commodityGuid: kit.commodityGuid, + makeGuid: this.makeGuid, + nowMs: () => Date.now(), + zone: this.zone, + }).accounts.makeAccountPurse(accountGuid), + openAccountPurse: (accountGuid: Guid) => + openIssuerKit({ + db: this.db, + commodityGuid: kit.commodityGuid, + makeGuid: this.makeGuid, + nowMs: () => Date.now(), + zone: this.zone, + }).accounts.openAccountPurse(accountGuid), + }, + purses: kit.purses, + }; + this.kits.set(kit.commodityGuid, record); + return freeze({ issuer: kit.issuer, brand: kit.brand, mint: kit.mint }); + } + + private getKit(commodityGuid: Guid): KitRecord { + const existing = this.kits.get(commodityGuid); + if (existing) return existing; + this.currentCommodityGuid = commodityGuid; + const opened = openIssuerKit({ + db: this.db, + commodityGuid, + makeGuid: this.makeGuid, + nowMs: () => Date.now(), + zone: this.zone, + }); + this.currentCommodityGuid = null; + const record: KitRecord = { + commodityGuid, + kit: opened.kit, + payments: opened.payments, + accounts: opened.accounts, + purseGuids: opened.purseGuids, + }; + this.kits.set(commodityGuid, record); + return record; + } + + private async inferPurseGuid(record: KitRecord, purse: unknown): Promise { + if (record.purses) { + // purses.getGuid only accepts real purse objects. + return record.purses.getGuid(purse as object); + } + // purseGuids maps runtime purse objects to GUIDs. + const guid = record.purseGuids?.get(purse as AccountPurse); + if (!guid) throw new Error('unknown purse'); + return guid; + } + + private makeReifiers() { + const reifiers = new Map(); + reifiers.set('bootstrap', () => this.makeBootstrap()); + reifiers.set('issuer', (meta: { commodityGuid: Guid }) => + this.getKit(meta.commodityGuid).kit.issuer, + ); + reifiers.set('brand', (meta: { commodityGuid: Guid }) => + this.getKit(meta.commodityGuid).kit.brand, + ); + reifiers.set('mint', (meta: { commodityGuid: Guid }) => + this.getKit(meta.commodityGuid).kit.mint, + ); + reifiers.set('purse', (meta: { commodityGuid: Guid; accountGuid: Guid }) => { + const kit = this.getKit(meta.commodityGuid); + return kit.accounts.openAccountPurse(meta.accountGuid); + }); + reifiers.set('depositFacet', (meta: { commodityGuid: Guid; accountGuid: Guid }) => { + const kit = this.getKit(meta.commodityGuid); + const purse = kit.accounts.openAccountPurse(meta.accountGuid); + // AccountPurse doesn't declare getDepositFacet, but the runtime purse does. + return (purse as unknown as { getDepositFacet: () => object }).getDepositFacet(); + }); + reifiers.set('payment', (meta: { commodityGuid: Guid; checkNumber: string }) => { + const kit = this.getKit(meta.commodityGuid); + return kit.payments.openPayment(meta.checkNumber); + }); + return reifiers; + } + + private bootstrapModule(webkey: string) { + const module = `import { encodeClientValue, decodeClientValue } from '/webkey-codec.js'; +import { extractToken } from '/webkey-protocol.js'; +const baseUrl = new URL('/api', globalThis.location.href); +const keyToProxy = (webkey, allegedInterface = 'Remotable') => { + const post = async (method, ...args) => { + const url = new URL(baseUrl); + const token = extractToken(webkey); + url.searchParams.set('s', token); + url.searchParams.set('q', method); + const res = await fetch(url, { + method: 'POST', + headers: { 'content-type': 'text/plain' }, + body: JSON.stringify(args.map(encodeClientValue)), + }); + const data = await res.json(); + if ('=' in data) return decodeClientValue(data['='], keyToProxy); + if ('@' in data) return keyToProxy(data['@']); + if ('!' in data) throw new Error(data['!']); + throw new Error('rpc error'); + }; + const target = { webkey, isProxy: true, post }; + Object.defineProperty(target, Symbol.toStringTag, { + value: allegedInterface, + writable: false, + enumerable: false, + configurable: false, + }); + return new Proxy(target, { + get(innerTarget, prop) { + if (prop in innerTarget) return innerTarget[prop]; + if (prop === 'then') return undefined; + return (...args) => innerTarget.post(prop, ...args); + }, + }); +}; +const bootstrap = keyToProxy(${JSON.stringify(webkey)}); +export { bootstrap, keyToProxy }; +`; + return module; + } + async fetch(request: Request): Promise { await this.ready; - return newWorkersRpcResponse(request, this.bootstrap); + const url = new URL(request.url); + if (url.pathname === '/webkey-codec.js') { + // TODO: review whether this should be served from the worker root instead of the DO. + const module = `export { encodeClientValue, decodeClientValue } from './webkey-codec.js';\n`; + return new Response(module, { + headers: { 'content-type': 'application/javascript; charset=utf-8' }, + }); + } + if (url.pathname === '/webkey-protocol.js') { + // TODO: review whether this should be served from the worker root instead of the DO. + const module = `export { extractToken, makeWebkey } from './webkey-protocol.js';\n`; + return new Response(module, { + headers: { 'content-type': 'application/javascript; charset=utf-8' }, + }); + } + if (url.pathname === '/bootstrap') { + const token = await this.zoneRegistry.ensureBootstrapToken(); + const webkey = makeWebkey(url.origin, token); + if (url.searchParams.get('format') === 'json') { + return new Response(JSON.stringify({ webkey }), { + headers: { 'content-type': 'application/json; charset=utf-8' }, + }); + } + return new Response(this.bootstrapModule(webkey), { + headers: { 'content-type': 'application/javascript; charset=utf-8' }, + }); + } + if (url.pathname === '/api') { + if (request.method !== 'POST') { + return new Response('method not allowed', { status: 405 }); + } + return this.handleRpc(request); + } + return new Response('ertp-clerk: not implemented', { status: 501 }); + } + + private async handleRpc(request: Request): Promise { + const url = new URL(request.url); + const token = url.searchParams.get('s'); + const methodName = url.searchParams.get('q'); + if (!token || !methodName) { + return new Response('missing capability or method', { status: 400 }); + } + const { obj, meta } = await this.zoneRegistry.resolveToken(token); + const target = obj as Record; + const method = target[methodName]; + if (typeof method !== 'function') { + return new Response(JSON.stringify({ '!': 'no such method' }), { + status: 404, + headers: { 'content-type': 'application/json; charset=utf-8' }, + }); + } + let args = []; + try { + const body = await request.text(); + args = body ? JSON.parse(body) : []; + if (!Array.isArray(args)) throw new Error('args must be array'); + } catch { + return new Response(JSON.stringify({ '!': 'invalid request' }), { + status: 400, + headers: { 'content-type': 'application/json; charset=utf-8' }, + }); + } + const hydrated = await Promise.all(args.map((arg) => this.zoneMarshal.hydrateValue(arg))); + try { + const result = await method.apply(obj, hydrated); + const origin = url.origin; + const exported = await this.zoneMarshal.exportValue(result, { + targetMeta: meta, + methodName, + origin, + commodityGuid: meta.commodityGuid, + kit: meta.commodityGuid ? this.getKit(meta.commodityGuid) : null, + }); + const payload = + exported && typeof exported === 'object' && '@' in exported + ? exported + : { '=': exported }; + return new Response(JSON.stringify(payload), { + headers: { 'content-type': 'application/json; charset=utf-8' }, + }); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + console.error('rpc error', { methodName, err: message }); + return new Response(JSON.stringify({ '!': message }), { + status: 422, + headers: { 'content-type': 'application/json; charset=utf-8' }, + }); + } } } diff --git a/packages/ertp-clerk/test/ledger-codec.test.ts b/packages/ertp-clerk/test/ledger-codec.test.ts new file mode 100644 index 0000000..a79d634 --- /dev/null +++ b/packages/ertp-clerk/test/ledger-codec.test.ts @@ -0,0 +1,275 @@ +import test from 'ava'; +import Database from 'better-sqlite3'; +import type { + AssetKind, + Brand, + Issuer, + Mint, + Payment, +} from '../../ertp-ledgerguise/src/ertp-types.js'; +import { + asGuid, + createIssuerKit, + initGnuCashSchema, + wrapBetterSqlite3Database, +} from '../../ertp-ledgerguise/src/index.js'; +import { type Depiction, makeLedgerCodec } from '../src/ledger-codec.js'; +import { decodeClientValue, encodeClientValue } from '../src/webkey-codec.js'; + +const { freeze } = Object; + +const refCodec = { + makeRef: (token: string) => `cap:${token}`, + parseRef: (ref: string) => { + if (!ref.startsWith('cap:')) throw new Error('bad ref'); + return ref.slice('cap:'.length); + }, +}; + +const db = wrapBetterSqlite3Database(new Database(':memory:')); +initGnuCashSchema(db, { allowTransactionStatements: false }); + +type MethodRecord = Record unknown>; + +const logged = (label: string, x: T) => { + console.log('@@', label, x); + return x; +}; + +const makeClientContext = (svc: DoWorker) => { + const proxies = new Map(); + const proxyToKey = new WeakMap(); + + const mkProxy = (webkey: string | undefined) => { + const ref = webkey ? freeze({ '@': webkey }) : undefined; + const target = freeze({ isProxy: true, ...(webkey ? { webkey } : {}) }); + const proxy = new Proxy(target, { + get(obj, property, _rx) { + if (typeof property === 'symbol') return undefined; + const method = property as string; + if (method === 'then') return undefined; + if (Object.prototype.hasOwnProperty.call(obj, method)) { + return (obj as Record)[method]; + } + return (...args: unknown[]) => + svc + .fetch( + ref, + method, + args.map(a => encodeClientArg(a)), + ) + .then(w => decode(w)); + }, + }); + if (webkey) proxyToKey.set(proxy, webkey); + return proxy; + }; + + const isProxyRef = (value: unknown) => { + if (!value || typeof value !== 'object') return false; + const key = proxyToKey.get(value as object); + return !!key && proxies.has(key); + }; + + const encodeClientArg = (value: unknown): Depiction => + encodeClientValue(value, { + getProxyRef: v => { + if (!isProxyRef(v)) return undefined; + return proxyToKey.get(v as object); + }, + }); + const keyToProxy = (webkey: string) => { + const known = proxies.get(webkey); + if (known) return known; + const proxy = mkProxy(webkey); + proxies.set(webkey, proxy); + return proxy; + }; + + const decode = (value: Depiction) => decodeClientValue(value, keyToProxy); + + const root = () => mkProxy(undefined) as unknown as Remote; + + return freeze({ decode, root }); +}; + +const makeDoActor = () => { + const codec = makeLedgerCodec({ + db, + nowMs: () => Date.now(), + makeGuid: () => asGuid(crypto.randomUUID().replace(/-/g, '')), + makeToken: () => crypto.randomUUID().replace(/-/g, ''), + refCodec, + }); + const self = { + makeIssuerKit: (mnemonic: string) => { + const kit = createIssuerKit({ + db, + commodity: { namespace: 'COMMODITY', mnemonic }, + makeGuid: () => asGuid(crypto.randomUUID().replace(/-/g, '')), + nowMs: () => Date.now(), + }); + codec.registerKit(kit); + return { mint: kit.mint, issuer: kit.issuer, brand: kit.brand }; + }, + }; + const fetch = async ( + receiver: Depiction | undefined, + method: string, + args: Depiction[], + ) => { + const rx = (receiver ? codec.build(receiver) : self) as MethodRecord; + const params = args.map(a => codec.build(a)); + const result = rx[method](...params); + return codec.recognize(result); + }; + return freeze({ self, worker: freeze({ fetch }) }); +}; +type DoWorkerKit = ReturnType; +type DoActor = DoWorkerKit['self']; +type DoWorker = DoWorkerKit['worker']; +type NatPayment = Payment<'nat'>; +type AnyPayment = Payment; + +type RemoteResult = T extends object ? Remote : T; + +type Remote = { + [K in keyof T]: T[K] extends (...args: infer A) => infer R + ? (...args: A) => Promise> + : never; +}; + +type RemoteKit = { + mint: Remote>; + issuer: Remote>; + brand: Brand<'nat'>; +}; + +type IssuerService = { + makeIssuerKit: (mnemonic: string) => Promise; +}; + +const makeAlice = (svc: IssuerService) => ({ + run: async () => { + const kit = await svc.makeIssuerKit('BUCKS'); + const purse = await kit.issuer.makeEmptyPurse(); + const zillion = await kit.mint.mintPayment({ + brand: kit.brand, + value: 1_000_000n, + }); + await purse.deposit(zillion as unknown as NatPayment); + const payment10 = await purse.withdraw({ + brand: kit.brand, + value: 10n, + }); + return { issuer: kit.issuer, payment: payment10 }; + }, +}); + +const makeBob = (issuer: Remote, payment: Remote) => ({ + run: async () => { + const purse = await issuer.makeEmptyPurse(); + await purse.deposit(payment as unknown as AnyPayment); + return purse.getCurrentAmount(); + }, +}); + +test('ledger codec round-trips bigints', t => { + const { recognize, build } = makeLedgerCodec({ + db, + nowMs: () => Date.now(), + makeGuid: () => asGuid(crypto.randomUUID().replace(/-/g, '')), + makeToken: () => crypto.randomUUID().replace(/-/g, ''), + refCodec, + }); + + const encoded = recognize({ n: 1, b: 2n, arr: [3n, 'ok'] }); + t.deepEqual(encoded, { n: 1, b: { '+': '2' }, arr: [{ '+': '3' }, 'ok'] }); + t.deepEqual(build(encoded), { n: 1, b: 2n, arr: [3n, 'ok'] }); +}); + +test('ledger codec integrates openIssuerKit', async t => { + let tokenCounter = 0; + const kit = createIssuerKit({ + db, + commodity: { namespace: 'COMMODITY', mnemonic: 'BUCKS' }, + makeGuid: () => asGuid(crypto.randomUUID().replace(/-/g, '')), + nowMs: () => Date.now(), + }); + const purse = kit.issuer.makeEmptyPurse(); + const depositFacet = purse.getDepositFacet(); + const seedPayment = kit.mint.mintPayment({ brand: kit.brand, value: 5n }); + purse.deposit(seedPayment); + const payment = purse.withdraw({ brand: kit.brand, value: 5n }); + + const codec = makeLedgerCodec({ + db, + nowMs: () => Date.now(), + makeGuid: () => asGuid(crypto.randomUUID().replace(/-/g, '')), + makeToken: () => `tok${(tokenCounter += 1)}`, + refCodec, + }); + codec.registerKit(kit); + + const mintRef = codec.recognize(kit.mint); + const issuerRef = codec.recognize(kit.issuer); + const purseRef = codec.recognize(purse); + const paymentRef = codec.recognize(payment); + const depositRef = codec.recognize(depositFacet); + + t.deepEqual(mintRef, { '@': 'cap:tok1' }); + t.deepEqual(issuerRef, { '@': 'cap:tok2' }); + t.deepEqual(purseRef, { '@': 'cap:tok3' }); + t.deepEqual(paymentRef, { '@': 'cap:tok4' }); + t.deepEqual(depositRef, { '@': 'cap:tok5' }); + + const issuer2 = codec.build(issuerRef) as typeof kit.issuer; + const purse2 = codec.build(purseRef) as typeof purse; + const payment2 = codec.build(paymentRef) as typeof payment; + const deposit2 = codec.build(depositRef) as typeof depositFacet; + + const issuer3 = codec.build(issuerRef) as typeof kit.issuer; + const payment3 = codec.build(paymentRef) as typeof payment; + + t.is(issuer2, kit.issuer, 'build(issuerRef) preserves issuer identity'); + t.is(issuer3, kit.issuer, 'build(issuerRef) preserves issuer identity'); + t.is(payment2, payment, 'build(paymentRef) preserves payment identity'); + t.is(payment3, payment, 'build(paymentRef) preserves payment identity'); + const brand2 = await issuer2.getBrand(); + t.is( + await brand2.getAllegedName(), + await kit.brand.getAllegedName(), + 'brand alleged name round-trips', + ); + const balance2 = await purse2.getCurrentAmount(); + t.is(balance2.value, 0n, 'withdrawal drains purse'); + t.true(await brand2.isMyIssuer(issuer2), 'brand recognizes issuer'); + t.true( + await ( + issuer2 as unknown as { isLive: (p: unknown) => Promise } + ).isLive(payment2), + 'issuer reports payment live', + ); + t.is( + typeof (deposit2 as { receive: (p: object) => unknown }).receive, + 'function', + 'deposit facet has receive method', + ); +}); + +test('ledger codec supports actor-style restart flow', async t => { + const do1 = makeDoActor(); + const aliceClient = makeClientContext(do1.worker); + const alice = makeAlice({ + makeIssuerKit: (name: string) => aliceClient.root().makeIssuerKit(name), + }); + const outA = await alice.run(); + const wireA = encodeClientValue(outA); + + const do2 = makeDoActor(); + const bobClient = makeClientContext(do2.worker); + const bobRxd = bobClient.decode(wireA) as any; + const bob = makeBob(bobRxd.issuer, bobRxd.payment); + const balance = bobClient.decode(await bob.run()) as any; + t.is(balance.value, 10n, 'bob receives 10 BUCKS'); +}); diff --git a/packages/ertp-clerk/tsconfig.json b/packages/ertp-clerk/tsconfig.json new file mode 100644 index 0000000..fc8fa86 --- /dev/null +++ b/packages/ertp-clerk/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2024", "WebWorker"], + "module": "NodeNext", + "moduleResolution": "NodeNext", + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "types": [], + "isolatedModules": true + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "test/**/*.ts", + "worker-configuration.d.ts" + ] +} From a79e1cfb5f8f21109a1d0c06d8383affc21cfd31 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 05:39:43 -0600 Subject: [PATCH 73/77] chore: mint from recovery rather than holding (WIP) --- .../ertp-ledgerguise/test/community.test.ts | 21 ++++++++++++++---- .../ertp-ledgerguise/test/design-doc.test.ts | 14 +++++++----- .../ertp-ledgerguise/test/fixtures/README.md | 2 +- .../ertp-ledgerguise/test/ledgerguise.test.ts | 5 +++-- .../test/snapshots/community.test.ts.md | 6 ++--- .../test/snapshots/community.test.ts.snap | Bin 2198 -> 2196 bytes .../test/snapshots/design-doc.test.ts.md | 6 ++--- .../test/snapshots/design-doc.test.ts.snap | Bin 2810 -> 2806 bytes .../test/snapshots/ledgerguise.test.ts.md | 2 +- .../test/snapshots/ledgerguise.test.ts.snap | Bin 433 -> 432 bytes 10 files changed, 36 insertions(+), 20 deletions(-) diff --git a/packages/ertp-ledgerguise/test/community.test.ts b/packages/ertp-ledgerguise/test/community.test.ts index ebea478..db84c50 100644 --- a/packages/ertp-ledgerguise/test/community.test.ts +++ b/packages/ertp-ledgerguise/test/community.test.ts @@ -312,8 +312,15 @@ serial('stage 3: award contributions to members', t => { serial('stage 4: run balance sheet and income statement', t => { const { db, kit } = t.context as CommunityContext; const holdingGuid = makeDeterministicGuid(`ledgerguise-balance:${kit.commodityGuid}`); - // Exclude the holding account from statement totals; it acts as equity-like backing. - t.is(getTotalForAccountType(db, kit.commodityGuid, 'STOCK', [holdingGuid]), 10_000n); + const recoveryGuid = makeDeterministicGuid(`ledgerguise:recovery:${kit.commodityGuid}`); + // Exclude holding/recovery from statement totals; they act as equity-like backing. + t.is( + getTotalForAccountType(db, kit.commodityGuid, 'STOCK', [ + holdingGuid, + recoveryGuid, + ]), + 10_000n, + ); t.is(getTotalForAccountType(db, kit.commodityGuid, 'EQUITY'), 0n); t.is(getTotalForAccountType(db, kit.commodityGuid, 'EXPENSE'), 0n); t.is(getTotalForAccountType(db, kit.commodityGuid, 'INCOME'), 0n); @@ -408,7 +415,10 @@ serial('stage 4: run balance sheet and income statement', t => { const balanceSheetRows = ['STOCK', 'EQUITY'].map(accountType => ({ account_type: accountType, - total: getTotalForAccountType(db, kit.commodityGuid, accountType, [holdingGuid]).toString(), + total: getTotalForAccountType(db, kit.commodityGuid, accountType, [ + holdingGuid, + recoveryGuid, + ]).toString(), })); t.snapshot( toRowStrings(balanceSheetRows, ['account_type', 'total']), @@ -417,7 +427,10 @@ serial('stage 4: run balance sheet and income statement', t => { const incomeStatementRows = ['INCOME', 'EXPENSE'].map(accountType => ({ account_type: accountType, - total: getTotalForAccountType(db, kit.commodityGuid, accountType, [holdingGuid]).toString(), + total: getTotalForAccountType(db, kit.commodityGuid, accountType, [ + holdingGuid, + recoveryGuid, + ]).toString(), })); t.snapshot( toRowStrings(incomeStatementRows, ['account_type', 'total']), diff --git a/packages/ertp-ledgerguise/test/design-doc.test.ts b/packages/ertp-ledgerguise/test/design-doc.test.ts index 1d0ceab..4833133 100644 --- a/packages/ertp-ledgerguise/test/design-doc.test.ts +++ b/packages/ertp-ledgerguise/test/design-doc.test.ts @@ -16,13 +16,9 @@ import { import type { Guid } from '../src/types.js'; import { makeTestClock, makeTestDb, mockMakeGuid } from './mock-io.js'; import { - type AccountRow, type AccountView, type AccountWithCode, - type BooksRow, type SplitEntry, - type SplitRow, - type TransactionRow, accountViewCols, shortDates, shortGuid, @@ -30,6 +26,12 @@ import { splitEntryCols, toRowStrings, } from './gnucash-tools.js'; +import type { + AccountRow, + BooksRow, + SplitRow, + TransactionRow, +} from '../src/gnucash-schema.js'; type AccountPath = Pick; @@ -83,11 +85,11 @@ ERTP is a flexible Electronic Rights protocol. ERTP is flexible enough that we can implement it on top of a GnuCash database. Let's mint 5 BUCKS and deposit them into a purse, then see how that's reflected in the GnuCash DB. -This creates one transaction and two splits, moving value from the mint holding account into the purse.`, +This creates one transaction and two splits, moving value from the mint recovery account into the purse.`, ); t.snapshot( toRowStrings(splitRows, splitEntryCols), - `Splits show the value move: one positive into the purse account and one negative out of the mint holding account. + `Splits show the value move: one positive into the purse account and one negative out of the mint recovery account. Context: before the deposit we already created issuer and purse records: const { issuer } = makeIssuerKit("BUCKS"); diff --git a/packages/ertp-ledgerguise/test/fixtures/README.md b/packages/ertp-ledgerguise/test/fixtures/README.md index bc1cfdd..2d79c4c 100644 --- a/packages/ertp-ledgerguise/test/fixtures/README.md +++ b/packages/ertp-ledgerguise/test/fixtures/README.md @@ -8,7 +8,7 @@ values for key rows. - GUIDs are illustrative placeholders (not real UUIDs). - `comm-USD` is a placeholder for the commodity GUID used in tests. -- `acct-source` is the payment source account (holding/balance). +- `acct-source` is the payment source account (mint recovery). - `acct-dest` is the destination purse account. - `value_num` / `value_denom` use GnuCash numeric representation. - `reconcile_state` uses `n` (not reconciled) and `c` (cleared/reconciled). diff --git a/packages/ertp-ledgerguise/test/ledgerguise.test.ts b/packages/ertp-ledgerguise/test/ledgerguise.test.ts index 2ac5684..0c3bd48 100644 --- a/packages/ertp-ledgerguise/test/ledgerguise.test.ts +++ b/packages/ertp-ledgerguise/test/ledgerguise.test.ts @@ -8,6 +8,7 @@ import Database from 'better-sqlite3'; import { readFile } from 'node:fs/promises'; import { createRequire } from 'node:module'; import type { Brand, NatAmount } from '../src/ertp-types.js'; +import type { Guid } from '../src/types.js'; import { createIssuerKit, initGnuCashSchema, @@ -152,7 +153,7 @@ test('fixture: withdraw-deposit matches ledger rows', async t => { const payment = issuedKit.mint.mintPayment(bucks(5000n)); purse.deposit(payment); - const { holdingAccountGuid } = issuedKit.mintInfo.getMintInfo(); + const { recoveryPurseGuid } = issuedKit.mintInfo.getMintInfo(); const destAccountGuid = issuedKit.purses.getGuid(purse); const expectedTx = parseCsv( await asset('./fixtures/withdraw-deposit-transactions.csv'), @@ -166,7 +167,7 @@ test('fixture: withdraw-deposit matches ledger rows', async t => { resolved.currency_guid = issuedKit.commodityGuid; } if (resolved.account_guid === 'acct-source') { - resolved.account_guid = holdingAccountGuid; + resolved.account_guid = recoveryPurseGuid; } if (resolved.account_guid === 'acct-dest') { resolved.account_guid = destAccountGuid; diff --git a/packages/ertp-ledgerguise/test/snapshots/community.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/community.test.ts.md index 7fd9009..5e9d2b1 100644 --- a/packages/ertp-ledgerguise/test/snapshots/community.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/community.test.ts.md @@ -242,14 +242,14 @@ Generated by [AVA](https://avajs.dev). > register: BUCKS Mint:BUCKS Mint Recovery [ - 'tx_guid | num | description | value_num | reconcile_state', + 'tx_guid | num | description | value_num | reconcile_state', + '000000000004 | 09:15 | ledgerguise 10000 | -10000 | c ', ] > register: BUCKS Mint:BUCKS Mint Holding [ - 'tx_guid | num | description | value_num | reconcile_state', - '000000000004 | 09:15 | ledgerguise 10000 | -10000 | c ', + 'tx_guid | num | description | value_num | reconcile_state', ] > balance sheet diff --git a/packages/ertp-ledgerguise/test/snapshots/community.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/community.test.ts.snap index 79713c4ae6e9bba8042be73769670c45942e4e8b..497e5cdb9ab63576c581b0c4800f7699f4ff5aa4 100644 GIT binary patch delta 203 zcmV;+05t!W5tI=!K~_N^Q*L2!b7*gLAa*kf0|2V^*Z3@IQp0~>W*>a> zBsO~ppt?d7+}5!&)CYgq`IPcwKUel+Z<3lo>4BO8yxH#?;hqF_Mc9(3XJmv{hHo#2gD|46 zD_if}tKNNZ_Ew=kDhC6X*#B$IsNUMVeRFFtK%yBtZ*Se&-Xag0aX5VQ{y)@mZMM5V F005uXX0`wT delta 205 zcmV;;05boS5tb1$K~_N^Q*L2!b7*gLAa*kf0|1-npsK`_F4hH#%qw72foG~jEHU8` z8w#TX*L}+2?Yyxv)CYe!4;!B+U!|^#REVoV-Izb6Jmk-nJ>;9Dj!_z>rdn_I$5Xi5 zLEY;J)xOZZ%JDpp_?5WM>E3JV_RXKD^3X1TpTzagNO@>w=w5Z;1*S97+Lhtk%VC2? z^mS$HoqN^056<2y^jml^aEblD){N?{&D%G(1_LCTvGexUt?dylq8W$7H}C%go5>|I HyFUN`uC#06 diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md index aa096e8..9dd5b53 100644 --- a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.md @@ -11,14 +11,14 @@ Generated by [AVA](https://avajs.dev). > ERTP is flexible enough that we can implement it on top of a GnuCash database. > > Let's mint 5 BUCKS and deposit them into a purse, then see how that's reflected in the GnuCash DB. -> This creates one transaction and two splits, moving value from the mint holding account into the purse. +> This creates one transaction and two splits, moving value from the mint recovery account into the purse. [ 'guid | num | post_date | enter_date', '000000000002 | 00:00 | 2026-01-24 | 2026-01-24', ] -> Splits show the value move: one positive into the purse account and one negative out of the mint holding account. +> Splits show the value move: one positive into the purse account and one negative out of the mint recovery account. > > Context: before the deposit we already created issuer and purse records: > const { issuer } = makeIssuerKit("BUCKS"); @@ -31,7 +31,7 @@ Generated by [AVA](https://avajs.dev). [ 'guid | tx_guid | account_guid | value_num | value_denom | reconcile_state', '000000000003 | 000000000002 | 000000000001 | 5 | 1 | c ', - '000000000004 | 000000000002 | e843dce22274 | -5 | 1 | c ', + '000000000004 | 000000000002 | aec41e1716bb | -5 | 1 | c ', ] ## ERTP is separate from naming diff --git a/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/design-doc.test.ts.snap index 23c6596207aa16fd59ccddd471e750aaf329a9da..f080194370f9807bcfc25a930e0f84be23f36299 100644 GIT binary patch literal 2806 zcmVp4+O zlXxVV#vh9a00000000BkS?lZFI6PTGoo&yIYkQ|9S7b0;8e*oOLaN+_-Brb5}L$CUC zdS-XL$^p@rneMK7^{U?Q_rCghzZa|UzD3=$DRejS5MM(%g4jC~q$i*$q1qIP%Lbk8g1cgkxOj-k`p=yc#1Ry(WL z+nsKEb#3MbW8TAf>V0xYCOg~=K^Wi?co?cgS|JB8)@q>nXcIW}goRifAbdL!;Q>nM zB^G+zU<4zj5tIb0c_ge*lE)CKq!(iwrPb4l#K7Nud;gJJ2>LM|iC&Db8)Im-k|Kn+ z#b9U+t!q`N;&ON~7^O-EL$E_`VS*5H31T#kafH%>uucy(2Gs`+`M$_Tq-x;%_t9Q4 zFd~aygYCyV_x7rm1v|tM2x%2?7$@3biylcZh%i(Wx9k-I8vCR(Mj#{&C|0_)9r*i0 zVIb7VEgDb~>0G4YA)Sm{%uW=TaV)H9!AKp_K_BusLFj8Wa^jqR8bfu6XQmkuR5UCa9dnmI4<f(5s${^@SPy=SR;?782}>?#w4iSO6l4pQb%UP2MCok7M|r}K7gAr;sU9lj)+9r8JWOu!>nSZ@WQ=0*?pzm z`AMAQq)L7M(U)__V{pthxn4(3$wxvC$^h`AoP@6}iU7~g90A^~M*u!TIPE%yG1pjf zGN-7Wj*(u*JVZJl)N>?!w??zh=~s7#6}0l!-rnwhd0Sqclpsfcc85sDGQc&~&T^QH zxNP@%NVcPmn!w+ZQ{n@8_0-m6F(>6cio)-0g6M-$BTPrdF(KT->SB#xj*PS{1Hz<(^Qh>0l!B3zD{Q~~GhA;xHcnv5SRtueGN)~PXnKS8i6RooO% z`N|z}SZpB=2;q=xN9BBh1(^A?f|>I-7-QdHjQxT!_AkcR_m(;Dm+IJg@B-MGh0EFS z@}LHWtyqNh1&#sN5xX~dx6@sxL3{fTckV63$ego&P;fn;=-gexV=!owF^st}Xy6${y%q#P03Q%)LM0_( z$>kRFnaN{A3Z#xQRB2w+-e(e*&*U`DbRlur|d2xUm_!l zMi~qXXH0uB#9p4lmYh8evO{QKFbG=kP!GBrZh)V{I-(XeU>u(pyq*U zCSIN|l|E^8u4b0Asni^xs*A7BFJ6lm3zE&UU|+g;hQ%J~owZ(|Q9GTRSLBsuTFR#& ziP3q9YS}I$h`DrI&+_~lbc%H1tGgzo3KNgQA(sP$#@1VR-)S2=jmg0gV@Et33W?3q zb^IiA9Y3t#Yo)~)TV3WdygIIK=0GYya~7oJ;pNqA7kw4SYLezww2#>xKx1o!T2M}U zS5owGaRGL-t+$~2wHs^Az;`o8D#F;5=fcefYz;J~4ZOen^dq>Pq$f=O_t4s`x7Sb_ zb{r35C%+l^{@(u9{%&Qy|A=c#`5IXYa|;M#19;f)qfX1v2>U`}wy zfuF%vsx*uk7}4`hFjmAdOt^4yhPpr7s`r0uTj!KjZ)4A@@L<*>c0ZGC*Gk)_vX5s( zy@+jpklA)y^>WJ^+FF#GmR=Nw73Orqf>R^#w-uFP8OLcHM$pcO8s{raVa|V7%z5GK zjInLT*v}bb|6q*W_Za)tvS@w&e`414%&Zw<;VjHL)vW6$QT7bJ;M^j?yl^rZ6wiQ{ zxq_`Ocrg%{BRm7*lMIMuB+0zWfGUbqYGdNMEJK6|mlmVuro*ipk)BjKq8w1f`8O*O zDi-p(d3^Y!q~Mnv+p{=+-iM_ z(ti2%wf@=Eg@Ls^b#K!LVv=~8a!=Aq&vjA5L~E4c6dDe<&CLQ+*#KTNL2?!U3*kb; I$p#<*0J6hmIRF3v literal 2810 zcmVDdtv4{)O}69HB@s$^%N{rtJ-DI zmzMJ@_aBQ000000000BkS?lZFI6PTGoo&yIYkP?YImmqNne*l~~apD3;Brb5}hh9~8 zPfyS6u2(rA`ZCkq)vsRH`@XNj%#Kw!hE8Xr(}81H z?X2Exce?G>wYd{ac@NWR@X1}7?Qk;$VSr2EajY_Fg&e?GtAXaDP2kWI7E*D5@a;^* z2PmPJS?FiLgRRoD%*@*%(PK7ls7^y>A=tG`n2z{+a&YbgasM3V)<*Vo2 zqPxzq$V2bD!Fv_#J-5af+hB}+#29-qI0Jtd>iBzH!=F8RGP`nIIO4Azd!L^WMvMOm zN=0WHV7P>N`1O^%>alqX;m03dWNf3y_ za7RgtM|J~x*eBZ2&;q;@1fFW-$ux&w0>YRKwVTLKO`*|=*$4q*C5?rr#hCZuHjMZI zzV1%n5VmpE@#AW9vmESg+|D0~X!!1EY^M+DdZW1+hWkV1UXZ|Uz^W`Bg0e%@V0kY^ zx}-M3cJ5#~7YJ!kTatxXjYcXFb_!Zepy7OIx;H2|<(7tC9EW zxH;Q>rQP~ToD`h$ihuOwLUs&}xhCOt)RcTA0feEQJ zaey0;%C_*{Jjjp zD(|={q4Jfx;;?*$VmpY3TstNg6D+~Zrxnaxyu}#%24n0OjIn<)#=du!c0X6g&i!Y= z&OBVshnM>`Fl?nFu1|0bxQ^Jp#k-yEIt|*}f3Wk$Qj9EU^?i=M2)v*_1%o`r#GP%xfv}OgpxsZyX=bzKX4`1!}J2AsMAdtK`W2U&88@q{8YK z?l8u_#Tfe;W9+Ytu};9)`vGIW4;cH>${7rQzRvK?8pC6iV3p_#>^_aon>9LjJFZgL zG6t<#M&;SjUEprj7$sKSt~0jH$&>8+ayT7nd2MB=M$Sv)!XHN}~L;tl6by#%_`^zhm<%)s1}zuA7NCuzCZKd?W37y7o2jwB zK*E9Ml;cH?8gW6PkmNcs`A#k(WiHBn zj=s?vdH)3dU|g{rKxv@39)zCbmRoAm|Y{0e1PggGQxrZqatg6W?EeyqZF;Q-Rv$n6H*4{OlpWRX9@z zh~r{%vIGexB6c-Wz0S^DiddLanzq{*)3V_H^|H|ZhB0>i+y(c+xeD&$w36C=mMZ+9 zra-k2pPetwG--9AWR~-()B>QYldmsMUfVC0B%8B({mjX8EcVFnyzv5!+UnfCCa*Pp zCGSC!qEm@#)h-iAxpc3d=lS*eyhta$x@%&pF!3lJaydX~Y`yvV+ihc~DG3}gcEsbM zkl36_$4_$U_+bTKD=o&@>RFNz)NysY08$B>^B|?zUS7=KqOa0aO?+-e?=k-d(AXNG z7L=2|E@}61`vUCduik?0*KVyfqtHD$QVFJJwl3Ukz}7&cZ{Pjprys&=nO|Z0zlYZ5 zoxO(Au;X}`I{VEi4EOf8_IE4KhYz{7l&?{wu!w*#Hi8HJK5AcvCfFAe6IazqWnqdg z5yi2^Bnt1Vq5$+B8oFOn|IRY%f5;g7+qqT!?sBewc3R)9P^aY1#+yo|e8!r#%cpEz<8TvauHU_9PQWQoP-o6{32ifK4 z-3~ZcqA-W8RDK&VFrw?5V5~?}m~i3t8S4IQtKR=@Y@H~p-o~C)@xis_!G&dpc_}hE z6wiT|g@UbacsUTyMtBay$2kyZJ4vo81F9&z)yBkiS%wG`E-fa_O@~`I!mpGcF&j|s z^RHHRs8q-UQ_VgNG-kJ5$ECTXVQ{6|I;NeTT7eG>$+`5P_kD~lfiwSm<;oQnyyTk4 zUkHNVGFHO#l22_|aG930xca$@N5!?>8r%1F_xJDZw&#+qUN$ua^?bTci$bDV2(4q* z-x*{7WQ?@}#xP*)mjPpcsxfQjOlDm><zIf4GoU4QG z(U;p<>o4zC7sYrB>T?abOz3M(VayN=+Vp|fcNjQ*i*i2X@>|ryWs`r72xHgQ%)jeI z3$yiUmkwv&Uh5xC-8QgRr0#9{JWLi(bMCRP^jsG;&a_4uPod#(+uSTMl@H)$6QpqQ Mzi2|p5Ck9q06b=cGXMYp diff --git a/packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.md b/packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.md index 4ddd418..d48eac7 100644 --- a/packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.md +++ b/packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.md @@ -18,5 +18,5 @@ Generated by [AVA](https://avajs.dev). [ 'account_guid | value_num | value_denom | reconcile_state', '00000000000000000000000000000001 | 5000 | 1 | c ', - '4ef94b1359f917d83e0fe843dce22274 | -5000 | 1 | c ', + '4503bd5cb78e51ef8d5baec41e1716bb | -5000 | 1 | c ', ] diff --git a/packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.snap b/packages/ertp-ledgerguise/test/snapshots/ledgerguise.test.ts.snap index b97f613e158e4e9cd0c75681d279f0cd427bdd4c..f60b2de0ddb300801c952c12d00a1405234fcb1a 100644 GIT binary patch literal 432 zcmV;h0Z;xxRzVWn@D<3POeaa|L6ElC6B3VT(IL7YutJ- z7mQU?v)Kf82CN3`94=T5E?FH|qs7Lm@E)yN49A7h{Ff@ZEvBoUyFf!N3Ab+168asv z;fb~h4n)b6aM|I{_LabW`TLy{^v%2{PH z90rnvd-U!Oz>9ggdVQ4?Z{@1(MJo5&#=Vn>n^Y$%?e#H%PPXnyEjjsNNH!Gacwv4 ztU$6CeF@L{0KT1f1Gq#)WiB)Qntb2%*Vk;6J9QtP-jEFCIEykfqtfGmPYq49m(xgN z;esLlAW2Oy@Er9RJ@;-JOt7*D6G!3sO>0T=j-5B*5EjLbSW^JNB>=nwK!+W)+5WZn za?V&iwOTD;$G{rEPN2gYaLSs%_S;`T0;Lr zuDHgayeY^yyHvh%8CwU79mOjy#9-MIkz7V1j*@gG{im*|jY|`dUkD*Emm|z)XIq%b zOB!+i*d(qGOaZg`$QDk_PcD2GJNqQ-- bc(k_P;lBES=@$P` Date: Fri, 6 Feb 2026 05:40:48 -0600 Subject: [PATCH 74/77] refactor: gnucash-schema Row types --- .../ertp-ledgerguise/src/gnucash-schema.ts | 39 ++++++++++++++++ .../ertp-ledgerguise/test/gnucash-tools.ts | 46 +------------------ 2 files changed, 41 insertions(+), 44 deletions(-) diff --git a/packages/ertp-ledgerguise/src/gnucash-schema.ts b/packages/ertp-ledgerguise/src/gnucash-schema.ts index 40e1c97..e827ec1 100644 --- a/packages/ertp-ledgerguise/src/gnucash-schema.ts +++ b/packages/ertp-ledgerguise/src/gnucash-schema.ts @@ -15,3 +15,42 @@ export type SlotRow = { numeric_val_denom: string | null; gdate_val: string | null; }; + +export type TransactionRow = { + guid: string; + currency_guid: string; + num: string; + post_date: string | null; + enter_date: string | null; + description: string; +}; + +export type SplitRow = { + guid: string; + tx_guid: string; + account_guid: string; + memo: string; + action: string; + reconcile_state: string; + reconcile_date: string | null; + value_num: string; + value_denom: string; + quantity_num: string; + quantity_denom: string; +}; + +export type AccountRow = { + guid: string; + name: string; + account_type: string; + commodity_guid: string; + parent_guid: string | null; + code: string | null; + description: string | null; + placeholder: number; + hidden: number; +}; + +export type BooksRow = { + root_account_guid: string; +}; diff --git a/packages/ertp-ledgerguise/test/gnucash-tools.ts b/packages/ertp-ledgerguise/test/gnucash-tools.ts index 419858e..367c5e1 100644 --- a/packages/ertp-ledgerguise/test/gnucash-tools.ts +++ b/packages/ertp-ledgerguise/test/gnucash-tools.ts @@ -2,46 +2,7 @@ * @file GnuCash table types and test helpers for snapshot formatting. */ -// #region GnuCash table row types - -export type TransactionRow = { - guid: string; - currency_guid: string; - num: string; - post_date: string | null; - enter_date: string | null; - description: string; -}; - -export type SplitRow = { - guid: string; - tx_guid: string; - account_guid: string; - memo: string; - action: string; - reconcile_state: string; - reconcile_date: string | null; - value_num: string; - value_denom: string; - quantity_num: string; - quantity_denom: string; -}; - -export type AccountRow = { - guid: string; - name: string; - account_type: string; - commodity_guid: string; - parent_guid: string | null; - code: string | null; - description: string | null; - placeholder: number; - hidden: number; -}; - -export type BooksRow = { - root_account_guid: string; -}; +import type { AccountRow, SplitRow } from '../src/gnucash-schema.js'; // Named subsets for common query patterns export type AccountPath = Pick; @@ -63,8 +24,6 @@ export type SplitEntry = Pick< | 'reconcile_state' >; -// #endregion - // #region Column lists for snapshots export const accountViewCols = [ @@ -111,8 +70,7 @@ export const shortGuids = (row: T): T => { const r = { ...row } as Record; for (const k of keys) { - if (k in r && typeof r[k] === 'string') - r[k] = shortGuid(r[k] as string); + if (k in r && typeof r[k] === 'string') r[k] = shortGuid(r[k] as string); } return r as T; }; From e1153a75ff8b5932d5d5db80fb0f0393f3b494f6 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 05:41:09 -0600 Subject: [PATCH 75/77] chore: re-do ledger-do on ledger-codec --- packages/ertp-clerk/src/gnucash-zone.ts | 272 ----------------- packages/ertp-clerk/src/ledger-do.ts | 381 ++++-------------------- 2 files changed, 59 insertions(+), 594 deletions(-) delete mode 100644 packages/ertp-clerk/src/gnucash-zone.ts diff --git a/packages/ertp-clerk/src/gnucash-zone.ts b/packages/ertp-clerk/src/gnucash-zone.ts deleted file mode 100644 index de404c2..0000000 --- a/packages/ertp-clerk/src/gnucash-zone.ts +++ /dev/null @@ -1,272 +0,0 @@ -import type { SlotRow, SqlDatabase } from '../../ertp-ledgerguise/src/index.js'; -import { - decodeBigIntRecord, - encodeBigInt, - isBigIntRecord, - isRecord, - isWebkeyRef, -} from './webkey-codec.js'; -import { extractToken, makeWebkey } from './webkey-protocol.js'; - -type TokenMetaBase = { reviver: string }; - -type ExportRuleContext = { - targetMeta: Meta; - methodName: string; - origin: string; - kit?: unknown; -} & Extra; - -type ExportRule = ( - value: unknown, - context: ExportRuleContext, -) => Promise; - -type ExportRules = Map< - string, - Map> ->; - -type Reifier = (meta: Meta) => object; - -type Reifiers = Map>; - -type Zone = { - exo: >( - name: string, - methods: T, - ) => Readonly; -}; - -type SlotCodecRow = Pick; - -type SlotCodec = { - encode: (meta: Meta) => { - name: string; - slotType: number; - guidVal: string | null; - stringVal: string | null; - }; - decode: (row: SlotCodecRow) => Meta; - bootstrapMeta: () => Meta; - equals?: (left: Meta, right: Meta) => boolean; -}; - -type GnuCashZoneRegistry = { - resolveToken: (token: string) => Promise<{ obj: object; meta: Meta }>; - ensureBootstrapToken: () => Promise; -}; - -type GnuCashZoneMarshal = { - hydrateValue: (value: unknown) => Promise; - exportValue: (value: unknown, context: ExportRuleContext) => Promise; -}; - -type GnuCashZoneKit = { - zone: Zone; - registry: GnuCashZoneRegistry; - marshal: GnuCashZoneMarshal; -}; - -type StorageLike = { - get: (key: string) => Promise; - put: (key: string, value: string) => Promise; -}; - -type GnuCashZoneArgs = { - db: SqlDatabase; - storage?: StorageLike; - exportRules: ExportRules; - reifiers: Reifiers; - makeToken: () => string; - slotCodec: SlotCodec; - buildMeta?: ( - interfaceName: string, - methods: Record, - ) => Meta | null; -}; - -const freezeProps = >( - obj: T, -): Readonly => { - for (const key of Reflect.ownKeys(obj)) { - const value = obj[key]; - if (typeof value === 'function') { - Object.freeze(value); - } - } - return Object.freeze(obj); -}; - -const makeGnuCashZoneKit = ({ - db, - storage, - exportRules, - reifiers, - makeToken, - slotCodec, - buildMeta, -}: GnuCashZoneArgs): GnuCashZoneKit => { - const liveToToken = new WeakMap(); - const tokenToLive = new Map(); - const tokenToMeta = new Map(); - const zone: Zone = { - exo: >( - interfaceName: string, - methods: T, - ): Readonly => { - const target = Object.defineProperty(methods, Symbol.toStringTag, { - value: `?${interfaceName}?`, - }); - const frozen = freezeProps(target); - const token = makeToken(); - liveToToken.set(frozen as object, token); - tokenToLive.set(token, frozen as object); - const meta = buildMeta ? buildMeta(interfaceName, methods) : null; - if (meta) { - insertSlot(token, meta); - tokenToMeta.set(token, meta); - } - return frozen as Readonly; - }, - }; - - const insertSlot = (token: string, meta: Meta) => { - const { name, slotType, guidVal, stringVal } = slotCodec.encode(meta); - db.prepare( - `INSERT INTO slots(obj_guid, name, slot_type, guid_val, string_val) - VALUES (?, ?, ?, ?, ?)`, - ).run(token, name, slotType, guidVal, stringVal); - }; - - const attachMeta = (token: string, meta: Meta) => { - const known = tokenToMeta.get(token); - if (known) { - if (slotCodec.equals && !slotCodec.equals(known, meta)) { - throw new Error('conflicting token metadata'); - } - return; - } - insertSlot(token, meta); - tokenToMeta.set(token, meta); - }; - - const resolveToken = async (token: string): Promise<{ obj: object; meta: Meta }> => { - const live = tokenToLive.get(token); - const meta = tokenToMeta.get(token); - if (live && meta) return { obj: live, meta }; - - const row = db - .prepare<[string], SlotCodecRow>('SELECT name, guid_val, string_val FROM slots WHERE obj_guid = ?') - .get(token); - if (!row) { - throw new Error('unknown capability'); - } - const parsed = slotCodec.decode(row); - - const reifier = reifiers.get(parsed.reviver); - if (!reifier) throw new Error('unknown capability reviver'); - const obj = reifier(parsed); - - tokenToLive.set(token, obj); - tokenToMeta.set(token, parsed); - liveToToken.set(obj, token); - return { obj, meta: parsed }; - }; - - const hydrateValue = async (value: unknown): Promise => { - if (isBigIntRecord(value)) { - return decodeBigIntRecord(value); - } - if (isWebkeyRef(value) && typeof value['@'] === 'string') { - const token = extractToken(value['@']); - const resolved = await resolveToken(token); - return resolved.obj; - } - if (Array.isArray(value)) { - return Promise.all(value.map(entry => hydrateValue(entry))); - } - if (isRecord(value)) { - const entries = await Promise.all( - Object.entries(value).map(async ([key, entry]) => [ - key, - await hydrateValue(entry), - ]), - ); - return Object.fromEntries(entries); - } - return value; - }; - - const exportValue = async ( - value: unknown, - context: ExportRuleContext, - ): Promise => { - if (typeof value === 'bigint') return encodeBigInt(value); - if (!value || typeof value !== 'object') return value; - if (Array.isArray(value)) { - return Promise.all(value.map(entry => exportValue(entry, context))); - } - const token = liveToToken.get(value as object); - if (token) { - if (!tokenToMeta.has(token)) { - const rules = exportRules.get(context.targetMeta.reviver); - const rule = rules?.get(context.methodName); - if (!rule) { - throw new Error('unexportable object'); - } - const meta = await rule(value, context); - if (!meta) { - throw new Error('unexportable object'); - } - attachMeta(token, meta); - } - return { '@': makeWebkey(context.origin, token) }; - } - if (isRecord(value)) { - const entries = await Promise.all( - Object.entries(value).map(async ([key, entry]) => [ - key, - await exportValue(entry, context), - ]), - ); - return Object.fromEntries(entries); - } - return value; - }; - - const ensureBootstrapToken = async (): Promise => { - const existing = await storage?.get('bootstrapToken'); - if (existing) return existing; - const token = makeToken(); - insertSlot(token, slotCodec.bootstrapMeta()); - if (storage) await storage.put('bootstrapToken', token); - return token; - }; - - return { - zone, - registry: { - resolveToken, - ensureBootstrapToken, - }, - marshal: { - hydrateValue, - exportValue, - }, - }; -}; - -export { makeGnuCashZoneKit }; -export type { - ExportRule, - ExportRuleContext, - ExportRules, - GnuCashZoneKit, - GnuCashZoneMarshal, - GnuCashZoneRegistry, - Reifier, - Reifiers, - TokenMetaBase, - SlotCodec, -}; diff --git a/packages/ertp-clerk/src/ledger-do.ts b/packages/ertp-clerk/src/ledger-do.ts index 458e796..c9d9e03 100644 --- a/packages/ertp-clerk/src/ledger-do.ts +++ b/packages/ertp-clerk/src/ledger-do.ts @@ -1,211 +1,26 @@ import { DurableObject } from 'cloudflare:workers'; import { createIssuerKit, - openIssuerKit, initGnuCashSchema, - SLOT_TYPE_GUID, - SLOT_TYPE_STRING, asGuid, type SqlDatabase, } from '../../ertp-ledgerguise/src/index.js'; -import type { - AccountPurseAccess, - AccountPurse, - Guid, - IssuerKitForCommodity, - IssuerKitWithPurseGuids, - PaymentAccess, -} from '../../ertp-ledgerguise/src/types.js'; +import type { Guid } from '../../ertp-ledgerguise/src/types.js'; +import { SLOT_TYPE_STRING } from '../../ertp-ledgerguise/src/gnucash-schema.js'; import { makeSqlDatabaseFromStorage } from './sql-adapter.js'; -import { makeGnuCashZoneKit } from './gnucash-zone.js'; -import { makeWebkey } from './webkey-protocol.js'; -import type { - ExportRules, - ExportRuleContext, - GnuCashZoneKit, - SlotCodec, - TokenMetaBase, -} from './gnucash-zone.js'; +import { makeLedgerCodec } from './ledger-codec.js'; +import { extractToken, makeWebkey } from './webkey-protocol.js'; const { freeze } = Object; -type GnuCashTokenMeta = TokenMetaBase & { - commodityGuid?: Guid; - accountGuid?: Guid; - checkNumber?: string; -}; - -type GnuCashExportContext = { - commodityGuid?: Guid; -}; - -type ZoneKit = GnuCashZoneKit; - -const SLOT_PREFIX = 'ledgerguise.webkey.'; -const slotNameForReviver = (reviver: string) => `${SLOT_PREFIX}${reviver}`; - -const makeExportRules = (helpers: { - inferPurseGuid: (kit: KitRecord, purse: object) => Promise; -}): ExportRules => { - const rules: ExportRules = new Map(); - const forReviver = (reviver: string) => { - const table = new Map(); - rules.set(reviver, table); - return table; - }; - - const requireKit = ( - context: ExportRuleContext, - ): KitRecord => { - if (!context.kit) throw new Error('missing kit in export context'); - return context.kit as KitRecord; - }; - - forReviver('issuer').set( - 'makeEmptyPurse', - async (purse: unknown, context: ExportRuleContext) => { - const kit = requireKit(context); - // Export rule only runs for known ERTP purse results. - const accountGuid = await helpers.inferPurseGuid(kit, purse as object); - return { reviver: 'purse', commodityGuid: context.commodityGuid, accountGuid }; - }, - ); - forReviver('issuer').set( - 'getBrand', - async (_brand: unknown, context: ExportRuleContext) => { - return { reviver: 'brand', commodityGuid: context.commodityGuid }; - }, - ); - - forReviver('mint').set( - 'mintPayment', - async (payment: unknown, context: ExportRuleContext) => { - const kit = requireKit(context); - // Export rule only runs for ERTP payment results. - const checkNumber = kit.payments.getCheckNumber(payment as object); - return { reviver: 'payment', commodityGuid: context.commodityGuid, checkNumber }; - }, - ); - forReviver('mint').set( - 'getIssuer', - async (_issuer: unknown, context: ExportRuleContext) => { - return { reviver: 'issuer', commodityGuid: context.commodityGuid }; - }, - ); - - forReviver('purse').set( - 'withdraw', - async (payment: unknown, context: ExportRuleContext) => { - const kit = requireKit(context); - // Export rule only runs for ERTP payment results. - const checkNumber = kit.payments.getCheckNumber(payment as object); - return { reviver: 'payment', commodityGuid: context.commodityGuid, checkNumber }; - }, - ); - forReviver('purse').set( - 'getDepositFacet', - async (_facet: unknown, context: ExportRuleContext) => { - if (!context.targetMeta.accountGuid) return null; - return { - reviver: 'depositFacet', - commodityGuid: context.commodityGuid, - accountGuid: context.targetMeta.accountGuid, - }; - }, - ); - - return rules; -}; - -const slotCodec: SlotCodec = { - encode: (meta) => { - const name = slotNameForReviver(meta.reviver); - let guidVal: string | null = null; - let stringVal: string | null = null; - let slotType = SLOT_TYPE_GUID; - if (meta.reviver === 'purse' || meta.reviver === 'depositFacet') { - if (!meta.accountGuid || !meta.commodityGuid) { - throw new Error('missing purse metadata'); - } - guidVal = meta.accountGuid; - stringVal = meta.commodityGuid; - slotType = SLOT_TYPE_STRING; - } else if (meta.reviver === 'payment') { - if (!meta.commodityGuid || !meta.checkNumber) { - throw new Error('missing payment metadata'); - } - guidVal = meta.commodityGuid; - stringVal = meta.checkNumber; - slotType = SLOT_TYPE_STRING; - } else if (meta.reviver !== 'bootstrap') { - if (!meta.commodityGuid) { - throw new Error('missing commodity metadata'); - } - guidVal = meta.commodityGuid; - } - return { name, slotType, guidVal, stringVal }; - }, - decode: (row) => { - if (!row.name.startsWith(SLOT_PREFIX)) { - throw new Error('unknown capability'); - } - const reviver = row.name.slice(SLOT_PREFIX.length); - if (reviver === 'purse' || reviver === 'depositFacet') { - if (!row.guid_val || !row.string_val) { - throw new Error('invalid purse token'); - } - return { - reviver, - accountGuid: asGuid(row.guid_val), - commodityGuid: asGuid(row.string_val), - }; - } - if (reviver === 'payment') { - if (!row.guid_val || !row.string_val) { - throw new Error('invalid payment token'); - } - return { - reviver, - commodityGuid: asGuid(row.guid_val), - checkNumber: row.string_val, - }; - } - if (reviver === 'bootstrap') { - return { reviver }; - } - if (!row.guid_val) { - throw new Error('invalid token'); - } - return { reviver, commodityGuid: asGuid(row.guid_val) }; - }, - bootstrapMeta: () => ({ reviver: 'bootstrap' }), - equals: (left, right) => - left.reviver === right.reviver && - left.commodityGuid === right.commodityGuid && - left.accountGuid === right.accountGuid && - left.checkNumber === right.checkNumber, -}; - -type KitRecord = { - commodityGuid: Guid; - kit: { issuer: object; brand: object; mint: object }; - payments: PaymentAccess; - accounts: AccountPurseAccess; - purses?: IssuerKitWithPurseGuids['purses']; - purseGuids?: IssuerKitForCommodity['purseGuids']; -}; export class LedgerDurableObject extends DurableObject { private readonly state: DurableObjectState; private readonly db: SqlDatabase; private readonly ready: Promise; - private readonly kits = new Map(); - private readonly zone: ZoneKit['zone']; - private readonly zoneRegistry: ZoneKit['registry']; - private readonly zoneMarshal: ZoneKit['marshal']; + private readonly codec: ReturnType; private readonly makeGuid: () => Guid; private bootstrap: { makeIssuerKit: (name: string) => object } | null = null; - private currentCommodityGuid: Guid | null = null; constructor(ctx: DurableObjectState, env: Env) { super(ctx, env); @@ -214,27 +29,16 @@ export class LedgerDurableObject extends DurableObject { this.makeGuid = () => asGuid(randomUUID().replace(/-/g, '')); this.state = ctx; this.db = makeSqlDatabaseFromStorage(ctx.storage.sql); - const zoneKit = makeGnuCashZoneKit({ + this.codec = makeLedgerCodec({ db: this.db, - storage: ctx.storage, - exportRules: makeExportRules({ - inferPurseGuid: (kit, purse) => this.inferPurseGuid(kit, purse), - }), - reifiers: this.makeReifiers(), + nowMs: () => Date.now(), + makeGuid: this.makeGuid, makeToken, - slotCodec, - buildMeta: (interfaceName: string) => { - const commodityGuid = this.currentCommodityGuid; - if (!commodityGuid) return null; - if (interfaceName.endsWith(' Brand')) return { reviver: 'brand', commodityGuid }; - if (interfaceName.endsWith(' Issuer')) return { reviver: 'issuer', commodityGuid }; - if (interfaceName.endsWith(' Mint')) return { reviver: 'mint', commodityGuid }; - return null; + refCodec: { + makeRef: token => token, + parseRef: ref => extractToken(ref), }, }); - this.zone = zoneKit.zone; - this.zoneRegistry = zoneKit.registry; - this.zoneMarshal = zoneKit.marshal; this.ready = this.ensureSchema(); } @@ -257,113 +61,37 @@ export class LedgerDurableObject extends DurableObject { return this.bootstrap; } + private async ensureBootstrapToken(): Promise { + const book = this.db + .prepare<[], { guid: string }>('SELECT guid FROM books LIMIT 1') + .get(); + const bookGuid = book?.guid; + if (!bookGuid) throw new Error('missing book guid'); + const row = this.db + .prepare<[string], { string_val: string | null }>( + 'SELECT string_val FROM slots WHERE obj_guid = ? AND name = ?', + ) + .get(bookGuid, 'ledgerguise.bootstrap'); + if (row?.string_val) return row.string_val; + const token = crypto.randomUUID().replace(/-/g, ''); + this.db + .prepare( + `INSERT INTO slots(obj_guid, name, slot_type, guid_val, string_val) + VALUES (?, ?, ?, ?, ?)`, + ) + .run(bookGuid, 'ledgerguise.bootstrap', SLOT_TYPE_STRING, null, token); + return token; + } + private makeIssuerKit(name: string) { - let createdCommodity: Guid | null = null; - const makeGuid = () => { - const guid = this.makeGuid(); - if (!createdCommodity) { - createdCommodity = guid; - this.currentCommodityGuid = guid; - } - return guid; - }; const kit = createIssuerKit({ db: this.db, commodity: { namespace: 'COMMODITY', mnemonic: name }, - makeGuid, - nowMs: () => Date.now(), - zone: this.zone, - }); - this.currentCommodityGuid = null; - const record: KitRecord = { - commodityGuid: kit.commodityGuid, - kit: { issuer: kit.issuer, brand: kit.brand, mint: kit.mint }, - payments: kit.payments, - accounts: { - makeAccountPurse: (accountGuid: Guid) => - openIssuerKit({ - db: this.db, - commodityGuid: kit.commodityGuid, - makeGuid: this.makeGuid, - nowMs: () => Date.now(), - zone: this.zone, - }).accounts.makeAccountPurse(accountGuid), - openAccountPurse: (accountGuid: Guid) => - openIssuerKit({ - db: this.db, - commodityGuid: kit.commodityGuid, - makeGuid: this.makeGuid, - nowMs: () => Date.now(), - zone: this.zone, - }).accounts.openAccountPurse(accountGuid), - }, - purses: kit.purses, - }; - this.kits.set(kit.commodityGuid, record); - return freeze({ issuer: kit.issuer, brand: kit.brand, mint: kit.mint }); - } - - private getKit(commodityGuid: Guid): KitRecord { - const existing = this.kits.get(commodityGuid); - if (existing) return existing; - this.currentCommodityGuid = commodityGuid; - const opened = openIssuerKit({ - db: this.db, - commodityGuid, makeGuid: this.makeGuid, nowMs: () => Date.now(), - zone: this.zone, - }); - this.currentCommodityGuid = null; - const record: KitRecord = { - commodityGuid, - kit: opened.kit, - payments: opened.payments, - accounts: opened.accounts, - purseGuids: opened.purseGuids, - }; - this.kits.set(commodityGuid, record); - return record; - } - - private async inferPurseGuid(record: KitRecord, purse: unknown): Promise { - if (record.purses) { - // purses.getGuid only accepts real purse objects. - return record.purses.getGuid(purse as object); - } - // purseGuids maps runtime purse objects to GUIDs. - const guid = record.purseGuids?.get(purse as AccountPurse); - if (!guid) throw new Error('unknown purse'); - return guid; - } - - private makeReifiers() { - const reifiers = new Map(); - reifiers.set('bootstrap', () => this.makeBootstrap()); - reifiers.set('issuer', (meta: { commodityGuid: Guid }) => - this.getKit(meta.commodityGuid).kit.issuer, - ); - reifiers.set('brand', (meta: { commodityGuid: Guid }) => - this.getKit(meta.commodityGuid).kit.brand, - ); - reifiers.set('mint', (meta: { commodityGuid: Guid }) => - this.getKit(meta.commodityGuid).kit.mint, - ); - reifiers.set('purse', (meta: { commodityGuid: Guid; accountGuid: Guid }) => { - const kit = this.getKit(meta.commodityGuid); - return kit.accounts.openAccountPurse(meta.accountGuid); }); - reifiers.set('depositFacet', (meta: { commodityGuid: Guid; accountGuid: Guid }) => { - const kit = this.getKit(meta.commodityGuid); - const purse = kit.accounts.openAccountPurse(meta.accountGuid); - // AccountPurse doesn't declare getDepositFacet, but the runtime purse does. - return (purse as unknown as { getDepositFacet: () => object }).getDepositFacet(); - }); - reifiers.set('payment', (meta: { commodityGuid: Guid; checkNumber: string }) => { - const kit = this.getKit(meta.commodityGuid); - return kit.payments.openPayment(meta.checkNumber); - }); - return reifiers; + this.codec.registerKit(kit); + return freeze({ issuer: kit.issuer, brand: kit.brand, mint: kit.mint }); } private bootstrapModule(webkey: string) { @@ -426,7 +154,7 @@ export { bootstrap, keyToProxy }; }); } if (url.pathname === '/bootstrap') { - const token = await this.zoneRegistry.ensureBootstrapToken(); + const token = await this.ensureBootstrapToken(); const webkey = makeWebkey(url.origin, token); if (url.searchParams.get('format') === 'json') { return new Response(JSON.stringify({ webkey }), { @@ -453,7 +181,20 @@ export { bootstrap, keyToProxy }; if (!token || !methodName) { return new Response('missing capability or method', { status: 400 }); } - const { obj, meta } = await this.zoneRegistry.resolveToken(token); + let obj: unknown; + try { + const bootstrapToken = await this.ensureBootstrapToken(); + if (token === bootstrapToken) { + obj = this.makeBootstrap(); + } else { + obj = this.codec.build({ '@': token }); + } + } catch { + return new Response(JSON.stringify({ '!': 'unknown capability' }), { + status: 404, + headers: { 'content-type': 'application/json; charset=utf-8' }, + }); + } const target = obj as Record; const method = target[methodName]; if (typeof method !== 'function') { @@ -473,21 +214,17 @@ export { bootstrap, keyToProxy }; headers: { 'content-type': 'application/json; charset=utf-8' }, }); } - const hydrated = await Promise.all(args.map((arg) => this.zoneMarshal.hydrateValue(arg))); + const hydrated = args.map((arg) => this.codec.build(arg)); try { const result = await method.apply(obj, hydrated); - const origin = url.origin; - const exported = await this.zoneMarshal.exportValue(result, { - targetMeta: meta, - methodName, - origin, - commodityGuid: meta.commodityGuid, - kit: meta.commodityGuid ? this.getKit(meta.commodityGuid) : null, - }); - const payload = - exported && typeof exported === 'object' && '@' in exported - ? exported - : { '=': exported }; + const exported = this.codec.recognize(result); + let payload: unknown; + if (exported && typeof exported === 'object' && '@' in exported) { + const ref = String((exported as { '@': string })['@']); + payload = { '@': makeWebkey(url.origin, extractToken(ref)) }; + } else { + payload = { '=': exported }; + } return new Response(JSON.stringify(payload), { headers: { 'content-type': 'application/json; charset=utf-8' }, }); From 0fc1b1f86e1c70fe89d2c645101fc697c2dc68f1 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 05:41:35 -0600 Subject: [PATCH 76/77] build: lock packages (WIP) --- yarn.lock | 146 +++++++++--------------------------------------------- 1 file changed, 24 insertions(+), 122 deletions(-) diff --git a/yarn.lock b/yarn.lock index 691408e..693893a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -395,7 +395,7 @@ __metadata: languageName: node linkType: hard -"@cspotcode/source-map-support@npm:0.8.1, @cspotcode/source-map-support@npm:^0.8.0": +"@cspotcode/source-map-support@npm:0.8.1": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" dependencies: @@ -1021,7 +1021,7 @@ __metadata: "@types/better-sqlite3": "npm:^7.6.1" ava: "npm:^5.3.1" better-sqlite3: "npm:^12.6.2" - ts-node: "npm:^10.9.2" + ts-blank-space: "npm:^0.6.2" typescript: "npm:~5.9.3" languageName: unknown linkType: soft @@ -1706,34 +1706,6 @@ __metadata: languageName: node linkType: hard -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.12 - resolution: "@tsconfig/node10@npm:1.0.12" - checksum: 10c0/7bbbd7408cfaced86387a9b1b71cebc91c6fd701a120369735734da8eab1a4773fc079abd9f40c9e0b049e12586c8ac0e13f0da596bfd455b9b4c3faa813ebc5 - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.4 - resolution: "@tsconfig/node16@npm:1.0.4" - checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb - languageName: node - linkType: hard - "@types/better-sqlite3@npm:^7.6.1": version: 7.6.4 resolution: "@types/better-sqlite3@npm:7.6.4" @@ -2216,7 +2188,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": +"acorn-walk@npm:^8.2.0": version: 8.3.4 resolution: "acorn-walk@npm:8.3.4" dependencies: @@ -2252,7 +2224,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.4.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn@npm:^8.11.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": version: 8.15.0 resolution: "acorn@npm:8.15.0" bin: @@ -2474,13 +2446,6 @@ __metadata: languageName: node linkType: hard -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a - languageName: node - linkType: hard - "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -4399,13 +4364,6 @@ __metadata: languageName: node linkType: hard -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 - languageName: node - linkType: hard - "cross-spawn@npm:^6.0.0, cross-spawn@npm:^6.0.5": version: 6.0.6 resolution: "cross-spawn@npm:6.0.6" @@ -4834,13 +4792,6 @@ __metadata: languageName: node linkType: hard -"diff@npm:^4.0.1": - version: 4.0.4 - resolution: "diff@npm:4.0.4" - checksum: 10c0/855fb70b093d1d9643ddc12ea76dca90dc9d9cdd7f82c08ee8b9325c0dc5748faf3c82e2047ced5dcaa8b26e58f7903900be2628d0380a222c02d79d8de385df - languageName: node - linkType: hard - "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -5238,6 +5189,7 @@ __metadata: capnweb: "npm:^0.4.0" drizzle-orm: "npm:^0.44.5" patch-package: "npm:^8.0.1" + typescript: "npm:~5.9.3" wrangler: "npm:^4.59.2" languageName: unknown linkType: soft @@ -10124,13 +10076,6 @@ __metadata: languageName: node linkType: hard -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f - languageName: node - linkType: hard - "make-fetch-happen@npm:^13.0.0": version: 13.0.1 resolution: "make-fetch-happen@npm:13.0.1" @@ -14820,41 +14765,12 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:^10.9.2": - version: 10.9.2 - resolution: "ts-node@npm:10.9.2" - dependencies: - "@cspotcode/source-map-support": "npm:^0.8.0" - "@tsconfig/node10": "npm:^1.0.7" - "@tsconfig/node12": "npm:^1.0.7" - "@tsconfig/node14": "npm:^1.0.0" - "@tsconfig/node16": "npm:^1.0.2" - acorn: "npm:^8.4.1" - acorn-walk: "npm:^8.1.1" - arg: "npm:^4.1.0" - create-require: "npm:^1.1.0" - diff: "npm:^4.0.1" - make-error: "npm:^1.1.1" - v8-compile-cache-lib: "npm:^3.0.1" - yn: "npm:3.1.1" - 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 - 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 - checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 +"ts-blank-space@npm:^0.6.2": + version: 0.6.2 + resolution: "ts-blank-space@npm:0.6.2" + dependencies: + typescript: "npm:5.1.6 - 5.9.x" + checksum: 10c0/fcc0fca1f2d8a711d8abdad26335d3dd86eef54a2c853a1703d2f9a4adb79de0b2ef1bb3dc38b4417cb74786fbc4f1c8096cc32acf0aaad868e91bba9bf9cc77 languageName: node linkType: hard @@ -15112,6 +15028,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:5.1.6 - 5.9.x, typescript@npm:~5.9.3": + version: 5.9.3 + resolution: "typescript@npm:5.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 + languageName: node + linkType: hard + "typescript@npm:^4.0.5, typescript@npm:^4.1.3, typescript@npm:^4.4.2, typescript@npm:^4.8.4": version: 4.9.5 resolution: "typescript@npm:4.9.5" @@ -15142,13 +15068,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~5.9.3": +"typescript@patch:typescript@npm%3A5.1.6 - 5.9.x#optional!builtin, typescript@patch:typescript@npm%3A~5.9.3#optional!builtin": version: 5.9.3 - resolution: "typescript@npm:5.9.3" + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 + checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430 languageName: node linkType: hard @@ -15182,16 +15108,6 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A~5.9.3#optional!builtin": - version: 5.9.3 - resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430 - languageName: node - linkType: hard - "ua-parser-js@npm:^0.7.30": version: 0.7.41 resolution: "ua-parser-js@npm:0.7.41" @@ -15506,13 +15422,6 @@ __metadata: languageName: node linkType: hard -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 - languageName: node - linkType: hard - "v8-compile-cache@npm:^2.0.3": version: 2.4.0 resolution: "v8-compile-cache@npm:2.4.0" @@ -16171,13 +16080,6 @@ __metadata: languageName: node linkType: hard -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 - languageName: node - linkType: hard - "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" From c6c591bba3f49828a4d02b1eb5c695c0d8ab7604 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 6 Feb 2026 23:34:56 -0600 Subject: [PATCH 77/77] refactor: webkey-do --- packages/ertp-clerk/CONTRIBUTING.md | 3 + packages/ertp-clerk/scripts/smoke.js | 2 +- packages/ertp-clerk/src/ledger-do.ts | 303 +++++++------------ packages/ertp-clerk/src/webkey-client.js | 12 +- packages/ertp-clerk/src/webkey-protocol.d.ts | 4 + packages/ertp-clerk/src/webkey-protocol.js | 10 +- packages/ertp-ledgerguise/src/index.ts | 14 + packages/ertp-ledgerguise/src/settlement.ts | 6 +- packages/ertp-ledgerguise/src/sql-db.ts | 11 +- 9 files changed, 153 insertions(+), 212 deletions(-) diff --git a/packages/ertp-clerk/CONTRIBUTING.md b/packages/ertp-clerk/CONTRIBUTING.md index 97dcea3..f24fa55 100644 --- a/packages/ertp-clerk/CONTRIBUTING.md +++ b/packages/ertp-clerk/CONTRIBUTING.md @@ -15,12 +15,15 @@ Thanks for your interest in contributing! This package will host the worker/serv - Keep changes limited to this package unless requested. - Prefer minimal, explicit interfaces for the worker API. +- Use real private fields (`#`) for internal state; keep public API explicit. ## Context - This worker depends on `@finquick/ertp-ledgerguise` behavior and types. Treat this package as a service layer, not the source of ledger semantics. - End-to-end validation depends on ledgerguise tests passing and the DB backend choices for Workers (Durable Object SQLite vs D1). - Design notes live in `docs-design/` (start with `docs-design/waterken-webkey.md`). +- Capability discipline for this package is in `docs-design/ocap-discipline.md`. +- Keep ambient authority at the entrypoint only; inject it into pure logic. ## Development diff --git a/packages/ertp-clerk/scripts/smoke.js b/packages/ertp-clerk/scripts/smoke.js index 9329c4b..a8b9202 100644 --- a/packages/ertp-clerk/scripts/smoke.js +++ b/packages/ertp-clerk/scripts/smoke.js @@ -6,7 +6,7 @@ const bootstrapUrl = new URL('/bootstrap', baseUrl); bootstrapUrl.searchParams.set('format', 'json'); const { webkey } = await fetch(bootstrapUrl).then((res) => res.json()); -const client = makeClient(apiUrl); +const client = makeClient(apiUrl, { fetch }); const bootstrap = client.keyToProxy(webkey); const { issuer, brand, payment: pmt1 } = await (async () => { const kit = await bootstrap.makeIssuerKit('BUCKS'); diff --git a/packages/ertp-clerk/src/ledger-do.ts b/packages/ertp-clerk/src/ledger-do.ts index c9d9e03..467c5ac 100644 --- a/packages/ertp-clerk/src/ledger-do.ts +++ b/packages/ertp-clerk/src/ledger-do.ts @@ -1,7 +1,6 @@ -import { DurableObject } from 'cloudflare:workers'; import { createIssuerKit, - initGnuCashSchema, + ensureGnuCashSchema, asGuid, type SqlDatabase, } from '../../ertp-ledgerguise/src/index.js'; @@ -9,232 +8,132 @@ import type { Guid } from '../../ertp-ledgerguise/src/types.js'; import { SLOT_TYPE_STRING } from '../../ertp-ledgerguise/src/gnucash-schema.js'; import { makeSqlDatabaseFromStorage } from './sql-adapter.js'; import { makeLedgerCodec } from './ledger-codec.js'; -import { extractToken, makeWebkey } from './webkey-protocol.js'; +import type { WireEncoding } from './webkey-codec.js'; +import { extractToken } from './webkey-protocol.js'; +import { WebkeyRpcDurableObject } from './webkey-do.js'; const { freeze } = Object; +const getBookGuid = (db: SqlDatabase): Guid => { + const book = db + .prepare<[], { guid: string }>('SELECT guid FROM books LIMIT 1') + .get(); + const bookGuid = book?.guid; + if (!bookGuid) throw new Error('missing book guid'); + return asGuid(bookGuid); +}; -export class LedgerDurableObject extends DurableObject { - private readonly state: DurableObjectState; - private readonly db: SqlDatabase; - private readonly ready: Promise; - private readonly codec: ReturnType; - private readonly makeGuid: () => Guid; - private bootstrap: { makeIssuerKit: (name: string) => object } | null = null; +const getOrInsertSlotString = ( + db: SqlDatabase, + objGuid: Guid, + name: string, + makeValue: () => string, +): string => { + const row = db + .prepare<[string, string], { string_val: string | null }>( + 'SELECT string_val FROM slots WHERE obj_guid = ? AND name = ?', + ) + .get(objGuid, name); + if (row?.string_val) return row.string_val; + const value = makeValue(); + db.prepare( + `INSERT INTO slots(obj_guid, name, slot_type, string_val) + VALUES (?, ?, ?, ?)`, + ).run(objGuid, name, SLOT_TYPE_STRING, value); + return value; +}; - constructor(ctx: DurableObjectState, env: Env) { +type IO = { + makeToken: () => string; + makeGuid: () => Guid; + nowMs: () => number; +}; + +class LedgerDurableObjectBase extends WebkeyRpcDurableObject { + readonly #db: SqlDatabase; + readonly #readyPromise: Promise; + readonly #codec: ReturnType; + readonly #makeGuid: () => Guid; + readonly #nowMs: () => number; + readonly #makeToken: () => string; + readonly #bootstrap: { makeIssuerKit: (name: string) => object }; + + constructor(ctx: DurableObjectState, env: Env, io: IO) { super(ctx, env); - const randomUUID = crypto.randomUUID.bind(crypto); - const makeToken = () => randomUUID().replace(/-/g, ''); - this.makeGuid = () => asGuid(randomUUID().replace(/-/g, '')); - this.state = ctx; - this.db = makeSqlDatabaseFromStorage(ctx.storage.sql); - this.codec = makeLedgerCodec({ - db: this.db, - nowMs: () => Date.now(), - makeGuid: this.makeGuid, - makeToken, + this.#makeGuid = io.makeGuid; + this.#makeToken = io.makeToken; + this.#nowMs = io.nowMs; + this.#db = makeSqlDatabaseFromStorage(ctx.storage.sql); + this.#bootstrap = freeze({ + makeIssuerKit: (name: string) => this.makeIssuerKit(name), + }); + this.#codec = makeLedgerCodec({ + db: this.#db, + nowMs: this.#nowMs, + makeGuid: this.#makeGuid, + makeToken: this.#makeToken, + // XXX why do we want/need this? refCodec: { makeRef: token => token, parseRef: ref => extractToken(ref), }, }); - this.ready = this.ensureSchema(); + this.#readyPromise = Promise.resolve().then(() => + ensureGnuCashSchema(this.#db, { allowTransactionStatements: false }), + ); + } + + protected ready(): Promise { + return this.#readyPromise; + } + + protected async ensureBootstrapToken(): Promise { + const bookGuid = getBookGuid(this.#db); + return getOrInsertSlotString( + this.#db, + bookGuid, + 'ledgerguise.bootstrap', + this.#makeToken, + ); } - private async ensureSchema() { - const row = this.db - .prepare( - "SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?", - ) - .get('accounts'); - if (!row) { - initGnuCashSchema(this.db, { allowTransactionStatements: false }); + protected async resolveCapability(token: string): Promise { + const bootstrapToken = await this.ensureBootstrapToken(); + if (token === bootstrapToken) { + return this.#bootstrap; } + // TODO: consider moving bootstrap token resolution into the codec. + return this.#codec.build({ '@': token }); } - private makeBootstrap() { - if (this.bootstrap) return this.bootstrap; - this.bootstrap = freeze({ - makeIssuerKit: (name: string) => this.makeIssuerKit(name), - }); - return this.bootstrap; + protected build(value: unknown): unknown { + return this.#codec.build(value as WireEncoding); } - private async ensureBootstrapToken(): Promise { - const book = this.db - .prepare<[], { guid: string }>('SELECT guid FROM books LIMIT 1') - .get(); - const bookGuid = book?.guid; - if (!bookGuid) throw new Error('missing book guid'); - const row = this.db - .prepare<[string], { string_val: string | null }>( - 'SELECT string_val FROM slots WHERE obj_guid = ? AND name = ?', - ) - .get(bookGuid, 'ledgerguise.bootstrap'); - if (row?.string_val) return row.string_val; - const token = crypto.randomUUID().replace(/-/g, ''); - this.db - .prepare( - `INSERT INTO slots(obj_guid, name, slot_type, guid_val, string_val) - VALUES (?, ?, ?, ?, ?)`, - ) - .run(bookGuid, 'ledgerguise.bootstrap', SLOT_TYPE_STRING, null, token); - return token; + protected recognize(value: unknown): unknown { + return this.#codec.recognize(value); } private makeIssuerKit(name: string) { const kit = createIssuerKit({ - db: this.db, + db: this.#db, commodity: { namespace: 'COMMODITY', mnemonic: name }, - makeGuid: this.makeGuid, - nowMs: () => Date.now(), - }); - this.codec.registerKit(kit); - return freeze({ issuer: kit.issuer, brand: kit.brand, mint: kit.mint }); - } - - private bootstrapModule(webkey: string) { - const module = `import { encodeClientValue, decodeClientValue } from '/webkey-codec.js'; -import { extractToken } from '/webkey-protocol.js'; -const baseUrl = new URL('/api', globalThis.location.href); -const keyToProxy = (webkey, allegedInterface = 'Remotable') => { - const post = async (method, ...args) => { - const url = new URL(baseUrl); - const token = extractToken(webkey); - url.searchParams.set('s', token); - url.searchParams.set('q', method); - const res = await fetch(url, { - method: 'POST', - headers: { 'content-type': 'text/plain' }, - body: JSON.stringify(args.map(encodeClientValue)), + makeGuid: this.#makeGuid, + nowMs: this.#nowMs, }); - const data = await res.json(); - if ('=' in data) return decodeClientValue(data['='], keyToProxy); - if ('@' in data) return keyToProxy(data['@']); - if ('!' in data) throw new Error(data['!']); - throw new Error('rpc error'); - }; - const target = { webkey, isProxy: true, post }; - Object.defineProperty(target, Symbol.toStringTag, { - value: allegedInterface, - writable: false, - enumerable: false, - configurable: false, - }); - return new Proxy(target, { - get(innerTarget, prop) { - if (prop in innerTarget) return innerTarget[prop]; - if (prop === 'then') return undefined; - return (...args) => innerTarget.post(prop, ...args); - }, - }); -}; -const bootstrap = keyToProxy(${JSON.stringify(webkey)}); -export { bootstrap, keyToProxy }; -`; - return module; + this.#codec.registerKit(kit); + const { issuer, brand, mint } = kit; + return freeze({ issuer, brand, mint }); } - async fetch(request: Request): Promise { - await this.ready; - const url = new URL(request.url); - if (url.pathname === '/webkey-codec.js') { - // TODO: review whether this should be served from the worker root instead of the DO. - const module = `export { encodeClientValue, decodeClientValue } from './webkey-codec.js';\n`; - return new Response(module, { - headers: { 'content-type': 'application/javascript; charset=utf-8' }, - }); - } - if (url.pathname === '/webkey-protocol.js') { - // TODO: review whether this should be served from the worker root instead of the DO. - const module = `export { extractToken, makeWebkey } from './webkey-protocol.js';\n`; - return new Response(module, { - headers: { 'content-type': 'application/javascript; charset=utf-8' }, - }); - } - if (url.pathname === '/bootstrap') { - const token = await this.ensureBootstrapToken(); - const webkey = makeWebkey(url.origin, token); - if (url.searchParams.get('format') === 'json') { - return new Response(JSON.stringify({ webkey }), { - headers: { 'content-type': 'application/json; charset=utf-8' }, - }); - } - return new Response(this.bootstrapModule(webkey), { - headers: { 'content-type': 'application/javascript; charset=utf-8' }, - }); - } - if (url.pathname === '/api') { - if (request.method !== 'POST') { - return new Response('method not allowed', { status: 405 }); - } - return this.handleRpc(request); - } - return new Response('ertp-clerk: not implemented', { status: 501 }); - } + // uses default bootstrapModule from WebkeyRpcDurableObject +} - private async handleRpc(request: Request): Promise { - const url = new URL(request.url); - const token = url.searchParams.get('s'); - const methodName = url.searchParams.get('q'); - if (!token || !methodName) { - return new Response('missing capability or method', { status: 400 }); - } - let obj: unknown; - try { - const bootstrapToken = await this.ensureBootstrapToken(); - if (token === bootstrapToken) { - obj = this.makeBootstrap(); - } else { - obj = this.codec.build({ '@': token }); - } - } catch { - return new Response(JSON.stringify({ '!': 'unknown capability' }), { - status: 404, - headers: { 'content-type': 'application/json; charset=utf-8' }, - }); - } - const target = obj as Record; - const method = target[methodName]; - if (typeof method !== 'function') { - return new Response(JSON.stringify({ '!': 'no such method' }), { - status: 404, - headers: { 'content-type': 'application/json; charset=utf-8' }, - }); - } - let args = []; - try { - const body = await request.text(); - args = body ? JSON.parse(body) : []; - if (!Array.isArray(args)) throw new Error('args must be array'); - } catch { - return new Response(JSON.stringify({ '!': 'invalid request' }), { - status: 400, - headers: { 'content-type': 'application/json; charset=utf-8' }, - }); - } - const hydrated = args.map((arg) => this.codec.build(arg)); - try { - const result = await method.apply(obj, hydrated); - const exported = this.codec.recognize(result); - let payload: unknown; - if (exported && typeof exported === 'object' && '@' in exported) { - const ref = String((exported as { '@': string })['@']); - payload = { '@': makeWebkey(url.origin, extractToken(ref)) }; - } else { - payload = { '=': exported }; - } - return new Response(JSON.stringify(payload), { - headers: { 'content-type': 'application/json; charset=utf-8' }, - }); - } catch (err) { - const message = err instanceof Error ? err.message : String(err); - console.error('rpc error', { methodName, err: message }); - return new Response(JSON.stringify({ '!': message }), { - status: 422, - headers: { 'content-type': 'application/json; charset=utf-8' }, - }); - } +export class LedgerDurableObject extends LedgerDurableObjectBase { + constructor(ctx: DurableObjectState, env: Env) { + const randomUUID = crypto.randomUUID.bind(crypto); + const makeToken = () => randomUUID().replace(/-/g, ''); + const makeGuid = () => asGuid(randomUUID().replace(/-/g, '')); + super(ctx, env, { makeToken, makeGuid, nowMs: () => Date.now() }); } } diff --git a/packages/ertp-clerk/src/webkey-client.js b/packages/ertp-clerk/src/webkey-client.js index 5bd9e87..b6afde2 100644 --- a/packages/ertp-clerk/src/webkey-client.js +++ b/packages/ertp-clerk/src/webkey-client.js @@ -1,7 +1,7 @@ import { encodeClientValue, decodeClientValue } from './webkey-codec.js'; import { extractToken } from './webkey-protocol.js'; -const makeClient = (apiUrl) => { +const makeKeyToProxy = (apiUrl, { fetch }) => { const keyToProxy = (webkey, allegedInterface = 'Remotable') => { const post = async (method, ...args) => { const url = new URL(apiUrl); @@ -34,7 +34,15 @@ const makeClient = (apiUrl) => { }, }); }; + return keyToProxy; +}; + +const makeBootstrap = (baseHref, webkey, allegedInterface, { fetch }) => + makeKeyToProxy(new URL('/api', baseHref), { fetch })(webkey, allegedInterface); + +const makeClient = (apiUrl, { fetch }) => { + const keyToProxy = makeKeyToProxy(apiUrl, { fetch }); return { keyToProxy }; }; -export { makeClient }; +export { makeClient, makeKeyToProxy, makeBootstrap }; diff --git a/packages/ertp-clerk/src/webkey-protocol.d.ts b/packages/ertp-clerk/src/webkey-protocol.d.ts index ac204b5..d7197e5 100644 --- a/packages/ertp-clerk/src/webkey-protocol.d.ts +++ b/packages/ertp-clerk/src/webkey-protocol.d.ts @@ -1,2 +1,6 @@ export function extractToken(webkey: string): string; export function makeWebkey(origin: string, token: string): string; +export function makeWebkeyPayload( + origin: string, + depiction: unknown, +): { '@': string } | { '=': unknown }; diff --git a/packages/ertp-clerk/src/webkey-protocol.js b/packages/ertp-clerk/src/webkey-protocol.js index c343ead..3dda3b2 100644 --- a/packages/ertp-clerk/src/webkey-protocol.js +++ b/packages/ertp-clerk/src/webkey-protocol.js @@ -8,4 +8,12 @@ const extractToken = (webkey) => { const makeWebkey = (origin, token) => `${origin}/ocaps/#s=${token}`; -export { extractToken, makeWebkey }; +const makeWebkeyPayload = (origin, depiction) => { + if (depiction && typeof depiction === 'object' && '@' in depiction) { + const ref = String(depiction['@']); + return { '@': makeWebkey(origin, extractToken(ref)) }; + } + return { '=': depiction }; +}; + +export { extractToken, makeWebkey, makeWebkeyPayload }; diff --git a/packages/ertp-ledgerguise/src/index.ts b/packages/ertp-ledgerguise/src/index.ts index 9789215..fa053ad 100644 --- a/packages/ertp-ledgerguise/src/index.ts +++ b/packages/ertp-ledgerguise/src/index.ts @@ -75,6 +75,20 @@ export const initGnuCashSchema = ( db.exec(sanitized); }; +export const ensureGnuCashSchema = ( + db: SqlDatabase, + options: { allowTransactionStatements?: boolean } = {}, +): void => { + const row = db + .prepare( + "SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?", + ) + .get('accounts'); + if (!row) { + initGnuCashSchema(db, options); + } +}; + const makeIssuerKitForCommodity = ({ db, commodityGuid, diff --git a/packages/ertp-ledgerguise/src/settlement.ts b/packages/ertp-ledgerguise/src/settlement.ts index 1b4625a..ec79260 100644 --- a/packages/ertp-ledgerguise/src/settlement.ts +++ b/packages/ertp-ledgerguise/src/settlement.ts @@ -97,13 +97,15 @@ export const makeSettlementFacet = ({ const currencyAmount = BigInt(currencyTotal?.total ?? '0'); // Sanity check: only consolidate cleared transactions (no live payments) + const txGuids = newTxs.map(tx => tx.guid); + const [firstTxGuid, ...restTxGuids] = txGuids; const pendingSplits = db - .prepare<[string], { count: number }>( + .prepare<[string, ...string[]], { count: number }>( `SELECT COUNT(*) as count FROM splits WHERE tx_guid IN (${newTxs.map(() => '?').join(',')}) AND reconcile_state != 'c'`, ) - .get(...newTxs.map(tx => tx.guid)); + .get(firstTxGuid, ...restTxGuids); if (pendingSplits && pendingSplits.count > 0) { throw new Error('Cannot consolidate: found pending (non-cleared) splits'); } diff --git a/packages/ertp-ledgerguise/src/sql-db.ts b/packages/ertp-ledgerguise/src/sql-db.ts index 2d1d752..f73df9d 100644 --- a/packages/ertp-ledgerguise/src/sql-db.ts +++ b/packages/ertp-ledgerguise/src/sql-db.ts @@ -1,7 +1,10 @@ -export type SqlStatement = { - run: (...params: any[]) => any; - get: (...params: any[]) => TRow | undefined; - all: (...params: any[]) => TRow[]; +export type SqlStatement< + TParams extends unknown[] = unknown[], + TRow = unknown, +> = { + run: (...params: TParams) => any; + get: (...params: TParams) => TRow | undefined; + all: (...params: TParams) => TRow[]; }; export type SqlDatabase = {