From d90de5ec62251053dbc7796d5ba831dedf4026e8 Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 28 Sep 2022 19:08:33 +0200 Subject: [PATCH 01/30] add support for the pallas curve field --- zokrates_cli/src/cli_constants.rs | 2 +- zokrates_cli/src/ops/check.rs | 5 ++++- zokrates_cli/src/ops/compile.rs | 5 ++++- zokrates_common/src/constants.rs | 1 + zokrates_common/src/helpers.rs | 2 ++ zokrates_field/Cargo.toml | 1 + zokrates_field/src/bls12_377.rs | 3 ++- zokrates_field/src/bls12_381.rs | 3 ++- zokrates_field/src/bn128.rs | 3 ++- zokrates_field/src/bw6_761.rs | 3 ++- zokrates_field/src/lib.rs | 5 +++-- zokrates_field/src/pallas.rs | 5 +++++ zokrates_js/src/lib.rs | 14 +++++++++++++- 13 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 zokrates_field/src/pallas.rs diff --git a/zokrates_cli/src/cli_constants.rs b/zokrates_cli/src/cli_constants.rs index 2f002f8de..be037bcb6 100644 --- a/zokrates_cli/src/cli_constants.rs +++ b/zokrates_cli/src/cli_constants.rs @@ -36,7 +36,7 @@ pub const BACKENDS: &[&str] = if cfg!(feature = "ark") { &[] }; -pub const CURVES: &[&str] = &[BN128, BLS12_381, BLS12_377, BW6_761]; +pub const CURVES: &[&str] = &[BN128, BLS12_381, BLS12_377, BW6_761, PALLAS]; pub const SCHEMES: &[&str] = &[G16, GM17, MARLIN]; diff --git a/zokrates_cli/src/ops/check.rs b/zokrates_cli/src/ops/check.rs index a32be7f6e..08161335c 100644 --- a/zokrates_cli/src/ops/check.rs +++ b/zokrates_cli/src/ops/check.rs @@ -7,7 +7,9 @@ use std::path::{Path, PathBuf}; use zokrates_common::constants::BN128; use zokrates_common::helpers::CurveParameter; use zokrates_core::compile::{check, CompileConfig, CompileError}; -use zokrates_field::{Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field}; +use zokrates_field::{ + Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, +}; use zokrates_fs_resolver::FileSystemResolver; pub fn subcommand() -> App<'static, 'static> { @@ -56,6 +58,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { CurveParameter::Bls12_377 => cli_check::(sub_matches), CurveParameter::Bls12_381 => cli_check::(sub_matches), CurveParameter::Bw6_761 => cli_check::(sub_matches), + CurveParameter::Pallas => cli_check::(sub_matches), } } diff --git a/zokrates_cli/src/ops/compile.rs b/zokrates_cli/src/ops/compile.rs index b00debe3d..b28ba6366 100644 --- a/zokrates_cli/src/ops/compile.rs +++ b/zokrates_cli/src/ops/compile.rs @@ -10,7 +10,9 @@ use zokrates_circom::write_r1cs; use zokrates_common::constants::BN128; use zokrates_common::helpers::CurveParameter; use zokrates_core::compile::{compile, CompileConfig, CompileError}; -use zokrates_field::{Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field}; +use zokrates_field::{ + Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, +}; use zokrates_fs_resolver::FileSystemResolver; pub fn subcommand() -> App<'static, 'static> { @@ -81,6 +83,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { CurveParameter::Bls12_377 => cli_compile::(sub_matches), CurveParameter::Bls12_381 => cli_compile::(sub_matches), CurveParameter::Bw6_761 => cli_compile::(sub_matches), + CurveParameter::Pallas => cli_compile::(sub_matches), } } diff --git a/zokrates_common/src/constants.rs b/zokrates_common/src/constants.rs index 18c4cf294..77234c118 100644 --- a/zokrates_common/src/constants.rs +++ b/zokrates_common/src/constants.rs @@ -5,6 +5,7 @@ pub const BN128: &str = "bn128"; pub const BLS12_381: &str = "bls12_381"; pub const BLS12_377: &str = "bls12_377"; pub const BW6_761: &str = "bw6_761"; +pub const PALLAS: &str = "pallas"; pub const G16: &str = "g16"; pub const GM17: &str = "gm17"; diff --git a/zokrates_common/src/helpers.rs b/zokrates_common/src/helpers.rs index b36f91c28..1c21d5975 100644 --- a/zokrates_common/src/helpers.rs +++ b/zokrates_common/src/helpers.rs @@ -7,6 +7,7 @@ pub enum CurveParameter { Bls12_381, Bls12_377, Bw6_761, + Pallas, } impl std::fmt::Display for CurveParameter { @@ -18,6 +19,7 @@ impl std::fmt::Display for CurveParameter { Bls12_381 => write!(f, "bls12_381"), Bls12_377 => write!(f, "bls12_377"), Bw6_761 => write!(f, "bw6_761"), + Pallas => write!(f, "pallas"), } } } diff --git a/zokrates_field/Cargo.toml b/zokrates_field/Cargo.toml index 87c98f369..29f666ce1 100644 --- a/zokrates_field/Cargo.toml +++ b/zokrates_field/Cargo.toml @@ -28,6 +28,7 @@ ark-bn254 = { version = "^0.3.0", features = ["curve"], default-features = false ark-bls12-377 = { version = "^0.3.0", features = ["curve"], default-features = false } ark-bls12-381 = { version = "^0.3.0", features = ["curve"] } ark-bw6-761 = { version = "^0.3.0", default-features = false } +ark-pallas = { version = "^0.3.0", features = ["curve"] } ark-serialize = { version = "^0.3.0", default-features = false } [dev-dependencies] diff --git a/zokrates_field/src/bls12_377.rs b/zokrates_field/src/bls12_377.rs index 251e0159a..8e74bf9c0 100644 --- a/zokrates_field/src/bls12_377.rs +++ b/zokrates_field/src/bls12_377.rs @@ -1,7 +1,8 @@ use ark_bls12_377::Bls12_377; +use ark_ec::PairingEngine; use crate::G2Type; -prime_field!("bls12_377", Bls12_377, G2Type::Fq2); +prime_field!("bls12_377", ::Fr, G2Type::Fq2); ark_extensions!(Bls12_377); diff --git a/zokrates_field/src/bls12_381.rs b/zokrates_field/src/bls12_381.rs index 403d0b947..3de1e7c9f 100644 --- a/zokrates_field/src/bls12_381.rs +++ b/zokrates_field/src/bls12_381.rs @@ -1,6 +1,7 @@ use ark_bls12_381::Bls12_381; +use ark_ec::PairingEngine; -prime_field!("bls12_381", Bls12_381, G2Type::Fq2); +prime_field!("bls12_381", ::Fr, G2Type::Fq2); ark_extensions!(Bls12_381); diff --git a/zokrates_field/src/bn128.rs b/zokrates_field/src/bn128.rs index 4b6c9cbb3..6b35010cd 100644 --- a/zokrates_field/src/bn128.rs +++ b/zokrates_field/src/bn128.rs @@ -1,6 +1,7 @@ use ark_bn254::Bn254; +use ark_ec::PairingEngine; -prime_field!("bn128", Bn254, G2Type::Fq2); +prime_field!("bn128", ::Fr, G2Type::Fq2); ark_extensions!(Bn254); diff --git a/zokrates_field/src/bw6_761.rs b/zokrates_field/src/bw6_761.rs index 224331345..8dd1082d3 100644 --- a/zokrates_field/src/bw6_761.rs +++ b/zokrates_field/src/bw6_761.rs @@ -1,7 +1,8 @@ use ark_bw6_761::BW6_761; +use ark_ec::PairingEngine; use crate::G2Type; -prime_field!("bw6_761", BW6_761, G2Type::Fq); +prime_field!("bw6_761", ::Fr, G2Type::Fq); ark_extensions!(BW6_761); diff --git a/zokrates_field/src/lib.rs b/zokrates_field/src/lib.rs index dc1e6b907..1bbc73031 100644 --- a/zokrates_field/src/lib.rs +++ b/zokrates_field/src/lib.rs @@ -32,7 +32,6 @@ pub trait BellmanFieldExtensions { fn into_bellman(self) -> ::Fr; fn new_fq2(c0: &str, c1: &str) -> ::Fqe; } - pub trait ArkFieldExtensions { /// An associated type to be able to operate with ark ff traits type ArkEngine: ark_ec::PairingEngine; @@ -146,7 +145,7 @@ mod prime_field { use std::fmt::{Debug, Display}; use std::ops::{Add, Div, Mul, Sub}; - type Fr = <$v as ark_ec::PairingEngine>::Fr; + type Fr = $v; #[derive(PartialEq, PartialOrd, Clone, Eq, Ord, Hash)] pub struct FieldPrime { @@ -632,8 +631,10 @@ pub mod bls12_377; pub mod bls12_381; pub mod bn128; pub mod bw6_761; +pub mod pallas; pub use bls12_377::FieldPrime as Bls12_377Field; pub use bls12_381::FieldPrime as Bls12_381Field; pub use bn128::FieldPrime as Bn128Field; pub use bw6_761::FieldPrime as Bw6_761Field; +pub use pallas::FieldPrime as PallasField; diff --git a/zokrates_field/src/pallas.rs b/zokrates_field/src/pallas.rs new file mode 100644 index 000000000..865eb595a --- /dev/null +++ b/zokrates_field/src/pallas.rs @@ -0,0 +1,5 @@ +use ark_pallas::Fr as PallasBaseField; + +use crate::G2Type; + +prime_field!("pallas", PallasBaseField, G2Type::Fq2); diff --git a/zokrates_js/src/lib.rs b/zokrates_js/src/lib.rs index cf24252e0..1d6fd02d4 100644 --- a/zokrates_js/src/lib.rs +++ b/zokrates_js/src/lib.rs @@ -25,7 +25,9 @@ use zokrates_core::compile::{ compile as core_compile, CompilationArtifacts, CompileConfig, CompileError, }; use zokrates_core::imports::Error; -use zokrates_field::{Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field}; +use zokrates_field::{ + Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, +}; use zokrates_proof_systems::groth16::G16; use zokrates_proof_systems::{ Backend, Marlin, NonUniversalBackend, NonUniversalScheme, Proof, Scheme, @@ -454,6 +456,9 @@ pub fn compile( CurveParameter::Bw6_761 => { internal::compile::(source, location, resolve_callback, config) } + CurveParameter::Pallas => { + internal::compile::(source, location, resolve_callback, config) + } } } @@ -603,6 +608,10 @@ pub fn universal_setup(curve: JsValue, size: u32) -> Result, JsValue> { CurveParameter::Bw6_761 => { Ok(internal::universal_setup_of_size::(size)) } + c => Err(JsValue::from(format!( + "Curve `{}` is not supported for universal setups", + c + ))), } } @@ -746,18 +755,21 @@ pub fn verify(vk: JsValue, proof: JsValue, options: JsValue) -> Result internal::verify::(vk, proof), CurveParameter::Bls12_377 => internal::verify::(vk, proof), CurveParameter::Bw6_761 => internal::verify::(vk, proof), + _ => Err(JsValue::from_str("Not supported")), }, (BackendParameter::Ark, SchemeParameter::GM17) => match curve { CurveParameter::Bn128 => internal::verify::(vk, proof), CurveParameter::Bls12_381 => internal::verify::(vk, proof), CurveParameter::Bls12_377 => internal::verify::(vk, proof), CurveParameter::Bw6_761 => internal::verify::(vk, proof), + _ => Err(JsValue::from_str("Not supported")), }, (BackendParameter::Ark, SchemeParameter::MARLIN) => match curve { CurveParameter::Bn128 => internal::verify::(vk, proof), CurveParameter::Bls12_381 => internal::verify::(vk, proof), CurveParameter::Bls12_377 => internal::verify::(vk, proof), CurveParameter::Bw6_761 => internal::verify::(vk, proof), + _ => Err(JsValue::from_str("Not supported")), }, _ => Err(JsValue::from_str("Unsupported options")), } From 4db3a036748e29afbb8f3ecb8948163223f42e7d Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 28 Sep 2022 19:18:19 +0200 Subject: [PATCH 02/30] add changelog --- changelogs/unreleased/1234-schaeff | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelogs/unreleased/1234-schaeff diff --git a/changelogs/unreleased/1234-schaeff b/changelogs/unreleased/1234-schaeff new file mode 100644 index 000000000..ac980c845 --- /dev/null +++ b/changelogs/unreleased/1234-schaeff @@ -0,0 +1 @@ +Add support for the Pallas curve field \ No newline at end of file From 11452adc33b2289b3935c3ace44666b6e1b005e1 Mon Sep 17 00:00:00 2001 From: schaeff Date: Fri, 30 Sep 2022 00:16:03 +0200 Subject: [PATCH 03/30] implement nova example --- Cargo.lock | 834 +++++++++++++++++++++- Cargo.toml | 2 + zokrates_ast/Cargo.toml | 2 +- zokrates_bellperson/Cargo.toml | 28 + zokrates_bellperson/src/lib.rs | 327 +++++++++ zokrates_field/Cargo.toml | 14 +- zokrates_field/src/bls12_381.rs | 4 +- zokrates_field/src/bn128.rs | 6 +- zokrates_field/src/lib.rs | 42 +- zokrates_field/src/pallas.rs | 5 + zokrates_field/src/vesta.rs | 10 + zokrates_interpreter/Cargo.toml | 2 +- zokrates_nova/Cargo.toml | 19 + zokrates_nova/examples/10_cubes.rs | 217 ++++++ zokrates_nova/src/lib.rs | 1 + zokrates_proof_systems/src/lib.rs | 2 +- zokrates_proof_systems/src/scheme/mod.rs | 2 + zokrates_proof_systems/src/scheme/nova.rs | 28 + 18 files changed, 1492 insertions(+), 53 deletions(-) create mode 100644 zokrates_bellperson/Cargo.toml create mode 100644 zokrates_bellperson/src/lib.rs create mode 100644 zokrates_field/src/vesta.rs create mode 100644 zokrates_nova/Cargo.toml create mode 100644 zokrates_nova/examples/10_cubes.rs create mode 100644 zokrates_nova/src/lib.rs create mode 100644 zokrates_proof_systems/src/scheme/nova.rs diff --git a/Cargo.lock b/Cargo.lock index b30d0e257..43d887fcc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,17 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addchain" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" +dependencies = [ + "num-bigint 0.3.3", + "num-integer", + "num-traits 0.2.15", +] + [[package]] name = "addr2line" version = "0.17.0" @@ -23,7 +34,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom", + "getrandom 0.2.7", "once_cell", "version_check", ] @@ -250,6 +261,17 @@ dependencies = [ "tracing", ] +[[package]] +name = "ark-pallas" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e945e1c8d86aa869853944ce6ecf072c2dac623b88c94e68792901b06190e53" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + [[package]] name = "ark-poly" version = "0.3.0" @@ -349,6 +371,18 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "ark-vesta" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2666857534c298a6ed92d7258f3289f66651a98948abe80aad0b599c160291c" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-pallas", + "ark-std", +] + [[package]] name = "arrayref" version = "0.3.6" @@ -364,6 +398,12 @@ dependencies = [ "nodrop", ] +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "arrayvec" version = "0.7.2" @@ -435,7 +475,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5ca1343d8690bb4d62e0665116bd4f109e33a642f86908ed107d226a402b0ef" dependencies = [ "bit-vec", - "byteorder", + "byteorder 1.4.3", "cfg-if 0.1.10", "crossbeam", "futures", @@ -445,17 +485,75 @@ dependencies = [ "web-sys", ] +[[package]] +name = "bellperson" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b6d7cc52a57ea764d8e9175c6684c6fe8e5d560db78f0f50ccd4ceac3857eb" +dependencies = [ + "bincode 1.3.3", + "bitvec 0.22.3", + "blake2s_simd", + "blstrs", + "byteorder 1.4.3", + "crossbeam-channel 0.5.6", + "digest 0.9.0", + "ec-gpu", + "ec-gpu-gen", + "ff", + "getrandom 0.2.7", + "group", + "itertools 0.10.5", + "lazy_static", + "log", + "memmap", + "num_cpus", + "pairing", + "rand 0.8.5", + "rand_core 0.6.3", + "rayon", + "rustversion", + "serde", + "sha2 0.9.9", + "thiserror", + "yastl", +] + +[[package]] +name = "bellperson-nonnative" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bceb1381fe9bad1152f22efa8213fecb680b22ac338dfa3e836ca37fc745a91" +dependencies = [ + "bellperson", + "byteorder 0.3.13", + "ff", + "num-bigint 0.4.3", + "num-integer", + "num-traits 0.2.15", + "rand 0.8.5", +] + [[package]] name = "bincode" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e103c8b299b28a9c6990458b7013dc4a8356a9b854c51b9883241f5866fac36e" dependencies = [ - "byteorder", + "byteorder 1.4.3", "num-traits 0.1.43", "serde", ] +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bit-vec" version = "0.6.3" @@ -468,16 +566,28 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitvec" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5237f00a8c86130a0cc317830e558b966dd7850d48a953d998c813f01a41b527" +dependencies = [ + "funty 1.2.0", + "radium 0.6.2", + "tap", + "wyz 0.4.0", +] + [[package]] name = "bitvec" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1489fcb93a5bb47da0462ca93ad252ad6af2145cce58d10d46a83931ba9f016b" dependencies = [ - "funty", - "radium", + "funty 2.0.0", + "radium 0.7.0", "tap", - "wyz", + "wyz 0.5.0", ] [[package]] @@ -520,7 +630,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdc60350286c7c3db13b98e91dbe5c8b6830a6821bc20af5b0c310ce94d74915" dependencies = [ "arrayvec 0.4.12", - "byteorder", + "byteorder 1.4.3", + "constant_time_eq", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72936ee4afc7f8f736d1c38383b56480b5497b4617b4a77bdbf1d2ababc76127" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "constant_time_eq", +] + +[[package]] +name = "blake2s_simd" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", "constant_time_eq", ] @@ -532,7 +664,7 @@ checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ "block-padding 0.1.5", "byte-tools", - "byteorder", + "byteorder 1.4.3", "generic-array 0.12.4", ] @@ -570,6 +702,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +[[package]] +name = "blst" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c521c26a784d5c4bcd98d483a7d3518376e9ff1efbcfa9e2d456ab8183752303" +dependencies = [ + "cc", + "glob 0.3.0", + "threadpool", + "which", + "zeroize", +] + +[[package]] +name = "blstrs" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50ffb24e55817127673bd14f6874ce54b91b338cd0c7d3e4b0da2545f466c459" +dependencies = [ + "blst", + "byte-slice-cast", + "ff", + "group", + "pairing", + "rand_core 0.6.3", + "serde", + "subtle 2.4.1", +] + [[package]] name = "bstr" version = "0.2.17" @@ -606,6 +767,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c" +[[package]] +name = "byteorder" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29b2aa490a8f546381308d68fc79e6bd753cd3ad839f7a7172897f1feedfa175" + [[package]] name = "byteorder" version = "1.4.3" @@ -758,6 +925,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "crossbeam" version = "0.7.3" @@ -765,11 +941,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69323bff1fb41c635347b8ead484a5ca6c3f11914d784170b158d8449ab07f8e" dependencies = [ "cfg-if 0.1.10", - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", + "crossbeam-channel 0.4.4", + "crossbeam-deque 0.7.4", + "crossbeam-epoch 0.8.2", "crossbeam-queue", - "crossbeam-utils", + "crossbeam-utils 0.7.2", ] [[package]] @@ -778,21 +954,42 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" dependencies = [ - "crossbeam-utils", + "crossbeam-utils 0.7.2", "maybe-uninit", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils 0.8.11", +] + [[package]] name = "crossbeam-deque" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "crossbeam-epoch 0.8.2", + "crossbeam-utils 0.7.2", "maybe-uninit", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch 0.9.10", + "crossbeam-utils 0.8.11", +] + [[package]] name = "crossbeam-epoch" version = "0.8.2" @@ -801,10 +998,24 @@ checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ "autocfg", "cfg-if 0.1.10", - "crossbeam-utils", + "crossbeam-utils 0.7.2", "lazy_static", "maybe-uninit", - "memoffset", + "memoffset 0.5.6", + "scopeguard", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "crossbeam-utils 0.8.11", + "memoffset 0.6.5", + "once_cell", "scopeguard", ] @@ -815,7 +1026,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" dependencies = [ "cfg-if 0.1.10", - "crossbeam-utils", + "crossbeam-utils 0.7.2", "maybe-uninit", ] @@ -830,6 +1041,16 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", +] + [[package]] name = "crunchy" version = "0.2.2" @@ -975,6 +1196,37 @@ dependencies = [ "winapi", ] +[[package]] +name = "ec-gpu" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78f1e64cf7ee95dacc8c739e0bf0b06583edaa8e0cee45b27ee2c08ae9343a2e" + +[[package]] +name = "ec-gpu-gen" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e1a11b4bfc7a0e48bb2b202a4d3dd2c31cfc9835062229ad332130105f34f82" +dependencies = [ + "bitvec 0.22.3", + "blstrs", + "crossbeam-channel 0.5.6", + "ec-gpu", + "execute", + "ff", + "group", + "hex 0.4.3", + "log", + "num_cpus", + "once_cell", + "pairing", + "rayon", + "sha2 0.10.2", + "temp-env", + "thiserror", + "yastl", +] + [[package]] name = "either" version = "1.7.0" @@ -1062,6 +1314,43 @@ dependencies = [ "uint", ] +[[package]] +name = "execute" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "313431b1c5e3a6ec9b864333defee57d2ddb50de77abab419e4baedb6cdff292" +dependencies = [ + "execute-command-macro", + "execute-command-tokens", + "generic-array 0.14.5", +] + +[[package]] +name = "execute-command-macro" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5fbc65a0cf735106743f4c38c9a3671c1e734b5c2c20d21a3c93c696daa3157" +dependencies = [ + "execute-command-macro-impl", +] + +[[package]] +name = "execute-command-macro-impl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5109f6bc9cd57feda665da326f3f6c57e0498c8fe9f7d12d7b8abc96719ca91b" +dependencies = [ + "execute-command-tokens", + "quote 1.0.20", + "syn 1.0.98", +] + +[[package]] +name = "execute-command-tokens" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ba569491c70ec8471e34aa7e9c0b9e82bb5d2464c0398442d17d3c4af814e5a" + [[package]] name = "exitcode" version = "1.1.2" @@ -1105,18 +1394,47 @@ dependencies = [ "instant", ] +[[package]] +name = "ff" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +dependencies = [ + "bitvec 1.0.0", + "byteorder 1.4.3", + "ff_derive", + "rand_core 0.6.3", + "subtle 2.4.1", +] + [[package]] name = "ff_ce" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4592897f75fd1bd178e5ec12d9d7df3d1943464feda2cbce1e708a484e82c8f6" dependencies = [ - "byteorder", + "byteorder 1.4.3", "ff_derive_ce", "hex 0.4.3", "rand 0.4.6", ] +[[package]] +name = "ff_derive" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95dddd96655a8ef19cc0dd2cb7063fb159f1583af0dbf3c04805ebc7dcc15849" +dependencies = [ + "addchain", + "cfg-if 1.0.0", + "num-bigint 0.3.3", + "num-integer", + "num-traits 0.2.15", + "proc-macro2 1.0.40", + "quote 1.0.20", + "syn 1.0.98", +] + [[package]] name = "ff_derive_ce" version = "0.8.0" @@ -1137,12 +1455,31 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" dependencies = [ - "byteorder", + "byteorder 1.4.3", "rand 0.8.5", "rustc-hex", "static_assertions", ] +[[package]] +name = "flate2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "spin 0.9.4", +] + [[package]] name = "from-pest" version = "0.3.1" @@ -1165,6 +1502,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" +[[package]] +name = "funty" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1847abb9cb65d566acd5942e94aea9c8f547ad02c98e1649326fc0e8910b8b1e" + [[package]] name = "funty" version = "2.0.0" @@ -1268,6 +1611,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.2.7" @@ -1277,7 +1631,7 @@ dependencies = [ "cfg-if 1.0.0", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -1299,6 +1653,20 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +[[package]] +name = "group" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +dependencies = [ + "byteorder 1.4.3", + "ff", + "rand 0.8.5", + "rand_core 0.6.3", + "rand_xorshift", + "subtle 2.4.1", +] + [[package]] name = "half" version = "1.8.2" @@ -1459,6 +1827,24 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -1498,7 +1884,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "spin", + "spin 0.5.2", ] [[package]] @@ -1507,6 +1893,16 @@ version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.17" @@ -1534,6 +1930,16 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "memoffset" version = "0.5.6" @@ -1543,6 +1949,27 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" +dependencies = [ + "byteorder 1.4.3", + "keccak", + "rand_core 0.5.1", + "zeroize", +] + [[package]] name = "miniz_oxide" version = "0.5.3" @@ -1552,12 +1979,91 @@ dependencies = [ "adler", ] +[[package]] +name = "neptune" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0129ad1c98c9cf429cc681c55df6658f1281b986c25798664325c0a422c1d9" +dependencies = [ + "bellperson", + "blake2s_simd", + "blstrs", + "byteorder 1.4.3", + "execute", + "ff", + "generic-array 0.14.5", + "hex 0.4.3", + "itertools 0.8.2", + "lazy_static", + "log", + "pasta_curves", + "sha2 0.9.9", +] + [[package]] name = "nodrop" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nova-snark" +version = "0.8.1" +dependencies = [ + "bellperson", + "bellperson-nonnative", + "bincode 1.3.3", + "bitvec 1.0.0", + "digest 0.8.1", + "ff", + "flate2", + "generic-array 0.14.5", + "itertools 0.9.0", + "merlin", + "neptune", + "num-bigint 0.4.3", + "num-traits 0.2.15", + "pasta-msm", + "pasta_curves", + "rand 0.8.5", + "rand_chacha", + "rand_core 0.5.1", + "rayon", + "serde", + "sha3 0.8.2", + "subtle 2.4.1", +] + +[[package]] +name = "nova-snark" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24c070c574e8b10f9c57a76621168d1afa5ac7984fbb32cf2b0e5b7dc35008a" +dependencies = [ + "bellperson", + "bellperson-nonnative", + "bincode 1.3.3", + "bitvec 1.0.0", + "digest 0.8.1", + "ff", + "flate2", + "generic-array 0.14.5", + "itertools 0.9.0", + "merlin", + "neptune", + "num-bigint 0.4.3", + "num-traits 0.2.15", + "pasta-msm", + "pasta_curves", + "rand 0.8.5", + "rand_chacha", + "rand_core 0.5.1", + "rayon", + "serde", + "sha3 0.8.2", + "subtle 2.4.1", +] + [[package]] name = "num" version = "0.1.42" @@ -1595,6 +2101,17 @@ dependencies = [ "serde", ] +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits 0.2.15", +] + [[package]] name = "num-bigint" version = "0.4.3" @@ -1604,6 +2121,8 @@ dependencies = [ "autocfg", "num-integer", "num-traits 0.2.15", + "rand 0.8.5", + "serde", ] [[package]] @@ -1733,13 +2252,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group", +] + [[package]] name = "pairing_ce" version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfc00d65b1d29e0a067a967fcea83d8db261c149f76a557ba73f0304f01cdfde" dependencies = [ - "byteorder", + "byteorder 1.4.3", "ff_ce", "rand 0.4.6", ] @@ -1751,7 +2279,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9182e4a71cae089267ab03e67c99368db7cd877baf50f931e5d6d4b71e195ac0" dependencies = [ "arrayvec 0.7.2", - "bitvec", + "bitvec 1.0.0", "byte-slice-cast", "impl-trait-for-tuples", "parity-scale-codec-derive", @@ -1770,6 +2298,34 @@ dependencies = [ "syn 1.0.98", ] +[[package]] +name = "pasta-msm" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a40dc8bdddb15a18fdf7c398f341a5ef2632a287419bbeeb64c61dec25091627" +dependencies = [ + "cc", + "pasta_curves", + "semolina", + "sppark", + "which", +] + +[[package]] +name = "pasta_curves" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "369d7785168ad7ff0cbe467d968ca3e19a927d8536b11ef9c21b4e454b15ba42" +dependencies = [ + "blake2b_simd", + "ff", + "group", + "lazy_static", + "rand 0.8.5", + "static_assertions", + "subtle 2.4.1", +] + [[package]] name = "paste" version = "1.0.7" @@ -1840,9 +2396,9 @@ dependencies = [ "bellman_ce", "blake2 0.9.2", "blake2-rfc", - "byteorder", + "byteorder 1.4.3", "crossbeam", - "getrandom", + "getrandom 0.2.7", "num_cpus", "pairing_ce", "rand 0.4.6", @@ -2016,6 +2572,12 @@ dependencies = [ "proc-macro2 1.0.40", ] +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "radium" version = "0.7.0" @@ -2071,13 +2633,55 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + [[package]] name = "rand_core" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom", + "getrandom 0.2.7", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.3", +] + +[[package]] +name = "rayon" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" +dependencies = [ + "autocfg", + "crossbeam-deque 0.8.2", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" +dependencies = [ + "crossbeam-channel 0.5.6", + "crossbeam-deque 0.8.2", + "crossbeam-utils 0.8.11", + "num_cpus", ] [[package]] @@ -2104,7 +2708,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom", + "getrandom 0.2.7", "redox_syscall", "thiserror", ] @@ -2242,6 +2846,12 @@ dependencies = [ "semver 0.11.0", ] +[[package]] +name = "rustversion" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" + [[package]] name = "ryu" version = "1.0.10" @@ -2265,7 +2875,7 @@ checksum = "1c4ff5309ec3e4bd800ad4ab3f71e9b76e9ea81c9f0eda6efa16008afbe440b3" dependencies = [ "bellman_ce", "blake2-rfc_bellman_edition", - "byteorder", + "byteorder 1.4.3", "digest 0.8.1", "rand 0.4.6", "serde", @@ -2304,6 +2914,16 @@ dependencies = [ "cc", ] +[[package]] +name = "semolina" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e90759f733a01b95d6ba70180b954d1d96e3e7e11f86c3fb0da0231300972e05" +dependencies = [ + "cc", + "glob 0.3.0", +] + [[package]] name = "semver" version = "0.11.0" @@ -2397,6 +3017,19 @@ dependencies = [ "opaque-debug 0.2.3", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + [[package]] name = "sha2" version = "0.10.2" @@ -2408,6 +3041,19 @@ dependencies = [ "digest 0.10.3", ] +[[package]] +name = "sha3" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" +dependencies = [ + "block-buffer 0.7.3", + "byte-tools", + "digest 0.8.1", + "keccak", + "opaque-debug 0.2.3", +] + [[package]] name = "sha3" version = "0.9.1" @@ -2475,6 +3121,25 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +dependencies = [ + "lock_api", +] + +[[package]] +name = "sppark" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202bc058424c1a3c39b5422f84715a816a93ae2cd1d1020e83fda2f38fe788d2" +dependencies = [ + "cc", + "which", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -2499,7 +3164,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b5bbfa79abbae15dd642ea8176a21a635ff3c00059961d1ea27ad04e5b441c" dependencies = [ - "byteorder", + "byteorder 1.4.3", "crunchy", "lazy_static", "rand 0.8.5", @@ -2569,6 +3234,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "temp-env" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45107136c2ddf8c4b87453c02294fd0adf41751796e81e8ba3f7fd951977ab57" +dependencies = [ + "once_cell", +] + [[package]] name = "tempdir" version = "0.3.7" @@ -2640,6 +3314,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -2717,7 +3400,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" dependencies = [ - "byteorder", + "byteorder 1.4.3", "crunchy", "hex 0.4.3", "static_assertions", @@ -2797,6 +3480,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2905,6 +3594,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "which" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" +dependencies = [ + "either", + "libc", + "once_cell", +] + [[package]] name = "winapi" version = "0.3.9" @@ -2936,6 +3636,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "wyz" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129e027ad65ce1453680623c3fb5163cbf7107bfe1aa32257e7d0e63f9ced188" +dependencies = [ + "tap", +] + [[package]] name = "wyz" version = "0.5.0" @@ -2945,6 +3654,16 @@ dependencies = [ "tap", ] +[[package]] +name = "yastl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca6c5a4d66c1a9ea261811cf4773c27343de7e5033e1b75ea3f297dc7db3c1a" +dependencies = [ + "flume", + "scopeguard", +] + [[package]] name = "zeroize" version = "1.5.6" @@ -2973,7 +3692,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51266e3b8d99e954d29b93a28464ee6ca239302bf38b2308137ff23d9fcce50c" dependencies = [ "bellman_ce", - "byteorder", + "byteorder 1.4.3", "cfg-if 0.1.10", "clap-v3", "exitcode", @@ -3047,7 +3766,7 @@ name = "zokrates_bellman" version = "0.1.0" dependencies = [ "bellman_ce", - "getrandom", + "getrandom 0.2.7", "hex 0.4.3", "pairing_ce", "phase2", @@ -3058,12 +3777,28 @@ dependencies = [ "zokrates_proof_systems", ] +[[package]] +name = "zokrates_bellperson" +version = "0.1.0" +dependencies = [ + "bellperson", + "getrandom 0.2.7", + "hex 0.4.3", + "nova-snark 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pairing", + "rand 0.4.6", + "zokrates_ast", + "zokrates_field", + "zokrates_interpreter", + "zokrates_proof_systems", +] + [[package]] name = "zokrates_circom" version = "0.1.1" dependencies = [ "bellman_ce", - "byteorder", + "byteorder 1.4.3", "pretty_assertions 1.2.1", "zkutil", "zokrates_ast", @@ -3077,7 +3812,7 @@ version = "0.8.2" dependencies = [ "assert_cli", "blake2 0.8.1", - "byteorder", + "byteorder 1.4.3", "cfg-if 0.1.10", "clap", "dirs", @@ -3177,13 +3912,19 @@ dependencies = [ "ark-bw6-761", "ark-ec", "ark-ff", + "ark-pallas", "ark-serialize", + "ark-vesta", "bellman_ce", - "bincode", + "bellperson", + "bincode 0.8.0", + "ff", "lazy_static", "num-bigint 0.2.6", "num-integer", "num-traits 0.2.15", + "pairing", + "pasta_curves", "rand 0.4.6", "serde", "serde_derive", @@ -3241,6 +3982,25 @@ dependencies = [ "zokrates_proof_systems", ] +[[package]] +name = "zokrates_nova" +version = "0.1.0" +dependencies = [ + "bellperson", + "getrandom 0.2.7", + "hex 0.4.3", + "nova-snark 0.8.1", + "pairing", + "pasta_curves", + "rand 0.4.6", + "typed-arena", + "zokrates_ast", + "zokrates_bellperson", + "zokrates_core", + "zokrates_field", + "zokrates_interpreter", +] + [[package]] name = "zokrates_parser" version = "0.3.2" @@ -3268,7 +4028,7 @@ version = "0.1.0" dependencies = [ "cfg-if 0.1.10", "ethabi", - "getrandom", + "getrandom 0.2.7", "hex 0.4.3", "primitive-types", "rand 0.4.6", diff --git a/Cargo.toml b/Cargo.toml index 92c7358e2..476c351b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,8 @@ members = [ "zokrates_interpreter", "zokrates_embed", "zokrates_bellman", + "zokrates_bellperson", + "zokrates_nova", "zokrates_proof_systems", "zokrates_js", "zokrates_circom" diff --git a/zokrates_ast/Cargo.toml b/zokrates_ast/Cargo.toml index 187e6a2da..00804b87a 100644 --- a/zokrates_ast/Cargo.toml +++ b/zokrates_ast/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [features] default = ["bellman", "ark"] -bellman = ["zokrates_field/bellman", "pairing_ce", "zokrates_embed/bellman"] +bellman = ["zokrates_field/bellman_extensions", "pairing_ce", "zokrates_embed/bellman"] ark = ["ark-bls12-377", "zokrates_embed/ark"] [dependencies] diff --git a/zokrates_bellperson/Cargo.toml b/zokrates_bellperson/Cargo.toml new file mode 100644 index 000000000..89a8cccde --- /dev/null +++ b/zokrates_bellperson/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "zokrates_bellperson" +version = "0.1.0" +edition = "2021" + +[features] +wasm = ["bellperson/wasm"] + +[dependencies] +zokrates_field = { version = "0.5", path = "../zokrates_field", features = ["bellperson_extensions"] } +zokrates_ast = { version = "0.1", path = "../zokrates_ast", default-features = false } +zokrates_proof_systems = { version = "0.1", path = "../zokrates_proof_systems", default-features = false } + +bellperson = { package = "bellperson", version = "^0.22", default-features = false, features = ["groth16"] } +rand_0_4 = { version = "0.4", package = "rand" }# +getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] } +hex = "0.4.2" +pairing = "0.22" + +nova-snark = { version = "0.8.1" } + +[dev-dependencies] +zokrates_interpreter = { version = "0.1", path = "../zokrates_interpreter" } + + + + + diff --git a/zokrates_bellperson/src/lib.rs b/zokrates_bellperson/src/lib.rs new file mode 100644 index 000000000..675fac98f --- /dev/null +++ b/zokrates_bellperson/src/lib.rs @@ -0,0 +1,327 @@ +//pub mod groth16; +// pub mod nova; + +use bellperson::gadgets::num::AllocatedNum; +use bellperson::{ + Circuit, ConstraintSystem, LinearCombination, SynthesisError, Variable as BellpersonVariable, +}; + +use std::collections::BTreeMap; +use zokrates_ast::common::Variable; +use zokrates_ast::ir::{CanonicalLinComb, ProgIterator, Statement, Witness}; +use zokrates_field::BellpersonFieldExtensions; +use zokrates_field::Field; + +pub struct Bellperson; + +#[derive(Clone, Debug)] +pub struct Computation>> { + pub program: ProgIterator, + pub witness: Option>, +} + +impl>> Computation { + pub fn with_witness(program: ProgIterator, witness: Witness) -> Self { + Computation { + program, + witness: Some(witness), + } + } + + pub fn without_witness(program: ProgIterator) -> Self { + Computation { + program, + witness: None, + } + } +} + +fn bellperson_combination< + T: BellpersonFieldExtensions, + CS: ConstraintSystem, +>( + l: CanonicalLinComb, + cs: &mut CS, + symbols: &mut BTreeMap, + witness: &mut Witness, +) -> LinearCombination { + l.0.into_iter() + .map(|(k, v)| { + ( + v.into_bellperson(), + *symbols.entry(k).or_insert_with(|| { + match k.is_output() { + true => unreachable!("outputs should already have been allocated"), + false => AllocatedNum::alloc(cs.namespace(|| format!("{}", k)), || { + Ok(witness + .0 + .remove(&k) + .ok_or(SynthesisError::AssignmentMissing)? + .into_bellperson()) + }), + } + .unwrap() + .get_variable() + }), + ) + }) + .fold(LinearCombination::zero(), |acc, e| acc + e) +} + +impl>> + Circuit for Computation +{ + fn synthesize>( + self, + cs: &mut CS, + ) -> Result<(), SynthesisError> { + let mut symbols = BTreeMap::new(); + + let mut witness = self.witness.clone().unwrap_or_else(Witness::empty); + + assert!(symbols.insert(Variable::one(), CS::one()).is_none()); + + symbols.extend(self.program.arguments.iter().enumerate().map(|(index, p)| { + let wire = match p.private { + true => { + AllocatedNum::alloc(cs.namespace(|| format!("PRIVATE_INPUT_{}", index)), || { + Ok(witness + .0 + .remove(&p.id) + .ok_or(SynthesisError::AssignmentMissing)? + .into_bellperson()) + }) + } + false => AllocatedNum::alloc_input( + cs.namespace(|| format!("PUBLIC_INPUT_{}", index)), + || { + Ok(witness + .0 + .remove(&p.id) + .ok_or(SynthesisError::AssignmentMissing)? + .into_bellperson()) + }, + ), + } + .unwrap(); + (p.id, wire.get_variable()) + })); + + self.program.returns().iter().for_each(|v| { + assert!(v.id < 0); // this should indeed be an output + let wire = AllocatedNum::alloc_input( + cs.namespace(|| format!("PUBLIC_OUTPUT_{}", -v.id - 1)), + || { + Ok(witness + .0 + .remove(v) + .ok_or(SynthesisError::AssignmentMissing)? + .into_bellperson()) + }, + ) + .unwrap(); + symbols.insert(*v, wire.get_variable()); + }); + + self.synthesize_input_to_output(cs, &mut symbols, &mut witness) + } +} + +impl>> Computation { + pub fn synthesize_input_to_output>( + self, + cs: &mut CS, + symbols: &mut BTreeMap, + witness: &mut Witness, + ) -> Result<(), SynthesisError> { + for (i, statement) in self.program.statements.into_iter().enumerate() { + if let Statement::Constraint(quad, lin, _) = statement { + let a = &bellperson_combination(quad.left.into_canonical(), cs, symbols, witness); + let b = &bellperson_combination(quad.right.into_canonical(), cs, symbols, witness); + let c = &bellperson_combination(lin.into_canonical(), cs, symbols, witness); + + cs.enforce( + || format!("Constraint {}", i), + |lc| lc + a, + |lc| lc + b, + |lc| lc + c, + ); + } + } + + Ok(()) + } + + pub fn public_inputs_values(&self) -> Vec { + self.program + .public_inputs_values(self.witness.as_ref().unwrap()) + .iter() + .map(|v| v.clone().into_bellperson()) + .collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use zokrates_ast::ir::LinComb; + use zokrates_field::Bn128Field; + use zokrates_interpreter::Interpreter; + + mod prove { + use super::*; + use zokrates_ast::flat::Parameter; + use zokrates_ast::ir::Prog; + + #[test] + fn empty() { + let program: Prog = Prog::default(); + + let interpreter = Interpreter::default(); + + let witness = interpreter.execute(program.clone(), &[]).unwrap(); + let computation = Computation::with_witness(program, witness); + + let params = computation.clone().setup(); + let _proof = computation.prove(¶ms); + } + + #[test] + fn identity() { + let program: Prog = Prog { + arguments: vec![Parameter::private(Variable::new(0))], + return_count: 1, + statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], + }; + + let interpreter = Interpreter::default(); + + let witness = interpreter + .execute(program.clone(), &[Bn128Field::from(0)]) + .unwrap(); + + let computation = Computation::with_witness(program, witness); + + let params = computation.clone().setup(); + let _proof = computation.prove(¶ms); + } + + #[test] + fn public_identity() { + let program: Prog = Prog { + arguments: vec![Parameter::public(Variable::new(0))], + return_count: 1, + statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], + }; + + let interpreter = Interpreter::default(); + + let witness = interpreter + .execute(program.clone(), &[Bn128Field::from(0)]) + .unwrap(); + + let computation = Computation::with_witness(program, witness); + + let params = computation.clone().setup(); + let _proof = computation.prove(¶ms); + } + + #[test] + fn no_arguments() { + let program: Prog = Prog { + arguments: vec![], + return_count: 1, + statements: vec![Statement::constraint(Variable::one(), Variable::public(0))], + }; + + let interpreter = Interpreter::default(); + + let witness = interpreter.execute(program.clone(), &[]).unwrap(); + let computation = Computation::with_witness(program, witness); + + let params = computation.clone().setup(); + let _proof = computation.prove(¶ms); + } + + #[test] + fn unordered_variables() { + // public variables must be ordered from 0 + // private variables can be unordered + let program: Prog = Prog { + arguments: vec![ + Parameter::private(Variable::new(42)), + Parameter::public(Variable::new(51)), + ], + return_count: 2, + statements: vec![ + Statement::constraint( + LinComb::from(Variable::new(42)) + LinComb::from(Variable::new(51)), + Variable::public(0), + ), + Statement::constraint( + LinComb::from(Variable::one()) + LinComb::from(Variable::new(42)), + Variable::public(1), + ), + ], + }; + + let interpreter = Interpreter::default(); + + let witness = interpreter + .execute(program.clone(), &[Bn128Field::from(3), Bn128Field::from(4)]) + .unwrap(); + let computation = Computation::with_witness(program, witness); + + let params = computation.clone().setup(); + let _proof = computation.prove(¶ms); + } + + #[test] + fn one() { + let program: Prog = Prog { + arguments: vec![Parameter::public(Variable::new(42))], + return_count: 1, + statements: vec![Statement::constraint( + LinComb::from(Variable::new(42)) + LinComb::one(), + Variable::public(0), + )], + }; + + let interpreter = Interpreter::default(); + + let witness = interpreter + .execute(program.clone(), &[Bn128Field::from(3)]) + .unwrap(); + + let computation = Computation::with_witness(program, witness); + + let params = computation.clone().setup(); + let _proof = computation.prove(¶ms); + } + + #[test] + fn with_directives() { + let program: Prog = Prog { + arguments: vec![ + Parameter::private(Variable::new(42)), + Parameter::public(Variable::new(51)), + ], + return_count: 1, + statements: vec![Statement::constraint( + LinComb::from(Variable::new(42)) + LinComb::from(Variable::new(51)), + Variable::public(0), + )], + }; + + let interpreter = Interpreter::default(); + + let witness = interpreter + .execute(program.clone(), &[Bn128Field::from(3), Bn128Field::from(4)]) + .unwrap(); + let computation = Computation::with_witness(program, witness); + + let params = computation.clone().setup(); + let _proof = computation.prove(¶ms); + } + } +} diff --git a/zokrates_field/Cargo.toml b/zokrates_field/Cargo.toml index 29f666ce1..2e68f63cd 100644 --- a/zokrates_field/Cargo.toml +++ b/zokrates_field/Cargo.toml @@ -2,11 +2,12 @@ name = "zokrates_field" version = "0.5.2" authors = ["Thibaut Schaeffer ", "Guillaume Ballet "] -edition = "2018" +edition = "2021" [features] -default = ["bellman"] -bellman = ["bellman_ce"] +default = ["bellman_extensions"] +bellperson_extensions = ["bellperson", "pairing", "ff", "pasta_curves"] +bellman_extensions = ["bellman_ce"] [dependencies] serde = "1.0" @@ -21,6 +22,12 @@ num-integer = { version = "0.1", default-features = false } # bellman bellman_ce = { version = "^0.3", default-features = false, optional = true } +# bellperson +bellperson = { version = "0.22", default-features = false, optional = true } +pairing = { version = "0.22", default-features = false, optional = true } +ff = { version = "0.12.0", default-features = false, optional = true } +pasta_curves = { version = "0.4.0", features = ["repr-c"], optional = true } + # ark ark-ff = { version = "^0.3.0", default-features = false } ark-ec = { version = "^0.3.0", default-features = false } @@ -29,6 +36,7 @@ ark-bls12-377 = { version = "^0.3.0", features = ["curve"], default-features = f ark-bls12-381 = { version = "^0.3.0", features = ["curve"] } ark-bw6-761 = { version = "^0.3.0", default-features = false } ark-pallas = { version = "^0.3.0", features = ["curve"] } +ark-vesta = { version = "^0.3.0" } ark-serialize = { version = "^0.3.0", default-features = false } [dev-dependencies] diff --git a/zokrates_field/src/bls12_381.rs b/zokrates_field/src/bls12_381.rs index 3de1e7c9f..9c954039d 100644 --- a/zokrates_field/src/bls12_381.rs +++ b/zokrates_field/src/bls12_381.rs @@ -5,9 +5,9 @@ prime_field!("bls12_381", ::Fr, G2Type::Fq2); ark_extensions!(Bls12_381); -#[cfg(feature = "bellman")] +#[cfg(feature = "bellman_extensions")] use bellman_ce::pairing::bls12_381::{Bls12, Fq2}; use crate::G2Type; -#[cfg(feature = "bellman")] +#[cfg(feature = "bellman_extensions")] bellman_extensions!(Bls12, Fq2); diff --git a/zokrates_field/src/bn128.rs b/zokrates_field/src/bn128.rs index 6b35010cd..427feafd3 100644 --- a/zokrates_field/src/bn128.rs +++ b/zokrates_field/src/bn128.rs @@ -5,11 +5,11 @@ prime_field!("bn128", ::Fr, G2Type::Fq2); ark_extensions!(Bn254); -#[cfg(feature = "bellman")] +#[cfg(feature = "bellman_extensions")] use bellman_ce::pairing::bn256::{Bn256, Fq2}; use crate::G2Type; -#[cfg(feature = "bellman")] +#[cfg(feature = "bellman_extensions")] bellman_extensions!(Bn256, Fq2); #[cfg(test)] @@ -291,7 +291,7 @@ mod tests { } } - #[cfg(feature = "bellman")] + #[cfg(feature = "bellman_extensions")] mod bellman { use super::*; diff --git a/zokrates_field/src/lib.rs b/zokrates_field/src/lib.rs index 1bbc73031..b8a76a172 100644 --- a/zokrates_field/src/lib.rs +++ b/zokrates_field/src/lib.rs @@ -4,9 +4,7 @@ // @author Jacob Eberhardt // @date 2017 -extern crate num_bigint; - -#[cfg(feature = "bellman")] +#[cfg(feature = "bellman_extensions")] use bellman_ce::pairing::{ff::ScalarEngine, Engine}; use num_bigint::BigUint; @@ -23,7 +21,7 @@ pub trait Pow { fn pow(self, _: RHS) -> Self::Output; } -#[cfg(feature = "bellman")] +#[cfg(feature = "bellman_extensions")] pub trait BellmanFieldExtensions { /// An associated type to be able to operate with Bellman ff traits type BellmanEngine: Engine; @@ -32,6 +30,15 @@ pub trait BellmanFieldExtensions { fn into_bellman(self) -> ::Fr; fn new_fq2(c0: &str, c1: &str) -> ::Fqe; } + +#[cfg(feature = "bellperson_extensions")] +pub trait BellpersonFieldExtensions { + /// An associated type to be able to operate with Bellperson ff traits + type BellpersonField: ff::PrimeField; + + fn from_bellperson(e: Self::BellpersonField) -> Self; + fn into_bellperson(self) -> Self::BellpersonField; +} pub trait ArkFieldExtensions { /// An associated type to be able to operate with ark ff traits type ArkEngine: ark_ec::PairingEngine; @@ -573,7 +580,7 @@ mod prime_field { }; } - #[cfg(feature = "bellman")] + #[cfg(feature = "bellman_extensions")] macro_rules! bellman_extensions { ($bellman_type:ty, $fq2_type:ident) => { use crate::BellmanFieldExtensions; @@ -608,6 +615,29 @@ mod prime_field { }; } + #[cfg(feature = "bellperson")] + macro_rules! bellperson_extensions { + ($bellperson_type:ty) => { + use crate::BellpersonFieldExtensions; + + impl BellpersonFieldExtensions for FieldPrime { + type BellpersonField = $bellperson_type; + + fn from_bellperson(e: Self::BellpersonField) -> Self { + use ff::PrimeField; + let res = e.to_repr().to_vec(); + Self::from_byte_vector(res) + } + + fn into_bellperson(self) -> Self::BellpersonField { + use ff::PrimeField; + let s = self.to_dec_string(); + Self::BellpersonField::from_str_vartime(&s).unwrap() + } + } + }; + } + macro_rules! ark_extensions { ($ark_type:ty) => { use crate::ArkFieldExtensions; @@ -632,9 +662,11 @@ pub mod bls12_381; pub mod bn128; pub mod bw6_761; pub mod pallas; +pub mod vesta; pub use bls12_377::FieldPrime as Bls12_377Field; pub use bls12_381::FieldPrime as Bls12_381Field; pub use bn128::FieldPrime as Bn128Field; pub use bw6_761::FieldPrime as Bw6_761Field; pub use pallas::FieldPrime as PallasField; +pub use vesta::FieldPrime as VestaField; diff --git a/zokrates_field/src/pallas.rs b/zokrates_field/src/pallas.rs index 865eb595a..69ac32458 100644 --- a/zokrates_field/src/pallas.rs +++ b/zokrates_field/src/pallas.rs @@ -1,5 +1,10 @@ use ark_pallas::Fr as PallasBaseField; +#[cfg(feature = "bellperson_extensions")] +use pasta_curves::Fq; use crate::G2Type; prime_field!("pallas", PallasBaseField, G2Type::Fq2); + +#[cfg(feature = "bellperson_extensions")] +bellperson_extensions!(Fq); diff --git a/zokrates_field/src/vesta.rs b/zokrates_field/src/vesta.rs new file mode 100644 index 000000000..dce15a321 --- /dev/null +++ b/zokrates_field/src/vesta.rs @@ -0,0 +1,10 @@ +use ark_vesta::Fr as VestaBaseField; +#[cfg(feature = "bellperson_extensions")] +use pasta_curves::Fp; + +use crate::G2Type; + +prime_field!("vesta", VestaBaseField, G2Type::Fq2); + +#[cfg(feature = "bellperson_extensions")] +bellperson_extensions!(Fp); diff --git a/zokrates_interpreter/Cargo.toml b/zokrates_interpreter/Cargo.toml index 290962557..7738b550f 100644 --- a/zokrates_interpreter/Cargo.toml +++ b/zokrates_interpreter/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [features] default = ["bellman", "ark"] -bellman = ["zokrates_field/bellman", "pairing_ce", "zokrates_embed/bellman", "zokrates_ast/bellman"] +bellman = ["zokrates_field/bellman_extensions", "pairing_ce", "zokrates_embed/bellman", "zokrates_ast/bellman"] ark = ["ark-bls12-377", "zokrates_embed/ark", "zokrates_ast/ark"] [dependencies] diff --git a/zokrates_nova/Cargo.toml b/zokrates_nova/Cargo.toml new file mode 100644 index 000000000..3fab7d392 --- /dev/null +++ b/zokrates_nova/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "zokrates_nova" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +zokrates_field = { version = "0.5", path = "../zokrates_field" } +zokrates_ast = { version = "0.1", path = "../zokrates_ast", default-features = false } +zokrates_core = { version = "0.7", path = "../zokrates_core", default-features = false, features = ["ark", "bellman"] } +zokrates_bellperson = { version = "0.1", path = "../zokrates_bellperson", default-features = false } +typed-arena = "1.4.1" +bellperson = { package = "bellperson", version = "^0.22", default-features = false, features = ["groth16"] } +rand_0_4 = { version = "0.4", package = "rand" } +getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] } +hex = "0.4.2" +pairing = "0.22" +pasta_curves = { version = "0.4.0", features = ["repr-c"] } +nova-snark = { path = "../../nova" } +zokrates_interpreter = { version = "0.1", path = "../zokrates_interpreter" } \ No newline at end of file diff --git a/zokrates_nova/examples/10_cubes.rs b/zokrates_nova/examples/10_cubes.rs new file mode 100644 index 000000000..3aa6e9979 --- /dev/null +++ b/zokrates_nova/examples/10_cubes.rs @@ -0,0 +1,217 @@ +use bellperson::gadgets::num::AllocatedNum; +use bellperson::SynthesisError; +use nova_snark::traits::circuit::StepCircuit; +use nova_snark::traits::circuit::TrivialTestCircuit; +use nova_snark::CompressedSNARK; +use nova_snark::PublicParams; +use nova_snark::RecursiveSNARK; +use pasta_curves::{Fp, Fq}; +use std::time::Instant; +use std::{collections::BTreeMap, io}; +use typed_arena::Arena; +use zokrates_ast::ir::{Statement, Witness}; +use zokrates_bellperson::Computation; +use zokrates_core::compile::{compile, CompileConfig}; +use zokrates_field::{BellpersonFieldExtensions, PallasField}; +use zokrates_interpreter::Interpreter; + +type G1 = pasta_curves::pallas::Point; +type G2 = pasta_curves::vesta::Point; + +// we implemented a bellperson extension in zokrates_field for pallas so that we can convert back and forth to the bellperson data structures + +// let's implement the StepCircuit trait for ir programs + +// we use the newtype pattern to enable implementing a trait on ir::Prog because it is defined in another crate (zokrates_ast) + +#[derive(Clone, Debug)] +struct PallasComputation(Computation>>); + +impl StepCircuit for PallasComputation { + fn arity(&self) -> usize { + let input_count = self.0.program.arguments.len(); + let output_count = self.0.program.return_count; + assert_eq!(input_count, output_count); + input_count + } + + fn synthesize>( + &self, + cs: &mut CS, + input: &[bellperson::gadgets::num::AllocatedNum], + ) -> Result>, bellperson::SynthesisError> { + assert_eq!(self.0.program.arguments.len(), input.len()); + + let mut symbols = BTreeMap::new(); + + let mut witness = Witness::default(); + + // populate the witness if we got some input values + if input[0].get_value().is_some() { + let interpreter = Interpreter::default(); + let inputs: Vec<_> = input + .iter() + .map(|v| PallasField::from_bellperson(v.get_value().unwrap())) + .collect(); + witness = interpreter + .execute(self.0.program.clone(), &inputs) + .unwrap(); + } + + // allocate the inputs + for (p, allocated_num) in self.0.program.arguments.iter().zip(input) { + symbols.insert(p.id, allocated_num.get_variable()); + } + + // allocate the outputs + + let outputs: Vec<_> = self + .0 + .program + .returns() + .iter() + .map(|v| { + assert!(v.id < 0); // this should indeed be an output + let wire = AllocatedNum::alloc( + cs.namespace(|| format!("NOVA_INCREMENTAL_OUTPUT_{}", -v.id - 1)), + || { + Ok(witness + .0 + .remove(v) + .ok_or(SynthesisError::AssignmentMissing)? + .into_bellperson()) + }, + ) + .unwrap(); + symbols.insert(*v, wire.get_variable()); + wire + }) + .collect(); + + self.0 + .clone() + .synthesize_input_to_output(cs, &mut symbols, &mut witness)?; + + Ok(outputs) + } + + fn output(&self, z: &[Fq]) -> Vec { + let interpreter = Interpreter::default(); + let inputs: Vec<_> = z.iter().map(|v| PallasField::from_bellperson(*v)).collect(); + let output = interpreter + .execute(self.0.program.clone(), &inputs) + .unwrap(); + output + .return_values() + .into_iter() + .map(|v| v.into_bellperson()) + .collect() + } +} + +fn main() { + // create a circuit for the incremental computation + + let cube = r#" + def main(field x) -> field { + return x**123; + } + "#; + + let arena = Arena::new(); + + let artifacts = compile::( + cube.to_string(), + "main".into(), + None, + CompileConfig::default(), + &arena, + ) + .unwrap(); + + let prog = artifacts.prog().collect(); + + let circuit_primary = PallasComputation(Computation::without_witness(prog)); + let circuit_secondary = TrivialTestCircuit::default(); + + type C1 = PallasComputation; + type C2 = TrivialTestCircuit; + + // produce public parameters + println!("Producing public parameters..."); + let pp = + PublicParams::::setup(circuit_primary.clone(), circuit_secondary.clone()); + + // produce a recursive SNARK + println!("Generating a RecursiveSNARK..."); + let mut recursive_snark: Option> = None; + + let num_steps: usize = 10; + + let z0_primary = vec![Fq::one() + Fq::one()]; + let z0_secondary = vec![Fp::one()]; + + for i in 0..num_steps { + let start = Instant::now(); + let res = RecursiveSNARK::prove_step( + &pp, + recursive_snark, + circuit_primary.clone(), + circuit_secondary.clone(), + z0_primary.clone(), + z0_secondary.clone(), + ); + assert!(res.is_ok()); + println!( + "RecursiveSNARK::prove_step {}: {:?}, took {:?} ", + i, + res.is_ok(), + start.elapsed() + ); + recursive_snark = Some(res.unwrap()); + println!("{:#?}", recursive_snark.as_ref().unwrap().zi_primary); + } + + assert!(recursive_snark.is_some()); + let recursive_snark = recursive_snark.unwrap(); + + // verify the recursive SNARK + println!("Verifying a RecursiveSNARK..."); + let start = Instant::now(); + let res = recursive_snark.verify(&pp, num_steps, z0_primary.clone(), z0_secondary.clone()); + + println!("{:#?}", res); + + println!( + "RecursiveSNARK::verify: {:?}, took {:?}", + res.is_ok(), + start.elapsed() + ); + assert!(res.is_ok()); + + // produce a compressed SNARK + println!("Generating a CompressedSNARK using Spartan with IPA-PC..."); + let start = Instant::now(); + type S1 = nova_snark::spartan_with_ipa_pc::RelaxedR1CSSNARK; + type S2 = nova_snark::spartan_with_ipa_pc::RelaxedR1CSSNARK; + let res = CompressedSNARK::<_, _, _, _, S1, S2>::prove(&pp, &recursive_snark); + println!( + "CompressedSNARK::prove: {:?}, took {:?}", + res.is_ok(), + start.elapsed() + ); + assert!(res.is_ok()); + let compressed_snark = res.unwrap(); + + // verify the compressed SNARK + println!("Verifying a CompressedSNARK..."); + let start = Instant::now(); + let res = compressed_snark.verify(&pp, num_steps, z0_primary, z0_secondary); + println!( + "CompressedSNARK::verify: {:?}, took {:?}", + res.is_ok(), + start.elapsed() + ); + assert!(res.is_ok()); + println!("========================================================="); +} diff --git a/zokrates_nova/src/lib.rs b/zokrates_nova/src/lib.rs new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/zokrates_nova/src/lib.rs @@ -0,0 +1 @@ + diff --git a/zokrates_proof_systems/src/lib.rs b/zokrates_proof_systems/src/lib.rs index 231fbeee7..ffd968b17 100644 --- a/zokrates_proof_systems/src/lib.rs +++ b/zokrates_proof_systems/src/lib.rs @@ -45,7 +45,7 @@ pub type Fr = String; pub type Fq = String; pub type Fq2 = (String, String); -#[derive(Serialize, Deserialize, Clone, Debug)] +#[derive(Serialize, Deserialize, Clone, Debug, Default)] pub struct G1Affine(pub Fq, pub Fq); #[derive(Serialize, Deserialize, Clone)] diff --git a/zokrates_proof_systems/src/scheme/mod.rs b/zokrates_proof_systems/src/scheme/mod.rs index e841d8121..905157a7a 100644 --- a/zokrates_proof_systems/src/scheme/mod.rs +++ b/zokrates_proof_systems/src/scheme/mod.rs @@ -5,10 +5,12 @@ use zokrates_field::Field; pub mod gm17; pub mod groth16; pub mod marlin; +pub mod nova; pub use self::gm17::GM17; pub use self::groth16::G16; pub use self::marlin::Marlin; +pub use self::nova::Nova; pub trait Scheme: Serialize { const NAME: &'static str; diff --git a/zokrates_proof_systems/src/scheme/nova.rs b/zokrates_proof_systems/src/scheme/nova.rs new file mode 100644 index 000000000..94e1373bf --- /dev/null +++ b/zokrates_proof_systems/src/scheme/nova.rs @@ -0,0 +1,28 @@ +use crate::scheme::Scheme; +use crate::{G1Affine, G2Affine}; + +use serde::{Deserialize, Serialize}; +use zokrates_field::Field; + +#[allow(clippy::upper_case_acronyms)] +#[derive(Serialize)] +pub struct Nova; + +#[derive(Serialize, Deserialize, Clone)] +pub struct ProofPoints { + foo: G1, + bar: G2, +} + +#[derive(Serialize, Deserialize)] +pub struct VerificationKey { + foo: G1, + bar: G2, +} + +impl Scheme for Nova { + const NAME: &'static str = "nova"; + + type VerificationKey = VerificationKey; + type ProofPoints = ProofPoints; +} From 24f8b1ceb912de5b7a9c71ac332e31baa9d7cbef Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 4 Oct 2022 13:38:34 +0200 Subject: [PATCH 04/30] implement cli command for toy nova computation in absence of serialization --- Cargo.lock | 55 +--- Cargo.toml | 1 - zokrates_ast/Cargo.toml | 3 +- zokrates_ast/src/ir/serialize.rs | 34 ++- zokrates_bellperson/Cargo.toml | 13 +- zokrates_bellperson/examples/10_cubes.rs | 121 +++++++++ zokrates_bellperson/src/lib.rs | 168 +----------- zokrates_bellperson/src/nova.rs | 310 ++++++++++++++++++++++ zokrates_cli/Cargo.toml | 4 +- zokrates_cli/src/bin.rs | 4 + zokrates_cli/src/ops/check.rs | 3 +- zokrates_cli/src/ops/compile.rs | 3 +- zokrates_cli/src/ops/compute_witness.rs | 2 + zokrates_cli/src/ops/generate_proof.rs | 3 + zokrates_cli/src/ops/generate_smtlib2.rs | 2 + zokrates_cli/src/ops/inspect.rs | 2 + zokrates_cli/src/ops/mod.rs | 2 + zokrates_cli/src/ops/nova/mod.rs | 16 ++ zokrates_cli/src/ops/nova/prove.rs | 201 ++++++++++++++ zokrates_cli/src/ops/setup.rs | 3 + zokrates_common/Cargo.toml | 3 +- zokrates_common/src/constants.rs | 3 + zokrates_common/src/helpers.rs | 17 ++ zokrates_core/Cargo.toml | 3 +- zokrates_field/Cargo.toml | 5 +- zokrates_field/src/lib.rs | 6 + zokrates_field/src/pallas.rs | 7 +- zokrates_field/src/vesta.rs | 7 +- zokrates_js/src/lib.rs | 13 +- zokrates_proof_systems/src/scheme/mod.rs | 2 - zokrates_proof_systems/src/scheme/nova.rs | 28 -- 31 files changed, 783 insertions(+), 261 deletions(-) create mode 100644 zokrates_bellperson/examples/10_cubes.rs create mode 100644 zokrates_bellperson/src/nova.rs create mode 100644 zokrates_cli/src/ops/nova/mod.rs create mode 100644 zokrates_cli/src/ops/nova/prove.rs delete mode 100644 zokrates_proof_systems/src/scheme/nova.rs diff --git a/Cargo.lock b/Cargo.lock index 43d887fcc..599d0bdb3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2006,34 +2006,6 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -[[package]] -name = "nova-snark" -version = "0.8.1" -dependencies = [ - "bellperson", - "bellperson-nonnative", - "bincode 1.3.3", - "bitvec 1.0.0", - "digest 0.8.1", - "ff", - "flate2", - "generic-array 0.14.5", - "itertools 0.9.0", - "merlin", - "neptune", - "num-bigint 0.4.3", - "num-traits 0.2.15", - "pasta-msm", - "pasta_curves", - "rand 0.8.5", - "rand_chacha", - "rand_core 0.5.1", - "rayon", - "serde", - "sha3 0.8.2", - "subtle 2.4.1", -] - [[package]] name = "nova-snark" version = "0.8.1" @@ -3782,12 +3754,16 @@ name = "zokrates_bellperson" version = "0.1.0" dependencies = [ "bellperson", + "ff", "getrandom 0.2.7", "hex 0.4.3", - "nova-snark 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nova-snark", "pairing", + "pasta_curves", "rand 0.4.6", + "typed-arena", "zokrates_ast", + "zokrates_core", "zokrates_field", "zokrates_interpreter", "zokrates_proof_systems", @@ -3838,6 +3814,7 @@ dependencies = [ "zokrates_ark", "zokrates_ast", "zokrates_bellman", + "zokrates_bellperson", "zokrates_circom", "zokrates_common", "zokrates_core", @@ -3920,6 +3897,7 @@ dependencies = [ "bincode 0.8.0", "ff", "lazy_static", + "nova-snark", "num-bigint 0.2.6", "num-integer", "num-traits 0.2.15", @@ -3982,25 +3960,6 @@ dependencies = [ "zokrates_proof_systems", ] -[[package]] -name = "zokrates_nova" -version = "0.1.0" -dependencies = [ - "bellperson", - "getrandom 0.2.7", - "hex 0.4.3", - "nova-snark 0.8.1", - "pairing", - "pasta_curves", - "rand 0.4.6", - "typed-arena", - "zokrates_ast", - "zokrates_bellperson", - "zokrates_core", - "zokrates_field", - "zokrates_interpreter", -] - [[package]] name = "zokrates_parser" version = "0.3.2" diff --git a/Cargo.toml b/Cargo.toml index 476c351b6..a38f6685c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,6 @@ members = [ "zokrates_embed", "zokrates_bellman", "zokrates_bellperson", - "zokrates_nova", "zokrates_proof_systems", "zokrates_js", "zokrates_circom" diff --git a/zokrates_ast/Cargo.toml b/zokrates_ast/Cargo.toml index 00804b87a..c0c523116 100644 --- a/zokrates_ast/Cargo.toml +++ b/zokrates_ast/Cargo.toml @@ -4,9 +4,10 @@ version = "0.1.2" edition = "2021" [features] -default = ["bellman", "ark"] +default = ["bellman", "ark", "bellperson"] bellman = ["zokrates_field/bellman_extensions", "pairing_ce", "zokrates_embed/bellman"] ark = ["ark-bls12-377", "zokrates_embed/ark"] +bellperson = ["zokrates_field/bellperson_extensions"] [dependencies] zokrates_pest_ast = { version = "0.3.0", path = "../zokrates_pest_ast" } diff --git a/zokrates_ast/src/ir/serialize.rs b/zokrates_ast/src/ir/serialize.rs index 39c746368..628808e20 100644 --- a/zokrates_ast/src/ir/serialize.rs +++ b/zokrates_ast/src/ir/serialize.rs @@ -16,11 +16,15 @@ pub enum ProgEnum< Bn128I: IntoIterator>, Bls12_377I: IntoIterator>, Bw6_761I: IntoIterator>, + PallasI: IntoIterator>, + VestaI: IntoIterator>, > { Bls12_381Program(ProgIterator), Bn128Program(ProgIterator), Bls12_377Program(ProgIterator), Bw6_761Program(ProgIterator), + PallasProgram(ProgIterator), + VestaProgram(ProgIterator), } type MemoryProgEnum = ProgEnum< @@ -28,6 +32,8 @@ type MemoryProgEnum = ProgEnum< Vec>, Vec>, Vec>, + Vec>, + Vec>, >; impl< @@ -35,7 +41,9 @@ impl< Bn128I: IntoIterator>, Bls12_377I: IntoIterator>, Bw6_761I: IntoIterator>, - > ProgEnum + PallasI: IntoIterator>, + VestaI: IntoIterator>, + > ProgEnum { pub fn collect(self) -> MemoryProgEnum { match self { @@ -43,6 +51,8 @@ impl< ProgEnum::Bn128Program(p) => ProgEnum::Bn128Program(p.collect()), ProgEnum::Bls12_377Program(p) => ProgEnum::Bls12_377Program(p.collect()), ProgEnum::Bw6_761Program(p) => ProgEnum::Bw6_761Program(p.collect()), + ProgEnum::PallasProgram(p) => ProgEnum::PallasProgram(p.collect()), + ProgEnum::VestaProgram(p) => ProgEnum::VestaProgram(p.collect()), } } pub fn curve(&self) -> &'static str { @@ -51,6 +61,8 @@ impl< ProgEnum::Bls12_381Program(_) => Bls12_381Field::name(), ProgEnum::Bls12_377Program(_) => Bls12_377Field::name(), ProgEnum::Bw6_761Program(_) => Bw6_761Field::name(), + ProgEnum::PallasProgram(_) => Bls12_377Field::name(), + ProgEnum::VestaProgram(_) => Bw6_761Field::name(), } } } @@ -110,6 +122,8 @@ impl<'de, R: Read> UnwrappedStreamDeserializer<'de, serde_cbor::de::IoRead, Statement>, UnwrappedStreamDeserializer<'de, serde_cbor::de::IoRead, Statement>, UnwrappedStreamDeserializer<'de, serde_cbor::de::IoRead, Statement>, + UnwrappedStreamDeserializer<'de, serde_cbor::de::IoRead, Statement>, + UnwrappedStreamDeserializer<'de, serde_cbor::de::IoRead, Statement>, > { pub fn deserialize(mut r: R) -> Result { @@ -224,6 +238,24 @@ impl<'de, R: Read> return_count, ))) } + m if m == PallasField::id() => { + let s = p.into_iter::>(); + + Ok(ProgEnum::PallasProgram(ProgIterator::new( + arguments, + UnwrappedStreamDeserializer { s }, + return_count, + ))) + } + m if m == VestaField::id() => { + let s = p.into_iter::>(); + + Ok(ProgEnum::VestaProgram(ProgIterator::new( + arguments, + UnwrappedStreamDeserializer { s }, + return_count, + ))) + } _ => Err(String::from("Unknown curve identifier")), } } else { diff --git a/zokrates_bellperson/Cargo.toml b/zokrates_bellperson/Cargo.toml index 89a8cccde..e19e84e1a 100644 --- a/zokrates_bellperson/Cargo.toml +++ b/zokrates_bellperson/Cargo.toml @@ -10,17 +10,24 @@ wasm = ["bellperson/wasm"] zokrates_field = { version = "0.5", path = "../zokrates_field", features = ["bellperson_extensions"] } zokrates_ast = { version = "0.1", path = "../zokrates_ast", default-features = false } zokrates_proof_systems = { version = "0.1", path = "../zokrates_proof_systems", default-features = false } - bellperson = { package = "bellperson", version = "^0.22", default-features = false, features = ["groth16"] } rand_0_4 = { version = "0.4", package = "rand" }# getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] } hex = "0.4.2" pairing = "0.22" - +ff = { version = "0.12.0", default-features = false } nova-snark = { version = "0.8.1" } +zokrates_interpreter = { version = "0.1", path = "../zokrates_interpreter" } + [dev-dependencies] -zokrates_interpreter = { version = "0.1", path = "../zokrates_interpreter" } +typed-arena = "1.4.1" +rand_0_4 = { version = "0.4", package = "rand" } +getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] } +hex = "0.4.2" +pairing = "0.22" +zokrates_core = { version = "0.7", path = "../zokrates_core", default-features = false, features = ["ark", "bellman"] } +pasta_curves = { version = "0.4.0", features = ["repr-c"] } diff --git a/zokrates_bellperson/examples/10_cubes.rs b/zokrates_bellperson/examples/10_cubes.rs new file mode 100644 index 000000000..89d7ef454 --- /dev/null +++ b/zokrates_bellperson/examples/10_cubes.rs @@ -0,0 +1,121 @@ +use nova_snark::traits::circuit::TrivialTestCircuit; +use nova_snark::CompressedSNARK; +use nova_snark::PublicParams; +use nova_snark::RecursiveSNARK; +use pasta_curves::{Fp, Fq}; +use std::io; +use std::time::Instant; +use typed_arena::Arena; +use zokrates_bellperson::nova::NovaComputation; +use zokrates_bellperson::Computation; +use zokrates_core::compile::{compile, CompileConfig}; +use zokrates_field::PallasField; + +type G1 = pasta_curves::pallas::Point; +type G2 = pasta_curves::vesta::Point; + +fn main() { + // create a circuit for the incremental computation + + let cube = r#" + def main(field x) -> field { + return x**3; + } + "#; + + let arena = Arena::new(); + + let artifacts = compile::( + cube.to_string(), + "main".into(), + None, + CompileConfig::default(), + &arena, + ) + .unwrap(); + + let prog = artifacts.prog().collect(); + + let circuit_primary = NovaComputation(Computation::without_witness(prog)); + let circuit_secondary = TrivialTestCircuit::default(); + + type C1 = NovaComputation; + type C2 = TrivialTestCircuit; + + // produce public parameters + println!("Producing public parameters..."); + let pp = + PublicParams::::setup(circuit_primary.clone(), circuit_secondary.clone()); + + // produce a recursive SNARK + println!("Generating a RecursiveSNARK..."); + let mut recursive_snark: Option> = None; + + let num_steps: usize = 10; + + let z0_primary = vec![Fq::one() + Fq::one()]; + let z0_secondary = vec![Fp::one()]; + + for i in 0..num_steps { + let start = Instant::now(); + let res = RecursiveSNARK::prove_step( + &pp, + recursive_snark, + circuit_primary.clone(), + circuit_secondary.clone(), + z0_primary.clone(), + z0_secondary.clone(), + ); + assert!(res.is_ok()); + println!( + "RecursiveSNARK::prove_step {}: {:?}, took {:?} ", + i, + res.is_ok(), + start.elapsed() + ); + recursive_snark = Some(res.unwrap()); + } + + assert!(recursive_snark.is_some()); + let recursive_snark = recursive_snark.unwrap(); + + // verify the recursive SNARK + println!("Verifying a RecursiveSNARK..."); + let start = Instant::now(); + let res = recursive_snark.verify(&pp, num_steps, z0_primary.clone(), z0_secondary.clone()); + + println!("{:#?}", res); + + println!( + "RecursiveSNARK::verify: {:?}, took {:?}", + res.is_ok(), + start.elapsed() + ); + assert!(res.is_ok()); + + // produce a compressed SNARK + println!("Generating a CompressedSNARK using Spartan with IPA-PC..."); + let start = Instant::now(); + type S1 = nova_snark::spartan_with_ipa_pc::RelaxedR1CSSNARK; + type S2 = nova_snark::spartan_with_ipa_pc::RelaxedR1CSSNARK; + let res = CompressedSNARK::<_, _, _, _, S1, S2>::prove(&pp, &recursive_snark); + println!( + "CompressedSNARK::prove: {:?}, took {:?}", + res.is_ok(), + start.elapsed() + ); + assert!(res.is_ok()); + let compressed_snark = res.unwrap(); + + // verify the compressed SNARK + println!("Verifying a CompressedSNARK..."); + let start = Instant::now(); + let res = compressed_snark.verify(&pp, num_steps, z0_primary, z0_secondary); + println!( + "CompressedSNARK::verify: {:?}, took {:?}", + res.is_ok(), + start.elapsed() + ); + assert!(res.is_ok()); + println!("========================================================="); +} diff --git a/zokrates_bellperson/src/lib.rs b/zokrates_bellperson/src/lib.rs index 675fac98f..678649cb3 100644 --- a/zokrates_bellperson/src/lib.rs +++ b/zokrates_bellperson/src/lib.rs @@ -1,5 +1,4 @@ -//pub mod groth16; -// pub mod nova; +pub mod nova; use bellperson::gadgets::num::AllocatedNum; use bellperson::{ @@ -160,168 +159,3 @@ impl>> .collect() } } - -#[cfg(test)] -mod tests { - use super::*; - use zokrates_ast::ir::LinComb; - use zokrates_field::Bn128Field; - use zokrates_interpreter::Interpreter; - - mod prove { - use super::*; - use zokrates_ast::flat::Parameter; - use zokrates_ast::ir::Prog; - - #[test] - fn empty() { - let program: Prog = Prog::default(); - - let interpreter = Interpreter::default(); - - let witness = interpreter.execute(program.clone(), &[]).unwrap(); - let computation = Computation::with_witness(program, witness); - - let params = computation.clone().setup(); - let _proof = computation.prove(¶ms); - } - - #[test] - fn identity() { - let program: Prog = Prog { - arguments: vec![Parameter::private(Variable::new(0))], - return_count: 1, - statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], - }; - - let interpreter = Interpreter::default(); - - let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(0)]) - .unwrap(); - - let computation = Computation::with_witness(program, witness); - - let params = computation.clone().setup(); - let _proof = computation.prove(¶ms); - } - - #[test] - fn public_identity() { - let program: Prog = Prog { - arguments: vec![Parameter::public(Variable::new(0))], - return_count: 1, - statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], - }; - - let interpreter = Interpreter::default(); - - let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(0)]) - .unwrap(); - - let computation = Computation::with_witness(program, witness); - - let params = computation.clone().setup(); - let _proof = computation.prove(¶ms); - } - - #[test] - fn no_arguments() { - let program: Prog = Prog { - arguments: vec![], - return_count: 1, - statements: vec![Statement::constraint(Variable::one(), Variable::public(0))], - }; - - let interpreter = Interpreter::default(); - - let witness = interpreter.execute(program.clone(), &[]).unwrap(); - let computation = Computation::with_witness(program, witness); - - let params = computation.clone().setup(); - let _proof = computation.prove(¶ms); - } - - #[test] - fn unordered_variables() { - // public variables must be ordered from 0 - // private variables can be unordered - let program: Prog = Prog { - arguments: vec![ - Parameter::private(Variable::new(42)), - Parameter::public(Variable::new(51)), - ], - return_count: 2, - statements: vec![ - Statement::constraint( - LinComb::from(Variable::new(42)) + LinComb::from(Variable::new(51)), - Variable::public(0), - ), - Statement::constraint( - LinComb::from(Variable::one()) + LinComb::from(Variable::new(42)), - Variable::public(1), - ), - ], - }; - - let interpreter = Interpreter::default(); - - let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(3), Bn128Field::from(4)]) - .unwrap(); - let computation = Computation::with_witness(program, witness); - - let params = computation.clone().setup(); - let _proof = computation.prove(¶ms); - } - - #[test] - fn one() { - let program: Prog = Prog { - arguments: vec![Parameter::public(Variable::new(42))], - return_count: 1, - statements: vec![Statement::constraint( - LinComb::from(Variable::new(42)) + LinComb::one(), - Variable::public(0), - )], - }; - - let interpreter = Interpreter::default(); - - let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(3)]) - .unwrap(); - - let computation = Computation::with_witness(program, witness); - - let params = computation.clone().setup(); - let _proof = computation.prove(¶ms); - } - - #[test] - fn with_directives() { - let program: Prog = Prog { - arguments: vec![ - Parameter::private(Variable::new(42)), - Parameter::public(Variable::new(51)), - ], - return_count: 1, - statements: vec![Statement::constraint( - LinComb::from(Variable::new(42)) + LinComb::from(Variable::new(51)), - Variable::public(0), - )], - }; - - let interpreter = Interpreter::default(); - - let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(3), Bn128Field::from(4)]) - .unwrap(); - let computation = Computation::with_witness(program, witness); - - let params = computation.clone().setup(); - let _proof = computation.prove(¶ms); - } - } -} diff --git a/zokrates_bellperson/src/nova.rs b/zokrates_bellperson/src/nova.rs new file mode 100644 index 000000000..f0d302d8f --- /dev/null +++ b/zokrates_bellperson/src/nova.rs @@ -0,0 +1,310 @@ +use std::collections::BTreeMap; + +use crate::Computation; +use bellperson::gadgets::num::AllocatedNum; +use bellperson::SynthesisError; +use ff::Field as FFField; +use nova_snark::errors::NovaError; +pub use nova_snark::traits::circuit::StepCircuit; +pub use nova_snark::traits::circuit::TrivialTestCircuit; +use nova_snark::traits::Group; +pub use nova_snark::PublicParams as GPublicParams; +pub use nova_snark::RecursiveSNARK as GRecursiveSNARK; +use std::fmt; +use zokrates_ast::ir::*; +use zokrates_field::{BellpersonFieldExtensions, Cycle, Field}; +use zokrates_interpreter::Interpreter; + +pub trait NovaField: + Field + + BellpersonFieldExtensions::Point as Group>::Scalar> + + Cycle +{ +} + +impl< + T: Field + + BellpersonFieldExtensions::Point as Group>::Scalar> + + Cycle, + > NovaField for T +{ +} + +#[derive(Clone, Debug)] +pub struct NovaComputation(Computation>>); + +impl TryFrom>>> for NovaComputation { + type Error = Error; + fn try_from(c: Computation>>) -> Result { + if c.program.arguments.len() != c.program.return_count { + return Err(Error::User(format!("Number of return values must match number of input values for Nova circuits, found `{} != {}`", c.program.return_count, c.program.arguments.len()))); + } + + Ok(NovaComputation(c)) + } +} + +type G1 = ::Point; +type G2 = <::Other as Cycle>::Point; +type C1 = NovaComputation; +type C2 = TrivialTestCircuit<<::Point as Group>::Base>; + +type PublicParams = GPublicParams, G2, C1, C2>; +type RecursiveSNARK = GRecursiveSNARK, G2, C1, C2>; + +#[derive(Debug)] +pub enum Error { + Internal(NovaError), + User(String), +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> std::fmt::Result { + match self { + Error::Internal(e) => write!(f, "Internal error: {:#?}", e), + Error::User(s) => write!(f, "{}", s), + } + } +} + +impl From for Error { + fn from(e: NovaError) -> Self { + Self::Internal(e) + } +} + +pub fn generate_public_parameters< + T: Field + + BellpersonFieldExtensions::Point as Group>::Scalar> + + Cycle, +>( + program: Prog, +) -> Result, Error> { + Ok(GPublicParams::setup( + NovaComputation::try_from(Computation::without_witness(program))?, + TrivialTestCircuit::default(), + )) +} + +pub fn verify( + params: &PublicParams, + proof: RecursiveSNARK, + steps_count: usize, + arguments: Vec, +) -> Result<(), Error> { + let z0_primary: Vec<_> = arguments.into_iter().map(|a| a.into_bellperson()).collect(); + let z0_secondary = vec![<::Point as Group>::Base::one()]; + + proof + .verify(params, steps_count, z0_primary, z0_secondary) + .map(|_| ()) + .map_err(Error::Internal) +} + +pub fn prove( + public_parameters: &PublicParams, + program: Prog, + arguments: Vec, + steps_count: usize, +) -> Result>, Error> { + if steps_count == 0 { + return Ok(None); + } + + let c_primary = NovaComputation::try_from(Computation::without_witness(program))?; + let c_secondary = TrivialTestCircuit::default(); + let z0_primary: Vec<_> = arguments.into_iter().map(|a| a.into_bellperson()).collect(); + + let z0_secondary = vec![<::Point as Group>::Base::one()]; + + let mut proof = None; + + for _ in 0..steps_count { + proof = Some(RecursiveSNARK::prove_step( + public_parameters, + proof, + c_primary.clone(), + c_secondary.clone(), + z0_primary.clone(), + z0_secondary.clone(), + )?); + } + + Ok(proof) +} + +impl StepCircuit + for NovaComputation +{ + fn arity(&self) -> usize { + let input_count = self.0.program.arguments.len(); + let output_count = self.0.program.return_count; + assert_eq!(input_count, output_count); + input_count + } + + fn synthesize>( + &self, + cs: &mut CS, + input: &[bellperson::gadgets::num::AllocatedNum], + ) -> Result< + Vec>, + bellperson::SynthesisError, + > { + assert_eq!(self.0.program.arguments.len(), input.len()); + + let mut symbols = BTreeMap::new(); + + let mut witness = Witness::default(); + + // populate the witness if we got some input values + // this is a bit hacky and in particular generates the witness in all cases if there are no inputs + if input + .get(0) + .map(|n| n.get_value().is_some()) + .unwrap_or(true) + { + let interpreter = Interpreter::default(); + let inputs: Vec<_> = input + .iter() + .map(|v| T::from_bellperson(v.get_value().unwrap())) + .collect(); + witness = interpreter + .execute(self.0.program.clone(), &inputs) + .unwrap(); + } + + // allocate the inputs + for (p, allocated_num) in self.0.program.arguments.iter().zip(input) { + symbols.insert(p.id, allocated_num.get_variable()); + } + + // allocate the outputs + + let outputs: Vec<_> = self + .0 + .program + .returns() + .iter() + .map(|v| { + assert!(v.id < 0); // this should indeed be an output + let wire = AllocatedNum::alloc( + cs.namespace(|| format!("NOVA_INCREMENTAL_OUTPUT_{}", -v.id - 1)), + || { + Ok(witness + .0 + .remove(v) + .ok_or(SynthesisError::AssignmentMissing)? + .into_bellperson()) + }, + ) + .unwrap(); + symbols.insert(*v, wire.get_variable()); + wire + }) + .collect(); + + self.0 + .clone() + .synthesize_input_to_output(cs, &mut symbols, &mut witness)?; + + Ok(outputs) + } + + fn output(&self, z: &[T::BellpersonField]) -> Vec { + let interpreter = Interpreter::default(); + let inputs: Vec<_> = z.iter().map(|v| T::from_bellperson(*v)).collect(); + let output = interpreter + .execute(self.0.program.clone(), &inputs) + .unwrap(); + output + .return_values() + .into_iter() + .map(|v| v.into_bellperson()) + .collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use zokrates_ast::ir::LinComb; + + mod prove { + use super::*; + use zokrates_ast::flat::Parameter; + use zokrates_ast::ir::Prog; + use zokrates_field::PallasField; + + fn test(program: Prog, arguments: Vec, step_count: usize) { + let params = generate_public_parameters(program.clone()).unwrap(); + let proof = prove(¶ms, program.clone(), arguments.clone(), step_count).unwrap(); + assert!(verify(¶ms, proof.unwrap(), step_count, arguments).is_ok()); + } + + #[test] + fn empty() { + let program: Prog = Prog::default(); + test(program, vec![], 3); + } + + #[test] + fn identity() { + let program: Prog = Prog { + arguments: vec![Parameter::private(Variable::new(0))], + return_count: 1, + statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], + }; + + test(program, vec![PallasField::from(0)], 3); + } + + #[test] + fn public_identity() { + let program: Prog = Prog { + arguments: vec![Parameter::public(Variable::new(0))], + return_count: 1, + statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], + }; + + test(program, vec![PallasField::from(0)], 3); + } + + #[test] + fn plus_one() { + let program = Prog { + arguments: vec![Parameter::public(Variable::new(42))], + return_count: 1, + statements: vec![Statement::constraint( + LinComb::from(Variable::new(42)) + LinComb::one(), + Variable::public(0), + )], + }; + + test(program, vec![PallasField::from(3)], 3); + } + + #[test] + fn private_gaps() { + let program = Prog { + arguments: vec![ + Parameter::private(Variable::new(42)), + Parameter::public(Variable::new(51)), + ], + return_count: 2, + statements: vec![ + Statement::constraint( + LinComb::from(Variable::new(42)) + LinComb::from(Variable::new(51)), + Variable::public(0), + ), + Statement::constraint( + LinComb::from(Variable::new(51)) + LinComb::from(Variable::new(42)), + Variable::public(1), + ), + ], + }; + + test(program, vec![PallasField::from(0)], 3); + } + } +} diff --git a/zokrates_cli/Cargo.toml b/zokrates_cli/Cargo.toml index 81e9a7472..49f491d4e 100644 --- a/zokrates_cli/Cargo.toml +++ b/zokrates_cli/Cargo.toml @@ -6,9 +6,10 @@ repository = "https://github.com/Zokrates/ZoKrates.git" edition = "2018" [features] -default = ["bellman", "ark"] +default = ["bellman", "ark", "bellperson"] bellman = ["zokrates_bellman", "zokrates_core/bellman", "zokrates_common/bellman"] ark = ["zokrates_ark", "zokrates_core/ark", "zokrates_common/ark"] +bellperson = ["zokrates_bellperson", "zokrates_core/bellperson", "zokrates_common/bellperson"] [dependencies] log = "0.4" @@ -41,6 +42,7 @@ sha2 = "0.10.0" zokrates_proof_systems = { version = "0.1", path = "../zokrates_proof_systems", default-features = false } zokrates_ark = { version = "0.1", path = "../zokrates_ark", default-features = false, optional = true } zokrates_bellman = { version = "0.1", path = "../zokrates_bellman", default-features = false, optional = true } +zokrates_bellperson = { version = "0.1", path = "../zokrates_bellperson", default-features = false, optional = true } [dev-dependencies] glob = "0.2.11" diff --git a/zokrates_cli/src/bin.rs b/zokrates_cli/src/bin.rs index 99a1b0838..84110338c 100644 --- a/zokrates_cli/src/bin.rs +++ b/zokrates_cli/src/bin.rs @@ -49,6 +49,8 @@ fn cli() -> Result<(), String> { universal_setup::subcommand(), #[cfg(feature = "bellman")] mpc::subcommand(), + #[cfg(feature = "bellperson")] + nova::subcommand(), #[cfg(any(feature = "bellman", feature = "ark"))] setup::subcommand(), export_verifier::subcommand(), @@ -69,6 +71,8 @@ fn cli() -> Result<(), String> { ("universal-setup", Some(sub_matches)) => universal_setup::exec(sub_matches), #[cfg(feature = "bellman")] ("mpc", Some(sub_matches)) => mpc::exec(sub_matches), + #[cfg(feature = "bellperson")] + ("nova", Some(sub_matches)) => nova::exec(sub_matches), #[cfg(any(feature = "bellman", feature = "ark"))] ("setup", Some(sub_matches)) => setup::exec(sub_matches), ("export-verifier", Some(sub_matches)) => export_verifier::exec(sub_matches), diff --git a/zokrates_cli/src/ops/check.rs b/zokrates_cli/src/ops/check.rs index 08161335c..285e76800 100644 --- a/zokrates_cli/src/ops/check.rs +++ b/zokrates_cli/src/ops/check.rs @@ -8,7 +8,7 @@ use zokrates_common::constants::BN128; use zokrates_common::helpers::CurveParameter; use zokrates_core::compile::{check, CompileConfig, CompileError}; use zokrates_field::{ - Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, + Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, VestaField, }; use zokrates_fs_resolver::FileSystemResolver; @@ -59,6 +59,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { CurveParameter::Bls12_381 => cli_check::(sub_matches), CurveParameter::Bw6_761 => cli_check::(sub_matches), CurveParameter::Pallas => cli_check::(sub_matches), + CurveParameter::Vesta => cli_check::(sub_matches), } } diff --git a/zokrates_cli/src/ops/compile.rs b/zokrates_cli/src/ops/compile.rs index b28ba6366..16bb987df 100644 --- a/zokrates_cli/src/ops/compile.rs +++ b/zokrates_cli/src/ops/compile.rs @@ -11,7 +11,7 @@ use zokrates_common::constants::BN128; use zokrates_common::helpers::CurveParameter; use zokrates_core::compile::{compile, CompileConfig, CompileError}; use zokrates_field::{ - Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, + Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, VestaField, }; use zokrates_fs_resolver::FileSystemResolver; @@ -84,6 +84,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { CurveParameter::Bls12_381 => cli_compile::(sub_matches), CurveParameter::Bw6_761 => cli_compile::(sub_matches), CurveParameter::Pallas => cli_compile::(sub_matches), + CurveParameter::Vesta => cli_compile::(sub_matches), } } diff --git a/zokrates_cli/src/ops/compute_witness.rs b/zokrates_cli/src/ops/compute_witness.rs index 865f3c9b4..b8e286061 100644 --- a/zokrates_cli/src/ops/compute_witness.rs +++ b/zokrates_cli/src/ops/compute_witness.rs @@ -82,6 +82,8 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ProgEnum::Bls12_377Program(p) => cli_compute(p, sub_matches), ProgEnum::Bls12_381Program(p) => cli_compute(p, sub_matches), ProgEnum::Bw6_761Program(p) => cli_compute(p, sub_matches), + ProgEnum::PallasProgram(p) => cli_compute(p, sub_matches), + ProgEnum::VestaProgram(p) => cli_compute(p, sub_matches), } } diff --git a/zokrates_cli/src/ops/generate_proof.rs b/zokrates_cli/src/ops/generate_proof.rs index 2a62042a4..005563fae 100644 --- a/zokrates_cli/src/ops/generate_proof.rs +++ b/zokrates_cli/src/ops/generate_proof.rs @@ -112,6 +112,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ProgEnum::Bls12_381Program(p) => cli_generate_proof::<_, _, G16, Ark>(p, sub_matches), ProgEnum::Bls12_377Program(p) => cli_generate_proof::<_, _, G16, Ark>(p, sub_matches), ProgEnum::Bw6_761Program(p) => cli_generate_proof::<_, _, G16, Ark>(p, sub_matches), + _ => unreachable!(), }, #[cfg(feature = "ark")] Parameters(BackendParameter::Ark, _, SchemeParameter::GM17) => match prog { @@ -119,6 +120,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ProgEnum::Bls12_381Program(p) => cli_generate_proof::<_, _, GM17, Ark>(p, sub_matches), ProgEnum::Bls12_377Program(p) => cli_generate_proof::<_, _, GM17, Ark>(p, sub_matches), ProgEnum::Bw6_761Program(p) => cli_generate_proof::<_, _, GM17, Ark>(p, sub_matches), + _ => unreachable!(), }, #[cfg(feature = "ark")] Parameters(BackendParameter::Ark, _, SchemeParameter::MARLIN) => match prog { @@ -130,6 +132,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { cli_generate_proof::<_, _, Marlin, Ark>(p, sub_matches) } ProgEnum::Bw6_761Program(p) => cli_generate_proof::<_, _, Marlin, Ark>(p, sub_matches), + _ => unreachable!(), }, _ => unreachable!(), } diff --git a/zokrates_cli/src/ops/generate_smtlib2.rs b/zokrates_cli/src/ops/generate_smtlib2.rs index b1bf6f6a8..7006b3cb3 100644 --- a/zokrates_cli/src/ops/generate_smtlib2.rs +++ b/zokrates_cli/src/ops/generate_smtlib2.rs @@ -44,6 +44,8 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ProgEnum::Bls12_377Program(p) => cli_smtlib2(p, sub_matches), ProgEnum::Bls12_381Program(p) => cli_smtlib2(p, sub_matches), ProgEnum::Bw6_761Program(p) => cli_smtlib2(p, sub_matches), + ProgEnum::PallasProgram(p) => cli_smtlib2(p, sub_matches), + ProgEnum::VestaProgram(p) => cli_smtlib2(p, sub_matches), } } diff --git a/zokrates_cli/src/ops/inspect.rs b/zokrates_cli/src/ops/inspect.rs index 523d664a4..e1eaab584 100644 --- a/zokrates_cli/src/ops/inspect.rs +++ b/zokrates_cli/src/ops/inspect.rs @@ -40,6 +40,8 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ProgEnum::Bls12_377Program(p) => cli_inspect(p, sub_matches), ProgEnum::Bls12_381Program(p) => cli_inspect(p, sub_matches), ProgEnum::Bw6_761Program(p) => cli_inspect(p, sub_matches), + ProgEnum::PallasProgram(p) => cli_inspect(p, sub_matches), + ProgEnum::VestaProgram(p) => cli_inspect(p, sub_matches), } } diff --git a/zokrates_cli/src/ops/mod.rs b/zokrates_cli/src/ops/mod.rs index e82dd506a..ac8738cd4 100644 --- a/zokrates_cli/src/ops/mod.rs +++ b/zokrates_cli/src/ops/mod.rs @@ -8,6 +8,8 @@ pub mod generate_smtlib2; pub mod inspect; #[cfg(feature = "bellman")] pub mod mpc; +#[cfg(feature = "bellperson")] +pub mod nova; pub mod print_proof; #[cfg(any(feature = "bellman", feature = "ark"))] pub mod setup; diff --git a/zokrates_cli/src/ops/nova/mod.rs b/zokrates_cli/src/ops/nova/mod.rs new file mode 100644 index 000000000..4d39e4152 --- /dev/null +++ b/zokrates_cli/src/ops/nova/mod.rs @@ -0,0 +1,16 @@ +use clap::{App, ArgMatches, SubCommand}; + +pub mod prove; + +pub fn subcommand() -> App<'static, 'static> { + SubCommand::with_name("nova") + .about("Nova IVC") + .subcommands(vec![prove::subcommand().display_order(1)]) +} + +pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { + match sub_matches.subcommand() { + ("prove", Some(sub_matches)) => prove::exec(sub_matches), + _ => unreachable!(), + } +} diff --git a/zokrates_cli/src/ops/nova/prove.rs b/zokrates_cli/src/ops/nova/prove.rs new file mode 100644 index 000000000..10950ac57 --- /dev/null +++ b/zokrates_cli/src/ops/nova/prove.rs @@ -0,0 +1,201 @@ +use crate::cli_constants::{self, FLATTENED_CODE_DEFAULT_PATH}; +use clap::{App, Arg, ArgMatches, SubCommand}; +use serde_json::from_reader; +use std::fs::File; +use std::io::stdin; +use std::io::{BufReader, Read}; +use std::path::Path; +use zokrates_abi::Encode; +use zokrates_ast::ir::{self, ProgEnum}; +use zokrates_ast::typed::abi::Abi; +use zokrates_ast::typed::types::GTupleType; +use zokrates_ast::typed::{ConcreteSignature, ConcreteType}; +use zokrates_bellperson::nova::{self, NovaField}; + +pub fn subcommand() -> App<'static, 'static> { + SubCommand::with_name("prove") + .about("Proves a single step of an incremental computation") + .arg(Arg::with_name("steps") + .long("steps") + .help("The number of steps to execute") + .takes_value(true) + .default_value("1"), + ) + .arg( + Arg::with_name("input") + .short("i") + .long("input") + .help("Path of the binary") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(FLATTENED_CODE_DEFAULT_PATH), + ) + .arg( + Arg::with_name("abi-spec") + .short("s") + .long("abi-spec") + .help("Path of the ABI specification") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(cli_constants::ABI_SPEC_DEFAULT_PATH) + ) + .arg( + Arg::with_name("arguments") + .short("a") + .long("arguments") + .help("Arguments for the program's main function, when not using ABI encoding. Expects a space-separated list of field elements like `-a 1 2 3`") + .takes_value(true) + .multiple(true) // allows multiple values + .required(false) + .conflicts_with("abi") + .conflicts_with("stdin") + ) + .arg( + Arg::with_name("abi") + .long("abi") + .help("Use ABI encoding. Arguments are expected as a JSON object as specified at zokrates.github.io/toolbox/abi.html#abi-input-format") + .conflicts_with("arguments") + .required(false) + ) + .arg( + Arg::with_name("stdin") + .long("stdin") + .help("Read arguments from stdin") + .conflicts_with("arguments") + .required(false) + ) +} + +pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { + // read compiled program + let path = Path::new(sub_matches.value_of("input").unwrap()); + let file = + File::open(&path).map_err(|why| format!("Could not open `{}`: {}", path.display(), why))?; + + let mut reader = BufReader::new(file); + + match ProgEnum::deserialize(&mut reader)? { + ProgEnum::PallasProgram(p) => cli_nova_prove_step(p, sub_matches), + ProgEnum::VestaProgram(p) => cli_nova_prove_step(p, sub_matches), + _ => Err("Nova is only supported for the following curves: [\"pallas\", \"vesta\"]".into()), + } +} + +fn cli_nova_prove_step>>( + program: ir::ProgIterator, + sub_matches: &ArgMatches, +) -> Result<(), String> { + let is_stdin = sub_matches.is_present("stdin"); + let is_abi = sub_matches.is_present("abi"); + let steps_count: usize = sub_matches.value_of("steps").unwrap().parse().unwrap(); + + let program = program.collect(); + + println!("Generating public parameters"); + + let params = nova::generate_public_parameters(program.clone()).map_err(|e| e.to_string())?; + + // get inputs (right now only for the first step but eventually at each step) + + println!("Reading program arguments"); + + if !is_stdin && is_abi { + return Err("ABI input as inline argument is not supported. Please use `--stdin`.".into()); + } + + let signature = match is_abi { + true => { + let path = Path::new(sub_matches.value_of("abi-spec").unwrap()); + let file = File::open(&path) + .map_err(|why| format!("Could not open {}: {}", path.display(), why))?; + let mut reader = BufReader::new(file); + + let abi: Abi = from_reader(&mut reader).map_err(|why| why.to_string())?; + + abi.signature() + } + false => ConcreteSignature::new() + .inputs(vec![ConcreteType::FieldElement; program.arguments.len()]) + .output(ConcreteType::Tuple(GTupleType::new( + vec![ConcreteType::FieldElement; program.return_count], + ))), + }; + + use zokrates_abi::Inputs; + + // get arguments + let arguments = match is_stdin { + // take inline arguments + false => { + let arguments = sub_matches.values_of("arguments"); + arguments + .map(|a| { + a.map(|x| T::try_from_dec_str(x).map_err(|_| x.to_string())) + .collect::, _>>() + }) + .unwrap_or_else(|| Ok(vec![])) + .map(Inputs::Raw) + } + // take stdin arguments + true => { + let mut stdin = stdin(); + let mut input = String::new(); + + match is_abi { + true => match stdin.read_to_string(&mut input) { + Ok(_) => { + use zokrates_abi::parse_strict; + + parse_strict(&input, signature.inputs) + .map(Inputs::Abi) + .map_err(|why| why.to_string()) + } + Err(_) => Err(String::from("???")), + }, + false => match program.arguments.len() { + 0 => Ok(Inputs::Raw(vec![])), + _ => match stdin.read_to_string(&mut input) { + Ok(_) => { + input.retain(|x| x != '\n'); + input + .split(' ') + .map(|x| T::try_from_dec_str(x).map_err(|_| x.to_string())) + .collect::, _>>() + .map(Inputs::Raw) + } + Err(_) => Err(String::from("???")), + }, + }, + } + } + } + .map_err(|e| format!("Could not parse argument: {}", e))?; + + let arguments = arguments.encode(); + + let proof = nova::prove(¶ms, program, arguments.clone(), steps_count) + .map_err(|e| format!("Error `{:#?}` during proving", e))?; + + match proof { + None => println!("No proof to verify"), + Some(proof) => { + // verify the recursive SNARK + println!("Verifying the final proof..."); + + let res = nova::verify(¶ms, proof, steps_count, arguments); + + match res { + Ok(_) => { + println!("Final proof verified succesfully"); + } + Err(e) => { + println!("Error `{:#?}` while verifying the final proof", e); + } + } + } + } + + Ok(()) +} diff --git a/zokrates_cli/src/ops/setup.rs b/zokrates_cli/src/ops/setup.rs index e9e8a2166..3d8b339c6 100644 --- a/zokrates_cli/src/ops/setup.rs +++ b/zokrates_cli/src/ops/setup.rs @@ -118,6 +118,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ProgEnum::Bw6_761Program(p) => { cli_setup_non_universal::<_, _, G16, Ark>(p, sub_matches) } + _ => unreachable!(), }, #[cfg(feature = "ark")] Parameters(BackendParameter::Ark, _, SchemeParameter::GM17) => match prog { @@ -131,6 +132,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ProgEnum::Bw6_761Program(p) => { cli_setup_non_universal::<_, _, GM17, Ark>(p, sub_matches) } + _ => unreachable!(), }, #[cfg(feature = "ark")] Parameters(BackendParameter::Ark, _, SchemeParameter::MARLIN) => { @@ -160,6 +162,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ProgEnum::Bw6_761Program(p) => { cli_setup_universal::<_, _, Marlin, Ark>(p, setup, sub_matches) } + _ => unreachable!(), } } _ => unreachable!(), diff --git a/zokrates_common/Cargo.toml b/zokrates_common/Cargo.toml index ef70f90d6..9fad7c336 100644 --- a/zokrates_common/Cargo.toml +++ b/zokrates_common/Cargo.toml @@ -7,9 +7,10 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -default = ["bellman", "ark"] +default = ["bellman", "ark", "bellperson"] bellman = [] ark = [] +bellperson = [] [dependencies] \ No newline at end of file diff --git a/zokrates_common/src/constants.rs b/zokrates_common/src/constants.rs index 77234c118..5327c8348 100644 --- a/zokrates_common/src/constants.rs +++ b/zokrates_common/src/constants.rs @@ -1,12 +1,15 @@ pub const BELLMAN: &str = "bellman"; pub const ARK: &str = "ark"; +pub const BELLPERSON: &str = "bellperson"; pub const BN128: &str = "bn128"; pub const BLS12_381: &str = "bls12_381"; pub const BLS12_377: &str = "bls12_377"; pub const BW6_761: &str = "bw6_761"; pub const PALLAS: &str = "pallas"; +pub const VESTA: &str = "vesta"; pub const G16: &str = "g16"; pub const GM17: &str = "gm17"; pub const MARLIN: &str = "marlin"; +pub const NOVA: &str = "nova"; diff --git a/zokrates_common/src/helpers.rs b/zokrates_common/src/helpers.rs index 1c21d5975..0041b6e4d 100644 --- a/zokrates_common/src/helpers.rs +++ b/zokrates_common/src/helpers.rs @@ -8,6 +8,7 @@ pub enum CurveParameter { Bls12_377, Bw6_761, Pallas, + Vesta, } impl std::fmt::Display for CurveParameter { @@ -20,6 +21,7 @@ impl std::fmt::Display for CurveParameter { Bls12_377 => write!(f, "bls12_377"), Bw6_761 => write!(f, "bw6_761"), Pallas => write!(f, "pallas"), + Vesta => write!(f, "vesta"), } } } @@ -30,6 +32,8 @@ pub enum BackendParameter { Bellman, #[cfg(feature = "ark")] Ark, + #[cfg(feature = "bellperson")] + Bellperson, } impl std::fmt::Display for BackendParameter { @@ -41,6 +45,8 @@ impl std::fmt::Display for BackendParameter { Bellman => write!(f, "bellman"), #[cfg(feature = "ark")] Ark => write!(f, "ark"), + #[cfg(feature = "bellperson")] + Bellperson => write!(f, "bellperson"), } } } @@ -51,6 +57,7 @@ pub enum SchemeParameter { G16, GM17, MARLIN, + NOVA, } impl std::fmt::Display for SchemeParameter { @@ -61,6 +68,7 @@ impl std::fmt::Display for SchemeParameter { G16 => write!(f, "g16"), GM17 => write!(f, "gm17"), MARLIN => write!(f, "marlin"), + NOVA => write!(f, "marlin"), } } } @@ -74,6 +82,8 @@ impl TryFrom<&str> for CurveParameter { BLS12_381 => Ok(CurveParameter::Bls12_381), BLS12_377 => Ok(CurveParameter::Bls12_377), BW6_761 => Ok(CurveParameter::Bw6_761), + PALLAS => Ok(CurveParameter::Pallas), + VESTA => Ok(CurveParameter::Vesta), _ => Err(format!("Unknown curve {}", s)), } } @@ -88,6 +98,8 @@ impl TryFrom<&str> for BackendParameter { BELLMAN => Ok(BackendParameter::Bellman), #[cfg(feature = "ark")] ARK => Ok(BackendParameter::Ark), + #[cfg(feature = "bellperson")] + BELLPERSON => Ok(BackendParameter::Bellperson), _ => Err(format!("Unknown backend {}", s)), } } @@ -101,6 +113,7 @@ impl TryFrom<&str> for SchemeParameter { G16 => Ok(SchemeParameter::G16), GM17 => Ok(SchemeParameter::GM17), MARLIN => Ok(SchemeParameter::MARLIN), + NOVA => Ok(SchemeParameter::NOVA), _ => Err(format!("Unknown proving scheme {}", s)), } } @@ -150,6 +163,10 @@ impl TryFrom<(&str, &str, &str)> for Parameters { (BackendParameter::Ark, CurveParameter::Bls12_377, SchemeParameter::MARLIN) => Ok(()), #[cfg(feature = "ark")] (BackendParameter::Ark, CurveParameter::Bw6_761, SchemeParameter::MARLIN) => Ok(()), + #[cfg(feature = "bellperson")] + (BackendParameter::Bellperson, CurveParameter::Pallas, SchemeParameter::NOVA) => Ok(()), + #[cfg(feature = "bellperson")] + (BackendParameter::Bellperson, CurveParameter::Vesta, SchemeParameter::NOVA) => Ok(()), #[cfg(feature = "bellman")] _ => Err(format!( "Unsupported combination of parameters (backend: {}, curve: {}, proving scheme: {})", diff --git a/zokrates_core/Cargo.toml b/zokrates_core/Cargo.toml index c1f316f2f..0f0a25177 100644 --- a/zokrates_core/Cargo.toml +++ b/zokrates_core/Cargo.toml @@ -7,9 +7,10 @@ repository = "https://github.com/Zokrates/ZoKrates" readme = "README.md" [features] -default = ["ark", "bellman"] +default = ["ark", "bellman", "bellperson"] ark = ["zokrates_ast/ark", "zokrates_embed/ark", "zokrates_common/ark", "zokrates_interpreter/ark"] bellman = ["zokrates_ast/bellman", "zokrates_embed/bellman", "zokrates_common/bellman", "zokrates_interpreter/bellman"] +bellperson = ["zokrates_ast/bellperson", "zokrates_common/bellperson"] [dependencies] log = "0.4" diff --git a/zokrates_field/Cargo.toml b/zokrates_field/Cargo.toml index 2e68f63cd..c9faf6b1c 100644 --- a/zokrates_field/Cargo.toml +++ b/zokrates_field/Cargo.toml @@ -5,8 +5,8 @@ authors = ["Thibaut Schaeffer ", "Guillaume Ballet { fn pow(self, _: RHS) -> Self::Output; } +pub trait Cycle { + type Other: Field + BellpersonFieldExtensions + Cycle; + type Point: Group::Point as Group>::Scalar>; +} + #[cfg(feature = "bellman_extensions")] pub trait BellmanFieldExtensions { /// An associated type to be able to operate with Bellman ff traits diff --git a/zokrates_field/src/pallas.rs b/zokrates_field/src/pallas.rs index 69ac32458..17204a93d 100644 --- a/zokrates_field/src/pallas.rs +++ b/zokrates_field/src/pallas.rs @@ -2,7 +2,12 @@ use ark_pallas::Fr as PallasBaseField; #[cfg(feature = "bellperson_extensions")] use pasta_curves::Fq; -use crate::G2Type; +use crate::{Cycle, G2Type, VestaField}; + +impl Cycle for FieldPrime { + type Other = VestaField; + type Point = pasta_curves::pallas::Point; +} prime_field!("pallas", PallasBaseField, G2Type::Fq2); diff --git a/zokrates_field/src/vesta.rs b/zokrates_field/src/vesta.rs index dce15a321..0cd19a1a9 100644 --- a/zokrates_field/src/vesta.rs +++ b/zokrates_field/src/vesta.rs @@ -2,7 +2,12 @@ use ark_vesta::Fr as VestaBaseField; #[cfg(feature = "bellperson_extensions")] use pasta_curves::Fp; -use crate::G2Type; +use crate::{Cycle, G2Type, PallasField}; + +impl Cycle for FieldPrime { + type Other = PallasField; + type Point = pasta_curves::vesta::Point; +} prime_field!("vesta", VestaBaseField, G2Type::Fq2); diff --git a/zokrates_js/src/lib.rs b/zokrates_js/src/lib.rs index 1d6fd02d4..dc97eb97b 100644 --- a/zokrates_js/src/lib.rs +++ b/zokrates_js/src/lib.rs @@ -26,7 +26,7 @@ use zokrates_core::compile::{ }; use zokrates_core::imports::Error; use zokrates_field::{ - Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, + Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, VestaField, }; use zokrates_proof_systems::groth16::G16; use zokrates_proof_systems::{ @@ -459,6 +459,9 @@ pub fn compile( CurveParameter::Pallas => { internal::compile::(source, location, resolve_callback, config) } + CurveParameter::Vesta => { + internal::compile::(source, location, resolve_callback, config) + } } } @@ -478,6 +481,8 @@ pub fn compute_witness( ProgEnum::Bls12_381Program(p) => internal::compute::<_>(p, abi, args, config, log_callback), ProgEnum::Bls12_377Program(p) => internal::compute::<_>(p, abi, args, config, log_callback), ProgEnum::Bw6_761Program(p) => internal::compute::<_>(p, abi, args, config, log_callback), + ProgEnum::PallasProgram(p) => internal::compute::<_>(p, abi, args, config, log_callback), + ProgEnum::VestaProgram(p) => internal::compute::<_>(p, abi, args, config, log_callback), } } @@ -549,12 +554,14 @@ pub fn setup(program: &[u8], options: JsValue) -> Result { ProgEnum::Bls12_381Program(p) => Ok(internal::setup_non_universal::<_, G16, Ark>(p)), ProgEnum::Bls12_377Program(p) => Ok(internal::setup_non_universal::<_, G16, Ark>(p)), ProgEnum::Bw6_761Program(p) => Ok(internal::setup_non_universal::<_, G16, Ark>(p)), + _ => Err(JsValue::from_str("Not supported")), }, (BackendParameter::Ark, SchemeParameter::GM17) => match prog { ProgEnum::Bn128Program(p) => Ok(internal::setup_non_universal::<_, GM17, Ark>(p)), ProgEnum::Bls12_381Program(p) => Ok(internal::setup_non_universal::<_, GM17, Ark>(p)), ProgEnum::Bls12_377Program(p) => Ok(internal::setup_non_universal::<_, GM17, Ark>(p)), ProgEnum::Bw6_761Program(p) => Ok(internal::setup_non_universal::<_, GM17, Ark>(p)), + _ => Err(JsValue::from_str("Not supported")), }, _ => Err(JsValue::from_str("Unsupported options")), } @@ -581,6 +588,7 @@ pub fn setup_with_srs(srs: &[u8], program: &[u8], options: JsValue) -> Result internal::setup_universal::<_, _, Marlin, Ark>(srs, p), ProgEnum::Bls12_377Program(p) => internal::setup_universal::<_, _, Marlin, Ark>(srs, p), ProgEnum::Bw6_761Program(p) => internal::setup_universal::<_, _, Marlin, Ark>(srs, p), + _ => Err(JsValue::from_str("Not supported")), }, _ => Err(JsValue::from_str("Given scheme is not universal")), } @@ -661,6 +669,7 @@ pub fn generate_proof( internal::generate_proof::<_, G16, Ark>(p, witness, pk) } ProgEnum::Bw6_761Program(p) => internal::generate_proof::<_, G16, Ark>(p, witness, pk), + _ => Err(JsValue::from_str("Not supported")), }, (BackendParameter::Ark, SchemeParameter::GM17) => match prog { ProgEnum::Bn128Program(p) => internal::generate_proof::<_, GM17, Ark>(p, witness, pk), @@ -671,6 +680,7 @@ pub fn generate_proof( internal::generate_proof::<_, GM17, Ark>(p, witness, pk) } ProgEnum::Bw6_761Program(p) => internal::generate_proof::<_, GM17, Ark>(p, witness, pk), + _ => Err(JsValue::from_str("Not supported")), }, (BackendParameter::Ark, SchemeParameter::MARLIN) => match prog { ProgEnum::Bn128Program(p) => internal::generate_proof::<_, Marlin, Ark>(p, witness, pk), @@ -683,6 +693,7 @@ pub fn generate_proof( ProgEnum::Bw6_761Program(p) => { internal::generate_proof::<_, Marlin, Ark>(p, witness, pk) } + _ => Err(JsValue::from_str("Not supported")), }, _ => Err(JsValue::from_str("Unsupported options")), } diff --git a/zokrates_proof_systems/src/scheme/mod.rs b/zokrates_proof_systems/src/scheme/mod.rs index 905157a7a..e841d8121 100644 --- a/zokrates_proof_systems/src/scheme/mod.rs +++ b/zokrates_proof_systems/src/scheme/mod.rs @@ -5,12 +5,10 @@ use zokrates_field::Field; pub mod gm17; pub mod groth16; pub mod marlin; -pub mod nova; pub use self::gm17::GM17; pub use self::groth16::G16; pub use self::marlin::Marlin; -pub use self::nova::Nova; pub trait Scheme: Serialize { const NAME: &'static str; diff --git a/zokrates_proof_systems/src/scheme/nova.rs b/zokrates_proof_systems/src/scheme/nova.rs deleted file mode 100644 index 94e1373bf..000000000 --- a/zokrates_proof_systems/src/scheme/nova.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::scheme::Scheme; -use crate::{G1Affine, G2Affine}; - -use serde::{Deserialize, Serialize}; -use zokrates_field::Field; - -#[allow(clippy::upper_case_acronyms)] -#[derive(Serialize)] -pub struct Nova; - -#[derive(Serialize, Deserialize, Clone)] -pub struct ProofPoints { - foo: G1, - bar: G2, -} - -#[derive(Serialize, Deserialize)] -pub struct VerificationKey { - foo: G1, - bar: G2, -} - -impl Scheme for Nova { - const NAME: &'static str = "nova"; - - type VerificationKey = VerificationKey; - type ProofPoints = ProofPoints; -} From bcade1a76cf453212dfbccdd3b9f9bb1be4ea8fa Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 4 Oct 2022 15:12:18 +0200 Subject: [PATCH 05/30] fix issues --- zokrates_bellperson/examples/10_cubes.rs | 2 +- zokrates_field/src/lib.rs | 5 ++++- zokrates_field/src/pallas.rs | 6 +++++- zokrates_field/src/vesta.rs | 6 +++++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/zokrates_bellperson/examples/10_cubes.rs b/zokrates_bellperson/examples/10_cubes.rs index 89d7ef454..317a87ed8 100644 --- a/zokrates_bellperson/examples/10_cubes.rs +++ b/zokrates_bellperson/examples/10_cubes.rs @@ -36,7 +36,7 @@ fn main() { let prog = artifacts.prog().collect(); - let circuit_primary = NovaComputation(Computation::without_witness(prog)); + let circuit_primary = NovaComputation::try_from(Computation::without_witness(prog)).unwrap(); let circuit_secondary = TrivialTestCircuit::default(); type C1 = NovaComputation; diff --git a/zokrates_field/src/lib.rs b/zokrates_field/src/lib.rs index 4b8a62f61..6ecdd9fcf 100644 --- a/zokrates_field/src/lib.rs +++ b/zokrates_field/src/lib.rs @@ -7,7 +7,6 @@ #[cfg(feature = "bellman_extensions")] use bellman_ce::pairing::{ff::ScalarEngine, Engine}; -use nova_snark::traits::Group; use num_bigint::BigUint; use num_traits::{CheckedDiv, One, Zero}; use serde::{Deserialize, Serialize}; @@ -17,11 +16,15 @@ use std::fmt::{Debug, Display}; use std::hash::Hash; use std::ops::{Add, Div, Mul, Sub}; +#[cfg(feature = "bellperson_extensions")] +use nova_snark::traits::Group; + pub trait Pow { type Output; fn pow(self, _: RHS) -> Self::Output; } +#[cfg(feature = "bellperson_extensions")] pub trait Cycle { type Other: Field + BellpersonFieldExtensions + Cycle; type Point: Group::Point as Group>::Scalar>; diff --git a/zokrates_field/src/pallas.rs b/zokrates_field/src/pallas.rs index 17204a93d..251a12c62 100644 --- a/zokrates_field/src/pallas.rs +++ b/zokrates_field/src/pallas.rs @@ -2,8 +2,12 @@ use ark_pallas::Fr as PallasBaseField; #[cfg(feature = "bellperson_extensions")] use pasta_curves::Fq; -use crate::{Cycle, G2Type, VestaField}; +#[cfg(feature = "bellperson_extensions")] +use crate::{Cycle, VestaField}; + +use crate::G2Type; +#[cfg(feature = "bellperson_extensions")] impl Cycle for FieldPrime { type Other = VestaField; type Point = pasta_curves::pallas::Point; diff --git a/zokrates_field/src/vesta.rs b/zokrates_field/src/vesta.rs index 0cd19a1a9..1cc17553a 100644 --- a/zokrates_field/src/vesta.rs +++ b/zokrates_field/src/vesta.rs @@ -2,8 +2,12 @@ use ark_vesta::Fr as VestaBaseField; #[cfg(feature = "bellperson_extensions")] use pasta_curves::Fp; -use crate::{Cycle, G2Type, PallasField}; +#[cfg(feature = "bellperson_extensions")] +use crate::{Cycle, PallasField}; + +use crate::G2Type; +#[cfg(feature = "bellperson_extensions")] impl Cycle for FieldPrime { type Other = PallasField; type Point = pasta_curves::vesta::Point; From 378bc14ac57305f8e28e54b8455b3d09f716aeb5 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 4 Oct 2022 16:46:57 +0200 Subject: [PATCH 06/30] remove bellperson from default as it does not compile to wasm --- zokrates_ast/Cargo.toml | 2 +- zokrates_bellperson/Cargo.toml | 2 +- zokrates_common/Cargo.toml | 2 +- zokrates_core/Cargo.toml | 2 +- zokrates_field/Cargo.toml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/zokrates_ast/Cargo.toml b/zokrates_ast/Cargo.toml index c0c523116..721021ccc 100644 --- a/zokrates_ast/Cargo.toml +++ b/zokrates_ast/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.2" edition = "2021" [features] -default = ["bellman", "ark", "bellperson"] +default = ["bellman", "ark"] bellman = ["zokrates_field/bellman_extensions", "pairing_ce", "zokrates_embed/bellman"] ark = ["ark-bls12-377", "zokrates_embed/ark"] bellperson = ["zokrates_field/bellperson_extensions"] diff --git a/zokrates_bellperson/Cargo.toml b/zokrates_bellperson/Cargo.toml index e19e84e1a..17ffc5694 100644 --- a/zokrates_bellperson/Cargo.toml +++ b/zokrates_bellperson/Cargo.toml @@ -10,7 +10,7 @@ wasm = ["bellperson/wasm"] zokrates_field = { version = "0.5", path = "../zokrates_field", features = ["bellperson_extensions"] } zokrates_ast = { version = "0.1", path = "../zokrates_ast", default-features = false } zokrates_proof_systems = { version = "0.1", path = "../zokrates_proof_systems", default-features = false } -bellperson = { package = "bellperson", version = "^0.22", default-features = false, features = ["groth16"] } +bellperson = { package = "bellperson", version = "^0.22", default-features = false } rand_0_4 = { version = "0.4", package = "rand" }# getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] } hex = "0.4.2" diff --git a/zokrates_common/Cargo.toml b/zokrates_common/Cargo.toml index 9fad7c336..9735b256c 100644 --- a/zokrates_common/Cargo.toml +++ b/zokrates_common/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -default = ["bellman", "ark", "bellperson"] +default = ["bellman", "ark"] bellman = [] ark = [] bellperson = [] diff --git a/zokrates_core/Cargo.toml b/zokrates_core/Cargo.toml index 0f0a25177..540fa403c 100644 --- a/zokrates_core/Cargo.toml +++ b/zokrates_core/Cargo.toml @@ -7,7 +7,7 @@ repository = "https://github.com/Zokrates/ZoKrates" readme = "README.md" [features] -default = ["ark", "bellman", "bellperson"] +default = ["ark", "bellman"] ark = ["zokrates_ast/ark", "zokrates_embed/ark", "zokrates_common/ark", "zokrates_interpreter/ark"] bellman = ["zokrates_ast/bellman", "zokrates_embed/bellman", "zokrates_common/bellman", "zokrates_interpreter/bellman"] bellperson = ["zokrates_ast/bellperson", "zokrates_common/bellperson"] diff --git a/zokrates_field/Cargo.toml b/zokrates_field/Cargo.toml index c9faf6b1c..cb8760b51 100644 --- a/zokrates_field/Cargo.toml +++ b/zokrates_field/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Thibaut Schaeffer ", "Guillaume Ballet Date: Tue, 4 Oct 2022 20:03:22 +0200 Subject: [PATCH 07/30] fix test, reset cache --- .circleci/config.yml | 2 +- zokrates_bellperson/src/nova.rs | 2 +- zokrates_nova/Cargo.toml | 19 --- zokrates_nova/examples/10_cubes.rs | 217 ----------------------------- zokrates_nova/src/lib.rs | 1 - 5 files changed, 2 insertions(+), 239 deletions(-) delete mode 100644 zokrates_nova/Cargo.toml delete mode 100644 zokrates_nova/examples/10_cubes.rs delete mode 100644 zokrates_nova/src/lib.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 0bfef41ee..b4ecd17de 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -187,7 +187,7 @@ commands: steps: - restore_cache: name: Restore sccache cache - key: sccache-cache-stable-{{ arch }}-{{ .Environment.CIRCLE_JOB }} + key: sccache-cache-stable-{{ .Environment.CACHE_VERSION }}-{{ arch }}-{{ .Environment.CIRCLE_JOB }} save-sccache-cache: steps: - save_cache: diff --git a/zokrates_bellperson/src/nova.rs b/zokrates_bellperson/src/nova.rs index f0d302d8f..920be1cb9 100644 --- a/zokrates_bellperson/src/nova.rs +++ b/zokrates_bellperson/src/nova.rs @@ -304,7 +304,7 @@ mod tests { ], }; - test(program, vec![PallasField::from(0)], 3); + test(program, vec![PallasField::from(0), PallasField::from(1)], 3); } } } diff --git a/zokrates_nova/Cargo.toml b/zokrates_nova/Cargo.toml deleted file mode 100644 index 3fab7d392..000000000 --- a/zokrates_nova/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "zokrates_nova" -version = "0.1.0" -edition = "2021" - -[dev-dependencies] -zokrates_field = { version = "0.5", path = "../zokrates_field" } -zokrates_ast = { version = "0.1", path = "../zokrates_ast", default-features = false } -zokrates_core = { version = "0.7", path = "../zokrates_core", default-features = false, features = ["ark", "bellman"] } -zokrates_bellperson = { version = "0.1", path = "../zokrates_bellperson", default-features = false } -typed-arena = "1.4.1" -bellperson = { package = "bellperson", version = "^0.22", default-features = false, features = ["groth16"] } -rand_0_4 = { version = "0.4", package = "rand" } -getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] } -hex = "0.4.2" -pairing = "0.22" -pasta_curves = { version = "0.4.0", features = ["repr-c"] } -nova-snark = { path = "../../nova" } -zokrates_interpreter = { version = "0.1", path = "../zokrates_interpreter" } \ No newline at end of file diff --git a/zokrates_nova/examples/10_cubes.rs b/zokrates_nova/examples/10_cubes.rs deleted file mode 100644 index 3aa6e9979..000000000 --- a/zokrates_nova/examples/10_cubes.rs +++ /dev/null @@ -1,217 +0,0 @@ -use bellperson::gadgets::num::AllocatedNum; -use bellperson::SynthesisError; -use nova_snark::traits::circuit::StepCircuit; -use nova_snark::traits::circuit::TrivialTestCircuit; -use nova_snark::CompressedSNARK; -use nova_snark::PublicParams; -use nova_snark::RecursiveSNARK; -use pasta_curves::{Fp, Fq}; -use std::time::Instant; -use std::{collections::BTreeMap, io}; -use typed_arena::Arena; -use zokrates_ast::ir::{Statement, Witness}; -use zokrates_bellperson::Computation; -use zokrates_core::compile::{compile, CompileConfig}; -use zokrates_field::{BellpersonFieldExtensions, PallasField}; -use zokrates_interpreter::Interpreter; - -type G1 = pasta_curves::pallas::Point; -type G2 = pasta_curves::vesta::Point; - -// we implemented a bellperson extension in zokrates_field for pallas so that we can convert back and forth to the bellperson data structures - -// let's implement the StepCircuit trait for ir programs - -// we use the newtype pattern to enable implementing a trait on ir::Prog because it is defined in another crate (zokrates_ast) - -#[derive(Clone, Debug)] -struct PallasComputation(Computation>>); - -impl StepCircuit for PallasComputation { - fn arity(&self) -> usize { - let input_count = self.0.program.arguments.len(); - let output_count = self.0.program.return_count; - assert_eq!(input_count, output_count); - input_count - } - - fn synthesize>( - &self, - cs: &mut CS, - input: &[bellperson::gadgets::num::AllocatedNum], - ) -> Result>, bellperson::SynthesisError> { - assert_eq!(self.0.program.arguments.len(), input.len()); - - let mut symbols = BTreeMap::new(); - - let mut witness = Witness::default(); - - // populate the witness if we got some input values - if input[0].get_value().is_some() { - let interpreter = Interpreter::default(); - let inputs: Vec<_> = input - .iter() - .map(|v| PallasField::from_bellperson(v.get_value().unwrap())) - .collect(); - witness = interpreter - .execute(self.0.program.clone(), &inputs) - .unwrap(); - } - - // allocate the inputs - for (p, allocated_num) in self.0.program.arguments.iter().zip(input) { - symbols.insert(p.id, allocated_num.get_variable()); - } - - // allocate the outputs - - let outputs: Vec<_> = self - .0 - .program - .returns() - .iter() - .map(|v| { - assert!(v.id < 0); // this should indeed be an output - let wire = AllocatedNum::alloc( - cs.namespace(|| format!("NOVA_INCREMENTAL_OUTPUT_{}", -v.id - 1)), - || { - Ok(witness - .0 - .remove(v) - .ok_or(SynthesisError::AssignmentMissing)? - .into_bellperson()) - }, - ) - .unwrap(); - symbols.insert(*v, wire.get_variable()); - wire - }) - .collect(); - - self.0 - .clone() - .synthesize_input_to_output(cs, &mut symbols, &mut witness)?; - - Ok(outputs) - } - - fn output(&self, z: &[Fq]) -> Vec { - let interpreter = Interpreter::default(); - let inputs: Vec<_> = z.iter().map(|v| PallasField::from_bellperson(*v)).collect(); - let output = interpreter - .execute(self.0.program.clone(), &inputs) - .unwrap(); - output - .return_values() - .into_iter() - .map(|v| v.into_bellperson()) - .collect() - } -} - -fn main() { - // create a circuit for the incremental computation - - let cube = r#" - def main(field x) -> field { - return x**123; - } - "#; - - let arena = Arena::new(); - - let artifacts = compile::( - cube.to_string(), - "main".into(), - None, - CompileConfig::default(), - &arena, - ) - .unwrap(); - - let prog = artifacts.prog().collect(); - - let circuit_primary = PallasComputation(Computation::without_witness(prog)); - let circuit_secondary = TrivialTestCircuit::default(); - - type C1 = PallasComputation; - type C2 = TrivialTestCircuit; - - // produce public parameters - println!("Producing public parameters..."); - let pp = - PublicParams::::setup(circuit_primary.clone(), circuit_secondary.clone()); - - // produce a recursive SNARK - println!("Generating a RecursiveSNARK..."); - let mut recursive_snark: Option> = None; - - let num_steps: usize = 10; - - let z0_primary = vec![Fq::one() + Fq::one()]; - let z0_secondary = vec![Fp::one()]; - - for i in 0..num_steps { - let start = Instant::now(); - let res = RecursiveSNARK::prove_step( - &pp, - recursive_snark, - circuit_primary.clone(), - circuit_secondary.clone(), - z0_primary.clone(), - z0_secondary.clone(), - ); - assert!(res.is_ok()); - println!( - "RecursiveSNARK::prove_step {}: {:?}, took {:?} ", - i, - res.is_ok(), - start.elapsed() - ); - recursive_snark = Some(res.unwrap()); - println!("{:#?}", recursive_snark.as_ref().unwrap().zi_primary); - } - - assert!(recursive_snark.is_some()); - let recursive_snark = recursive_snark.unwrap(); - - // verify the recursive SNARK - println!("Verifying a RecursiveSNARK..."); - let start = Instant::now(); - let res = recursive_snark.verify(&pp, num_steps, z0_primary.clone(), z0_secondary.clone()); - - println!("{:#?}", res); - - println!( - "RecursiveSNARK::verify: {:?}, took {:?}", - res.is_ok(), - start.elapsed() - ); - assert!(res.is_ok()); - - // produce a compressed SNARK - println!("Generating a CompressedSNARK using Spartan with IPA-PC..."); - let start = Instant::now(); - type S1 = nova_snark::spartan_with_ipa_pc::RelaxedR1CSSNARK; - type S2 = nova_snark::spartan_with_ipa_pc::RelaxedR1CSSNARK; - let res = CompressedSNARK::<_, _, _, _, S1, S2>::prove(&pp, &recursive_snark); - println!( - "CompressedSNARK::prove: {:?}, took {:?}", - res.is_ok(), - start.elapsed() - ); - assert!(res.is_ok()); - let compressed_snark = res.unwrap(); - - // verify the compressed SNARK - println!("Verifying a CompressedSNARK..."); - let start = Instant::now(); - let res = compressed_snark.verify(&pp, num_steps, z0_primary, z0_secondary); - println!( - "CompressedSNARK::verify: {:?}, took {:?}", - res.is_ok(), - start.elapsed() - ); - assert!(res.is_ok()); - println!("========================================================="); -} diff --git a/zokrates_nova/src/lib.rs b/zokrates_nova/src/lib.rs deleted file mode 100644 index 8b1378917..000000000 --- a/zokrates_nova/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ - From cd3502c81d713d82ac31b6d52eecebff764b50b6 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 4 Oct 2022 20:48:20 +0200 Subject: [PATCH 08/30] regenerate lockfile, update wasm-pack --- zokrates_js/package-lock.json | 17 ++++++++++------- zokrates_js/package.json | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/zokrates_js/package-lock.json b/zokrates_js/package-lock.json index 74772fd07..53947fd70 100644 --- a/zokrates_js/package-lock.json +++ b/zokrates_js/package-lock.json @@ -1,19 +1,19 @@ { "name": "zokrates-js", - "version": "1.1.1", + "version": "1.1.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "zokrates-js", - "version": "1.1.1", + "version": "1.1.3", "license": "GPLv3", "devDependencies": { "dree": "^2.6.1", "mocha": "^9.2.0", "rimraf": "^3.0.2", - "snarkjs": "^0.4.24", - "wasm-pack": "^0.10.2" + "snarkjs": "^0.4.25", + "wasm-pack": "^0.10.3" } }, "node_modules/@iden3/bigarray": { @@ -1211,10 +1211,11 @@ "dev": true }, "node_modules/wasm-pack": { - "version": "0.10.2", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/wasm-pack/-/wasm-pack-0.10.3.tgz", + "integrity": "sha512-dg1PPyp+QwWrhfHsgG12K/y5xzwfaAoK1yuVC/DUAuQsDy5JywWDuA7Y/ionGwQz+JBZVw8jknaKBnaxaJfwTA==", "dev": true, "hasInstallScript": true, - "license": "MIT OR Apache-2.0", "dependencies": { "binary-install": "^0.1.0" }, @@ -2144,7 +2145,9 @@ "dev": true }, "wasm-pack": { - "version": "0.10.2", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/wasm-pack/-/wasm-pack-0.10.3.tgz", + "integrity": "sha512-dg1PPyp+QwWrhfHsgG12K/y5xzwfaAoK1yuVC/DUAuQsDy5JywWDuA7Y/ionGwQz+JBZVw8jknaKBnaxaJfwTA==", "dev": true, "requires": { "binary-install": "^0.1.0" diff --git a/zokrates_js/package.json b/zokrates_js/package.json index 6ddcb0c84..6466dc4fc 100644 --- a/zokrates_js/package.json +++ b/zokrates_js/package.json @@ -47,6 +47,6 @@ "mocha": "^9.2.0", "rimraf": "^3.0.2", "snarkjs": "^0.4.25", - "wasm-pack": "^0.10.2" + "wasm-pack": "^0.10.3" } } From 62b76f356c8d71a883b109319405144ff56ef59d Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 4 Oct 2022 21:20:12 +0200 Subject: [PATCH 09/30] use xl instance for js tasks --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b4ecd17de..be551798f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -96,7 +96,7 @@ jobs: zokrates_js_build: docker: - image: zokrates/env:latest - resource_class: large + resource_class: xlarge working_directory: ~/project/zokrates_js steps: - checkout: @@ -111,7 +111,7 @@ jobs: zokrates_js_test: docker: - image: zokrates/env:latest - resource_class: large + resource_class: xlarge working_directory: ~/project/zokrates_js steps: - checkout: From f991b765cfba5015fcb30d284a4ea5e61b4ba29f Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 4 Oct 2022 22:29:19 +0200 Subject: [PATCH 10/30] add changelog --- changelogs/unreleased/1234-schaeff | 1 - changelogs/unreleased/1235-schaeff | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 changelogs/unreleased/1234-schaeff create mode 100644 changelogs/unreleased/1235-schaeff diff --git a/changelogs/unreleased/1234-schaeff b/changelogs/unreleased/1234-schaeff deleted file mode 100644 index ac980c845..000000000 --- a/changelogs/unreleased/1234-schaeff +++ /dev/null @@ -1 +0,0 @@ -Add support for the Pallas curve field \ No newline at end of file diff --git a/changelogs/unreleased/1235-schaeff b/changelogs/unreleased/1235-schaeff new file mode 100644 index 000000000..b1aa352b8 --- /dev/null +++ b/changelogs/unreleased/1235-schaeff @@ -0,0 +1 @@ +Add initial support for the Nova proving scheme \ No newline at end of file From 5bace73a7285583159e6143f2124ea9ef916b4aa Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 6 Feb 2023 14:33:20 +0100 Subject: [PATCH 11/30] fix typo, generate package lock --- zokrates_common/src/helpers.rs | 2 +- zokrates_js/package-lock.json | 5620 ++++++++++++++++++++++++++++++++ 2 files changed, 5621 insertions(+), 1 deletion(-) create mode 100644 zokrates_js/package-lock.json diff --git a/zokrates_common/src/helpers.rs b/zokrates_common/src/helpers.rs index 0041b6e4d..a717ec7d9 100644 --- a/zokrates_common/src/helpers.rs +++ b/zokrates_common/src/helpers.rs @@ -68,7 +68,7 @@ impl std::fmt::Display for SchemeParameter { G16 => write!(f, "g16"), GM17 => write!(f, "gm17"), MARLIN => write!(f, "marlin"), - NOVA => write!(f, "marlin"), + NOVA => write!(f, "nova"), } } } diff --git a/zokrates_js/package-lock.json b/zokrates_js/package-lock.json new file mode 100644 index 000000000..4c3f24745 --- /dev/null +++ b/zokrates_js/package-lock.json @@ -0,0 +1,5620 @@ +{ + "name": "zokrates-js", + "version": "1.1.5", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "zokrates-js", + "version": "1.1.5", + "license": "GPLv3", + "dependencies": { + "pako": "^2.1.0" + }, + "devDependencies": { + "@babel/core": "^7.20.12", + "@babel/preset-env": "^7.20.2", + "acorn": "^8.8.1", + "astring": "^1.8.4", + "babelify": "^10.0.0", + "browserify": "^17.0.0", + "dree": "^3.4.3", + "mocha": "^9.2.0", + "puppeteer": "^19.6.0", + "rimraf": "^3.0.2", + "snarkjs": "^0.4.25", + "uglify-js": "^3.17.4", + "wasm-pack": "^0.10.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", + "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.2.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", + "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", + "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", + "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", + "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz", + "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", + "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", + "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", + "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", + "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@iden3/bigarray": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz", + "integrity": "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==", + "dev": true + }, + "node_modules/@iden3/binfileutils": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.11.tgz", + "integrity": "sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA==", + "dev": true, + "dependencies": { + "fastfile": "0.0.20", + "ffjavascript": "^0.2.48" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@types/node": { + "version": "18.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.19.tgz", + "integrity": "sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==", + "dev": true, + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/astring": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.4.tgz", + "integrity": "sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw==", + "dev": true, + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async": { + "version": "3.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/b4a": { + "version": "1.5.3", + "dev": true, + "license": "ISC" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babelify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", + "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-install": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^0.21.1", + "rimraf": "^3.0.2", + "tar": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "dependencies": { + "resolve": "^1.17.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "dev": true, + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserify-zlib/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001450", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", + "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==", + "dev": true + }, + "node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/circom_runtime": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.18.tgz", + "integrity": "sha512-j6k+Jg1DXCYFVgjDRbJDmkAJ9E17js8h1iR7F1UX0IUr5v8NXeOXkfRh9+/73JqSgXb3Eo166a4JHdA/CeoEeA==", + "dev": true, + "dependencies": { + "ffjavascript": "0.2.55" + }, + "bin": { + "calcwit": "calcwit.js" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "dev": true, + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/combine-source-map/node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.27.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", + "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "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==", + "dev": true, + "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/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "dependencies": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1082910", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1082910.tgz", + "integrity": "sha512-RqoZ2GmqaNxyx+99L/RemY5CkwG9D0WEfOKxekwCRXOGrDCep62ngezEJUVMq6rISYQ+085fJnWDQqGHlxVNww==", + "dev": true + }, + "node_modules/diff": { + "version": "5.0.0", + "dev": true, + "license": "BSD-3-Clause", + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/dree": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/dree/-/dree-3.4.4.tgz", + "integrity": "sha512-ROIFLrbCcgp/KcSp2O9ggl4RzCCeyzV9RtlYDpPU4BWUAGUkYcSbzSosaD855WAita45EOaKHiQIc6Oujkprsw==", + "dev": true, + "dependencies": { + "yargs": "^17.6.2" + }, + "bin": { + "dree": "bundled/bin/index.js" + } + }, + "node_modules/dree/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dree/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dree/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ejs": { + "version": "3.1.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz", + "integrity": "sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fastfile": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz", + "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==", + "dev": true + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/ffjavascript": { + "version": "0.2.55", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz", + "integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.48", + "wasmbuilder": "^0.0.12", + "wasmcurves": "0.1.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.7", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "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==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "dev": true, + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "dev": true, + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jake": { + "version": "10.8.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logplease": { + "version": "1.2.15", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mocha": { + "version": "9.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.2.0", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/anymatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mocha/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/fsevents": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mocha/node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/mocha/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "dev": true, + "dependencies": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "dev": true, + "dependencies": { + "path-platform": "~0.11.15" + } + }, + "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==", + "dev": true, + "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/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "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/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/puppeteer": { + "version": "19.6.3", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.6.3.tgz", + "integrity": "sha512-K03xTtGDwS6cBXX/EoqoZxglCUKcX2SLIl92fMnGMRjYpPGXoAV2yKEh3QXmXzKqfZXd8TxjjFww+tEttWv8kw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "cosmiconfig": "8.0.0", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "puppeteer-core": "19.6.3" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/puppeteer-core": { + "version": "19.6.3", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.6.3.tgz", + "integrity": "sha512-8MbhioSlkDaHkmolpQf9Z7ui7jplFfOFTnN8d5kPsCazRRTNIH6/bVxPskn0v5Gh9oqOBlknw0eHH0/OBQAxpQ==", + "dev": true, + "dependencies": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1082910", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.11.0" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/r1csfile": { + "version": "0.0.40", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.40.tgz", + "integrity": "sha512-3tKaFLncf42ZTRpPMlgyiFBdk6kir4S4O3X+u4UQjgLYoDPHfizazNbK0Jzj++PVIXVUFAqugSbIo4W3UDuHcQ==", + "dev": true, + "dependencies": { + "@iden3/bigarray": "0.0.2", + "@iden3/binfileutils": "0.0.11", + "fastfile": "0.0.20", + "ffjavascript": "0.2.55" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "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/readable-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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dev": true, + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/shell-quote": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/snarkjs": { + "version": "0.4.25", + "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.4.25.tgz", + "integrity": "sha512-20manpB7xCd5gkfkioD6GaAR7tgJmN7xQQislJcPV3Xs2Vkf+1Dz6V+LKRwlc/rU/vT/EopUBm5apqvTOKidbQ==", + "dev": true, + "dependencies": { + "@iden3/binfileutils": "0.0.11", + "bfj": "^7.0.2", + "blake2b-wasm": "^2.4.0", + "circom_runtime": "0.1.18", + "ejs": "^3.1.6", + "fastfile": "0.0.20", + "ffjavascript": "0.2.55", + "js-sha3": "^0.8.0", + "logplease": "^1.2.15", + "r1csfile": "0.0.40" + }, + "bin": { + "snarkjs": "build/cli.cjs" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-color/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "dev": true, + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true, + "bin": { + "umd": "bin/cli.js" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "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==", + "dev": true + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/wasm-pack": { + "version": "0.10.2", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "binary-install": "^0.1.0" + }, + "bin": { + "wasm-pack": "run.js" + } + }, + "node_modules/wasmbuilder": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz", + "integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.48" + } + }, + "node_modules/wasmcurves": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz", + "integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.42", + "blakejs": "^1.1.0" + } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.6", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} From 50ecc37fa8faaeaa387a1b5eaeafbefd99275255 Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 6 Feb 2023 14:49:15 +0100 Subject: [PATCH 12/30] fix clippy warnings --- zokrates_ast/src/untyped/from_ast.rs | 54 ++++++++++++++-------------- zokrates_pest_ast/src/lib.rs | 7 ++-- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/zokrates_ast/src/untyped/from_ast.rs b/zokrates_ast/src/untyped/from_ast.rs index 88c12d6ce..dc268fcd6 100644 --- a/zokrates_ast/src/untyped/from_ast.rs +++ b/zokrates_ast/src/untyped/from_ast.rs @@ -31,13 +31,13 @@ fn import_directive_to_symbol_vec( source, id: untyped::SymbolIdentifier::from(id).alias(alias), } - .span(span.clone()); + .span(span); vec![untyped::SymbolDeclaration { id: alias.unwrap_or(id), symbol: untyped::Symbol::Here(untyped::SymbolDefinition::Import(import)), } - .span(span.clone())] + .span(span)] } pest::ImportDirective::From(import) => { let span = import.span; @@ -57,13 +57,13 @@ fn import_directive_to_symbol_vec( id: untyped::SymbolIdentifier::from(symbol.id.span.as_str()) .alias(Some(alias)), } - .span(span.clone()); + .span(span); untyped::SymbolDeclaration { id: alias, symbol: untyped::Symbol::Here(untyped::SymbolDefinition::Import(import)), } - .span(span.clone()) + .span(span) }) .collect() } @@ -90,7 +90,7 @@ impl<'ast> From> for untyped::SymbolDeclarationNode .map(untyped::StructDefinitionFieldNode::from) .collect(), } - .span(span.clone()); + .span(span); untyped::SymbolDeclaration { id, @@ -125,7 +125,7 @@ impl<'ast> From> for untyped::SymbolDeclarationNo ty: definition.id.ty.into(), expression: definition.expression.into(), } - .span(span.clone()); + .span(span); untyped::SymbolDeclaration { id, @@ -150,7 +150,7 @@ impl<'ast> From> for untyped::SymbolDeclarationNode<' .collect(), ty: definition.ty.into(), } - .span(span.clone()); + .span(span); untyped::SymbolDeclaration { id, @@ -199,7 +199,7 @@ impl<'ast> From> for untyped::SymbolDeclarationNo statements: function.statements.into_iter().map(|s| s.into()).collect(), signature, } - .span(span.clone()); + .span(span); untyped::SymbolDeclaration { id, @@ -296,14 +296,14 @@ impl<'ast> From> for untyped::StatementNode<'ast untyped::UnresolvedTypeNode::from(i.ty), i.mutable.is_some(), ) - .span(i.span.clone()), + .span(i.span), e, ), pest::TypedIdentifierOrAssignee::Assignee(a) => { untyped::Statement::Assignment(untyped::AssigneeNode::from(a), e) } } - .span(definition.span.clone()) + .span(definition.span) } } @@ -467,7 +467,7 @@ impl<'ast> From> for untyped::ExpressionNode<'ast> box untyped::ExpressionNode::from(*expression.left), box untyped::ExpressionNode::from(*expression.right), ) - .span(expression.span.clone()), + .span(expression.span), ), } .span(expression.span) @@ -795,7 +795,7 @@ impl<'ast> From> for untyped::AssigneeNode<'ast> { } }, } - .span(span.clone()) + .span(span) }) } } @@ -861,10 +861,10 @@ impl<'ast> From> for untyped::UnresolvedTypeNode<'ast> { .rev() .fold(None, |acc, s| match acc { None => Some(UnresolvedType::array(inner_type.clone(), s)), - Some(acc) => Some(UnresolvedType::array(acc.span(span.clone()), s)), + Some(acc) => Some(UnresolvedType::array(acc.span(span), s)), }) .unwrap() - .span(span.clone()) + .span(span) } pest::Type::Struct(s) => UnresolvedType::User( s.id.span.as_str().to_string(), @@ -1219,10 +1219,10 @@ mod tests { lhs: pest::TypedIdentifierOrAssignee::Assignee(pest::Assignee { id: pest::IdentifierExpression { value: String::from("a"), - span: span.clone(), + span: span, }, accesses: vec![], - span: span.clone(), + span: span, }), expression: pest::Expression::Literal(pest::LiteralExpression::DecimalLiteral( pest::DecimalLiteralExpression { @@ -1230,10 +1230,10 @@ mod tests { span: Span::new("1", 0, 1).unwrap(), }, suffix: None, - span: span.clone(), + span: span, }, )), - span: span.clone(), + span: span, }; let statement = untyped::StatementNode::from(definition); @@ -1250,32 +1250,30 @@ mod tests { let definition = pest::DefinitionStatement { lhs: pest::TypedIdentifierOrAssignee::TypedIdentifier(pest::TypedIdentifier { - ty: pest::Type::Basic(pest::BasicType::Field(pest::FieldType { - span: span.clone(), - })), + ty: pest::Type::Basic(pest::BasicType::Field(pest::FieldType { span: span })), identifier: pest::IdentifierExpression { value: String::from("a"), - span: span.clone(), + span: span, }, mutable: None, - span: span.clone(), + span: span, }), expression: pest::Expression::Postfix(pest::PostfixExpression { base: box pest::Expression::Identifier(pest::IdentifierExpression { value: String::from("foo"), - span: span.clone(), + span: span, }), accesses: vec![pest::Access::Call(pest::CallAccess { explicit_generics: None, arguments: pest::Arguments { expressions: vec![], - span: span.clone(), + span: span, }, - span: span.clone(), + span: span, })], - span: span.clone(), + span: span, }), - span: span.clone(), + span: span, }; let statement = untyped::StatementNode::from(definition); diff --git a/zokrates_pest_ast/src/lib.rs b/zokrates_pest_ast/src/lib.rs index 65268b304..e705bce54 100644 --- a/zokrates_pest_ast/src/lib.rs +++ b/zokrates_pest_ast/src/lib.rs @@ -1,3 +1,6 @@ +// disable a clippy lint as pest_ast generates improper code +#![allow(clippy::clone_on_copy)] + use from_pest::FromPest; use pest::error::Error as PestError; use pest::iterators::Pairs; @@ -69,8 +72,8 @@ mod ast { rhs: Box>, ) -> Box> { // a + b spans from the start of a to the end of b - let (start, _) = lhs.span().clone().split(); - let (_, end) = rhs.span().clone().split(); + let (start, _) = lhs.span().split(); + let (_, end) = rhs.span().split(); let span = start.span(&end); Box::new(match pair.as_rule() { From e57211a983302af6af140b93a3a4533a62b05d11 Mon Sep 17 00:00:00 2001 From: schaeff Date: Thu, 9 Feb 2023 16:02:43 +0100 Subject: [PATCH 13/30] wip --- Cargo.lock | 2 - zokrates_ast/src/ir/mod.rs | 4 + zokrates_bellperson/Cargo.toml | 5 +- zokrates_bellperson/src/lib.rs | 6 +- zokrates_bellperson/src/nova.rs | 123 ++++++++++++++++++++--------- zokrates_cli/src/ops/nova/prove.rs | 20 +++-- zokrates_codegen/Cargo.toml | 1 + zokrates_common/Cargo.toml | 2 +- zokrates_interpreter/Cargo.toml | 4 +- 9 files changed, 113 insertions(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7c9367b75..982d79603 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3540,10 +3540,8 @@ dependencies = [ "rand 0.4.6", "typed-arena", "zokrates_ast", - "zokrates_core", "zokrates_field", "zokrates_interpreter", - "zokrates_proof_systems", ] [[package]] diff --git a/zokrates_ast/src/ir/mod.rs b/zokrates_ast/src/ir/mod.rs index 78b48f808..68a94c911 100644 --- a/zokrates_ast/src/ir/mod.rs +++ b/zokrates_ast/src/ir/mod.rs @@ -157,6 +157,10 @@ impl<'ast, T, I: IntoIterator>> ProgIterator<'ast, T, self.arguments.iter().filter(|a| !a.private).count() + self.return_count } + pub fn private_input_count(&self) -> usize { + self.arguments.iter().filter(|a| a.private).count() + } + pub fn public_inputs(&self) -> PublicInputs { self.arguments .iter() diff --git a/zokrates_bellperson/Cargo.toml b/zokrates_bellperson/Cargo.toml index a435096e9..7da5f7586 100644 --- a/zokrates_bellperson/Cargo.toml +++ b/zokrates_bellperson/Cargo.toml @@ -7,8 +7,8 @@ edition = "2021" [dependencies] zokrates_field = { version = "0.5", path = "../zokrates_field", features = ["bellperson_extensions"] } -zokrates_ast = { version = "0.1", path = "../zokrates_ast", default-features = false } -zokrates_proof_systems = { version = "0.1", path = "../zokrates_proof_systems", default-features = false } +zokrates_ast = { version = "0.1", path = "../zokrates_ast", features = ["bellperson"] } +# zokrates_proof_systems = { version = "0.1", path = "../zokrates_proof_systems", default-features = false } bellperson = { package = "bellperson", version = "^0.24", default-features = false } rand_0_4 = { version = "0.4", package = "rand" }# getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] } @@ -25,7 +25,6 @@ rand_0_4 = { version = "0.4", package = "rand" } getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] } hex = "0.4.2" pairing = "0.22" -zokrates_core = { version = "0.7", path = "../zokrates_core", default-features = false, features = ["ark", "bellman"] } pasta_curves = { version = "0.5.2", features = ["repr-c", "serde"], package = "fil_pasta_curves"} diff --git a/zokrates_bellperson/src/lib.rs b/zokrates_bellperson/src/lib.rs index 8592ee0e3..cad7231e2 100644 --- a/zokrates_bellperson/src/lib.rs +++ b/zokrates_bellperson/src/lib.rs @@ -36,7 +36,7 @@ impl<'ast, T: Field, I: IntoIterator>> Computation<'as } fn bellperson_combination< - T: BellpersonFieldExtensions, + T: Field + BellpersonFieldExtensions, CS: ConstraintSystem, >( l: CanonicalLinComb, @@ -50,7 +50,9 @@ fn bellperson_combination< v.into_bellperson(), *symbols.entry(k).or_insert_with(|| { match k.is_output() { - true => unreachable!("outputs should already have been allocated"), + true => { + unreachable!("outputs should already have been allocated, found {}", k) + } false => AllocatedNum::alloc(cs.namespace(|| format!("{}", k)), || { Ok(witness .0 diff --git a/zokrates_bellperson/src/nova.rs b/zokrates_bellperson/src/nova.rs index fca124d64..66c3f563f 100644 --- a/zokrates_bellperson/src/nova.rs +++ b/zokrates_bellperson/src/nova.rs @@ -31,16 +31,25 @@ impl< } #[derive(Clone, Debug)] -pub struct NovaComputation<'ast, T>(Computation<'ast, T, Vec>>); +pub struct NovaComputation<'ast, T> { + step_private: Option>, + computation: Computation<'ast, T, Vec>>, +} impl<'ast, T> TryFrom>>> for NovaComputation<'ast, T> { type Error = Error; fn try_from(c: Computation<'ast, T, Vec>>) -> Result { - if c.program.arguments.len() != c.program.return_count { - return Err(Error::User(format!("Number of return values must match number of input values for Nova circuits, found `{} != {}`", c.program.return_count, c.program.arguments.len()))); + let return_count = c.program.return_count; + let public_input_count = c.program.public_count() - return_count; + + if public_input_count != return_count { + return Err(Error::User(format!("Number of return values must match number of public input values for Nova circuits, found `{} != {}`", c.program.return_count, c.program.arguments.len()))); } - Ok(NovaComputation(c)) + Ok(NovaComputation { + step_private: None, + computation: c, + }) } } @@ -95,18 +104,24 @@ pub fn verify( let z0_primary: Vec<_> = arguments.into_iter().map(|a| a.into_bellperson()).collect(); let z0_secondary = vec![<::Point as Group>::Base::one()]; - proof + dbg!(proof .verify(params, steps_count, z0_primary, z0_secondary) .map(|_| ()) - .map_err(Error::Internal) + .map_err(Error::Internal)) } pub fn prove<'ast, T: NovaField>( public_parameters: &PublicParams<'ast, T>, program: Prog<'ast, T>, arguments: Vec, - steps_count: usize, + steps: Vec>, ) -> Result>, Error> { + let private_input_count = program.private_input_count(); + + assert!(steps.iter().all(|v| v.len() == private_input_count)); + + let steps_count = steps.len(); + if steps_count == 0 { return Ok(None); } @@ -119,7 +134,10 @@ pub fn prove<'ast, T: NovaField>( let mut proof = None; - for _ in 0..steps_count { + for steps_private in steps { + let mut c_primary = c_primary.clone(); + c_primary.step_private = Some(steps_private); + proof = Some(RecursiveSNARK::prove_step( public_parameters, proof, @@ -137,8 +155,8 @@ impl<'ast, T: Field + BellpersonFieldExtensions + Cycle> StepCircuit { fn arity(&self) -> usize { - let input_count = self.0.program.arguments.len(); - let output_count = self.0.program.return_count; + let output_count = self.computation.program.return_count; + let input_count = self.computation.program.public_count() - output_count; assert_eq!(input_count, output_count); input_count } @@ -151,7 +169,9 @@ impl<'ast, T: Field + BellpersonFieldExtensions + Cycle> StepCircuit>, bellperson::SynthesisError, > { - assert_eq!(self.0.program.arguments.len(), input.len()); + let output_count = self.computation.program.return_count; + let input_count = self.computation.program.public_count() - output_count; + assert_eq!(input_count, output_count); let mut symbols = BTreeMap::new(); @@ -168,21 +188,22 @@ impl<'ast, T: Field + BellpersonFieldExtensions + Cycle> StepCircuit = input .iter() .map(|v| T::from_bellperson(v.get_value().unwrap())) + .chain(self.step_private.clone().unwrap()) .collect(); witness = interpreter - .execute(self.0.program.clone(), &inputs) + .execute(self.computation.program.clone(), &inputs) .unwrap(); } // allocate the inputs - for (p, allocated_num) in self.0.program.arguments.iter().zip(input) { + for (p, allocated_num) in self.computation.program.arguments.iter().zip(input) { symbols.insert(p.id, allocated_num.get_variable()); } // allocate the outputs let outputs: Vec<_> = self - .0 + .computation .program .returns() .iter() @@ -204,7 +225,7 @@ impl<'ast, T: Field + BellpersonFieldExtensions + Cycle> StepCircuit StepCircuit Vec { let interpreter = Interpreter::default(); - let inputs: Vec<_> = z.iter().map(|v| T::from_bellperson(*v)).collect(); + let inputs: Vec<_> = z + .iter() + .map(|v| T::from_bellperson(*v)) + .chain(self.step_private.clone().unwrap()) + .collect(); let output = interpreter - .execute(self.0.program.clone(), &inputs) + .execute(self.computation.program.clone(), &inputs) .unwrap(); output .return_values() @@ -236,38 +261,28 @@ mod tests { use zokrates_ast::ir::Prog; use zokrates_field::PallasField; - fn test(program: Prog, arguments: Vec, step_count: usize) { + fn test(program: Prog, arguments: Vec, step_privates: Vec>) { + let steps_count = step_privates.len(); let params = generate_public_parameters(program.clone()).unwrap(); - let proof = prove(¶ms, program.clone(), arguments.clone(), step_count).unwrap(); - assert!(verify(¶ms, proof.unwrap(), step_count, arguments).is_ok()); + let proof = prove(¶ms, program.clone(), arguments.clone(), step_privates).unwrap(); + assert!(verify(¶ms, proof.unwrap(), steps_count, arguments).is_ok()); } #[test] fn empty() { let program: Prog = Prog::default(); - test(program, vec![], 3); + test(program, vec![], vec![vec![]; 3]); } #[test] fn identity() { - let program: Prog = Prog { - arguments: vec![Parameter::private(Variable::new(0))], - return_count: 1, - statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], - }; - - test(program, vec![PallasField::from(0)], 3); - } - - #[test] - fn public_identity() { let program: Prog = Prog { arguments: vec![Parameter::public(Variable::new(0))], return_count: 1, statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], }; - test(program, vec![PallasField::from(0)], 3); + test(program, vec![PallasField::from(0)], vec![vec![]; 3]); } #[test] @@ -281,14 +296,14 @@ mod tests { )], }; - test(program, vec![PallasField::from(3)], 3); + test(program, vec![PallasField::from(3)], vec![vec![]; 3]); } #[test] fn private_gaps() { let program = Prog { arguments: vec![ - Parameter::private(Variable::new(42)), + Parameter::public(Variable::new(42)), Parameter::public(Variable::new(51)), ], return_count: 2, @@ -304,7 +319,43 @@ mod tests { ], }; - test(program, vec![PallasField::from(0), PallasField::from(1)], 3); + test( + program, + vec![PallasField::from(0), PallasField::from(1)], + vec![vec![]; 3], + ); + } + + #[test] + fn fold() { + // def main(public field acc, field e) -> field { + // return acc + e + // } + + // called with init 2 and round private inputs [1, 2, 3] + // should return (((2 + 1) + 2) + 3) = 8 + + let program = Prog { + arguments: vec![ + Parameter::public(Variable::new(0)), + Parameter::private(Variable::new(1)), + ], + return_count: 1, + statements: vec![Statement::constraint( + LinComb::from(Variable::new(0)) + LinComb::from(Variable::new(1)), + Variable::public(0), + )], + }; + + test( + program, + vec![PallasField::from(2)], + vec![ + vec![PallasField::from(1)], + vec![PallasField::from(2)], + vec![PallasField::from(3)], + ], + ); } } } diff --git a/zokrates_cli/src/ops/nova/prove.rs b/zokrates_cli/src/ops/nova/prove.rs index b0ce6d8a2..6cb8fbbd1 100644 --- a/zokrates_cli/src/ops/nova/prove.rs +++ b/zokrates_cli/src/ops/nova/prove.rs @@ -104,6 +104,8 @@ fn cli_nova_prove_step<'ast, T: NovaField, I: Iterator println!("No proof to verify"), Some(ref proof) => { @@ -208,12 +219,5 @@ fn cli_nova_prove_step<'ast, T: NovaField, I: Iterator Date: Tue, 14 Feb 2023 14:51:36 +0100 Subject: [PATCH 14/30] implement nova for any (public T, U) -> T --- .gitignore | 2 + zokrates_abi/src/lib.rs | 2 +- zokrates_bellperson/src/nova.rs | 75 +++++++++----- zokrates_cli/src/cli_constants.rs | 2 + zokrates_cli/src/ops/nova/prove.rs | 152 +++++++++++------------------ 5 files changed, 115 insertions(+), 118 deletions(-) diff --git a/.gitignore b/.gitignore index a11fa3038..d40f233ef 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ out out.ztf abi.json proof.json +init.json +steps.json proving.key verification.key verifier.sol diff --git a/zokrates_abi/src/lib.rs b/zokrates_abi/src/lib.rs index a85adb219..bf8a89d3e 100644 --- a/zokrates_abi/src/lib.rs +++ b/zokrates_abi/src/lib.rs @@ -240,7 +240,7 @@ impl Values { } } -fn parse_value( +pub fn parse_value( value: serde_json::Value, expected_type: ConcreteType, ) -> Result, Error> { diff --git a/zokrates_bellperson/src/nova.rs b/zokrates_bellperson/src/nova.rs index 66c3f563f..7ab65cd24 100644 --- a/zokrates_bellperson/src/nova.rs +++ b/zokrates_bellperson/src/nova.rs @@ -100,32 +100,22 @@ pub fn verify( proof: RecursiveSNARK, steps_count: usize, arguments: Vec, -) -> Result<(), Error> { +) -> Result, Error> { let z0_primary: Vec<_> = arguments.into_iter().map(|a| a.into_bellperson()).collect(); let z0_secondary = vec![<::Point as Group>::Base::one()]; - dbg!(proof + proof .verify(params, steps_count, z0_primary, z0_secondary) - .map(|_| ()) - .map_err(Error::Internal)) + .map_err(Error::Internal) + .map(|(primary, _)| primary.into_iter().map(T::from_bellperson).collect()) } pub fn prove<'ast, T: NovaField>( public_parameters: &PublicParams<'ast, T>, program: Prog<'ast, T>, arguments: Vec, - steps: Vec>, + steps: impl IntoIterator>, ) -> Result>, Error> { - let private_input_count = program.private_input_count(); - - assert!(steps.iter().all(|v| v.len() == private_input_count)); - - let steps_count = steps.len(); - - if steps_count == 0 { - return Ok(None); - } - let c_primary = NovaComputation::try_from(Computation::without_witness(program))?; let c_secondary = TrivialTestCircuit::default(); let z0_primary: Vec<_> = arguments.into_iter().map(|a| a.into_bellperson()).collect(); @@ -188,7 +178,7 @@ impl<'ast, T: Field + BellpersonFieldExtensions + Cycle> StepCircuit = input .iter() .map(|v| T::from_bellperson(v.get_value().unwrap())) - .chain(self.step_private.clone().unwrap()) + .chain(self.step_private.clone().into_iter().flatten()) .collect(); witness = interpreter .execute(self.computation.program.clone(), &inputs) @@ -261,17 +251,17 @@ mod tests { use zokrates_ast::ir::Prog; use zokrates_field::PallasField; - fn test(program: Prog, arguments: Vec, step_privates: Vec>) { + fn test(program: Prog, initial_state: Vec, step_privates: Vec>, expected_final_state: Vec) { let steps_count = step_privates.len(); let params = generate_public_parameters(program.clone()).unwrap(); - let proof = prove(¶ms, program.clone(), arguments.clone(), step_privates).unwrap(); - assert!(verify(¶ms, proof.unwrap(), steps_count, arguments).is_ok()); + let proof = prove(¶ms, program.clone(), initial_state.clone(), step_privates).unwrap().unwrap(); + assert_eq!(verify(¶ms, proof, steps_count, initial_state).unwrap(), expected_final_state); } #[test] fn empty() { let program: Prog = Prog::default(); - test(program, vec![], vec![vec![]; 3]); + test(program, vec![], vec![vec![]; 3], vec![]); } #[test] @@ -282,7 +272,7 @@ mod tests { statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], }; - test(program, vec![PallasField::from(0)], vec![vec![]; 3]); + test(program, vec![PallasField::from(0)], vec![vec![]; 3], vec![PallasField::from(0)]); } #[test] @@ -296,7 +286,7 @@ mod tests { )], }; - test(program, vec![PallasField::from(3)], vec![vec![]; 3]); + test(program, vec![PallasField::from(3)], vec![vec![]; 3], vec![PallasField::from(6)]); } #[test] @@ -323,6 +313,7 @@ mod tests { program, vec![PallasField::from(0), PallasField::from(1)], vec![vec![]; 3], + vec![PallasField::from(4), PallasField::from(4)], ); } @@ -355,6 +346,46 @@ mod tests { vec![PallasField::from(2)], vec![PallasField::from(3)], ], + vec![PallasField::from(8)] + ); + } + + #[test] + fn complex_fold() { + // def main(public field[2] acc, field[2] e) -> field[2] { + // return [acc[0] + e[0], acc[1] + e[1]] + // } + + // called with init [2, 3] and round private inputs [[1, 2], [3, 4], [5, 6]] + // should return [2 + 1 + 3 + 5, 3 + 2 + 4 + 6] = [11, 15] + + let program = Prog { + arguments: vec![ + Parameter::public(Variable::new(0)), + Parameter::public(Variable::new(1)), + Parameter::private(Variable::new(2)), + Parameter::private(Variable::new(3)), + ], + return_count: 2, + statements: vec![Statement::constraint( + LinComb::from(Variable::new(0)) + LinComb::from(Variable::new(2)), + Variable::public(0), + ), + Statement::constraint( + LinComb::from(Variable::new(1)) + LinComb::from(Variable::new(3)), + Variable::public(1), + )], + }; + + test( + program, + vec![PallasField::from(2), PallasField::from(3)], + vec![ + vec![PallasField::from(1), PallasField::from(2)], + vec![PallasField::from(3), PallasField::from(4)], + vec![PallasField::from(5), PallasField::from(6)], + ], + vec![PallasField::from(11), PallasField::from(15)], ); } } diff --git a/zokrates_cli/src/cli_constants.rs b/zokrates_cli/src/cli_constants.rs index be037bcb6..d9e8bf32e 100644 --- a/zokrates_cli/src/cli_constants.rs +++ b/zokrates_cli/src/cli_constants.rs @@ -1,6 +1,8 @@ use zokrates_common::constants::*; pub const FLATTENED_CODE_DEFAULT_PATH: &str = "out"; +pub const NOVA_STEPS_PRIVATE_INPUTS: &str = "steps.json"; +pub const NOVA_PUBLIC_INIT: &str = "init.json"; pub const CIRCOM_R1CS_DEFAULT_PATH: &str = "out.r1cs"; pub const CIRCOM_WITNESS_DEFAULT_PATH: &str = "out.wtns"; pub const ABI_SPEC_DEFAULT_PATH: &str = "abi.json"; diff --git a/zokrates_cli/src/ops/nova/prove.rs b/zokrates_cli/src/ops/nova/prove.rs index 6cb8fbbd1..096e6aebe 100644 --- a/zokrates_cli/src/ops/nova/prove.rs +++ b/zokrates_cli/src/ops/nova/prove.rs @@ -1,26 +1,31 @@ -use crate::cli_constants::{self, FLATTENED_CODE_DEFAULT_PATH}; +use crate::cli_constants::{ + self, FLATTENED_CODE_DEFAULT_PATH, NOVA_PUBLIC_INIT, NOVA_STEPS_PRIVATE_INPUTS, +}; use clap::{App, Arg, ArgMatches, SubCommand}; -use serde_json::from_reader; +use serde_json::{from_reader, Value}; use std::fs::File; -use std::io::{stdin, Write}; -use std::io::{BufReader, Read}; +use std::io::{BufReader, Write}; use std::path::Path; -use zokrates_abi::Encode; +use zokrates_abi::{parse_value, Encode, Values}; use zokrates_ast::ir::{self, ProgEnum}; use zokrates_ast::typed::abi::Abi; -use zokrates_ast::typed::types::GTupleType; -use zokrates_ast::typed::{ConcreteSignature, ConcreteType}; use zokrates_bellperson::nova::{self, NovaField}; pub fn subcommand() -> App<'static, 'static> { SubCommand::with_name("prove") - .about("Proves a single step of an incremental computation") + .about("Proves a many steps of an incremental computation") + .arg(Arg::with_name("init") + .long("init") + .help("Path to the initial value of the public input") + .takes_value(true) + .default_value(NOVA_PUBLIC_INIT), + ) .arg(Arg::with_name("steps") .long("steps") - .help("The number of steps to execute") + .help("Path to the value of the private input for each step") .takes_value(true) - .default_value("1"), - ) + .default_value(NOVA_STEPS_PRIVATE_INPUTS), + ) .arg( Arg::with_name("input") .short("i") @@ -62,13 +67,6 @@ pub fn subcommand() -> App<'static, 'static> { .required(false) .default_value(cli_constants::JSON_PROOF_PATH), ) - .arg( - Arg::with_name("abi") - .long("abi") - .help("Use ABI encoding. Arguments are expected as a JSON object as specified at zokrates.github.io/toolbox/abi.html#abi-input-format") - .conflicts_with("arguments") - .required(false) - ) .arg( Arg::with_name("stdin") .long("stdin") @@ -97,100 +95,64 @@ fn cli_nova_prove_step<'ast, T: NovaField, I: Iterator, sub_matches: &ArgMatches, ) -> Result<(), String> { - let is_stdin = sub_matches.is_present("stdin"); - let is_abi = sub_matches.is_present("abi"); - let steps_count: usize = sub_matches.value_of("steps").unwrap().parse().unwrap(); let proof_path = Path::new(sub_matches.value_of("proof-path").unwrap()); let program = program.collect(); - println!("{}", program); + let path = Path::new(sub_matches.value_of("abi-spec").unwrap()); + let file = + File::open(&path).map_err(|why| format!("Could not open {}: {}", path.display(), why))?; + let mut reader = BufReader::new(file); - println!("Generating public parameters"); + let abi: Abi = from_reader(&mut reader).map_err(|why| why.to_string())?; - let params = nova::generate_public_parameters(program.clone()).map_err(|e| e.to_string())?; + let signature = abi.signature(); - // get inputs (right now only for the first step but eventually at each step) + let init_type = signature.inputs[0].clone(); + let step_type = signature.inputs[1].clone(); - println!("Reading program arguments"); + let init = { + let path = Path::new(sub_matches.value_of("init").unwrap()); + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); - if !is_stdin && is_abi { - return Err("ABI input as inline argument is not supported. Please use `--stdin`.".into()); - } + parse_value(serde_json::from_reader(reader).unwrap(), init_type) + .unwrap() + .encode() + }; - let signature = match is_abi { - true => { - let path = Path::new(sub_matches.value_of("abi-spec").unwrap()); - let file = File::open(&path) - .map_err(|why| format!("Could not open {}: {}", path.display(), why))?; - let mut reader = BufReader::new(file); + println!("Init {:#?}", init); - let abi: Abi = from_reader(&mut reader).map_err(|why| why.to_string())?; + let steps: Vec<_> = { + let path = Path::new(sub_matches.value_of("steps").unwrap()); + let json_str = std::fs::read_to_string(path).unwrap(); - abi.signature() - } - false => ConcreteSignature::new() - .inputs(vec![ConcreteType::FieldElement; program.arguments.len()]) - .output(ConcreteType::Tuple(GTupleType::new( - vec![ConcreteType::FieldElement; program.return_count], - ))), - }; + { + let values: Value = serde_json::from_str(&json_str).map_err(|e| e.to_string())?; - use zokrates_abi::Inputs; - - // get arguments - let arguments = match is_stdin { - // take inline arguments - false => { - let arguments = sub_matches.values_of("arguments"); - arguments - .map(|a| { - a.map(|x| T::try_from_dec_str(x).map_err(|_| x.to_string())) - .collect::, _>>() - }) - .unwrap_or_else(|| Ok(vec![])) - .map(Inputs::Raw) - } - // take stdin arguments - true => { - let mut stdin = stdin(); - let mut input = String::new(); - - match is_abi { - true => match stdin.read_to_string(&mut input) { - Ok(_) => { - use zokrates_abi::parse_strict; - - parse_strict(&input, signature.inputs) - .map(Inputs::Abi) - .map_err(|why| why.to_string()) - } - Err(_) => Err(String::from("???")), - }, - false => match program.arguments.len() { - 0 => Ok(Inputs::Raw(vec![])), - _ => match stdin.read_to_string(&mut input) { - Ok(_) => { - input.retain(|x| x != '\n'); - input - .split(' ') - .map(|x| T::try_from_dec_str(x).map_err(|_| x.to_string())) - .collect::, _>>() - .map(Inputs::Raw) - } - Err(_) => Err(String::from("???")), - }, - }, + match values { + Value::Array(values) => Ok(Values( + values + .into_iter() + .map(|v| parse_value(v, step_type.clone())) + .collect::>() + .map_err(|e| e.to_string())?, + )), + _ => Err(format!("Expected an array of values, found `{}`", values)), } } - } - .map_err(|e| format!("Could not parse argument: {}", e))?; + .unwrap() + .0 + .into_iter() + .map(|e| e.encode()) + .collect() + }; - let arguments = arguments.encode(); + let step_count = steps.len(); - let step_privates = vec![vec![T::from(1)]]; + let params = nova::generate_public_parameters(program.clone()).map_err(|e| e.to_string())?; - let proof = nova::prove(¶ms, program, arguments.clone(), step_privates) + let proof = nova::prove(¶ms, program, init.clone(), steps) .map_err(|e| format!("Error `{:#?}` during proving", e))?; let mut proof_file = File::create(proof_path).unwrap(); @@ -206,7 +168,7 @@ fn cli_nova_prove_step<'ast, T: NovaField, I: Iterator { From eef763321a08c7f6d1d62746480eddd1df89ad7d Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 14 Feb 2023 15:20:25 +0100 Subject: [PATCH 15/30] add to book --- zokrates_bellperson/src/nova.rs | 55 +++++++++++++++++------ zokrates_book/src/SUMMARY.md | 1 + zokrates_book/src/toolbox/experimental.md | 45 +++++++++++++++++++ zokrates_cli/examples/book/nova_step.zok | 3 ++ 4 files changed, 90 insertions(+), 14 deletions(-) create mode 100644 zokrates_book/src/toolbox/experimental.md create mode 100644 zokrates_cli/examples/book/nova_step.zok diff --git a/zokrates_bellperson/src/nova.rs b/zokrates_bellperson/src/nova.rs index 7ab65cd24..7d3850b20 100644 --- a/zokrates_bellperson/src/nova.rs +++ b/zokrates_bellperson/src/nova.rs @@ -251,11 +251,26 @@ mod tests { use zokrates_ast::ir::Prog; use zokrates_field::PallasField; - fn test(program: Prog, initial_state: Vec, step_privates: Vec>, expected_final_state: Vec) { + fn test( + program: Prog, + initial_state: Vec, + step_privates: Vec>, + expected_final_state: Vec, + ) { let steps_count = step_privates.len(); let params = generate_public_parameters(program.clone()).unwrap(); - let proof = prove(¶ms, program.clone(), initial_state.clone(), step_privates).unwrap().unwrap(); - assert_eq!(verify(¶ms, proof, steps_count, initial_state).unwrap(), expected_final_state); + let proof = prove( + ¶ms, + program.clone(), + initial_state.clone(), + step_privates, + ) + .unwrap() + .unwrap(); + assert_eq!( + verify(¶ms, proof, steps_count, initial_state).unwrap(), + expected_final_state + ); } #[test] @@ -272,7 +287,12 @@ mod tests { statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], }; - test(program, vec![PallasField::from(0)], vec![vec![]; 3], vec![PallasField::from(0)]); + test( + program, + vec![PallasField::from(0)], + vec![vec![]; 3], + vec![PallasField::from(0)], + ); } #[test] @@ -286,7 +306,12 @@ mod tests { )], }; - test(program, vec![PallasField::from(3)], vec![vec![]; 3], vec![PallasField::from(6)]); + test( + program, + vec![PallasField::from(3)], + vec![vec![]; 3], + vec![PallasField::from(6)], + ); } #[test] @@ -346,7 +371,7 @@ mod tests { vec![PallasField::from(2)], vec![PallasField::from(3)], ], - vec![PallasField::from(8)] + vec![PallasField::from(8)], ); } @@ -367,14 +392,16 @@ mod tests { Parameter::private(Variable::new(3)), ], return_count: 2, - statements: vec![Statement::constraint( - LinComb::from(Variable::new(0)) + LinComb::from(Variable::new(2)), - Variable::public(0), - ), - Statement::constraint( - LinComb::from(Variable::new(1)) + LinComb::from(Variable::new(3)), - Variable::public(1), - )], + statements: vec![ + Statement::constraint( + LinComb::from(Variable::new(0)) + LinComb::from(Variable::new(2)), + Variable::public(0), + ), + Statement::constraint( + LinComb::from(Variable::new(1)) + LinComb::from(Variable::new(3)), + Variable::public(1), + ), + ], }; test( diff --git a/zokrates_book/src/SUMMARY.md b/zokrates_book/src/SUMMARY.md index 5d2830cbf..84c8ef697 100644 --- a/zokrates_book/src/SUMMARY.md +++ b/zokrates_book/src/SUMMARY.md @@ -27,6 +27,7 @@ - [ZIR](toolbox/ir.md) - [JSON ABI](toolbox/abi.md) - [zokrates.js](toolbox/zokrates_js.md) + - [Experimental](toolbox/experimental.md) - [Examples](examples/index.md) - [A SNARK Powered RNG](examples/rng_tutorial.md) diff --git a/zokrates_book/src/toolbox/experimental.md b/zokrates_book/src/toolbox/experimental.md new file mode 100644 index 000000000..57f5c6c5f --- /dev/null +++ b/zokrates_book/src/toolbox/experimental.md @@ -0,0 +1,45 @@ +# Experimental features + +ZoKrates supports some experimental features. + +## Nova + +ZoKrates supports the `nova` proof system using the `bellperson` backend. Nova is accessed with the subcommand `nova`. + +### API + +To use Nova, programs must have the following signature, for any types `State` and `StepInput`: + +``` +def main(public State state, private StepInput step_input) -> State +``` + +Then, using Nova lets the user prove many steps of this program, given an initial state. + +For example: + +``` +{{#include ../../../zokrates_cli/examples/book/nova_step.zok}} +``` + +We compile this program using the Pallas curve: + +```bash +zokrates compile -i sum.zok --curve pallas +``` + +Then we can prove three iterations as follows: + +```bash +echo "\"0\"" > init.json +echo "[\"1\", \"7\", \"42\"]" > steps.json +zokrates nova prove +``` + +The proof created at `proof.json` proves the statement `0 + 1 + 7 + 42 == 50`. + +### Limitations + +- The step circuit must be compiled with `--curve pallas` +- The resulting recursive proof cannot currently be verified on the EVM +- The public parameters are currently computed for each proof \ No newline at end of file diff --git a/zokrates_cli/examples/book/nova_step.zok b/zokrates_cli/examples/book/nova_step.zok new file mode 100644 index 000000000..15072a569 --- /dev/null +++ b/zokrates_cli/examples/book/nova_step.zok @@ -0,0 +1,3 @@ +def main(public field sum, private field element) -> field { + return sum + element; +} \ No newline at end of file From eb0c698b3cf181d149b45f4dc5f86b41747fb0a2 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 14 Feb 2023 16:15:14 +0100 Subject: [PATCH 16/30] revert ast change --- zokrates_ast/src/ir/mod.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/zokrates_ast/src/ir/mod.rs b/zokrates_ast/src/ir/mod.rs index 68a94c911..78b48f808 100644 --- a/zokrates_ast/src/ir/mod.rs +++ b/zokrates_ast/src/ir/mod.rs @@ -157,10 +157,6 @@ impl<'ast, T, I: IntoIterator>> ProgIterator<'ast, T, self.arguments.iter().filter(|a| !a.private).count() + self.return_count } - pub fn private_input_count(&self) -> usize { - self.arguments.iter().filter(|a| a.private).count() - } - pub fn public_inputs(&self) -> PublicInputs { self.arguments .iter() From a90582099e91e00c6d799cb7d449b50b5c6126a6 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 14 Feb 2023 16:20:22 +0100 Subject: [PATCH 17/30] add vesta to list of curves --- zokrates_cli/src/cli_constants.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zokrates_cli/src/cli_constants.rs b/zokrates_cli/src/cli_constants.rs index d9e8bf32e..01be9fcca 100644 --- a/zokrates_cli/src/cli_constants.rs +++ b/zokrates_cli/src/cli_constants.rs @@ -38,7 +38,7 @@ pub const BACKENDS: &[&str] = if cfg!(feature = "ark") { &[] }; -pub const CURVES: &[&str] = &[BN128, BLS12_381, BLS12_377, BW6_761, PALLAS]; +pub const CURVES: &[&str] = &[BN128, BLS12_381, BLS12_377, BW6_761, PALLAS, VESTA]; pub const SCHEMES: &[&str] = &[G16, GM17, MARLIN]; From 80b6ad12dfb528f501e5d8b9a36391918cddf2c4 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 14 Feb 2023 16:23:36 +0100 Subject: [PATCH 18/30] clean --- zokrates_cli/src/ops/nova/mod.rs | 3 ++- zokrates_cli/src/ops/nova/prove.rs | 20 -------------------- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/zokrates_cli/src/ops/nova/mod.rs b/zokrates_cli/src/ops/nova/mod.rs index 4d39e4152..eeaf34338 100644 --- a/zokrates_cli/src/ops/nova/mod.rs +++ b/zokrates_cli/src/ops/nova/mod.rs @@ -1,10 +1,11 @@ -use clap::{App, ArgMatches, SubCommand}; +use clap::{App, ArgMatches, SubCommand, AppSettings}; pub mod prove; pub fn subcommand() -> App<'static, 'static> { SubCommand::with_name("nova") .about("Nova IVC") + .setting(AppSettings::SubcommandRequiredElseHelp) .subcommands(vec![prove::subcommand().display_order(1)]) } diff --git a/zokrates_cli/src/ops/nova/prove.rs b/zokrates_cli/src/ops/nova/prove.rs index 096e6aebe..62d80a760 100644 --- a/zokrates_cli/src/ops/nova/prove.rs +++ b/zokrates_cli/src/ops/nova/prove.rs @@ -46,17 +46,6 @@ pub fn subcommand() -> App<'static, 'static> { .required(false) .default_value(cli_constants::ABI_SPEC_DEFAULT_PATH) ) - .arg( - Arg::with_name("arguments") - .short("a") - .long("arguments") - .help("Arguments for the program's main function, when not using ABI encoding. Expects a space-separated list of field elements like `-a 1 2 3`") - .takes_value(true) - .multiple(true) // allows multiple values - .required(false) - .conflicts_with("abi") - .conflicts_with("stdin") - ) .arg( Arg::with_name("proof-path") .short("j") @@ -67,13 +56,6 @@ pub fn subcommand() -> App<'static, 'static> { .required(false) .default_value(cli_constants::JSON_PROOF_PATH), ) - .arg( - Arg::with_name("stdin") - .long("stdin") - .help("Read arguments from stdin") - .conflicts_with("arguments") - .required(false) - ) } pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { @@ -121,8 +103,6 @@ fn cli_nova_prove_step<'ast, T: NovaField, I: Iterator = { let path = Path::new(sub_matches.value_of("steps").unwrap()); let json_str = std::fs::read_to_string(path).unwrap(); From 9367a98968bffd0b449c49df868ddeb3eb4e2c89 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 21 Feb 2023 00:59:07 +0100 Subject: [PATCH 19/30] avoid clones in nova. wip --- zokrates_ast/src/ir/mod.rs | 20 +++++++++++++++-- zokrates_cli/src/ops/compute_witness.rs | 8 ++++++- zokrates_cli/src/ops/nova/mod.rs | 2 +- zokrates_cli/src/ops/nova/prove.rs | 24 +++++++++++--------- zokrates_core/src/compile.rs | 2 +- zokrates_interpreter/src/lib.rs | 30 ++++++++++++++++--------- zokrates_js/src/lib.rs | 8 +++++++ zokrates_test/src/lib.rs | 9 +++++++- 8 files changed, 75 insertions(+), 28 deletions(-) diff --git a/zokrates_ast/src/ir/mod.rs b/zokrates_ast/src/ir/mod.rs index 78b48f808..8d8235700 100644 --- a/zokrates_ast/src/ir/mod.rs +++ b/zokrates_ast/src/ir/mod.rs @@ -125,8 +125,24 @@ impl<'ast, T: Field> fmt::Display for Statement<'ast, T> { pub type Prog<'ast, T> = ProgIterator<'ast, T, Vec>>; -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Default)] -pub struct ProgIterator<'ast, T, I: IntoIterator>> { +impl<'ast, T> Prog<'ast, T> { + pub fn to_ref_iterator<'a>( + &'a self, + ) -> ProgRefIterator<'ast, 'a, T, std::slice::Iter<'a, Statement<'ast, T>>> { + ProgRefIterator { + arguments: self.arguments.clone(), + return_count: self.return_count, + statements: self.statements.iter(), + } + } +} + +pub type ProgRefIterator<'ast, 'a, T, I> = GProgIterator<&'a Statement<'ast, T>, I>; + +pub type ProgIterator<'ast, T, I> = GProgIterator, I>; + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] +pub struct GProgIterator> { pub arguments: Vec, pub return_count: usize, pub statements: I, diff --git a/zokrates_cli/src/ops/compute_witness.rs b/zokrates_cli/src/ops/compute_witness.rs index 295ee22c5..f3485e7d8 100644 --- a/zokrates_cli/src/ops/compute_witness.rs +++ b/zokrates_cli/src/ops/compute_witness.rs @@ -173,8 +173,14 @@ fn cli_compute<'a, T: Field, I: Iterator>>( let public_inputs = ir_prog.public_inputs(); + let ir_prog = ir_prog.collect(); + let witness = interpreter - .execute_with_log_stream(ir_prog, &arguments.encode(), &mut std::io::stdout()) + .execute_with_log_stream( + ir_prog.to_ref_iterator(), + &arguments.encode(), + &mut std::io::stdout(), + ) .map_err(|e| format!("Execution failed: {}", e))?; use zokrates_abi::Decode; diff --git a/zokrates_cli/src/ops/nova/mod.rs b/zokrates_cli/src/ops/nova/mod.rs index eeaf34338..8f186eb52 100644 --- a/zokrates_cli/src/ops/nova/mod.rs +++ b/zokrates_cli/src/ops/nova/mod.rs @@ -1,4 +1,4 @@ -use clap::{App, ArgMatches, SubCommand, AppSettings}; +use clap::{App, AppSettings, ArgMatches, SubCommand}; pub mod prove; diff --git a/zokrates_cli/src/ops/nova/prove.rs b/zokrates_cli/src/ops/nova/prove.rs index 62d80a760..b0355fcce 100644 --- a/zokrates_cli/src/ops/nova/prove.rs +++ b/zokrates_cli/src/ops/nova/prove.rs @@ -14,17 +14,19 @@ use zokrates_bellperson::nova::{self, NovaField}; pub fn subcommand() -> App<'static, 'static> { SubCommand::with_name("prove") .about("Proves a many steps of an incremental computation") - .arg(Arg::with_name("init") - .long("init") - .help("Path to the initial value of the public input") - .takes_value(true) - .default_value(NOVA_PUBLIC_INIT), + .arg( + Arg::with_name("init") + .long("init") + .help("Path to the initial value of the public input") + .takes_value(true) + .default_value(NOVA_PUBLIC_INIT), ) - .arg(Arg::with_name("steps") - .long("steps") - .help("Path to the value of the private input for each step") - .takes_value(true) - .default_value(NOVA_STEPS_PRIVATE_INPUTS), + .arg( + Arg::with_name("steps") + .long("steps") + .help("Path to the value of the private input for each step") + .takes_value(true) + .default_value(NOVA_STEPS_PRIVATE_INPUTS), ) .arg( Arg::with_name("input") @@ -44,7 +46,7 @@ pub fn subcommand() -> App<'static, 'static> { .value_name("FILE") .takes_value(true) .required(false) - .default_value(cli_constants::ABI_SPEC_DEFAULT_PATH) + .default_value(cli_constants::ABI_SPEC_DEFAULT_PATH), ) .arg( Arg::with_name("proof-path") diff --git a/zokrates_core/src/compile.rs b/zokrates_core/src/compile.rs index 0c7583fa2..2b88e20a3 100644 --- a/zokrates_core/src/compile.rs +++ b/zokrates_core/src/compile.rs @@ -19,7 +19,7 @@ use zokrates_ast::typed::abi::Abi; use zokrates_ast::untyped::{Module, OwnedModuleId, Program}; use zokrates_ast::zir::ZirProgram; use zokrates_codegen::from_function_and_config; -use zokrates_common::{CompileConfig, Resolver}; +pub use zokrates_common::{CompileConfig, Resolver}; use zokrates_field::Field; use zokrates_pest_ast as pest; diff --git a/zokrates_interpreter/src/lib.rs b/zokrates_interpreter/src/lib.rs index 9f90e00ca..581042061 100644 --- a/zokrates_interpreter/src/lib.rs +++ b/zokrates_interpreter/src/lib.rs @@ -3,7 +3,8 @@ use std::collections::HashMap; use std::fmt; use zokrates_abi::{Decode, Value}; use zokrates_ast::ir::{ - LinComb, ProgIterator, QuadComb, RuntimeError, Solver, Statement, Variable, Witness, + LinComb, ProgRefIterator, QuadComb, RuntimeError, Solver, Statement, Variable, + Witness, }; use zokrates_ast::zir; use zokrates_field::Field; @@ -26,9 +27,9 @@ impl Interpreter { } impl Interpreter { - pub fn execute<'ast, T: Field, I: IntoIterator>>( + pub fn execute<'ast, 'a, T: Field, I: IntoIterator>>( &self, - program: ProgIterator<'ast, T, I>, + program: ProgRefIterator<'ast, 'a, T, I>, inputs: &[T], ) -> ExecutionResult { self.execute_with_log_stream(program, inputs, &mut std::io::sink()) @@ -36,12 +37,13 @@ impl Interpreter { pub fn execute_with_log_stream< 'ast, + 'a, W: std::io::Write, T: Field, - I: IntoIterator>, + I: IntoIterator>, >( &self, - program: ProgIterator<'ast, T, I>, + program: ProgRefIterator<'ast, 'a, T, I>, inputs: &[T], log_stream: &mut W, ) -> ExecutionResult { @@ -65,7 +67,9 @@ impl Interpreter { let lhs_value = evaluate_quad(&witness, &quad).unwrap(); let rhs_value = evaluate_lin(&witness, &lin).unwrap(); if lhs_value != rhs_value { - return Err(Error::UnsatisfiedConstraint { error }); + return Err(Error::UnsatisfiedConstraint { + error: error.clone(), + }); } } }, @@ -92,7 +96,7 @@ impl Interpreter { } } Statement::Log(l, expressions) => { - let mut parts = l.parts.into_iter(); + let mut parts = l.clone().parts.into_iter(); write!(log_stream, "{}", parts.next().unwrap()) .map_err(|_| Error::LogStream)?; @@ -103,8 +107,12 @@ impl Interpreter { .map(|e| evaluate_lin(&witness, e).unwrap()) .collect(); - write!(log_stream, "{}", Value::decode(values, t).into_serde_json()) - .map_err(|_| Error::LogStream)?; + write!( + log_stream, + "{}", + Value::decode(values, t.clone()).into_serde_json() + ) + .map_err(|_| Error::LogStream)?; write!(log_stream, "{}", part).map_err(|_| Error::LogStream)?; } @@ -146,9 +154,9 @@ impl Interpreter { .collect() } - fn check_inputs<'ast, T: Field, I: IntoIterator>, U>( + fn check_inputs<'ast, 'a, T: Field, I: IntoIterator>, U>( &self, - program: &ProgIterator<'ast, T, I>, + program: &ProgRefIterator<'ast, 'a, T, I>, inputs: &[U], ) -> Result<(), Error> { if program.arguments.len() == inputs.len() { diff --git a/zokrates_js/src/lib.rs b/zokrates_js/src/lib.rs index 92de5a25e..1a123bfe0 100644 --- a/zokrates_js/src/lib.rs +++ b/zokrates_js/src/lib.rs @@ -225,6 +225,7 @@ impl<'a> Write for LogWriter<'a> { mod internal { use super::*; use rand_0_8::{CryptoRng, RngCore}; + use zokrates_ast::ir::ProgRefIterator; pub fn compile( source: JsValue, @@ -325,6 +326,13 @@ mod internal { let public_inputs = program.public_inputs(); let mut writer = LogWriter::new(log_callback); + + let program = ProgRefIterator { + arguments: program.arguments, + return_count: program.return_count, + statements: program.statements.iter(), + }; + let witness = interpreter .execute_with_log_stream(program, &inputs.encode(), &mut writer) .map_err(|err| JsValue::from_str(&format!("Execution failed: {}", err)))?; diff --git a/zokrates_test/src/lib.rs b/zokrates_test/src/lib.rs index 0aa85f907..9fb5a08c1 100644 --- a/zokrates_test/src/lib.rs +++ b/zokrates_test/src/lib.rs @@ -5,6 +5,7 @@ use std::fs::File; use std::io::BufReader; use std::path::{Path, PathBuf}; +use zokrates_ast::ir::ProgRefIterator; use zokrates_ast::typed::types::GTupleType; use zokrates_ast::typed::ConcreteSignature; use zokrates_ast::typed::ConcreteType; @@ -178,7 +179,13 @@ fn compile_and_run(t: Tests) { .unwrap() }; - let output = interpreter.execute(bin.clone(), &input); + let bin = ProgRefIterator { + arguments: bin.arguments.clone(), + return_count: bin.return_count, + statements: bin.statements.iter(), + }; + + let output = interpreter.execute(bin, &input); use zokrates_abi::Decode; From fa2a8ad3b68e980e6c190e4c7ce679299edceb46 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 21 Feb 2023 10:25:28 +0100 Subject: [PATCH 20/30] add bellperson --- zokrates_bellperson/Cargo.toml | 1 + zokrates_bellperson/examples/10_cubes.rs | 8 ++++--- zokrates_bellperson/src/lib.rs | 28 +++++++++++------------- zokrates_bellperson/src/nova.rs | 18 ++++++++------- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/zokrates_bellperson/Cargo.toml b/zokrates_bellperson/Cargo.toml index 7da5f7586..690d27178 100644 --- a/zokrates_bellperson/Cargo.toml +++ b/zokrates_bellperson/Cargo.toml @@ -26,6 +26,7 @@ getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] } hex = "0.4.2" pairing = "0.22" pasta_curves = { version = "0.5.2", features = ["repr-c", "serde"], package = "fil_pasta_curves"} +zokrates_core = { version = "0.7.3", path = "../zokrates_core" } diff --git a/zokrates_bellperson/examples/10_cubes.rs b/zokrates_bellperson/examples/10_cubes.rs index 317a87ed8..10a1287bf 100644 --- a/zokrates_bellperson/examples/10_cubes.rs +++ b/zokrates_bellperson/examples/10_cubes.rs @@ -39,7 +39,7 @@ fn main() { let circuit_primary = NovaComputation::try_from(Computation::without_witness(prog)).unwrap(); let circuit_secondary = TrivialTestCircuit::default(); - type C1 = NovaComputation; + type C1<'a> = NovaComputation<'a, PallasField>; type C2 = TrivialTestCircuit; // produce public parameters @@ -96,8 +96,10 @@ fn main() { // produce a compressed SNARK println!("Generating a CompressedSNARK using Spartan with IPA-PC..."); let start = Instant::now(); - type S1 = nova_snark::spartan_with_ipa_pc::RelaxedR1CSSNARK; - type S2 = nova_snark::spartan_with_ipa_pc::RelaxedR1CSSNARK; + type EE1 = nova_snark::provider::ipa_pc::EvaluationEngine; + type EE2 = nova_snark::provider::ipa_pc::EvaluationEngine; + type S1 = nova_snark::spartan::RelaxedR1CSSNARK; + type S2 = nova_snark::spartan::RelaxedR1CSSNARK; let res = CompressedSNARK::<_, _, _, _, S1, S2>::prove(&pp, &recursive_snark); println!( "CompressedSNARK::prove: {:?}, took {:?}", diff --git a/zokrates_bellperson/src/lib.rs b/zokrates_bellperson/src/lib.rs index cad7231e2..1edf0bf31 100644 --- a/zokrates_bellperson/src/lib.rs +++ b/zokrates_bellperson/src/lib.rs @@ -7,7 +7,7 @@ use bellperson::{ use std::collections::BTreeMap; use zokrates_ast::common::Variable; -use zokrates_ast::ir::{CanonicalLinComb, ProgIterator, Statement, Witness}; +use zokrates_ast::ir::{LinComb, ProgIterator, Statement, Witness}; use zokrates_field::BellpersonFieldExtensions; use zokrates_field::Field; @@ -39,16 +39,16 @@ fn bellperson_combination< T: Field + BellpersonFieldExtensions, CS: ConstraintSystem, >( - l: CanonicalLinComb, + l: &LinComb, cs: &mut CS, symbols: &mut BTreeMap, witness: &mut Witness, ) -> LinearCombination { - l.0.into_iter() + l.0.iter() .map(|(k, v)| { ( - v.into_bellperson(), - *symbols.entry(k).or_insert_with(|| { + v.clone().into_bellperson(), + *symbols.entry(k.clone()).or_insert_with(|| { match k.is_output() { true => { unreachable!("outputs should already have been allocated, found {}", k) @@ -69,8 +69,8 @@ fn bellperson_combination< .fold(LinearCombination::zero(), |acc, e| acc + e) } -impl<'ast, T: BellpersonFieldExtensions + Field, I: IntoIterator>> - Circuit for Computation<'ast, T, I> +impl<'ast, T: BellpersonFieldExtensions + Field> Circuit + for Computation<'ast, T, Vec>> { fn synthesize>( self, @@ -128,20 +128,18 @@ impl<'ast, T: BellpersonFieldExtensions + Field, I: IntoIterator>> - Computation<'ast, T, I> -{ +impl<'ast, T: BellpersonFieldExtensions + Field> Computation<'ast, T, Vec>> { pub fn synthesize_input_to_output>( - self, + &self, cs: &mut CS, symbols: &mut BTreeMap, witness: &mut Witness, ) -> Result<(), SynthesisError> { - for (i, statement) in self.program.statements.into_iter().enumerate() { + for (i, statement) in self.program.statements.iter().enumerate() { if let Statement::Constraint(quad, lin, _) = statement { - let a = &bellperson_combination(quad.left.into_canonical(), cs, symbols, witness); - let b = &bellperson_combination(quad.right.into_canonical(), cs, symbols, witness); - let c = &bellperson_combination(lin.into_canonical(), cs, symbols, witness); + let a = &bellperson_combination(&quad.left, cs, symbols, witness); + let b = &bellperson_combination(&quad.right, cs, symbols, witness); + let c = &bellperson_combination(lin, cs, symbols, witness); cs.enforce( || format!("Constraint {}", i), diff --git a/zokrates_bellperson/src/nova.rs b/zokrates_bellperson/src/nova.rs index 7d3850b20..b5f7e1c1c 100644 --- a/zokrates_bellperson/src/nova.rs +++ b/zokrates_bellperson/src/nova.rs @@ -167,6 +167,8 @@ impl<'ast, T: Field + BellpersonFieldExtensions + Cycle> StepCircuit StepCircuit StepCircuit = self - .computation - .program - .returns() + let outputs: Vec<_> = outputs .iter() .map(|v| { assert!(v.id < 0); // this should indeed be an output @@ -216,7 +215,6 @@ impl<'ast, T: Field + BellpersonFieldExtensions + Cycle> StepCircuit StepCircuit = Prog::default(); + let program: Prog = Prog { + arguments: vec![], + return_count: 0, + statements: vec![], + }; test(program, vec![], vec![vec![]; 3], vec![]); } From b397e8a9932173b15c5a817470aa45f307efb21d Mon Sep 17 00:00:00 2001 From: schaeff Date: Thu, 20 Apr 2023 14:40:34 +0200 Subject: [PATCH 21/30] reduce propagation memory usage --- changelogs/unreleased/1296-schaeff | 1 + zokrates_analysis/src/propagation.rs | 128 ++++++++++++------ zokrates_analysis/src/reducer/mod.rs | 13 +- zokrates_ast/src/typed/mod.rs | 31 +++-- .../compile_errors/variable_sized_array.zok | 4 + 5 files changed, 118 insertions(+), 59 deletions(-) create mode 100644 changelogs/unreleased/1296-schaeff create mode 100644 zokrates_cli/examples/compile_errors/variable_sized_array.zok diff --git a/changelogs/unreleased/1296-schaeff b/changelogs/unreleased/1296-schaeff new file mode 100644 index 000000000..c5ef025fe --- /dev/null +++ b/changelogs/unreleased/1296-schaeff @@ -0,0 +1 @@ +Reduce memory usage of compilation \ No newline at end of file diff --git a/zokrates_analysis/src/propagation.rs b/zokrates_analysis/src/propagation.rs index 4fc9e6651..35a048e08 100644 --- a/zokrates_analysis/src/propagation.rs +++ b/zokrates_analysis/src/propagation.rs @@ -32,6 +32,7 @@ pub enum Error { AssertionFailed(RuntimeError), InvalidValue(String), OutOfBounds(u128, u128), + VariableLength(String), } impl fmt::Display for Error { @@ -45,6 +46,7 @@ impl fmt::Display for Error { "Out of bounds index ({} >= {}) found during static analysis", index, size ), + Error::VariableLength(message) => write!(f, "{}", message), } } } @@ -61,6 +63,10 @@ impl<'ast, T: Field> Propagator<'ast, T> { Propagator::default().fold_program(p) } + pub fn clear_call_frame(&mut self, frame: usize) { + self.constants.retain(|id, _| id.id.frame != frame); + } + // get a mutable reference to the constant corresponding to a given assignee if any, otherwise // return the identifier at the root of this assignee fn try_get_constant_mut<'b>( @@ -1153,59 +1159,93 @@ impl<'ast, T: Field> ResultFolder<'ast, T> for Propagator<'ast, T> { _: &E::Ty, e: SelectExpression<'ast, T, E>, ) -> Result, Self::Error> { - let array = self.fold_array_expression(*e.array)?; let index = self.fold_uint_expression(*e.index)?; + let array = *e.array; + + let ty = self.fold_array_type(*array.ty)?; + let size = match ty.size.as_inner() { + UExpressionInner::Value(v) => Ok(v), + _ => unreachable!("array size was checked when folding array type"), + }?; + + match (array.inner, index.into_inner()) { + // special case if the array is an identifier: check the cache and only clone the element, not the whole array + (ArrayExpressionInner::Identifier(id), UExpressionInner::Value(n)) => { + match self.constants.get(&id.id) { + Some(v) => { + // get the constant array. it was guaranteed to be a value when it was inserted + let v = match v { + TypedExpression::Array(a) => match a.as_inner() { + ArrayExpressionInner::Value(v) => v, + _ => unreachable!(), + }, + _ => unreachable!(), + }; - let inner_type = array.inner_type().clone(); - let size = array.size(); - - match size.into_inner() { - UExpressionInner::Value(size) => match (array.into_inner(), index.into_inner()) { - (ArrayExpressionInner::Value(v), UExpressionInner::Value(n)) => { - if n < size { - Ok(SelectOrExpression::Expression( - v.expression_at::(n.value as usize).unwrap().into_inner(), - )) - } else { - Err(Error::OutOfBounds(n.value, size.value)) + // sanity check that the value does not contain spreads + assert!(v + .value + .iter() + .all(|e| matches!(e, TypedExpressionOrSpread::Expression(_)))); + + if n.value < size.value { + Ok(SelectOrExpression::Expression( + // clone only the element + match v.value[n.value as usize].clone() { + TypedExpressionOrSpread::Expression(e) => { + E::try_from(e).unwrap().into_inner() + } + _ => unreachable!(), + }, + )) + } else { + Err(Error::OutOfBounds(n.value, size.value)) + } } + _ => Ok(SelectOrExpression::Select(SelectExpression::new( + ArrayExpressionInner::Identifier(id).annotate(ty), + UExpressionInner::Value(n).annotate(UBitwidth::B32), + ))), } - (ArrayExpressionInner::Identifier(id), UExpressionInner::Value(n)) => { - match self.constants.get(&id.id) { - Some(a) => match a { - TypedExpression::Array(a) => match a.as_inner() { - ArrayExpressionInner::Value(v) => { - Ok(SelectOrExpression::Expression( - v.expression_at::(n.value as usize) - .unwrap() - .into_inner(), - )) - } - _ => unreachable!("should be an array value"), - }, - _ => unreachable!("should be an array expression"), - }, - None => Ok(SelectOrExpression::Expression( - E::select( - ArrayExpressionInner::Identifier(id) - .annotate(ArrayType::new(inner_type, size.value as u32)), - UExpressionInner::Value(n).annotate(UBitwidth::B32), - ) - .into_inner(), - )), + } + (array, index) => { + let array = self.fold_array_expression_inner(&ty, array)?; + + match (array, index) { + (ArrayExpressionInner::Value(v), UExpressionInner::Value(n)) => { + if n.value < size.value { + Ok(SelectOrExpression::Expression( + v.expression_at::(n.value as usize).into_inner(), + )) + } else { + Err(Error::OutOfBounds(n.value, size.value)) + } } + (a, i) => Ok(SelectOrExpression::Select(SelectExpression::new( + a.annotate(ty), + i.annotate(UBitwidth::B32), + ))), } - (a, i) => Ok(SelectOrExpression::Select(SelectExpression::new( - a.annotate(ArrayType::new(inner_type, size.value as u32)), - i.annotate(UBitwidth::B32), - ))), - }, - _ => Ok(SelectOrExpression::Select(SelectExpression::new( - array, index, - ))), + } } } + fn fold_array_type( + &mut self, + t: ArrayType<'ast, T>, + ) -> Result, Self::Error> { + let size = self.fold_uint_expression(*t.size)?; + + if !size.is_constant() { + return Err(Error::VariableLength(format!( + "Array length should be fixed, found {}", + size + ))); + } + + Ok(ArrayType::new(self.fold_type(*t.ty)?, size)) + } + fn fold_array_expression_cases( &mut self, ty: &ArrayType<'ast, T>, diff --git a/zokrates_analysis/src/reducer/mod.rs b/zokrates_analysis/src/reducer/mod.rs index c248cccf2..585966858 100644 --- a/zokrates_analysis/src/reducer/mod.rs +++ b/zokrates_analysis/src/reducer/mod.rs @@ -106,6 +106,15 @@ impl<'ast, 'a, T: Field> Reducer<'ast, 'a, T> { program, } } + + fn push_call_frame(&mut self) { + self.ssa.push_call_frame(); + } + + fn pop_call_frame(&mut self) { + self.propagator.clear_call_frame(self.ssa.latest_frame); + self.ssa.pop_call_frame(); + } } impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Reducer<'ast, 'a, T> { @@ -159,7 +168,7 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Reducer<'ast, 'a, T> { }) .collect::>()?; - self.ssa.push_call_frame(); + self.push_call_frame(); let res = inline_call::<_, E>(&e.function_key, &generics, &arguments, ty, self.program); @@ -236,7 +245,7 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Reducer<'ast, 'a, T> { } }; - self.ssa.pop_call_frame(); + self.pop_call_frame(); res } diff --git a/zokrates_ast/src/typed/mod.rs b/zokrates_ast/src/typed/mod.rs index 77789fe06..e8072ba14 100644 --- a/zokrates_ast/src/typed/mod.rs +++ b/zokrates_ast/src/typed/mod.rs @@ -1731,28 +1731,31 @@ impl<'ast, T> std::iter::FromIterator> impl<'ast, T: Field> ArrayValueExpression<'ast, T> { fn expression_at_aux< + 'a, U: Select<'ast, T> + From> + Into>, >( v: TypedExpressionOrSpread<'ast, T>, - ) -> Vec> { + ) -> Vec> { match v { - TypedExpressionOrSpread::Expression(e) => vec![Some(e.into())], + TypedExpressionOrSpread::Expression(e) => vec![e], TypedExpressionOrSpread::Spread(s) => match s.array.size().into_inner() { UExpressionInner::Value(size) => { let array_ty = s.array.ty().clone(); match s.array.into_inner() { - ArrayExpressionInner::Value(v) => { - v.into_iter().flat_map(Self::expression_at_aux).collect() - } + ArrayExpressionInner::Value(v) => v + .value + .into_iter() + .flat_map(Self::expression_at_aux::) + .collect(), a => (0..size.value) .map(|i| { - Some(U::select(a.clone().annotate(array_ty.clone()), i as u32)) + U::select(a.clone().annotate(array_ty.clone()), i as u32).into() }) .collect(), } } - _ => vec![None], + _ => unreachable!(), }, } } @@ -1760,14 +1763,16 @@ impl<'ast, T: Field> ArrayValueExpression<'ast, T> { pub fn expression_at< U: Select<'ast, T> + From> + Into>, >( - &self, + self, index: usize, - ) -> Option { - self.iter() - .flat_map(|v| Self::expression_at_aux(v.clone())) - .take_while(|e| e.is_some()) - .map(|e| e.unwrap()) + ) -> U { + self.into_iter() + .flat_map(|v| Self::expression_at_aux::(v)) .nth(index) + .unwrap() + .clone() + .try_into() + .unwrap() } } diff --git a/zokrates_cli/examples/compile_errors/variable_sized_array.zok b/zokrates_cli/examples/compile_errors/variable_sized_array.zok new file mode 100644 index 000000000..bf15681a2 --- /dev/null +++ b/zokrates_cli/examples/compile_errors/variable_sized_array.zok @@ -0,0 +1,4 @@ +def main(u32 N) { + field[N] a = [0; N]; + return; +} \ No newline at end of file From 326ba9102f4fa035ee11d41ca9ff76333d50706a Mon Sep 17 00:00:00 2001 From: schaeff Date: Thu, 20 Apr 2023 22:53:46 +0200 Subject: [PATCH 22/30] remove unused dependencies --- Cargo.lock | 36 ------------------------------------ zokrates_analysis/Cargo.toml | 6 +----- zokrates_ast/Cargo.toml | 1 - zokrates_circom/Cargo.toml | 1 - zokrates_core/Cargo.toml | 5 ----- 5 files changed, 1 insertion(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e74fd1a9d..856cba7dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -882,27 +882,6 @@ dependencies = [ "subtle 2.5.0", ] -[[package]] -name = "csv" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b015497079b9a9d69c02ad25de6c0a6edef051ea6360a327d0bd05802ef64ad" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" -dependencies = [ - "memchr", -] - [[package]] name = "ctor" version = "0.1.26" @@ -2123,12 +2102,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "reduce" -version = "0.1.5+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feff7c275fbc4a96ccdc240a5a180487a61a31baffaff6cdd4fb2c8e9e0a2ecd" - [[package]] name = "regex" version = "0.2.11" @@ -3104,21 +3077,17 @@ name = "zokrates_analysis" version = "0.1.2" dependencies = [ "cfg-if 0.1.10", - "csv", "lazy_static", "log", "num", "num-bigint 0.2.6", "pretty_assertions 0.6.1", - "reduce", "serde", "serde_json", - "typed-arena", "zokrates_ast", "zokrates_common", "zokrates_embed", "zokrates_field", - "zokrates_fs_resolver", "zokrates_pest_ast", ] @@ -3157,7 +3126,6 @@ dependencies = [ "byteorder", "cfg-if 0.1.10", "derivative", - "log", "num-bigint 0.2.6", "pairing_ce", "serde", @@ -3194,7 +3162,6 @@ dependencies = [ "pretty_assertions 1.3.0", "zkutil", "zokrates_ast", - "zokrates_core", "zokrates_field", ] @@ -3264,12 +3231,10 @@ name = "zokrates_core" version = "0.7.5" dependencies = [ "cfg-if 0.1.10", - "csv", "lazy_static", "log", "num", "num-bigint 0.2.6", - "pretty_assertions 0.6.1", "serde", "serde_json", "typed-arena", @@ -3279,7 +3244,6 @@ dependencies = [ "zokrates_common", "zokrates_embed", "zokrates_field", - "zokrates_fs_resolver", "zokrates_interpreter", "zokrates_pest_ast", ] diff --git a/zokrates_analysis/Cargo.toml b/zokrates_analysis/Cargo.toml index 911790400..b2415b4a5 100644 --- a/zokrates_analysis/Cargo.toml +++ b/zokrates_analysis/Cargo.toml @@ -14,8 +14,6 @@ cfg-if = "0.1" num = { version = "0.1.36", default-features = false } num-bigint = { version = "0.2", default-features = false } lazy_static = "1.4" -typed-arena = "1.4.1" -reduce = "0.1.1" # serialization and deserialization serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"] } @@ -24,8 +22,6 @@ zokrates_pest_ast = { version = "0.3.0", path = "../zokrates_pest_ast" } zokrates_common = { version = "0.1", path = "../zokrates_common", default-features = false } zokrates_embed = { version = "0.1.0", path = "../zokrates_embed", default-features = false } zokrates_ast = { version = "0.1", path = "../zokrates_ast", default-features = false } -csv = "1" [dev-dependencies] -pretty_assertions = "0.6.1" -zokrates_fs_resolver = { version = "0.5", path = "../zokrates_fs_resolver"} \ No newline at end of file +pretty_assertions = "0.6.1" \ No newline at end of file diff --git a/zokrates_ast/Cargo.toml b/zokrates_ast/Cargo.toml index 1e8e47c9f..478f0fdf0 100644 --- a/zokrates_ast/Cargo.toml +++ b/zokrates_ast/Cargo.toml @@ -9,7 +9,6 @@ bellman = ["zokrates_field/bellman", "pairing_ce", "zokrates_embed/bellman"] ark = ["ark-bls12-377", "zokrates_embed/ark"] [dependencies] -log = "0.4" byteorder = "1.4.3" zokrates_pest_ast = { version = "0.3.0", path = "../zokrates_pest_ast" } cfg-if = "0.1" diff --git a/zokrates_circom/Cargo.toml b/zokrates_circom/Cargo.toml index 04de4d523..1b60f3b91 100644 --- a/zokrates_circom/Cargo.toml +++ b/zokrates_circom/Cargo.toml @@ -6,7 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -zokrates_core = { version = "0.7", path = "../zokrates_core", default-features = false } zokrates_ast = { version = "0.1", path = "../zokrates_ast", default-features = false } zokrates_field = { version = "0.5.0", path = "../zokrates_field", default-features = false } byteorder = "1.4.3" diff --git a/zokrates_core/Cargo.toml b/zokrates_core/Cargo.toml index e443f1768..a8d1d2dde 100644 --- a/zokrates_core/Cargo.toml +++ b/zokrates_core/Cargo.toml @@ -29,8 +29,3 @@ zokrates_interpreter = { version = "0.1", path = "../zokrates_interpreter", defa zokrates_codegen = { version = "0.1", path = "../zokrates_codegen", default-features = false } zokrates_analysis = { version = "0.1", path = "../zokrates_analysis", default-features = false } zokrates_ast = { version = "0.1", path = "../zokrates_ast", default-features = false } -csv = "1" - -[dev-dependencies] -pretty_assertions = "0.6.1" -zokrates_fs_resolver = { version = "0.5", path = "../zokrates_fs_resolver"} From 8de32bd5e426c9a6de53ee6176b2cac63bc24999 Mon Sep 17 00:00:00 2001 From: dark64 Date: Fri, 21 Apr 2023 02:59:16 +0200 Subject: [PATCH 23/30] refactor --- .gitignore | 1 + zokrates_ark/src/gm17.rs | 14 +++- zokrates_ark/src/groth16.rs | 14 +++- zokrates_ark/src/marlin.rs | 14 +++- zokrates_ast/src/ir/mod.rs | 58 ++++++----------- zokrates_ast/src/ir/serialize.rs | 2 + zokrates_bellman/src/groth16.rs | 7 +- zokrates_bellman/src/lib.rs | 54 +++++++++++++--- zokrates_bellperson/examples/10_cubes.rs | 2 +- zokrates_bellperson/src/lib.rs | 37 +++++------ zokrates_bellperson/src/nova.rs | 82 ++++++++++++++++-------- zokrates_cli/src/bin.rs | 18 +++++- zokrates_cli/src/cli_constants.rs | 1 + zokrates_cli/src/ops/compute_witness.rs | 7 +- zokrates_cli/src/ops/nova/mod.rs | 7 +- zokrates_cli/src/ops/nova/prove.rs | 39 +++++++---- zokrates_cli/src/ops/nova/setup.rs | 70 ++++++++++++++++++++ zokrates_cli/src/ops/profile.rs | 2 + zokrates_field/src/lib.rs | 4 +- zokrates_interpreter/src/lib.rs | 56 ++++++++-------- zokrates_js/src/lib.rs | 16 ++--- zokrates_test/src/lib.rs | 10 +-- zokrates_test/tests/out_of_range.rs | 30 +++++++-- zokrates_test/tests/wasm.rs | 7 +- 24 files changed, 379 insertions(+), 173 deletions(-) create mode 100644 zokrates_cli/src/ops/nova/setup.rs diff --git a/.gitignore b/.gitignore index f235f7674..7228ce2e4 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ proof.json universal_setup.dat witness witness.json +nova.params # ZoKrates source files at the root of the repository /*.zok diff --git a/zokrates_ark/src/gm17.rs b/zokrates_ark/src/gm17.rs index 4148c1361..dabe52a2c 100644 --- a/zokrates_ark/src/gm17.rs +++ b/zokrates_ark/src/gm17.rs @@ -141,7 +141,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bls12_377Field::from(42)]) + .execute( + &[Bls12_377Field::from(42)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let proof = >::generate_proof( @@ -174,7 +179,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bw6_761Field::from(42)]) + .execute( + &[Bw6_761Field::from(42)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let proof = >::generate_proof( diff --git a/zokrates_ark/src/groth16.rs b/zokrates_ark/src/groth16.rs index c49c8cab1..460b93ea6 100644 --- a/zokrates_ark/src/groth16.rs +++ b/zokrates_ark/src/groth16.rs @@ -140,7 +140,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bls12_377Field::from(42)]) + .execute( + &[Bls12_377Field::from(42)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let proof = >::generate_proof( @@ -173,7 +178,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bw6_761Field::from(42)]) + .execute( + &[Bw6_761Field::from(42)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let proof = >::generate_proof( diff --git a/zokrates_ark/src/marlin.rs b/zokrates_ark/src/marlin.rs index 5292fba94..7b6c8e1a1 100644 --- a/zokrates_ark/src/marlin.rs +++ b/zokrates_ark/src/marlin.rs @@ -419,7 +419,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bls12_377Field::from(42)]) + .execute( + &[Bls12_377Field::from(42)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let proof = >::generate_proof( @@ -457,7 +462,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bw6_761Field::from(42)]) + .execute( + &[Bw6_761Field::from(42)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let proof = >::generate_proof( diff --git a/zokrates_ast/src/ir/mod.rs b/zokrates_ast/src/ir/mod.rs index 176c9c53f..279e231f2 100644 --- a/zokrates_ast/src/ir/mod.rs +++ b/zokrates_ast/src/ir/mod.rs @@ -208,27 +208,9 @@ impl<'ast, T: Field> fmt::Display for Statement<'ast, T> { } } -pub type Prog<'ast, T> = ProgIterator<'ast, T, Vec>>; - -impl<'ast, T> Prog<'ast, T> { - pub fn to_ref_iterator<'a>( - &'a self, - ) -> ProgRefIterator<'ast, 'a, T, std::slice::Iter<'a, Statement<'ast, T>>> { - ProgRefIterator { - arguments: self.arguments.clone(), - return_count: self.return_count, - statements: self.statements.iter(), - module_map: self.module_map.clone(), - solvers: self.solvers.clone(), - } - } -} - -pub type ProgRefIterator<'ast, 'a, T, I> = GProgIterator<'ast, T, &'a Statement<'ast, T>, I>; - pub type ProgIterator<'ast, T, I> = GProgIterator<'ast, T, Statement<'ast, T>, I>; -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Default)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct GProgIterator<'ast, T, S, I: IntoIterator> { pub module_map: ModuleMap, pub arguments: Vec, @@ -238,6 +220,20 @@ pub struct GProgIterator<'ast, T, S, I: IntoIterator> { pub solvers: Vec>, } +pub type Prog<'ast, T> = ProgIterator<'ast, T, Vec>>; + +impl<'ast, T> Default for Prog<'ast, T> { + fn default() -> Self { + Self { + module_map: Default::default(), + arguments: Default::default(), + return_count: Default::default(), + statements: Default::default(), + solvers: Default::default(), + } + } +} + impl<'ast, T, I: IntoIterator>> ProgIterator<'ast, T, I> { pub fn new( arguments: Vec, @@ -255,9 +251,9 @@ impl<'ast, T, I: IntoIterator>> ProgIterator<'ast, T, } } - pub fn collect(self) -> ProgIterator<'ast, T, Vec>> { + pub fn collect(self) -> Prog<'ast, T> { ProgIterator { - statements: self.statements.into_iter().collect::>(), + statements: self.statements.into_iter().collect(), arguments: self.arguments, return_count: self.return_count, module_map: self.module_map, @@ -280,10 +276,10 @@ impl<'ast, T, I: IntoIterator>> ProgIterator<'ast, T, .map(|a| a.id) .collect() } -} - -impl<'ast, T: Field, I: IntoIterator>> ProgIterator<'ast, T, I> { - pub fn public_inputs_values(&self, witness: &Witness) -> Vec { + pub fn public_inputs_values(&self, witness: &Witness) -> Vec + where + T: Field, + { self.arguments .iter() .filter(|p| !p.private) @@ -300,18 +296,6 @@ impl<'ast, T> Prog<'ast, T> { .filter(|s| matches!(s, Statement::Constraint(..))) .count() } - - pub fn into_prog_iter( - self, - ) -> ProgIterator<'ast, T, impl IntoIterator>> { - ProgIterator { - statements: self.statements.into_iter(), - arguments: self.arguments, - return_count: self.return_count, - module_map: self.module_map, - solvers: self.solvers, - } - } } impl<'ast, T: Field> fmt::Display for Prog<'ast, T> { diff --git a/zokrates_ast/src/ir/serialize.rs b/zokrates_ast/src/ir/serialize.rs index a52e75e16..4e5ff7a23 100644 --- a/zokrates_ast/src/ir/serialize.rs +++ b/zokrates_ast/src/ir/serialize.rs @@ -382,6 +382,8 @@ impl<'de, R: Read + Seek> Ok(ProgEnum::Bls12_377Program(Self::read(r, &header))) } m if m == Bw6_761Field::id() => Ok(ProgEnum::Bw6_761Program(Self::read(r, &header))), + m if m == PallasField::id() => Ok(ProgEnum::PallasProgram(Self::read(r, &header))), + m if m == VestaField::id() => Ok(ProgEnum::VestaProgram(Self::read(r, &header))), _ => Err(String::from("Unknown curve identifier")), } } diff --git a/zokrates_bellman/src/groth16.rs b/zokrates_bellman/src/groth16.rs index 2efabd991..03042d46a 100644 --- a/zokrates_bellman/src/groth16.rs +++ b/zokrates_bellman/src/groth16.rs @@ -233,7 +233,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(42)]) + .execute( + &[Bn128Field::from(42)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let proof = >::generate_proof( diff --git a/zokrates_bellman/src/lib.rs b/zokrates_bellman/src/lib.rs index 0f8a7d511..4226e2011 100644 --- a/zokrates_bellman/src/lib.rs +++ b/zokrates_bellman/src/lib.rs @@ -250,10 +250,16 @@ mod tests { #[test] fn empty() { let program: Prog = Prog::default(); - let interpreter = Interpreter::default(); - let witness = interpreter.execute(program.clone(), &[]).unwrap(); + let witness = interpreter + .execute( + &[], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) + .unwrap(); let computation = Computation::with_witness(program, witness); let rng = &mut StdRng::from_entropy(); @@ -278,7 +284,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(0)]) + .execute( + &[Bn128Field::from(0)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let computation = Computation::with_witness(program, witness); @@ -305,7 +316,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(0)]) + .execute( + &[Bn128Field::from(0)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let computation = Computation::with_witness(program, witness); @@ -331,7 +347,14 @@ mod tests { let interpreter = Interpreter::default(); - let witness = interpreter.execute(program.clone(), &[]).unwrap(); + let witness = interpreter + .execute( + &[], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) + .unwrap(); let computation = Computation::with_witness(program, witness); let rng = &mut StdRng::from_entropy(); @@ -368,7 +391,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(3), Bn128Field::from(4)]) + .execute( + &[Bn128Field::from(3), Bn128Field::from(4)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let computation = Computation::with_witness(program, witness); @@ -394,7 +422,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(3)]) + .execute( + &[Bn128Field::from(3)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let computation = Computation::with_witness(program, witness); @@ -424,7 +457,12 @@ mod tests { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(3), Bn128Field::from(4)]) + .execute( + &[Bn128Field::from(3), Bn128Field::from(4)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let computation = Computation::with_witness(program, witness); diff --git a/zokrates_bellperson/examples/10_cubes.rs b/zokrates_bellperson/examples/10_cubes.rs index 10a1287bf..864df6a0f 100644 --- a/zokrates_bellperson/examples/10_cubes.rs +++ b/zokrates_bellperson/examples/10_cubes.rs @@ -36,7 +36,7 @@ fn main() { let prog = artifacts.prog().collect(); - let circuit_primary = NovaComputation::try_from(Computation::without_witness(prog)).unwrap(); + let circuit_primary = NovaComputation::try_from(Computation::without_witness(&prog)).unwrap(); let circuit_secondary = TrivialTestCircuit::default(); type C1<'a> = NovaComputation<'a, PallasField>; diff --git a/zokrates_bellperson/src/lib.rs b/zokrates_bellperson/src/lib.rs index 1edf0bf31..3f91838d6 100644 --- a/zokrates_bellperson/src/lib.rs +++ b/zokrates_bellperson/src/lib.rs @@ -6,28 +6,28 @@ use bellperson::{ }; use std::collections::BTreeMap; -use zokrates_ast::common::Variable; -use zokrates_ast::ir::{LinComb, ProgIterator, Statement, Witness}; +use zokrates_ast::common::flat::Variable; +use zokrates_ast::ir::{LinComb, Prog, Statement, Witness}; use zokrates_field::BellpersonFieldExtensions; use zokrates_field::Field; pub struct Bellperson; #[derive(Clone, Debug)] -pub struct Computation<'ast, T, I: IntoIterator>> { - pub program: ProgIterator<'ast, T, I>, +pub struct Computation<'ast, T> { + pub program: &'ast Prog<'ast, T>, pub witness: Option>, } -impl<'ast, T: Field, I: IntoIterator>> Computation<'ast, T, I> { - pub fn with_witness(program: ProgIterator<'ast, T, I>, witness: Witness) -> Self { +impl<'ast, T: Field> Computation<'ast, T> { + pub fn with_witness(program: &'ast Prog<'ast, T>, witness: Witness) -> Self { Computation { program, witness: Some(witness), } } - pub fn without_witness(program: ProgIterator<'ast, T, I>) -> Self { + pub fn without_witness(program: &'ast Prog<'ast, T>) -> Self { Computation { program, witness: None, @@ -44,11 +44,12 @@ fn bellperson_combination< symbols: &mut BTreeMap, witness: &mut Witness, ) -> LinearCombination { - l.0.iter() + l.value + .iter() .map(|(k, v)| { ( - v.clone().into_bellperson(), - *symbols.entry(k.clone()).or_insert_with(|| { + v.into_bellperson(), + *symbols.entry(*k).or_insert_with(|| { match k.is_output() { true => { unreachable!("outputs should already have been allocated, found {}", k) @@ -56,7 +57,7 @@ fn bellperson_combination< false => AllocatedNum::alloc(cs.namespace(|| format!("{}", k)), || { Ok(witness .0 - .remove(&k) + .remove(k) .ok_or(SynthesisError::AssignmentMissing)? .into_bellperson()) }), @@ -70,7 +71,7 @@ fn bellperson_combination< } impl<'ast, T: BellpersonFieldExtensions + Field> Circuit - for Computation<'ast, T, Vec>> + for Computation<'ast, T> { fn synthesize>( self, @@ -128,7 +129,7 @@ impl<'ast, T: BellpersonFieldExtensions + Field> Circuit } } -impl<'ast, T: BellpersonFieldExtensions + Field> Computation<'ast, T, Vec>> { +impl<'ast, T: BellpersonFieldExtensions + Field> Computation<'ast, T> { pub fn synthesize_input_to_output>( &self, cs: &mut CS, @@ -136,10 +137,10 @@ impl<'ast, T: BellpersonFieldExtensions + Field> Computation<'ast, T, Vec, ) -> Result<(), SynthesisError> { for (i, statement) in self.program.statements.iter().enumerate() { - if let Statement::Constraint(quad, lin, _) = statement { - let a = &bellperson_combination(&quad.left, cs, symbols, witness); - let b = &bellperson_combination(&quad.right, cs, symbols, witness); - let c = &bellperson_combination(lin, cs, symbols, witness); + if let Statement::Constraint(constraint) = statement { + let a = &bellperson_combination(&constraint.quad.left, cs, symbols, witness); + let b = &bellperson_combination(&constraint.quad.right, cs, symbols, witness); + let c = &bellperson_combination(&constraint.lin, cs, symbols, witness); cs.enforce( || format!("Constraint {}", i), @@ -157,7 +158,7 @@ impl<'ast, T: BellpersonFieldExtensions + Field> Computation<'ast, T, Vec { step_private: Option>, - computation: Computation<'ast, T, Vec>>, + computation: Computation<'ast, T>, } -impl<'ast, T> TryFrom>>> for NovaComputation<'ast, T> { +impl<'ast, T> TryFrom> for NovaComputation<'ast, T> { type Error = Error; - fn try_from(c: Computation<'ast, T, Vec>>) -> Result { + fn try_from(c: Computation<'ast, T>) -> Result { let return_count = c.program.return_count; let public_input_count = c.program.public_count() - return_count; if public_input_count != return_count { - return Err(Error::User(format!("Number of return values must match number of public input values for Nova circuits, found `{} != {}`", c.program.return_count, c.program.arguments.len()))); + return Err(Error::User(format!("Number of return values must match number of public input values for Nova circuits, found `{} != {}`", c.program.return_count, public_input_count))); } Ok(NovaComputation { @@ -83,12 +83,13 @@ impl From for Error { } pub fn generate_public_parameters< + 'ast, T: Field + BellpersonFieldExtensions::Point as Group>::Scalar> + Cycle, >( - program: Prog, -) -> Result, Error> { + program: &'ast Prog<'ast, T>, +) -> Result, Error> { Ok(GPublicParams::setup( NovaComputation::try_from(Computation::without_witness(program))?, TrivialTestCircuit::default(), @@ -97,7 +98,7 @@ pub fn generate_public_parameters< pub fn verify( params: &PublicParams, - proof: RecursiveSNARK, + proof: &RecursiveSNARK, steps_count: usize, arguments: Vec, ) -> Result, Error> { @@ -112,14 +113,13 @@ pub fn verify( pub fn prove<'ast, T: NovaField>( public_parameters: &PublicParams<'ast, T>, - program: Prog<'ast, T>, + program: &'ast Prog<'ast, T>, arguments: Vec, steps: impl IntoIterator>, ) -> Result>, Error> { let c_primary = NovaComputation::try_from(Computation::without_witness(program))?; let c_secondary = TrivialTestCircuit::default(); let z0_primary: Vec<_> = arguments.into_iter().map(|a| a.into_bellperson()).collect(); - let z0_secondary = vec![<::Point as Group>::Base::one()]; let mut proof = None; @@ -131,7 +131,7 @@ pub fn prove<'ast, T: NovaField>( proof = Some(RecursiveSNARK::prove_step( public_parameters, proof, - c_primary.clone(), + c_primary, c_secondary.clone(), z0_primary.clone(), z0_secondary.clone(), @@ -182,8 +182,15 @@ impl<'ast, T: Field + BellpersonFieldExtensions + Cycle> StepCircuit StepCircuit, ) { let steps_count = step_privates.len(); - let params = generate_public_parameters(program.clone()).unwrap(); - let proof = prove( - ¶ms, - program.clone(), - initial_state.clone(), - step_privates, - ) - .unwrap() - .unwrap(); + let params = generate_public_parameters(&program).unwrap(); + let proof = prove(¶ms, &program, initial_state.clone(), step_privates) + .unwrap() + .unwrap(); assert_eq!( - verify(¶ms, proof, steps_count, initial_state).unwrap(), + verify(¶ms, &proof, steps_count, initial_state).unwrap(), expected_final_state ); } #[test] fn empty() { - let program: Prog = Prog { - arguments: vec![], - return_count: 0, - statements: vec![], - }; + let program: Prog = Prog::default(); test(program, vec![], vec![vec![]; 3], vec![]); } @@ -286,7 +292,13 @@ mod tests { let program: Prog = Prog { arguments: vec![Parameter::public(Variable::new(0))], return_count: 1, - statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))], + statements: vec![Statement::constraint( + Variable::new(0), + Variable::public(0), + None, + )], + module_map: Default::default(), + solvers: vec![], }; test( @@ -305,7 +317,10 @@ mod tests { statements: vec![Statement::constraint( LinComb::from(Variable::new(42)) + LinComb::one(), Variable::public(0), + None, )], + module_map: Default::default(), + solvers: vec![], }; test( @@ -328,12 +343,16 @@ mod tests { Statement::constraint( LinComb::from(Variable::new(42)) + LinComb::from(Variable::new(51)), Variable::public(0), + None, ), Statement::constraint( LinComb::from(Variable::new(51)) + LinComb::from(Variable::new(42)), Variable::public(1), + None, ), ], + module_map: Default::default(), + solvers: vec![], }; test( @@ -362,7 +381,10 @@ mod tests { statements: vec![Statement::constraint( LinComb::from(Variable::new(0)) + LinComb::from(Variable::new(1)), Variable::public(0), + None, )], + module_map: Default::default(), + solvers: vec![], }; test( @@ -398,12 +420,16 @@ mod tests { Statement::constraint( LinComb::from(Variable::new(0)) + LinComb::from(Variable::new(2)), Variable::public(0), + None, ), Statement::constraint( LinComb::from(Variable::new(1)) + LinComb::from(Variable::new(3)), Variable::public(1), + None, ), ], + module_map: Default::default(), + solvers: vec![], }; test( diff --git a/zokrates_cli/src/bin.rs b/zokrates_cli/src/bin.rs index 4280caf06..d988e8983 100644 --- a/zokrates_cli/src/bin.rs +++ b/zokrates_cli/src/bin.rs @@ -210,9 +210,15 @@ mod tests { .unwrap(); let interpreter = zokrates_interpreter::Interpreter::default(); + let prog = artifacts.prog(); let _ = interpreter - .execute(artifacts.prog(), &[Bn128Field::from(0u32)]) + .execute( + &[Bn128Field::from(0u32)], + prog.statements.into_iter(), + &prog.arguments, + &prog.solvers, + ) .unwrap(); } } @@ -250,8 +256,14 @@ mod tests { .unwrap(); let interpreter = zokrates_interpreter::Interpreter::default(); - - let res = interpreter.execute(artifacts.prog(), &[Bn128Field::from(0)]); + let prog = artifacts.prog(); + + let res = interpreter.execute( + &[Bn128Field::from(0)], + prog.statements.into_iter(), + &prog.arguments, + &prog.solvers, + ); assert!(res.is_err()); } diff --git a/zokrates_cli/src/cli_constants.rs b/zokrates_cli/src/cli_constants.rs index 01be9fcca..dcf44b804 100644 --- a/zokrates_cli/src/cli_constants.rs +++ b/zokrates_cli/src/cli_constants.rs @@ -15,6 +15,7 @@ pub const UNIVERSAL_SETUP_DEFAULT_PATH: &str = "universal_setup.dat"; pub const UNIVERSAL_SETUP_DEFAULT_SIZE: &str = "10"; pub const SMTLIB2_DEFAULT_PATH: &str = "out.smt2"; pub const MPC_DEFAULT_PATH: &str = "mpc.params"; +pub const NOVA_PARAMS_DEFAULT_PATH: &str = "nova.params"; lazy_static! { pub static ref DEFAULT_STDLIB_PATH: String = dirs::home_dir() diff --git a/zokrates_cli/src/ops/compute_witness.rs b/zokrates_cli/src/ops/compute_witness.rs index 5c660ce9e..9b05237a8 100644 --- a/zokrates_cli/src/ops/compute_witness.rs +++ b/zokrates_cli/src/ops/compute_witness.rs @@ -174,15 +174,14 @@ fn cli_compute<'a, T: Field, I: Iterator>>( .map_err(|e| format!("Could not parse argument: {}", e))?; let interpreter = zokrates_interpreter::Interpreter::default(); - let public_inputs = ir_prog.public_inputs(); - let ir_prog = ir_prog.collect(); - let witness = interpreter .execute_with_log_stream( - ir_prog.to_ref_iterator(), &arguments.encode(), + ir_prog.statements, + &ir_prog.arguments, + &ir_prog.solvers, &mut std::io::stdout(), ) .map_err(|e| format!("Execution failed: {}", e))?; diff --git a/zokrates_cli/src/ops/nova/mod.rs b/zokrates_cli/src/ops/nova/mod.rs index 8f186eb52..6bf5122ae 100644 --- a/zokrates_cli/src/ops/nova/mod.rs +++ b/zokrates_cli/src/ops/nova/mod.rs @@ -1,16 +1,21 @@ use clap::{App, AppSettings, ArgMatches, SubCommand}; pub mod prove; +pub mod setup; pub fn subcommand() -> App<'static, 'static> { SubCommand::with_name("nova") .about("Nova IVC") .setting(AppSettings::SubcommandRequiredElseHelp) - .subcommands(vec![prove::subcommand().display_order(1)]) + .subcommands(vec![ + setup::subcommand().display_order(1), + prove::subcommand().display_order(2), + ]) } pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { match sub_matches.subcommand() { + ("setup", Some(sub_matches)) => setup::exec(sub_matches), ("prove", Some(sub_matches)) => prove::exec(sub_matches), _ => unreachable!(), } diff --git a/zokrates_cli/src/ops/nova/prove.rs b/zokrates_cli/src/ops/nova/prove.rs index b0355fcce..48647873e 100644 --- a/zokrates_cli/src/ops/nova/prove.rs +++ b/zokrates_cli/src/ops/nova/prove.rs @@ -48,6 +48,16 @@ pub fn subcommand() -> App<'static, 'static> { .required(false) .default_value(cli_constants::ABI_SPEC_DEFAULT_PATH), ) + .arg( + Arg::with_name("params-path") + .short("p") + .long("params-path") + .help("Path of the nova public parameters") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(cli_constants::NOVA_PARAMS_DEFAULT_PATH), + ) .arg( Arg::with_name("proof-path") .short("j") @@ -64,7 +74,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { // read compiled program let path = Path::new(sub_matches.value_of("input").unwrap()); let file = - File::open(&path).map_err(|why| format!("Could not open `{}`: {}", path.display(), why))?; + File::open(path).map_err(|why| format!("Could not open `{}`: {}", path.display(), why))?; let mut reader = BufReader::new(file); @@ -85,11 +95,11 @@ fn cli_nova_prove_step<'ast, T: NovaField, I: Iterator { // verify the recursive SNARK println!("Verifying the final proof..."); - - let res = nova::verify(¶ms, proof.clone(), step_count, init); + let res = nova::verify(¶ms, proof, step_count, init); match res { Ok(_) => { - println!("Final proof verified succesfully"); + println!("Final proof verified successfully"); } Err(e) => { - println!("Error `{:#?}` while verifying the final proof", e); + println!("Error while verifying the final proof: {}", e); } } } diff --git a/zokrates_cli/src/ops/nova/setup.rs b/zokrates_cli/src/ops/nova/setup.rs new file mode 100644 index 000000000..87f10897b --- /dev/null +++ b/zokrates_cli/src/ops/nova/setup.rs @@ -0,0 +1,70 @@ +use crate::cli_constants::{FLATTENED_CODE_DEFAULT_PATH, NOVA_PARAMS_DEFAULT_PATH}; +use clap::{App, Arg, ArgMatches, SubCommand}; +use std::fs::File; +use std::io::BufReader; +use std::path::Path; +use zokrates_ast::ir::{self, ProgEnum}; +use zokrates_bellperson::nova::{self, NovaField}; + +pub fn subcommand() -> App<'static, 'static> { + SubCommand::with_name("setup") + .about("Performs a nova setup for a given constraint system") + .arg( + Arg::with_name("input") + .short("i") + .long("input") + .help("Path of the binary") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(FLATTENED_CODE_DEFAULT_PATH), + ) + .arg( + Arg::with_name("output") + .short("o") + .long("output") + .help("Path of the generated public parameters") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(NOVA_PARAMS_DEFAULT_PATH), + ) +} + +pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { + // read compiled program + let path = Path::new(sub_matches.value_of("input").unwrap()); + let file = + File::open(path).map_err(|why| format!("Could not open `{}`: {}", path.display(), why))?; + + let mut reader = BufReader::new(file); + + match ProgEnum::deserialize(&mut reader)? { + ProgEnum::PallasProgram(p) => cli_nova_setup(p, sub_matches), + ProgEnum::VestaProgram(p) => cli_nova_setup(p, sub_matches), + _ => Err("Nova is only supported for the following curves: [\"pallas\", \"vesta\"]".into()), + } +} + +fn cli_nova_setup<'ast, T: NovaField, I: Iterator>>( + program: ir::ProgIterator<'ast, T, I>, + sub_matches: &ArgMatches, +) -> Result<(), String> { + println!("Generating public parameters..."); + + let program = program.collect(); + let params_path = Path::new(sub_matches.value_of("output").unwrap()); + + let params_file = File::create(params_path) + .map_err(|why| format!("Could not create {}: {}", params_path.display(), why))?; + + let params = nova::generate_public_parameters(&program).map_err(|e| e.to_string())?; + + // write public parameters + serde_cbor::to_writer(params_file, ¶ms) + .map_err(|why| format!("Could not write to {}: {}", params_path.display(), why))?; + + println!("Public parameters written to '{}'", params_path.display()); + + Ok(()) +} diff --git a/zokrates_cli/src/ops/profile.rs b/zokrates_cli/src/ops/profile.rs index a866beee8..9f505531f 100644 --- a/zokrates_cli/src/ops/profile.rs +++ b/zokrates_cli/src/ops/profile.rs @@ -35,6 +35,8 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ProgEnum::Bls12_377Program(p) => cli_profile(p, sub_matches), ProgEnum::Bls12_381Program(p) => cli_profile(p, sub_matches), ProgEnum::Bw6_761Program(p) => cli_profile(p, sub_matches), + ProgEnum::PallasProgram(p) => cli_profile(p, sub_matches), + ProgEnum::VestaProgram(p) => cli_profile(p, sub_matches), } } diff --git a/zokrates_field/src/lib.rs b/zokrates_field/src/lib.rs index 53382732f..5bd69b0f9 100644 --- a/zokrates_field/src/lib.rs +++ b/zokrates_field/src/lib.rs @@ -661,8 +661,8 @@ mod prime_field { fn into_bellperson(self) -> Self::BellpersonField { use ff::PrimeField; - let s = self.to_dec_string(); - Self::BellpersonField::from_str_vartime(&s).unwrap() + let bytes = self.to_byte_vector(); + Self::BellpersonField::from_repr_vartime(bytes.try_into().unwrap()).unwrap() } } }; diff --git a/zokrates_interpreter/src/lib.rs b/zokrates_interpreter/src/lib.rs index 703e3115b..3f3a086e2 100644 --- a/zokrates_interpreter/src/lib.rs +++ b/zokrates_interpreter/src/lib.rs @@ -1,9 +1,10 @@ use serde::{Deserialize, Serialize}; +use std::borrow::Borrow; use std::collections::HashMap; use std::fmt; use zokrates_abi::{Decode, Value}; use zokrates_ast::ir::{ - LinComb, ProgRefIterator, QuadComb, RuntimeError, Solver, Statement, Variable, Witness, + LinComb, Parameter, QuadComb, RuntimeError, Solver, Statement, Variable, Witness, }; use zokrates_ast::zir::{self, Expr}; use zokrates_field::Field; @@ -26,12 +27,14 @@ impl Interpreter { } impl Interpreter { - pub fn execute<'ast, 'a, T: Field, I: IntoIterator>>( + pub fn execute<'ast, T: Field, S: Borrow>>( &self, - program: ProgRefIterator<'ast, 'a, T, I>, inputs: &[T], + statements: impl Iterator, + arguments: &[Parameter], + solvers: &[Solver<'ast, T>], ) -> ExecutionResult { - self.execute_with_log_stream(program, inputs, &mut std::io::sink()) + self.execute_with_log_stream(inputs, statements, arguments, solvers, &mut std::io::sink()) } pub fn execute_with_log_stream< @@ -39,23 +42,31 @@ impl Interpreter { 'a, W: std::io::Write, T: Field, - I: IntoIterator>, + S: Borrow>, >( &self, - program: ProgRefIterator<'ast, 'a, T, I>, inputs: &[T], + statements: impl Iterator, + arguments: &[Parameter], + solvers: &[Solver<'ast, T>], log_stream: &mut W, ) -> ExecutionResult { - self.check_inputs(&program, inputs)?; + if arguments.len() != inputs.len() { + return Err(Error::WrongInputCount { + expected: arguments.len(), + received: inputs.len(), + }); + }; + let mut witness = Witness::default(); witness.insert(Variable::one(), T::one()); - for (arg, value) in program.arguments.iter().zip(inputs.iter()) { + for (arg, value) in arguments.iter().zip(inputs.iter()) { witness.insert(arg.id, *value); } - for statement in program.statements.into_iter() { - match statement { + for statement in statements { + match statement.borrow() { Statement::Block(..) => unreachable!(), Statement::Constraint(s) => match s.lin.is_assignee(&witness) { true => { @@ -66,7 +77,9 @@ impl Interpreter { let lhs_value = evaluate_quad(&witness, &s.quad).unwrap(); let rhs_value = evaluate_lin(&witness, &s.lin).unwrap(); if lhs_value != rhs_value { - return Err(Error::UnsatisfiedConstraint { error: s.error }); + return Err(Error::UnsatisfiedConstraint { + error: s.error.clone(), + }); } } }, @@ -84,7 +97,7 @@ impl Interpreter { inputs.pop().unwrap(), )) } - _ => Self::execute_solver(&d.solver, &inputs, &program.solvers), + _ => Self::execute_solver(&d.solver, &inputs, solvers), } .map_err(Error::Solver)?; @@ -93,12 +106,12 @@ impl Interpreter { } } Statement::Log(s) => { - let mut parts = s.format_string.parts.into_iter(); + let mut parts = s.format_string.parts.iter(); write!(log_stream, "{}", parts.next().unwrap()) .map_err(|_| Error::LogStream)?; - for ((t, e), part) in s.expressions.into_iter().zip(parts) { + for ((t, e), part) in s.expressions.iter().zip(parts) { let values: Vec<_> = e .iter() .map(|e| evaluate_lin(&witness, e).unwrap()) @@ -151,21 +164,6 @@ impl Interpreter { .collect() } - fn check_inputs<'ast, 'a, T: Field, I: IntoIterator>, U>( - &self, - program: &ProgRefIterator<'ast, 'a, T, I>, - inputs: &[U], - ) -> Result<(), Error> { - if program.arguments.len() == inputs.len() { - Ok(()) - } else { - Err(Error::WrongInputCount { - expected: program.arguments.len(), - received: inputs.len(), - }) - } - } - pub fn execute_solver<'ast, T: Field>( solver: &Solver<'ast, T>, inputs: &[T], diff --git a/zokrates_js/src/lib.rs b/zokrates_js/src/lib.rs index 840299c55..b39d0169c 100644 --- a/zokrates_js/src/lib.rs +++ b/zokrates_js/src/lib.rs @@ -250,7 +250,6 @@ impl<'a> Write for LogWriter<'a> { mod internal { use super::*; use rand_0_8::{CryptoRng, RngCore}; - use zokrates_ast::ir::ProgRefIterator; pub fn compile( source: JsValue, @@ -347,19 +346,18 @@ mod internal { }; let interpreter = zokrates_interpreter::Interpreter::default(); - let public_inputs = program.public_inputs(); let mut writer = LogWriter::new(log_callback); - let program = ProgRefIterator { - arguments: program.arguments, - return_count: program.return_count, - statements: program.statements.iter(), - }; - let witness = interpreter - .execute_with_log_stream(program, &inputs.encode(), &mut writer) + .execute_with_log_stream( + &inputs.encode(), + program.statements.into_iter(), + &program.arguments, + &program.solvers, + &mut writer, + ) .map_err(|err| JsValue::from_str(&format!("Execution failed: {}", err)))?; let return_values: serde_json::Value = diff --git a/zokrates_test/src/lib.rs b/zokrates_test/src/lib.rs index 9fb5a08c1..c0cb4b589 100644 --- a/zokrates_test/src/lib.rs +++ b/zokrates_test/src/lib.rs @@ -5,7 +5,6 @@ use std::fs::File; use std::io::BufReader; use std::path::{Path, PathBuf}; -use zokrates_ast::ir::ProgRefIterator; use zokrates_ast::typed::types::GTupleType; use zokrates_ast::typed::ConcreteSignature; use zokrates_ast::typed::ConcreteType; @@ -179,13 +178,8 @@ fn compile_and_run(t: Tests) { .unwrap() }; - let bin = ProgRefIterator { - arguments: bin.arguments.clone(), - return_count: bin.return_count, - statements: bin.statements.iter(), - }; - - let output = interpreter.execute(bin, &input); + let output = + interpreter.execute(&input, bin.statements.iter(), &bin.arguments, &bin.solvers); use zokrates_abi::Decode; diff --git a/zokrates_test/tests/out_of_range.rs b/zokrates_test/tests/out_of_range.rs index ea2800252..191c0a113 100644 --- a/zokrates_test/tests/out_of_range.rs +++ b/zokrates_test/tests/out_of_range.rs @@ -38,11 +38,14 @@ fn lt_field() { .unwrap(); let interpreter = Interpreter::try_out_of_range(); + let prog = res.prog(); assert!(interpreter .execute( - res.prog(), - &[Bn128Field::from(10000), Bn128Field::from(5555)] + &[Bn128Field::from(10000), Bn128Field::from(5555)], + prog.statements.into_iter(), + &prog.arguments, + &prog.solvers ) .is_err()); } @@ -74,11 +77,14 @@ fn lt_uint() { .unwrap(); let interpreter = Interpreter::try_out_of_range(); + let prog = res.prog(); assert!(interpreter .execute( - res.prog(), - &[Bn128Field::from(10000), Bn128Field::from(5555)] + &[Bn128Field::from(10000), Bn128Field::from(5555)], + prog.statements.into_iter(), + &prog.arguments, + &prog.solvers ) .is_err()); } @@ -121,9 +127,15 @@ fn unpack256() { .unwrap(); let interpreter = Interpreter::try_out_of_range(); + let prog = res.prog(); assert!(interpreter - .execute(res.prog(), &[Bn128Field::from(0)]) + .execute( + &[Bn128Field::from(0)], + prog.statements.into_iter(), + &prog.arguments, + &prog.solvers + ) .is_err()); } @@ -165,8 +177,14 @@ fn unpack256_unchecked() { .unwrap(); let interpreter = Interpreter::try_out_of_range(); + let prog = res.prog(); assert!(interpreter - .execute(res.prog(), &[Bn128Field::from(0)]) + .execute( + &[Bn128Field::from(0)], + prog.statements.into_iter(), + &prog.arguments, + &prog.solvers + ) .is_ok()); } diff --git a/zokrates_test/tests/wasm.rs b/zokrates_test/tests/wasm.rs index 6253b39f5..b723a3966 100644 --- a/zokrates_test/tests/wasm.rs +++ b/zokrates_test/tests/wasm.rs @@ -30,7 +30,12 @@ fn generate_proof() { let interpreter = Interpreter::default(); let witness = interpreter - .execute(program.clone(), &[Bn128Field::from(42)]) + .execute( + &[Bn128Field::from(42)], + program.statements.iter(), + &program.arguments, + &program.solvers, + ) .unwrap(); let rng = &mut StdRng::from_entropy(); From 3f9ceea5124892883f2a56101f742f92417363f1 Mon Sep 17 00:00:00 2001 From: dark64 Date: Fri, 21 Apr 2023 03:04:16 +0200 Subject: [PATCH 24/30] revert deletion of zokrates_js/package-lock.json --- zokrates_js/package-lock.json | 5620 +++++++++++++++++++++++++++++++++ 1 file changed, 5620 insertions(+) create mode 100644 zokrates_js/package-lock.json diff --git a/zokrates_js/package-lock.json b/zokrates_js/package-lock.json new file mode 100644 index 000000000..42c327d7e --- /dev/null +++ b/zokrates_js/package-lock.json @@ -0,0 +1,5620 @@ +{ + "name": "zokrates-js", + "version": "1.1.5", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "zokrates-js", + "version": "1.1.5", + "license": "GPLv3", + "dependencies": { + "pako": "^2.1.0" + }, + "devDependencies": { + "@babel/core": "^7.20.12", + "@babel/preset-env": "^7.20.2", + "acorn": "^8.8.1", + "astring": "^1.8.4", + "babelify": "^10.0.0", + "browserify": "^17.0.0", + "dree": "^3.4.3", + "mocha": "^9.2.0", + "puppeteer": "^19.6.0", + "rimraf": "^3.0.2", + "snarkjs": "^0.4.25", + "uglify-js": "^3.17.4", + "wasm-pack": "^0.10.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", + "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.2.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", + "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", + "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", + "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", + "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz", + "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", + "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", + "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", + "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", + "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@iden3/bigarray": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz", + "integrity": "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==", + "dev": true + }, + "node_modules/@iden3/binfileutils": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.11.tgz", + "integrity": "sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA==", + "dev": true, + "dependencies": { + "fastfile": "0.0.20", + "ffjavascript": "^0.2.48" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@types/node": { + "version": "18.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.19.tgz", + "integrity": "sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==", + "dev": true, + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/astring": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.4.tgz", + "integrity": "sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw==", + "dev": true, + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async": { + "version": "3.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/b4a": { + "version": "1.5.3", + "dev": true, + "license": "ISC" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babelify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", + "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-install": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^0.21.1", + "rimraf": "^3.0.2", + "tar": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "dependencies": { + "resolve": "^1.17.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "dev": true, + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserify-zlib/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001450", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", + "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==", + "dev": true + }, + "node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/circom_runtime": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.18.tgz", + "integrity": "sha512-j6k+Jg1DXCYFVgjDRbJDmkAJ9E17js8h1iR7F1UX0IUr5v8NXeOXkfRh9+/73JqSgXb3Eo166a4JHdA/CeoEeA==", + "dev": true, + "dependencies": { + "ffjavascript": "0.2.55" + }, + "bin": { + "calcwit": "calcwit.js" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "dev": true, + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/combine-source-map/node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.27.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", + "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "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==", + "dev": true, + "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/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "dependencies": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1082910", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1082910.tgz", + "integrity": "sha512-RqoZ2GmqaNxyx+99L/RemY5CkwG9D0WEfOKxekwCRXOGrDCep62ngezEJUVMq6rISYQ+085fJnWDQqGHlxVNww==", + "dev": true + }, + "node_modules/diff": { + "version": "5.0.0", + "dev": true, + "license": "BSD-3-Clause", + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/dree": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/dree/-/dree-3.4.4.tgz", + "integrity": "sha512-ROIFLrbCcgp/KcSp2O9ggl4RzCCeyzV9RtlYDpPU4BWUAGUkYcSbzSosaD855WAita45EOaKHiQIc6Oujkprsw==", + "dev": true, + "dependencies": { + "yargs": "^17.6.2" + }, + "bin": { + "dree": "bundled/bin/index.js" + } + }, + "node_modules/dree/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dree/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dree/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ejs": { + "version": "3.1.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz", + "integrity": "sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fastfile": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz", + "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==", + "dev": true + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/ffjavascript": { + "version": "0.2.55", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz", + "integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.48", + "wasmbuilder": "^0.0.12", + "wasmcurves": "0.1.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.7", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "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==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "dev": true, + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "dev": true, + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jake": { + "version": "10.8.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logplease": { + "version": "1.2.15", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mocha": { + "version": "9.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.2.0", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/anymatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mocha/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/fsevents": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mocha/node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/mocha/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "dev": true, + "dependencies": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "dev": true, + "dependencies": { + "path-platform": "~0.11.15" + } + }, + "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==", + "dev": true, + "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/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "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/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/puppeteer": { + "version": "19.6.3", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.6.3.tgz", + "integrity": "sha512-K03xTtGDwS6cBXX/EoqoZxglCUKcX2SLIl92fMnGMRjYpPGXoAV2yKEh3QXmXzKqfZXd8TxjjFww+tEttWv8kw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "cosmiconfig": "8.0.0", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "puppeteer-core": "19.6.3" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/puppeteer-core": { + "version": "19.6.3", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.6.3.tgz", + "integrity": "sha512-8MbhioSlkDaHkmolpQf9Z7ui7jplFfOFTnN8d5kPsCazRRTNIH6/bVxPskn0v5Gh9oqOBlknw0eHH0/OBQAxpQ==", + "dev": true, + "dependencies": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1082910", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.11.0" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/r1csfile": { + "version": "0.0.40", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.40.tgz", + "integrity": "sha512-3tKaFLncf42ZTRpPMlgyiFBdk6kir4S4O3X+u4UQjgLYoDPHfizazNbK0Jzj++PVIXVUFAqugSbIo4W3UDuHcQ==", + "dev": true, + "dependencies": { + "@iden3/bigarray": "0.0.2", + "@iden3/binfileutils": "0.0.11", + "fastfile": "0.0.20", + "ffjavascript": "0.2.55" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "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/readable-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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dev": true, + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/shell-quote": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/snarkjs": { + "version": "0.4.25", + "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.4.25.tgz", + "integrity": "sha512-20manpB7xCd5gkfkioD6GaAR7tgJmN7xQQislJcPV3Xs2Vkf+1Dz6V+LKRwlc/rU/vT/EopUBm5apqvTOKidbQ==", + "dev": true, + "dependencies": { + "@iden3/binfileutils": "0.0.11", + "bfj": "^7.0.2", + "blake2b-wasm": "^2.4.0", + "circom_runtime": "0.1.18", + "ejs": "^3.1.6", + "fastfile": "0.0.20", + "ffjavascript": "0.2.55", + "js-sha3": "^0.8.0", + "logplease": "^1.2.15", + "r1csfile": "0.0.40" + }, + "bin": { + "snarkjs": "build/cli.cjs" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-color/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "dev": true, + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true, + "bin": { + "umd": "bin/cli.js" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "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==", + "dev": true + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/wasm-pack": { + "version": "0.10.2", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "binary-install": "^0.1.0" + }, + "bin": { + "wasm-pack": "run.js" + } + }, + "node_modules/wasmbuilder": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz", + "integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.48" + } + }, + "node_modules/wasmcurves": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz", + "integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.42", + "blakejs": "^1.1.0" + } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.6", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} \ No newline at end of file From 66a69d70face1122821d4a223ee9656fdb0e0a7f Mon Sep 17 00:00:00 2001 From: dark64 Date: Fri, 21 Apr 2023 03:08:21 +0200 Subject: [PATCH 25/30] fix format --- zokrates_js/package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zokrates_js/package-lock.json b/zokrates_js/package-lock.json index 42c327d7e..4c3f24745 100644 --- a/zokrates_js/package-lock.json +++ b/zokrates_js/package-lock.json @@ -5617,4 +5617,4 @@ } } } -} \ No newline at end of file +} From 81bae8b0bd3973253c03e84557c828b052c2d3e8 Mon Sep 17 00:00:00 2001 From: dark64 Date: Fri, 21 Apr 2023 03:27:44 +0200 Subject: [PATCH 26/30] cleanup --- .circleci/config.yml | 1 + zokrates_ast/src/ir/mod.rs | 5 ++--- zokrates_cli/src/ops/nova/prove.rs | 2 +- zokrates_cli/src/ops/nova/setup.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c45c15070..08cdc0a63 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -22,6 +22,7 @@ jobs: - restore-sccache-cache - run: name: Build + no_output_timeout: "30m" command: RUSTFLAGS="-D warnings" ./build.sh - save-sccache-cache test: diff --git a/zokrates_ast/src/ir/mod.rs b/zokrates_ast/src/ir/mod.rs index 279e231f2..46c99b13f 100644 --- a/zokrates_ast/src/ir/mod.rs +++ b/zokrates_ast/src/ir/mod.rs @@ -208,10 +208,8 @@ impl<'ast, T: Field> fmt::Display for Statement<'ast, T> { } } -pub type ProgIterator<'ast, T, I> = GProgIterator<'ast, T, Statement<'ast, T>, I>; - #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -pub struct GProgIterator<'ast, T, S, I: IntoIterator> { +pub struct ProgIterator<'ast, T, I: IntoIterator>> { pub module_map: ModuleMap, pub arguments: Vec, pub return_count: usize, @@ -276,6 +274,7 @@ impl<'ast, T, I: IntoIterator>> ProgIterator<'ast, T, .map(|a| a.id) .collect() } + pub fn public_inputs_values(&self, witness: &Witness) -> Vec where T: Field, diff --git a/zokrates_cli/src/ops/nova/prove.rs b/zokrates_cli/src/ops/nova/prove.rs index 48647873e..6ffc6cb13 100644 --- a/zokrates_cli/src/ops/nova/prove.rs +++ b/zokrates_cli/src/ops/nova/prove.rs @@ -74,7 +74,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { // read compiled program let path = Path::new(sub_matches.value_of("input").unwrap()); let file = - File::open(path).map_err(|why| format!("Could not open `{}`: {}", path.display(), why))?; + File::open(path).map_err(|why| format!("Could not open {}: {}", path.display(), why))?; let mut reader = BufReader::new(file); diff --git a/zokrates_cli/src/ops/nova/setup.rs b/zokrates_cli/src/ops/nova/setup.rs index 87f10897b..9381f1bcb 100644 --- a/zokrates_cli/src/ops/nova/setup.rs +++ b/zokrates_cli/src/ops/nova/setup.rs @@ -35,7 +35,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { // read compiled program let path = Path::new(sub_matches.value_of("input").unwrap()); let file = - File::open(path).map_err(|why| format!("Could not open `{}`: {}", path.display(), why))?; + File::open(path).map_err(|why| format!("Could not open {}: {}", path.display(), why))?; let mut reader = BufReader::new(file); From 8015912eab64ebf7196df24246d88bcb69c0a252 Mon Sep 17 00:00:00 2001 From: schaeff Date: Fri, 21 Apr 2023 21:06:01 +0200 Subject: [PATCH 27/30] allow continuing an incremental computation, implement final proof compression --- Cargo.lock | 1 + zokrates_ast/src/untyped/from_ast.rs | 24 +++---- zokrates_bellperson/Cargo.toml | 1 + zokrates_bellperson/src/nova.rs | 72 ++++++++++++++------ zokrates_book/src/toolbox/experimental.md | 17 ++++- zokrates_cli/src/cli_constants.rs | 1 + zokrates_cli/src/ops/nova/compress.rs | 82 +++++++++++++++++++++++ zokrates_cli/src/ops/nova/mod.rs | 3 + zokrates_cli/src/ops/nova/prove.rs | 28 +++++--- 9 files changed, 187 insertions(+), 42 deletions(-) create mode 100644 zokrates_cli/src/ops/nova/compress.rs diff --git a/Cargo.lock b/Cargo.lock index a093c26b2..ac48107a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3727,6 +3727,7 @@ dependencies = [ "nova-snark", "pairing", "rand 0.4.6", + "serde", "typed-arena", "zokrates_ast", "zokrates_core", diff --git a/zokrates_ast/src/untyped/from_ast.rs b/zokrates_ast/src/untyped/from_ast.rs index 31ba52182..ff37ce6ba 100644 --- a/zokrates_ast/src/untyped/from_ast.rs +++ b/zokrates_ast/src/untyped/from_ast.rs @@ -1230,10 +1230,10 @@ mod tests { lhs: pest::TypedIdentifierOrAssignee::Assignee(pest::Assignee { id: pest::IdentifierExpression { value: String::from("a"), - span: span, + span, }, accesses: vec![], - span: span, + span, }), expression: pest::Expression::Literal(pest::LiteralExpression::DecimalLiteral( pest::DecimalLiteralExpression { @@ -1241,10 +1241,10 @@ mod tests { span: Span::new("1", 0, 1).unwrap(), }, suffix: None, - span: span, + span, }, )), - span: span, + span, }; let statement = untyped::StatementNode::from(definition); @@ -1261,30 +1261,30 @@ mod tests { let definition = pest::DefinitionStatement { lhs: pest::TypedIdentifierOrAssignee::TypedIdentifier(pest::TypedIdentifier { - ty: pest::Type::Basic(pest::BasicType::Field(pest::FieldType { span: span })), + ty: pest::Type::Basic(pest::BasicType::Field(pest::FieldType { span })), identifier: pest::IdentifierExpression { value: String::from("a"), - span: span, + span, }, mutable: None, - span: span, + span, }), expression: pest::Expression::Postfix(pest::PostfixExpression { base: Box::new(pest::Expression::Identifier(pest::IdentifierExpression { value: String::from("foo"), - span: span, + span, })), accesses: vec![pest::Access::Call(pest::CallAccess { explicit_generics: None, arguments: pest::Arguments { expressions: vec![], - span: span, + span, }, - span: span, + span, })], - span: span, + span, }), - span: span, + span, }; let statement = untyped::StatementNode::from(definition); diff --git a/zokrates_bellperson/Cargo.toml b/zokrates_bellperson/Cargo.toml index 690d27178..0d48ae185 100644 --- a/zokrates_bellperson/Cargo.toml +++ b/zokrates_bellperson/Cargo.toml @@ -17,6 +17,7 @@ pairing = "0.22" ff = { version = "0.12.0", default-features = false } nova-snark = { version = "0.13.0" } zokrates_interpreter = { version = "0.1", path = "../zokrates_interpreter" } +serde = { version = "1.0", features = ["derive"] } [dev-dependencies] diff --git a/zokrates_bellperson/src/nova.rs b/zokrates_bellperson/src/nova.rs index 33e4bdd4f..3a17a3ddd 100644 --- a/zokrates_bellperson/src/nova.rs +++ b/zokrates_bellperson/src/nova.rs @@ -8,8 +8,10 @@ use nova_snark::errors::NovaError; pub use nova_snark::traits::circuit::StepCircuit; pub use nova_snark::traits::circuit::TrivialTestCircuit; use nova_snark::traits::Group; +use nova_snark::CompressedSNARK as GCompressedSNARK; pub use nova_snark::PublicParams as GPublicParams; pub use nova_snark::RecursiveSNARK as GRecursiveSNARK; +use serde::{Deserialize, Serialize}; use std::fmt; use zokrates_ast::ir::*; use zokrates_field::{BellpersonFieldExtensions, Cycle, Field}; @@ -59,7 +61,7 @@ type C1<'ast, T> = NovaComputation<'ast, T>; type C2 = TrivialTestCircuit<<::Point as Group>::Base>; type PublicParams<'ast, T> = GPublicParams, G2, C1<'ast, T>, C2>; -type RecursiveSNARK<'ast, T> = GRecursiveSNARK, G2, C1<'ast, T>, C2>; +pub type RecursiveSNARK<'ast, T> = GRecursiveSNARK, G2, C1<'ast, T>, C2>; #[derive(Debug)] pub enum Error { @@ -98,44 +100,69 @@ pub fn generate_public_parameters< pub fn verify( params: &PublicParams, - proof: &RecursiveSNARK, - steps_count: usize, + proof: &RecursiveSNARKWithStepCount, arguments: Vec, ) -> Result, Error> { let z0_primary: Vec<_> = arguments.into_iter().map(|a| a.into_bellperson()).collect(); let z0_secondary = vec![<::Point as Group>::Base::one()]; proof - .verify(params, steps_count, z0_primary, z0_secondary) + .proof + .verify(params, proof.steps, z0_primary, z0_secondary) .map_err(Error::Internal) .map(|(primary, _)| primary.into_iter().map(T::from_bellperson).collect()) } +#[derive(Serialize, Debug, Deserialize)] +pub struct RecursiveSNARKWithStepCount<'ast, T: NovaField> { + #[serde(bound = "T: NovaField")] + proof: RecursiveSNARK<'ast, T>, + steps: usize, +} + +type EE1 = nova_snark::provider::ipa_pc::EvaluationEngine>; +type EE2 = nova_snark::provider::ipa_pc::EvaluationEngine>; +type S1 = nova_snark::spartan::RelaxedR1CSSNARK, EE1>; +type S2 = nova_snark::spartan::RelaxedR1CSSNARK, EE2>; + +type CompressedSNARK<'ast, T> = GCompressedSNARK, G2, C1<'ast, T>, C2, S1, S2>; + +pub fn compress<'ast, T: NovaField>( + public_parameters: &PublicParams<'ast, T>, + instance: RecursiveSNARKWithStepCount<'ast, T>, +) -> CompressedSNARK<'ast, T> { + CompressedSNARK::prove(public_parameters, &instance.proof).unwrap() +} + pub fn prove<'ast, T: NovaField>( public_parameters: &PublicParams<'ast, T>, program: &'ast Prog<'ast, T>, arguments: Vec, + mut proof: Option>, steps: impl IntoIterator>, -) -> Result>, Error> { +) -> Result>, Error> { let c_primary = NovaComputation::try_from(Computation::without_witness(program))?; let c_secondary = TrivialTestCircuit::default(); let z0_primary: Vec<_> = arguments.into_iter().map(|a| a.into_bellperson()).collect(); let z0_secondary = vec![<::Point as Group>::Base::one()]; - let mut proof = None; - for steps_private in steps { let mut c_primary = c_primary.clone(); c_primary.step_private = Some(steps_private); - proof = Some(RecursiveSNARK::prove_step( - public_parameters, - proof, - c_primary, - c_secondary.clone(), - z0_primary.clone(), - z0_secondary.clone(), - )?); + let steps = proof.as_ref().map(|proof| proof.steps).unwrap_or_default() + 1; + + proof = Some(RecursiveSNARKWithStepCount { + proof: RecursiveSNARK::prove_step( + public_parameters, + proof.map(|proof| proof.proof), + c_primary, + c_secondary.clone(), + z0_primary.clone(), + z0_secondary.clone(), + )?, + steps, + }); } Ok(proof) @@ -270,13 +297,18 @@ mod tests { step_privates: Vec>, expected_final_state: Vec, ) { - let steps_count = step_privates.len(); let params = generate_public_parameters(&program).unwrap(); - let proof = prove(¶ms, &program, initial_state.clone(), step_privates) - .unwrap() - .unwrap(); + let proof = prove( + ¶ms, + &program, + initial_state.clone(), + None, + step_privates, + ) + .unwrap() + .unwrap(); assert_eq!( - verify(¶ms, &proof, steps_count, initial_state).unwrap(), + verify(¶ms, &proof, initial_state).unwrap(), expected_final_state ); } diff --git a/zokrates_book/src/toolbox/experimental.md b/zokrates_book/src/toolbox/experimental.md index 57f5c6c5f..0f348e7a7 100644 --- a/zokrates_book/src/toolbox/experimental.md +++ b/zokrates_book/src/toolbox/experimental.md @@ -38,8 +38,21 @@ zokrates nova prove The proof created at `proof.json` proves the statement `0 + 1 + 7 + 42 == 50`. +We can extend it by running more steps, for example with the same intermediate inputs: + +``` +zokrates nova prove --continue +``` + +The proof updated at `proof.json` proves the statement `50 + (0 + 1 + 7 + 42) == 100`. + +Once we're done, we compress the proof to a compressed snark: + +``` +zokrates nova compress +``` + ### Limitations - The step circuit must be compiled with `--curve pallas` -- The resulting recursive proof cannot currently be verified on the EVM -- The public parameters are currently computed for each proof \ No newline at end of file +- The resulting recursive proof cannot currently be verified on the EVM \ No newline at end of file diff --git a/zokrates_cli/src/cli_constants.rs b/zokrates_cli/src/cli_constants.rs index dcf44b804..8e825c5b1 100644 --- a/zokrates_cli/src/cli_constants.rs +++ b/zokrates_cli/src/cli_constants.rs @@ -3,6 +3,7 @@ use zokrates_common::constants::*; pub const FLATTENED_CODE_DEFAULT_PATH: &str = "out"; pub const NOVA_STEPS_PRIVATE_INPUTS: &str = "steps.json"; pub const NOVA_PUBLIC_INIT: &str = "init.json"; +pub const JSON_NOVA_RUNNING_INSTANCE: &str = "running_instance.json"; pub const CIRCOM_R1CS_DEFAULT_PATH: &str = "out.r1cs"; pub const CIRCOM_WITNESS_DEFAULT_PATH: &str = "out.wtns"; pub const ABI_SPEC_DEFAULT_PATH: &str = "abi.json"; diff --git a/zokrates_cli/src/ops/nova/compress.rs b/zokrates_cli/src/ops/nova/compress.rs new file mode 100644 index 000000000..c65983a37 --- /dev/null +++ b/zokrates_cli/src/ops/nova/compress.rs @@ -0,0 +1,82 @@ +use crate::cli_constants::{self, JSON_NOVA_RUNNING_INSTANCE}; +use clap::{App, Arg, ArgMatches, SubCommand}; + +use zokrates_field::PallasField; + +use std::io::BufReader; +use std::path::Path; +use std::{fs::File, io::Write}; + +use zokrates_bellperson::nova::{self, NovaField, RecursiveSNARKWithStepCount}; + +pub fn subcommand() -> App<'static, 'static> { + SubCommand::with_name("compress") + .about("Compresses an instance to a Spartan SNARK") + .arg( + Arg::with_name("input") + .long("i") + .help("Path to the running instance") + .takes_value(true) + .default_value(JSON_NOVA_RUNNING_INSTANCE), + ) + .arg( + Arg::with_name("params-path") + .short("p") + .long("params-path") + .help("Path of the nova public parameters") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(cli_constants::NOVA_PARAMS_DEFAULT_PATH), + ) + .arg( + Arg::with_name("proof-path") + .short("j") + .long("proof-path") + .help("Path of the JSON proof file") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(cli_constants::JSON_PROOF_PATH), + ) +} + +pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { + let path = Path::new(sub_matches.value_of("input").unwrap()); + let file = + File::open(path).map_err(|why| format!("Could not open {}: {}", path.display(), why))?; + + let reader = BufReader::new(file); + let instance: RecursiveSNARKWithStepCount = + serde_json::from_reader(reader).unwrap(); + + cli_nova_compress::(instance, sub_matches) +} + +fn cli_nova_compress( + instance: RecursiveSNARKWithStepCount, + sub_matches: &ArgMatches, +) -> Result<(), String> { + let params_path = Path::new(sub_matches.value_of("params-path").unwrap()); + let params_file = File::open(params_path) + .map_err(|why| format!("Could not open {}: {}", params_path.display(), why))?; + + let params_reader = BufReader::new(params_file); + let params = serde_cbor::from_reader(params_reader) + .map_err(|why| format!("Could not deserialize {}: {}", params_path.display(), why))?; + + let proof_path = Path::new(sub_matches.value_of("proof-path").unwrap()); + + let proof = nova::compress(¶ms, instance); + + let proof_json = serde_json::to_string_pretty(&proof).unwrap(); + + let mut proof_file = File::create(proof_path) + .map_err(|why| format!("Could not create {}: {}", proof_path.display(), why))?; + + proof_file + .write(proof_json.as_bytes()) + .map_err(|why| format!("Could not write to {}: {}", proof_path.display(), why))?; + + Ok(()) +} diff --git a/zokrates_cli/src/ops/nova/mod.rs b/zokrates_cli/src/ops/nova/mod.rs index 6bf5122ae..51554086e 100644 --- a/zokrates_cli/src/ops/nova/mod.rs +++ b/zokrates_cli/src/ops/nova/mod.rs @@ -1,5 +1,6 @@ use clap::{App, AppSettings, ArgMatches, SubCommand}; +pub mod compress; pub mod prove; pub mod setup; @@ -10,6 +11,7 @@ pub fn subcommand() -> App<'static, 'static> { .subcommands(vec![ setup::subcommand().display_order(1), prove::subcommand().display_order(2), + compress::subcommand().display_order(3), ]) } @@ -17,6 +19,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { match sub_matches.subcommand() { ("setup", Some(sub_matches)) => setup::exec(sub_matches), ("prove", Some(sub_matches)) => prove::exec(sub_matches), + ("compress", Some(sub_matches)) => compress::exec(sub_matches), _ => unreachable!(), } } diff --git a/zokrates_cli/src/ops/nova/prove.rs b/zokrates_cli/src/ops/nova/prove.rs index 6ffc6cb13..78739e614 100644 --- a/zokrates_cli/src/ops/nova/prove.rs +++ b/zokrates_cli/src/ops/nova/prove.rs @@ -21,6 +21,14 @@ pub fn subcommand() -> App<'static, 'static> { .takes_value(true) .default_value(NOVA_PUBLIC_INIT), ) + .arg( + Arg::with_name("continue") + .short("c") + .long("continue") + .help("Start from an existing proof") + .takes_value(false) + .required(false), + ) .arg( Arg::with_name("steps") .long("steps") @@ -59,14 +67,14 @@ pub fn subcommand() -> App<'static, 'static> { .default_value(cli_constants::NOVA_PARAMS_DEFAULT_PATH), ) .arg( - Arg::with_name("proof-path") + Arg::with_name("instance-path") .short("j") - .long("proof-path") - .help("Path of the JSON proof file") + .long("instance-path") + .help("Path of the JSON running instance file") .value_name("FILE") .takes_value(true) .required(false) - .default_value(cli_constants::JSON_PROOF_PATH), + .default_value(cli_constants::JSON_NOVA_RUNNING_INSTANCE), ) } @@ -89,7 +97,7 @@ fn cli_nova_prove_step<'ast, T: NovaField, I: Iterator, sub_matches: &ArgMatches, ) -> Result<(), String> { - let proof_path = Path::new(sub_matches.value_of("proof-path").unwrap()); + let proof_path = Path::new(sub_matches.value_of("instance-path").unwrap()); let program = program.collect(); @@ -140,7 +148,10 @@ fn cli_nova_prove_step<'ast, T: NovaField, I: Iterator { // verify the recursive SNARK println!("Verifying the final proof..."); - let res = nova::verify(¶ms, proof, step_count, init); + let res = nova::verify(¶ms, proof, init); match res { Ok(_) => { From 46685b1076cd03da8ceddd2da563f5a1b143cc48 Mon Sep 17 00:00:00 2001 From: schaeff Date: Fri, 21 Apr 2023 22:38:23 +0200 Subject: [PATCH 28/30] add compressed proof verification, upgrade nova to latest --- .gitignore | 1 + Cargo.lock | 25 +---- zokrates_bellperson/Cargo.toml | 2 +- zokrates_bellperson/examples/10_cubes.rs | 7 +- zokrates_bellperson/src/nova.rs | 32 +++++- zokrates_book/src/toolbox/experimental.md | 6 ++ zokrates_cli/src/ops/nova/compress.rs | 40 ++++++- zokrates_cli/src/ops/nova/mod.rs | 3 + zokrates_cli/src/ops/nova/prove.rs | 10 +- zokrates_cli/src/ops/nova/verify.rs | 125 ++++++++++++++++++++++ zokrates_field/Cargo.toml | 2 +- zokrates_field/src/lib.rs | 6 +- 12 files changed, 225 insertions(+), 34 deletions(-) create mode 100644 zokrates_cli/src/ops/nova/verify.rs diff --git a/.gitignore b/.gitignore index 7228ce2e4..81e430487 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ universal_setup.dat witness witness.json nova.params +running_instance.json # ZoKrates source files at the root of the repository /*.zok diff --git a/Cargo.lock b/Cargo.lock index ac48107a0..c9fbc1b1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1946,18 +1946,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.6.4", - "zeroize", -] - [[package]] name = "miniz_oxide" version = "0.6.2" @@ -1995,9 +1983,9 @@ checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "nova-snark" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77651083c7aecec78b063779fe6271f5f6cf98252f4b584f7f58010dbca7c0ca" +checksum = "b09c8cf02c93500dee9244cd73547f20d133ca6d3fbbe9eae0205e5b2db05f36" dependencies = [ "bellperson", "bincode 1.3.3", @@ -2010,13 +1998,12 @@ dependencies = [ "generic-array 0.14.7", "itertools 0.9.0", "lurk-pasta-msm", - "merlin", "neptune", "num-bigint 0.4.3", "num-integer", "num-traits 0.2.15", "rand_chacha", - "rand_core 0.5.1", + "rand_core 0.6.4", "rayon", "serde", "sha3 0.8.2", @@ -2481,12 +2468,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" - [[package]] name = "rand_core" version = "0.6.4" diff --git a/zokrates_bellperson/Cargo.toml b/zokrates_bellperson/Cargo.toml index 0d48ae185..126017071 100644 --- a/zokrates_bellperson/Cargo.toml +++ b/zokrates_bellperson/Cargo.toml @@ -15,7 +15,7 @@ getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] } hex = "0.4.2" pairing = "0.22" ff = { version = "0.12.0", default-features = false } -nova-snark = { version = "0.13.0" } +nova-snark = { version = "0.20.3" } zokrates_interpreter = { version = "0.1", path = "../zokrates_interpreter" } serde = { version = "1.0", features = ["derive"] } diff --git a/zokrates_bellperson/examples/10_cubes.rs b/zokrates_bellperson/examples/10_cubes.rs index 864df6a0f..b817dff53 100644 --- a/zokrates_bellperson/examples/10_cubes.rs +++ b/zokrates_bellperson/examples/10_cubes.rs @@ -100,7 +100,10 @@ fn main() { type EE2 = nova_snark::provider::ipa_pc::EvaluationEngine; type S1 = nova_snark::spartan::RelaxedR1CSSNARK; type S2 = nova_snark::spartan::RelaxedR1CSSNARK; - let res = CompressedSNARK::<_, _, _, _, S1, S2>::prove(&pp, &recursive_snark); + + let (pk, vk) = CompressedSNARK::<_, _, _, _, S1, S2>::setup(&pp).unwrap(); + + let res = CompressedSNARK::<_, _, _, _, S1, S2>::prove(&pp, &pk, &recursive_snark); println!( "CompressedSNARK::prove: {:?}, took {:?}", res.is_ok(), @@ -112,7 +115,7 @@ fn main() { // verify the compressed SNARK println!("Verifying a CompressedSNARK..."); let start = Instant::now(); - let res = compressed_snark.verify(&pp, num_steps, z0_primary, z0_secondary); + let res = compressed_snark.verify(&vk, num_steps, z0_primary, z0_secondary); println!( "CompressedSNARK::verify: {:?}, took {:?}", res.is_ok(), diff --git a/zokrates_bellperson/src/nova.rs b/zokrates_bellperson/src/nova.rs index 3a17a3ddd..ad7f51e31 100644 --- a/zokrates_bellperson/src/nova.rs +++ b/zokrates_bellperson/src/nova.rs @@ -11,6 +11,7 @@ use nova_snark::traits::Group; use nova_snark::CompressedSNARK as GCompressedSNARK; pub use nova_snark::PublicParams as GPublicParams; pub use nova_snark::RecursiveSNARK as GRecursiveSNARK; +use nova_snark::VerifierKey as GVerifierKey; use serde::{Deserialize, Serialize}; use std::fmt; use zokrates_ast::ir::*; @@ -116,8 +117,8 @@ pub fn verify( #[derive(Serialize, Debug, Deserialize)] pub struct RecursiveSNARKWithStepCount<'ast, T: NovaField> { #[serde(bound = "T: NovaField")] - proof: RecursiveSNARK<'ast, T>, - steps: usize, + pub proof: RecursiveSNARK<'ast, T>, + pub steps: usize, } type EE1 = nova_snark::provider::ipa_pc::EvaluationEngine>; @@ -125,13 +126,34 @@ type EE2 = nova_snark::provider::ipa_pc::EvaluationEngine>; type S1 = nova_snark::spartan::RelaxedR1CSSNARK, EE1>; type S2 = nova_snark::spartan::RelaxedR1CSSNARK, EE2>; -type CompressedSNARK<'ast, T> = GCompressedSNARK, G2, C1<'ast, T>, C2, S1, S2>; +pub type CompressedSNARK<'ast, T> = + GCompressedSNARK, G2, C1<'ast, T>, C2, S1, S2>; +pub type VerifierKey<'ast, T> = GVerifierKey, G2, C1<'ast, T>, C2, S1, S2>; pub fn compress<'ast, T: NovaField>( public_parameters: &PublicParams<'ast, T>, instance: RecursiveSNARKWithStepCount<'ast, T>, -) -> CompressedSNARK<'ast, T> { - CompressedSNARK::prove(public_parameters, &instance.proof).unwrap() +) -> (CompressedSNARK<'ast, T>, VerifierKey<'ast, T>) { + let (pk, vk) = CompressedSNARK::<'ast, T>::setup(public_parameters).unwrap(); + + ( + CompressedSNARK::prove(public_parameters, &pk, &instance.proof).unwrap(), + vk, + ) +} + +pub fn verify_compressed<'ast, T: NovaField>( + proof: &CompressedSNARK<'ast, T>, + vk: &VerifierKey<'ast, T>, + arguments: Vec, + step_count: usize, +) -> bool { + let z0_primary: Vec<_> = arguments.into_iter().map(|a| a.into_bellperson()).collect(); + let z0_secondary = vec![<::Point as Group>::Base::one()]; + + proof + .verify(vk, step_count, z0_primary, z0_secondary) + .is_ok() } pub fn prove<'ast, T: NovaField>( diff --git a/zokrates_book/src/toolbox/experimental.md b/zokrates_book/src/toolbox/experimental.md index 0f348e7a7..953830ba1 100644 --- a/zokrates_book/src/toolbox/experimental.md +++ b/zokrates_book/src/toolbox/experimental.md @@ -52,6 +52,12 @@ Once we're done, we compress the proof to a compressed snark: zokrates nova compress ``` +Finally, we can verify this proof + +``` +zokrates nova verify +``` + ### Limitations - The step circuit must be compiled with `--curve pallas` diff --git a/zokrates_cli/src/ops/nova/compress.rs b/zokrates_cli/src/ops/nova/compress.rs index c65983a37..1adc722eb 100644 --- a/zokrates_cli/src/ops/nova/compress.rs +++ b/zokrates_cli/src/ops/nova/compress.rs @@ -39,6 +39,16 @@ pub fn subcommand() -> App<'static, 'static> { .required(false) .default_value(cli_constants::JSON_PROOF_PATH), ) + .arg( + Arg::with_name("verification-key-path") + .short("v") + .long("verification-key-path") + .help("Path of the generated verification key file") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(cli_constants::VERIFICATION_KEY_DEFAULT_PATH), + ) } pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { @@ -66,8 +76,9 @@ fn cli_nova_compress( .map_err(|why| format!("Could not deserialize {}: {}", params_path.display(), why))?; let proof_path = Path::new(sub_matches.value_of("proof-path").unwrap()); + let verification_key_path = Path::new(sub_matches.value_of("verification-key-path").unwrap()); - let proof = nova::compress(¶ms, instance); + let (proof, vk) = nova::compress(¶ms, instance); let proof_json = serde_json::to_string_pretty(&proof).unwrap(); @@ -78,5 +89,32 @@ fn cli_nova_compress( .write(proof_json.as_bytes()) .map_err(|why| format!("Could not write to {}: {}", proof_path.display(), why))?; + println!("Compressed SNARK written to '{}'", proof_path.display()); + + let verification_key_json = serde_json::to_string_pretty(&vk).unwrap(); + + let mut verification_key_file = File::create(verification_key_path).map_err(|why| { + format!( + "Could not create {}: {}", + verification_key_path.display(), + why + ) + })?; + + verification_key_file + .write(verification_key_json.as_bytes()) + .map_err(|why| { + format!( + "Could not write to {}: {}", + verification_key_path.display(), + why + ) + })?; + + println!( + "Verification key written to '{}'", + verification_key_path.display() + ); + Ok(()) } diff --git a/zokrates_cli/src/ops/nova/mod.rs b/zokrates_cli/src/ops/nova/mod.rs index 51554086e..3432fa561 100644 --- a/zokrates_cli/src/ops/nova/mod.rs +++ b/zokrates_cli/src/ops/nova/mod.rs @@ -3,6 +3,7 @@ use clap::{App, AppSettings, ArgMatches, SubCommand}; pub mod compress; pub mod prove; pub mod setup; +pub mod verify; pub fn subcommand() -> App<'static, 'static> { SubCommand::with_name("nova") @@ -12,6 +13,7 @@ pub fn subcommand() -> App<'static, 'static> { setup::subcommand().display_order(1), prove::subcommand().display_order(2), compress::subcommand().display_order(3), + verify::subcommand().display_order(4), ]) } @@ -20,6 +22,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ("setup", Some(sub_matches)) => setup::exec(sub_matches), ("prove", Some(sub_matches)) => prove::exec(sub_matches), ("compress", Some(sub_matches)) => compress::exec(sub_matches), + ("verify", Some(sub_matches)) => verify::exec(sub_matches), _ => unreachable!(), } } diff --git a/zokrates_cli/src/ops/nova/prove.rs b/zokrates_cli/src/ops/nova/prove.rs index 78739e614..2ab33d65a 100644 --- a/zokrates_cli/src/ops/nova/prove.rs +++ b/zokrates_cli/src/ops/nova/prove.rs @@ -13,7 +13,7 @@ use zokrates_bellperson::nova::{self, NovaField}; pub fn subcommand() -> App<'static, 'static> { SubCommand::with_name("prove") - .about("Proves a many steps of an incremental computation") + .about("Proves many steps of an incremental computation") .arg( Arg::with_name("init") .long("init") @@ -99,7 +99,9 @@ fn cli_nova_prove_step<'ast, T: NovaField, I: Iterator Result<(), String> { let proof_path = Path::new(sub_matches.value_of("instance-path").unwrap()); + println!("Reading step program..."); let program = program.collect(); + println!("Done"); let path = Path::new(sub_matches.value_of("abi-spec").unwrap()); let file = @@ -153,6 +155,8 @@ fn cli_nova_prove_step<'ast, T: NovaField, I: Iterator App<'static, 'static> { + SubCommand::with_name("verify") + .about("Verifies a Nova compressed proof") + .arg( + Arg::with_name("init") + .long("init") + .help("Path to the initial value of the public input") + .takes_value(true) + .default_value(NOVA_PUBLIC_INIT), + ) + .arg( + Arg::with_name("proof-path") + .short("j") + .long("proof-path") + .help("Path of the JSON compressed proof path") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(cli_constants::JSON_PROOF_PATH), + ) + .arg( + Arg::with_name("verification-key-path") + .short("v") + .long("verification-key-path") + .help("Path of the generated verification key file") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(cli_constants::VERIFICATION_KEY_DEFAULT_PATH), + ) + .arg( + Arg::with_name("instance-path") + .long("instance-path") + .help("Path of the JSON running instance file") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(cli_constants::JSON_NOVA_RUNNING_INSTANCE), + ) + .arg( + Arg::with_name("abi-spec") + .short("s") + .long("abi-spec") + .help("Path of the ABI specification") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(cli_constants::ABI_SPEC_DEFAULT_PATH), + ) +} + +pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { + let proof_path = sub_matches.value_of("proof-path").unwrap(); + + let proof_file = + File::open(proof_path).map_err(|why| format!("Could not open {}: {}", proof_path, why))?; + + let proof_reader = BufReader::new(proof_file); + + let verification_key_path = sub_matches.value_of("verification-key-path").unwrap(); + + let verification_key_file = File::open(verification_key_path) + .map_err(|why| format!("Could not open {}: {}", verification_key_path, why))?; + + let verification_key_reader = BufReader::new(verification_key_file); + + let proof: CompressedSNARK = serde_json::from_reader(proof_reader).unwrap(); + let vk: VerifierKey = serde_json::from_reader(verification_key_reader).unwrap(); + + cli_nova_verify(proof, vk, sub_matches) +} + +fn cli_nova_verify<'ast, T: NovaField>( + proof: CompressedSNARK<'ast, T>, + vk: VerifierKey<'ast, T>, + sub_matches: &ArgMatches, +) -> Result<(), String> { + let path = Path::new(sub_matches.value_of("abi-spec").unwrap()); + let file = + File::open(path).map_err(|why| format!("Could not open {}: {}", path.display(), why))?; + + let mut reader = BufReader::new(file); + + let abi: Abi = from_reader(&mut reader).map_err(|why| why.to_string())?; + let signature = abi.signature(); + + let init_type = signature.inputs[0].clone(); + + let init = { + let path = Path::new(sub_matches.value_of("init").unwrap()); + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); + + parse_value(serde_json::from_reader(reader).unwrap(), init_type) + .unwrap() + .encode() + }; + + let instance_path = Path::new(sub_matches.value_of("instance-path").unwrap()); + let instance: RecursiveSNARKWithStepCount<'ast, T> = + serde_json::from_reader(BufReader::new(File::open(instance_path).unwrap())).unwrap(); + let steps = instance.steps; + + if nova::verify_compressed(&proof, &vk, init, steps) { + println!("Compressed proof succesfully verified"); + } else { + eprintln!("Compressed proof verification failed"); + } + + Ok(()) +} diff --git a/zokrates_field/Cargo.toml b/zokrates_field/Cargo.toml index 3c7db37b4..a0c3f4e54 100644 --- a/zokrates_field/Cargo.toml +++ b/zokrates_field/Cargo.toml @@ -28,7 +28,7 @@ bellperson = { version = "0.24", default-features = false, optional = true } pairing = { version = "0.22", default-features = false, optional = true } ff = { version = "0.12.0", default-features = false, optional = true } pasta_curves = { version = "0.5.2", features = ["repr-c", "serde"], package = "fil_pasta_curves", optional = true } -nova-snark = { version = "0.13.0", optional = true } +nova-snark = { version = "0.20.3", optional = true } # ark ark-ff = { version = "^0.3.0", default-features = false } diff --git a/zokrates_field/src/lib.rs b/zokrates_field/src/lib.rs index 5bd69b0f9..a0b2def23 100644 --- a/zokrates_field/src/lib.rs +++ b/zokrates_field/src/lib.rs @@ -6,6 +6,7 @@ #[cfg(feature = "bellman_extensions")] use bellman_ce::pairing::{ff::ScalarEngine, Engine}; +use nova_snark::provider::pedersen::CommitmentEngine; use num_bigint::BigUint; use num_traits::{CheckedDiv, One, Zero}; use serde::{Deserialize, Serialize}; @@ -27,7 +28,10 @@ pub trait Pow { #[cfg(feature = "bellperson_extensions")] pub trait Cycle { type Other: Field + BellpersonFieldExtensions + Cycle; - type Point: Group::Point as Group>::Scalar>; + type Point: Group< + Base = <::Point as Group>::Scalar, + CE = CommitmentEngine, + >; } #[cfg(feature = "bellman_extensions")] From d126707e6dd57e8e622210d34c3cb10bb0859fb2 Mon Sep 17 00:00:00 2001 From: schaeff Date: Fri, 21 Apr 2023 23:26:22 +0200 Subject: [PATCH 29/30] fix js --- zokrates_field/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/zokrates_field/src/lib.rs b/zokrates_field/src/lib.rs index a0b2def23..3308f86cf 100644 --- a/zokrates_field/src/lib.rs +++ b/zokrates_field/src/lib.rs @@ -6,6 +6,7 @@ #[cfg(feature = "bellman_extensions")] use bellman_ce::pairing::{ff::ScalarEngine, Engine}; +#[cfg(feature = "bellperson_extensions")] use nova_snark::provider::pedersen::CommitmentEngine; use num_bigint::BigUint; use num_traits::{CheckedDiv, One, Zero}; From b7d1468cac5624c4b6dbfa482c4b2d21e04da66a Mon Sep 17 00:00:00 2001 From: dark64 Date: Sat, 22 Apr 2023 00:08:48 +0200 Subject: [PATCH 30/30] update changelog, bump versions --- CHANGELOG.md | 9 ++++++++ Cargo.lock | 34 +++++++++++++++--------------- changelogs/unreleased/1235-schaeff | 1 - changelogs/unreleased/1296-schaeff | 1 - zokrates_abi/Cargo.toml | 2 +- zokrates_analysis/Cargo.toml | 2 +- zokrates_ark/Cargo.toml | 2 +- zokrates_ast/Cargo.toml | 2 +- zokrates_bellman/Cargo.toml | 2 +- zokrates_circom/Cargo.toml | 2 +- zokrates_cli/Cargo.toml | 2 +- zokrates_codegen/Cargo.toml | 2 +- zokrates_common/Cargo.toml | 2 +- zokrates_core/Cargo.toml | 2 +- zokrates_field/Cargo.toml | 2 +- zokrates_interpreter/Cargo.toml | 2 +- zokrates_js/Cargo.toml | 2 +- zokrates_js/package.json | 2 +- zokrates_parser/Cargo.toml | 2 +- zokrates_pest_ast/Cargo.toml | 2 +- zokrates_proof_systems/Cargo.toml | 2 +- zokrates_test/Cargo.toml | 2 +- 22 files changed, 44 insertions(+), 37 deletions(-) delete mode 100644 changelogs/unreleased/1235-schaeff delete mode 100644 changelogs/unreleased/1296-schaeff diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c24b138c..0fffeb93f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file. ## [Unreleased] https://github.com/Zokrates/ZoKrates/compare/latest...develop +## [0.8.7] - 2023-04-22 + +### Release +- https://github.com/Zokrates/ZoKrates/releases/tag/0.8.7 + +### Changes +- Reduce memory usage of compilation (#1296, @schaeff) +- Add initial support for the Nova proving scheme (#1235, @schaeff) + ## [0.8.6] - 2023-04-13 ### Release diff --git a/Cargo.lock b/Cargo.lock index 17c52f600..ec284223e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "zokrates_abi" -version = "0.1.8" +version = "0.1.9" dependencies = [ "serde", "serde_derive", @@ -3585,7 +3585,7 @@ dependencies = [ [[package]] name = "zokrates_analysis" -version = "0.1.2" +version = "0.1.3" dependencies = [ "cfg-if 0.1.10", "lazy_static", @@ -3604,7 +3604,7 @@ dependencies = [ [[package]] name = "zokrates_ark" -version = "0.1.3" +version = "0.1.4" dependencies = [ "ark-bls12-377", "ark-bn254", @@ -3631,7 +3631,7 @@ dependencies = [ [[package]] name = "zokrates_ast" -version = "0.1.6" +version = "0.1.7" dependencies = [ "ark-bls12-377", "byteorder", @@ -3649,7 +3649,7 @@ dependencies = [ [[package]] name = "zokrates_bellman" -version = "0.1.2" +version = "0.1.3" dependencies = [ "bellman_ce", "getrandom", @@ -3686,7 +3686,7 @@ dependencies = [ [[package]] name = "zokrates_circom" -version = "0.1.3" +version = "0.1.4" dependencies = [ "bellman_ce", "byteorder", @@ -3698,7 +3698,7 @@ dependencies = [ [[package]] name = "zokrates_cli" -version = "0.8.6" +version = "0.8.7" dependencies = [ "assert_cli", "blake2 0.8.1", @@ -3742,7 +3742,7 @@ dependencies = [ [[package]] name = "zokrates_codegen" -version = "0.1.2" +version = "0.1.3" dependencies = [ "zokrates_ast", "zokrates_common", @@ -3753,14 +3753,14 @@ dependencies = [ [[package]] name = "zokrates_common" -version = "0.1.2" +version = "0.1.3" dependencies = [ "serde", ] [[package]] name = "zokrates_core" -version = "0.7.5" +version = "0.7.6" dependencies = [ "cfg-if 0.1.10", "lazy_static", @@ -3808,7 +3808,7 @@ dependencies = [ [[package]] name = "zokrates_field" -version = "0.5.4" +version = "0.5.5" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -3847,7 +3847,7 @@ dependencies = [ [[package]] name = "zokrates_interpreter" -version = "0.1.4" +version = "0.1.5" dependencies = [ "ark-bls12-377", "num", @@ -3863,7 +3863,7 @@ dependencies = [ [[package]] name = "zokrates_js" -version = "1.1.7" +version = "1.1.8" dependencies = [ "console_error_panic_hook", "getrandom", @@ -3893,7 +3893,7 @@ dependencies = [ [[package]] name = "zokrates_parser" -version = "0.3.4" +version = "0.3.5" dependencies = [ "glob 0.2.11", "pest", @@ -3902,7 +3902,7 @@ dependencies = [ [[package]] name = "zokrates_pest_ast" -version = "0.3.2" +version = "0.3.3" dependencies = [ "from-pest", "glob 0.2.11", @@ -3921,7 +3921,7 @@ dependencies = [ [[package]] name = "zokrates_proof_systems" -version = "0.1.2" +version = "0.1.3" dependencies = [ "blake2 0.8.1", "byteorder", @@ -3947,7 +3947,7 @@ dependencies = [ [[package]] name = "zokrates_test" -version = "0.2.2" +version = "0.2.3" dependencies = [ "getrandom", "rand 0.8.5", diff --git a/changelogs/unreleased/1235-schaeff b/changelogs/unreleased/1235-schaeff deleted file mode 100644 index b1aa352b8..000000000 --- a/changelogs/unreleased/1235-schaeff +++ /dev/null @@ -1 +0,0 @@ -Add initial support for the Nova proving scheme \ No newline at end of file diff --git a/changelogs/unreleased/1296-schaeff b/changelogs/unreleased/1296-schaeff deleted file mode 100644 index c5ef025fe..000000000 --- a/changelogs/unreleased/1296-schaeff +++ /dev/null @@ -1 +0,0 @@ -Reduce memory usage of compilation \ No newline at end of file diff --git a/zokrates_abi/Cargo.toml b/zokrates_abi/Cargo.toml index 7ee7e15ab..967ff018b 100644 --- a/zokrates_abi/Cargo.toml +++ b/zokrates_abi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_abi" -version = "0.1.8" +version = "0.1.9" authors = ["Thibaut Schaeffer "] edition = "2018" diff --git a/zokrates_analysis/Cargo.toml b/zokrates_analysis/Cargo.toml index b2415b4a5..1a55312a8 100644 --- a/zokrates_analysis/Cargo.toml +++ b/zokrates_analysis/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_analysis" -version = "0.1.2" +version = "0.1.3" edition = "2021" [features] diff --git a/zokrates_ark/Cargo.toml b/zokrates_ark/Cargo.toml index 8aec37846..b3da39979 100644 --- a/zokrates_ark/Cargo.toml +++ b/zokrates_ark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_ark" -version = "0.1.3" +version = "0.1.4" edition = "2021" [features] diff --git a/zokrates_ast/Cargo.toml b/zokrates_ast/Cargo.toml index 716ff5e73..dbbb44bed 100644 --- a/zokrates_ast/Cargo.toml +++ b/zokrates_ast/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_ast" -version = "0.1.6" +version = "0.1.7" edition = "2021" [features] diff --git a/zokrates_bellman/Cargo.toml b/zokrates_bellman/Cargo.toml index 669fc2172..84e1be011 100644 --- a/zokrates_bellman/Cargo.toml +++ b/zokrates_bellman/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_bellman" -version = "0.1.2" +version = "0.1.3" edition = "2021" [features] diff --git a/zokrates_circom/Cargo.toml b/zokrates_circom/Cargo.toml index 1b60f3b91..7cc84a3a2 100644 --- a/zokrates_circom/Cargo.toml +++ b/zokrates_circom/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_circom" -version = "0.1.3" +version = "0.1.4" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/zokrates_cli/Cargo.toml b/zokrates_cli/Cargo.toml index 09e86010f..31f182443 100644 --- a/zokrates_cli/Cargo.toml +++ b/zokrates_cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_cli" -version = "0.8.6" +version = "0.8.7" authors = ["Jacob Eberhardt ", "Dennis Kuhnert ", "Thibaut Schaeffer "] repository = "https://github.com/Zokrates/ZoKrates.git" edition = "2018" diff --git a/zokrates_codegen/Cargo.toml b/zokrates_codegen/Cargo.toml index 73d2554c7..42fabe756 100644 --- a/zokrates_codegen/Cargo.toml +++ b/zokrates_codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_codegen" -version = "0.1.2" +version = "0.1.3" edition = "2021" [features] diff --git a/zokrates_common/Cargo.toml b/zokrates_common/Cargo.toml index ecf21489e..1a418c00c 100644 --- a/zokrates_common/Cargo.toml +++ b/zokrates_common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_common" -version = "0.1.2" +version = "0.1.3" authors = ["dark64 "] edition = "2018" diff --git a/zokrates_core/Cargo.toml b/zokrates_core/Cargo.toml index 134712086..919677960 100644 --- a/zokrates_core/Cargo.toml +++ b/zokrates_core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_core" -version = "0.7.5" +version = "0.7.6" edition = "2021" authors = ["Jacob Eberhardt ", "Dennis Kuhnert "] repository = "https://github.com/Zokrates/ZoKrates" diff --git a/zokrates_field/Cargo.toml b/zokrates_field/Cargo.toml index fc9fa09b8..dfe4d0736 100644 --- a/zokrates_field/Cargo.toml +++ b/zokrates_field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_field" -version = "0.5.4" +version = "0.5.5" authors = ["Thibaut Schaeffer ", "Guillaume Ballet "] edition = "2021" diff --git a/zokrates_interpreter/Cargo.toml b/zokrates_interpreter/Cargo.toml index 83b66aede..756ccd6a4 100644 --- a/zokrates_interpreter/Cargo.toml +++ b/zokrates_interpreter/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_interpreter" -version = "0.1.4" +version = "0.1.5" edition = "2021" [features] diff --git a/zokrates_js/Cargo.toml b/zokrates_js/Cargo.toml index 84125a664..2ff4f49e0 100644 --- a/zokrates_js/Cargo.toml +++ b/zokrates_js/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_js" -version = "1.1.7" +version = "1.1.8" authors = ["Darko Macesic"] edition = "2018" diff --git a/zokrates_js/package.json b/zokrates_js/package.json index 14ca7ef7e..ddb900a58 100644 --- a/zokrates_js/package.json +++ b/zokrates_js/package.json @@ -1,6 +1,6 @@ { "name": "zokrates-js", - "version": "1.1.7", + "version": "1.1.8", "module": "index.js", "main": "index-node.js", "description": "JavaScript bindings for ZoKrates", diff --git a/zokrates_parser/Cargo.toml b/zokrates_parser/Cargo.toml index 52fdd1b94..f781d2959 100644 --- a/zokrates_parser/Cargo.toml +++ b/zokrates_parser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_parser" -version = "0.3.4" +version = "0.3.5" authors = ["JacobEberhardt "] edition = "2018" diff --git a/zokrates_pest_ast/Cargo.toml b/zokrates_pest_ast/Cargo.toml index 77d6b1740..08a976b59 100644 --- a/zokrates_pest_ast/Cargo.toml +++ b/zokrates_pest_ast/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_pest_ast" -version = "0.3.2" +version = "0.3.3" authors = ["schaeff "] edition = "2018" diff --git a/zokrates_proof_systems/Cargo.toml b/zokrates_proof_systems/Cargo.toml index b0b245101..aef2f9e6e 100644 --- a/zokrates_proof_systems/Cargo.toml +++ b/zokrates_proof_systems/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_proof_systems" -version = "0.1.2" +version = "0.1.3" edition = "2021" [dependencies] diff --git a/zokrates_test/Cargo.toml b/zokrates_test/Cargo.toml index e7df446dc..9ea298b67 100644 --- a/zokrates_test/Cargo.toml +++ b/zokrates_test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zokrates_test" -version = "0.2.2" +version = "0.2.3" authors = ["schaeff "] edition = "2018"