diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e22526cfb8e..9c8ac016142 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -112,6 +112,7 @@ jobs: "examples/inspect_message", "examples/internet_identity", "examples/key_value_store", + "examples/large_files", "examples/ledger_canister", "examples/list_of_lists", "examples/management_canister", diff --git a/Cargo.lock b/Cargo.lock index 6c64f0bfe77..156d8b41928 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -225,6 +225,8 @@ dependencies = [ "ic-stable-structures", "ic-wasi-polyfill", "include_dir", + "serde_json", + "sha2", "slotmap", "wasmedge_quickjs", "wasmi", @@ -1418,9 +1420,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", diff --git a/dfx/index.ts b/dfx/index.ts new file mode 100644 index 00000000000..ec828821bd9 --- /dev/null +++ b/dfx/index.ts @@ -0,0 +1,94 @@ +import { execSync } from 'child_process'; +import { Secp256k1KeyIdentity } from '@dfinity/identity-secp256k1'; +import { readFile } from 'fs/promises'; +import { homedir } from 'os'; +import { join } from 'path'; +import { HttpAgent } from '@dfinity/agent'; + +export function getCanisterId(canisterName: string): string { + return execSync( + `dfx canister --network ${ + process.env.DFX_NETWORK ?? 'local' + } id ${canisterName}` + ) + .toString() + .trim(); +} + +export function getWebServerPort(): string { + return execSync(`dfx info webserver-port`).toString().trim(); +} + +export function getCanisterOrigin(canisterName: string): string { + return `http://${getCanisterId( + canisterName + )}.localhost:${getWebServerPort()}`; +} + +export function getAgentHost(): string { + return process.env.DFX_NETWORK === 'ic' + ? `https://icp-api.io` + : `http://127.0.0.1:${getWebServerPort()}`; +} + +export async function createAnonymousAgent() { + const agent = new HttpAgent({ + host: getAgentHost() + }); + + if (process.env.DFX_NETWORK !== 'ic') { + await agent.fetchRootKey(); + } +} + +export async function createAuthenticatedAgent( + identityName?: string +): Promise { + const agent = new HttpAgent({ + host: getAgentHost(), + identity: getIdentity(identityName) + }); + + if (process.env.DFX_NETWORK !== 'ic') { + await agent.fetchRootKey(); + } + + return agent; +} + +export function getIdentityName(): string { + return execSync(`dfx identity whoami`).toString().trim(); +} + +export function generateIdentity(name: string) { + execSync(`dfx identity new ${name} --storage-mode plaintext`); +} + +export function useIdentity(name: string) { + execSync(`dfx identity use ${name}`); +} + +export function getIdentities(): string[] { + const list = execSync(`dfx identity list`).toString().trim(); + const identities = list.split('\n'); + + return identities; +} + +export function removeIdentity(name: string) { + execSync(`dfx identity remove ${name}`); +} + +export async function getIdentity( + identityName: string = getIdentityName() +): Promise { + const identityPath = join( + homedir(), + '.config', + 'dfx', + 'identity', + identityName, + 'identity.pem' + ); + return Secp256k1KeyIdentity.fromPem(await readFile(identityPath, 'utf-8')); +} diff --git a/examples/apollo_server/test/test.ts b/examples/apollo_server/test/test.ts index dcc2cad3946..ca162ce9221 100644 --- a/examples/apollo_server/test/test.ts +++ b/examples/apollo_server/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('apollo_server'); diff --git a/examples/async_await/test/test.ts b/examples/async_await/test/test.ts index f25d5f299fc..5d39f95ef02 100644 --- a/examples/async_await/test/test.ts +++ b/examples/async_await/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/async_await'; import { get_tests } from './tests'; diff --git a/examples/audio_and_video/.gitignore b/examples/audio_and_video/.gitignore index bcfe6971616..5ad1677d0ba 100644 --- a/examples/audio_and_video/.gitignore +++ b/examples/audio_and_video/.gitignore @@ -1,3 +1,6 @@ .azle .dfx node_modules +src/backend/media/jordan_video_streaming_demo.mp4 +src/backend/media/popeye_the_sailor_meets_sindbad_the_sailor.mp4 +src/backend/media/the_memphis_belle.mp4 diff --git a/examples/audio_and_video/dfx.json b/examples/audio_and_video/dfx.json index c8b1df468a3..9bd69ad062d 100644 --- a/examples/audio_and_video/dfx.json +++ b/examples/audio_and_video/dfx.json @@ -10,8 +10,20 @@ "gzip": true, "assets": [ ["src/frontend/dist", "dist"], - ["src/backend/media", "media"] + ["src/backend/media/audio.ogg", "media/audio.ogg"], + ["src/backend/media/video.ogv", "media/video.ogv"] ], + "assets_large_commented_out": [ + [ + "src/backend/media/jordan_video_streaming_demo.mp4", + "media/jordan_video_streaming_demo.mp4" + ], + [ + "src/backend/media/popeye_the_sailor_meets_sindbad_the_sailor.mp4", + "media/popeye_the_sailor_meets_sindbad_the_sailor.mp4" + ] + ], + "post_install": "npx azle upload-assets backend", "build_assets": "npm run build", "metadata": [ { diff --git a/examples/audio_and_video/src/frontend/index.html b/examples/audio_and_video/src/frontend/index.html index f98dd842ac2..21c8bc0ef66 100644 --- a/examples/audio_and_video/src/frontend/index.html +++ b/examples/audio_and_video/src/frontend/index.html @@ -2,17 +2,95 @@ - Audio and Video + ICP Video/Audio Streaming w/ Range Requests - - + + +
+

ICP Video/Audio Streaming w/ Range Requests

+
+
+ 1. + View the incredibly simple source code +
+
+ 2. Details on scalability are not fully known yet (consider + boundary node caching/limits + subnet/canister query limits) +
+
+ 3. Streaming is currently free (besides storage, upload, + etc); this will most likely change in the future +
+
+ 4. Very large file uploads (greater than ~20 MiB) will be + released in subsequent versions of Azle +
+
+
+ +
+ +
+ Jordan Video Streaming Demo - 17.78 MiB +
+
+ + + +
+ +
+ Abraham Lincoln's Second Inaugural Address - 5.33 MiB +
+
diff --git a/examples/audio_and_video/test/test.ts b/examples/audio_and_video/test/test.ts index 013ae4294d1..c76a4af1f75 100644 --- a/examples/audio_and_video/test/test.ts +++ b/examples/audio_and_video/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('backend'); diff --git a/examples/audio_recorder/test/test.ts b/examples/audio_recorder/test/test.ts index 145c8a5da71..eba4db5eb14 100644 --- a/examples/audio_recorder/test/test.ts +++ b/examples/audio_recorder/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/audio_recorder'; import { get_tests } from './tests'; diff --git a/examples/autoreload/test/test.ts b/examples/autoreload/test/test.ts index 54d5a262509..37d383b8342 100644 --- a/examples/autoreload/test/test.ts +++ b/examples/autoreload/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('autoreload'); diff --git a/examples/bitcoin/test/test.ts b/examples/bitcoin/test/test.ts index ce89d63d18b..0cf90a6b513 100644 --- a/examples/bitcoin/test/test.ts +++ b/examples/bitcoin/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests, Test } from 'azle/test'; +import { runTests, Test } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { createActor } from './dfx_generated/bitcoin'; import { wallets } from './wallets'; import { impureSetup, whileRunningBitcoinDaemon } from './setup'; diff --git a/examples/blob_array/test/test.ts b/examples/blob_array/test/test.ts index 65fe874e251..ce90f35d06d 100644 --- a/examples/blob_array/test/test.ts +++ b/examples/blob_array/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { createActor } from './dfx_generated/blob_array'; import { get_tests } from './tests'; diff --git a/examples/bytes/test/test.ts b/examples/bytes/test/test.ts index bfe40baa2ff..958d14ee3be 100644 --- a/examples/bytes/test/test.ts +++ b/examples/bytes/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { createActor } from './dfx_generated/bytes_canister'; import { get_tests } from './tests'; diff --git a/examples/call_raw/test/test.ts b/examples/call_raw/test/test.ts index 068696508ac..04d36d05446 100644 --- a/examples/call_raw/test/test.ts +++ b/examples/call_raw/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { createActor } from '../test/dfx_generated/call_raw'; import { get_tests } from './tests'; diff --git a/examples/candid_encoding/test/test.ts b/examples/candid_encoding/test/test.ts index 7db1830199b..e8424e2c444 100644 --- a/examples/candid_encoding/test/test.ts +++ b/examples/candid_encoding/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { createActor } from './dfx_generated/candid_encoding'; import { get_tests } from './tests'; diff --git a/examples/candid_keywords/test/test.ts b/examples/candid_keywords/test/test.ts index 4a99ed93e9a..69d4d5abff1 100644 --- a/examples/candid_keywords/test/test.ts +++ b/examples/candid_keywords/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { createActor } from './dfx_generated/candid_keywords'; import { getTests } from './tests'; diff --git a/examples/canister/test/pretest.ts b/examples/canister/test/pretest.ts index 3238c7c3bdf..240731945fc 100644 --- a/examples/canister/test/pretest.ts +++ b/examples/canister/test/pretest.ts @@ -1,5 +1,5 @@ import { execSync } from 'child_process'; -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; async function pretest() { await new Promise((resolve) => setTimeout(resolve, 5000)); diff --git a/examples/canister/test/test.ts b/examples/canister/test/test.ts index 70781ac568b..d342a8cce09 100644 --- a/examples/canister/test/test.ts +++ b/examples/canister/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/canister'; import { getTests } from './tests'; diff --git a/examples/canister/test/tests.ts b/examples/canister/test/tests.ts index 7b3bed11979..842b7d8a0b8 100644 --- a/examples/canister/test/tests.ts +++ b/examples/canister/test/tests.ts @@ -1,4 +1,5 @@ -import { getCanisterId, Test } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { Test } from 'azle/test'; import { _SERVICE } from './dfx_generated/canister/canister.did'; import { ActorSubclass } from '@dfinity/agent'; import { Principal } from '@dfinity/principal'; diff --git a/examples/ckbtc/test/tests.ts b/examples/ckbtc/test/tests.ts index 9cb6cfd077a..77e006aab52 100644 --- a/examples/ckbtc/test/tests.ts +++ b/examples/ckbtc/test/tests.ts @@ -3,7 +3,7 @@ import { ActorSubclass } from '@dfinity/agent'; import { AzleResult, Test } from 'azle/test'; import { Identity } from '@dfinity/agent'; import { Ed25519KeyIdentity } from '@dfinity/identity'; -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; // @ts-ignore import { _SERVICE } from '../wallet/frontend/dfx_generated/wallet_backend/wallet_backend.did'; diff --git a/examples/complex_init/test/test.ts b/examples/complex_init/test/test.ts index 26ef8a33d89..ea6558ea58d 100644 --- a/examples/complex_init/test/test.ts +++ b/examples/complex_init/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor as createComplexActor } from '../test/dfx_generated/complex_init'; // @ts-ignore import { createActor as createRecActor } from '../test/dfx_generated/rec_init'; diff --git a/examples/complex_types/test/test.ts b/examples/complex_types/test/test.ts index 0a489d6f0df..f9c192872e2 100644 --- a/examples/complex_types/test/test.ts +++ b/examples/complex_types/test/test.ts @@ -1,6 +1,7 @@ // TODO this needs to be more thoroughly tested -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/complex_types'; import { get_tests } from './tests'; diff --git a/examples/composite_queries/test/pretest.ts b/examples/composite_queries/test/pretest.ts index 9ecc8cb9a20..81a7613fc70 100644 --- a/examples/composite_queries/test/pretest.ts +++ b/examples/composite_queries/test/pretest.ts @@ -1,4 +1,4 @@ -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { execSync } from 'child_process'; async function pretest() { diff --git a/examples/composite_queries/test/test.ts b/examples/composite_queries/test/test.ts index 432181130d6..f2f28f99149 100644 --- a/examples/composite_queries/test/test.ts +++ b/examples/composite_queries/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/canister1'; import { get_tests } from './tests'; diff --git a/examples/composite_queries/test/tests.ts b/examples/composite_queries/test/tests.ts index c050655e41a..9cb1b8a9f5f 100644 --- a/examples/composite_queries/test/tests.ts +++ b/examples/composite_queries/test/tests.ts @@ -1,4 +1,5 @@ -import { getCanisterId, Test } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { Test } from 'azle/test'; import { ActorSubclass } from '@dfinity/agent'; import { _SERVICE } from './dfx_generated/canister1/canister1.did'; diff --git a/examples/counter/test/test.ts b/examples/counter/test/test.ts index 00adf62b704..8bf99247e9d 100644 --- a/examples/counter/test/test.ts +++ b/examples/counter/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/counter'; import { get_tests } from './tests'; diff --git a/examples/cross_canister_calls/test/pretest.ts b/examples/cross_canister_calls/test/pretest.ts index 02fe80485bf..cbdbb524552 100644 --- a/examples/cross_canister_calls/test/pretest.ts +++ b/examples/cross_canister_calls/test/pretest.ts @@ -1,4 +1,4 @@ -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { execSync } from 'child_process'; async function pretest() { diff --git a/examples/cross_canister_calls/test/test.ts b/examples/cross_canister_calls/test/test.ts index ac5d9f55863..7e8340e5031 100644 --- a/examples/cross_canister_calls/test/test.ts +++ b/examples/cross_canister_calls/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor as createActorCanister1 } from './dfx_generated/canister1'; import { createActor as createActorCanister2 } from './dfx_generated/canister2'; import { get_tests } from './tests'; diff --git a/examples/cycles/test/pretest.ts b/examples/cycles/test/pretest.ts index 6ef60dbf0bb..a90a53380ef 100644 --- a/examples/cycles/test/pretest.ts +++ b/examples/cycles/test/pretest.ts @@ -1,4 +1,4 @@ -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { execSync } from 'child_process'; async function pretest() { diff --git a/examples/cycles/test/test.ts b/examples/cycles/test/test.ts index c4deace98a4..927e94cf62e 100644 --- a/examples/cycles/test/test.ts +++ b/examples/cycles/test/test.ts @@ -1,6 +1,7 @@ // TODO If we want these tests to be more exact, we can check balances and make sure they are within some margin of error -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor as createCyclesActor } from './dfx_generated/cycles'; import { createActor as createIntermediaryActor } from './dfx_generated/intermediary'; import { getTests } from './tests'; diff --git a/examples/date/test/test.ts b/examples/date/test/test.ts index faaf1b30cb0..ff02bda8cc8 100644 --- a/examples/date/test/test.ts +++ b/examples/date/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/date'; import { getTests } from './tests'; diff --git a/examples/ethereum_json_rpc/test/test.ts b/examples/ethereum_json_rpc/test/test.ts index f73ef2eb9db..2d2dbb3fed7 100644 --- a/examples/ethereum_json_rpc/test/test.ts +++ b/examples/ethereum_json_rpc/test/test.ts @@ -1,6 +1,7 @@ // Ethereum genesis block balances taken from: https://raw.githubusercontent.com/lastmjs/eth-total-supply/master/nethermind-foundation.json -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/ethereum_json_rpc'; import { getTests } from './tests'; diff --git a/examples/ethers/test/test.ts b/examples/ethers/test/test.ts index c5806de6a49..b8c6ed55f6d 100644 --- a/examples/ethers/test/test.ts +++ b/examples/ethers/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('ethers'); diff --git a/examples/ethers_base/test/test.ts b/examples/ethers_base/test/test.ts index cb129852aea..74a1a5fafd8 100644 --- a/examples/ethers_base/test/test.ts +++ b/examples/ethers_base/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { getTests } from './tests'; const canisterId = getCanisterId('server'); diff --git a/examples/express/test/test.ts b/examples/express/test/test.ts index b4de98c2aca..19efd25ec32 100644 --- a/examples/express/test/test.ts +++ b/examples/express/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('express'); diff --git a/examples/fetch_ic/test/tests.ts b/examples/fetch_ic/test/tests.ts index c9a7ab958e4..fadec9a0cb7 100644 --- a/examples/fetch_ic/test/tests.ts +++ b/examples/fetch_ic/test/tests.ts @@ -5,7 +5,8 @@ import * as dns from 'node:dns'; dns.setDefaultResultOrder('ipv4first'); -import { Test, getCanisterOrigin } from 'azle/test'; +import { Test } from 'azle/test'; +import { getCanisterOrigin } from 'azle/dfx'; import puppeteer, { Browser, Page } from 'puppeteer'; export function getTests(canisterName: string): Test[] { diff --git a/examples/file_protocol/test/test.ts b/examples/file_protocol/test/test.ts index 013ae4294d1..c76a4af1f75 100644 --- a/examples/file_protocol/test/test.ts +++ b/examples/file_protocol/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('backend'); diff --git a/examples/fs/test/test.ts b/examples/fs/test/test.ts index 3e933f48a53..976ab3e9f7a 100644 --- a/examples/fs/test/test.ts +++ b/examples/fs/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('fs'); diff --git a/examples/func_types/test/pretest.ts b/examples/func_types/test/pretest.ts index d0c5adfce07..95cfa05a22c 100644 --- a/examples/func_types/test/pretest.ts +++ b/examples/func_types/test/pretest.ts @@ -1,4 +1,4 @@ -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { execSync } from 'child_process'; async function pretest() { diff --git a/examples/func_types/test/test.ts b/examples/func_types/test/test.ts index b9e366a6e0a..4f627e44fd2 100644 --- a/examples/func_types/test/test.ts +++ b/examples/func_types/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/func_types'; import { getTests } from './tests'; diff --git a/examples/func_types/test/tests.ts b/examples/func_types/test/tests.ts index 4925f54215b..ad7fc6ab7f0 100644 --- a/examples/func_types/test/tests.ts +++ b/examples/func_types/test/tests.ts @@ -1,6 +1,7 @@ import { ActorSubclass } from '@dfinity/agent'; import { Principal } from '@dfinity/principal'; -import { getCanisterId, Test } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { Test } from 'azle/test'; import { _SERVICE } from './dfx_generated/func_types/func_types.did'; export function getTests(funcTypesCanister: ActorSubclass<_SERVICE>): Test[] { diff --git a/examples/generics/test/test.ts b/examples/generics/test/test.ts index d928dc4ef3b..34e963b53e6 100644 --- a/examples/generics/test/test.ts +++ b/examples/generics/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/generics'; import { getTests } from './tests'; diff --git a/examples/guard_functions/test/test.ts b/examples/guard_functions/test/test.ts index e4174bb69cf..d2d514dbc55 100644 --- a/examples/guard_functions/test/test.ts +++ b/examples/guard_functions/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/guard_functions'; import { getTests } from './tests'; diff --git a/examples/heartbeat/test/test.ts b/examples/heartbeat/test/test.ts index b0ef4f34ac9..e13af73eb50 100644 --- a/examples/heartbeat/test/test.ts +++ b/examples/heartbeat/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor as create_actor_heartbeat_async } from './dfx_generated/heartbeat_async'; import { createActor as create_actor_heartbeat_sync } from './dfx_generated/heartbeat_sync'; import { getTests } from './tests'; diff --git a/examples/hello_world/test/test.ts b/examples/hello_world/test/test.ts index 013ae4294d1..c76a4af1f75 100644 --- a/examples/hello_world/test/test.ts +++ b/examples/hello_world/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('backend'); diff --git a/examples/http_outcall_fetch/test/test.ts b/examples/http_outcall_fetch/test/test.ts index cb129852aea..74a1a5fafd8 100644 --- a/examples/http_outcall_fetch/test/test.ts +++ b/examples/http_outcall_fetch/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { getTests } from './tests'; const canisterId = getCanisterId('server'); diff --git a/examples/hybrid_canister/test/tests/canister.ts b/examples/hybrid_canister/test/tests/canister.ts index 5125fdcbdb5..1d52d942f6e 100644 --- a/examples/hybrid_canister/test/tests/canister.ts +++ b/examples/hybrid_canister/test/tests/canister.ts @@ -1,4 +1,5 @@ -import { getCanisterId, Test } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { Test } from 'azle/test'; import { createActor } from '../dfx_generated/canister'; diff --git a/examples/hybrid_canister/test/tests/canister_init_and_post_upgrade.ts b/examples/hybrid_canister/test/tests/canister_init_and_post_upgrade.ts index ed07d5e6a88..17071e541f0 100644 --- a/examples/hybrid_canister/test/tests/canister_init_and_post_upgrade.ts +++ b/examples/hybrid_canister/test/tests/canister_init_and_post_upgrade.ts @@ -1,4 +1,5 @@ -import { getCanisterId, Test } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { Test } from 'azle/test'; import { execSync } from 'child_process'; import { createActor } from '../dfx_generated/canister_init_and_post_upgrade'; diff --git a/examples/hybrid_canister/test/tests/server.ts b/examples/hybrid_canister/test/tests/server.ts index 2eae67e9096..cc66f1d0ca7 100644 --- a/examples/hybrid_canister/test/tests/server.ts +++ b/examples/hybrid_canister/test/tests/server.ts @@ -1,4 +1,5 @@ -import { getCanisterId, Test } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { Test } from 'azle/test'; import { createActor } from '../dfx_generated/server'; diff --git a/examples/hybrid_canister/test/tests/server_init_and_post_upgrade.ts b/examples/hybrid_canister/test/tests/server_init_and_post_upgrade.ts index 8ad2565f736..9da9df56080 100644 --- a/examples/hybrid_canister/test/tests/server_init_and_post_upgrade.ts +++ b/examples/hybrid_canister/test/tests/server_init_and_post_upgrade.ts @@ -1,4 +1,5 @@ -import { getCanisterId, Test } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { Test } from 'azle/test'; import { execSync } from 'child_process'; import { createActor } from '../dfx_generated/server_init_and_post_upgrade'; diff --git a/examples/ic_api/test/test.ts b/examples/ic_api/test/test.ts index cad199b6c83..febc45f5d90 100644 --- a/examples/ic_api/test/test.ts +++ b/examples/ic_api/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/ic_api'; import { getTests } from './tests'; diff --git a/examples/ic_api/test/tests.ts b/examples/ic_api/test/tests.ts index 56a40f07abd..efe7d022c7d 100644 --- a/examples/ic_api/test/tests.ts +++ b/examples/ic_api/test/tests.ts @@ -1,4 +1,5 @@ -import { getCanisterId, Test } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { Test } from 'azle/test'; import { execSync } from 'child_process'; import { _SERVICE } from './dfx_generated/ic_api/ic_api.did'; import { ActorSubclass } from '@dfinity/agent'; diff --git a/examples/ic_evm_rpc/test/test.ts b/examples/ic_evm_rpc/test/test.ts index cb129852aea..94b5d77c6e6 100644 --- a/examples/ic_evm_rpc/test/test.ts +++ b/examples/ic_evm_rpc/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('server'); diff --git a/examples/icrc/test/test.ts b/examples/icrc/test/test.ts index 539ec7e093a..660422cda71 100644 --- a/examples/icrc/test/test.ts +++ b/examples/icrc/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/proxy'; import { getTests } from './tests'; diff --git a/examples/imports/test/test.ts b/examples/imports/test/test.ts index 2d0935ddd55..54ecb2b1d44 100644 --- a/examples/imports/test/test.ts +++ b/examples/imports/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/imports'; import { getTests } from './tests'; diff --git a/examples/init/test/test.ts b/examples/init/test/test.ts index 1fcd0b1d64d..97f9a8113d8 100644 --- a/examples/init/test/test.ts +++ b/examples/init/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/init'; import { getTests } from './tests'; diff --git a/examples/inspect_message/test/test.ts b/examples/inspect_message/test/test.ts index ba11fcb3daf..77cda0065c2 100644 --- a/examples/inspect_message/test/test.ts +++ b/examples/inspect_message/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/inspect_message'; import { getTests } from './tests'; diff --git a/examples/internet_identity/test/tests.ts b/examples/internet_identity/test/tests.ts index 6f88dd498e5..31f2a0df65a 100644 --- a/examples/internet_identity/test/tests.ts +++ b/examples/internet_identity/test/tests.ts @@ -2,7 +2,8 @@ import * as dns from 'node:dns'; dns.setDefaultResultOrder('ipv4first'); import { Principal } from '@dfinity/principal'; -import { Test, getCanisterOrigin } from 'azle/test'; +import { Test } from 'azle/test'; +import { getCanisterOrigin } from 'azle/dfx'; import puppeteer from 'puppeteer'; export function getTests(canisterName: string): Test[] { diff --git a/examples/key_value_store/test/test.ts b/examples/key_value_store/test/test.ts index 55d830cfe58..7f6b5a0e8dd 100644 --- a/examples/key_value_store/test/test.ts +++ b/examples/key_value_store/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/key_value_store'; import { getTests } from './tests'; diff --git a/examples/large_files/.gitignore b/examples/large_files/.gitignore new file mode 100644 index 00000000000..49e9479081a --- /dev/null +++ b/examples/large_files/.gitignore @@ -0,0 +1,5 @@ +.azle +.dfx +node_modules +assets/auto +assets/manual diff --git a/examples/large_files/assets/permanent/photos/people/george-washington.tif b/examples/large_files/assets/permanent/photos/people/george-washington.tif new file mode 100644 index 00000000000..32fd2754992 Binary files /dev/null and b/examples/large_files/assets/permanent/photos/people/george-washington.tif differ diff --git a/examples/large_files/assets/permanent/photos/places/dinosaurNM.jpg b/examples/large_files/assets/permanent/photos/places/dinosaurNM.jpg new file mode 100644 index 00000000000..a2c4a991e5c Binary files /dev/null and b/examples/large_files/assets/permanent/photos/places/dinosaurNM.jpg differ diff --git a/examples/large_files/assets/permanent/photos/places/slc.jpg b/examples/large_files/assets/permanent/photos/places/slc.jpg new file mode 100644 index 00000000000..3da487244a1 Binary files /dev/null and b/examples/large_files/assets/permanent/photos/places/slc.jpg differ diff --git a/examples/large_files/assets/permanent/photos/things/book.jpg b/examples/large_files/assets/permanent/photos/things/book.jpg new file mode 100644 index 00000000000..127cfdc220f Binary files /dev/null and b/examples/large_files/assets/permanent/photos/things/book.jpg differ diff --git a/examples/large_files/assets/permanent/photos/things/utah-teapot.jpg b/examples/large_files/assets/permanent/photos/things/utah-teapot.jpg new file mode 100644 index 00000000000..c0636db1c97 Binary files /dev/null and b/examples/large_files/assets/permanent/photos/things/utah-teapot.jpg differ diff --git a/examples/large_files/assets/permanent/text/subfolder/deep-sub-folder/deep.txt b/examples/large_files/assets/permanent/text/subfolder/deep-sub-folder/deep.txt new file mode 100644 index 00000000000..d6904fad389 --- /dev/null +++ b/examples/large_files/assets/permanent/text/subfolder/deep-sub-folder/deep.txt @@ -0,0 +1 @@ +This is a deep text file diff --git a/examples/large_files/assets/permanent/text/subfolder/other-thing.txt b/examples/large_files/assets/permanent/text/subfolder/other-thing.txt new file mode 100644 index 00000000000..ca992adc7e2 --- /dev/null +++ b/examples/large_files/assets/permanent/text/subfolder/other-thing.txt @@ -0,0 +1 @@ +This is not a huge file!! diff --git a/examples/large_files/assets/permanent/text/subfolder/sibling-deep-sub-folder/deep.txt b/examples/large_files/assets/permanent/text/subfolder/sibling-deep-sub-folder/deep.txt new file mode 100644 index 00000000000..1a7a55e8395 --- /dev/null +++ b/examples/large_files/assets/permanent/text/subfolder/sibling-deep-sub-folder/deep.txt @@ -0,0 +1 @@ +This is a deep text file in a sibling dir diff --git a/examples/large_files/assets/permanent/text/thing.txt b/examples/large_files/assets/permanent/text/thing.txt new file mode 100644 index 00000000000..43a988884a5 --- /dev/null +++ b/examples/large_files/assets/permanent/text/thing.txt @@ -0,0 +1 @@ +This is a small text file that will get uploaded via the large file uploader. diff --git a/examples/large_files/assets/single_asset.txt b/examples/large_files/assets/single_asset.txt new file mode 100644 index 00000000000..c0112bfced1 --- /dev/null +++ b/examples/large_files/assets/single_asset.txt @@ -0,0 +1 @@ +All by myself diff --git a/examples/large_files/dfx.json b/examples/large_files/dfx.json new file mode 100644 index 00000000000..7410dd439d0 --- /dev/null +++ b/examples/large_files/dfx.json @@ -0,0 +1,29 @@ +{ + "canisters": { + "backend": { + "type": "custom", + "main": "src/backend/index.ts", + "candid": "src/backend/index.did", + "candid_gen": "http", + "build": "npx azle backend", + "post_install": "npx azle upload-assets backend", + "wasm": ".azle/backend/backend.wasm", + "gzip": true, + "assets_large": [ + ["assets/auto", "assets"], + ["assets/permanent", "assets"], + ["assets/single_asset.txt", "assets/text/single.txt"] + ], + "metadata": [ + { + "name": "candid:service", + "path": "src/backend/index.did" + }, + { + "name": "cdk:name", + "content": "azle" + } + ] + } + } +} diff --git a/examples/large_files/package-lock.json b/examples/large_files/package-lock.json new file mode 100644 index 00000000000..9a696bcc41a --- /dev/null +++ b/examples/large_files/package-lock.json @@ -0,0 +1,4379 @@ +{ + "name": "large_files", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "azle": "0.20.2", + "express": "^4.18.2", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } + }, + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "dependencies": { + "@cspotcode/source-map-consumer": "0.8.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@dfinity/agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-1.0.0.tgz", + "integrity": "sha512-PdU3uDEacgAZUJTAlwqGkXjFT74u+BSiD7G6fk0QR/iIc6ynsws7nEf7PbNYhZVaf0e3IYrltk4d1XkOHP3KCw==", + "dependencies": { + "@noble/curves": "^1.2.0", + "@noble/hashes": "^1.3.1", + "base64-arraybuffer": "^0.2.0", + "borc": "^2.1.1", + "buffer": "^6.0.3", + "simple-cbor": "^0.4.1" + }, + "peerDependencies": { + "@dfinity/candid": "^1.0.0", + "@dfinity/principal": "^1.0.0" + } + }, + "node_modules/@dfinity/agent/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@dfinity/candid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-1.0.0.tgz", + "integrity": "sha512-xZss8Q+oZT3xptBkTskeXCRIC5HiC8VTxWNEK/U9vyZQmzcwVqAxu+mlLwMKeDFzHw6lo8cqIY6r8BCE6APs1g==", + "peer": true, + "peerDependencies": { + "@dfinity/principal": "^1.0.0" + } + }, + "node_modules/@dfinity/principal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-1.0.0.tgz", + "integrity": "sha512-lLX/EcrFbmyY/C1kDZhDeN3ebyG4PmBo8OkWP1hwpnp0BxAhv+5BEuFmK+PhH1T7tf6dtzmXOc5abWnPkzFbHQ==", + "peer": true, + "dependencies": { + "@noble/hashes": "^1.3.1" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.4.tgz", + "integrity": "sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz", + "integrity": "sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.4.tgz", + "integrity": "sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz", + "integrity": "sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz", + "integrity": "sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz", + "integrity": "sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz", + "integrity": "sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz", + "integrity": "sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz", + "integrity": "sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz", + "integrity": "sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz", + "integrity": "sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz", + "integrity": "sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz", + "integrity": "sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz", + "integrity": "sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz", + "integrity": "sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz", + "integrity": "sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz", + "integrity": "sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz", + "integrity": "sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz", + "integrity": "sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz", + "integrity": "sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz", + "integrity": "sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz", + "integrity": "sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "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, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@swc/core": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.91.tgz", + "integrity": "sha512-r950d0fdlZ8qbSDyvApn3HyCojiZE8xpgJzQvypeMi32dalYwugdJKWyLB55JIGMRGJ8+lmVvY4MPGkSR3kXgA==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "@swc/counter": "^0.1.1", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.91", + "@swc/core-darwin-x64": "1.3.91", + "@swc/core-linux-arm-gnueabihf": "1.3.91", + "@swc/core-linux-arm64-gnu": "1.3.91", + "@swc/core-linux-arm64-musl": "1.3.91", + "@swc/core-linux-x64-gnu": "1.3.91", + "@swc/core-linux-x64-musl": "1.3.91", + "@swc/core-win32-arm64-msvc": "1.3.91", + "@swc/core-win32-ia32-msvc": "1.3.91", + "@swc/core-win32-x64-msvc": "1.3.91" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.91.tgz", + "integrity": "sha512-7kHGiQ1he5khcEeJuHDmLZPM3rRL/ith5OTmV6bOPsoHi46kLeixORW+ts1opC3tC9vu6xbk16xgX0QAJchc1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.91.tgz", + "integrity": "sha512-8SpU18FbFpZDVzsHsAwdI1thF/picQGxq9UFxa8W+T9SDnbsqwFJv/6RqKJeJoDV6qFdl2OLjuO0OL7xrp0qnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.91.tgz", + "integrity": "sha512-fOq4Cy8UbwX1yf0WB0d8hWZaIKCnPtPGguRqdXGLfwvhjZ9SIErT6PnmGTGRbQCNCIkOZWHKyTU0r8t2dN3haQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.91.tgz", + "integrity": "sha512-fki4ioRP/Esy4vdp8T34RCV+V9dqkRmOt763pf74pdiyFV2dPLXa5lnw/XvR1RTfPGknrYgjEQLCfZlReTryRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.91.tgz", + "integrity": "sha512-XrG+DUUqNtfVLcJ20imby7fpBwQNG5VsEQBzQndSonPyUOa2YkTbBb60YDondfQGDABopuHH8gHN8o2H2/VCnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.91.tgz", + "integrity": "sha512-d11bYhX+YPBr/Frcjc6eVn3C0LuS/9U1Li9EmQ+6s9EpYtYRl2ygSlC8eueLbaiazBnCVYFnc8bU4o0kc5B9sw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.91.tgz", + "integrity": "sha512-2SRp5Dke2P4jCQePkDx9trkkTstnRpZJVw5r3jvYdk0zeO6iC4+ZPvvoWXJLigqQv/fZnIiSUfJ6ssOoaEqTzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.91.tgz", + "integrity": "sha512-l9qKXikOxj42UIjbeZpz9xtBmr736jOMqInNP8mVF2/U+ws5sI8zJjcOFFtfis4ru7vWCXhB1wtltdlJYO2vGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.91.tgz", + "integrity": "sha512-+s+52O0QVPmzOgjEe/rcb0AK6q/J7EHKwAyJCu/FaYO9df5ovE0HJjSKP6HAF0dGPO5hkENrXuNGujofUH9vtQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.91.tgz", + "integrity": "sha512-7u9HDQhjUC3Gv43EFW84dZtduWCSa4MgltK+Sp9zEGti6WXqDPu/ESjvDsQEVYTBEMEvZs/xVAXPgLVHorV5nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", + "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", + "optional": true, + "peer": true + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/uuid": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.4.tgz", + "integrity": "sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "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==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/azle": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/azle/-/azle-0.20.2.tgz", + "integrity": "sha512-kdAn5nXBNY67SVsToCAPPFMAtm/Cq8LodlOyFM58nxNJnDmjT/zQ+7B+D0eU7NXk8OYRIRRxt8fPSSLiGXzvSw==", + "dependencies": { + "@dfinity/agent": "^1.0.0", + "@types/uuid": "^9.0.4", + "buffer": "^6.0.3", + "chokidar": "^3.6.0", + "crypto-browserify": "^3.12.0", + "esbuild": "^0.19.3", + "fs-extra": "10.0.1", + "hash-of-directory": "^1.0.1", + "http-message-parser": "^0.0.34", + "js-sha256": "0.9.0", + "net": "^1.0.2", + "text-encoding": "0.7.0", + "ts-node": "10.3.1", + "typescript": "^5.2.2", + "uuid": "^9.0.1" + }, + "bin": { + "azle": "bin.js" + } + }, + "node_modules/azle/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/azle/node_modules/ts-node": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.1.tgz", + "integrity": "sha512-Yw3W2mYzhHfCHOICGNJqa0i+rbL0rAyg7ZIHxU+K4pgY8gd2Lh1j+XbHCusJMykbj6RZMJVOY0MlHVd+GOivcw==", + "dependencies": { + "@cspotcode/source-map-support": "0.7.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", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.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/base64-arraybuffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", + "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", + "engines": { + "node": ">= 0.6.0" + } + }, + "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" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/borc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", + "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "dependencies": { + "bignumber.js": "^9.0.0", + "buffer": "^5.5.0", + "commander": "^2.15.0", + "ieee754": "^1.1.13", + "iso-url": "~0.4.7", + "json-text-sequence": "~0.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/borc/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" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "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/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delimit-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", + "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/esbuild": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.4.tgz", + "integrity": "sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.4", + "@esbuild/android-arm64": "0.19.4", + "@esbuild/android-x64": "0.19.4", + "@esbuild/darwin-arm64": "0.19.4", + "@esbuild/darwin-x64": "0.19.4", + "@esbuild/freebsd-arm64": "0.19.4", + "@esbuild/freebsd-x64": "0.19.4", + "@esbuild/linux-arm": "0.19.4", + "@esbuild/linux-arm64": "0.19.4", + "@esbuild/linux-ia32": "0.19.4", + "@esbuild/linux-loong64": "0.19.4", + "@esbuild/linux-mips64el": "0.19.4", + "@esbuild/linux-ppc64": "0.19.4", + "@esbuild/linux-riscv64": "0.19.4", + "@esbuild/linux-s390x": "0.19.4", + "@esbuild/linux-x64": "0.19.4", + "@esbuild/netbsd-x64": "0.19.4", + "@esbuild/openbsd-x64": "0.19.4", + "@esbuild/sunos-x64": "0.19.4", + "@esbuild/win32-arm64": "0.19.4", + "@esbuild/win32-ia32": "0.19.4", + "@esbuild/win32-x64": "0.19.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "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==", + "hasInstallScript": true, + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-prop": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/get-prop/-/get-prop-0.0.10.tgz", + "integrity": "sha512-XRSGBgcIisSMLJ/dwe1y/eMm9yzLicEJKmEXA3ArBkDkCW2nyRroLOoKIz+SdxuG5SI7ym2QHaTU5ifCl7MTDg==" + }, + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-of-directory": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hash-of-directory/-/hash-of-directory-1.0.1.tgz", + "integrity": "sha512-PX6VaxD6JK8R4113ChdTtEnWIo2XA9mz4yrtGBuUGUKtWCj6iWWYj/qwjdfs3Zgm+FdiNj0Vmt4VwPlwxx8WHw==" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-message-parser": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/http-message-parser/-/http-message-parser-0.0.34.tgz", + "integrity": "sha512-KABKXT347AYvQoaMZg9/K+/GqW6gfB4pKCiTyMUYnosfkdkaBkrXE/cWGSLk5jvD5tiDeLFlYSHLhhPhQKbRrA==", + "dependencies": { + "buffer": "^4.9.1", + "concat-stream": "^1.5.1", + "get-prop": "0.0.10", + "minimist": "^1.2.0", + "stream-buffers": "^3.0.0" + }, + "bin": { + "http-message-parser": "bin/http-message-parser.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/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==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/iso-url": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", + "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, + "node_modules/json-text-sequence": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", + "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", + "dependencies": { + "delimit-stream": "0.1.0" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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==" + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/net": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", + "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "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==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "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" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-cbor": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", + "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-buffers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", + "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", + "engines": { + "node": ">= 0.10.0" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "deprecated": "no longer maintained" + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/@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, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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 + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==" + }, + "@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@dfinity/agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-1.0.0.tgz", + "integrity": "sha512-PdU3uDEacgAZUJTAlwqGkXjFT74u+BSiD7G6fk0QR/iIc6ynsws7nEf7PbNYhZVaf0e3IYrltk4d1XkOHP3KCw==", + "requires": { + "@noble/curves": "^1.2.0", + "@noble/hashes": "^1.3.1", + "base64-arraybuffer": "^0.2.0", + "borc": "^2.1.1", + "buffer": "^6.0.3", + "simple-cbor": "^0.4.1" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } + }, + "@dfinity/candid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-1.0.0.tgz", + "integrity": "sha512-xZss8Q+oZT3xptBkTskeXCRIC5HiC8VTxWNEK/U9vyZQmzcwVqAxu+mlLwMKeDFzHw6lo8cqIY6r8BCE6APs1g==", + "peer": true, + "requires": {} + }, + "@dfinity/principal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-1.0.0.tgz", + "integrity": "sha512-lLX/EcrFbmyY/C1kDZhDeN3ebyG4PmBo8OkWP1hwpnp0BxAhv+5BEuFmK+PhH1T7tf6dtzmXOc5abWnPkzFbHQ==", + "peer": true, + "requires": { + "@noble/hashes": "^1.3.1" + } + }, + "@esbuild/android-arm": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.4.tgz", + "integrity": "sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz", + "integrity": "sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.4.tgz", + "integrity": "sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz", + "integrity": "sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz", + "integrity": "sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz", + "integrity": "sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz", + "integrity": "sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz", + "integrity": "sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz", + "integrity": "sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz", + "integrity": "sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz", + "integrity": "sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz", + "integrity": "sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz", + "integrity": "sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz", + "integrity": "sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz", + "integrity": "sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz", + "integrity": "sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz", + "integrity": "sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz", + "integrity": "sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz", + "integrity": "sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz", + "integrity": "sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz", + "integrity": "sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz", + "integrity": "sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==", + "optional": true + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@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, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "requires": { + "@noble/hashes": "1.3.2" + } + }, + "@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" + }, + "@swc/core": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.91.tgz", + "integrity": "sha512-r950d0fdlZ8qbSDyvApn3HyCojiZE8xpgJzQvypeMi32dalYwugdJKWyLB55JIGMRGJ8+lmVvY4MPGkSR3kXgA==", + "optional": true, + "peer": true, + "requires": { + "@swc/core-darwin-arm64": "1.3.91", + "@swc/core-darwin-x64": "1.3.91", + "@swc/core-linux-arm-gnueabihf": "1.3.91", + "@swc/core-linux-arm64-gnu": "1.3.91", + "@swc/core-linux-arm64-musl": "1.3.91", + "@swc/core-linux-x64-gnu": "1.3.91", + "@swc/core-linux-x64-musl": "1.3.91", + "@swc/core-win32-arm64-msvc": "1.3.91", + "@swc/core-win32-ia32-msvc": "1.3.91", + "@swc/core-win32-x64-msvc": "1.3.91", + "@swc/counter": "^0.1.1", + "@swc/types": "^0.1.5" + } + }, + "@swc/core-darwin-arm64": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.91.tgz", + "integrity": "sha512-7kHGiQ1he5khcEeJuHDmLZPM3rRL/ith5OTmV6bOPsoHi46kLeixORW+ts1opC3tC9vu6xbk16xgX0QAJchc1w==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-darwin-x64": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.91.tgz", + "integrity": "sha512-8SpU18FbFpZDVzsHsAwdI1thF/picQGxq9UFxa8W+T9SDnbsqwFJv/6RqKJeJoDV6qFdl2OLjuO0OL7xrp0qnQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.91.tgz", + "integrity": "sha512-fOq4Cy8UbwX1yf0WB0d8hWZaIKCnPtPGguRqdXGLfwvhjZ9SIErT6PnmGTGRbQCNCIkOZWHKyTU0r8t2dN3haQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.91.tgz", + "integrity": "sha512-fki4ioRP/Esy4vdp8T34RCV+V9dqkRmOt763pf74pdiyFV2dPLXa5lnw/XvR1RTfPGknrYgjEQLCfZlReTryRw==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.91.tgz", + "integrity": "sha512-XrG+DUUqNtfVLcJ20imby7fpBwQNG5VsEQBzQndSonPyUOa2YkTbBb60YDondfQGDABopuHH8gHN8o2H2/VCnQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.91.tgz", + "integrity": "sha512-d11bYhX+YPBr/Frcjc6eVn3C0LuS/9U1Li9EmQ+6s9EpYtYRl2ygSlC8eueLbaiazBnCVYFnc8bU4o0kc5B9sw==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.91.tgz", + "integrity": "sha512-2SRp5Dke2P4jCQePkDx9trkkTstnRpZJVw5r3jvYdk0zeO6iC4+ZPvvoWXJLigqQv/fZnIiSUfJ6ssOoaEqTzQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.91.tgz", + "integrity": "sha512-l9qKXikOxj42UIjbeZpz9xtBmr736jOMqInNP8mVF2/U+ws5sI8zJjcOFFtfis4ru7vWCXhB1wtltdlJYO2vGA==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.91.tgz", + "integrity": "sha512-+s+52O0QVPmzOgjEe/rcb0AK6q/J7EHKwAyJCu/FaYO9df5ovE0HJjSKP6HAF0dGPO5hkENrXuNGujofUH9vtQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.3.91", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.91.tgz", + "integrity": "sha512-7u9HDQhjUC3Gv43EFW84dZtduWCSa4MgltK+Sp9zEGti6WXqDPu/ESjvDsQEVYTBEMEvZs/xVAXPgLVHorV5nQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/counter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", + "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", + "optional": true, + "peer": true + }, + "@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "optional": true, + "peer": true + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==" + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==" + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==" + }, + "@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/uuid": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.4.tgz", + "integrity": "sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "azle": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/azle/-/azle-0.20.2.tgz", + "integrity": "sha512-kdAn5nXBNY67SVsToCAPPFMAtm/Cq8LodlOyFM58nxNJnDmjT/zQ+7B+D0eU7NXk8OYRIRRxt8fPSSLiGXzvSw==", + "requires": { + "@dfinity/agent": "^1.0.0", + "@types/uuid": "^9.0.4", + "buffer": "^6.0.3", + "chokidar": "^3.6.0", + "crypto-browserify": "^3.12.0", + "esbuild": "^0.19.3", + "fs-extra": "10.0.1", + "hash-of-directory": "^1.0.1", + "http-message-parser": "^0.0.34", + "js-sha256": "0.9.0", + "net": "^1.0.2", + "text-encoding": "0.7.0", + "ts-node": "10.3.1", + "typescript": "^5.2.2", + "uuid": "^9.0.1" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "ts-node": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.1.tgz", + "integrity": "sha512-Yw3W2mYzhHfCHOICGNJqa0i+rbL0rAyg7ZIHxU+K4pgY8gd2Lh1j+XbHCusJMykbj6RZMJVOY0MlHVd+GOivcw==", + "requires": { + "@cspotcode/source-map-support": "0.7.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", + "yn": "3.1.1" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", + "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "borc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", + "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "requires": { + "bignumber.js": "^9.0.0", + "buffer": "^5.5.0", + "commander": "^2.15.0", + "ieee754": "^1.1.13", + "iso-url": "~0.4.7", + "json-text-sequence": "~0.1.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "requires": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "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" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "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==" + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "delimit-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", + "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "esbuild": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.4.tgz", + "integrity": "sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==", + "requires": { + "@esbuild/android-arm": "0.19.4", + "@esbuild/android-arm64": "0.19.4", + "@esbuild/android-x64": "0.19.4", + "@esbuild/darwin-arm64": "0.19.4", + "@esbuild/darwin-x64": "0.19.4", + "@esbuild/freebsd-arm64": "0.19.4", + "@esbuild/freebsd-x64": "0.19.4", + "@esbuild/linux-arm": "0.19.4", + "@esbuild/linux-arm64": "0.19.4", + "@esbuild/linux-ia32": "0.19.4", + "@esbuild/linux-loong64": "0.19.4", + "@esbuild/linux-mips64el": "0.19.4", + "@esbuild/linux-ppc64": "0.19.4", + "@esbuild/linux-riscv64": "0.19.4", + "@esbuild/linux-s390x": "0.19.4", + "@esbuild/linux-x64": "0.19.4", + "@esbuild/netbsd-x64": "0.19.4", + "@esbuild/openbsd-x64": "0.19.4", + "@esbuild/sunos-x64": "0.19.4", + "@esbuild/win32-arm64": "0.19.4", + "@esbuild/win32-ia32": "0.19.4", + "@esbuild/win32-x64": "0.19.4" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-prop": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/get-prop/-/get-prop-0.0.10.tgz", + "integrity": "sha512-XRSGBgcIisSMLJ/dwe1y/eMm9yzLicEJKmEXA3ArBkDkCW2nyRroLOoKIz+SdxuG5SI7ym2QHaTU5ifCl7MTDg==" + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash-of-directory": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hash-of-directory/-/hash-of-directory-1.0.1.tgz", + "integrity": "sha512-PX6VaxD6JK8R4113ChdTtEnWIo2XA9mz4yrtGBuUGUKtWCj6iWWYj/qwjdfs3Zgm+FdiNj0Vmt4VwPlwxx8WHw==" + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-message-parser": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/http-message-parser/-/http-message-parser-0.0.34.tgz", + "integrity": "sha512-KABKXT347AYvQoaMZg9/K+/GqW6gfB4pKCiTyMUYnosfkdkaBkrXE/cWGSLk5jvD5tiDeLFlYSHLhhPhQKbRrA==", + "requires": { + "buffer": "^4.9.1", + "concat-stream": "^1.5.1", + "get-prop": "0.0.10", + "minimist": "^1.2.0", + "stream-buffers": "^3.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "iso-url": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", + "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==" + }, + "js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, + "json-text-sequence": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", + "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", + "requires": { + "delimit-stream": "0.1.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "net": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", + "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "requires": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "simple-cbor": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", + "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "stream-buffers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", + "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==" + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "@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, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + } + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + }, + "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 + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + } + } +} diff --git a/examples/large_files/package.json b/examples/large_files/package.json new file mode 100644 index 00000000000..4548f45db35 --- /dev/null +++ b/examples/large_files/package.json @@ -0,0 +1,16 @@ +{ + "scripts": { + "pretest": "ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "ts-node --transpile-only --ignore=false test/test.ts" + }, + "dependencies": { + "azle": "0.20.2", + "express": "^4.18.2", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} diff --git a/examples/large_files/src/backend/index.did b/examples/large_files/src/backend/index.did new file mode 100644 index 00000000000..7bf084795e9 --- /dev/null +++ b/examples/large_files/src/backend/index.did @@ -0,0 +1,4 @@ +service: () -> { + http_request: (record {url:text; method:text; body:vec nat8; headers:vec record {text; text}; certificate_version:opt nat16}) -> (record {body:vec nat8; headers:vec record {text; text}; upgrade:opt bool; streaming_strategy:opt variant {Callback:record {token:vec nat8; callback:func (vec nat8) -> (opt record {token:opt vec nat8; body:vec nat8}) query}}; status_code:nat16}) query; + http_request_update: (record {url:text; method:text; body:vec nat8; headers:vec record {text; text}}) -> (record {body:vec nat8; headers:vec record {text; text}; upgrade:opt bool; streaming_strategy:opt variant {Callback:record {token:vec nat8; callback:func (vec nat8) -> (opt record {token:opt vec nat8; body:vec nat8}) query}}; status_code:nat16}); +} diff --git a/examples/large_files/src/backend/index.ts b/examples/large_files/src/backend/index.ts new file mode 100644 index 00000000000..3f0c2a77a7c --- /dev/null +++ b/examples/large_files/src/backend/index.ts @@ -0,0 +1,32 @@ +import { Server } from 'azle'; +import express, { Request } from 'express'; +import { statSync, existsSync } from 'fs'; + +export default Server(() => { + const app = express(); + + app.get('/exists', (req: Request, res) => { + res.send(existsSync(req.query.path)); + }); + + app.get('/size', (req: Request, res) => { + res.json(getFileSize(req.query.path)); + }); + + app.use(express.static('/assets')); + + return app.listen(); +}); + +function getFileSize(path: string): number { + try { + const stats = statSync(path); + if (stats.isFile()) { + return stats.size; + } else { + return 0; + } + } catch (err) { + return 0; + } +} diff --git a/examples/large_files/test/generateTestFiles.ts b/examples/large_files/test/generateTestFiles.ts new file mode 100644 index 00000000000..1df8a9ba44b --- /dev/null +++ b/examples/large_files/test/generateTestFiles.ts @@ -0,0 +1,13 @@ +import { Unit, generateFileOfSize, toBytes } from 'azle/scripts/file_generator'; +import { join } from 'path'; + +export async function generateTestFileOfSize( + size: number, + unit: Unit, + dir: string = 'auto' +) { + const autoDir = join('assets', dir); + const path = join(autoDir, `test${size}${unit}`); + const fileSize = toBytes(size, unit); + await generateFileOfSize(path, fileSize); +} diff --git a/examples/large_files/test/pretest.ts b/examples/large_files/test/pretest.ts new file mode 100644 index 00000000000..d0a7a9ba97c --- /dev/null +++ b/examples/large_files/test/pretest.ts @@ -0,0 +1,35 @@ +import { execSync } from 'child_process'; +import { rm } from 'fs/promises'; +import { join } from 'path'; +import { generateTestFileOfSize } from './generateTestFiles'; + +async function pretest() { + await rm(join('assets', 'auto'), { recursive: true, force: true }); + // Edge Cases + await generateTestFileOfSize(0, 'B'); + await generateTestFileOfSize(1, 'B'); + await generateTestFileOfSize(120 * 1024 * 1024 + 1, 'B'); // One more byte than can be processed in a single hash_file_by_parts call + await generateTestFileOfSize(2_000_000 + 1, 'B'); // One more byte that the message chunk size + + // General Cases + // TODO Add tests for huge files after https://github.com/wasm-forge/stable-fs/issues/2 is resolved + await generateTestFileOfSize(1, 'KiB'); + await generateTestFileOfSize(10, 'KiB'); + await generateTestFileOfSize(100, 'KiB'); + await generateTestFileOfSize(1, 'MiB'); + await generateTestFileOfSize(10, 'MiB'); + await generateTestFileOfSize(100, 'MiB'); + await generateTestFileOfSize(250, 'MiB'); + await generateTestFileOfSize(1, 'GiB'); + await generateTestFileOfSize(150, 'MiB', 'manual'); + + execSync(`dfx canister uninstall-code backend || true`, { + stdio: 'inherit' + }); + + execSync(`dfx deploy`, { + stdio: 'inherit' + }); +} + +pretest(); diff --git a/examples/large_files/test/test.ts b/examples/large_files/test/test.ts new file mode 100644 index 00000000000..c76a4af1f75 --- /dev/null +++ b/examples/large_files/test/test.ts @@ -0,0 +1,7 @@ +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; +import { getTests } from './tests'; + +const canisterId = getCanisterId('backend'); + +runTests(getTests(canisterId)); diff --git a/examples/large_files/test/tests.ts b/examples/large_files/test/tests.ts new file mode 100644 index 00000000000..a61e64bb802 --- /dev/null +++ b/examples/large_files/test/tests.ts @@ -0,0 +1,240 @@ +import * as dns from 'node:dns'; +dns.setDefaultResultOrder('ipv4first'); + +import { Test } from 'azle/test'; +import { generateIdentity, getCanisterId } from 'azle/dfx'; +import { execSync } from 'child_process'; +import { hashFile } from 'azle/scripts/hash_file'; +import { join } from 'path'; +import { rm } from 'fs/promises'; +import { generateTestFileOfSize } from './generateTestFiles'; +import { createActor } from 'azle/src/compiler/file_uploader/uploader_actor'; +import { v4 } from 'uuid'; + +export function getTests(canisterId: string): Test[] { + const origin = `http://${canisterId}.localhost:8000`; + const unauthorizedUser = `test_azle_unauthorized_${v4()}`; + + return [ + { + name: 'Set up unauthorized user', + prep: async () => { + generateIdentity(unauthorizedUser); + } + }, + { + name: 'Unauthorized Upload from actor', + test: async () => { + const destPath = 'assets/unauthorizedAddition'; + const actor = await createActor( + getCanisterId('backend'), + unauthorizedUser + ); + try { + await actor.upload_file_chunk( + destPath, + 0n, + 0n, + Uint8Array.from([1, 2, 3, 4]), + 4n + ); + } catch (err: any) { + return { + Ok: err.message.includes( + 'Not Authorized: must be a controller to call this method' + ) + }; + } + return { Ok: false }; + } + }, + { + name: 'Unauthorized get hash status from actor', + test: async () => { + const actor = await createActor( + getCanisterId('backend'), + unauthorizedUser + ); + try { + await actor.get_hash_status('assets/test0B'); + } catch (err: any) { + return { + Ok: err.message.includes( + 'Not Authorized: must be a controller to call this method' + ) + }; + } + return { Ok: false }; + } + }, + { + name: 'Unauthorized get hash from actor', + test: async () => { + const actor = await createActor( + getCanisterId('backend'), + unauthorizedUser + ); + try { + await actor.get_file_hash('assets/test0B'); + } catch (err: any) { + return { + Ok: err.message.includes( + 'Not Authorized: must be a controller to call this method' + ) + }; + } + return { Ok: false }; + } + }, + { + name: 'Unauthorized clear file and info from actor', + test: async () => { + const actor = await createActor( + getCanisterId('backend'), + unauthorizedUser + ); + try { + await actor.clear_file_and_info('assets/test0B'); + } catch (err: any) { + return { + Ok: err.message.includes( + 'Not Authorized: must be a controller to call this method' + ) + }; + } + return { Ok: false }; + } + }, + // Permanent Assets + generateTest( + origin, + 'photos/people/george-washington.tif', + 'permanent' + ), + generateTest(origin, 'photos/places/dinosaurNM.jpg', 'permanent'), + generateTest(origin, 'photos/places/slc.jpg', 'permanent'), + generateTest(origin, 'photos/things/book.jpg', 'permanent'), + generateTest(origin, 'photos/things/utah-teapot.jpg', 'permanent'), + generateTest( + origin, + 'text/subfolder/deep-sub-folder/deep.txt', + 'permanent' + ), + generateTest( + origin, + 'text/subfolder/sibling-deep-sub-folder/deep.txt', + 'permanent' + ), + generateTest(origin, 'text/subfolder/other-thing.txt', 'permanent'), + generateTest(origin, 'text/thing.txt', 'permanent'), + generateTest(origin, 'text/thing.txt', 'permanent'), + generateTest(origin, 'text/single.txt', undefined, 'single_asset.txt'), + + // Auto Generated Assets + // Edge Cases + generateTest(origin, 'test0B', 'auto'), + generateTest(origin, 'test1B', 'auto'), + generateTest(origin, `test${120 * 1024 * 1024 + 1}B`, 'auto'), + generateTest(origin, 'test2000001B', 'auto'), + // General Cases + generateTest(origin, 'test1KiB', 'auto'), + generateTest(origin, 'test10KiB', 'auto'), + generateTest(origin, 'test100KiB', 'auto'), + generateTest(origin, 'test1MiB', 'auto'), + generateTest(origin, 'test10MiB', 'auto'), + generateTest(origin, 'test100MiB', 'auto'), + generateTest(origin, 'test250MiB', 'auto'), + generateTest(origin, 'test1GiB', 'auto'), + // Manual Upload + { + name: 'test manual upload', + test: async () => { + execSync( + `npx azle upload-assets backend assets/manual/test150MiB assets/test150MiB`, + { + stdio: 'inherit' + } + ); + + const response = await fetch( + `${origin}/exists?path=assets/test150MiB` + ); + + return { Ok: (await response.json()) === true }; + } + }, + generateTest(origin, 'test150MiB', 'manual'), + // TODO CI CD isn't working with the 2GiB tests so we're just going to have this one for local tests. + { + name: 'deploy', + prep: async () => { + await rm(join('assets', 'auto'), { + recursive: true, + force: true + }); + await generateTestFileOfSize(2, 'GiB'); + execSync(`dfx deploy --upgrade-unchanged`, { + stdio: 'inherit' + }); + }, + skip: true + }, + { ...generateTest(origin, 'test2GiB', 'auto'), skip: true } + ]; +} + +/** + * Generate a test for file uploading. Hashes the local file and compares it to + * the hash of the uploaded file. Assumes that all of the files both on the + * canister and local side are in a directory called "assets". The parameter + * localDir allows for difference between the canisterPath and localPath and + * will be inserted between "assets" and the rest of the file path to the local + * asset. If localPath is defined it will be used for the localPath. Otherwise + * it will be assumed that the canisterPath is the same as the localPath. + * @param origin + * @param canisterPath + * @param localDir + * @param localPath + * @returns + */ +function generateTest( + origin: string, + canisterPath: string, + localDir?: string, + localPath?: string +): Test { + return { + name: `upload: ${canisterPath}`, + test: async () => { + const canisterFilePath = join('assets', canisterPath); + const localFilePath = join( + 'assets', + localDir ?? '', + localPath ?? canisterPath + ); + + const expectedHash = (await hashFile(localFilePath)).toString( + 'hex' + ); + + const response = await fetch( + `${origin}/exists?path=${canisterFilePath}` + ); + const exists = await response.json(); + + if (exists === false) { + return { + Err: `File ${canisterFilePath} failed to upload` + }; + } + + const actor = await createActor(getCanisterId('backend')); + const hash = await actor.get_file_hash(canisterFilePath); + + if (hash.length === 1) { + return { Ok: hash[0] === expectedHash }; + } + return { Err: `File not found on canister` }; + } + }; +} diff --git a/examples/large_files/tsconfig.json b/examples/large_files/tsconfig.json new file mode 100644 index 00000000000..0817cb3fc1c --- /dev/null +++ b/examples/large_files/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "strict": true, + "target": "ES2020", + "moduleResolution": "node", + "allowJs": true, + "outDir": "HACK_BECAUSE_OF_ALLOW_JS", + "allowSyntheticDefaultImports": true + } +} diff --git a/examples/ledger_canister/test/pretest.ts b/examples/ledger_canister/test/pretest.ts index 98459c8db3a..7ed9bb509cc 100644 --- a/examples/ledger_canister/test/pretest.ts +++ b/examples/ledger_canister/test/pretest.ts @@ -1,5 +1,5 @@ import { execSync } from 'child_process'; -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; async function pretest(icp_ledger_path: string) { await new Promise((resolve) => setTimeout(resolve, 5000)); diff --git a/examples/ledger_canister/test/test.ts b/examples/ledger_canister/test/test.ts index cc6d31b0549..493f8efdd8c 100644 --- a/examples/ledger_canister/test/test.ts +++ b/examples/ledger_canister/test/test.ts @@ -1,7 +1,8 @@ // TODO write tests for all ICRC functionality // TODO test all errors for query blocks -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/ledger_canister'; import { getTests } from './tests'; diff --git a/examples/list_of_lists/test/test.ts b/examples/list_of_lists/test/test.ts index 6a442869d71..4163ec78752 100644 --- a/examples/list_of_lists/test/test.ts +++ b/examples/list_of_lists/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../dfx_generated/list_of_lists'; import { getTests } from './tests'; diff --git a/examples/management_canister/test/test.ts b/examples/management_canister/test/test.ts index 4c6eda3edb7..6e7a399b2c2 100644 --- a/examples/management_canister/test/test.ts +++ b/examples/management_canister/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/management_canister'; import { getTests } from './tests'; diff --git a/examples/manual_reply/test/test.ts b/examples/manual_reply/test/test.ts index f3e0557cc0c..25b8e770b82 100644 --- a/examples/manual_reply/test/test.ts +++ b/examples/manual_reply/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/manual_reply'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/calc/test/test.ts b/examples/motoko_examples/calc/test/test.ts index bdf202f6099..bb0cd680a71 100644 --- a/examples/motoko_examples/calc/test/test.ts +++ b/examples/motoko_examples/calc/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; // @ts-ignore import { createActor } from './dfx_generated/calc'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/counter/test/test.ts b/examples/motoko_examples/counter/test/test.ts index 4464500e76f..0a3ead0d9f2 100644 --- a/examples/motoko_examples/counter/test/test.ts +++ b/examples/motoko_examples/counter/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; // @ts-ignore import { createActor } from './dfx_generated/counter'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/echo/test/test.ts b/examples/motoko_examples/echo/test/test.ts index f52360d7bd2..fdb7ee62722 100644 --- a/examples/motoko_examples/echo/test/test.ts +++ b/examples/motoko_examples/echo/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; // @ts-ignore import { createActor } from './dfx_generated/echo'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/factorial/test/test.ts b/examples/motoko_examples/factorial/test/test.ts index 8b2976c9447..d1d2d8dd440 100644 --- a/examples/motoko_examples/factorial/test/test.ts +++ b/examples/motoko_examples/factorial/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; // @ts-ignore import { createActor } from './dfx_generated/factorial'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/hello-world/test/test.ts b/examples/motoko_examples/hello-world/test/test.ts index e715b8f2034..e47c831a9f2 100644 --- a/examples/motoko_examples/hello-world/test/test.ts +++ b/examples/motoko_examples/hello-world/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; // @ts-ignore import { createActor } from './dfx_generated/hello_world'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/hello/test/test.ts b/examples/motoko_examples/hello/test/test.ts index 3cf718d89b7..ca609ed1e7e 100644 --- a/examples/motoko_examples/hello/test/test.ts +++ b/examples/motoko_examples/hello/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; // @ts-ignore import { createActor } from '../dfx_generated/hello'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/minimal-counter-dapp/test/test.ts b/examples/motoko_examples/minimal-counter-dapp/test/test.ts index 9c07c62323b..97b7503ea8d 100644 --- a/examples/motoko_examples/minimal-counter-dapp/test/test.ts +++ b/examples/motoko_examples/minimal-counter-dapp/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; // @ts-ignore import { createActor } from '../src/declarations/minimal_dapp'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/persistent-storage/test/test.ts b/examples/motoko_examples/persistent-storage/test/test.ts index a10e92a789a..8b6a104f1e7 100644 --- a/examples/motoko_examples/persistent-storage/test/test.ts +++ b/examples/motoko_examples/persistent-storage/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/persistent_storage'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/phone-book/test/test.ts b/examples/motoko_examples/phone-book/test/test.ts index c8ab7d630da..a621033baca 100644 --- a/examples/motoko_examples/phone-book/test/test.ts +++ b/examples/motoko_examples/phone-book/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../src/declarations/phone_book'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/quicksort/test/test.ts b/examples/motoko_examples/quicksort/test/test.ts index df81a7a00fb..244180d4428 100644 --- a/examples/motoko_examples/quicksort/test/test.ts +++ b/examples/motoko_examples/quicksort/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; // @ts-ignore import { createActor } from './dfx_generated/quicksort'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/simple-to-do/test/test.ts b/examples/motoko_examples/simple-to-do/test/test.ts index b4ad78de67c..85b3ffbb246 100644 --- a/examples/motoko_examples/simple-to-do/test/test.ts +++ b/examples/motoko_examples/simple-to-do/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; // @ts-ignore import { createActor } from './dfx_generated/simple_to_do/'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/superheroes/test/test.ts b/examples/motoko_examples/superheroes/test/test.ts index 1a0cfcfedc2..ffbcf8cafdc 100644 --- a/examples/motoko_examples/superheroes/test/test.ts +++ b/examples/motoko_examples/superheroes/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../src/declarations'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/threshold_ecdsa/test/test.ts b/examples/motoko_examples/threshold_ecdsa/test/test.ts index c5897cdd530..5b28d93822b 100644 --- a/examples/motoko_examples/threshold_ecdsa/test/test.ts +++ b/examples/motoko_examples/threshold_ecdsa/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/threshold_ecdsa/'; import { getTests } from './tests'; diff --git a/examples/motoko_examples/whoami/test/tests.ts b/examples/motoko_examples/whoami/test/tests.ts index e82328a0507..dc36824d97b 100644 --- a/examples/motoko_examples/whoami/test/tests.ts +++ b/examples/motoko_examples/whoami/test/tests.ts @@ -1,4 +1,5 @@ -import { getCanisterId, Test } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { Test } from 'azle/test'; import { _SERVICE } from './dfx_generated/whoami/whoami.did'; import { ActorSubclass } from '@dfinity/agent'; import { execSync } from 'child_process'; diff --git a/examples/notify_raw/test/pretest.ts b/examples/notify_raw/test/pretest.ts index 02fe80485bf..cbdbb524552 100644 --- a/examples/notify_raw/test/pretest.ts +++ b/examples/notify_raw/test/pretest.ts @@ -1,4 +1,4 @@ -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { execSync } from 'child_process'; async function pretest() { diff --git a/examples/notify_raw/test/test.ts b/examples/notify_raw/test/test.ts index 165eb881e87..f986b15a434 100644 --- a/examples/notify_raw/test/test.ts +++ b/examples/notify_raw/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor as createActorCanister1 } from './dfx_generated/canister1'; import { createActor as createActorCanister2 } from './dfx_generated/canister2'; import { getTests } from './tests'; diff --git a/examples/null_example/test/test.ts b/examples/null_example/test/test.ts index 11caf0718b9..cbc9e80f05d 100644 --- a/examples/null_example/test/test.ts +++ b/examples/null_example/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/null_example'; import { getTests } from './tests'; diff --git a/examples/optional_types/test/test.ts b/examples/optional_types/test/test.ts index e2abd70d75c..682815bb1e2 100644 --- a/examples/optional_types/test/test.ts +++ b/examples/optional_types/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/optional_types'; import { getTests } from './tests'; diff --git a/examples/outgoing_http_requests/test/test.ts b/examples/outgoing_http_requests/test/test.ts index e018d18dbc1..ff08bea1790 100644 --- a/examples/outgoing_http_requests/test/test.ts +++ b/examples/outgoing_http_requests/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/outgoing_http_requests'; import { getTests } from './tests'; diff --git a/examples/plugins/test/test.ts b/examples/plugins/test/test.ts index a83e5edbd3f..56e72a1da27 100644 --- a/examples/plugins/test/test.ts +++ b/examples/plugins/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/plugins'; import { getTests } from './tests'; diff --git a/examples/pre_and_post_upgrade/test/test.ts b/examples/pre_and_post_upgrade/test/test.ts index 06ef788c240..470be4a663b 100644 --- a/examples/pre_and_post_upgrade/test/test.ts +++ b/examples/pre_and_post_upgrade/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/pre_and_post_upgrade'; import { getTests } from './tests'; diff --git a/examples/primitive_types/test/test.ts b/examples/primitive_types/test/test.ts index 6987c6213e1..1b876d3df0e 100644 --- a/examples/primitive_types/test/test.ts +++ b/examples/primitive_types/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/primitive_types'; import { getTests } from './tests'; diff --git a/examples/principal/test/test.ts b/examples/principal/test/test.ts index 445f3094891..909dc98e2c2 100644 --- a/examples/principal/test/test.ts +++ b/examples/principal/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/principal'; import { getTests } from './tests'; diff --git a/examples/query/test/test.ts b/examples/query/test/test.ts index 4cd1272e710..affbfb188cd 100644 --- a/examples/query/test/test.ts +++ b/examples/query/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/query'; import { getTests } from './tests'; diff --git a/examples/randomness/test/test.ts b/examples/randomness/test/test.ts index c24949cfab6..a165382122b 100644 --- a/examples/randomness/test/test.ts +++ b/examples/randomness/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/randomness'; import { getTests } from './tests'; diff --git a/examples/recursion/test/pretest.ts b/examples/recursion/test/pretest.ts index 2f2023274f3..8235602acfa 100644 --- a/examples/recursion/test/pretest.ts +++ b/examples/recursion/test/pretest.ts @@ -1,5 +1,5 @@ import { execSync } from 'child_process'; -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; async function pretest() { await new Promise((resolve) => setTimeout(resolve, 5000)); diff --git a/examples/recursion/test/test.ts b/examples/recursion/test/test.ts index 8ff2b98d6e1..668a921142d 100644 --- a/examples/recursion/test/test.ts +++ b/examples/recursion/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; // @ts-ignore import { createActor } from './dfx_generated/recursion'; // @ts-ignore diff --git a/examples/recursion/test/tests.ts b/examples/recursion/test/tests.ts index 1acf8d1d3cf..d62ef551e9b 100644 --- a/examples/recursion/test/tests.ts +++ b/examples/recursion/test/tests.ts @@ -1,4 +1,5 @@ -import { Test, getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { Test } from 'azle/test'; import { _SERVICE, rec_0, diff --git a/examples/rejections/test/pretest.ts b/examples/rejections/test/pretest.ts index 2ae9ad0cb69..9452ef6f1c9 100644 --- a/examples/rejections/test/pretest.ts +++ b/examples/rejections/test/pretest.ts @@ -1,4 +1,4 @@ -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { execSync } from 'child_process'; async function pretest() { diff --git a/examples/rejections/test/test.ts b/examples/rejections/test/test.ts index 1ca22125dfb..b5ca29367d6 100644 --- a/examples/rejections/test/test.ts +++ b/examples/rejections/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { runTests } from 'azle/test'; +import { getCanisterId } from '../../../dfx'; import { createActor } from './dfx_generated/rejections'; import { getTests } from './tests'; diff --git a/examples/robust_imports/test/test.ts b/examples/robust_imports/test/test.ts index 6923e2ab836..e3bc0f89d72 100644 --- a/examples/robust_imports/test/test.ts +++ b/examples/robust_imports/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../dfx_generated/robust_imports'; import { getTests } from './tests'; diff --git a/examples/run_time_errors/test/test.ts b/examples/run_time_errors/test/test.ts index 1005423a03f..74bba00d1c9 100644 --- a/examples/run_time_errors/test/test.ts +++ b/examples/run_time_errors/test/test.ts @@ -1,6 +1,7 @@ // @ts-nocheck -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/run_time_errors'; import { getTests } from './tests'; diff --git a/examples/simple_erc20/test/test.ts b/examples/simple_erc20/test/test.ts index 2672c85d62e..4ef5f42a82f 100644 --- a/examples/simple_erc20/test/test.ts +++ b/examples/simple_erc20/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/simple_erc20'; import { getTests } from './tests'; diff --git a/examples/simple_user_accounts/test/test.ts b/examples/simple_user_accounts/test/test.ts index cecb5b4c35d..a1621230a38 100644 --- a/examples/simple_user_accounts/test/test.ts +++ b/examples/simple_user_accounts/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from '../test/dfx_generated/simple_user_accounts'; import { getTests } from './tests'; diff --git a/examples/sqlite/test/test.ts b/examples/sqlite/test/test.ts index 952feb68376..5fead108f25 100644 --- a/examples/sqlite/test/test.ts +++ b/examples/sqlite/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('sqlite'); diff --git a/examples/stable_b_tree_map_instruction_threshold/test/test.ts b/examples/stable_b_tree_map_instruction_threshold/test/test.ts index 14df77ae18b..1648ba5a631 100644 --- a/examples/stable_b_tree_map_instruction_threshold/test/test.ts +++ b/examples/stable_b_tree_map_instruction_threshold/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/stable_b_tree_map_instruction_threshold'; import { getTests } from './tests'; diff --git a/examples/stable_memory/test/test.ts b/examples/stable_memory/test/test.ts index 3acb9915fa1..def8e127eb4 100644 --- a/examples/stable_memory/test/test.ts +++ b/examples/stable_memory/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/stable_memory'; import { getTests } from './tests'; diff --git a/examples/stable_structures/test/test.ts b/examples/stable_structures/test/test.ts index 9ad08890053..f3755a7bd74 100644 --- a/examples/stable_structures/test/test.ts +++ b/examples/stable_structures/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor as createActorCanister1 } from './dfx_generated/canister1'; import { createActor as createActorCanister2 } from './dfx_generated/canister2'; import { createActor as createActorCanister3 } from './dfx_generated/canister3'; diff --git a/examples/tfjs/test/test.ts b/examples/tfjs/test/test.ts index dc5d4515a72..3473f541a31 100644 --- a/examples/tfjs/test/test.ts +++ b/examples/tfjs/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('api'); diff --git a/examples/timers/test/test.ts b/examples/timers/test/test.ts index 08daba22aee..e394c2b1fc2 100644 --- a/examples/timers/test/test.ts +++ b/examples/timers/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/timers'; import { getTests } from './tests'; diff --git a/examples/tuple_types/test/test.ts b/examples/tuple_types/test/test.ts index e06520f1bf4..d9cfa3bc8e2 100644 --- a/examples/tuple_types/test/test.ts +++ b/examples/tuple_types/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/tuple_types'; import { getTests } from './tests'; diff --git a/examples/update/test/test.ts b/examples/update/test/test.ts index e5465d9bee7..e1878571dbb 100644 --- a/examples/update/test/test.ts +++ b/examples/update/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { createActor } from './dfx_generated/update'; import { getTests } from './tests'; diff --git a/examples/vanilla_js/test/test.ts b/examples/vanilla_js/test/test.ts index a9abb5a012a..d620e087495 100644 --- a/examples/vanilla_js/test/test.ts +++ b/examples/vanilla_js/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import { createActor } from '../test/dfx_generated/vanilla_js'; import { getTests } from './tests'; diff --git a/examples/web_assembly/test/test.ts b/examples/web_assembly/test/test.ts index 94a685c3f98..e0270ea6b52 100644 --- a/examples/web_assembly/test/test.ts +++ b/examples/web_assembly/test/test.ts @@ -1,4 +1,5 @@ -import { getCanisterId, runTests } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; +import { runTests } from 'azle/test'; import { getTests } from './tests'; const canisterId = getCanisterId('web_assembly'); diff --git a/package-lock.json b/package-lock.json index 3008cca0522..379704f4c03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "0.20.2", "license": "MIT", "dependencies": { - "@dfinity/agent": "^1.0.0", + "@dfinity/agent": "^1.1.0", + "@dfinity/identity-secp256k1": "^1.1.0", "@types/uuid": "^9.0.4", "buffer": "^6.0.3", "chokidar": "^3.6.0", @@ -78,9 +79,9 @@ } }, "node_modules/@dfinity/agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-1.0.0.tgz", - "integrity": "sha512-PdU3uDEacgAZUJTAlwqGkXjFT74u+BSiD7G6fk0QR/iIc6ynsws7nEf7PbNYhZVaf0e3IYrltk4d1XkOHP3KCw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-1.1.0.tgz", + "integrity": "sha512-ISf9rtlSQIrlCSgw/wZgBjDo9tIISukL3RgmaK1+0KFF172uW5R5YLyQKmDnueOqRrZlZ3O031DxsO3bxLsPVw==", "dependencies": { "@noble/curves": "^1.2.0", "@noble/hashes": "^1.3.1", @@ -90,23 +91,37 @@ "simple-cbor": "^0.4.1" }, "peerDependencies": { - "@dfinity/candid": "^1.0.0", - "@dfinity/principal": "^1.0.0" + "@dfinity/candid": "^1.1.0", + "@dfinity/principal": "^1.1.0" } }, "node_modules/@dfinity/candid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-1.0.0.tgz", - "integrity": "sha512-xZss8Q+oZT3xptBkTskeXCRIC5HiC8VTxWNEK/U9vyZQmzcwVqAxu+mlLwMKeDFzHw6lo8cqIY6r8BCE6APs1g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-1.1.0.tgz", + "integrity": "sha512-NnhTcOH3eKHj40WltgUwKjNU/WasVeDy0CSAt/TcIjuaUCDI+7BV40ifOG+8DWt/284R9JmtIOCWuN2H6CoeRQ==", "peer": true, "peerDependencies": { - "@dfinity/principal": "^1.0.0" + "@dfinity/principal": "^1.1.0" + } + }, + "node_modules/@dfinity/identity-secp256k1": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@dfinity/identity-secp256k1/-/identity-secp256k1-1.1.0.tgz", + "integrity": "sha512-zVSJYvILKmAcbi81L1esUUs15C0ncl5GD6YsjlHcsr9mtQgS187198PsuuzXXtB2T2uzmz2hTr/k7541UvexSg==", + "dependencies": { + "@dfinity/agent": "^1.1.0", + "@noble/curves": "^1.3.0", + "@noble/hashes": "^1.3.1", + "asn1js": "^3.0.5", + "bip39": "^3.1.0", + "bs58check": "^3.0.1", + "hdkey": "^2.1.0" } }, "node_modules/@dfinity/principal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-1.0.0.tgz", - "integrity": "sha512-lLX/EcrFbmyY/C1kDZhDeN3ebyG4PmBo8OkWP1hwpnp0BxAhv+5BEuFmK+PhH1T7tf6dtzmXOc5abWnPkzFbHQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-1.1.0.tgz", + "integrity": "sha512-+In7j19bwGtqsF5YrABZBn/DuZD9FRqPPViIIwrkttd6PeVwqKmW2lcMLGymjxUNLbnuZIbluLQnV78YYChLPg==", "peer": true, "dependencies": { "@noble/hashes": "^1.3.1" @@ -939,6 +954,19 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/asn1js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", + "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", + "dependencies": { + "pvtsutils": "^1.3.2", + "pvutils": "^1.1.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -966,6 +994,11 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, "node_modules/base64-arraybuffer": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", @@ -1009,6 +1042,14 @@ "node": ">=8" } }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -1147,6 +1188,23 @@ "node": ">= 4" } }, + "node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/bs58check": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" + } + }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -2277,6 +2335,43 @@ "node": ">= 0.4" } }, + "node_modules/hdkey": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-2.1.0.tgz", + "integrity": "sha512-i9Wzi0Dy49bNS4tXXeGeu0vIcn86xXdPQUpEYg+SO1YiO8HtomjmmRMaRyqL0r59QfcD4PfVbSF3qmsWFwAemA==", + "dependencies": { + "bs58check": "^2.1.2", + "ripemd160": "^2.0.2", + "safe-buffer": "^5.1.1", + "secp256k1": "^4.0.0" + } + }, + "node_modules/hdkey/node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/hdkey/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/hdkey/node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3176,6 +3271,21 @@ "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3461,6 +3571,22 @@ } ] }, + "node_modules/pvtsutils": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.5.tgz", + "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", + "dependencies": { + "tslib": "^2.6.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", + "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -3616,6 +3742,20 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/set-function-length": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", @@ -3929,8 +4069,7 @@ "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/type-check": { "version": "0.4.0", diff --git a/package.json b/package.json index 923f68d7549..072051dca44 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ }, "homepage": "https://github.com/demergent-labs/azle#readme", "dependencies": { - "@dfinity/agent": "^1.0.0", + "@dfinity/agent": "^1.1.0", + "@dfinity/identity-secp256k1": "^1.1.0", "@types/uuid": "^9.0.4", "buffer": "^6.0.3", "chokidar": "^3.6.0", diff --git a/property_tests/get_actor.ts b/property_tests/get_actor.ts index 89480f09278..3579eaafeb3 100644 --- a/property_tests/get_actor.ts +++ b/property_tests/get_actor.ts @@ -1,4 +1,4 @@ -import { getCanisterId } from '../test'; +import { getCanisterId } from '../dfx'; export function getActor(parentDir: string) { const resolvedPathIndex = require.resolve( diff --git a/property_tests/tests/canister_methods/http_request/test/fletch.ts b/property_tests/tests/canister_methods/http_request/test/fletch.ts index 83d0beb5c7b..4806dadcbd3 100644 --- a/property_tests/tests/canister_methods/http_request/test/fletch.ts +++ b/property_tests/tests/canister_methods/http_request/test/fletch.ts @@ -1,6 +1,6 @@ import { execSync } from 'child_process'; import { HttpRequest } from 'azle'; -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import * as dns from 'node:dns'; dns.setDefaultResultOrder('ipv4first'); diff --git a/property_tests/tests/canister_methods/http_request_update/test/fletch.ts b/property_tests/tests/canister_methods/http_request_update/test/fletch.ts index 83d0beb5c7b..4806dadcbd3 100644 --- a/property_tests/tests/canister_methods/http_request_update/test/fletch.ts +++ b/property_tests/tests/canister_methods/http_request_update/test/fletch.ts @@ -1,6 +1,6 @@ import { execSync } from 'child_process'; import { HttpRequest } from 'azle'; -import { getCanisterId } from 'azle/test'; +import { getCanisterId } from 'azle/dfx'; import * as dns from 'node:dns'; dns.setDefaultResultOrder('ipv4first'); diff --git a/scripts/file_generator/bin.js b/scripts/file_generator/bin.js new file mode 100755 index 00000000000..d2cd03050fc --- /dev/null +++ b/scripts/file_generator/bin.js @@ -0,0 +1,11 @@ +#!/usr/bin/env node + +require('ts-node').register({ + transpileOnly: true, + ignore: [`node_modules/(?!azle)`], + compilerOptions: { + module: 'commonjs', + allowJs: true + } +}); +require('./main.ts'); diff --git a/scripts/file_generator/index.ts b/scripts/file_generator/index.ts new file mode 100644 index 00000000000..754d19070be --- /dev/null +++ b/scripts/file_generator/index.ts @@ -0,0 +1,53 @@ +import { appendFile, mkdir, writeFile } from 'fs/promises'; +import { dirname } from 'path'; + +export type Unit = 'B' | 'KiB' | 'MiB' | 'GiB'; + +// Function to create a file of a specific size in bytes +export async function generateFileOfSize(path: string, sizeInBytes: number) { + await ensureDirectoryExists(path); + await ensureFileEmptyOrCreate(path); + await fillFileWithRandomBytes(path, sizeInBytes); + + console.info(`File created ${path}: ${sizeInBytes} bytes`); +} + +export function toBytes(numBytes: number, unit: Unit): number { + if (unit === 'B') { + return numBytes; + } else if (unit === 'KiB') { + return numBytes * 1024; + } else if (unit === 'MiB') { + return numBytes * 1024 * 1024; + } else if (unit === 'GiB') { + return numBytes * 1024 * 1024 * 1024; + } + throw new Error('Invalid Unit. Must be B, KiB, MiB, or GiB'); +} + +async function ensureDirectoryExists(path: string) { + await mkdir(dirname(path), { recursive: true }); +} + +async function ensureFileEmptyOrCreate(path: string) { + await writeFile(path, Buffer.from([])); +} + +async function fillFileWithRandomBytes(path: string, sizeInBytes: number) { + const defaultChunkSize = 1024 * 1024; // 1 MiB. Size can be adjusted. By trial and error this gave good speeds and 1MB should be small enough for most machines running this to handle + const totalChunks = Math.ceil(sizeInBytes / defaultChunkSize); + for (let i = 0; i < totalChunks; i++) { + const remainingBytes = sizeInBytes - i * defaultChunkSize; + const chunkSize = Math.min(remainingBytes, defaultChunkSize); + const randomBytes = await createRandomBytes(chunkSize); + await appendFile(path, randomBytes); + } +} + +function createRandomBytes(size: number): Buffer { + let buffer = Buffer.alloc(size); + for (let byte = 0; byte < size; byte++) { + buffer[byte] = Math.floor(Math.random() * 256); // Generate random byte value (0-255) + } + return buffer; +} diff --git a/scripts/file_generator/main.ts b/scripts/file_generator/main.ts new file mode 100644 index 00000000000..4a1a0bad199 --- /dev/null +++ b/scripts/file_generator/main.ts @@ -0,0 +1,55 @@ +import { generateFileOfSize, toBytes } from '.'; + +async function main() { + const { path, sizeInBytes } = parseArgs(); + + await generateFileOfSize(path, sizeInBytes); + console.info(`File '${path}' created with size ${sizeInBytes} bytes.`); +} + +main(); + +function parseArgs(): { path: string; sizeInBytes: number } { + const args = process.argv.slice(2); + if (args.length !== 2) { + console.error('Usage: node file_generator/bin.js '); + process.exit(1); + } + + const path = args[0]; + const sizeString = args[1]; + const sizeInBytes = parseSize(sizeString); + + // Check if size is a valid number + if (isNaN(sizeInBytes) || sizeInBytes < 0) { + console.error( + 'Invalid size. Please provide a positive integer for size or use a valid unit (B, KB, MB, GB).' + ); + process.exit(1); + } + + return { path, sizeInBytes }; +} + +// Parse size from string with optional unit suffix (KB, MB, GB) +function parseSize(sizeString: string) { + const sizeRegex = /^(\d+(?:\.\d+)?)([kmgb]?)$/i; + const match = sizeString.match(sizeRegex); + if (!match) { + throw new Error( + 'Invalid size format. Please use format like 1, 1024B, 1.5K, 3M, 2G. If not units are provided bytes is assumed' + ); + } + + const size = parseFloat(match[1]); + const unit = match[2].toLowerCase(); + switch (unit) { + case 'k': + return toBytes(size, 'KiB'); + case 'm': + return toBytes(size, 'MiB'); + case 'g': + return toBytes(size, 'GiB'); + } + return size; +} diff --git a/scripts/hash_file/bin.js b/scripts/hash_file/bin.js new file mode 100755 index 00000000000..d2cd03050fc --- /dev/null +++ b/scripts/hash_file/bin.js @@ -0,0 +1,11 @@ +#!/usr/bin/env node + +require('ts-node').register({ + transpileOnly: true, + ignore: [`node_modules/(?!azle)`], + compilerOptions: { + module: 'commonjs', + allowJs: true + } +}); +require('./main.ts'); diff --git a/scripts/hash_file/index.ts b/scripts/hash_file/index.ts new file mode 100644 index 00000000000..e7b10aba006 --- /dev/null +++ b/scripts/hash_file/index.ts @@ -0,0 +1,52 @@ +import { createHash } from 'crypto'; +import { open, FileReadResult } from 'fs/promises'; + +export async function hashFile(path: string): Promise { + return await hashFileByParts(path, 0); +} + +async function hashFileByParts( + path: string, + position: number, + previousHash?: Buffer +): Promise { + const { buffer, bytesRead } = await getBytesToHash(path, position); + + if (bytesRead !== 0) { + const newHash = hashChunkWith(buffer, previousHash); + return hashFileByParts(path, position + bytesRead, newHash); + } else { + // No more bytes to hash, set as final hash for this file + if (previousHash !== undefined) { + return previousHash; + } else { + // No bytes read and no previous hash means 0 byte file + return hashChunkWith(Buffer.from([])); + } + } +} + +async function getBytesToHash( + path: string, + position: number +): Promise> { + const file = await open(path, 'r'); + + // Read the bytes + // TODO it would be great to get the size of the chunks from the canister, then we wouldn't have to every update this + const limit = 120 * 1024 * 1024; // Must be the same as on the canister end or hashes will not match + let buffer = Buffer.alloc(limit); // Allocate a Buffer for reading + + const fileReadResult = await file.read(buffer, 0, limit, position); + file.close(); + return fileReadResult; +} + +function hashChunkWith(data: Buffer, previousHash?: Buffer): Buffer { + const h = createHash('sha256'); + h.update(data); + if (previousHash !== undefined) { + h.update(previousHash); + } + return h.digest(); +} diff --git a/scripts/hash_file/main.ts b/scripts/hash_file/main.ts new file mode 100644 index 00000000000..27b44e56f28 --- /dev/null +++ b/scripts/hash_file/main.ts @@ -0,0 +1,10 @@ +import { hashFile } from '.'; + +async function main() { + const args = process.argv.slice(2); + const filePath = args[0]; + const fileHash = await hashFile(filePath); + console.info(fileHash.toString('hex')); +} + +main(); diff --git a/src/compiler/file_uploader/bytes_to_human_readable.ts b/src/compiler/file_uploader/bytes_to_human_readable.ts new file mode 100644 index 00000000000..0c8901953e8 --- /dev/null +++ b/src/compiler/file_uploader/bytes_to_human_readable.ts @@ -0,0 +1,25 @@ +export function bytesToHumanReadable(sizeInBytes: number): string { + const suffixes = ['B', 'KiB', 'MiB', 'GiB']; + + const result = suffixes.reduce( + (acc, suffix) => { + if (acc.done) { + return acc; + } + if (acc.size < 1024.0) { + return { + ...acc, + unit: suffix, + done: true + }; + } + return { + ...acc, + size: acc.size / 1024.0 + }; + }, + { size: sizeInBytes, unit: '', done: false } + ); + + return `${result.size.toFixed(2)} ${result.unit}`; +} diff --git a/src/compiler/file_uploader/expand_paths.ts b/src/compiler/file_uploader/expand_paths.ts new file mode 100644 index 00000000000..acf153ebee9 --- /dev/null +++ b/src/compiler/file_uploader/expand_paths.ts @@ -0,0 +1,45 @@ +import { readdir, stat } from 'fs/promises'; +import { join } from 'path'; +import { Src, Dest } from '.'; + +export async function expandPaths(paths: [Src, Dest][]) { + return paths.reduce( + async (accPromise: Promise<[Src, Dest][]>, [srcPath, destPath]) => { + const acc = await accPromise; + return [...acc, ...(await expandPath(srcPath, destPath))]; + }, + Promise.resolve([]) + ); +} + +async function expandPath( + srcPath: Src, + destPath: Dest +): Promise<[Src, Dest][]> { + const stats = await stat(srcPath); + if (stats.isDirectory()) { + return await expandDirectory(srcPath, destPath); + } else { + return [[srcPath, destPath]]; + } +} + +async function expandDirectory( + srcDir: string, + destDir: string +): Promise<[Src, Dest][]> { + try { + const contents = await readdir(srcDir); + return contents.reduce( + async (accPromise: Promise<[Src, Dest][]>, name) => { + const acc = await accPromise; + const srcPath = join(srcDir, name); + const destPath = join(destDir, name); + return [...acc, ...(await expandPath(srcPath, destPath))]; + }, + Promise.resolve([]) + ); + } catch (error) { + throw new Error(`Error reading directory: ${error}`); + } +} diff --git a/src/compiler/file_uploader/get_files_to_upload.ts b/src/compiler/file_uploader/get_files_to_upload.ts new file mode 100644 index 00000000000..994060a9ac4 --- /dev/null +++ b/src/compiler/file_uploader/get_files_to_upload.ts @@ -0,0 +1,20 @@ +import { getCanisterConfig } from '../utils/get_canister_config'; +import { unwrap } from '../utils/result'; + +export function getFilesToUpload( + canisterName: string, + srcPath?: string, + destPath?: string +): [string, string][] { + if (srcPath !== undefined && destPath !== undefined) { + return [[srcPath, destPath]]; + } + if (srcPath === undefined && destPath === undefined) { + // If both paths are undefined, look at the dfx.json for the assets to upload + const dfxJson = unwrap(getCanisterConfig(canisterName)); + return dfxJson.assets_large ?? []; + } + throw new Error( + 'The source path and destination path must be either both defined or both undefined' + ); +} diff --git a/src/compiler/file_uploader/incomplete_files.ts b/src/compiler/file_uploader/incomplete_files.ts new file mode 100644 index 00000000000..f5f50ca6b00 --- /dev/null +++ b/src/compiler/file_uploader/incomplete_files.ts @@ -0,0 +1,25 @@ +import { Src, Dest } from '.'; +import { filterAsync } from '../utils/filter_async'; +import { UploaderActor } from './uploader_actor'; + +export async function getListOfIncompleteFiles( + paths: [Src, Dest][], + actor: UploaderActor +): Promise<[Src, Dest][]> { + return filterAsync( + paths, + async ([_, path]) => !(await hasValidHash(path, actor)) + ); +} + +async function hasValidHash( + path: string, + actor: UploaderActor +): Promise { + try { + const hashOption = await actor.get_file_hash(path); + return hashOption.length === 1; + } catch { + return false; + } +} diff --git a/src/compiler/file_uploader/index.ts b/src/compiler/file_uploader/index.ts new file mode 100644 index 00000000000..75109bab10e --- /dev/null +++ b/src/compiler/file_uploader/index.ts @@ -0,0 +1,28 @@ +import { getCanisterId } from '../../../dfx'; +import { expandPaths } from './expand_paths'; +import { uploadFile } from './upload_file'; +import { onBeforeExit } from './on_before_exit'; +import { createActor } from './uploader_actor'; + +export type Src = string; +export type Dest = string; + +export async function uploadFiles(canisterName: string, paths: [Src, Dest][]) { + const canisterId = getCanisterId(canisterName); + const actor = await createActor(canisterId); + + const chunkSize = 2_000_000; // The current message limit is about 2 MB + + const expandedPaths = await expandPaths(paths); + + for (const [srcPath, destPath] of expandedPaths) { + // Await each upload so the canister doesn't get overwhelmed by requests + await uploadFile(srcPath, destPath, chunkSize, actor); + } + + console.info( + 'Finished uploading files. Waiting for file hashing to finish...' + ); + + onBeforeExit(expandedPaths, actor); +} diff --git a/src/compiler/file_uploader/on_before_exit.ts b/src/compiler/file_uploader/on_before_exit.ts new file mode 100644 index 00000000000..bf798eec254 --- /dev/null +++ b/src/compiler/file_uploader/on_before_exit.ts @@ -0,0 +1,48 @@ +import { Dest, Src } from '.'; +import { getListOfIncompleteFiles } from './incomplete_files'; +import { OngoingHashingJob, getOngoingHashingJobs } from './ongoing_hashes'; +import { UploaderActor } from './uploader_actor'; + +export function onBeforeExit(paths: [Src, Dest][], actor: UploaderActor) { + let hashingComplete = false; + let cleanUpComplete = false; + let ongoingHashingJobs: OngoingHashingJob[] = []; + + process.on('beforeExit', async () => { + if (cleanUpComplete) { + // If any async behavior happens in 'beforeExit' then 'beforeExit' + // will run again. This is need to prevent an infinite loop. + // Once clean up is complete we are ready to exit + console.log('File hashing finished'); + return; + } + + if (hashingComplete) { + await cleanup(paths, actor); + cleanUpComplete = true; + return; + } + + ongoingHashingJobs = await getOngoingHashingJobs( + paths, + ongoingHashingJobs, + actor + ); + + hashingComplete = ongoingHashingJobs.length === 0; + + if (!hashingComplete) { + console.info( + `Waiting 5 seconds before checking hashing status again...` + ); + await new Promise((resolve) => setTimeout(resolve, 5000)); + } + }); +} + +async function cleanup(paths: [Src, Dest][], actor: UploaderActor) { + const incompleteFiles = await getListOfIncompleteFiles(paths, actor); + for (const [_, path] of incompleteFiles) { + await actor.clear_file_and_info(path); + } +} diff --git a/src/compiler/file_uploader/ongoing_hashes.ts b/src/compiler/file_uploader/ongoing_hashes.ts new file mode 100644 index 00000000000..6374e9b8f02 --- /dev/null +++ b/src/compiler/file_uploader/ongoing_hashes.ts @@ -0,0 +1,166 @@ +import { Dest, Src } from '.'; +import { getListOfIncompleteFiles } from './incomplete_files'; +import { UploaderActor } from './uploader_actor'; + +export type OngoingHashingJob = { + path: string; + bytesHashed: bigint; + totalBytes: bigint; + triesSinceLastChange: number; +}; + +type AmountComplete = bigint; +type Total = bigint; +type HashStatus = [AmountComplete, Total]; +type HashStatuses = { [path: string]: HashStatus }; + +export async function getOngoingHashingJobs( + paths: [Src, Dest][], + previouslyOngoingJobs: OngoingHashingJob[], + actor: UploaderActor +): Promise { + const incompleteFiles = await getListOfIncompleteFiles(paths, actor); + + if (incompleteFiles.length === 0) { + return []; + } + + const incompleteDestPaths = incompleteFiles.map( + ([_, destPath]) => destPath + ); + + const incompleteHashingJobs = await updateOngoingHashingJobs( + previouslyOngoingJobs, + incompleteDestPaths, + actor + ); + + const isHashingStalled = incompleteHashingJobs.every( + // If the hash hasn't progressed in the last 5 tries it is considered failed instead of ongoing + (fileInfo) => fileInfo.triesSinceLastChange >= 5 + ); + + if (isHashingStalled) { + // At the point jobs are considered incomplete instead of ongoing. There + // are no ongoing jobs to report + reportIncompleteHashingJobs(incompleteFiles); + return []; + } + + reportOngoingHashingJobs(incompleteHashingJobs); + + return incompleteHashingJobs; +} + +async function updateOngoingHashingJobs( + previouslyOngoingJobs: OngoingHashingJob[], + incompletePaths: string[], + actor: UploaderActor +): Promise { + const latestHashStatuses = await getHashStatuses(incompletePaths, actor); + const previouslyOngoingHashingJobs = initializePreviousJobsIfNeeded( + previouslyOngoingJobs, + latestHashStatuses, + incompletePaths + ); + + return previouslyOngoingHashingJobs.map((hashInfo): OngoingHashingJob => { + const newBytesHashed = latestHashStatuses[hashInfo.path][0]; + if (hashInfo.bytesHashed === newBytesHashed) { + return incrementTries(hashInfo); + } else { + return updateBytes(hashInfo, newBytesHashed); + } + }); +} + +function incrementTries(hashJob: OngoingHashingJob): OngoingHashingJob { + return { + ...hashJob, + triesSinceLastChange: hashJob.triesSinceLastChange + 1 + }; +} + +function updateBytes( + hashJob: OngoingHashingJob, + newBytesHashed: bigint +): OngoingHashingJob { + return { + ...hashJob, + bytesHashed: newBytesHashed, + triesSinceLastChange: 0 + }; +} + +function reportOngoingHashingJobs(ongoingHashInfo: OngoingHashingJob[]) { + for (const hashInfo of ongoingHashInfo) { + const percent = + (Number(hashInfo.bytesHashed) / Number(hashInfo.totalBytes)) * 100; + console.info(`${hashInfo.path} at ${percent.toFixed(2)}% hashed`); + } + console.info(); +} + +function reportIncompleteHashingJobs(paths: [Src, Dest][]) { + console.info( + `Missing hashes for ${paths.length} files:\n${paths.join('\n')}.` + ); +} + +function initializePreviousJobsIfNeeded( + previousHashInfos: OngoingHashingJob[], + hashStatuses: HashStatuses, + incompletePaths: string[] +): OngoingHashingJob[] { + return previousHashInfos.length > 0 + ? previousHashInfos.filter((hashInfo) => + incompletePaths.includes(hashInfo.path) + ) + : incompletePaths.map((path): OngoingHashingJob => { + return { + path, + triesSinceLastChange: 0, + bytesHashed: hashStatuses[path][0], + totalBytes: hashStatuses[path][1] + }; + }); +} + +async function getHashStatuses( + incompleteFiles: string[], + actor: UploaderActor +): Promise { + return await incompleteFiles.reduce( + async ( + accPromise: Promise, + path + ): Promise => { + const acc = await accPromise; + return { ...acc, [path]: await getHashStatus(path, actor) }; + }, + Promise.resolve({}) + ); +} + +/** + * Returns a tuple with the amount complete at index 0 and the total files size + * at index 1 + * + * This is only meant to be used for status updates. The true test for if a hash + * is complete is to get the hash. + * + * @param canisterId The ID of the canister containing the file + * @param path The path to the file + * @returns a tuple with the amount complete and the total file size + */ +async function getHashStatus( + path: string, + actor: UploaderActor +): Promise<[AmountComplete, Total]> { + const result = await actor.get_hash_status(path); + if (result.length === 0) { + // Files doesn't exist + return [0n, 0n]; + } + return result[0]; +} diff --git a/src/compiler/file_uploader/upload_file.ts b/src/compiler/file_uploader/upload_file.ts new file mode 100644 index 00000000000..d69ba88aa2c --- /dev/null +++ b/src/compiler/file_uploader/upload_file.ts @@ -0,0 +1,71 @@ +import { stat, open } from 'fs/promises'; +import { Dest, Src } from '.'; +import { bytesToHumanReadable } from './bytes_to_human_readable'; +import { UploaderActor } from './uploader_actor'; + +export async function uploadFile( + srcPath: Src, + destPath: Dest, + chunkSize: number, + actor: UploaderActor +) { + const uploadStartTime = process.hrtime.bigint(); + const fileSize = (await stat(srcPath)).size; + const file = await open(srcPath, 'r'); + for (let startIndex = 0; startIndex <= fileSize; startIndex += chunkSize) { + let buffer = Buffer.alloc(chunkSize); + const { buffer: bytesToUpload, bytesRead } = await file.read( + buffer, + 0, + chunkSize, + startIndex + ); + + await throttle(); + const percentComplete = calculatePercentComplete( + startIndex + bytesRead, + fileSize + ); + console.info( + `Uploading chunk: ${srcPath} | ${bytesToHumanReadable( + startIndex + bytesRead + )}/${bytesToHumanReadable(fileSize)} : ${percentComplete.toFixed( + 2 + )}%` + ); + // Don't await here! Awaiting the agent will result in about a 4x increase in upload time. + // The above throttling is sufficient to manage the speed of uploads + actor + .upload_file_chunk( + destPath, + uploadStartTime, + BigInt(startIndex), + bytesToUpload.subarray(0, bytesRead), + BigInt(fileSize) + ) + .catch((error) => { + console.error(error); + }); + } + file.close(); + console.info(); +} + +async function throttle() { + // We can only process about 4Mib per second. So if chunks are about + // 2 MiB or less then we can only send off two per second. + if (process.env.DFX_NETWORK === 'ic') { + await new Promise((resolve) => setTimeout(resolve, 2_000)); // Mainnet requires more throttling. We found 2_000 by trial and error + } else { + await new Promise((resolve) => setTimeout(resolve, 500)); // Should be 500 (ie 1 every 1/2 second or 2 every second) + } +} +function calculatePercentComplete( + bytesComplete: number, + fileSize: number +): number { + if (bytesComplete === 0 && fileSize === 0) { + return 100; + } + return (bytesComplete / Math.max(fileSize, 1)) * 100; +} diff --git a/src/compiler/file_uploader/uploader_actor.ts b/src/compiler/file_uploader/uploader_actor.ts new file mode 100644 index 00000000000..c1bb40ddbee --- /dev/null +++ b/src/compiler/file_uploader/uploader_actor.ts @@ -0,0 +1,50 @@ +import { Actor, ActorMethod, ActorSubclass } from '@dfinity/agent'; +import { createAuthenticatedAgent } from '../../../dfx'; + +export type UploaderActor = ActorSubclass<_SERVICE>; + +export async function createActor( + canisterId: string, + identityName?: string +): Promise { + const agent = await createAuthenticatedAgent(identityName); + + return Actor.createActor<_SERVICE>( + ({ IDL }) => { + return IDL.Service({ + clear_file_and_info: IDL.Func([IDL.Text], [], []), + get_file_hash: IDL.Func([IDL.Text], [IDL.Opt(IDL.Text)], []), + get_hash_status: IDL.Func( + [IDL.Text], + [IDL.Opt(IDL.Tuple(IDL.Nat64, IDL.Nat64))], + [] + ), + upload_file_chunk: IDL.Func( + [ + IDL.Text, + IDL.Nat64, + IDL.Nat64, + IDL.Vec(IDL.Nat8), + IDL.Nat64 + ], + [], + [] + ) + }); + }, + { + agent, + canisterId + } + ); +} + +interface _SERVICE { + clear_file_and_info: ActorMethod<[string], void>; + get_file_hash: ActorMethod<[string], [] | [string]>; + get_hash_status: ActorMethod<[string], [] | [[bigint, bigint]]>; + upload_file_chunk: ActorMethod< + [string, bigint, bigint, Uint8Array, bigint], + void + >; +} diff --git a/src/compiler/file_watcher/file_watcher.ts b/src/compiler/file_watcher/file_watcher.ts index 610e27c3240..48de44e4a09 100644 --- a/src/compiler/file_watcher/file_watcher.ts +++ b/src/compiler/file_watcher/file_watcher.ts @@ -4,6 +4,7 @@ import { readFileSync, writeFileSync } from 'fs'; import { getCanisterJavaScript } from '../get_canister_javascript'; import { ok } from '../utils/result'; +import { createAuthenticatedAgent } from '../../../dfx'; const reloadedJsPath = process.argv[2]; const canisterId = process.argv[3]; @@ -59,13 +60,7 @@ async function reloadJs( writeFileSync(reloadedJsPath, canisterJavaScriptResult.ok); - const agent = new HttpAgent({ - host: `http://127.0.0.1:${replicaWebServerPort}` - }); - - if (process.env.DFX_NETWORK !== 'ic') { - await agent.fetchRootKey(); - } + const agent = await createAuthenticatedAgent(); const actor = Actor.createActor( ({ IDL }) => { diff --git a/src/compiler/get_names.ts b/src/compiler/get_names.ts index 91d9b604ac6..499247a938b 100644 --- a/src/compiler/get_names.ts +++ b/src/compiler/get_names.ts @@ -12,6 +12,7 @@ import { } from './utils'; import { GLOBAL_AZLE_CONFIG_DIR } from './utils/global_paths'; import { JSCanisterConfig } from './utils/types'; +import { getCanisterId } from '../../dfx'; export async function getNamesBeforeCli() { const stdioType = getStdIoType(); @@ -84,9 +85,7 @@ export function getNamesAfterCli() { const rustStagingWasmPath = join(canisterPath, `${canisterName}.wasm`); - const canisterId = execSync(`dfx canister id ${canisterName}`) - .toString() - .trim(); + const canisterId = getCanisterId(canisterName); const reloadedJsPath = join( '.azle', diff --git a/src/compiler/handle_cli.ts b/src/compiler/handle_cli.ts index 15ef7ca946f..33bd9bb24c7 100644 --- a/src/compiler/handle_cli.ts +++ b/src/compiler/handle_cli.ts @@ -4,6 +4,8 @@ import { rmSync } from 'fs'; import { generateNewAzleProject } from './new_command'; import { version as azleVersion } from '../../package.json'; import { GLOBAL_AZLE_CONFIG_DIR } from './utils/global_paths'; +import { uploadFiles } from './file_uploader'; +import { getFilesToUpload } from './file_uploader/get_files_to_upload'; export function handleCli( stdioType: IOType, @@ -31,6 +33,12 @@ export function handleCli( return true; } + if (commandName === 'upload-assets') { + handleUploadAssets(); + + return true; + } + if (commandName === '--version') { handleVersionCommand(); @@ -97,6 +105,14 @@ function handleCommandClean( console.info(`azle images removed`); } +async function handleUploadAssets() { + const canisterName = process.argv[3]; + const srcPath = process.argv[4]; + const destPath = process.argv[5]; + const filesToUpload = getFilesToUpload(canisterName, srcPath, destPath); + await uploadFiles(canisterName, filesToUpload); +} + function handleVersionCommand() { console.info(azleVersion); } diff --git a/src/compiler/rust/canister/Cargo.toml b/src/compiler/rust/canister/Cargo.toml index 2224d0536d1..fd8beb697ca 100644 --- a/src/compiler/rust/canister/Cargo.toml +++ b/src/compiler/rust/canister/Cargo.toml @@ -18,9 +18,11 @@ canister_methods = { path = "../canister_methods" } include_dir = "0.7.3" slotmap = "=1.0.6" wasmi = "0.31.2" +sha2 = "0.10.8" +serde_json = "1.0.107" -# TODO transient feature can be removed once https://github.com/wasm-forge/ic-wasi-polyfill/issues/14 -ic-wasi-polyfill = { git = "https://github.com/wasm-forge/ic-wasi-polyfill", rev = "2d2edb382816e12da9bc81b786b7cd1a00d36735", features = [ +# TODO transient feature can be removed once https://github.com/wasm-forge/stable-fs/issues/2 is resolved +ic-wasi-polyfill = { git = "https://github.com/wasm-forge/ic-wasi-polyfill", rev = "2d2edb382816e12da9bc81b786b7cd1a00d36735" , features = [ "transient", ] } diff --git a/src/compiler/rust/canister/src/lib.rs b/src/compiler/rust/canister/src/lib.rs index 48e59821290..73513f7cef3 100644 --- a/src/compiler/rust/canister/src/lib.rs +++ b/src/compiler/rust/canister/src/lib.rs @@ -3,7 +3,7 @@ use std::{cell::RefCell, collections::BTreeMap, collections::HashMap, convert::T #[allow(unused)] use canister_methods::canister_methods; use ic_stable_structures::{ - memory_manager::{MemoryManager, VirtualMemory}, + memory_manager::{MemoryId, MemoryManager, VirtualMemory}, storable::Bound, DefaultMemoryImpl, StableBTreeMap, Storable, }; @@ -62,6 +62,11 @@ impl Storable for AzleStableBTreeMapValue { const BOUND: Bound = Bound::Unbounded; } +type Hash = Option>; +type Timestamp = u64; +type BytesReceived = u64; +type BytesHashed = u64; + thread_local! { static RUNTIME: RefCell> = RefCell::new(None); @@ -74,6 +79,8 @@ thread_local! { static RELOADED_JS_TIMESTAMP: RefCell = RefCell::new(0); static RELOADED_JS: RefCell>> = RefCell::new(BTreeMap::new()); + + static FILE_INFO: RefCell> = RefCell::new(BTreeMap::new()); } #[cfg(all(target_arch = "wasm32", target_os = "wasi"))] diff --git a/src/compiler/rust/canister_methods/src/hash_file.rs b/src/compiler/rust/canister_methods/src/hash_file.rs new file mode 100644 index 00000000000..ffed18ed210 --- /dev/null +++ b/src/compiler/rust/canister_methods/src/hash_file.rs @@ -0,0 +1,170 @@ +use quote::quote; + +pub fn get_hash_file() -> proc_macro2::TokenStream { + quote! { + pub fn hash_file(path: String) { + clear_file_hash(&path); + hash_file_by_parts(&path, 0) + } + + #[ic_cdk_macros::query(guard = is_authenticated)] + pub fn get_file_hash(path: String) -> Option { + Some( + load_hashes() + .unwrap() + .get(&path)? + .iter() + .map(|bytes| format!("{:02x}", bytes)) + .collect(), + ) + } + + #[ic_cdk_macros::query(guard = is_authenticated)] + pub fn get_hash_status(path: String) -> Option<(u64, u64)> { + Some((get_bytes_hashed(&path), get_file_size(&path)?)) + } + + fn hash_file_by_parts(path: &str, position: u64) { + let file_length = std::fs::metadata(path).unwrap().len(); + let percentage = position / file_length.max(1) * 100; + ic_cdk::println!( + "Hashing: {} | {}/{} : {:.2}%", + path, + bytes_to_human_readable(position), + bytes_to_human_readable(file_length), + percentage + ); + let mut file = std::fs::File::open(&path).unwrap(); + + std::io::Seek::seek(&mut file, std::io::SeekFrom::Start(position)).unwrap(); + + // Read the bytes + let limit = 120 * 1024 * 1024; // This limit will be determine by how much hashing an update method can do without running out of cycles. It runs out somewhere between 120 and 135 + // This limit must be the same as on the node side or else the hashes will not match + let mut buffer = vec![0; limit]; + let bytes_read = std::io::Read::read(&mut file, &mut buffer).unwrap(); + + let previous_hash = get_partial_file_hash(path); + + if bytes_read != 0 { + let new_hash = hash_chunk_with(&buffer, previous_hash.as_ref()); + set_partial_hash(path, new_hash); + set_bytes_hashed(path, position + bytes_read as u64); + spawn_hash_by_parts(path.to_string(), position + bytes_read as u64) + } else { + // No more bytes to hash, set as final hash for this file + let final_hash = match previous_hash { + Some(hash) => hash, + None => { + let empty_file_hash = hash_chunk_with(&[], None); + empty_file_hash + } + }; + set_file_hash(path, final_hash); + clear_file_info(path); + } + } + + fn spawn_hash_by_parts(path: String, position: u64) { + let delay = core::time::Duration::new(0, 0); + let closure = move || hash_file_by_parts(&path, position); + ic_cdk_timers::set_timer(delay, closure); + } + + pub fn get_partial_file_hash(path: &str) -> Option> { + FILE_INFO + .with(|file_info| Some(file_info.borrow().get(path)?.2.clone())) + .flatten() + } + + fn set_partial_hash(path: &str, hash: Vec) { + FILE_INFO.with(|file_hashes| { + if let Some(entry) = file_hashes.borrow_mut().get_mut(path) { + entry.2 = Some(hash); + } else { + panic!("Couldn't find file info for {}", path) + } + }); + } + + fn clear_file_info(path: &str) { + FILE_INFO.with(|file_info| file_info.borrow_mut().remove(path)); + } + + fn clear_file_hash(path: &str) { + let mut file_hashes = load_hashes().unwrap(); + file_hashes.remove(path); + save_hashes(&file_hashes).unwrap(); + } + + fn set_file_hash(path: &str, hash: Vec) { + let mut file_hashes = load_hashes().unwrap(); + file_hashes.insert(path.to_string(), hash); + save_hashes(&file_hashes).unwrap(); + } + + fn get_bytes_hashed(path: &str) -> u64 { + FILE_INFO.with(|file_info| { + let file_info = file_info.borrow(); + match file_info.get(path) { + Some(file_info) => file_info.clone().3, + None => get_file_size(path).unwrap(), + } + }) + } + + fn set_bytes_hashed(path: &str, bytes_hashed: u64) { + FILE_INFO.with(|file_info| { + let mut file_info_mut = file_info.borrow_mut(); + if let Some(file_info_entry) = file_info_mut.get_mut(path) { + file_info_entry.3 = bytes_hashed; + } + }); + } + + fn get_file_size(path: &str) -> Option { + match std::fs::metadata(path) { + Ok(metadata) => Some(metadata.len()), + Err(_) => None, + } + } + + pub fn get_file_hash_path() -> std::path::PathBuf { + std::path::Path::new(".config") + .join("azle") + .join("file_hashes.json") + } + + fn hash_chunk_with(data: &[u8], previous_hash: Option<&Vec>) -> Vec { + let mut h: sha2::Sha256 = sha2::Digest::new(); + sha2::Digest::update(&mut h, data); + if let Some(hash) = previous_hash { + sha2::Digest::update(&mut h, hash); + } + sha2::Digest::finalize(h).to_vec() + } + + fn load_hashes() -> Result>, std::io::Error> { + let file_hash_path = get_file_hash_path(); + if !file_hash_path.exists() { + // If File doesn't exist yet return empty hash map + return Ok(HashMap::new()); + } + let buffer = std::fs::read(file_hash_path)?; + + Ok(if buffer.is_empty() { + // If File is empty return empty hash map + HashMap::new() + } else { + serde_json::from_slice(&buffer)? + }) + } + + fn save_hashes(file_hashes: &HashMap>) -> Result<(), std::io::Error> { + let data = serde_json::to_vec(file_hashes)?; + + std::fs::write(get_file_hash_path(), data) + } + + } +} diff --git a/src/compiler/rust/canister_methods/src/lib.rs b/src/compiler/rust/canister_methods/src/lib.rs index a985118be81..cd831c4025f 100644 --- a/src/compiler/rust/canister_methods/src/lib.rs +++ b/src/compiler/rust/canister_methods/src/lib.rs @@ -8,6 +8,10 @@ use proc_macro2::Ident; use quote::{format_ident, quote}; use serde::{Deserialize, Serialize}; +mod hash_file; +mod reload_js; +mod upload_file_chunk; + trait ToIdent { fn to_ident(&self) -> Ident; } @@ -61,6 +65,10 @@ pub fn canister_methods(_: TokenStream) -> TokenStream { let init_method = quote! { #[ic_cdk_macros::init] fn init() { + // let polyfill_memory = + // MEMORY_MANAGER_REF_CELL.with(|manager| manager.borrow().get(MemoryId::new(254))); + // ic_wasi_polyfill::init_with_memory(&[], &[#(#env_vars),*], polyfill_memory); + // TODO replace the line below with the lines above after https://github.com/wasm-forge/stable-fs/issues/2 is resolved ic_wasi_polyfill::init(&[], &[#(#env_vars),*]); ASSETS_DIR.extract("/").unwrap(); @@ -82,6 +90,10 @@ pub fn canister_methods(_: TokenStream) -> TokenStream { let post_upgrade_method = quote! { #[ic_cdk_macros::post_upgrade] fn post_upgrade() { + // let polyfill_memory = + // MEMORY_MANAGER_REF_CELL.with(|manager| manager.borrow().get(MemoryId::new(254))); + // ic_wasi_polyfill::init_with_memory(&[], &[#(#env_vars),*], polyfill_memory); + // TODO replace the line below with the lines above after https://github.com/wasm-forge/stable-fs/issues/2 is resolved ic_wasi_polyfill::init(&[], &[#(#env_vars),*]); ASSETS_DIR.extract("/").unwrap(); @@ -187,7 +199,9 @@ pub fn canister_methods(_: TokenStream) -> TokenStream { } }); - let reload_js = get_reload_js(&compiler_info.env_vars); + let reload_js = reload_js::get_reload_js(&compiler_info.env_vars); + + let upload_file_chunk = upload_file_chunk::get_upload_file_chunk(); quote! { static ASSETS_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/src/assets"); @@ -253,6 +267,8 @@ pub fn canister_methods(_: TokenStream) -> TokenStream { } #reload_js + + #upload_file_chunk } .into() } @@ -330,46 +346,3 @@ fn get_guard_token_stream( }, ) } - -// TODO there is no authentication on this method -// TODO it is up to the developer to not deploy with this function -// TODO in the binary if they are worried about it -fn get_reload_js(env_vars: &Vec<(String, String)>) -> proc_macro2::TokenStream { - let azle_autoreload_env_var = env_vars.iter().find(|(key, _)| key == "AZLE_AUTORELOAD"); - - if let Some((_, value)) = azle_autoreload_env_var { - if value == "true" { - return quote! { - #[ic_cdk_macros::update] - fn reload_js(timestamp: u64, chunk_number: u64, js_bytes: Vec, total_len: u64) { - RELOADED_JS_TIMESTAMP.with(|reloaded_js_timestamp| { - let mut reloaded_js_timestamp_mut = reloaded_js_timestamp.borrow_mut(); - - if timestamp > *reloaded_js_timestamp_mut { - *reloaded_js_timestamp_mut = timestamp; - - RELOADED_JS.with(|reloaded_js| { - let mut reloaded_js_mut = reloaded_js.borrow_mut(); - reloaded_js_mut.clear(); - }); - } - }); - - RELOADED_JS.with(|reloaded_js| { - let mut reloaded_js_mut = reloaded_js.borrow_mut(); - reloaded_js_mut.insert(chunk_number, js_bytes); - - let reloaded_js_complete_bytes: Vec = reloaded_js_mut.values().flat_map(|v| v.clone()).collect(); - - if reloaded_js_complete_bytes.len() as u64 == total_len { - let js_string = String::from_utf8_lossy(&reloaded_js_complete_bytes); - initialize_js(&js_string, false); - } - }); - } - }; - } - } - - quote! {} -} diff --git a/src/compiler/rust/canister_methods/src/reload_js.rs b/src/compiler/rust/canister_methods/src/reload_js.rs new file mode 100644 index 00000000000..b64c3b2d959 --- /dev/null +++ b/src/compiler/rust/canister_methods/src/reload_js.rs @@ -0,0 +1,44 @@ +use quote::quote; + +// TODO there is no authentication on this method +// TODO it is up to the developer to not deploy with this function +// TODO in the binary if they are worried about it +pub fn get_reload_js(env_vars: &Vec<(String, String)>) -> proc_macro2::TokenStream { + let azle_autoreload_env_var = env_vars.iter().find(|(key, _)| key == "AZLE_AUTORELOAD"); + + if let Some((_, value)) = azle_autoreload_env_var { + if value == "true" { + return quote! { + #[ic_cdk_macros::update] + fn reload_js(timestamp: u64, chunk_number: u64, js_bytes: Vec, total_len: u64) { + RELOADED_JS_TIMESTAMP.with(|reloaded_js_timestamp| { + let mut reloaded_js_timestamp_mut = reloaded_js_timestamp.borrow_mut(); + + if timestamp > *reloaded_js_timestamp_mut { + *reloaded_js_timestamp_mut = timestamp; + + RELOADED_JS.with(|reloaded_js| { + let mut reloaded_js_mut = reloaded_js.borrow_mut(); + reloaded_js_mut.clear(); + }); + } + }); + + RELOADED_JS.with(|reloaded_js| { + let mut reloaded_js_mut = reloaded_js.borrow_mut(); + reloaded_js_mut.insert(chunk_number, js_bytes); + + let reloaded_js_complete_bytes: Vec = reloaded_js_mut.values().flat_map(|v| v.clone()).collect(); + + if reloaded_js_complete_bytes.len() as u64 == total_len { + let js_string = String::from_utf8_lossy(&reloaded_js_complete_bytes); + initialize_js(&js_string, false); + } + }); + } + }; + } + } + + quote! {} +} diff --git a/src/compiler/rust/canister_methods/src/upload_file_chunk/mod.rs b/src/compiler/rust/canister_methods/src/upload_file_chunk/mod.rs new file mode 100644 index 00000000000..10b373ea3a1 --- /dev/null +++ b/src/compiler/rust/canister_methods/src/upload_file_chunk/mod.rs @@ -0,0 +1,83 @@ +pub mod versions; +pub mod write_chunk; + +use quote::quote; + +use crate::hash_file; + +pub fn get_upload_file_chunk() -> proc_macro2::TokenStream { + let write_chunk_src = write_chunk::get_write_chunk(); + let check_if_latest_version_src = versions::get_check_if_latest_version_src(); + let hash_file_src = hash_file::get_hash_file(); + + quote! { + #write_chunk_src + #check_if_latest_version_src + #hash_file_src + + #[ic_cdk_macros::update(guard = is_authenticated)] + pub fn upload_file_chunk( + dest_path: String, + timestamp: u64, + start_index: u64, + file_bytes: Vec, + total_file_len: u64, + ) { + let is_latest_version = check_if_latest_version(&dest_path, timestamp); + + if !is_latest_version { + return; + } + + let uploaded_file_len = + write_chunk(&dest_path, file_bytes, start_index, total_file_len).unwrap(); + + let percentage_complete = uploaded_file_len as f64 / total_file_len.max(1) as f64 * 100.0; + ic_cdk::println!( + "Received chunk: {} | {}/{} : {:.2}%", + dest_path, + bytes_to_human_readable(uploaded_file_len), + bytes_to_human_readable(total_file_len), + percentage_complete + ); + + if uploaded_file_len == total_file_len { + start_hash(dest_path) + } + } + + pub fn is_authenticated() -> Result<(), String> { + if ic_cdk::api::is_controller(&ic_cdk::api::caller()) { + return Ok(()); + } + return Err("Not Authorized: must be a controller to call this method".to_string()); + } + + pub fn start_hash(dest_path: String) { + let delay = core::time::Duration::new(0, 0); + let hash_closure = || hash_file(dest_path); + ic_cdk_timers::set_timer(delay, hash_closure); + } + + pub fn bytes_to_human_readable(size_in_bytes: u64) -> String { + let suffixes = ["B", "KiB", "MiB", "GiB"]; + let size = size_in_bytes as f64; + + let result = suffixes.iter().fold( + (size, suffixes[0], false), + |(remaining_size, selected_suffix, done), suffix| { + if done { + return (remaining_size, selected_suffix, done); + } + if remaining_size < 1024.0 { + (remaining_size, suffix, true) + } else { + (remaining_size / 1024.0, suffix, false) + } + }, + ); + + format!("{:.2} {}", result.0, result.1) + } + } +} diff --git a/src/compiler/rust/canister_methods/src/upload_file_chunk/versions.rs b/src/compiler/rust/canister_methods/src/upload_file_chunk/versions.rs new file mode 100644 index 00000000000..7c002c8cfc3 --- /dev/null +++ b/src/compiler/rust/canister_methods/src/upload_file_chunk/versions.rs @@ -0,0 +1,57 @@ +use quote::quote; + +pub fn get_check_if_latest_version_src() -> proc_macro2::TokenStream { + quote! { + pub fn check_if_latest_version(dest_path: &str, current_timestamp: Timestamp) -> bool { + let last_recorded_timestamp = get_timestamp(dest_path); + + if current_timestamp < last_recorded_timestamp { + // The request is from an earlier upload attempt. Disregard + return false; + } + + if current_timestamp > last_recorded_timestamp { + // The request is from a newer upload attempt. Clean up the previous attempt. + reset_for_new_upload(dest_path, current_timestamp).unwrap(); + } + + true + } + + fn get_timestamp(path: &str) -> Timestamp { + FILE_INFO.with(|uploaded_file_timestamps_map| { + match uploaded_file_timestamps_map.borrow().get(path) { + Some((timestamp, _, _, _)) => timestamp.clone(), + None => 0, + } + }) + } + + #[ic_cdk_macros::update(guard = is_authenticated)] + pub fn clear_file_and_info(path: String) { + reset_for_new_upload(&path, 0).unwrap() + } + + fn reset_for_new_upload(path: &str, timestamp: Timestamp) -> std::io::Result<()> { + delete_if_exists(path)?; + initialize_file_info(path, timestamp); + Ok(()) + } + + fn initialize_file_info(path: &str, timestamp: Timestamp) { + FILE_INFO.with(|file_info| { + let mut file_info_mut = file_info.borrow_mut(); + + file_info_mut.insert(path.to_string(), (timestamp, 0, None, 0)); + }); + } + + fn delete_if_exists(path: &str) -> std::io::Result<()> { + if std::fs::metadata(path).is_ok() { + std::fs::remove_file(path)?; + } + Ok(()) + } + + } +} diff --git a/src/compiler/rust/canister_methods/src/upload_file_chunk/write_chunk.rs b/src/compiler/rust/canister_methods/src/upload_file_chunk/write_chunk.rs new file mode 100644 index 00000000000..0eac21cdc29 --- /dev/null +++ b/src/compiler/rust/canister_methods/src/upload_file_chunk/write_chunk.rs @@ -0,0 +1,54 @@ +use quote::quote; + +pub fn get_write_chunk() -> proc_macro2::TokenStream { + quote! { + // Adds the given file_bytes to the chunked file at the chunk number position. + // Returns the new total length of chunked file after the addition + pub fn write_chunk( + path: &str, + file_bytes: Vec, + start_index: u64, + file_len: u64, + ) -> std::io::Result { + match std::path::Path::new(path).parent() { + Some(dir_path) => std::fs::create_dir_all(dir_path)?, + None => (), //Dir doesn't need to be created + }; + + let mut file: std::fs::File = match std::fs::OpenOptions::new().write(true).open(path) { + Ok(file) => file, + Err(_) => init_file(path, file_len)?, + }; + + std::io::Seek::seek(&mut file, std::io::SeekFrom::Start(start_index))?; + std::io::Write::write_all(&mut file, &file_bytes)?; + drop(file); + + Ok(set_bytes_received(path, file_bytes.len())) + } + + fn init_file(path: &str, file_len: u64) -> std::io::Result { + let new_file = std::fs::OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open(&path)?; + new_file.set_len(file_len)?; + Ok(new_file) + } + + fn set_bytes_received(dest_path: &str, bytes_in_chunk: usize) -> u64 { + FILE_INFO.with(|total_bytes_received| { + let mut total_bytes_received_mut = total_bytes_received.borrow_mut(); + match total_bytes_received_mut.get_mut(dest_path) { + Some((_, total_bytes, _, _)) => { + *total_bytes += bytes_in_chunk as u64; + *total_bytes + } + None => panic!("Couldn't find file info for {}", dest_path), + } + }) + } + + } +} diff --git a/src/compiler/utils/filter_async.ts b/src/compiler/utils/filter_async.ts new file mode 100644 index 00000000000..f36ac19fb8c --- /dev/null +++ b/src/compiler/utils/filter_async.ts @@ -0,0 +1,12 @@ +export async function filterAsync( + elements: T[], + callback: (element: T) => Promise +): Promise { + return await elements.reduce(async (accPromise: Promise, element) => { + const acc = await accPromise; + if (await callback(element)) { + return [...acc, element]; + } + return acc; + }, Promise.resolve([])); +} diff --git a/src/compiler/utils/log_success.ts b/src/compiler/utils/log_success.ts index 9beef5f406a..6f0a9a12d93 100644 --- a/src/compiler/utils/log_success.ts +++ b/src/compiler/utils/log_success.ts @@ -5,9 +5,14 @@ export function logSuccess( canisterId: string, replicaWebServerPort: string ): void { + const url = + process.env.DFX_NETWORK === 'ic' + ? `https://${canisterId}.raw.icp0.io` + : `http://${canisterId}.localhost:${replicaWebServerPort}`; + console.info( - `\nšŸŽ‰ Canister ${green(canisterName)} available at ${green( - `http://${canisterId}.localhost:${replicaWebServerPort}` + `\nšŸŽ‰ Canister ${green(canisterName)} will be available at ${green( + url )}\n` ); } diff --git a/src/compiler/utils/types.ts b/src/compiler/utils/types.ts index f6ea6cc0ee3..088a967e9f0 100644 --- a/src/compiler/utils/types.ts +++ b/src/compiler/utils/types.ts @@ -25,6 +25,7 @@ export type JSCanisterConfig = Readonly<{ env?: string[]; opt_level?: OptLevel; assets?: [string, string][]; + assets_large?: [string, string][]; }>; export type OptLevel = '0' | '1' | '2' | '3' | '4'; diff --git a/test/index.ts b/test/index.ts index 61e50b98fa3..967238034bd 100644 --- a/test/index.ts +++ b/test/index.ts @@ -253,17 +253,3 @@ function convertKeysToSnakeCase(obj: any): any { function camelToSnakeCase(str: string) { return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`); } - -export function getCanisterId(canisterName: string): string { - return execSync(`dfx canister id ${canisterName}`).toString().trim(); -} - -export function getWebServerPort(): string { - return execSync(`dfx info webserver-port`).toString().trim(); -} - -export function getCanisterOrigin(canisterName: string): string { - return `http://${getCanisterId( - canisterName - )}.localhost:${getWebServerPort()}`; -}