diff --git a/plonky2_poseidon2/Cargo.toml b/plonky2_poseidon2/Cargo.toml index 2472579..0e3ed78 100644 --- a/plonky2_poseidon2/Cargo.toml +++ b/plonky2_poseidon2/Cargo.toml @@ -11,8 +11,10 @@ anyhow = { version = "1.0.89" } unroll = { version = "0.1.5", default-features = false } serde = { version = "1.0.210" , features = ["rc"] } serde_json = { version = "1.0" } -plonky2 = { version = "0.2.2" } +plonky2 = { version = "0.2.2", default-features = true} plonky2_field = { version = "0.2.2", default-features = false } +log = { version = "0.4.20", default-features = false } +jemallocator = "0.5.4" [dev-dependencies] criterion = { version = "0.5.1", default-features = false } diff --git a/plonky2_poseidon2/src/gate/mod.rs b/plonky2_poseidon2/src/gate/mod.rs index 4f84889..27b5c93 100644 --- a/plonky2_poseidon2/src/gate/mod.rs +++ b/plonky2_poseidon2/src/gate/mod.rs @@ -1 +1 @@ -pub mod poseidon2; \ No newline at end of file +pub mod poseidon2; diff --git a/plonky2_poseidon2/src/lib.rs b/plonky2_poseidon2/src/lib.rs index eae341f..2cbad37 100644 --- a/plonky2_poseidon2/src/lib.rs +++ b/plonky2_poseidon2/src/lib.rs @@ -1,3 +1,4 @@ pub mod gate; pub mod poseidon2_hash; -pub mod config; \ No newline at end of file +pub mod config; +pub mod serialization; \ No newline at end of file diff --git a/plonky2_poseidon2/src/serialization/gate_serialization.rs b/plonky2_poseidon2/src/serialization/gate_serialization.rs new file mode 100644 index 0000000..f269f5a --- /dev/null +++ b/plonky2_poseidon2/src/serialization/gate_serialization.rs @@ -0,0 +1,88 @@ +use std::time::Instant; +use plonky2_field::extension::Extendable; +use plonky2::gates::arithmetic_base::ArithmeticGate; +use plonky2::gates::arithmetic_extension::ArithmeticExtensionGate; +use plonky2::gates::base_sum::BaseSumGate; +use plonky2::gates::constant::ConstantGate; +use plonky2::gates::coset_interpolation::CosetInterpolationGate; +use plonky2::gates::exponentiation::ExponentiationGate; +use plonky2::gates::gate::GateRef; +use plonky2::gates::lookup::LookupGate; +use plonky2::gates::lookup_table::LookupTableGate; +use plonky2::gates::multiplication_extension::MulExtensionGate; +use plonky2::gates::noop::NoopGate; +use plonky2::gates::poseidon::PoseidonGate; +use crate::gate::poseidon2::Poseidon2Gate; +use plonky2::gates::poseidon_mds::PoseidonMdsGate; +use plonky2::gates::public_input::PublicInputGate; +use plonky2::gates::random_access::RandomAccessGate; +use plonky2::gates::reducing::ReducingGate; +use plonky2::gates::reducing_extension::ReducingExtensionGate; +use plonky2::hash::hash_types::RichField; +use plonky2::{read_gate_impl, get_gate_tag_impl}; +use plonky2::plonk::circuit_data::{CircuitConfig, CommonCircuitData}; +use plonky2::util::serialization::{Buffer, GateSerializer, IoResult}; +use crate::poseidon2_hash::poseidon2::Poseidon2; +use std::vec::Vec; +use plonky2::iop::witness::PartialWitness; +use plonky2::plonk::circuit_builder::CircuitBuilder; +use plonky2_field::goldilocks_field::GoldilocksField; + +#[macro_export] +/// The macros are re-implemented here because of import issue with plonky2 +/// in plonky2 `use std::vec::Vec;` // For macros was not set to public +/// so here these are re-implemented +macro_rules! impl_gate_serializer { + ($target:ty, $($gate_types:ty),+) => { + fn read_gate( + &self, + buf: &mut plonky2::util::serialization::Buffer, + common: &plonky2::plonk::circuit_data::CommonCircuitData, + ) -> plonky2::util::serialization::IoResult> { + let tag = plonky2::util::serialization::Read::read_u32(buf)?; + read_gate_impl!(buf, tag, common, $($gate_types),+) + } + + fn write_gate( + &self, + buf: &mut Vec, + gate: &plonky2::gates::gate::GateRef, + common: &plonky2::plonk::circuit_data::CommonCircuitData, + ) -> plonky2::util::serialization::IoResult<()> { + let tag = get_gate_tag_impl!(gate, $($gate_types),+)?; + + plonky2::util::serialization::Write::write_u32(buf, tag)?; + gate.0.serialize(buf, common)?; + Ok(()) + } + }; +} + +/// A gate serializer that can be used to serialize all default gates supported +/// by the `plonky2` library with the added Poseidon2 Gate +#[derive(Debug)] +pub struct DefaultGateSerializer; +impl + Poseidon2, const D: usize> GateSerializer for DefaultGateSerializer { + impl_gate_serializer! { + DefaultGateSerializer, + ArithmeticGate, + ArithmeticExtensionGate, + BaseSumGate<2>, + ConstantGate, + CosetInterpolationGate, + ExponentiationGate, + LookupGate, + LookupTableGate, + MulExtensionGate, + NoopGate, + PoseidonMdsGate, + PoseidonGate, + Poseidon2Gate, + PublicInputGate, + RandomAccessGate, + ReducingExtensionGate, + ReducingGate + } +} + + diff --git a/plonky2_poseidon2/src/serialization/generator_serialization.rs b/plonky2_poseidon2/src/serialization/generator_serialization.rs new file mode 100644 index 0000000..0d530cd --- /dev/null +++ b/plonky2_poseidon2/src/serialization/generator_serialization.rs @@ -0,0 +1,80 @@ +use std::marker::PhantomData; +use plonky2_field::extension::Extendable; +use plonky2::gates::arithmetic_base::{ArithmeticBaseGenerator, ArithmeticGate}; +use plonky2::gates::arithmetic_extension::{ArithmeticExtensionGate, ArithmeticExtensionGenerator}; +use plonky2::gates::base_sum::{BaseSplitGenerator, BaseSumGate}; +use plonky2::gates::constant::ConstantGate; +use plonky2::gates::coset_interpolation::{CosetInterpolationGate, InterpolationGenerator}; +use plonky2::gates::exponentiation::{ExponentiationGate, ExponentiationGenerator}; +use plonky2::gates::gate::{AnyGate, Gate, GateRef}; +use plonky2::gates::lookup::{LookupGate, LookupGenerator}; +use plonky2::gates::lookup_table::{LookupTableGate, LookupTableGenerator}; +use plonky2::gates::multiplication_extension::{MulExtensionGate, MulExtensionGenerator}; +use plonky2::gates::noop::NoopGate; +use plonky2::gates::poseidon::{PoseidonGate, PoseidonGenerator}; +use crate::gate::poseidon2::{Poseidon2Gate, Poseidon2Generator}; +use plonky2::gates::poseidon_mds::{PoseidonMdsGate, PoseidonMdsGenerator}; +use plonky2::gates::public_input::PublicInputGate; +use plonky2::gates::random_access::{RandomAccessGate, RandomAccessGenerator}; +use plonky2::gates::reducing::{ReducingGate, ReducingGenerator}; +use plonky2::gates::reducing_extension::ReducingGenerator as ReducingExtensionGenerator; +use plonky2::gates::reducing_extension::ReducingExtensionGate; +use plonky2::hash::hash_types::RichField; +use plonky2::{impl_gate_serializer, impl_generator_serializer, get_generator_tag_impl, read_generator_impl}; +use plonky2::read_gate_impl; +use plonky2::get_gate_tag_impl; +use plonky2::plonk::circuit_data::CommonCircuitData; +use plonky2::util::serialization::{Buffer, GateSerializer, IoError, IoResult, Read, WitnessGeneratorSerializer, Write}; +use crate::poseidon2_hash::poseidon2::Poseidon2; +use std::vec::Vec; +use plonky2::gadgets::arithmetic::EqualityGenerator; +use plonky2::gadgets::arithmetic_extension::QuotientGeneratorExtension; +use plonky2::gadgets::range_check::LowHighGenerator; +use plonky2::gadgets::split_base::BaseSumGenerator; +use plonky2::gadgets::split_join::{SplitGenerator, WireSplitGenerator}; +use plonky2::iop::generator::{ConstantGenerator, CopyGenerator, NonzeroTestGenerator, RandomValueGenerator, SimpleGenerator, WitnessGeneratorRef}; +use plonky2::plonk::config::{AlgebraicHasher, GenericConfig}; +use plonky2::recursion::dummy_circuit::DummyProofGenerator; + +#[derive(Debug, Default)] +pub struct DefaultGeneratorSerializer, const D: usize> { + pub _phantom: PhantomData, +} + +/// A generator serializer that can be used to serialize all default generators supported +/// by the `plonky2` library with the added `Poseidon2Generator` +impl WitnessGeneratorSerializer for DefaultGeneratorSerializer + where + F: RichField + Extendable + Poseidon2, + C: GenericConfig + 'static, + C::Hasher: AlgebraicHasher, +{ + impl_generator_serializer! { + DefaultGeneratorSerializer, + ArithmeticBaseGenerator, + ArithmeticExtensionGenerator, + BaseSplitGenerator<2>, + BaseSumGenerator<2>, + ConstantGenerator, + CopyGenerator, + DummyProofGenerator, + EqualityGenerator, + ExponentiationGenerator, + InterpolationGenerator, + LookupGenerator, + LookupTableGenerator, + LowHighGenerator, + MulExtensionGenerator, + NonzeroTestGenerator, + PoseidonGenerator, + Poseidon2Generator, + PoseidonMdsGenerator, + QuotientGeneratorExtension, + RandomAccessGenerator, + RandomValueGenerator, + ReducingGenerator, + ReducingExtensionGenerator, + SplitGenerator, + WireSplitGenerator + } +} \ No newline at end of file diff --git a/plonky2_poseidon2/src/serialization/mod.rs b/plonky2_poseidon2/src/serialization/mod.rs new file mode 100644 index 0000000..64a08fb --- /dev/null +++ b/plonky2_poseidon2/src/serialization/mod.rs @@ -0,0 +1,5 @@ +pub mod gate_serialization; +pub mod generator_serialization; + +pub use gate_serialization::DefaultGateSerializer; +pub use generator_serialization::DefaultGeneratorSerializer; \ No newline at end of file diff --git a/proof-input/circ_data.bin b/proof-input/circ_data.bin new file mode 100644 index 0000000..f0c38da Binary files /dev/null and b/proof-input/circ_data.bin differ diff --git a/proof-input/src/gen_input.rs b/proof-input/src/gen_input.rs index 4556470..7206530 100644 --- a/proof-input/src/gen_input.rs +++ b/proof-input/src/gen_input.rs @@ -395,7 +395,7 @@ mod tests { use plonky2::iop::witness::PartialWitness; use plonky2::plonk::circuit_builder::CircuitBuilder; use codex_plonky2_circuits::circuits::params::CircuitParams; - use codex_plonky2_circuits::circuits::sample_cells::{MerklePath, SampleCircuit, SampleCircuitInput}; + use codex_plonky2_circuits::circuits::sample_cells::SampleCircuit; use crate::params::{C, D, F}; // Test sample cells (non-circuit) @@ -410,20 +410,16 @@ mod tests { #[test] fn test_proof_in_circuit() -> anyhow::Result<()> { // get input - let params = TestParams::default(); + let mut params = TestParams::default(); + params.n_samples = 10; let circ_input = gen_testing_circuit_input::(¶ms); // Create the circuit let config = CircuitConfig::standard_recursion_config(); let mut builder = CircuitBuilder::::new(config); - let circuit_params = CircuitParams { - max_depth: params.max_depth, - max_log2_n_slots: params.dataset_max_depth(), - block_tree_depth: params.bot_depth(), - n_field_elems_per_cell: params.n_field_elems_per_cell(), - n_samples: params.n_samples, - }; + let mut circuit_params = CircuitParams::default(); + circuit_params.n_samples = 10; // build the circuit let circ = SampleCircuit::new(circuit_params.clone()); diff --git a/proof-input/src/json.rs b/proof-input/src/json.rs index 36d7703..540e749 100644 --- a/proof-input/src/json.rs +++ b/proof-input/src/json.rs @@ -1,7 +1,9 @@ use anyhow::{anyhow, Error, Result}; use serde::{Deserialize, Serialize}; use std::fs::File; +use std::{fs, io}; use std::io::{BufReader, Write}; +use std::path::Path; use crate::gen_input::{DatasetTree, gen_testing_circuit_input}; use plonky2::hash::hash_types::{HashOut, RichField}; use plonky2::plonk::config::{GenericConfig, Hasher}; @@ -271,17 +273,27 @@ pub fn import_circ_input_from_json + Poseidon2, con Ok(circ_input) } +/// Writes the provided bytes to the specified file path using `std::fs::write`. +pub fn write_bytes_to_file>(data: Vec, path: P) -> io::Result<()> { + fs::write(path, data) +} + +/// Reads the contents of the specified file and returns them as a vector of bytes using `std::fs::read`. +pub fn read_bytes_from_file>(path: P) -> io::Result> { + fs::read(path) +} + #[cfg(test)] mod tests { use super::*; use crate::params::{C, D, F}; - use std::fs; use std::time::Instant; use codex_plonky2_circuits::circuits::params::CircuitParams; use codex_plonky2_circuits::circuits::sample_cells::SampleCircuit; use plonky2::iop::witness::PartialWitness; use plonky2::plonk::circuit_builder::CircuitBuilder; - use plonky2::plonk::circuit_data::CircuitConfig; + use plonky2::plonk::circuit_data::{CircuitConfig, CircuitData}; + use plonky2_poseidon2::serialization::{DefaultGateSerializer, DefaultGeneratorSerializer}; use crate::gen_input::verify_circuit_input; // Test to generate the JSON file @@ -342,13 +354,8 @@ mod tests { let config = CircuitConfig::standard_recursion_config(); let mut builder = CircuitBuilder::::new(config); - let circuit_params = CircuitParams { - max_depth: params.max_depth, - max_log2_n_slots: params.dataset_max_depth(), - block_tree_depth: params.bot_depth(), - n_field_elems_per_cell: params.n_field_elems_per_cell(), - n_samples: params.n_samples, - }; + let circuit_params = CircuitParams::default(); + let circ = SampleCircuit::new(circuit_params.clone()); let mut targets = circ.sample_slot_circuit(&mut builder); @@ -399,4 +406,56 @@ mod tests { Ok(()) } + + // test out custom default gate and generator serializers to export/import circuit data + #[test] + fn test_circuit_data_serializer() -> anyhow::Result<()> { + let params = TestParams::default(); + + // Create the circuit + let config = CircuitConfig::standard_recursion_config(); + let mut builder = CircuitBuilder::::new(config); + + let circuit_params = CircuitParams::default(); + let circ = SampleCircuit::new(circuit_params.clone()); + let mut targets = circ.sample_slot_circuit(&mut builder); + + // Create a PartialWitness and assign + let mut pw = PartialWitness::new(); + + // gen circ input + let imported_circ_input: SampleCircuitInput = gen_testing_circuit_input::(¶ms); + circ.sample_slot_assign_witness(&mut pw, &mut targets, imported_circ_input); + + // Build the circuit + let data = builder.build::(); + println!("circuit size = {:?}", data.common.degree_bits()); + + let gate_serializer = DefaultGateSerializer; + let generator_serializer =DefaultGeneratorSerializer::::default(); + let data_bytes = data.to_bytes(&gate_serializer, &generator_serializer).unwrap(); + + let file_path = "circ_data.bin"; + // Write data to the file + write_bytes_to_file(data_bytes.clone(), file_path).unwrap(); + println!("Data written to {}", file_path); + + // Read data back from the file + let read_data = read_bytes_from_file(file_path).unwrap(); + let data = CircuitData::::from_bytes(&read_data, &gate_serializer, &generator_serializer).unwrap(); + + // Prove the circuit with the assigned witness + let start_time = Instant::now(); + let proof_with_pis = data.prove(pw)?; + println!("prove_time = {:?}", start_time.elapsed()); + + // Verify the proof + let verifier_data = data.verifier_data(); + assert!( + verifier_data.verify(proof_with_pis).is_ok(), + "Merkle proof verification failed" + ); + + Ok(()) + } } \ No newline at end of file diff --git a/workflow/benches/sample_cells.rs b/workflow/benches/sample_cells.rs index 447acd2..49bb1d6 100644 --- a/workflow/benches/sample_cells.rs +++ b/workflow/benches/sample_cells.rs @@ -5,19 +5,22 @@ use plonky2::plonk::circuit_builder::CircuitBuilder; use plonky2::plonk::circuit_data::CircuitConfig; use plonky2::plonk::config::GenericConfig; -use proof_input::json::import_circ_input_from_json; -use codex_plonky2_circuits::circuits::sample_cells::{SampleCircuit, SampleCircuitInput}; +use codex_plonky2_circuits::circuits::sample_cells::SampleCircuit; use codex_plonky2_circuits::circuits::params::CircuitParams; -use proof_input::params::{D, C, F, Params}; +use proof_input::gen_input::gen_testing_circuit_input; +use proof_input::params::{D, C, F, Params, TestParams}; /// Benchmark for building, proving, and verifying the Plonky2 circuit. fn bench_prove_verify(c: &mut Criterion) { // get default parameters - let circuit_params = CircuitParams::default(); + let mut test_params = TestParams::default(); + test_params.n_samples = 10; - // Import the circuit input from a JSON file - let circ_input: SampleCircuitInput = import_circ_input_from_json("input.json").expect("Failed to import circuit input from JSON"); - println!("Witness imported from input.json"); + let mut circuit_params = CircuitParams::default(); + circuit_params.n_samples = 10; + + // gen the circuit input + let circ_input = gen_testing_circuit_input::(&test_params); // Create the circuit configuration let config = CircuitConfig::standard_recursion_config(); @@ -54,16 +57,11 @@ fn bench_prove_verify(c: &mut Criterion) { println!("Build time: {:?}", build_duration); println!("Circuit size (degree bits): {:?}", data.common.degree_bits()); - // Benchmark the Proving Phase - group.bench_function("Prove Circuit", |b| { - b.iter(|| { - let local_pw = pw.clone(); - data.prove(local_pw).expect("Failed to prove circuit") - }) - }); - // Generate the proof once for verification benchmarking + let prove_start = std::time::Instant::now(); let proof_with_pis = data.prove(pw.clone()).expect("Failed to prove circuit"); + let prove_duration = prove_start.elapsed(); + println!("prove time: {:?}", prove_duration); let verifier_data = data.verifier_data(); println!("Proof size: {} bytes", proof_with_pis.to_bytes().len()); diff --git a/workflow/circ_data.bin b/workflow/circ_data.bin new file mode 100644 index 0000000..f0c38da Binary files /dev/null and b/workflow/circ_data.bin differ diff --git a/workflow/input.json b/workflow/input.json index 3a5d6d7..6a6a480 100644 --- a/workflow/input.json +++ b/workflow/input.json @@ -1,9 +1,9 @@ { "dataSetRoot": [ - "7227516050042522281", - "15605692942410130655", - "4071287351103999865", - "10400576513634645543" + "10957230788015423690", + "10111194203385956008", + "15953847435370696603", + "14757738268117793500" ], "entropy": [ "1234567", @@ -15,10 +15,10 @@ "nSlotsPerDataSet": 11, "slotIndex": 3, "slotRoot": [ - "2090750690750182732", - "1881748754875308316", - "12252377310688530072", - "11467407166754927367" + "11929465284431025883", + "13310971777506741344", + "5189323170413847133", + "3016943271475108138" ], "slotProof": [ "827439652992611846", @@ -56,1414 +56,1414 @@ ], "cellData": [ [ - "11457939612777156149", - "3050316285222942956", - "6220403600626645889", - "12552302917535337169", - "14541909488033149911", - "11770580506856219669", - "5159721427328441664", - "17484751996670362665", - "18080055594735154274", - "8113355594472245232", - "12028132870773367291", - "11178885573919577166", - "81431431914614418", - "6514073139358794268", - "6142463557504220189", - "8014341706762814367", - "15859189912477348442", - "11206463965002104979", - "18386940451390972601", - "14320572997556349975", - "2902433927452857519", - "166093506148296056", - "6410137538410426200", - "1405305335167060997", - "7091263553953219162", - "7991898997607812380", - "14367150039566225051", - "14169430135722176060", - "357234809254528860", - "12431984114929387189", - "3850217156876860009", - "14108978968002153623", - "5897805459465079856", - "11742592175139819044", - "5663597380091824223", - "14565010685027775699", - "6355414844296328300", - "3176342646126333868", - "13312000239731526284", - "1813401179374360382", - "15721025662865302074", - "9307898683008387800", - "16095022648834918397", - "8508727319451852508", - "5013877483662715182", - "14687171630836174210", - "1016977896552879017", - "10603229287201375808", - "7606106266477371270", - "14619993846981785001", - "16158266043354227350", - "8109889459249440702", - "17638021571635370803", - "5776583562053523708", - "13309465232537818977", - "17894370279417414860", - "2039516115519122646", - "7735738456787701801", - "2114131480597510478", - "13002865183559024873", - "8148382867428146303", - "17107096754664950015", - "15995939518225188127", - "6660679226877450664", - "2258774982255286380", - "5969102767119322183", - "323508450456616506", - "5771167036451490601", - "4702863787346388524", - "11235019473529664748", - "15208269915881733477", - "13732850805365222539", - "3967824483187236383", - "341453855160546845", - "2601431415727074157", - "837981355672673674", - "13895835929540901620", - "5023171277881449578", - "2578292732108730937", - "1326590181131489736", - "18019166505500049607", - "12676415830163378066", - "11713152662527014394", - "8419436892173104651", - "5328185136439228391", - "13761180753885192880", - "4088282376487232653", - "14376963741823602081", - "9416113316478283377", - "3942124876619731144", - "14016868039958633320", - "9275316385742963753", - "9267036037585021293", - "10624856383029657471", - "1564704649345818868", - "6955664300360433452", - "12784901068904496139", - "11609004912455571330", - "5544851504161475053", - "2505485096186424081", - "13080900163691646929", - "14378229203385276580", - "5548015082664891139", - "16197257410793639245", - "4283836127775517463", - "15659487608606043098", - "14716714177566364100", - "1360725025897396820", - "5924244461659690705", - "18256436209234680180", - "11482860894832381774", - "7280920457206799588", - "6038354509238150729", - "8497209293930154698", - "6595159824161281888", - "17959311744547630815", - "9446618738681521192", - "2231145625154182532", - "1612721077977526703", - "2502800087465115680", - "9149386836956544246", - "6023500600611771197", - "14038511452395334814", - "12058296496725143040", - "14874523481840059166", - "4098824888723150267", - "8031903337636976906", - "5352304907919464659", - "9044984052868393768", - "13787552916107169853", - "608704541507515593", - "6519169404641962810", - "14283726146636458097", - "4691169573022853179", - "3845381349270990195", - "9472095443014492420", - "338100774276812605", - "847897542424490257", - "5833395661420031132", - "3376168990927144848", - "11781433533985455703", - "6766859483076690677", - "8241999241541652117", - "12238465456608891684", - "10182030407849654133", - "6471333605282880288", - "14671103760105037248", - "14772117017874459234", - "13398147735979779243", - "6728887418425058904", - "9591410645557265199", - "7721536086278307051", - "8663434822473730735", - "15870613879126630825", - "12420371311349064158", - "7642189123898814043", - "11301463847625725696", - "1271980502357224197", - "2691921715512971114", - "10791956304114519697", - "10841827082834230797", - "14496216107658951657", - "378576822342238932", - "11816132404790890721", - "10197678341961963153", - "4859273885331353576", - "2304826773056208586", - "1561618584435426461", - "13704606001261612888", - "5971266373562726982", - "7694426958578363986", - "1343097757023061443", - "16269449968189772941", - "10716735754636996006", - "11225031182828259295", - "388082336936778193", - "17121142095308037305", - "11088446402873002262", - "18286165223564381809", - "4204250876184437870", - "17635951554570279619", - "11834370865941306267", - "11331819102150205784", - "14696000503512223579", - "12125027264771580003", - "8508030444347051700", - "18138614803133214676", - "17429805149296050164", - "4139381086373086671", - "10305278958539323622", - "16906554973309761266", - "18191503767547609470", - "10948747037421524840", - "15546196023394655407", - "16496199075810259040", - "210503735868645472", - "2269391182322777419", - "12748524104627655381", - "11704134142470353594", - "4694332057572424632", - "12644071377066629751", - "2939607068326303448", - "4825680112038181769", - "685078848477726269", - "1882006854736407768", - "16208047635330099295", - "4869004388903488938", - "13205369555389902404", - "7163714606990315644", - "2565130413235394395", - "15336881740765232645", - "643356287468158481", - "3128163661496103712", - "2423681737807333546", - "18255664325176426004", - "9639986078867987376", - "6056528663322833774", - "17480595638196051099", - "8050319088589534255", - "2254245225727370562", - "2960302824048561031", - "13808371501942544682", - "6043402723449931620", - "3094190345562236603", - "1766431621657220256", - "5603805724266261910", - "2511225517705518845", - "17967586742541797443", - "16886289216936100567", - "7048895143869535547", - "2551053130787240129", - "14099852168180132653", - "14892970324593649945", - "3183606805598469479", - "17564307367935913701", - "9442907787544290153", - "8061833043936010873", - "8266514373712854111", - "13029841803856050421", - "9278151427913043456", - "4264121391537141960", - "9325698041249610094", - "205038774086865162", - "9626460993533827671", - "3278025538283206693", - "1038778560474010056", - "11769534725766270789", - "5836487059400872605", - "855120296257882848", - "14606576843236539041", - "17359957639196096335", - "5984493807993134323", - "10931601703210143334", - "2383543864181883763", - "4065775530135081205", - "15291538758754625774", - "14082658636388685835", - "17831807206976612048", - "16650746555689327992", - "8847714052410328437", - "11342686403008154695", - "11571151994688702486", - "6328686857903171911", - "8417369756593193679", - "4966669765458807260", - "3689762854656012439", - "816098669409627343", - "13355343131837999261", - "2156757980567137663", - "9022400708841159580", - "16779817458419398909", - "3886507359276398446" + "12063212115467436778", + "16374765498833020461", + "9312134184870191946", + "17127728869230161759", + "1446779150996250594", + "8205411946788586358", + "16537054493995518154", + "2034485460622811754", + "2910687147341767761", + "4132227303741279701", + "10624538217003639296", + "1536803591837841965", + "13153785677416122011", + "16686940485532334903", + "1914744039574727003", + "3258478404256222380", + "12393650159083521049", + "12112353602651927004", + "14781296788150546406", + "13792627918406928771", + "1407048575417940314", + "598241158517456405", + "11723299540647281157", + "11174891655421083573", + "14657245303630819186", + "1028620424040436717", + "962328123728895131", + "10133132802580570440", + "10462017226134334365", + "17824238547669985201", + "8281152018933880961", + "15104224992009350227", + "14499020382145531829", + "7936371148374489352", + "14595822894843543168", + "7043576730566884160", + "4808568431251520138", + "2795766256484923491", + "15379283398888324869", + "16247060634201582402", + "1847893665649823247", + "6995720583889204721", + "6725373181994227117", + "3672807653969958987", + "3927034141429555914", + "9984601939645434252", + "6241295002373458058", + "5491482929766786197", + "4620164684834453492", + "14547577967612568621", + "9907979873917669574", + "2401832425432691471", + "7726209872865583697", + "9215490162324689619", + "9682102297297103288", + "12233878341756227762", + "14893113530907463965", + "12301498114990080087", + "18068215388117716073", + "8853512495338704484", + "1818020984506108930", + "3053761612642137285", + "1790622386190360300", + "4182705899865050405", + "9940282184420679388", + "13586477950393554116", + "14654104952719726711", + "8653360949308179023", + "6689503835840768557", + "12069257040326049372", + "4313268629414753611", + "5006151078220556817", + "11457207250748312568", + "14394118176688250983", + "17055677795311942331", + "17950500855254307147", + "5580683275021530235", + "75193110825282302", + "1954545920474769999", + "5162290750432645879", + "16486836498817372787", + "5697004319533458113", + "13397864440979458381", + "1426130535928435839", + "9171255198613146415", + "11274331834733152320", + "9923303002026226921", + "7559166170848912172", + "17781504010949172796", + "13643930381389850526", + "14516238121386183496", + "940600882396448041", + "16611676249388515121", + "2847216354565208054", + "6823804148851788755", + "10193424805892817230", + "6746910392097767074", + "12043086273120060576", + "7318321420001863679", + "10427719121053186059", + "16300699322384233025", + "9589937563592683864", + "1804915561704867766", + "8081552035930488974", + "17193757016514224137", + "4192391080788191805", + "1603584187721356748", + "3280031548744157886", + "16121754797573193566", + "15431891099785446171", + "94796658023495492", + "3653006114073240690", + "11686292814955770630", + "9789136557961335185", + "11064054259188772741", + "10581684818350184193", + "2188309191892536265", + "11973413982447754245", + "5411465302081901700", + "10868490695149129361", + "9799734730727354067", + "11587767899714603464", + "13263183563913650260", + "5137736998044119705", + "18308094638987494799", + "15660654456017206823", + "12975004961867066847", + "17541418964988024268", + "2353023765049661467", + "13582249964917632023", + "3493322034637540486", + "13104717274438209170", + "7780515246382879312", + "13301408922941351118", + "13853765075106031650", + "13019947603780220509", + "13781412512720006553", + "6788906117517968101", + "17911204559523111951", + "3505444457580488953", + "13559388537392613490", + "7175107143969431667", + "4831806567458031237", + "3575943790302850635", + "11855898359925033766", + "2464086146280314336", + "10870047437857989699", + "1746889032906269544", + "3497723069704339810", + "15336029323690473612", + "13386234609316772606", + "17206303801089054571", + "15251619673681987349", + "1540679545382518450", + "444961489554755480", + "17444871942073711921", + "9686468141554608747", + "5627077333506981686", + "387244493356000105", + "7121148167288154246", + "14498385236940990024", + "16714910154092670034", + "2978952149959144211", + "11814593407425504785", + "11478124267408582849", + "17252431154420006784", + "1884273755991250185", + "14430001313766352259", + "13769778507160338581", + "2842470551017995697", + "10471402142532298156", + "12627338321295398154", + "17694164911860768976", + "12459909871041814806", + "16458074471348329257", + "4787811806725262654", + "7005904269263393392", + "2805289405875206940", + "3099452585480188559", + "14422100291868355854", + "8753850356226457776", + "10027728621645004295", + "11150441038565607529", + "8106935540382953813", + "18415564010562994123", + "7918459954994122628", + "14468358122672503290", + "11083740700028649536", + "4077265067987477652", + "18176908830542430702", + "14444682143268996711", + "4736886888858936323", + "11306688637874810308", + "11521121715505658933", + "569127326949208247", + "14250594606582025753", + "13732987102738331314", + "5743871964340165249", + "16606530314409585325", + "18119014511193731367", + "15646874700131033396", + "14731293327725417551", + "1303324456642292650", + "14248937910701534845", + "7796813094481979999", + "15287717295595840811", + "13160325621930385323", + "2878236898496913125", + "11144864576333886746", + "17201347690091641623", + "4083290328044196410", + "15939529397487938777", + "4448546392100701354", + "10366766243778304987", + "16121947728129454478", + "2328230261201251895", + "2563253939940842263", + "13316808109780291279", + "13957812099331321920", + "4664555025235021943", + "14445005883685158074", + "16060465958917363303", + "930769888327537785", + "15288154137028468420", + "4350164523110424762", + "11261902875076429854", + "14296686413542499639", + "5950897620458571744", + "3633046944025499636", + "12235469847607702743", + "16919204412244188442", + "18226727409478102423", + "1123665000539948777", + "16152633422787989819", + "15838917209726186051", + "9205478269388018039", + "8499034138274977043", + "17751467133944336614", + "14949279245261191648", + "15364615023492484697", + "1579770565006576253", + "3676140751269404643", + "12783485526459937130", + "9134292252567831799", + "5602195560415702685", + "5165738173812120048", + "51428311972271321", + "631028211950372935", + "3569173575789722477", + "10065334878830211768", + "9394040038523891210", + "5116924560748636586", + "2806955991505219035", + "2176872936662985090", + "10378666981608078337", + "13253778974285018793", + "15093224667465500230", + "9723842683739778845", + "1058381601316895454", + "8345853377919390714", + "15990246851945435532", + "11108894638799281211", + "8947038542547675400", + "7228609529531886199", + "7136208057101123672", + "4200867435599767645", + "12051154395754134592", + "10317223038261951793", + "10518253873220890252", + "13738006555005191274", + "12224245367120781260", + "962382930116448184" ], [ - "6721232702017077302", - "12475612654079651056", - "4977176195387576710", - "11134725293831972623", - "14413002553349700271", - "10647576892489495120", - "4672303252751685098", - "10990246817432151598", - "2387894660603585077", - "13685770433063431927", - "10148144693549069268", - "3729247976349065521", - "15662519038707209589", - "1738955485427196136", - "11538236434351509949", - "17955343370480970801", - "5726438345700118952", - "10583391631556681902", - "17076505242797337942", - "15924165500908052437", - "13987684438996895635", - "17858752710905735679", - "17590491146285471070", - "15517133774658435173", - "13158819927720523757", - "13756584389065432548", - "11369141697259277262", - "11986024649036386387", - "9311443037921761660", - "3196154892668814932", - "13384907004176771304", - "7905597036072159077", - "8115922880825552752", - "13038864463857292300", - "12473738214063433392", - "2713971355613794188", - "2539028696773665321", - "12726200971758104752", - "4837384484254314366", - "13459519393926747590", - "3623123573163104488", - "6446250364244618794", - "15262438093647138802", - "7026203862828151677", - "4091516187233384122", - "4879942609781572068", - "4275233804944213169", - "5836877358584586018", - "11940850459795881777", - "11931874266480519182", - "11877785928551628378", - "15428088157871158856", - "5619024456479980020", - "5132959148372594174", - "4105586279089295226", - "10401083082494218471", - "10642971609942808055", - "3106613604515160761", - "3622830259043537881", - "15724666586914738439", - "12670189152374154916", - "7817174367040730853", - "5227332517312342592", - "2455950705847810881", - "15595614510260184323", - "4373119459236273577", - "17260564084035709740", - "9002646846495801583", - "3998454067632879388", - "9592626029893722590", - "3300588876482269697", - "13930938273468792300", - "7563776060625181849", - "12101760128706774857", - "2923170985712919647", - "2330540019069094436", - "4442618974447902278", - "9542886998446340847", - "7391294788033610355", - "11580604221402544930", - "1040556388343617029", - "10688524025829479148", - "10372310660570314980", - "15109586926628479611", - "4734601250891833955", - "14808447330303165159", - "14179298419048631515", - "7263837993413156244", - "16754132462285820999", - "4203092745607243680", - "12621108795245239067", - "1698242084926197938", - "7868418716465543729", - "13178617512722500656", - "14492295372647039507", - "16303996286482041300", - "3884864343972150167", - "7426572316386731275", - "15074579128879493253", - "14490994716014752725", - "8808946999259346907", - "18347765361320273534", - "18196909830226819626", - "13272176547357240210", - "12163682805231727069", - "4933759853068427702", - "11416836099140617120", - "2466502800472213634", - "7338602267171010046", - "3796055477539205845", - "13020371238821039252", - "16820846264881697581", - "12174599496145334656", - "3579093382270402647", - "17965656154631645278", - "11861991253724333992", - "17693206677530405091", - "11110159880918421248", - "12805808988026839851", - "8307090202661751625", - "16984445494986805679", - "10719415293816582979", - "17322125912772573748", - "5599141576365483585", - "108904335923310728", - "11734794265397623360", - "4054002085828379491", - "1242452637817436709", - "12914797608457919373", - "14835116170806721435", - "8800905434010539709", - "1571995954458689514", - "6795216452241508134", - "5052756608233600619", - "112912440840969701", - "16751177511771059088", - "10173239208732551273", - "5118940782996092617", - "4502960692939529371", - "12879600492476175850", - "5331730162008549764", - "18445938992836642910", - "493864978289321967", - "14792775115328061600", - "9716175610927379996", - "11245621546993350599", - "3671490230636581857", - "4677840900589246015", - "9703925051099592249", - "11609915259850376871", - "7491754147104414384", - "17232795207381675901", - "12227426302493520953", - "6460817974297424565", - "3037542604644099058", - "3872180147948396814", - "17316554388665892429", - "17070596860958502200", - "1041587368909168929", - "3358126558287287929", - "1199095593511605166", - "4439453748296313014", - "10007363362641385451", - "14556181550425810705", - "6706280503367668063", - "7753981597037113760", - "15855476297576348162", - "4639987027732189419", - "4161734456562415607", - "5166269605943314684", - "9545490924987113035", - "8843161450626942947", - "11544663596013793676", - "3489657506581048666", - "7762210227775067518", - "10963449786921368006", - "6794816922323902034", - "13285914987630943499", - "17622946888844870098", - "1545521434613223881", - "12378022896061207508", - "12336136802111730762", - "13394497075328255506", - "13028376930905030901", - "15795895854035405079", - "12914281765940686487", - "7840519634597245128", - "10356485216703720166", - "2666250153250765643", - "15029878341171849804", - "5816420203403615773", - "6640322877449361331", - "7705000228508602171", - "8040168814978176645", - "12491234390370835426", - "7260307533172973737", - "10133164531727552407", - "646348178790810048", - "681531226085237328", - "6289300604086766761", - "7698834891669246305", - "5160588610754431403", - "6161824749003614212", - "17769329463319132623", - "8712863314296662721", - "11972567898359284941", - "8694598074700479909", - "2274303794970654269", - "678235774698932300", - "8520319109793574819", - "14622198420838340640", - "17438683371184955880", - "13759163496646694424", - "11877247345355319784", - "11026558179277718074", - "14122867160839050906", - "8559442564565542977", - "15911994735633381771", - "11995549083226142284", - "355758315054350727", - "15998760717047826934", - "5816473583434621710", - "6741365613678749945", - "14552916375014314050", - "10730902978191353717", - "11813996248510480602", - "2392182149900671620", - "18362382335740747720", - "3233615719353480986", - "13044554037056394399", - "6195145571296722418", - "17169985187035397765", - "9773928313188647181", - "13253360453944761065", - "6085819423770166226", - "361931791981338178", - "18028679479807039784", - "3899368884195804794", - "18009906019540051438", - "291131985460526119", - "11992486019986575364", - "16917360103975230440", - "14863471357440726050", - "14098280602648620079", - "7595764480238621281", - "14692665201403327331", - "8424607914322150603", - "15466580626510746719", - "3885737150806877246", - "7031243235608913243", - "17318678117294793011", - "18207659930104443032", - "4075317271607333090", - "6739302673191150248", - "10573518239698790299", - "13213306982999519809", - "7147875043917532126", - "16270662693487798119", - "2808139879173223391", - "18156303133972990647", - "5200553146687022577", - "17367391427344545503", - "12012771809897666189", - "10158636347720005478", - "10626104297653257433", - "4189203482365691177", - "10548368577915771417", - "17414436031762151860", - "17642938630996756210", - "13138655298477529045", - "11222985645015047643", - "9550397843416753217" + "15759740667212693787", + "11211139849633253308", + "9173601986360122648", + "8211605743495560641", + "1505231669061580052", + "1519632724899276254", + "9951774711487941059", + "5273721383462115752", + "3989641145923173594", + "17672811733359027524", + "408390092548091988", + "13061553283731611712", + "7021013794078039122", + "8675535105478471834", + "3285174837848325851", + "12558676358864117291", + "13786621115854981616", + "10167707329121518734", + "5381045643741684652", + "6655493520966652232", + "3884784120414693876", + "5380015252634709767", + "8266259743922877022", + "11632906891828558473", + "14438113104467944477", + "7863678868964198057", + "8007780246800608141", + "12936879190977359690", + "10093300811343837968", + "6930115043708205674", + "16895085153739648125", + "4732167941140124323", + "6506660943507739681", + "8773662647744276159", + "5700074990389405822", + "1988349875562060316", + "3629938776483929871", + "17644145743942252668", + "16554595686599207346", + "6084388129499120872", + "4610965688635764290", + "10039695796323208482", + "9640031004634113437", + "7772978228020576976", + "7879544209803976764", + "15834440111940036776", + "17736832819390408010", + "16810226285679616448", + "507605469189509727", + "3118166278761991741", + "18226049176983425028", + "3847624444366240919", + "612740879690344183", + "16338056828464172999", + "15364714757805946989", + "14884757262533768778", + "5965243234009927088", + "15020836381309915301", + "16292786689854539811", + "6510023109866528581", + "2983711949985662510", + "7099912967027919417", + "17945098183584455455", + "5999001107611549798", + "17626162704750132030", + "11165708372483624178", + "603260119956681920", + "13089892107768796499", + "5892255810728973987", + "6676492526570139795", + "3143301795354004709", + "16249483161295567486", + "1738822916282346212", + "14564519208241485592", + "10498923068774501197", + "2781970727228765485", + "4438252210076816046", + "571124356563910531", + "12485598522215956830", + "2143295991933445366", + "9337115724350428682", + "2087612994353800858", + "4230480373511974956", + "14238647190397849096", + "2083432353209283360", + "10105846762490671159", + "14304218917363846684", + "12489892622679377591", + "10161254569180695113", + "6831524151730385479", + "1185903042640706955", + "4208038653075079706", + "17086152363103171594", + "8986932629992092319", + "2568481730751596285", + "14124763900796554375", + "13002511607613923196", + "3572946911002840134", + "10858588265921482846", + "2961601111764011952", + "18175357202370996681", + "16187856201515570280", + "10594947855233845929", + "12802312456035009354", + "5058108233990001666", + "17085549488922035839", + "1916185165867562522", + "15635810894217568236", + "17519007921791493384", + "2767486287616817238", + "16905786461319736062", + "4698888195636799412", + "6328625627554829054", + "446972135000470517", + "14885387790840443013", + "10691053520855595842", + "12467845497014125367", + "7370774086080205252", + "8479915071395307086", + "10980907727457669272", + "10570845699141754134", + "16052014987045039420", + "8979310280503974067", + "14880012432685798045", + "9495080297411380213", + "14431280912745014255", + "14348497412046891861", + "7308012336987808370", + "11149976091552938953", + "17800590089160586211", + "12687302123927121001", + "11103237906564789124", + "9228213185849574207", + "10901252313890295820", + "17339052569035000033", + "640906149797189843", + "9556609313186163298", + "13468689582114561042", + "11984651327878661260", + "7365747452983537683", + "6999521359994076247", + "14226960063348242525", + "2226960962499490493", + "17582467971931283114", + "6626921082042115543", + "14704885487582410044", + "1012806255212317698", + "7838372405675996923", + "6407644433522903228", + "13335638678792857110", + "14307551802776721236", + "1528793572206089950", + "5502249882153835601", + "3054412232283202395", + "13093459084323847751", + "14635922008952426165", + "1967099268906357962", + "5507830914823911764", + "1065090536080552769", + "7405798437846326738", + "13695161912261517603", + "8170463566492732694", + "6905668764910271887", + "11806553379025163298", + "16934126708494198995", + "2494683130044690482", + "11717899784316172345", + "16379605144958792817", + "3618187970968035429", + "2322450155615747937", + "1292015334320330016", + "16804228587231483595", + "15418804218643926904", + "6776080263137905170", + "4618857237881577055", + "502746767666057737", + "2441140508639037885", + "10184467758893924089", + "12135074599616136508", + "1722632877754078203", + "17681163560764608611", + "15245954715759677147", + "12674163221191801913", + "12135094876565142990", + "2348703229804188103", + "6678639956618685020", + "17233414732617433822", + "1845934792927383111", + "8303686704431270162", + "5426563085460235250", + "7171623115601347295", + "12463252865381808739", + "3235402855005657333", + "3755725784422666029", + "3607918200248209031", + "8253338389773081521", + "8117504919237327807", + "5536113104285576742", + "2888420506768967096", + "9104384263606965793", + "16193317799282597514", + "8849266921708395171", + "7644439996140204986", + "515707846312300017", + "8258318386621220045", + "7852833594447274202", + "14473582648842475269", + "10305633644137368895", + "11389869583335462343", + "5865442214646982945", + "2837941839071965314", + "13278030870137574576", + "16982805755800639933", + "8548543136163490578", + "3775917453451551534", + "1437077823967825166", + "614707387549632152", + "5926566663998796701", + "2705928013833332592", + "15487369497358666987", + "16248514766214046001", + "10013200952168180569", + "10195629293190145189", + "166518933341514370", + "13130174969059317344", + "12808895432670612566", + "790833433106677271", + "16807051553138468183", + "2645549572755291979", + "8455584304110533546", + "9637527179950391841", + "18046929371425259782", + "16405950227041432476", + "9437234752293402235", + "17513260059757629546", + "17859095500414898047", + "2566886108652728971", + "17707314488390027649", + "1197495831890947319", + "7931126194318932163", + "4296472963566737408", + "5996971745844428469", + "5297371504744862733", + "11778134791720346645", + "9178173932649079036", + "805352162894700267", + "8543657448210339909", + "1494520765665291957", + "6299661842241371736", + "18322732549324829604", + "13697026499282496687", + "6742579179674614810", + "9192561142167108593", + "16760404269910090423", + "17084909007620793847", + "17019176378023898348", + "14005385966786621879", + "8526486986081407803", + "9149134770128702959", + "18376941538814941609", + "18188172305060557132", + "14256111441552491415", + "12102597079208698319", + "14197484483463488831", + "9352441798886934758", + "14966422578244044234", + "6928862090062467321", + "15475555002425222226", + "13330665493835875896", + "12776257389158308063", + "15137783532725589242", + "2284789390151485868" ], [ - "7493712615091807924", - "12491857401929433925", - "10111871645916240282", - "11415976748525453105", - "408177589817834199", - "5690422363399257584", - "8593239964078530854", - "639039436848320157", - "17238164273407330374", - "16434020659524772764", - "1287924983260899289", - "230770248779777096", - "14391616404120645134", - "9036242372314499875", - "4514687185114727631", - "1737202195093577234", - "6034759621517765642", - "10176134653378046654", - "12995007031609092581", - "16992014384559643421", - "11021740938277423157", - "10519188483118372245", - "14226854133953769650", - "6962468528418947804", - "16180858482840135911", - "7099715435791928984", - "4134681998019969821", - "13263413980517871880", - "8657533374449441076", - "6179940779262662031", - "15926791816600093474", - "10739932627304992062", - "15599738621195681235", - "2927484156163185853", - "1347605082279621107", - "6108170790330696948", - "15473960263479650030", - "5143518414553946628", - "4992696442912355038", - "16086423138265354341", - "9186094418133912634", - "6767169482466311373", - "11297555711973773355", - "10705132449646413276", - "2793343448994437422", - "15078122966847519890", - "3088180319862413520", - "10944948634438026573", - "10814092993125742620", - "15163370526003065474", - "9718993502920389954", - "11789767049000469156", - "920490169660143302", - "6876207450105325185", - "15184682997594627638", - "12956685301933657829", - "2206706000163988632", - "7378043093828655717", - "107195693157185644", - "10495635022214430241", - "7196894913799402200", - "7055510130028700374", - "998218436866547529", - "5720667116549884180", - "6479043832563497484", - "6675856232708514542", - "13614107203471826097", - "13607557298292942180", - "5042180370488439662", - "810152899379944940", - "1210012123603062387", - "15752372988373226541", - "10550492218160136659", - "6152387919175494844", - "3741418945685671355", - "8096506028933601483", - "13404236159397826381", - "17182268276005431226", - "9645698649393927176", - "12798524188320917586", - "756561952967938486", - "15821080163308692551", - "18377122036434598686", - "16152557350383201578", - "14622455126752022350", - "5135978779942597504", - "2411250342879651219", - "582973520676642285", - "18371912599299862297", - "5959977026544839623", - "4599823216899116526", - "6835496762514835514", - "11986905022165286932", - "168149493652025699", - "15056499665139150363", - "13357499185006993149", - "5486968673376220281", - "6763903210559055469", - "12947503208417000598", - "15429643499585574357", - "4535284461649960984", - "9155447436921832078", - "3390101270817022966", - "14361575279545797223", - "17678455481009512511", - "18229277832294426980", - "15428781695718378259", - "15199758281362252903", - "7514122676504223707", - "4507842963483967880", - "13183917044320748698", - "16282671240206216175", - "13091854783274460328", - "7242898935607183237", - "12705386195831576516", - "14925710940990721924", - "11814636084932757123", - "15841147339449629698", - "18075963098244948167", - "1516191028595140457", - "2252273007191928687", - "6411127446485803024", - "8101415305331077638", - "15103208649195774187", - "1511676851469144933", - "5486635014123043256", - "8977058953237432024", - "30007289978188568", - "17745417624027574933", - "13479328013552572887", - "4782015453822078956", - "792315533213745631", - "1639038727204758500", - "11182696329503535227", - "17132997735759785152", - "8562034892617489548", - "9548762849318410251", - "14803893036248380424", - "4527536889559534073", - "12011007400040290724", - "10196659484172842939", - "667790015456892920", - "12925489555329803241", - "2629278296210726370", - "10029477269416352404", - "17727330188856026801", - "10992264961087475124", - "1928832090413071190", - "6416677214315011687", - "822061200227652982", - "466741207293311392", - "4729312932469561312", - "543548293272256628", - "16478371323299276753", - "6995579892281376624", - "6605215391302786330", - "10006921728365990370", - "8582305582190863029", - "17467506422497681404", - "7180707598131289471", - "11468643715642381932", - "13051127833960561498", - "777383375687737185", - "16780425818318476010", - "18188685238212930669", - "7589374859380068839", - "1358511365239494364", - "5706748431856073782", - "3724906797086275482", - "13634293741295223409", - "15874499083818509117", - "18288977236082298222", - "14787691328165508417", - "553800680119265186", - "13934281162270639121", - "2517210270956136245", - "11856808273217757105", - "6551434532322277436", - "12348483583934980910", - "15736771497866685453", - "2564179133701215202", - "17526924060645695579", - "10479333763566955972", - "14061836694593168480", - "4698279880334209556", - "9167501397194504918", - "1461586296418322732", - "6383921047839772962", - "7932914837256567982", - "4477395949186552874", - "3210124559740647997", - "2237504911340225377", - "9525312516555335186", - "18415896919208671272", - "6578597382158845273", - "656634248125025738", - "12791656968653901279", - "17570009689693723224", - "10828167620798924939", - "12646311072786803424", - "13067210938685542336", - "12886345679221280362", - "16950731504027258938", - "7994688633428627662", - "10832719185154300910", - "6553955362718264419", - "5627538529532123645", - "2162842280016909432", - "8851773066610436125", - "12423302490659802252", - "8435305693985820815", - "2677355472531293824", - "7387093257197192127", - "15033100579315731626", - "6237384218815574302", - "13711513620666305297", - "8748832911496053752", - "7851941548488037786", - "11128897598490629360", - "4319652234188276615", - "12772105429442122171", - "2016297297243206594", - "10157550207877285100", - "3132511863832902428", - "1479774632203537218", - "6068851279853148989", - "15563768705059112383", - "11467078414449555590", - "3798979209833264423", - "5614940062031757799", - "4411372841562942093", - "10920875328300712303", - "2979641069988536939", - "7749139579493925032", - "2068137417043739547", - "9843790133318350854", - "1030683462852230754", - "8063003646170356719", - "14980191434449704899", - "3920098142356119253", - "10810177120261609298", - "18146046991522245058", - "8014367686969541879", - "11445072481769026883", - "6499863983066801134", - "15087033904318313252", - "1182866707018495522", - "6959661720543482525", - "14624581579462995795", - "10445646871326644347", - "16984638666749737612", - "2874647325855226377", - "15251651115295035707", - "17866309005393575454", - "2265968357949147757", - "12235105108505831431", - "15746408505287705069", - "15664810744824724567", - "8799193784126002007", - "13226133377062859987", - "442678767381428577", - "12809447202622678714", - "1475277108346348043", - "11463220567308981902", - "14948744674271841516", - "14414916648546603906", - "2675293357852891183", - "16856571903345836875", - "18414962728617961073", - "10353975783792728757", - "3366574188095576759", - "17530315582208739251" + "12017625029099818674", + "17486718315925220358", + "12847372041788051996", + "12360825048434387606", + "122884340826905705", + "1264890667896138687", + "17980491228730305660", + "12467400694185190869", + "5765358541690514935", + "237596213927763152", + "13191127511547652461", + "11149031140667635882", + "1102027112595577541", + "994867259875222670", + "10562135422258681528", + "5688015336640302643", + "6133718173299921256", + "16376075962911341141", + "11859053022737592533", + "13507495875781099117", + "2961599266394693836", + "9496303279355799355", + "13341131790073288881", + "729145151253658399", + "9619477511604718238", + "4456806585778579613", + "13955543230828110386", + "12093760346057370519", + "5870798971113359228", + "15401810531604907430", + "1043986477870583489", + "8816952545528800809", + "7845357496067495912", + "8448932076676764776", + "15529354867489452822", + "16950472400976914171", + "16007091911549587472", + "13118554369889564866", + "6058548478600602184", + "17833450282571309161", + "17180902660257361839", + "6738643123082173263", + "15282311444002008980", + "6313695348374390022", + "536993159022410753", + "9871384976857852543", + "7764263462678855462", + "14797337393402637526", + "16662411697849363935", + "7555852423663508117", + "6216878660996326890", + "11321630916726615570", + "762718930027446585", + "5313890318981962409", + "15228099200541001473", + "11737800407198808681", + "5275079775266262933", + "2296327979893450685", + "185188542134967300", + "3723799701302761092", + "3602866464992859054", + "7854583315393479520", + "10702525517517067881", + "188104238080663147", + "6044390884554155568", + "11080584613584794307", + "8285558779773954520", + "11103933168450322836", + "12055690351171133640", + "7098004428315990295", + "6407355297623245047", + "15010108947115395141", + "17233817695699501410", + "8412661097188555258", + "14608488439924673319", + "18401644116125180485", + "8683966184573278481", + "2550098815745922494", + "13428483113853121711", + "14616448641911894283", + "9116892066997031721", + "10785932736787345972", + "9080738947067241491", + "6290278255907999754", + "12373854046521521147", + "3979750257712079865", + "6041208115484561650", + "9500671245351224465", + "16166379522927721134", + "14214908953190455752", + "15338376858661579527", + "12027999004416080416", + "14819874836535774933", + "2071168104021869436", + "6025812911031847162", + "12583763293862102684", + "5207736191520168319", + "17711613544155149993", + "14166294729154244612", + "5232856944019118477", + "16086510806423983746", + "12851620481125518168", + "3289046951081425238", + "10039483630583828602", + "1489561660964379351", + "17564759199534906353", + "17383872152321370001", + "3487504176747391617", + "15731412615228736626", + "2072493690147564517", + "8605098482460448974", + "9921541595400044952", + "424129327892108795", + "3285929879959540910", + "7437382031937076625", + "5479669986318389379", + "5260164897046992418", + "14116316534918946609", + "9894601256607198433", + "16169288464813246535", + "2353249215811254025", + "9852089892637934294", + "15512839836653937395", + "5532248342693498150", + "8393386524452840119", + "16369123372514235473", + "11734570545176986197", + "6362321921074044218", + "9888848053258169796", + "9833313237208687066", + "11746785118733475124", + "8175910929249855113", + "4286561012017699836", + "13087971562235969113", + "4712216679215088054", + "4941248230927727252", + "9909323125426111551", + "14046173844220093685", + "16661993277513588861", + "2437619091529611345", + "11825022827123559028", + "2609452700812769313", + "11291357937971054214", + "2113742860765520418", + "11749179440438995436", + "9354232891097374716", + "2331441498360875123", + "11626937846030025887", + "7223754912518837932", + "1568963192741459894", + "3745813681991685246", + "7030161117431038139", + "13936340764117604699", + "12835434257555512081", + "130907557941814097", + "15648898067110203401", + "4003678168264361497", + "9149501976985858100", + "13601915650212150348", + "7144072455567910055", + "6188407428972789040", + "15654759913260335245", + "9501679188427499607", + "7297385907913258206", + "8690054461169120669", + "3780890074515318082", + "15111146134270768847", + "271103743558623756", + "16725284165565988435", + "2336827791801392501", + "8302999247289737976", + "16661297263591000307", + "13133906132760166016", + "2242451677105853835", + "10377686114014408051", + "10452740531838615374", + "17703471258647088150", + "323630199913281573", + "12105932633783584310", + "9999589332161281209", + "1056798390291339324", + "17555728315371285061", + "16907691922314399070", + "1122139522525847724", + "13355072559070208900", + "8653757804513073327", + "11354991632648548507", + "8883848680540844064", + "5556836190981873609", + "2799608835783626213", + "5377432174747094765", + "8371832426166228129", + "18382995553815597403", + "4018393522187245895", + "5389594183911834815", + "3205458474862101459", + "9271092709498556981", + "967682072619264168", + "385150177019679406", + "12996797333283024665", + "8314783359480018618", + "11048834269934988394", + "205539662041632759", + "6843133744818470915", + "16951670648923627312", + "1939362047069351204", + "18322294951048475903", + "6037708900947378000", + "8093878211704076370", + "13453052688026950068", + "7433093979290926672", + "12431943603173108699", + "13232891431818951946", + "17176835337636283801", + "16541607421902308936", + "12328338306667386939", + "9007217472564093571", + "11251038220025432040", + "2342642515199908600", + "8549152220180256081", + "9568398471297245699", + "15453452711010574478", + "2865390214021886299", + "794826484664539795", + "14109768407654156945", + "4967050147798544382", + "6095427350160803366", + "9367982551995844642", + "8874099100551315266", + "9874293365090497497", + "15694230405225713323", + "13659074363280572245", + "17620064835388612874", + "18381323152117641253", + "16869403338742400254", + "15026845793713065825", + "17439034621663482375", + "3265919399694571079", + "14294726606883718182", + "9215647925924718854", + "12075236850046771132", + "2699967823403197400", + "9495217762843569526", + "2707639863073814476", + "4087455349874701458", + "17229958913170016940", + "5256424997260829334", + "14001591154508682329", + "6237531853147540912", + "14721291558835368286", + "3255964708659902367", + "1892348570212644082", + "11629406380855304326", + "12955084960427257646", + "6657617132408099909", + "15910918995295162151", + "7745642678545498785", + "13783837825163043779", + "4215302262095554562", + "17842098287287877084", + "2337323454681684604", + "8290135709912709600", + "224630850048970371", + "12357428296130424951", + "773732249676959723", + "16880349039404174260", + "5160630569090078137", + "4807728355967076475", + "14790872090789879589", + "788688464803038502", + "3317743297408227198", + "17727442597252529924" ], [ - "13329159936392679574", - "16707672887279884602", - "11648916149405141432", - "16333022378488791080", - "16636382009159196903", - "12969897121038836305", - "6218582034209851693", - "12436804614953829016", - "1448942295176403881", - "7906089311574917436", - "7077369663959714716", - "9723546481481173555", - "12027740066518020158", - "17874640613367515689", - "2963378718891252156", - "6520535730276874496", - "6997686658507735832", - "10797936614608523923", - "10187001870237869763", - "7881641342816538617", - "17222844231361409798", - "11582061836440775085", - "797755543105175530", - "8626833030205587640", - "16729230701973440889", - "11768227024552352578", - "9940169958104041990", - "15115954820673438459", - "12392184457574014018", - "14403784693182981232", - "12223123032351049310", - "17601128668535242481", - "1787425967587704517", - "15920523285611033602", - "10594096521904196414", - "2741452877452181058", - "6335972448773125801", - "10936263638638655020", - "4348937291011602107", - "10750946372011080689", - "7044430913928487691", - "15831650874201919456", - "11005490183243863650", - "7257604834534410238", - "17566129329142388050", - "8957928484543640868", - "8106473200619315775", - "521010519494488400", - "15080835044229566876", - "14295636299686962076", - "18165839086537400743", - "7446414459132770060", - "7129661349711377193", - "10560077028929235570", - "1967231945765138353", - "16587435430069779672", - "17476603831932899840", - "10235737596778626854", - "7863324653341199508", - "10458012995554838936", - "14877670349352737161", - "10482440137204162794", - "16757714915893129812", - "10377519890042862427", - "14555446271428752561", - "6753388897655357506", - "470947109908765021", - "8684245041550488132", - "14031537097929488997", - "14727077005812863696", - "16198395616811971044", - "9714219483721216981", - "4385986189869083384", - "16608093413934965866", - "14576587989036631674", - "17288823904549686821", - "14028590523361814237", - "14920134241717389482", - "14205942735358554594", - "17833459573905913840", - "13542715191480265530", - "8856562901607138320", - "15056603453917231889", - "9221156829756668930", - "15407303038224444148", - "8387556028875754517", - "581254133009288111", - "10296301696289317465", - "12326213586064903111", - "11228972081928652312", - "6273069288053110521", - "11684936294732227666", - "14969396938909364893", - "11728945125997640184", - "16655597484819942985", - "14395769016687713295", - "4871788797638369814", - "1097455520228692741", - "12520401099619610788", - "1379755230382375783", - "6388438518253044742", - "234002024957476615", - "6763748771113401328", - "4003000410268150455", - "10876683454495384347", - "6070532632487395823", - "17594790868976286287", - "7569322031431566673", - "17900763490349217180", - "15102184034741700747", - "12105869388062632264", - "1778050736739529755", - "6220713506838664509", - "12483608649588579951", - "15696437081734863284", - "8196913155295169961", - "2368795681915302847", - "3729678341431248200", - "9162793911831421031", - "5679490078898494094", - "5270114045281118062", - "4474081944957776602", - "16478699977633370332", - "3635474475581161187", - "3577921853850340959", - "15499888930585975773", - "3021399935850573878", - "4881268722435947086", - "15233924798578648041", - "11084645468168015652", - "6109877564080574359", - "11532577183127756904", - "3190005063230214988", - "10112102004563836520", - "13721469168734580496", - "11328817001171483738", - "17623666125062241272", - "6405552187135991453", - "3050225029049962399", - "7846182345889581038", - "17723627253582423004", - "8239545933852943515", - "3050474762816909303", - "6048770181730570593", - "4340483299348618417", - "5771975854369952366", - "4189751055340937209", - "11607678024812952173", - "8500468858604533392", - "12894322627536465563", - "12533055894263594844", - "4741233032750961771", - "1967252284844905959", - "9862597195827545299", - "10454698359797359573", - "8808779430919147673", - "9903430763867290673", - "11624519616614702020", - "5340869559973234724", - "8318752964880702308", - "13710244887887911376", - "10487815107443364937", - "16941628439854429184", - "2152457175742631151", - "16968268244120125557", - "12805861151360880493", - "159158214755461693", - "10951420301993528367", - "6982307178085698446", - "11256850000920452552", - "7002093740701428318", - "3727133681616508939", - "5800184999155595067", - "15430305782117828746", - "15145401563504772138", - "13735616916838909558", - "15599929276123586757", - "9097586068250793839", - "9721297850418795270", - "14388503735553321246", - "1764357627523073038", - "11605394564131385536", - "16750346945687301333", - "646634582680506135", - "3740482857561687130", - "17620146631644080405", - "5316955640110484000", - "15272753107593799563", - "12820671408469695639", - "5309973028375003542", - "16339529113883130466", - "10350204014151551699", - "16737690955354343071", - "13462503974907031270", - "14907510332697607768", - "16238173823524824772", - "7662402603319971965", - "11351383072308104618", - "2897056032580371810", - "17438567693933503218", - "7955494714327134366", - "12597559886546428033", - "2135445315893801003", - "5312036228587682068", - "6847045889948567658", - "16231149688171572647", - "17652510218133820796", - "8900301828219526170", - "4231856570261866093", - "7791655338234069117", - "3772885423972376531", - "11187320806169570340", - "1946259532650942153", - "3014581906096601970", - "14627552092122411556", - "1338361361488641918", - "1123998678652076478", - "7644772784802734309", - "7098230407765069273", - "7406413077655225902", - "4329716335861283979", - "18274231368635500347", - "4835635216729529406", - "13519389842408694885", - "14861151279415338904", - "2494109710010431582", - "8293812494848280960", - "18426004176010318230", - "13989626892849481316", - "9228061226467144101", - "8888441345126853051", - "10979255938545013887", - "14135612566512406543", - "14875247855406865281", - "5039794511576650430", - "3037829632038055740", - "14927028412547681926", - "17168070591316391516", - "9302934645434138039", - "2366323210395183083", - "2280588210332426948", - "3364107430753042424", - "1621374833538391660", - "1298645850739810943", - "12353098943585263969", - "6326886690111696470", - "17559011606992264359", - "5284400903780616746", - "643633600620352473", - "6434031042188387802", - "2505049689167188437", - "3681968637690118989", - "5167777514606825478", - "1082989775720551304", - "10322474457481783536", - "3574287151566024726", - "8640689161757216134", - "11908570416500273759", - "3124722376406911947", - "4341280687070832436", - "13556239523828980071", - "2786526133064916344", - "2021282603560814447", - "17944115911896422039", - "12005773979483532778", - "18325585214598309150", - "12888628453695877392", - "997771217784491515", - "14951234362140303426", - "13429810296299852674", - "8141209857337757087", - "13451152287401078912" + "8744005135955082337", + "251483963814661606", + "14202837594698859359", + "14791494707262529214", + "14511825637517029567", + "6724217479572150845", + "16023539466179747605", + "6134787781739209961", + "4808523012621447175", + "11599830263946503463", + "11244455385603091284", + "15411145805402368086", + "7496198731367799823", + "13851968937104200706", + "7622523569731896593", + "17722380974909336022", + "15365709201435146209", + "12730468572335038136", + "3309079098545885845", + "1846245872778800698", + "16753308021675220354", + "5413986838491456119", + "8542378777305561444", + "7570768352169273063", + "13367689581759741409", + "11939976276716755067", + "7271426394185199560", + "7467387544892111125", + "3480427044818154088", + "5844685632792548125", + "5677236693886567593", + "15420908246443152388", + "12771237693875271136", + "2973660083689914891", + "11399101768873317504", + "7404849714742211806", + "14261417377979655660", + "1791862891640982047", + "13408348418555789257", + "7985955873708594518", + "5482490613161381402", + "10310803179558379250", + "5819599720936082272", + "2107604835167309988", + "8509116624980532499", + "9435247745025479360", + "3550550961166516903", + "12960692484716634499", + "11355924637549646720", + "16628243133730656066", + "13591081846226774795", + "16917379061844228350", + "10340343877301328882", + "7903223059506971392", + "15077210675624774195", + "894075744543175131", + "12067744341340891790", + "5766908199535831162", + "17428528104794580858", + "1997916377830635487", + "18072813472106781241", + "17479354805512113361", + "3657096278396504916", + "8955465963553412000", + "13586817497798203441", + "3278194542619839252", + "17544446719033239800", + "17403902620812594452", + "2970968446994509776", + "6547656470987028275", + "6489966470072843059", + "8625490069127071877", + "12994521471555482600", + "9289178734017790262", + "15418113089607491171", + "5157830317998366011", + "17451592630345673232", + "9135549008271895440", + "13837838206574618779", + "1175552321700337822", + "13124802440696107414", + "12353997321429990391", + "8944880787469088849", + "15376127414114463421", + "11564682525106064717", + "12470814587606141091", + "13906680471712681114", + "2941849808783415912", + "5350061963074274103", + "2936360243197111962", + "5409710825257575610", + "9191248008224150600", + "16152013051537532385", + "17240844107620989662", + "1544384649881006289", + "1898638929659277934", + "12069761715503033419", + "5202082697886611470", + "17001675380913912698", + "13917424545284939292", + "1678171459302835738", + "10092164761649412518", + "8605250247898932637", + "13815466402202691514", + "2193282501604869674", + "17362902991888407175", + "11124621092363653269", + "17450689177010150826", + "17993743123953621", + "11217806765200164942", + "10491366200434933273", + "9406387782357827835", + "16613144264165284234", + "122774513434145729", + "8768481087219214333", + "18193161183723806805", + "1115851144979501686", + "16960221382284547919", + "16245424458577114889", + "831434784169601401", + "9103168776556713771", + "3872175504760248428", + "14152049126463549442", + "3873328744499907736", + "3602171123119596666", + "13452082361235267221", + "5142963251174282550", + "16172540098044656139", + "6328885194571092035", + "2693151013771622657", + "4328177943213846307", + "15508400443980178214", + "9590489598233526384", + "4865710029345679069", + "10968043661936065711", + "6647255779609445686", + "11110726165032159844", + "9767875550770715006", + "17927851773581290188", + "2003905476664678211", + "6273022980134055188", + "10467166022743799656", + "17312635889221780960", + "9849234132441864009", + "7744236476227738209", + "40014734921084884", + "11705158090904286221", + "14717040791512362763", + "8649998733650536804", + "13785611171130129152", + "15805725358830773674", + "5225767646438394967", + "2010549738898308349", + "11151224001843270843", + "15372291097106187632", + "128774815373750404", + "1929302074796802880", + "13983973025101306028", + "12312556114891197135", + "17690061417644599223", + "5068451832967151650", + "8297074352734071396", + "5880702046353438312", + "7446616570014902825", + "17515970557878885791", + "16057077844433091983", + "2830086426422857098", + "2322397963235166711", + "8751470795563039163", + "2552672472825590226", + "13074257995688622447", + "7358404526404062036", + "13200299744351219950", + "16258718469768975685", + "6587478549176722390", + "607237605899211118", + "1387347857826351247", + "11179638247737802319", + "11683375826807237697", + "10949555903253320968", + "1857927134089218934", + "2441348006034210402", + "11790256103127101461", + "10191160472057464635", + "17066293590102273975", + "4766921100555232914", + "16013572752567516908", + "503436171186765357", + "12991666131771928763", + "3255281924794383321", + "13626527613517941470", + "7402187589643228491", + "13438635033702530141", + "1396334584563435442", + "8905353490495425562", + "2976615041544181434", + "5921240268091451399", + "14419636606872104095", + "5567831397806338650", + "12831096160852792922", + "12911026196636044092", + "321541656320458212", + "9908645598968848458", + "815158810770549848", + "8999355743087393076", + "13565241200515253939", + "6609729829132801482", + "17646850917989188970", + "119574486102906583", + "4465507813224483040", + "17942854832098244806", + "17110610066230144373", + "11716898688290604775", + "12067102468684839523", + "11871541348832006038", + "15432614971466952248", + "8527339148175531728", + "806329967820593179", + "3856824466410342833", + "4971269165834779425", + "12334231177364181222", + "3366444309180916739", + "14082534397152586286", + "4052603988362853158", + "16148869389309097851", + "3930947707517039785", + "3065443857552454329", + "11756768904231414313", + "771830919682497575", + "11863627229041372674", + "2777936428039066218", + "698695992093829011", + "3465233023508521830", + "17574281090796172487", + "5755296300016638287", + "17057903781340266219", + "1440448783293532329", + "4561402078714085598", + "12249705476915146559", + "13569904936847613573", + "8960240163601636084", + "5898107479503897064", + "3090300724437004555", + "13995306326096583704", + "12380347059387333880", + "1936438416201638229", + "416984499057208500", + "7775558546995135516", + "13316356547319253613", + "10509799381865761634", + "7408053149476684692", + "6693024528526498231", + "10061924750808979616", + "15468153469227095473", + "525419952474717048", + "10694629329678014172", + "3953233969680722780", + "7660250118374585811", + "10831206013459802694", + "1690376973692086531", + "2734447349785823978", + "12173102592194034576", + "14346650473103157841", + "8203986708205869295", + "13439683606851684485", + "8113231142936361845", + "3912335940833450625", + "14886688820902395300", + "9797511127498042653", + "3815529379332002556", + "13266217146040544903", + "5586939781401250746" ], [ - "15284564651893843631", - "709149263278622309", - "6000907418993900521", - "15578062466232228324", - "8673855770155117221", - "4631283024171755654", - "17499341332890478180", - "1569554787394817421", - "1490442176570342165", - "9517839469577252755", - "16815144443427070438", - "5684816298180973177", - "16130464798401046913", - "4947709762955831136", - "2555553274136502762", - "15128350441644074451", - "10052620657111920441", - "8691456108216287473", - "9074264330506273241", - "16573348378796049503", - "8075607066619011981", - "12184944668463316697", - "13746149775234653909", - "2251286283340353742", - "18360032995924029795", - "1943908174707763470", - "3721083291904490764", - "2963357705694839257", - "15209654239898776487", - "10243459378829679067", - "11589395767301060021", - "5968463507859824553", - "12106005975235764579", - "5671144641741236919", - "3105353237728330306", - "18341039120942005031", - "14090319605710819755", - "5832854094991690084", - "10265964554108153631", - "16123352476365476381", - "11533794034821022069", - "17328277470468612987", - "1490472340769259028", - "10407664795812161080", - "10587754630514258220", - "4559530248796857690", - "14354788359397844609", - "16477297183122379583", - "9312850245153757272", - "15507345458530915304", - "6726547151472182347", - "8463117167694400054", - "4744051472240441022", - "4076951763654347633", - "3738726051871283734", - "4969649854632744295", - "11262945699899231811", - "14850669260807228657", - "248141915501868629", - "3567698975733716528", - "6814085473409693867", - "9401780503032433880", - "15088294762149020722", - "18309801491658955900", - "14512678707650855075", - "17343172839684257397", - "10689670630212562156", - "3978959520474077367", - "411424940288861537", - "7135052655049916060", - "5203332077999073945", - "9111455520876907514", - "8789540745653183734", - "9576308004239485745", - "8785390606992240569", - "3040871570632901031", - "4392001102632320474", - "12701027747535827631", - "17669134657155735407", - "2508006088930399369", - "3865558491214438653", - "8472329755310529729", - "8338584834797590413", - "4021025304279293723", - "11803846135081497064", - "7100363465151417217", - "4875174814978276462", - "4033328713980738640", - "221212391468663350", - "5751401480176387160", - "4367637862431440254", - "8186512709031245398", - "9983569152970899230", - "8834507393719557879", - "14829626176094557414", - "10561178321823410311", - "5939382201535829865", - "8961853088718890290", - "1153733995984359621", - "8125762051262972210", - "5476552836176275506", - "2301073877360468243", - "16728449720207083457", - "7231299329756463863", - "6575328704773112980", - "6189927745943154899", - "18132769415380352192", - "15297092919037540849", - "6194279616498517256", - "8082447145795419532", - "13406306077546664621", - "17838839974823895334", - "1855184838530753229", - "16249504228466291902", - "15672232783942870785", - "4546453767031945949", - "18106024852507643977", - "6416374386694266073", - "1665462200740408556", - "5485431247792237684", - "13918672273366362731", - "3566734614301186790", - "17329419866043294951", - "17695089450912477892", - "4665252911900309757", - "4404472705916953016", - "12585694768582182921", - "1626031448200576407", - "8845705228371493137", - "14502714156028189586", - "7388344461472208507", - "6779471952691602134", - "4038151571358770554", - "8844937802332325804", - "13195380181205685347", - "7868244869991102104", - "7334770055910773639", - "6932449578060667267", - "12218202330920444954", - "17284732381705563769", - "6182525282139573146", - "11218481326959058808", - "13534367046391903465", - "2787254686103947823", - "15220074213827762908", - "17642837778732696523", - "9169576471633960209", - "13994455297029802675", - "8938410846165422553", - "16754871334712913966", - "16416065893427975511", - "10574710315997050688", - "13104387351597420643", - "14783691967933310574", - "7544151137513169691", - "17550583114866676602", - "2818457123727847586", - "9683690410194988753", - "6041383516999205036", - "7372467275155533070", - "4557843724199612636", - "4821416975990935453", - "5511001006297100522", - "6774802631329261106", - "3351881541651100391", - "16705431911229531634", - "8301211486648962347", - "3036442288111492506", - "14094832590672474775", - "8859101909229346093", - "3748556683573323404", - "3587718468533527565", - "3324192514281327345", - "17401810928232547863", - "3229305853311809568", - "2574918517898334284", - "14212746474126952507", - "11849410815991382161", - "13537564931161944133", - "10604075148868298831", - "11559164705970362935", - "3682397047739735314", - "322382643140343974", - "5247278551534403247", - "10473975361048885034", - "4099081729039326528", - "11419740142624154783", - "232369858646000843", - "3609593863379380919", - "12927023521603576514", - "9817651223368521769", - "9057185953908500050", - "12542978555646201403", - "12532324032109568445", - "1285028840395271647", - "14008796011687208534", - "8510258243114628199", - "5834619004988674897", - "16633931831992836611", - "10983610888915615235", - "16831690606486190478", - "18187276621836993363", - "6647958752019999998", - "16480059931076868129", - "6269823875829025909", - "460273881712015284", - "4047998336847102562", - "11883712386550416969", - "16226961655537153640", - "1290977940790067249", - "12291487141163051412", - "1851619911521811947", - "11759925668346825062", - "17923108410524371812", - "1580848109441470087", - "5267911231737518483", - "14599780468176866402", - "5953342747034134307", - "9093271253558613059", - "11990394709530360388", - "6210056360752657928", - "13209421064608705090", - "17499031144973532881", - "2875296522204337078", - "3811697760643158225", - "1377294503404778627", - "3600813485643103524", - "10379679332054941378", - "3537678644825983336", - "6607112735071972722", - "14071427950972821271", - "865455860203584967", - "5520088569831704533", - "2366996265784510204", - "734722879437060217", - "7194214203060812394", - "3892632693396549314", - "16911051410455481665", - "6112640638447787412", - "68053035675309601", - "5722373678758756805", - "2601294493867051885", - "14873098543413277302", - "16297693586258606015", - "1618504809247150463", - "13680843457235273945", - "8992821216336946636", - "2101410463397575736", - "13798536330719775884", - "9051988849710907562", - "4010880974184780592", - "7545248984163170836", - "9596925705383457824", - "13951143259694635934", - "12815555741273605466", - "5864033336376232530", - "906609683739028221", - "7705636002793685543", - "11941520200521871917", - "7277958639657768662", - "8887687348635565047", - "7892996449945085510", - "4705840032428686921", - "11734957710059213401", - "13241920344428987475", - "5149170821521062064", - "3678263541578534356", - "10345625015424527773", - "10495312940706097959", - "16790689156194764695", - "10458919115267892306", - "17976630607936768011" + "11218193421126644322", + "7792452628284572856", + "2896067243138471644", + "7597001953055881234", + "5580149978967148027", + "4286625375072035347", + "16471546673559947247", + "7731508307914667691", + "9462062564685558244", + "13259725126735201316", + "7977308091493668126", + "17683480159147008059", + "6084795114971354009", + "11581977414858483029", + "9614382472844276975", + "12430067626739666782", + "1221536300643128358", + "2632899595656102428", + "404681320193237480", + "37457612938867375", + "10948525364612440009", + "5539489481038107767", + "2661248744481677166", + "8617324375228718506", + "4250387891684379666", + "5132378982167183367", + "7313190637575770508", + "1515552437452120101", + "9707586020097864058", + "17887562877161956290", + "230129079931659522", + "5426418058095543262", + "3979980527586191890", + "11441420518439297813", + "6861448829752117373", + "3622988975768747956", + "7543966239630463943", + "680804244309771467", + "13348554768467842010", + "1264177338966512555", + "5558760359850689160", + "13971139923492731428", + "10702657168137744475", + "11428432658145897658", + "8920668095442256689", + "720659835908703361", + "7705698396728347071", + "16899252903877717577", + "7416253334170724472", + "11698196649368795779", + "12489977718221002170", + "7423667668304168933", + "16577329663443191984", + "7627625889189054823", + "17296282049297664477", + "8924155790834444849", + "12585674741236295736", + "8079173155699190857", + "9296341426048322977", + "5835792391345859219", + "3507016411643693269", + "17458410493705792870", + "14183659095191082260", + "15163823579964007904", + "891886780800681172", + "7636181932505210002", + "6378654092108480091", + "15823278672214352263", + "6485066281603488917", + "9607103180977698468", + "12642563050292107818", + "1203511609872494848", + "2278614324875186463", + "4232379165517107350", + "13344237858294678274", + "1257828073995564783", + "4693512338761646888", + "5724834001003361866", + "6493011904568586038", + "11215832154075729943", + "9139095109291329131", + "11146534891172027579", + "3743084325705726483", + "3735687133917561805", + "9748417969699433970", + "11906810714384110214", + "11369156979402832342", + "17300552336886383349", + "7869668841634638025", + "2112562711931374615", + "8437406776776446800", + "10356716928722193854", + "12238392152749580583", + "10833698701064841269", + "4825653296941073308", + "17323025709239098728", + "7877638313870503822", + "2952181537692971342", + "15822320514526458955", + "10777828745927309966", + "2318177962196613463", + "15609514513850425668", + "15708393433751855726", + "10966198052513733281", + "16802062365149071915", + "12836257093196058129", + "15847452056438252922", + "3906316809629775388", + "6828136725090134932", + "7983350246457779475", + "4222509256152920297", + "2619369515282154738", + "3774830049072392283", + "3743275709735472845", + "312665165859902807", + "7634002632704497557", + "4631268735070231935", + "17912267531279133460", + "15910457694875078721", + "17672858862183629043", + "15285988526711303919", + "12249658678149642486", + "8073649869709838635", + "7753339847272403543", + "6761875272113541434", + "5415971208222780707", + "9432873625865433353", + "13781574447556296530", + "13864172971374375246", + "6413945152020063257", + "5604497002376425305", + "18424728140742081172", + "14730134608610955427", + "2659135576668233924", + "13600813925857617815", + "4699201788651102694", + "1568570653799510340", + "16686884146013450422", + "471357320476651431", + "3350976665997787560", + "4562407416177542655", + "2919066781559846165", + "11975986196101080827", + "15245364370819257455", + "12146858847456166447", + "5809637432091483771", + "1208458630373901593", + "2731440303760878989", + "5181169661685586907", + "18236789085803961359", + "449804428031827357", + "3377174974766206352", + "6086989459879301478", + "3249216209401210022", + "5346656803730904326", + "17055329183591246196", + "4970180249008277235", + "3434344862816068017", + "2343787810354598068", + "1411987929084302258", + "14827941268311317622", + "1669858337258393461", + "16772274302978112245", + "9144168313452201723", + "15354325788889648888", + "7120551455282899883", + "11660281881746822961", + "4068873667800739722", + "6743437536516308015", + "4062643918540897947", + "2729566390009066117", + "14807833798993968695", + "8260698814454591974", + "11069568308377451826", + "14861908428940898092", + "5700699700805782235", + "7987590946323618705", + "6850905356604777950", + "15044601918426549375", + "15301172443130573853", + "17843352997227998021", + "16557983860255530473", + "6507279901191612404", + "9043323683663872372", + "12799972921959547454", + "18121534277939369278", + "3813763351832649021", + "4419682323944469695", + "16415125737304033259", + "17657994005289981470", + "6588988244607995472", + "15177495174604471096", + "8911592659189386201", + "10271974759995305606", + "5860545128443517800", + "3942708342414963808", + "4693797355398119014", + "5257300159518949156", + "1319019243788910278", + "7274283329470904020", + "3367727288581244180", + "9492952471310094521", + "17215067205155686670", + "3234203695023177905", + "15258670935540583638", + "12817120984123651567", + "1182279004344460170", + "2492821095068753698", + "575111954817069614", + "9049785904845686179", + "1391539235267279515", + "3039601359029661527", + "664221384738832548", + "15353063684532069832", + "1515321189533845935", + "16560121196317030264", + "2436712693284733895", + "7357099294483325740", + "6128114190438557533", + "15462006509329189461", + "16771139358775714712", + "795077825785747011", + "6252008518198281833", + "8453047100083519790", + "6690651583282295944", + "3218489826403563228", + "1432658175119226676", + "5668266682649395104", + "13418614519122212826", + "11562298724730733626", + "13365807736929158672", + "18236622070335961349", + "4263198445448254092", + "3374757488345541078", + "13762050840911318896", + "11043087424554943045", + "12116550020487160134", + "7247067580824014262", + "5651970556028322318", + "14697147511997982883", + "5192398670039856351", + "4869750065625976903", + "10792430689068227155", + "14644464522718590728", + "16851860267089192198", + "4976144533541812066", + "917632611510189627", + "16798488126085604240", + "6673530858451152658", + "18435870881509137783", + "10958134634280424349", + "14438142148961476888", + "4428562502559694323", + "8307324221931060387", + "10470177210928326259", + "1613443942660533680", + "3764731473679770312", + "9588947401254276216", + "14322784448505731980", + "16461290520773057569", + "17019485175479435721", + "18370280313676359711", + "1033145246557203908", + "9230111833031110945", + "16905151433441107330", + "5314199896031266878", + "1225046097070445165", + "8087412792654807264", + "7881292984955242120", + "802904254629807249", + "16110047143488005547", + "1429214364578404202" ] ], "merklePaths": [ [ - "5330780144421818680", - "10515881715195215980", - "14086070973614885917", - "12566237814497071553", - "12600862601330235800", - "16883069359742529159", - "8892090350464194651", - "18063993943612043165", - "5311291670006812191", - "15014712300081966637", - "6247459476648333675", - "10104646648686978290", - "14590900074080443934", - "18053311515868340118", - "16080446228042512111", - "18400926785196826969", - "12083795083086343610", - "17963623608025901521", - "6100275558897678810", - "3794640635371141309", - "6161717320144789157", - "17784817362554624501", - "15963755681525719569", - "10393778629921092069", - "8316983105621921967", - "4981877206303856674", - "17057007054052031180", - "11297946758299308187", - "16456211005317408269", - "12627276095713059650", - "17576392602123151074", - "7641438746184019831", - "2572717977553962810", - "4416719756262058031", - "18281189771898274853", - "17323927343283798563", + "2161235504550375078", + "8739799765693317688", + "18062421014020667262", + "16704634182108168579", + "11158310461195477164", + "6444510518490750556", + "5583383416515229068", + "13162608229104337588", + "4153814091094073539", + "14345325643098171799", + "18009453583041008536", + "15815374898444996830", + "2084034563179398009", + "13941734558655493079", + "3172366607027067072", + "3310446774942415970", + "2291296402972191426", + "2472442737522306308", + "2746148102504115251", + "3613669447076600600", + "13765237882962257475", + "3441758318990807046", + "4629493846434083628", + "17365083892108053327", + "328516970176102441", + "14048864760228069850", + "4423145843662815999", + "11955184352497863799", + "15388066575475358437", + "18363052404761945239", + "17390091486386993643", + "7522845619517884018", + "1215641541373126625", + "785310925232133191", + "7746058395377257201", + "12113916930291299146", "0", "0", "0", @@ -1558,42 +1558,42 @@ "0" ], [ - "18186445722825051390", - "6376432698137505314", - "16766885043157617950", - "16243470117439592398", - "976898549315339138", - "8880088124297368485", - "448116158486253623", - "17717174110346681758", - "14594759378431808791", - "1586132303093775199", - "11748435865142298907", - "16459524518360101015", - "3875225215282808825", - "2730294442148528857", - "148052173121115221", - "9793191736303147676", - "9054363280863949990", - "6821521399154234369", - "9272200714351413404", - "3748593654622691631", - "7942499646327155967", - "10340096055554605577", - "11936265408546565383", - "15392204126056523140", - "8316983105621921967", - "4981877206303856674", - "17057007054052031180", - "11297946758299308187", - "16456211005317408269", - "12627276095713059650", - "17576392602123151074", - "7641438746184019831", - "2572717977553962810", - "4416719756262058031", - "18281189771898274853", - "17323927343283798563", + "239867419329654354", + "2813662233927252079", + "15480711622725706936", + "8996425117269927873", + "17283622439078004533", + "4977738406060781635", + "10218488746158465611", + "11873994178235927883", + "17743276369045099076", + "925897752765442120", + "5857053309483093474", + "6874318963245089147", + "2827577652839851357", + "3456066020256126129", + "16300708785784811324", + "2924166654610036813", + "10094945824299489008", + "542682555185552641", + "12874813354103463423", + "12167723382926792360", + "16020621429179156282", + "16193713610558079844", + "4343349592134568633", + "15284080534840232643", + "15125889103442422349", + "1766957196843179032", + "2530685395988195620", + "7186613412351698524", + "14313039853159258911", + "7119340100233233387", + "465510765636688004", + "156678045745421808", + "1215641541373126625", + "785310925232133191", + "7746058395377257201", + "12113916930291299146", "0", "0", "0", @@ -1688,42 +1688,42 @@ "0" ], [ - "15560211356412949285", - "12594633890819580214", - "10542754436138083411", - "13981710432391860891", - "15890947890091309772", - "1166004366467796613", - "3472680021563265646", - "4581367637445075889", - "1949983753787049906", - "12411349400459349133", - "4409364184746761515", - "17055562722570998328", - "8708692799180652853", - "4262190259026687309", - "6928465031041921763", - "15714448379453340748", - "17688672174871911126", - "4329791720212124152", - "15129825434175478408", - "13691849237193284170", - "2300929483285754933", - "11489675537368161476", - "1469785407258250502", - "9958395378052486267", - "9929091793139403004", - "8061414218191030662", - "13486642608625485414", - "11330153350019014620", - "16456211005317408269", - "12627276095713059650", - "17576392602123151074", - "7641438746184019831", - "2572717977553962810", - "4416719756262058031", - "18281189771898274853", - "17323927343283798563", + "13217732390333785482", + "1008302627755196556", + "13226999948417525380", + "15837762873229292142", + "4116133312332084681", + "10930458878881342140", + "15195914702198386536", + "1596934516634560365", + "10721726291800793157", + "3029972272402590210", + "4063765896516999698", + "16037840201694334031", + "5914796481332957901", + "13395942064765956176", + "7553352911686386168", + "18165250687360207432", + "5757979578355424895", + "18090092325281468020", + "10973817739644772272", + "14604441601866844591", + "9733293795661709532", + "16531553374232261358", + "14081208425792048612", + "17767871770308947700", + "15125889103442422349", + "1766957196843179032", + "2530685395988195620", + "7186613412351698524", + "14313039853159258911", + "7119340100233233387", + "465510765636688004", + "156678045745421808", + "1215641541373126625", + "785310925232133191", + "7746058395377257201", + "12113916930291299146", "0", "0", "0", @@ -1818,42 +1818,42 @@ "0" ], [ - "10273735808511345464", - "15502154157645600399", - "7402458213600042608", - "9686204793601623303", - "4899920060966486773", - "11181129846118323773", - "15742435778802439326", - "8275414763548861126", - "6002569415642491422", - "494057822576698570", - "8489446994346441540", - "10076810769828126795", - "10214858325383108245", - "12390500041962326283", - "8864911671928194318", - "9041866188248909687", - "6774585794405370421", - "1400030771435394587", - "7580585701188293676", - "4916774029230028591", - "3586277619198395075", - "17820734516232094837", - "7890823011154340926", - "13217648020199973518", - "2795227239443065284", - "16106153975968615749", - "4470452277871379139", - "3861752215335560225", - "12304260224180557951", - "7076114541200301880", - "4638910155077376360", - "4304088339225689984", - "14091762875456338064", - "1870754070905164314", - "3238753342083935192", - "18319843239590385079", + "7843723722839384668", + "17670971733668581847", + "1735560089180067232", + "14952175556503985598", + "11933774619395621161", + "15350789581065654189", + "3558604744670353487", + "6783071539551662891", + "10473215237621684881", + "15563932775391552362", + "7144387161484044107", + "858153583842907285", + "11259670914883006127", + "8520157974876100368", + "11832906157057146145", + "12353127787124682227", + "582590685500078548", + "4567522967741458143", + "17752077682996419258", + "9340294648826971859", + "598958725043217943", + "7081327656585823444", + "3461125480252753466", + "5217665982373497014", + "16613112561036614409", + "3339022461254140938", + "16076398129334228272", + "5754340959193575570", + "14313039853159258911", + "7119340100233233387", + "465510765636688004", + "156678045745421808", + "1215641541373126625", + "785310925232133191", + "7746058395377257201", + "12113916930291299146", "0", "0", "0", @@ -1948,42 +1948,42 @@ "0" ], [ - "865147779581819515", - "3524417636541810354", - "2884471864405515290", - "1335227471942358084", - "8200709276479144672", - "15920227223646766842", - "3227940724599613035", - "2001852968684377937", - "7113376518348933153", - "16971973376171260928", - "10174379104881750819", - "1452385973669057623", - "14095817899703312363", - "14572792104462011721", - "1255351250845749944", - "6699729789643118113", - "9848134914702424452", - "3861688562429820220", - "10943162330000785274", - "10847633277998808088", - "2300929483285754933", - "11489675537368161476", - "1469785407258250502", - "9958395378052486267", - "9929091793139403004", - "8061414218191030662", - "13486642608625485414", - "11330153350019014620", - "16456211005317408269", - "12627276095713059650", - "17576392602123151074", - "7641438746184019831", - "2572717977553962810", - "4416719756262058031", - "18281189771898274853", - "17323927343283798563", + "11963106381270158892", + "1940813511740063682", + "5216562792245520106", + "2353473868151331915", + "12625400833451269362", + "5515902509962884904", + "8378955358085129185", + "7206784673558139183", + "7033729892611486098", + "1279629060108152259", + "14276637277203228342", + "11311524196015404688", + "16518398618437957021", + "17796572938195479514", + "16995101513942149114", + "7187403858325867949", + "17388178567121399864", + "10196105351163112278", + "10826542919023004952", + "15330489650264454138", + "14957586840198394618", + "15131247159680209503", + "17953378981455455080", + "14160967173467661516", + "16696332366062800160", + "14089250746447342386", + "17018016600213603601", + "16917220512815677734", + "16517301610479931236", + "2780798925215240759", + "9862925917462051490", + "11707074454021342267", + "12014538960129969576", + "8014479346391745065", + "681798094997174865", + "12571323405248900849", "0", "0", "0", diff --git a/workflow/src/bin/build_circ.rs b/workflow/src/bin/build_circ.rs index 143540e..91e8b9f 100644 --- a/workflow/src/bin/build_circ.rs +++ b/workflow/src/bin/build_circ.rs @@ -4,6 +4,8 @@ use plonky2::plonk::circuit_builder::CircuitBuilder; use anyhow::Result; use std::time::Instant; use codex_plonky2_circuits::circuits::sample_cells::SampleCircuit; +use plonky2_poseidon2::serialization::{DefaultGateSerializer,DefaultGeneratorSerializer}; +use proof_input::json::write_bytes_to_file; use proof_input::params::Params; use proof_input::params::{D, C, F}; @@ -24,5 +26,14 @@ fn main() -> Result<()> { println!("Build time: {:?}", build_time.elapsed()); println!("Circuit size (degree bits): {:?}", data.common.degree_bits()); + let gate_serializer = DefaultGateSerializer; + let generator_serializer =DefaultGeneratorSerializer::::default(); + let data_bytes = data.to_bytes(&gate_serializer, &generator_serializer).unwrap(); + + let file_path = "circ_data.bin"; + // Write data to the file + write_bytes_to_file(data_bytes.clone(), file_path).unwrap(); + println!("Data written to {}", file_path); + Ok(()) } diff --git a/workflow/src/bin/gen_input.rs b/workflow/src/bin/gen_input.rs index dfe64f8..9cf57bf 100644 --- a/workflow/src/bin/gen_input.rs +++ b/workflow/src/bin/gen_input.rs @@ -15,6 +15,7 @@ fn main() -> Result<()> { // export circuit parameters to json file let filename= "input.json"; export_circ_input_to_json(circ_input, filename)?; + println!("proof input written to {}", filename); Ok(()) }