diff --git a/barretenberg/cpp/src/barretenberg/bb/main.cpp b/barretenberg/cpp/src/barretenberg/bb/main.cpp index 312d0f9cd9b..c5e8feb815f 100644 --- a/barretenberg/cpp/src/barretenberg/bb/main.cpp +++ b/barretenberg/cpp/src/barretenberg/bb/main.cpp @@ -135,7 +135,9 @@ bool proveAndVerifyHonkAcirFormat(acir_format::AcirProgram program, acir_format: Verifier verifier{ verification_key }; - return verifier.verify_proof(proof); + const bool verified = verifier.verify_proof(proof); + vinfo(verified ? "\033[32mVERIFIED\033[0m" : "\033[31mNOT VERIFIED\033[0m"); + return verified; } /** diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp index 86dc5210ce1..d03d2a34caa 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp @@ -693,9 +693,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBasepublic_inputs.size(); - info("num_filled_gates: ", num_filled_gates); return std::max(minimum_circuit_size, num_filled_gates) + NUM_RESERVED_GATES; } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp index 531009c6989..27eb56068c9 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp @@ -103,12 +103,10 @@ template HonkProof DeciderProver_::construct_proo PROFILE_THIS_NAME("Decider::construct_proof"); // Run sumcheck subprotocol. - vinfo("executing relation checking rounds..."); execute_relation_check_rounds(); // Fiat-Shamir: rho, y, x, z // Execute Shplemini PCS - vinfo("executing pcs opening rounds..."); execute_pcs_rounds(); return export_proof(); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp index 8bd0c1cc1b0..6e500bba50e 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp @@ -78,8 +78,9 @@ template class DeciderProvingKey_ { info("Finalized circuit size: ", circuit.num_gates, - "\nLog dyadic circuit size: ", - numeric::get_msb(dyadic_circuit_size)); + ". Log dyadic circuit size: ", + numeric::get_msb(dyadic_circuit_size), + "."); // Complete the public inputs execution trace block from circuit.public_inputs Trace::populate_public_inputs_block(circuit); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp index 3597b3797a7..18f21b50c60 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp @@ -64,14 +64,12 @@ template void UltraProver_::generate_gate_challen template HonkProof UltraProver_::construct_proof() { OinkProver oink_prover(proving_key, transcript); - vinfo("created oink prover"); oink_prover.prove(); vinfo("created oink proof"); generate_gate_challenges(); DeciderProver_ decider_prover(proving_key, transcript); - vinfo("created decider prover"); decider_prover.construct_proof(); return export_proof(); } diff --git a/barretenberg/favicon.ico b/barretenberg/favicon.ico new file mode 100644 index 00000000000..3138bb83dc4 Binary files /dev/null and b/barretenberg/favicon.ico differ diff --git a/barretenberg/ts/src/barretenberg/backend.ts b/barretenberg/ts/src/barretenberg/backend.ts index 546b6738f6b..c04d362d048 100644 --- a/barretenberg/ts/src/barretenberg/backend.ts +++ b/barretenberg/ts/src/barretenberg/backend.ts @@ -5,6 +5,7 @@ import { deflattenFields, flattenFieldsAsArray, ProofData, + ProofDataForRecursion, reconstructHonkProof, reconstructUltraPlonkProof, } from '../proof/index.js'; @@ -216,6 +217,7 @@ export class UltraHonkBackend { const proofStart = proofWithPublicInputs.slice(0, publicInputsOffset); const publicInputsSplitIndex = numPublicInputs * fieldByteSize; const proofEnd = proofWithPublicInputs.slice(publicInputsOffset + publicInputsSplitIndex); + // Construct the proof without the public inputs const proof = new Uint8Array([...proofStart, ...proofEnd]); @@ -229,6 +231,61 @@ export class UltraHonkBackend { return { proof, publicInputs }; } + async generateProofForRecursiveAggregation( + compressedWitness: Uint8Array, + options?: UltraHonkBackendOptions, + ): Promise { + await this.instantiate(); + + const proveUltraHonk = options?.keccak + ? this.api.acirProveUltraKeccakHonk.bind(this.api) + : this.api.acirProveUltraHonk.bind(this.api); + + const proofWithPublicInputs = await proveUltraHonk( + this.acirUncompressedBytecode, + this.circuitOptions.recursive, + gunzip(compressedWitness), + ); + + // proofWithPublicInputs starts with a four-byte size + const numSerdeHeaderBytes = 4; + // some public inputs are handled specially + const numKZGAccumulatorFieldElements = 16; + // proof begins with: size, num public inputs, public input offset + const numProofPreambleElements = 3; + const publicInputsSizeIndex = 1; + + // Slice serde header and convert to fields + const proofAsStrings = deflattenFields(proofWithPublicInputs.slice(numSerdeHeaderBytes)); + const numPublicInputs = Number(proofAsStrings[publicInputsSizeIndex]) - numKZGAccumulatorFieldElements; + + // Account for the serialized buffer size at start + const publicInputsOffset = publicInputsOffsetBytes + serializedBufferSize; + const publicInputsSplitIndex = numPublicInputs * fieldByteSize; + + // Construct the proof without the public inputs + const numPublicInputsBytes = numPublicInputs * fieldByteSize; + const numHeaderPlusPreambleBytes = numSerdeHeaderBytes + numProofPreambleElements * fieldByteSize; + const proofNoPIs = new Uint8Array(proofWithPublicInputs.length - numPublicInputsBytes); + // copy the elements before the public inputs + proofNoPIs.set(proofWithPublicInputs.subarray(0, numHeaderPlusPreambleBytes), 0); + // copy the elements after the public inputs + proofNoPIs.set( + proofWithPublicInputs.subarray(numHeaderPlusPreambleBytes + numPublicInputsBytes), + numHeaderPlusPreambleBytes, + ); + const proof: string[] = deflattenFields(proofNoPIs.slice(numSerdeHeaderBytes)); + + // Fetch the number of public inputs out of the proof string + const publicInputsConcatenated = proofWithPublicInputs.slice( + publicInputsOffset, + publicInputsOffset + publicInputsSplitIndex, + ); + const publicInputs = deflattenFields(publicInputsConcatenated); + + return { proof, publicInputs }; + } + async verifyProof(proofData: ProofData, options?: UltraHonkBackendOptions): Promise { await this.instantiate(); diff --git a/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts b/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts index 569b4b1e974..4213093fdbf 100644 --- a/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +++ b/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts @@ -63,7 +63,6 @@ export class BarretenbergWasmMain extends BarretenbergWasmBase { this.remoteWasms = await Promise.all(this.workers.map(getRemoteBarretenbergWasm)); await Promise.all(this.remoteWasms.map(w => w.initThread(module, this.memory))); } - this.logger('init complete.'); } /** diff --git a/barretenberg/ts/src/proof/index.ts b/barretenberg/ts/src/proof/index.ts index 9d099c8a932..5213aafcb2a 100644 --- a/barretenberg/ts/src/proof/index.ts +++ b/barretenberg/ts/src/proof/index.ts @@ -9,6 +9,17 @@ export type ProofData = { proof: Uint8Array; }; +/** + * @description + * The representation of a proof + * */ +export type ProofDataForRecursion = { + /** @description Public inputs of a proof */ + publicInputs: string[]; + /** @description An byte array representing the proof */ + proof: string[]; +}; + // Buffers are prepended with their size. The size takes 4 bytes. const serializedBufferSize = 4; const fieldByteSize = 32; diff --git a/yarn-project/noir-bb-bench/.eslintrc.cjs b/yarn-project/noir-bb-bench/.eslintrc.cjs new file mode 100644 index 00000000000..e659927475c --- /dev/null +++ b/yarn-project/noir-bb-bench/.eslintrc.cjs @@ -0,0 +1 @@ +module.exports = require('@aztec/foundation/eslint'); diff --git a/yarn-project/noir-bb-bench/.gitignore b/yarn-project/noir-bb-bench/.gitignore new file mode 100644 index 00000000000..e47407045af --- /dev/null +++ b/yarn-project/noir-bb-bench/.gitignore @@ -0,0 +1,3 @@ +artifacts/ +circuits/**/proofs/* +circuits/**/Prover.toml diff --git a/yarn-project/noir-bb-bench/.prettierignore b/yarn-project/noir-bb-bench/.prettierignore new file mode 100644 index 00000000000..2adf7da0bda --- /dev/null +++ b/yarn-project/noir-bb-bench/.prettierignore @@ -0,0 +1,2 @@ +crates +artifacts diff --git a/yarn-project/noir-bb-bench/README.md b/yarn-project/noir-bb-bench/README.md new file mode 100644 index 00000000000..407e3ef1a6d --- /dev/null +++ b/yarn-project/noir-bb-bench/README.md @@ -0,0 +1,19 @@ +# Noir + Bb benchmarking suite + +The goal of this module is to provide a simple place for people to construct benchmarks of witness generation and proving. At the moment it only pertains to UltraHonk recursion in the browser, but we have a similar module in ivc-integration that shows prover performance of our ClientIVC suite. + +## Building + +The package assumes that bb.js has been built, but it is easy to rebuild, as we show below. + +The full build command `yarn build` deletes all circuit artifacts and generated code, compiles the circuits, computes their verification keys, generates declarations and types for parsing circuit bytecode and verification keys in typescript, generates additional type information for noir.js and bb.js, and builds the typescript. With all of this, `yarn test` will run whatever jest tests are present, and `yarn serve:app` will serve a simple app with proving for execution in a web browser. but we can build more incrementally as well. + +Scenario: I have made changes to bb.js and now I want to rebuild and run the browser app with multithreaded proving and symbols for the meaningful WASM stack traces. Command: +``` +cd ../../barretenberg/ts && SKIP_ST_BUILD=1 NO_STRIP=1 yarn build && cd - && yarn build:app && yarn serve:app +``` + +Scenario: bb.js is unchanged, but I have changed one of my test circuits, and I want to run all tests. Command: +``` +yarn generate && yarn build:ts && yarn test +``` diff --git a/yarn-project/noir-bb-bench/circuits/circuit_1/Nargo.toml b/yarn-project/noir-bb-bench/circuits/circuit_1/Nargo.toml new file mode 100644 index 00000000000..b44d34c69fe --- /dev/null +++ b/yarn-project/noir-bb-bench/circuits/circuit_1/Nargo.toml @@ -0,0 +1,5 @@ +[package] +name = "circuit_1" +type = "bin" + +[dependencies] diff --git a/yarn-project/noir-bb-bench/circuits/circuit_1/src/main.nr b/yarn-project/noir-bb-bench/circuits/circuit_1/src/main.nr new file mode 100644 index 00000000000..4e1fd3c9035 --- /dev/null +++ b/yarn-project/noir-bb-bench/circuits/circuit_1/src/main.nr @@ -0,0 +1,3 @@ +fn main(x: Field, y: pub Field) { + assert(x != y); +} diff --git a/yarn-project/noir-bb-bench/circuits/circuit_2/Nargo.toml b/yarn-project/noir-bb-bench/circuits/circuit_2/Nargo.toml new file mode 100644 index 00000000000..50adcab9b13 --- /dev/null +++ b/yarn-project/noir-bb-bench/circuits/circuit_2/Nargo.toml @@ -0,0 +1,5 @@ +[package] +name = "circuit_2" +type = "bin" + +[dependencies] diff --git a/yarn-project/noir-bb-bench/circuits/circuit_2/src/main.nr b/yarn-project/noir-bb-bench/circuits/circuit_2/src/main.nr new file mode 100644 index 00000000000..808120506cd --- /dev/null +++ b/yarn-project/noir-bb-bench/circuits/circuit_2/src/main.nr @@ -0,0 +1,29 @@ +use std::hash::poseidon; + +// This circuit aggregates a single Honk proof from `assert_statement`. +global ULTRA_VK_SIZE: u32 = 128; +global ULTRA_PROOF_SIZE: u32 = 459; +global NUM_NON_ACCUMULATOR_PUBLIC_INPUTS: u32 = 1; +global HONK_IDENTIFIER: u32 = 1; +fn main( + verification_key: [Field; ULTRA_VK_SIZE], + proof: [Field; ULTRA_PROOF_SIZE], + public_inputs: pub [Field; NUM_NON_ACCUMULATOR_PUBLIC_INPUTS], + key_hash: Field, + mut z: Field +) { + std::verify_proof_with_type( + verification_key, + proof, + public_inputs, + key_hash, + HONK_IDENTIFIER, + ); + + for _ in 0..250 { + z += poseidon::bn254::hash_1([z]); + } + + // Make sure the hash value is used so it's not optimized away. + assert(z != 0); +} diff --git a/yarn-project/noir-bb-bench/generate_artifacts.sh b/yarn-project/noir-bb-bench/generate_artifacts.sh new file mode 100755 index 00000000000..1d32096f3b4 --- /dev/null +++ b/yarn-project/noir-bb-bench/generate_artifacts.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -eu +source $(git rev-parse --show-toplevel)/ci3/source_bootstrap + +export BB=${BB:-../../barretenberg/cpp/build/bin/bb} +export NARGO=${NARGO:-$(realpath ../../noir/noir-repo/target/release/nargo)} + +key_dir=artifacts/keys + +function compile { + set -euo pipefail + local dir=$1 + local name=${dir//-/_} + local circuit_path="./circuits/$name" + + echo_stderr "Generating bytecode for circuit: $name..." + cd $circuit_path + $NARGO compile + cd - + local filename="$name.json" + mv $circuit_path/target/$filename artifacts/ + + local json_path="./artifacts/$filename" + local write_vk_cmd="write_vk_ultra_honk -h 1" + local vk_as_fields_cmd="vk_as_fields_ultra_honk" + local key_path="$key_dir/$name.vk.data.json" + echo_stderr "Generating vk for circuit: $name..." + SECONDS=0 + local vk_cmd="jq -r '.bytecode' $json_path | base64 -d | gunzip | $BB $write_vk_cmd -b - -o - --recursive | xxd -p -c 0" + vk=$(dump_fail "$vk_cmd") + local vkf_cmd="echo '$vk' | xxd -r -p | $BB $vk_as_fields_cmd -k - -o -" + vk_fields=$(dump_fail "$vkf_cmd") + jq -n --arg vk "$vk" --argjson vkf "$vk_fields" '{keyAsBytes: $vk, keyAsFields: $vkf}' > $key_path + echo "Key output at: $key_path (${SECONDS}s)" +} + +compile $1 \ No newline at end of file diff --git a/yarn-project/noir-bb-bench/package.json b/yarn-project/noir-bb-bench/package.json new file mode 100644 index 00000000000..dd644431dc5 --- /dev/null +++ b/yarn-project/noir-bb-bench/package.json @@ -0,0 +1,96 @@ +{ + "name": "@aztec/bb-bench", + "version": "0.1.0", + "type": "module", + "exports": { + ".": "./dest/index.js", + "./types": "./dest/types/index.js" + }, + "inherits": [ + "../package.common.json", + "./package.local.json" + ], + "scripts": { + "build": "yarn clean && yarn generate && yarn build:app", + "clean": "rm -rf ./dest .tsbuildinfo src/types artifacts", + "generate": "yarn generate:artifacts && yarn generate:code", + "generate:artifacts": "mkdir -p artifacts/keys && ls circuits | xargs -n 1 ./generate_artifacts.sh", + "generate:code": "node --no-warnings --loader ts-node/esm src/scripts/generate_declaration_files.ts && node --no-warnings --loader ts-node/esm src/scripts/generate_ts_from_abi.ts && run -T prettier -w ./src/types", + "build:ts": "tsc -b", + "build:app": "tsc -b && rm -rf dest && webpack && cp ../../barretenberg/favicon.ico dest", + "build:dev": "tsc -b --watch", + "serve:app": "./serve.sh", + "formatting": "run -T prettier --check ./src && run -T eslint ./src", + "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src", + "formatting:fix:types": "NODE_OPTIONS='--max-old-space-size=8096' run -T eslint --fix ./src/types && run -T prettier -w ./src/types", + "test": "HARDWARE_CONCURRENCY=${HARDWARE_CONCURRENCY:-16} RAYON_NUM_THREADS=${RAYON_NUM_THREADS:-4} NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}" + }, + "dependencies": { + "@aztec/bb.js": "../../ts", + "@aztec/foundation": "workspace:^", + "@noir-lang/noir_codegen": "portal:../../noir/packages/noir_codegen", + "@noir-lang/noir_js": "file:../../noir/packages/noir_js" + }, + "devDependencies": { + "@aztec/bb-prover": "workspace:^", + "@jest/globals": "^29.5.0", + "@types/jest": "^29.5.0", + "@types/node": "^22.8.1", + "copy-webpack-plugin": "^12.0.2", + "debug": "^4.3.4", + "favicon-emoji": "2.3.1", + "html-webpack-plugin": "^5.6.0", + "jest": "^29.5.0", + "resolve-typescript-plugin": "^2.0.1", + "serve": "^14.2.1", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.1", + "typescript": "^5.0.4", + "webpack": "^5.90.3", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.0.3" + }, + "files": [ + "dest", + "src", + "!*.test.*", + "artifacts" + ], + "types": "./dest/index.d.ts", + "engines": { + "node": ">=18" + }, + "jest": { + "extensionsToTreatAsEsm": [ + ".ts" + ], + "transform": { + "^.+\\.tsx?$": [ + "@swc/jest", + { + "jsc": { + "parser": { + "syntax": "typescript", + "decorators": true + }, + "transform": { + "decoratorVersion": "2022-03" + } + } + } + ] + }, + "moduleNameMapper": { + "^(\\.{1,2}/.*)\\.[cm]?js$": "$1" + }, + "reporters": [ + "default" + ], + "testTimeout": 30000, + "testRegex": "./src/.*\\.test\\.(js|mjs|ts)$", + "rootDir": "./src", + "setupFiles": [ + "../../foundation/src/jest/setup.mjs" + ] + } +} diff --git a/yarn-project/noir-bb-bench/package.local.json b/yarn-project/noir-bb-bench/package.local.json new file mode 100644 index 00000000000..599c72fd4d9 --- /dev/null +++ b/yarn-project/noir-bb-bench/package.local.json @@ -0,0 +1,8 @@ +{ + "scripts": { + "build": "yarn clean && yarn generate && yarn build:app", + "clean": "rm -rf ./dest .tsbuildinfo src/types artifacts", + "build:app": "tsc -b && rm -rf dest && webpack && cp ../../barretenberg/favicon.ico dest" + }, + "files": ["dest", "src", "artifacts", "!*.test.*"] +} diff --git a/yarn-project/noir-bb-bench/serve.mt.json b/yarn-project/noir-bb-bench/serve.mt.json new file mode 100644 index 00000000000..93bc4514778 --- /dev/null +++ b/yarn-project/noir-bb-bench/serve.mt.json @@ -0,0 +1,29 @@ +{ + "headers": [ + { + "source": "**/*", + "headers": [ + { + "key": "Cross-Origin-Embedder-Policy", + "value": "require-corp" + }, + { + "key": "Cross-Origin-Opener-Policy", + "value": "same-origin" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "Access-Control-Allow-Methods", + "value": "GET, POST, PUT, DELETE, OPTIONS" + }, + { + "key": "Access-Control-Allow-Headers", + "value": "Content-Type, Authorization" + } + ] + } + ] +} diff --git a/yarn-project/noir-bb-bench/serve.sh b/yarn-project/noir-bb-bench/serve.sh new file mode 100755 index 00000000000..26f3caaeb0a --- /dev/null +++ b/yarn-project/noir-bb-bench/serve.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# Function to handle cleanup when the script is terminated +cleanup() { + echo "Initiating cleanup..." + # Terminate the first yarn serve process (port 8080) + if kill "$PID1" 2>/dev/null; then + echo "Killed yarn serve on port 8080 (PID $PID1)." + else + echo "No active yarn serve process found on port 8080." + fi + echo "Cleanup completed." + exit 0 +} + +# Trap common termination signals and invoke the cleanup function +trap cleanup SIGINT SIGTERM EXIT + +# Start the second yarn serve process on port 8080 in the background +yarn serve -n -L -p 8080 --cors -c ../serve.mt.json dest & +PID1=$! +echo "Started yarn serve on port 8080 with PID $PID1." + + +# Function to monitor background processes +monitor_processes() { + while true; do + # Check if either process has exited + if ! kill -0 "$PID1" 2>/dev/null; then + echo "yarn serve on port 8080 (PID $PID1) has exited." + cleanup + fi + sleep 1 + done +} + +# Start monitoring in the background +monitor_processes & + +# Wait indefinitely until a termination signal is received +wait diff --git a/yarn-project/noir-bb-bench/src/index.html b/yarn-project/noir-bb-bench/src/index.html new file mode 100644 index 00000000000..6c1cc8af4a5 --- /dev/null +++ b/yarn-project/noir-bb-bench/src/index.html @@ -0,0 +1,9 @@ + + + + My Test bb.js App + + + + + diff --git a/yarn-project/noir-bb-bench/src/index.ts b/yarn-project/noir-bb-bench/src/index.ts new file mode 100644 index 00000000000..0930819589e --- /dev/null +++ b/yarn-project/noir-bb-bench/src/index.ts @@ -0,0 +1,124 @@ +/* eslint-disable camelcase */ +import { type ForeignCallOutput, Noir } from '@noir-lang/noir_js'; +import { type InputValue } from '@noir-lang/noirc_abi'; +import createDebug from 'debug'; + +import Circuit1 from '../artifacts/circuit_1.json' assert { type: 'json' }; +import Circuit2 from '../artifacts/circuit_2.json' assert { type: 'json' }; +import Vk1 from '../artifacts/keys/circuit_1.vk.data.json' assert { type: 'json' }; +import Vk2 from '../artifacts/keys/circuit_2.vk.data.json' assert { type: 'json' }; +import type { FixedLengthArray } from './types/index.js'; + +export const logger = createDebug('aztec:bb-bench'); + +export const MOCK_MAX_COMMITMENTS_PER_TX = 4; + +function foreignCallHandler(): Promise { + throw new Error('Unexpected foreign call'); +} + +export type u8 = string; + +export async function generateCircuit1(): Promise<[string, Uint8Array, InputValue]> { + const program = new Noir(Circuit1); + const { witness, returnValue } = await program.execute( + { + x: '0x1', + y: '0x10', + }, + foreignCallHandler, + ); + logger('generated circuit 1'); + return [Circuit1.bytecode, witness, returnValue]; +} + +export async function generateCircuit2( + proverOutput: ProverOutputForRecursion, + previousVk: string[], +): Promise<[string, Uint8Array, InputValue]> { + const program = new Noir(Circuit2); + const { witness, returnValue } = await program.execute( + { + public_inputs: proverOutput.public_inputs, + key_hash: '0x0', + proof: proverOutput.proof, + verification_key: previousVk as FixedLengthArray, + z: '0xd00d', + }, + foreignCallHandler, + ); + logger('generated circuit 2'); + return [Circuit2.bytecode, witness, returnValue]; +} + +export type ProverOutputForRecursion = { + proof: FixedLengthArray; + public_inputs: FixedLengthArray; +}; + +export async function proveCircuit1( + bytecode: string, + witness: Uint8Array, + threads?: number, +): Promise { + const { UltraHonkBackend } = await import('@aztec/bb.js'); + const backend = new UltraHonkBackend(bytecode, { threads: threads }, { recursive: true }); + try { + logger(`proving...`); + const proverOutput = await backend.generateProofForRecursiveAggregation(witness); + logger(`done generating recursive proof artifacts.`); + return { + proof: proverOutput.proof as FixedLengthArray, + public_inputs: proverOutput.publicInputs as FixedLengthArray, + }; + } finally { + await backend.destroy(); + } +} + +export async function proveThenVerifyCircuit2( + bytecode: string, + witness: Uint8Array, + vk: Uint8Array, + threads?: number, +): Promise { + const { UltraHonkBackend, BarretenbergVerifier } = await import('@aztec/bb.js'); + const backend = new UltraHonkBackend(bytecode, { threads: threads }); + try { + logger(`proving...`); + const proof = await backend.generateProof(witness); + logger(`done proving. verifying...`); + const verifier = new BarretenbergVerifier({ threads }); + const verified = await verifier.verifyUltraHonkProof(proof, vk); + logger(`done verifying.`); + await verifier.destroy(); + return verified; + } finally { + await backend.destroy(); + } +} + +function hexStringToUint8Array(hex: string): Uint8Array { + const length = hex.length / 2; + const uint8Array = new Uint8Array(length); + + for (let i = 0; i < length; i++) { + const byte = hex.substr(i * 2, 2); + uint8Array[i] = parseInt(byte, 16); + } + + return uint8Array; +} + +export async function proveThenVerifyStack(): Promise { + logger(`generating circuit and witness...`); + const [bytecode1, witness1] = await generateCircuit1(); + logger(`done generating circuit and witness. proving...`); + const proverOutput = await proveCircuit1(bytecode1, witness1); + logger(`done proving. generating circuit 2 and witness...`); + const [bytecode2, witness2] = await generateCircuit2(proverOutput, Vk1.keyAsFields); + logger(`done. generating circuit and witness. proving then verifying...`); + const verified = await proveThenVerifyCircuit2(bytecode2, witness2, hexStringToUint8Array(Vk2.keyAsBytes)); + logger(`verified? ${verified}`); + return verified; +} diff --git a/yarn-project/noir-bb-bench/src/scripts/generate_declaration_files.ts b/yarn-project/noir-bb-bench/src/scripts/generate_declaration_files.ts new file mode 100644 index 00000000000..5a3cd7557fd --- /dev/null +++ b/yarn-project/noir-bb-bench/src/scripts/generate_declaration_files.ts @@ -0,0 +1,33 @@ +import { fileURLToPath } from '@aztec/foundation/url'; + +import { readdir, writeFile } from 'fs/promises'; +import { join } from 'path'; + +const contract = `\ +import { type NoirCompiledCircuit } from '@aztec/types/noir'; +const circuit: NoirCompiledCircuit; +export = circuit; +`; + +const vk = `\ +const vk: { keyAsBytes: string; keyAsFields: string[] }; +export = vk; +`; + +async function generateDeclarationFor(target: string, content: string) { + const files = await readdir(target); + for (const file of files) { + // guard against running this script twice without cleaning the artifacts/ dir first + if (!file.endsWith('.json')) { + continue; + } + const name = file.replace('.json', ''); + await writeFile(join(target, `${name}.d.json.ts`), content); + } +} + +// Generate declaration files for contracts +await generateDeclarationFor(fileURLToPath(new URL('../../artifacts', import.meta.url).href), contract); + +// Generate declaration files for vks +await generateDeclarationFor(fileURLToPath(new URL('../../artifacts/keys', import.meta.url).href), vk); diff --git a/yarn-project/noir-bb-bench/src/scripts/generate_ts_from_abi.ts b/yarn-project/noir-bb-bench/src/scripts/generate_ts_from_abi.ts new file mode 100644 index 00000000000..bdfa95fa02d --- /dev/null +++ b/yarn-project/noir-bb-bench/src/scripts/generate_ts_from_abi.ts @@ -0,0 +1,38 @@ +import { createConsoleLogger } from '@aztec/foundation/log'; + +import { codegen } from '@noir-lang/noir_codegen'; +import { type CompiledCircuit } from '@noir-lang/types'; +import { pascalCase } from 'change-case'; +import { promises as fs } from 'fs'; + +const log = createConsoleLogger('mock-circuits'); + +const circuits = ['circuit_1', 'circuit_2']; + +const main = async () => { + try { + await fs.access('./src/types/'); + } catch (error) { + await fs.mkdir('./src/types', { recursive: true }); + } + const programs: [string, CompiledCircuit][] = []; + // Collect all circuits + for (const circuit of circuits) { + const rawData = await fs.readFile(`./artifacts/${circuit}.json`, 'utf-8'); + const abiObj: CompiledCircuit = JSON.parse(rawData); + programs.push([pascalCase(circuit), abiObj]); + } + const code = codegen( + programs, + false, // Don't embed artifacts + true, // Use fixed length arrays + ); + await fs.writeFile('./src/types/index.ts', code); +}; + +try { + await main(); +} catch (err: unknown) { + log(`Error generating types ${err}`); + process.exit(1); +} diff --git a/yarn-project/noir-bb-bench/src/serve.ts b/yarn-project/noir-bb-bench/src/serve.ts new file mode 100644 index 00000000000..754be460f6d --- /dev/null +++ b/yarn-project/noir-bb-bench/src/serve.ts @@ -0,0 +1,124 @@ +import createDebug from 'debug'; + +import { proveThenVerifyStack } from './index.js'; + +createDebug.enable('*'); // needed for logging in Firefox but not Chrome + +/* eslint-disable no-console */ + +// Function to set up the output element and redirect all console output +function setupConsoleOutput() { + const container = document.createElement('div'); + container.style.marginBottom = '10px'; + document.body.appendChild(container); + + const copyButton = document.createElement('button'); + copyButton.innerText = 'Copy Logs to Clipboard'; + copyButton.style.marginBottom = '10px'; + copyButton.style.padding = '5px 10px'; + copyButton.style.cursor = 'pointer'; + container.appendChild(copyButton); + + const logContainer = document.createElement('pre'); + logContainer.id = 'logOutput'; + logContainer.style.border = '1px solid #ccc'; + logContainer.style.padding = '10px'; + logContainer.style.maxHeight = '400px'; + logContainer.style.overflowY = 'auto'; + container.appendChild(logContainer); + + /** + * Appends a message to the log container and auto-scrolls to the bottom. + * @param message - The log message to append. + */ + function addLogMessage(message: string): void { + logContainer.textContent += `${message}\n`; + logContainer.scrollTop = logContainer.scrollHeight; // Auto-scroll to the bottom + } + + // Add event listener to the copy button + copyButton.addEventListener('click', () => { + const logContent: string = logContainer.textContent || ''; // Get text content of log container + navigator.clipboard + .writeText(logContent) + .then(() => { + alert('Logs copied to clipboard!'); + }) + .catch((err: unknown) => { + console.error('Failed to copy logs:', err); + }); + }); + + // List of console methods to override + const methodsToOverride = ['log', 'debug', 'info', 'warn', 'error'] as const; + type ConsoleMethod = (typeof methodsToOverride)[number]; + + // Override each console method + methodsToOverride.forEach((method: ConsoleMethod) => { + // Preserve the original console method + const originalMethod = console[method].bind(console); + + // Override the console method with type assertions + console[method] = ((...args: any[]) => { + // Process each argument to create a clean message + const message: string = args + .map(arg => + typeof arg === 'string' + ? arg + .replace(/%c/g, '') + .replace(/color:.*?(;|$)/g, '') + .trim() + : JSON.stringify(arg), + ) + .join(' '); + + // Call the original console method with the original arguments + originalMethod(...args); + + // Append the formatted message to the log container with a prefix indicating the method + addLogMessage(message); + }) as Console[ConsoleMethod]; + }); + + // Override the createDebug log function to capture its logs + overrideCreateDebugLog(addLogMessage); +} + +/** + * Overrides the createDebug library's log function to capture debug logs. + * @param addLogMessage - Function to append messages to the log container. + */ +function overrideCreateDebugLog(addLogMessage: (message: string) => void): void { + // Preserve the original createDebug log function + const originalDebugLog = createDebug.log.bind(createDebug); + + // Override the createDebug log function + createDebug.log = (...args: any[]) => { + // Call the original createDebug log function + originalDebugLog(...args); + + // Process the arguments to form a message + const message: string = args + .map(arg => + typeof arg === 'string' + ? arg + .replace(/%c/g, '') + .replace(/color:.*?(;|$)/g, '') + .trim() + : JSON.stringify(arg), + ) + .join(' '); + addLogMessage(message); + }; +} + +document.addEventListener('DOMContentLoaded', function () { + setupConsoleOutput(); + + const button = document.createElement('button'); + button.innerText = 'Run Test'; + button.addEventListener('click', async () => { + const _ = await proveThenVerifyStack(); + }); + document.body.appendChild(button); +}); diff --git a/yarn-project/noir-bb-bench/src/types/index.ts b/yarn-project/noir-bb-bench/src/types/index.ts new file mode 100644 index 00000000000..eaeae0b101e --- /dev/null +++ b/yarn-project/noir-bb-bench/src/types/index.ts @@ -0,0 +1,48 @@ +/* Autogenerated file, do not edit! */ + +/* eslint-disable */ +import { CompiledCircuit, ForeignCallHandler, InputMap, Noir } from '@noir-lang/noir_js'; + +export { ForeignCallHandler } from '@noir-lang/noir_js'; + +export type FixedLengthArray = L extends 0 ? never[] : T[] & { length: L }; +export type Field = string; + +export type Circuit_1InputType = { + x: Field; + y: Field; +}; + +export async function Circuit_1( + x: Field, + y: Field, + Circuit_1_circuit: CompiledCircuit, + foreignCallHandler?: ForeignCallHandler, +): Promise { + const program = new Noir(Circuit_1_circuit); + const args: InputMap = { x, y }; + const { returnValue } = await program.execute(args, foreignCallHandler); + return returnValue as null; +} +export type Circuit_2InputType = { + verification_key: FixedLengthArray; + proof: FixedLengthArray; + public_inputs: FixedLengthArray; + key_hash: Field; + z: Field; +}; + +export async function Circuit_2( + verification_key: FixedLengthArray, + proof: FixedLengthArray, + public_inputs: FixedLengthArray, + key_hash: Field, + z: Field, + Circuit_2_circuit: CompiledCircuit, + foreignCallHandler?: ForeignCallHandler, +): Promise { + const program = new Noir(Circuit_2_circuit); + const args: InputMap = { verification_key, proof, public_inputs, key_hash, z }; + const { returnValue } = await program.execute(args, foreignCallHandler); + return returnValue as null; +} diff --git a/yarn-project/noir-bb-bench/src/wasm.test.ts b/yarn-project/noir-bb-bench/src/wasm.test.ts new file mode 100644 index 00000000000..f0308024624 --- /dev/null +++ b/yarn-project/noir-bb-bench/src/wasm.test.ts @@ -0,0 +1,20 @@ +import { jest } from '@jest/globals'; +import createDebug from 'debug'; + +import { proveThenVerifyStack } from './index.js'; + +createDebug.enable('*'); + +/* eslint-disable camelcase */ + +jest.setTimeout(120_000); + +// Reinforce that the functions used in the benchmarking app produce a valid proof. +describe('Prover Bench', () => { + beforeEach(async () => {}); + + it('Should generate a verifiable UltraHonk proof', async () => { + const verifyResult = await proveThenVerifyStack(); + expect(verifyResult).toEqual(true); + }); +}); diff --git a/yarn-project/noir-bb-bench/tsconfig.json b/yarn-project/noir-bb-bench/tsconfig.json new file mode 100644 index 00000000000..1b54a1a43e1 --- /dev/null +++ b/yarn-project/noir-bb-bench/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "..", + "compilerOptions": { + "outDir": "dest", + "rootDir": "src", + "tsBuildInfoFile": ".tsbuildinfo", + "resolveJsonModule": true + }, + "references": [ + { + "path": "../foundation" + }, + { + "path": "../bb-prover" + } + ], + "include": ["src", "artifacts/*.d.json.ts", "artifacts/**/*.d.json.ts", "circuits/**/*.d.json.ts"] +} diff --git a/yarn-project/noir-bb-bench/webpack.config.js b/yarn-project/noir-bb-bench/webpack.config.js new file mode 100644 index 00000000000..09dafd51eff --- /dev/null +++ b/yarn-project/noir-bb-bench/webpack.config.js @@ -0,0 +1,48 @@ +import CopyWebpackPlugin from 'copy-webpack-plugin'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import { dirname, resolve } from 'path'; +import ResolveTypeScriptPlugin from 'resolve-typescript-plugin'; +import { fileURLToPath } from 'url'; +import webpack from 'webpack'; + +export default { + target: 'web', + mode: 'production', + entry: { + index: './src/serve.ts', + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: [{ loader: 'ts-loader' }], + }, + ], + }, + output: { + path: resolve(dirname(fileURLToPath(import.meta.url)), './dest'), + filename: '[name].js', + chunkFilename: '[name].chunk.js', // This naming pattern is used for chunks produced from code-splitting. + }, + plugins: [ + new HtmlWebpackPlugin({ inject: false, template: './src/index.html' }), + new webpack.DefinePlugin({ 'process.env.NODE_DEBUG': false }), + ], + resolve: { + plugins: [new ResolveTypeScriptPlugin()], + fallback: { + tty: false, + }, + }, + devServer: { + hot: false, + client: { + logging: 'none', + overlay: false, + }, + headers: { + 'Cross-Origin-Opener-Policy': 'same-origin', + 'Cross-Origin-Embedder-Policy': 'require-corp', + }, + }, +}; diff --git a/yarn-project/package.json b/yarn-project/package.json index b2678f6457a..a9ce40ca702 100644 --- a/yarn-project/package.json +++ b/yarn-project/package.json @@ -47,6 +47,7 @@ "l1-artifacts", "merkle-tree", "ivc-integration", + "noir-bb-bench", "noir-contracts.js", "noir-protocol-circuits-types", "p2p", diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 96530873d7b..1bcb94072b7 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -285,6 +285,34 @@ __metadata: languageName: unknown linkType: soft +"@aztec/bb-bench@workspace:noir-bb-bench": + version: 0.0.0-use.local + resolution: "@aztec/bb-bench@workspace:noir-bb-bench" + dependencies: + "@aztec/bb-prover": "workspace:^" + "@aztec/bb.js": ../../ts + "@aztec/foundation": "workspace:^" + "@jest/globals": "npm:^29.5.0" + "@noir-lang/noir_codegen": "portal:../../noir/packages/noir_codegen" + "@noir-lang/noir_js": "file:../../noir/packages/noir_js" + "@types/jest": "npm:^29.5.0" + "@types/node": "npm:^22.8.1" + copy-webpack-plugin: "npm:^12.0.2" + debug: "npm:^4.3.4" + favicon-emoji: "npm:2.3.1" + html-webpack-plugin: "npm:^5.6.0" + jest: "npm:^29.5.0" + resolve-typescript-plugin: "npm:^2.0.1" + serve: "npm:^14.2.1" + ts-loader: "npm:^9.5.1" + ts-node: "npm:^10.9.1" + typescript: "npm:^5.0.4" + webpack: "npm:^5.90.3" + webpack-cli: "npm:^5.1.4" + webpack-dev-server: "npm:^5.0.3" + languageName: unknown + linkType: soft + "@aztec/bb-prover@workspace:^, @aztec/bb-prover@workspace:bb-prover": version: 0.0.0-use.local resolution: "@aztec/bb-prover@workspace:bb-prover" @@ -6822,6 +6850,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^4.3.0": + version: 4.3.0 + resolution: "agent-base@npm:4.3.0" + dependencies: + es6-promisify: "npm:^5.0.0" + checksum: 10/aad37210aa2b6581538675a5e2bcde10f6372547e8994390fa3dcfa8a1577712bd002df631e13870cb3e1d7889c7f0744b43f941d45bf074139ce39559d9217b + languageName: node + linkType: hard + "agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": version: 7.1.1 resolution: "agent-base@npm:7.1.1" @@ -6887,7 +6924,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:~6.12.6": +"ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:~6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -7225,6 +7262,15 @@ __metadata: 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: 10/cf629291fee6c1a6f530549939433ebf32200d7849f38b810ff26ee74235e845c0c12b2ed0f1607ac17383d19b219b69cefa009b920dab57924c5c544e495078 + languageName: node + linkType: hard + "asn1js@npm:^3.0.5": version: 3.0.5 resolution: "asn1js@npm:3.0.5" @@ -7236,6 +7282,13 @@ __metadata: 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: 10/f4f991ae2df849cc678b1afba52d512a7cbf0d09613ba111e72255409ff9158550c775162a47b12d015d1b82b3c273e8e25df0e4783d3ddb008a293486d00a07 + languageName: node + linkType: hard + "assert@npm:^1.4.0": version: 1.5.1 resolution: "assert@npm:1.5.1" @@ -7290,6 +7343,13 @@ __metadata: languageName: node linkType: hard +"async-limiter@npm:~1.0.0": + version: 1.0.1 + resolution: "async-limiter@npm:1.0.1" + checksum: 10/2b849695b465d93ad44c116220dee29a5aeb63adac16c1088983c339b0de57d76e82533e8e364a93a9f997f28bbfc6a92948cefc120652bd07f3b59f8d75cf2b + languageName: node + linkType: hard + "async-mutex@npm:0.4.0": version: 0.4.0 resolution: "async-mutex@npm:0.4.0" @@ -7340,6 +7400,20 @@ __metadata: languageName: node linkType: hard +"aws-sign2@npm:~0.7.0": + version: 0.7.0 + resolution: "aws-sign2@npm:0.7.0" + checksum: 10/2ac497d739f71be3264cf096a33ab256a1fea7fe80b87dc51ec29374505bd5a661279ef1c22989d68528ea61ed634021ca63b31cf1d3c2a3682ffc106f7d0e96 + languageName: node + linkType: hard + +"aws4@npm:^1.8.0": + version: 1.13.2 + resolution: "aws4@npm:1.13.2" + checksum: 10/290b9f84facbad013747725bfd8b4c42d0b3b04b5620d8418f0219832ef95a7dc597a4af7b1589ae7fce18bacde96f40911c3cda36199dd04d9f8e01f72fa50a + languageName: node + linkType: hard + "axios@npm:^1.7.2": version: 1.7.2 resolution: "axios@npm:1.7.2" @@ -7505,6 +7579,15 @@ __metadata: 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: 10/13a4cde058250dbf1fa77a4f1b9a07d32ae2e3b9e28e88a0c7a1827835bc3482f3e478c4a0cfd4da6ff0c46dae07da1061123a995372b32cc563d9975f975404 + languageName: node + linkType: hard + "bcrypto@npm:^5.4.0": version: 5.5.2 resolution: "bcrypto@npm:5.5.2" @@ -7526,6 +7609,13 @@ __metadata: languageName: node linkType: hard +"bignumber.js@npm:^2.1.0": + version: 2.4.0 + resolution: "bignumber.js@npm:2.4.0" + checksum: 10/c43dd8f0ace26d6a07ab3c2a127e9b0c8428592e7ea79d2569ffc3e73d274e52c213b19e1759d74a27384b4ace34ffb3c440e396fbf68a2917b58a8376eeeb99 + languageName: node + linkType: hard + "bignumber.js@npm:^9.0.0": version: 9.1.2 resolution: "bignumber.js@npm:9.1.2" @@ -7567,6 +7657,20 @@ __metadata: languageName: node linkType: hard +"bmp-js@npm:0.0.1": + version: 0.0.1 + resolution: "bmp-js@npm:0.0.1" + checksum: 10/285c610738d616f6afbc42edac0d7da124ed4c0305f7075ee2bafb7d86aaa3e264030cbafd06c69f53d78700c881badfb4634a24804629e0de1b8f30fc0f321f + languageName: node + linkType: hard + +"bmp-js@npm:0.0.3": + version: 0.0.3 + resolution: "bmp-js@npm:0.0.3" + checksum: 10/df3e9ba1f410ff1232dc3e28bafe56da03bb2646d90ff08fb9583f6172ce170997896f77ba3f385f4a2ac70b9c86b1cd7d2e63ba64d7738cba7bfa608888d1b1 + languageName: node + linkType: hard + "bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" @@ -7895,6 +7999,23 @@ __metadata: languageName: node linkType: hard +"buffer-alloc-unsafe@npm:^1.1.0": + version: 1.1.0 + resolution: "buffer-alloc-unsafe@npm:1.1.0" + checksum: 10/c5e18bf51f67754ec843c9af3d4c005051aac5008a3992938dda1344e5cfec77c4b02b4ca303644d1e9a6e281765155ce6356d85c6f5ccc5cd21afc868def396 + languageName: node + linkType: hard + +"buffer-alloc@npm:^1.1.0": + version: 1.2.0 + resolution: "buffer-alloc@npm:1.2.0" + dependencies: + buffer-alloc-unsafe: "npm:^1.1.0" + buffer-fill: "npm:^1.0.0" + checksum: 10/560cd27f3cbe73c614867da373407d4506309c62fe18de45a1ce191f3785ec6ca2488d802ff82065798542422980ca25f903db078c57822218182c37c3576df5 + languageName: node + linkType: hard + "buffer-crc32@npm:~0.2.3": version: 0.2.13 resolution: "buffer-crc32@npm:0.2.13" @@ -7909,6 +8030,20 @@ __metadata: languageName: node linkType: hard +"buffer-equal@npm:0.0.1": + version: 0.0.1 + resolution: "buffer-equal@npm:0.0.1" + checksum: 10/ca4b52e6c01143529d957a78cb9a93e4257f172bbab30d9eb87c20ae085ed23c5e07f236ac051202dacbf3d17aba42e1455f84cba21ea79b67d57f2b05e9a613 + languageName: node + linkType: hard + +"buffer-fill@npm:^1.0.0": + version: 1.0.0 + resolution: "buffer-fill@npm:1.0.0" + checksum: 10/c29b4723ddeab01e74b5d3b982a0c6828f2ded49cef049ddca3dac661c874ecdbcecb5dd8380cf0f4adbeb8cff90a7de724126750a1f1e5ebd4eb6c59a1315b1 + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -8124,6 +8259,13 @@ __metadata: languageName: node linkType: hard +"caseless@npm:~0.12.0": + version: 0.12.0 + resolution: "caseless@npm:0.12.0" + checksum: 10/ea1efdf430975fdbac3505cdd21007f7ac5aa29b6d4d1c091f965853cd1bf87e4b08ea07b31a6d688b038872b7cdf0589d9262d59c699d199585daad052aeb20 + languageName: node + linkType: hard + "catering@npm:^2.0.0, catering@npm:^2.1.0": version: 2.1.1 resolution: "catering@npm:2.1.1" @@ -8131,6 +8273,15 @@ __metadata: languageName: node linkType: hard +"centra@npm:^2.7.0": + version: 2.7.0 + resolution: "centra@npm:2.7.0" + dependencies: + follow-redirects: "npm:^1.15.6" + checksum: 10/59ec76d9ba7086b76e9594129b9843856fe7293400b89cb8b133f444a62ca5d4c536df0d4722374b0c16d86dd4e0baba1fc9722640b7d3b532865bebdec2b1a2 + languageName: node + linkType: hard + "chai-as-promised@npm:^8.0.1": version: 8.0.1 resolution: "chai-as-promised@npm:8.0.1" @@ -8547,7 +8698,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8": +"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: @@ -8727,7 +8878,7 @@ __metadata: languageName: node linkType: hard -"concat-stream@npm:^1.6.0, concat-stream@npm:^1.6.1, concat-stream@npm:~1.6.0": +"concat-stream@npm:^1.6.0, concat-stream@npm:^1.6.1, concat-stream@npm:^1.6.2, concat-stream@npm:~1.6.0": version: 1.6.2 resolution: "concat-stream@npm:1.6.2" dependencies: @@ -8924,6 +9075,13 @@ __metadata: languageName: node linkType: hard +"core-util-is@npm:1.0.2": + version: 1.0.2 + resolution: "core-util-is@npm:1.0.2" + checksum: 10/d0f7587346b44a1fe6c269267e037dd34b4787191e473c3e685f507229d88561c40eb18872fabfff02977301815d474300b7bfbd15396c13c5377393f7e87ec3 + languageName: node + linkType: hard + "core-util-is@npm:^1.0.2, core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -9234,6 +9392,22 @@ __metadata: 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: 10/137b287fa021201ce100cef772c8eeeaaafdd2aa7282864022acf3b873021e54cb809e9c060fa164840bf54ff72d00d6e2d8da1ee5a86d7200eeefa1123a8f7f + languageName: node + linkType: hard + +"data-uri-to-buffer@npm:^2.0.0": + version: 2.0.2 + resolution: "data-uri-to-buffer@npm:2.0.2" + checksum: 10/152bec5e77513ee253a7c686700a1723246f582dad8b614e8eaaaba7fa45a15c8671ae4b8f4843f4f3a002dae1d3e7a20f852f7d7bdc8b4c15cfe7adfdfb07f8 + languageName: node + linkType: hard + "data-uri-to-buffer@npm:^6.0.2": version: 6.0.2 resolution: "data-uri-to-buffer@npm:6.0.2" @@ -9965,6 +10139,13 @@ __metadata: languageName: node linkType: hard +"dom-walk@npm:^0.1.0": + version: 0.1.2 + resolution: "dom-walk@npm:0.1.2" + checksum: 10/19eb0ce9c6de39d5e231530685248545d9cd2bd97b2cb3486e0bfc0f2a393a9addddfd5557463a932b52fdfcf68ad2a619020cd2c74a5fe46fbecaa8e80872f3 + languageName: node + linkType: hard + "domain-browser@npm:^1.2.0": version: 1.2.0 resolution: "domain-browser@npm:1.2.0" @@ -10051,6 +10232,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: 10/d43591f2396196266e186e6d6928038cc11c76c3699a912cb9c13757060f7bbc7f17f47c4cb16168cdeacffc7965aef021142577e646fb3cb88810c15173eb57 + 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" @@ -10117,6 +10308,13 @@ __metadata: languageName: node linkType: hard +"emojilib@npm:^2.2.9": + version: 2.4.0 + resolution: "emojilib@npm:2.4.0" + checksum: 10/bef767eca49acaa881388d91bee6936ea57ae367d603d5227ff0a9da3e2d1e774a61c447e5f2f4901797d023c4b5239bc208285b6172a880d3655024a0f44980 + languageName: node + linkType: hard + "encodeurl@npm:^1.0.2, encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -10353,6 +10551,29 @@ __metadata: languageName: node linkType: hard +"es6-promise@npm:^3.0.2": + version: 3.3.1 + resolution: "es6-promise@npm:3.3.1" + checksum: 10/14f46a0a20164d4d6f8a39133c7220688bb9ee2d89a78f2345694b8ac9b6ea7b94f73488e289a083dce732831f4040013b25222d1820580c7b10b698c50c8267 + languageName: node + linkType: hard + +"es6-promise@npm:^4.0.3": + version: 4.2.8 + resolution: "es6-promise@npm:4.2.8" + checksum: 10/b250c55523c496c43c9216c2646e58ec182b819e036fe5eb8d83fa16f044ecc6b8dcefc88ace2097be3d3c4d02b6aa8eeae1a66deeaf13e7bee905ebabb350a3 + languageName: node + linkType: hard + +"es6-promisify@npm:^5.0.0": + version: 5.0.0 + resolution: "es6-promisify@npm:5.0.0" + dependencies: + es6-promise: "npm:^4.0.3" + checksum: 10/fbed9d791598831413be84a5374eca8c24800ec71a16c1c528c43a98e2dadfb99331483d83ae6094ddb9b87e6f799a15d1553cebf756047e0865c753bc346b92 + languageName: node + linkType: hard + "esbuild@npm:^0.18.10": version: 0.18.20 resolution: "esbuild@npm:0.18.20" @@ -10958,6 +11179,13 @@ __metadata: languageName: node linkType: hard +"exif-parser@npm:^0.1.9": + version: 0.1.12 + resolution: "exif-parser@npm:0.1.12" + checksum: 10/72bffba154fd33b270908ea1f9f63a6c5dffadf4eb427c85ab82d6006204ed762dfeb76969e1577614b8d18dadd411b11583569e54ed2beea0af8b61c8f4de29 + languageName: node + linkType: hard + "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -11024,7 +11252,7 @@ __metadata: languageName: node linkType: hard -"extend@npm:^3.0.2": +"extend@npm:^3.0.2, extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: 10/59e89e2dc798ec0f54b36d82f32a27d5f6472c53974f61ca098db5d4648430b725387b53449a34df38fd0392045434426b012f302b3cc049a6500ccf82877e4e @@ -11042,6 +11270,20 @@ __metadata: languageName: node linkType: hard +"extract-zip@npm:^1.6.6": + 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: 10/a9a5e2b118cc1d3b780d296f056308a8fda580bb18a26e12d6137321e5d3ef1d09355195ff187e9c7039aab42a253ac1e3996c66d031c44abca5abde6fd51393 + languageName: node + linkType: hard + "extract-zip@npm:^2.0.1": version: 2.0.1 resolution: "extract-zip@npm:2.0.1" @@ -11059,6 +11301,20 @@ __metadata: languageName: node linkType: hard +"extsprintf@npm:1.3.0": + version: 1.3.0 + resolution: "extsprintf@npm:1.3.0" + checksum: 10/26967d6c7ecbfb5bc5b7a6c43503dc5fafd9454802037e9fa1665e41f615da4ff5918bd6cb871a3beabed01a31eca1ccd0bdfb41231f50ad50d405a430f78377 + languageName: node + linkType: hard + +"extsprintf@npm:^1.2.0": + version: 1.4.1 + resolution: "extsprintf@npm:1.4.1" + checksum: 10/bfd6d55f3c0c04d826fe0213264b383c03f32825af6b1ff777f3f2dc49467e599361993568d75b7b19a8ea1bb08c8e7cd8c3d87d179ced91bb0dcf81ca6938e0 + languageName: node + linkType: hard + "fast-copy@npm:^3.0.2": version: 3.0.2 resolution: "fast-copy@npm:3.0.2" @@ -11155,6 +11411,22 @@ __metadata: languageName: node linkType: hard +"favicon-emoji@npm:2.3.1": + version: 2.3.1 + resolution: "favicon-emoji@npm:2.3.1" + dependencies: + data-uri-to-buffer: "npm:^2.0.0" + emojilib: "npm:^2.2.9" + neodoc: "npm:^1.4.0" + open: "npm:^7.3.0" + puppeteer: "npm:^1.3.0" + to-ico: "npm:^1.1.5" + bin: + favicon-emoji: cli.js + checksum: 10/6edaed53b87ecb17de6b30365e136a606a754d7952ec145c7b4957a9bbc07cc05171a8d1ebac0c90e6c9ce487f061df83fbf38638670400db5859bd60d202c62 + languageName: node + linkType: hard + "faye-websocket@npm:^0.11.3": version: 0.11.4 resolution: "faye-websocket@npm:0.11.4" @@ -11198,6 +11470,13 @@ __metadata: languageName: node linkType: hard +"file-type@npm:^3.1.0, file-type@npm:^3.8.0": + version: 3.9.0 + resolution: "file-type@npm:3.9.0" + checksum: 10/1c8bc99bbb9cfcf13d3489e0c0250188dde622658b5a990f2ba09e6c784f183556b37b7de22104b4b0fd87f478ce12f8dc199b988616ce7cdcb41248dc0a79f9 + languageName: node + linkType: hard + "file-uri-to-path@npm:1.0.0": version: 1.0.0 resolution: "file-uri-to-path@npm:1.0.0" @@ -11353,6 +11632,13 @@ __metadata: languageName: node linkType: hard +"forever-agent@npm:~0.6.1": + version: 0.6.1 + resolution: "forever-agent@npm:0.6.1" + checksum: 10/c1e1644d5e074ac063ecbc3fb8582013ef91fff0e3fa41e76db23d2f62bc6d9677aac86db950917deed4fe1fdd772df780cfaa352075f23deec9c015313afb97 + languageName: node + linkType: hard + "form-data@npm:^2.5.0": version: 2.5.2 resolution: "form-data@npm:2.5.2" @@ -11376,6 +11662,17 @@ __metadata: 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: 10/1b6f3ccbf4540e535887b42218a2431a3f6cfdea320119c2affa2a7a374ad8fdd1e60166fc865181f45d49b1684c3e90e7b2190d3fe016692957afb9cf0d0d02 + languageName: node + linkType: hard + "formidable@npm:^2.1.2": version: 2.1.2 resolution: "formidable@npm:2.1.2" @@ -11650,6 +11947,16 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^2.0.0": + version: 2.3.1 + resolution: "get-stream@npm:2.3.1" + dependencies: + object-assign: "npm:^4.0.1" + pinkie-promise: "npm:^2.0.0" + checksum: 10/712738e6a39b06da774aea5d35efa16a8f067a0d93b1b564e8d0e733fafddcf021e03098895735bc45d6594d3094369d700daa0d33891f980595cf6495e33294 + languageName: node + linkType: hard + "get-stream@npm:^5.1.0": version: 5.2.0 resolution: "get-stream@npm:5.2.0" @@ -11698,6 +12005,15 @@ __metadata: 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: 10/ab18d55661db264e3eac6012c2d3daeafaab7a501c035ae0ccb193c3c23e9849c6e29b6ac762b9c2adae460266f925d55a3a2a3a3c8b94be2f222df94d70c046 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -11765,6 +12081,16 @@ __metadata: languageName: node linkType: hard +"global@npm:~4.4.0": + version: 4.4.0 + resolution: "global@npm:4.4.0" + dependencies: + min-document: "npm:^2.19.0" + process: "npm:^0.11.10" + checksum: 10/9c057557c8f5a5bcfbeb9378ba4fe2255d04679452be504608dd5f13b54edf79f7be1db1031ea06a4ec6edd3b9f5f17d2d172fb47e6c69dae57fd84b7e72b77f + languageName: node + linkType: hard + "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -11908,6 +12234,23 @@ __metadata: languageName: node linkType: hard +"har-schema@npm:^2.0.0": + version: 2.0.0 + resolution: "har-schema@npm:2.0.0" + checksum: 10/d8946348f333fb09e2bf24cc4c67eabb47c8e1d1aa1c14184c7ffec1140a49ec8aa78aa93677ae452d71d5fc0fdeec20f0c8c1237291fc2bcb3f502a5d204f9b + 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: 10/b998a7269ca560d7f219eedc53e2c664cd87d487e428ae854a6af4573fc94f182fe9d2e3b92ab968249baec7ebaf9ead69cf975c931dc2ab282ec182ee988280 + languageName: node + linkType: hard + "hard-rejection@npm:^2.1.0": version: 2.1.0 resolution: "hard-rejection@npm:2.1.0" @@ -12302,6 +12645,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: 10/2ff7112e6b0d8f08b382dfe705078c655501f2ddd76cf589d108445a9dd388a0a9be928c37108261519a7f53e6bbd1651048d74057b804807cce1ec49e87a95b + languageName: node + linkType: hard + "https-browserify@npm:^1.0.0": version: 1.0.0 resolution: "https-browserify@npm:1.0.0" @@ -12309,6 +12663,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^2.2.1": + version: 2.2.4 + resolution: "https-proxy-agent@npm:2.2.4" + dependencies: + agent-base: "npm:^4.3.0" + debug: "npm:^3.1.0" + checksum: 10/0e252f5c9497f0e72772e24ac1a0dfb7e44741358a6c1bb602dd40e7b8cb37c355086bfcc86905ba319f6aa3c625b46b1553cf5d85d44c8e988c0965b39bc314 + languageName: node + linkType: hard + "https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -12405,6 +12769,15 @@ __metadata: languageName: node linkType: hard +"image-size@npm:^0.5.0": + version: 0.5.5 + resolution: "image-size@npm:0.5.5" + bin: + image-size: bin/image-size.js + checksum: 10/f41ec6cfccfa6471980e83568033a66ec53f84d1bcb70033e946a7db9c1b6bbf5645ec90fa5a8bdcdc84d86af0032014eff6fa078a60c2398dfce6676c46bdb7 + languageName: node + linkType: hard + "import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" @@ -12594,6 +12967,13 @@ __metadata: languageName: node linkType: hard +"ip-regex@npm:^1.0.1": + version: 1.0.3 + resolution: "ip-regex@npm:1.0.3" + checksum: 10/9ce02e567949be9cf4d16c5c314cd241ce1edf78b2619e94b276cdff97eefe198970a224f9d1f0c22a92c4655997ad68fd34d82e41e7d19fafa47fe15108f22a + languageName: node + linkType: hard + "ip-regex@npm:^4.0.0": version: 4.3.0 resolution: "ip-regex@npm:4.3.0" @@ -12780,6 +13160,13 @@ __metadata: languageName: node linkType: hard +"is-function@npm:^1.0.1": + version: 1.0.2 + resolution: "is-function@npm:1.0.2" + checksum: 10/7d564562e07b4b51359547d3ccc10fb93bb392fd1b8177ae2601ee4982a0ece86d952323fc172a9000743a3971f09689495ab78a1d49a9b14fc97a7e28521dc0 + languageName: node + linkType: hard + "is-generator-fn@npm:^2.0.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" @@ -13008,6 +13395,13 @@ __metadata: languageName: node linkType: hard +"is-typedarray@npm:~1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 10/4b433bfb0f9026f079f4eb3fbaa4ed2de17c9995c3a0b5c800bec40799b4b2a8b4e051b1ada77749deb9ded4ae52fe2096973f3a93ff83df1a5a7184a669478c + languageName: node + linkType: hard + "is-unicode-supported@npm:^0.1.0": version: 0.1.0 resolution: "is-unicode-supported@npm:0.1.0" @@ -13045,7 +13439,7 @@ __metadata: languageName: node linkType: hard -"is-wsl@npm:^2.2.0": +"is-wsl@npm:^2.1.1, is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" dependencies: @@ -13114,6 +13508,13 @@ __metadata: languageName: node linkType: hard +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: 10/22d9c181015226d4534a227539256897bbbcb7edd1066ca4fc4d3a06dbd976325dfdd16b3983c7d236a89f256805c1a685a772e0364e98873d3819b064ad35a1 + languageName: node + linkType: hard + "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -13919,6 +14320,30 @@ __metadata: languageName: node linkType: hard +"jimp@npm:^0.2.21": + version: 0.2.28 + resolution: "jimp@npm:0.2.28" + dependencies: + bignumber.js: "npm:^2.1.0" + bmp-js: "npm:0.0.3" + es6-promise: "npm:^3.0.2" + exif-parser: "npm:^0.1.9" + file-type: "npm:^3.1.0" + jpeg-js: "npm:^0.2.0" + load-bmfont: "npm:^1.2.3" + mime: "npm:^1.3.4" + mkdirp: "npm:0.5.1" + pixelmatch: "npm:^4.0.0" + pngjs: "npm:^3.0.0" + read-chunk: "npm:^1.0.1" + request: "npm:^2.65.0" + stream-to-buffer: "npm:^0.1.0" + tinycolor2: "npm:^1.1.2" + url-regex: "npm:^3.0.0" + checksum: 10/a1705344a7f066338f0c9d99f1d7d8a2e3068336793207a3866fd7aa09e9d3252c063460b50a761589f0517396aa65ce62e69738a551d4eda3760bfb76889a91 + languageName: node + linkType: hard + "jju@npm:~1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" @@ -13933,6 +14358,20 @@ __metadata: languageName: node linkType: hard +"jpeg-js@npm:^0.1.1": + version: 0.1.2 + resolution: "jpeg-js@npm:0.1.2" + checksum: 10/2a9bc46be8082f0104e1d39e5a18f9cdbb18886c69b445e368059b7bbc495ea43976bf88e9aa380db823acd88bb88b29bbf9a9d9660a199986ed48f3005cd19a + languageName: node + linkType: hard + +"jpeg-js@npm:^0.2.0": + version: 0.2.0 + resolution: "jpeg-js@npm:0.2.0" + checksum: 10/921a0b01169c84802125727b8cfffc43d1290e26aaa6feb94d4d43b62cd9e9c5912d44d1edf9f79bb6334ac168926799e9020118c2b53e095b458c424b9ef833 + languageName: node + linkType: hard + "js-sha3@npm:0.8.0": version: 0.8.0 resolution: "js-sha3@npm:0.8.0" @@ -13977,6 +14416,13 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:~0.1.0": + version: 0.1.1 + resolution: "jsbn@npm:0.1.1" + checksum: 10/5450133242845100e694f0ef9175f44c012691a9b770b2571e677314e6f70600abb10777cdfc9a0c6a9f2ac6d134577403633de73e2fcd0f97875a67744e2d14 + languageName: node + linkType: hard + "jsdoc-type-pratt-parser@npm:~4.0.0": version: 4.0.0 resolution: "jsdoc-type-pratt-parser@npm:4.0.0" @@ -14030,6 +14476,13 @@ __metadata: languageName: node linkType: hard +"json-schema@npm:0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: 10/8b3b64eff4a807dc2a3045b104ed1b9335cd8d57aa74c58718f07f0f48b8baa3293b00af4dcfbdc9144c3aafea1e97982cc27cc8e150fc5d93c540649507a458 + 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" @@ -14037,6 +14490,13 @@ __metadata: languageName: node linkType: hard +"json-stringify-safe@npm:~5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 10/59169a081e4eeb6f9559ae1f938f656191c000e0512aa6df9f3c8b2437a4ab1823819c6b9fd1818a4e39593ccfd72e9a051fdd3e2d1e340ed913679e888ded8c + languageName: node + linkType: hard + "json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -14097,6 +14557,18 @@ __metadata: 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: 10/df2bf234eab1b5078d01bcbff3553d50a243f7b5c10a169745efeda6344d62798bd1d85bcca6a8446f3b5d0495e989db45f9de8dae219f0f9796e70e0c776089 + languageName: node + linkType: hard + "jwa@npm:^2.0.0": version: 2.0.0 resolution: "jwa@npm:2.0.0" @@ -14451,6 +14923,22 @@ __metadata: languageName: node linkType: hard +"load-bmfont@npm:^1.2.3": + version: 1.4.2 + resolution: "load-bmfont@npm:1.4.2" + dependencies: + buffer-equal: "npm:0.0.1" + mime: "npm:^1.3.4" + parse-bmfont-ascii: "npm:^1.0.3" + parse-bmfont-binary: "npm:^1.0.5" + parse-bmfont-xml: "npm:^1.1.4" + phin: "npm:^3.7.1" + xhr: "npm:^2.0.1" + xtend: "npm:^4.0.0" + checksum: 10/73d80e9d5bd3ba12ba1174a33a6dfdc90a635106bb9a040b375060f24a9e15f757f06f3adfbcaa1f6effd93e380ef8c51f2b946dc6d976037f7119f0dd5266bf + languageName: node + linkType: hard + "load-json-file@npm:^6.2.0": version: 6.2.0 resolution: "load-json-file@npm:6.2.0" @@ -15003,7 +15491,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.18, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.18, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, 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: @@ -15012,7 +15500,7 @@ __metadata: languageName: node linkType: hard -"mime@npm:1.6.0": +"mime@npm:1.6.0, mime@npm:^1.3.4": version: 1.6.0 resolution: "mime@npm:1.6.0" bin: @@ -15021,7 +15509,7 @@ __metadata: languageName: node linkType: hard -"mime@npm:2.6.0": +"mime@npm:2.6.0, mime@npm:^2.0.3": version: 2.6.0 resolution: "mime@npm:2.6.0" bin: @@ -15053,6 +15541,15 @@ __metadata: languageName: node linkType: hard +"min-document@npm:^2.19.0": + version: 2.19.0 + resolution: "min-document@npm:2.19.0" + dependencies: + dom-walk: "npm:^0.1.0" + checksum: 10/4e45a0686c81cc04509989235dc6107e2678a59bb48ce017d3c546d7d9a18d782e341103e66c78081dd04544704e2196e529905c41c2550bca069b69f95f07c8 + languageName: node + linkType: hard + "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -15121,6 +15618,13 @@ __metadata: languageName: node linkType: hard +"minimist@npm:0.0.8": + version: 0.0.8 + resolution: "minimist@npm:0.0.8" + checksum: 10/1e6279f747b3330fb918e47bd88093b26dadca91ea31bd50f40a805d9ff55fd9af16162248ffa303876b1cbb75fd5b701e773d46319c22025ec124e53bca0714 + languageName: node + linkType: hard + "minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -15226,7 +15730,18 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.6": +"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: 10/8651af2facdfa53f39e68fd93cf1653c11f7c1d49c6d1b4e53bcedc52e669cc64f1b5e95c49cfde7e99dbbcad26d3e61f4f2b4812f18c871c6455d9592f02806 + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.6": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -15594,6 +16109,15 @@ __metadata: languageName: node linkType: hard +"neodoc@npm:^1.4.0": + version: 1.4.0 + resolution: "neodoc@npm:1.4.0" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: 10/495d0482aa9f4c354e0a12f4a1a1b9bcd01f04258beedbb9ff008ed38175a7485a92fd25d9b8eeda80084119c35bdd8291aacca862b306da42c9773c570cf28b + languageName: node + linkType: hard + "netmask@npm:^2.0.2": version: 2.0.2 resolution: "netmask@npm:2.0.2" @@ -15831,6 +16355,20 @@ __metadata: languageName: node linkType: hard +"oauth-sign@npm:~0.9.0": + version: 0.9.0 + resolution: "oauth-sign@npm:0.9.0" + checksum: 10/1809a366d258f41fdf4ab5310cff3d1e15f96b187503bc7333cef4351de7bd0f52cb269bc95800f1fae5fb04dd886287df1471985fd67e8484729fdbcf857119 + languageName: node + linkType: hard + +"object-assign@npm:^4.0.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + "object-inspect@npm:^1.13.1": version: 1.13.1 resolution: "object-inspect@npm:1.13.1" @@ -15981,6 +16519,16 @@ __metadata: languageName: node linkType: hard +"open@npm:^7.3.0": + version: 7.4.2 + resolution: "open@npm:7.4.2" + dependencies: + is-docker: "npm:^2.0.0" + is-wsl: "npm:^2.1.1" + checksum: 10/4fc02ed3368dcd5d7247ad3566433ea2695b0713b041ebc0eeb2f0f9e5d4e29fc2068f5cdd500976b3464e77fe8b61662b1b059c73233ccc601fe8b16d6c1cd6 + languageName: node + linkType: hard + "open@npm:^8.0.2": version: 8.4.2 resolution: "open@npm:8.4.2" @@ -16273,6 +16821,37 @@ __metadata: languageName: node linkType: hard +"parse-bmfont-ascii@npm:^1.0.3": + version: 1.0.6 + resolution: "parse-bmfont-ascii@npm:1.0.6" + checksum: 10/9dd46f8ad8db8e067904c97a21546a1e338eaabb909abe070c643e4e06dbf76fa685277114ca22a05a4a35d38197512b2826d5de46a03b10e9bf49119ced2e39 + languageName: node + linkType: hard + +"parse-bmfont-binary@npm:^1.0.5": + version: 1.0.6 + resolution: "parse-bmfont-binary@npm:1.0.6" + checksum: 10/728fbc05876c3f0ab116ea238be99f8c1188551e54997965038db558aab08c71f0ae1fee64c2a18c8d629c6b2aaea43e84a91783ec4f114ac400faf0b5170b86 + languageName: node + linkType: hard + +"parse-bmfont-xml@npm:^1.1.4": + version: 1.1.6 + resolution: "parse-bmfont-xml@npm:1.1.6" + dependencies: + xml-parse-from-string: "npm:^1.0.0" + xml2js: "npm:^0.5.0" + checksum: 10/71a202da289a124db7bb7bee1b2a01b8a38b5ba36f93d6a98cea6fc1d140c16c8bc7bcccff48864ec886da035944d337b04cf70723393c411991af952fc6086b + languageName: node + linkType: hard + +"parse-headers@npm:^2.0.0": + version: 2.0.5 + resolution: "parse-headers@npm:2.0.5" + checksum: 10/210b13bc0f99cf6f1183896f01de164797ac35b2720c9f1c82a3e2ceab256f87b9048e8e16a14cfd1b75448771f8379cd564bd1674a179ab0168c90005d4981b + languageName: node + linkType: hard + "parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -16292,6 +16871,15 @@ __metadata: languageName: node linkType: hard +"parse-png@npm:^1.0.0, parse-png@npm:^1.1.1": + version: 1.1.2 + resolution: "parse-png@npm:1.1.2" + dependencies: + pngjs: "npm:^3.2.0" + checksum: 10/319954d1feea667b1489104eaa691db9e99637a11f24fe8dd19f721999573daff22877ce7beb4b74dab72deec069285e610f4a85286fcae1d3b8cd6002303c8a + languageName: node + linkType: hard + "parse5@npm:^6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" @@ -16453,6 +17041,22 @@ __metadata: languageName: node linkType: hard +"performance-now@npm:^2.1.0": + version: 2.1.0 + resolution: "performance-now@npm:2.1.0" + checksum: 10/534e641aa8f7cba160f0afec0599b6cecefbb516a2e837b512be0adbe6c1da5550e89c78059c7fabc5c9ffdf6627edabe23eb7c518c4500067a898fa65c2b550 + languageName: node + linkType: hard + +"phin@npm:^3.7.1": + version: 3.7.1 + resolution: "phin@npm:3.7.1" + dependencies: + centra: "npm:^2.7.0" + checksum: 10/eebbfb0ab63d90f1513a2da05ef5ccc4bfb17216567fe62e9f0b8a4da27ff301b6409da8dcada6a66711c040b318ffb456e1adf24e8d261e24a916d30d91aadf + languageName: node + linkType: hard + "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -16481,6 +17085,22 @@ __metadata: 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: 10/b53a4a2e73bf56b6f421eef711e7bdcb693d6abb474d57c5c413b809f654ba5ee750c6a96dd7225052d4b96c4d053cdcb34b708a86fceed4663303abee52fcca + languageName: node + linkType: hard + +"pinkie@npm:^2.0.0": + version: 2.0.4 + resolution: "pinkie@npm:2.0.4" + checksum: 10/11d207257a044d1047c3755374d36d84dda883a44d030fe98216bf0ea97da05a5c9d64e82495387edeb9ee4f52c455bca97cdb97629932be65e6f54b29f5aec8 + languageName: node + linkType: hard + "pino-abstract-transport@npm:^2.0.0": version: 2.0.0 resolution: "pino-abstract-transport@npm:2.0.0" @@ -16548,6 +17168,17 @@ __metadata: languageName: node linkType: hard +"pixelmatch@npm:^4.0.0": + version: 4.0.2 + resolution: "pixelmatch@npm:4.0.2" + dependencies: + pngjs: "npm:^3.0.0" + bin: + pixelmatch: bin/pixelmatch + checksum: 10/3dfb1c0bc6d333a5ad34e78737c3ea33ac3743b52db73b5e8bebbbfd87376afacfec5d3c268d9fdb6e77b07c5ecd6b01f98657087457107f9e03ad1a872545e1 + languageName: node + linkType: hard + "pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -16612,6 +17243,13 @@ __metadata: languageName: node linkType: hard +"pngjs@npm:^3.0.0, pngjs@npm:^3.2.0": + version: 3.4.0 + resolution: "pngjs@npm:3.4.0" + checksum: 10/0e9227a413ce4b4f5ebae4465b366efc9ca545c74304f3cc30ba2075159eb12f01a6a821c4f61f2b048bd85356abbe6d2109df7052a9030ef4d7a42d99760af6 + languageName: node + linkType: hard + "portfinder@npm:^1.0.32": version: 1.0.32 resolution: "portfinder@npm:1.0.32" @@ -16817,7 +17455,7 @@ __metadata: languageName: node linkType: hard -"progress@npm:^2.0.3": +"progress@npm:^2.0.1, progress@npm:^2.0.3": version: 2.0.3 resolution: "progress@npm:2.0.3" checksum: 10/e6f0bcb71f716eee9dfac0fe8a2606e3704d6a64dd93baaf49fbadbc8499989a610fe14cf1bc6f61b6d6653c49408d94f4a94e124538084efd8e4cf525e0293d @@ -16931,7 +17569,7 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:^1.1.0": +"proxy-from-env@npm:^1.0.0, proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" checksum: 10/f0bb4a87cfd18f77bc2fba23ae49c3b378fb35143af16cc478171c623eebe181678f09439707ad80081d340d1593cd54a33a0113f3ccb3f4bc9451488780ee23 @@ -16949,6 +17587,15 @@ __metadata: 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: 10/5e7467eb5196eb7900d156783d12907d445c0122f76c73203ce96b148a6ccf8c5450cc805887ffada38ff92d634afcf33720c24053cb01d5b6598d1c913c5caf + languageName: node + linkType: hard + "public-encrypt@npm:^4.0.0": version: 4.0.3 resolution: "public-encrypt@npm:4.0.3" @@ -16991,7 +17638,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0, punycode@npm:^2.3.1": +"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: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 @@ -17025,6 +17672,22 @@ __metadata: languageName: node linkType: hard +"puppeteer@npm:^1.3.0": + version: 1.20.0 + resolution: "puppeteer@npm:1.20.0" + dependencies: + debug: "npm:^4.1.0" + extract-zip: "npm:^1.6.6" + https-proxy-agent: "npm:^2.2.1" + mime: "npm:^2.0.3" + progress: "npm:^2.0.1" + proxy-from-env: "npm:^1.0.0" + rimraf: "npm:^2.6.1" + ws: "npm:^6.1.0" + checksum: 10/db2222f7513af35aba4d4925e2db73fcb6df21bac16d51a2276518bdaed380a3811134467649432bdcc2db63c4e9cce1fce9b618ac709f85a38eb0f8e21ac2ad + languageName: node + linkType: hard + "puppeteer@npm:^22.4.1": version: 22.15.0 resolution: "puppeteer@npm:22.15.0" @@ -17089,6 +17752,13 @@ __metadata: languageName: node linkType: hard +"qs@npm:~6.5.2": + version: 6.5.3 + resolution: "qs@npm:6.5.3" + checksum: 10/485c990fba7ad17671e16c92715fb064c1600337738f5d140024eb33a49fbc1ed31890d3db850117c760caeb9c9cc9f4ba22a15c20dd119968e41e3d3fe60b28 + languageName: node + linkType: hard + "querystring-es3@npm:~0.2.0": version: 0.2.1 resolution: "querystring-es3@npm:0.2.1" @@ -17211,6 +17881,13 @@ __metadata: languageName: node linkType: hard +"read-chunk@npm:^1.0.1": + version: 1.0.1 + resolution: "read-chunk@npm:1.0.1" + checksum: 10/9240d6a7dbef26d611f5e816dde890bbda99a4547c3edc2be60f8beab757023dfaaa6486004a20bc6d3f5fce90ff31da64eff131554e4250fc5182ed1e6b2a80 + languageName: node + linkType: hard + "read-only-stream@npm:^2.0.0": version: 2.0.0 resolution: "read-only-stream@npm:2.0.0" @@ -17392,6 +18069,34 @@ __metadata: languageName: node linkType: hard +"request@npm:^2.65.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: 10/005b8b237b56f1571cfd4ecc09772adaa2e82dcb884fc14ea2bb25e23dbf7c2009f9929e0b6d3fd5802e33ed8ee705a3b594c8f9467c1458cd973872bf89db8e + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -17433,6 +18138,20 @@ __metadata: languageName: node linkType: hard +"resize-img@npm:^1.1.0": + version: 1.1.2 + resolution: "resize-img@npm:1.1.2" + dependencies: + bmp-js: "npm:0.0.1" + file-type: "npm:^3.8.0" + get-stream: "npm:^2.0.0" + jimp: "npm:^0.2.21" + jpeg-js: "npm:^0.1.1" + parse-png: "npm:^1.1.1" + checksum: 10/6d02d35a85478edc88aabe2cc50b368b980af3b5af785e545838621f4d654afe0bc8edc0bdba31c9b599965221425ba5d663e5bfa875c9f719b17af09b3368c5 + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -17586,6 +18305,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^2.6.1": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 10/4586c296c736483e297da7cffd19475e4a3e41d07b1ae124aad5d687c79e4ffa716bdac8732ed1db942caf65271cee9dd39f8b639611de161a2753e2112ffe1d + languageName: node + linkType: hard + "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -17777,7 +18507,7 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": +"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: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 @@ -17795,6 +18525,13 @@ __metadata: languageName: node linkType: hard +"sax@npm:>=0.6.0": + version: 1.4.1 + resolution: "sax@npm:1.4.1" + checksum: 10/b1c784b545019187b53a0c28edb4f6314951c971e2963a69739c6ce222bfbc767e54d320e689352daba79b7d5e06d22b5d7113b99336219d6e93718e2f99d335 + languageName: node + linkType: hard + "schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": version: 3.3.0 resolution: "schema-utils@npm:3.3.0" @@ -18453,6 +19190,27 @@ __metadata: 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: 10/858339d43e3c6b6a848772a66f69442ce74f1a37655d9f35ba9d1f85329499ff0000af9f8ab83dbb39ad24c0c370edabe0be1e39863f70c6cded9924b8458c34 + languageName: node + linkType: hard + "ssri@npm:^10.0.0": version: 10.0.6 resolution: "ssri@npm:10.0.6" @@ -18561,6 +19319,15 @@ __metadata: languageName: node linkType: hard +"stream-to-buffer@npm:^0.1.0": + version: 0.1.0 + resolution: "stream-to-buffer@npm:0.1.0" + dependencies: + stream-to: "npm:~0.2.0" + checksum: 10/9adf4eadf245ac4bd2ce1b4cd879170714221d185798637b1b5e4f53aef304d5dccbbd180380932d6f3618f7e1972a0529732618ae5c8e33beb0ca51d6907aec + languageName: node + linkType: hard + "stream-to-it@npm:^1.0.0": version: 1.0.1 resolution: "stream-to-it@npm:1.0.1" @@ -18570,6 +19337,13 @@ __metadata: languageName: node linkType: hard +"stream-to@npm:~0.2.0": + version: 0.2.2 + resolution: "stream-to@npm:0.2.2" + checksum: 10/06a3f163cfc609a7dc6952f0d953e67f5dabf68c75a7349cc0656ed4e211806e58c69ba1270263ec33c288aaf1468386c3055d592e18b76bc0f13e322ab78068 + languageName: node + linkType: hard + "streamx@npm:^2.15.0, streamx@npm:^2.16.1": version: 2.16.1 resolution: "streamx@npm:2.16.1" @@ -19177,6 +19951,13 @@ __metadata: languageName: node linkType: hard +"tinycolor2@npm:^1.1.2": + version: 1.6.0 + resolution: "tinycolor2@npm:1.6.0" + checksum: 10/066c3acf4f82b81c58a0d3ab85f49407efe95ba87afc3c7a16b1d77625193dfbe10dd46c26d0a263c1137361dd5a6a68bff2fb71def5fb9b9aec940fb030bcd4 + languageName: node + linkType: hard + "tmp@npm:0.0.33, tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -19200,6 +19981,19 @@ __metadata: languageName: node linkType: hard +"to-ico@npm:^1.1.5": + version: 1.1.5 + resolution: "to-ico@npm:1.1.5" + dependencies: + arrify: "npm:^1.0.1" + buffer-alloc: "npm:^1.1.0" + image-size: "npm:^0.5.0" + parse-png: "npm:^1.0.0" + resize-img: "npm:^1.1.0" + checksum: 10/56f47de42eb5782a1e521ec13daca8af9fb5bc1216f759b263dc88e4f44b6f093d36df7f10b08d28a56dac431d99a90daffddc413bc57ce898a685f8856d1eeb + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -19216,6 +20010,16 @@ __metadata: 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: 10/024cb13a4d1fe9af57f4323dff765dd9b217cc2a69be77e3b8a1ca45600aa33a097b6ad949f225d885e904f4bd3ceccef104741ef202d8378e6ca78e850ff82f + languageName: node + linkType: hard + "tr46@npm:^5.0.0": version: 5.0.0 resolution: "tr46@npm:5.0.0" @@ -19497,6 +20301,22 @@ __metadata: languageName: node linkType: hard +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10/7f0d9ed5c22404072b2ae8edc45c071772affd2ed14a74f03b4e71b4dd1a14c3714d85aed64abcaaee5fec2efc79002ba81155c708f4df65821b444abb0cfade + 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: 10/04ee27901cde46c1c0a64b9584e04c96c5fe45b38c0d74930710751ea991408b405747d01dfae72f80fc158137018aea94f9c38c651cb9c318f0861a310c3679 + 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" @@ -19955,6 +20775,15 @@ __metadata: languageName: node linkType: hard +"url-regex@npm:^3.0.0": + version: 3.2.0 + resolution: "url-regex@npm:3.2.0" + dependencies: + ip-regex: "npm:^1.0.1" + checksum: 10/06c9b619c8d09debd9a721e45a5b23f5af1cb56e9ef9083242a9cc5ae5c09ac9fea35e72a7cddd840b3db09790aeaf26332ba7dfea86a1b239a1d0103e8ddfe3 + languageName: node + linkType: hard + "url-template@npm:^2.0.8": version: 2.0.8 resolution: "url-template@npm:2.0.8" @@ -20029,6 +20858,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: 10/4f2b86432b04cc7c73a0dd1bcf11f1fc18349d65d2e4e32dd0fc658909329a1e0cc9244aa93f34c0cccfdd5ae1af60a149251a5f420ec3ac4223a3dab198fb2e + languageName: node + linkType: hard + "uuid@npm:^8.0.0, uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" @@ -20082,6 +20920,17 @@ __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: 10/da548149dd9c130a8a2587c9ee71ea30128d1526925707e2d01ed9c5c45c9e9f86733c66a328247cdd5f7c1516fb25b0f959ba754bfbe15072aa99ff96468a29 + languageName: node + linkType: hard + "viem@npm:^2.7.15": version: 2.10.2 resolution: "viem@npm:2.10.2" @@ -20623,6 +21472,15 @@ __metadata: languageName: node linkType: hard +"ws@npm:^6.1.0": + version: 6.2.3 + resolution: "ws@npm:6.2.3" + dependencies: + async-limiter: "npm:~1.0.0" + checksum: 10/19f8d1608317f4c98f63da6eebaa85260a6fe1ba459cbfedd83ebe436368177fb1e2944761e2392c6b7321cbb7a375c8a81f9e1be35d555b6b4647eb61eadd46 + languageName: node + linkType: hard + "ws@npm:^7.5.10": version: 7.5.10 resolution: "ws@npm:7.5.10" @@ -20668,6 +21526,42 @@ __metadata: languageName: node linkType: hard +"xhr@npm:^2.0.1": + version: 2.6.0 + resolution: "xhr@npm:2.6.0" + dependencies: + global: "npm:~4.4.0" + is-function: "npm:^1.0.1" + parse-headers: "npm:^2.0.0" + xtend: "npm:^4.0.0" + checksum: 10/31f34aba708955008c87bcd21482be6afc7ff8adc28090e633b1d3f8d3e8e93150bac47b262738b046d7729023a884b655d55cf34e9d14d5850a1275ab49fb37 + languageName: node + linkType: hard + +"xml-parse-from-string@npm:^1.0.0": + version: 1.0.1 + resolution: "xml-parse-from-string@npm:1.0.1" + checksum: 10/628eda047d93bed85165b2605d68bd86a18cab2d362ed29553ee0d4124cec348ffa6dfb0f73361f46329ce9ee1079bb152af49caf1b5f694232c554a8d5daaa4 + languageName: node + linkType: hard + +"xml2js@npm:^0.5.0": + version: 0.5.0 + resolution: "xml2js@npm:0.5.0" + dependencies: + sax: "npm:>=0.6.0" + xmlbuilder: "npm:~11.0.0" + checksum: 10/27c4d759214e99be5ec87ee5cb1290add427fa43df509d3b92d10152b3806fd2f7c9609697a18b158ccf2caa01e96af067cdba93196f69ca10c90e4f79a08896 + languageName: node + linkType: hard + +"xmlbuilder@npm:~11.0.0": + version: 11.0.1 + resolution: "xmlbuilder@npm:11.0.1" + checksum: 10/c8c3d208783718db5b285101a736cd8e6b69a5c265199a0739abaa93d1a1b7de5489fd16df4e776e18b2c98cb91f421a7349e99fd8c1ebeb44ecfed72a25091a + languageName: node + linkType: hard + "xtend@npm:^4.0.0, xtend@npm:^4.0.1, xtend@npm:^4.0.2, xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2"