diff --git a/evm/src/cpu/kernel/aggregator.rs b/evm/src/cpu/kernel/aggregator.rs index b45a7e1a..7e38596c 100644 --- a/evm/src/cpu/kernel/aggregator.rs +++ b/evm/src/cpu/kernel/aggregator.rs @@ -17,6 +17,8 @@ pub(crate) fn combined_kernel() -> Kernel { include_str!("asm/bignum/addmul.asm"), include_str!("asm/bignum/cmp.asm"), include_str!("asm/bignum/iszero.asm"), + include_str!("asm/bignum/modexp.asm"), + include_str!("asm/bignum/modmul.asm"), include_str!("asm/bignum/mul.asm"), include_str!("asm/bignum/shr.asm"), include_str!("asm/bignum/util.asm"), diff --git a/evm/src/cpu/kernel/asm/bignum/add.asm b/evm/src/cpu/kernel/asm/bignum/add.asm index 09b405e8..7d63d407 100644 --- a/evm/src/cpu/kernel/asm/bignum/add.asm +++ b/evm/src/cpu/kernel/asm/bignum/add.asm @@ -6,7 +6,6 @@ global add_bignum: // stack: len, a_start_loc, b_start_loc, retdest DUP1 - // stack: len, len, a_start_loc, b_start_loc, retdest ISZERO %jumpi(len_zero) // stack: len, a_start_loc, b_start_loc, retdest @@ -57,6 +56,7 @@ add_end: SWAP1 // stack: retdest, carry_new JUMP + len_zero: // stack: len, a_start_loc, b_start_loc, retdest %pop3 diff --git a/evm/src/cpu/kernel/asm/bignum/addmul.asm b/evm/src/cpu/kernel/asm/bignum/addmul.asm index 3dbb1cd3..f12eaa00 100644 --- a/evm/src/cpu/kernel/asm/bignum/addmul.asm +++ b/evm/src/cpu/kernel/asm/bignum/addmul.asm @@ -101,6 +101,7 @@ addmul_end: SWAP1 // stack: retdest, carry_limb_new JUMP + len_zero: // stack: len, a_start_loc, b_start_loc, val, retdest %pop4 diff --git a/evm/src/cpu/kernel/asm/bignum/modexp.asm b/evm/src/cpu/kernel/asm/bignum/modexp.asm new file mode 100644 index 00000000..a994b12b --- /dev/null +++ b/evm/src/cpu/kernel/asm/bignum/modexp.asm @@ -0,0 +1,135 @@ +// Arithmetic on integers represented with 128-bit limbs. +// These integers are represented in LITTLE-ENDIAN form. +// All integers must be under a given length bound, and are padded with leading zeroes. + +// Stores b ^ e % m in output_loc, leaving b, e, and m unchanged. +// b, e, and m must have the same length. +// output_loc must have size length and be initialized with zeroes; scratch_1 must have size length. +// All of scratch_2..scratch_5 must have size 2 * length and be initialized with zeroes. +// Also, scratch_2..scratch_5 must be CONSECUTIVE in memory. +global modexp_bignum: + // stack: len, b_loc, e_loc, m_loc, out_loc, s1 (=scratch_1), s2, s3, s4, s5, retdest + DUP1 + ISZERO + %jumpi(len_zero) + + // We store the repeated-squares accumulator x_i in scratch_1, starting with x_0 := b. + DUP1 + DUP3 + DUP8 + // stack: s1, b_loc, len, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %memcpy_kernel_general + // stack: len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + + // We store the accumulated output value x_i in output_loc, starting with x_0=1. + PUSH 1 + DUP6 + // stack: out_loc, 1, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %mstore_kernel_general + +modexp_loop: + // stack: len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + + // y := e % 2 + DUP3 + // stack: e_loc, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %mload_kernel_general + // stack: e_first, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %mod_const(2) + // stack: y = e_first % 2 = e % 2, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + ISZERO + // stack: y == 0, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %jumpi(modexp_y_0) + + // if y == 1, modular-multiply output_loc by scratch_1, using scratch_2..scratch_4 as scratch space, and store in scratch_5. + PUSH modexp_mul_return + DUP10 + DUP10 + DUP10 + DUP14 + DUP9 + DUP12 + DUP12 + DUP9 + // stack: len, out_loc, s1, m_loc, s5, s2, s3, s4, modexp_mul_return, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %jump(modmul_bignum) +modexp_mul_return: + // stack: len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + + // Copy scratch_5 to output_loc. + DUP1 + DUP11 + DUP7 + // stack: out_loc, s5, len, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %memcpy_kernel_general + // stack: len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + + // Zero out scratch_2..scratch_5. + DUP1 + %mul_const(8) + DUP8 + // stack: s2, 8 * len, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %clear_kernel_general + // stack: len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + +modexp_y_0: + // if y == 0, do nothing + + // Modular-square repeated-squares accumulator x_i (in scratch_1), using scratch_2..scratch_4 as scratch space, and store in scratch_5. + PUSH modexp_square_return + DUP10 + DUP10 + DUP10 + DUP14 + DUP9 + DUP12 + DUP1 + DUP9 + // stack: len, s1, s1, m_loc, s5, s2, s3, s4, modexp_square_return, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %jump(modmul_bignum) + // stack: len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + +modexp_square_return: + // Copy scratch_5 to scratch_1. + DUP1 + DUP11 + DUP8 + // stack: s1, s5, len, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %memcpy_kernel_general + // stack: len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + + // Zero out scratch_2..scratch_5. + DUP1 + %mul_const(8) + DUP8 + // stack: s2, 8 * len, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %clear_kernel_general + // stack: len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + + // e //= 2 (with shr_bignum) + + PUSH modexp_shr_return + DUP4 + DUP3 + // stack: len, e_loc, modexp_shr_return, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %jump(shr_bignum) +modexp_shr_return: + // stack: len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + + // check if e == 0 (with iszero_bignum) + PUSH modexp_iszero_return + DUP4 + DUP3 + // stack: len, e_loc, modexp_iszero_return, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %jump(iszero_bignum) +modexp_iszero_return: + // stack: e == 0, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + ISZERO + // stack: e != 0, len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %jumpi(modexp_loop) +// end of modexp_loop +len_zero: + // stack: len, b_loc, e_loc, m_loc, out_loc, s1, s2, s3, s4, s5, retdest + %pop10 + // stack: retdest + JUMP diff --git a/evm/src/cpu/kernel/asm/bignum/modmul.asm b/evm/src/cpu/kernel/asm/bignum/modmul.asm new file mode 100644 index 00000000..57ed7eb5 --- /dev/null +++ b/evm/src/cpu/kernel/asm/bignum/modmul.asm @@ -0,0 +1,167 @@ +// Arithmetic on little-endian integers represented with 128-bit limbs. +// All integers must be under a given length bound, and are padded with leading zeroes. + +// Stores a * b % m in output_loc, leaving a, b, and m unchanged. +// a, b, and m must have the same length. +// output_loc must have size length; scratch_2 must have size 2*length. +// Both scratch_2 and scratch_3 have size 2*length and be initialized with zeroes. + +// The prover provides x := (a * b) % m, which is the output of this function. +// We first check that x < m. +// The prover also provides k := (a * b) / m, stored in scratch space. +// We then check that x + k * m = a * b, by computing both of those using +// bignum arithmetic, storing the results in scratch space. +// We assert equality between those two, limb by limb. +global modmul_bignum: + // stack: len, a_loc, b_loc, m_loc, out_loc, s1 (=scratch_1), s2, s3, retdest + DUP1 + ISZERO + %jumpi(len_zero) + + // STEP 1: + // The prover provides x := (a * b) % m, which we store in output_loc. + + PUSH 0 + // stack: i=0, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest +modmul_remainder_loop: + // stack: i, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + PROVER_INPUT(bignum_modmul) + // stack: PI, i, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + DUP7 + DUP3 + ADD + // stack: out_loc[i], PI, i, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + %mstore_kernel_general + // stack: i, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + %increment + DUP2 + DUP2 + // stack: i+1, len, i+1, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + SUB // functions as NEQ + // stack: i+1!=len, i+1, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + %jumpi(modmul_remainder_loop) +// end of modmul_remainder_loop + // stack: i, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + POP + + // stack: len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + + // STEP 2: + // We check that x < m. + + PUSH modmul_return_1 + DUP6 + DUP6 + DUP4 + // stack: len, m_loc, out_loc, modmul_return_1, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + // Should return 1 iff the value at m_loc > the value at out_loc; in other words, if x < m. + %jump(cmp_bignum) +modmul_return_1: + // stack: cmp_result, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + PUSH 1 + %assert_eq + + // STEP 3: + // The prover provides k := (a * b) / m, which we store in scratch_1. + + // stack: len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + DUP1 + // stack: len, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + %mul_const(2) + // stack: 2*len, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + PUSH 0 + // stack: i=0, 2*len, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest +modmul_quotient_loop: + // stack: i, 2*len, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + PROVER_INPUT(bignum_modmul) + // stack: PI, i, 2*len, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + DUP9 + DUP3 + ADD + // stack: s1[i], PI, i, 2*len, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + %mstore_kernel_general + // stack: i, 2*len, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + %increment + DUP2 + DUP2 + // stack: i+1, 2*len, i+1, 2*len, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + SUB // functions as NEQ + // stack: i+1!=2*len, i+1, 2*len, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + %jumpi(modmul_quotient_loop) +// end of modmul_quotient_loop + // stack: i, 2*len, len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + %pop2 + // stack: len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + + // STEP 4: + // We calculate x + k * m. + + // STEP 4.1: + // Multiply k with m and store k * m in scratch_2. + PUSH modmul_return_2 + %stack (return, len, a, b, m, out, s1, s2) -> (len, s1, m, s2, return, len, a, b, out, s2) + // stack: len, s1, m_loc, s2, modmul_return_2, len, a_loc, b_loc, out_loc, s2, s3, retdest + %jump(mul_bignum) +modmul_return_2: + // stack: len, a_loc, b_loc, out_loc, s2, s3, retdest + + // STEP 4.2: + // Add x into k * m (in scratch_2). + PUSH modmul_return_3 + %stack (return, len, a, b, out, s2) -> (len, s2, out, return, len, a, b, s2) + // stack: len, s2, out_loc, modmul_return_3, len, a_loc, b_loc, s2, s3, retdest + %jump(add_bignum) +modmul_return_3: + // stack: carry, len, a_loc, b_loc, s2, s3, retdest + POP + // stack: len, a_loc, b_loc, s2, s3, retdest + + // STEP 5: + // We calculate a * b. + + // Multiply a with b and store a * b in scratch_3. + PUSH modmul_return_4 + %stack (return, len, a, b, s2, s3) -> (len, a, b, s3, return, len, s2, s3) + // stack: len, a_loc, b_loc, s3, modmul_return_4, len, s2, s3, retdest + %jump(mul_bignum) +modmul_return_4: + // stack: len, s2, s3, retdest + + // STEP 6: + // Check that x + k * m = a * b. + + // Walk through scratch_2 and scratch_3, checking that they are equal. + // stack: n=len, i=s2, j=s3, retdest +modmul_check_loop: + // stack: n, i, j, retdest + %stack (l, idx: 2) -> (idx, l, idx) + // stack: i, j, n, i, j, retdest + %mload_kernel_general + SWAP1 + %mload_kernel_general + SWAP1 + // stack: mem[i], mem[j], n, i, j, retdest + %assert_eq + // stack: n, i, j, retdest + %decrement + SWAP1 + %increment + SWAP2 + %increment + SWAP2 + SWAP1 + // stack: n-1, i+1, j+1, retdest + DUP1 + // stack: n-1, n-1, i+1, j+1, retdest + %jumpi(modmul_check_loop) +// end of modmul_check_loop + // stack: n-1, i+1, j+1, retdest + %pop3 + // stack: retdest + JUMP + +len_zero: + // stack: len, a_loc, b_loc, m_loc, out_loc, s1, s2, s3, retdest + %pop8 + // stack: retdest + JUMP diff --git a/evm/src/cpu/kernel/asm/bignum/mul.asm b/evm/src/cpu/kernel/asm/bignum/mul.asm index 8317fdbc..ae8230f3 100644 --- a/evm/src/cpu/kernel/asm/bignum/mul.asm +++ b/evm/src/cpu/kernel/asm/bignum/mul.asm @@ -57,6 +57,7 @@ mul_end: %pop5 // stack: retdest JUMP + len_zero: // stack: len, a_start_loc, b_start_loc, output_loc, retdest %pop4 diff --git a/evm/src/cpu/kernel/asm/bignum/shr.asm b/evm/src/cpu/kernel/asm/bignum/shr.asm index 42f5cd3b..99911bf0 100644 --- a/evm/src/cpu/kernel/asm/bignum/shr.asm +++ b/evm/src/cpu/kernel/asm/bignum/shr.asm @@ -60,6 +60,7 @@ shr_end: %pop3 // stack: retdest JUMP + len_zero: // stack: len, start_loc, retdest %pop2 diff --git a/evm/src/cpu/kernel/asm/util/basic_macros.asm b/evm/src/cpu/kernel/asm/util/basic_macros.asm index 0edd0367..c57f0649 100644 --- a/evm/src/cpu/kernel/asm/util/basic_macros.asm +++ b/evm/src/cpu/kernel/asm/util/basic_macros.asm @@ -50,6 +50,18 @@ %endrep %endmacro +%macro pop9 + %rep 9 + POP + %endrep +%endmacro + +%macro pop10 + %rep 10 + POP + %endrep +%endmacro + %macro and_const(c) // stack: input, ... PUSH $c diff --git a/evm/src/cpu/kernel/interpreter.rs b/evm/src/cpu/kernel/interpreter.rs index 36a34817..3242df6b 100644 --- a/evm/src/cpu/kernel/interpreter.rs +++ b/evm/src/cpu/kernel/interpreter.rs @@ -376,7 +376,11 @@ impl<'a> Interpreter<'a> { 0xa2 => todo!(), // "LOG2", 0xa3 => todo!(), // "LOG3", 0xa4 => todo!(), // "LOG4", - 0xa5 => bail!("Executed PANIC, stack={:?}", self.stack()), // "PANIC", + 0xa5 => bail!( + "Executed PANIC, stack={:?}, memory={:?}", + self.stack(), + self.get_kernel_general_memory() + ), // "PANIC", 0xf0 => todo!(), // "CREATE", 0xf1 => todo!(), // "CALL", 0xf2 => todo!(), // "CALLCODE", diff --git a/evm/src/cpu/kernel/tests/bignum/mod.rs b/evm/src/cpu/kernel/tests/bignum/mod.rs index 4b1a7460..259d5889 100644 --- a/evm/src/cpu/kernel/tests/bignum/mod.rs +++ b/evm/src/cpu/kernel/tests/bignum/mod.rs @@ -20,12 +20,15 @@ const MINUS_ONE: U256 = U256::MAX; const TEST_DATA_BIGNUM_INPUTS: &str = "bignum_inputs"; const TEST_DATA_U128_INPUTS: &str = "u128_inputs"; + const TEST_DATA_SHR_OUTPUTS: &str = "shr_outputs"; const TEST_DATA_ISZERO_OUTPUTS: &str = "iszero_outputs"; const TEST_DATA_CMP_OUTPUTS: &str = "cmp_outputs"; const TEST_DATA_ADD_OUTPUTS: &str = "add_outputs"; const TEST_DATA_ADDMUL_OUTPUTS: &str = "addmul_outputs"; const TEST_DATA_MUL_OUTPUTS: &str = "mul_outputs"; +const TEST_DATA_MODMUL_OUTPUTS: &str = "modmul_outputs"; +const TEST_DATA_MODEXP_OUTPUTS: &str = "modexp_outputs"; const BIT_SIZES_TO_TEST: [usize; 15] = [ 0, 1, 2, 127, 128, 129, 255, 256, 257, 512, 1000, 1023, 1024, 1025, 31415, @@ -232,6 +235,76 @@ fn test_mul_bignum(a: BigUint, b: BigUint, expected_output: BigUint) -> Result<( Ok(()) } +fn test_modmul_bignum(a: BigUint, b: BigUint, m: BigUint, expected_output: BigUint) -> Result<()> { + let len = bignum_len(&a).max(bignum_len(&b)).max(bignum_len(&m)); + let output_len = len; + let memory = pad_bignums(&[a, b, m], len); + + let a_start_loc = 0; + let b_start_loc = len; + let m_start_loc = 2 * len; + let output_start_loc = 3 * len; + let scratch_1 = 4 * len; // size 2*len + let scratch_2 = 6 * len; // size 2*len + let scratch_3 = 8 * len; // size 2*len + let (new_memory, _new_stack) = run_test( + "modmul_bignum", + memory, + vec![ + len.into(), + a_start_loc.into(), + b_start_loc.into(), + m_start_loc.into(), + output_start_loc.into(), + scratch_1.into(), + scratch_2.into(), + scratch_3.into(), + ], + )?; + + let output = mem_vec_to_biguint(&new_memory[output_start_loc..output_start_loc + output_len]); + assert_eq!(output, expected_output); + + Ok(()) +} + +fn test_modexp_bignum(b: BigUint, e: BigUint, m: BigUint, expected_output: BigUint) -> Result<()> { + let len = bignum_len(&b).max(bignum_len(&e)).max(bignum_len(&m)); + let output_len = len; + let memory = pad_bignums(&[b, e, m], len); + + let b_start_loc = 0; + let e_start_loc = len; + let m_start_loc = 2 * len; + let output_start_loc = 3 * len; + let scratch_1 = 4 * len; + let scratch_2 = 5 * len; // size 2*len + let scratch_3 = 7 * len; // size 2*len + let scratch_4 = 9 * len; // size 2*len + let scratch_5 = 11 * len; // size 2*len + let (new_memory, _new_stack) = run_test( + "modexp_bignum", + memory, + vec![ + len.into(), + b_start_loc.into(), + e_start_loc.into(), + m_start_loc.into(), + output_start_loc.into(), + scratch_1.into(), + scratch_2.into(), + scratch_3.into(), + scratch_4.into(), + scratch_5.into(), + ], + )?; + + let output = mem_vec_to_biguint(&new_memory[output_start_loc..output_start_loc + output_len]); + assert_eq!(output, expected_output); + + Ok(()) +} + #[test] fn test_shr_bignum_all() -> Result<()> { for bit_size in BIT_SIZES_TO_TEST { @@ -394,3 +467,81 @@ fn test_mul_bignum_all() -> Result<()> { Ok(()) } + +#[test] +fn test_modmul_bignum_all() -> Result<()> { + for bit_size in BIT_SIZES_TO_TEST { + let a = gen_bignum(bit_size); + let b = gen_bignum(bit_size); + let m = gen_bignum(bit_size); + if !m.is_zero() { + let output = &a * &b % &m; + test_modmul_bignum(a, b, m, output)?; + } + + let a = max_bignum(bit_size); + let b = max_bignum(bit_size); + let m = max_bignum(bit_size); + if !m.is_zero() { + let output = &a * &b % &m; + test_modmul_bignum(a, b, m, output)?; + } + } + + let inputs = test_data_biguint(TEST_DATA_BIGNUM_INPUTS); + let modmul_outputs = test_data_biguint(TEST_DATA_MODMUL_OUTPUTS); + let mut modmul_outputs_iter = modmul_outputs.into_iter(); + for a in &inputs { + for b in &inputs { + // For m, skip the first input, which is zero. + for m in &inputs[1..] { + let output = modmul_outputs_iter.next().unwrap(); + test_modmul_bignum(a.clone(), b.clone(), m.clone(), output)?; + } + } + } + + Ok(()) +} + +#[test] +fn test_modexp_bignum_all() -> Result<()> { + // Only test smaller values for exponent. + let exp_bit_sizes = vec![2, 100, 127, 128, 129]; + + for bit_size in &BIT_SIZES_TO_TEST[3..14] { + for exp_bit_size in &exp_bit_sizes { + let b = gen_bignum(*bit_size); + let e = gen_bignum(*exp_bit_size); + let m = gen_bignum(*bit_size); + if !m.is_zero() { + let output = b.clone().modpow(&e, &m); + test_modexp_bignum(b, e, m, output)?; + } + + let b = max_bignum(*bit_size); + let e = max_bignum(*exp_bit_size); + let m = max_bignum(*bit_size); + if !m.is_zero() { + let output = b.modpow(&e, &m); + test_modexp_bignum(b, e, m, output)?; + } + } + } + + let inputs = test_data_biguint(TEST_DATA_BIGNUM_INPUTS); + let modexp_outputs = test_data_biguint(TEST_DATA_MODEXP_OUTPUTS); + let mut modexp_outputs_iter = modexp_outputs.into_iter(); + for b in &inputs { + // Include only smaller exponents, to keep tests from becoming too slow. + for e in &inputs[..7] { + // For m, skip the first input, which is zero. + for m in &inputs[1..] { + let output = modexp_outputs_iter.next().unwrap(); + test_modexp_bignum(b.clone(), e.clone(), m.clone(), output)?; + } + } + } + + Ok(()) +} diff --git a/evm/src/cpu/kernel/tests/bignum/test_data/modexp_outputs b/evm/src/cpu/kernel/tests/bignum/test_data/modexp_outputs new file mode 100644 index 00000000..543f2456 --- /dev/null +++ b/evm/src/cpu/kernel/tests/bignum/test_data/modexp_outputs @@ -0,0 +1,1470 @@ +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +0 +0 +309 +5842587018385982521381124421 +5842587018385982521381124421 +5842587018385982521381124421 +5842587018385982521381124421 +5842587018385982521381124421 +5842587018385982521381124421 +5842587018385982521381124421 +5842587018385982521381124421 +5842587018385982521381124421 +5842587018385982521381124421 +5842587018385982521381124421 +0 +0 +169 +1232997389102826268860991065105 +18618193491623480687965778108529490131 +56424335153278151789523409664996995581162067431087086213061556134977632914449 +28522822713801268588036943398667804191745915805046109428618723188679866502161 +31706899640538131462557950751123123992423743151283050819612655945089903928361 +1626949887851522216050918195251855667936019233629512014857416262882459162506846482867598420124655122796334698879679058256496280388512107842122550266897 +3456644180256483296524124683106942480722843461305992677766332070622386105650335816178720659995652203171430416751945868032819203139048842456194585731900908 +6658621772694490037410881754126282754619191463278934006643576166056374826395321115677201742806056121601730868428249390651828408651815409287407418905560894 +2188719266686453452930405899199235044753192686954839466176162624683199938127424638750308949204554559166758220326224401920489333667474175603924673521175569 +6123795749220870070888957688126499811687439102580957107200324670516588221814874336490966980509479995815372272026912905873172415251713982723428918913460049360806724424126068570078686852874442462644585471618684175096178614463856372447395923736155404199722474001519774161213336837801565210105511353961489 +21733503076822274238215696841643994124465086209245797663103653662160183433375325239843496825811576935617701675430794656070743382504699894663869396198800858049123949931636855462200807567378261808374350727356914491895652225869425999023896449493174464626623879583913773127532285149008185808669981457659175411110681467646497612200879789944122607924142423967190374513947785974855081897919456043288039161362376188824242511311222201467365944959686354630547972 +0 +0 +501 +163832143645086957897416441857 +130403518609156362105805396406315208861 +1950081577919450936472563652220396332042682835950151822696779432336405037057 +89705076639198166424843052158202309145112564081865083245095301525986942648321 +161580799869287829122678259656507339171378764462605635944908315838074450225541 +119111099232869461943255917709559971029471489246820147748389884283220680875449970114508127905572794881898139347855563980545398801715283004632963481601 +2340550614088062323035521333507933205420749928049240408457893198554975629380160875595843975025528241912895931129450956293623201875314056184463318790281141 +9658263392514739927662836103088426769134800307082054844647958520598804818351406352355729785509682250873421347556031006118797390529574721358615425274369903 +4647428455414528310735419222346137778331384012634538551014412602117023622880652353771726881116679285768237724443091476402706202263926819772616832419102721 +4105943439683327149496995432917731734349623330617416765444758819531334403459555965005600275959433826680513222328275949889828341311187920607090355380046540579908947040106371789193081113409035077098486792404385747715667974409598976733840748313362165044117491316370103556122704636978835764926194391187457 +28645769207390246795138025157012310806200949947458739337397211179141156343070918052774971042600619689369921890873698767518883214265612034430865062720501567943382208222029969252942575712244757709457154177152894494535042763023966349374143513752560929258976200745379909865727692592552226677876935892285307870731885285227994511501363645824725317338462104668462291125838004650196777287385052153407326433125418796527586257544647700218132360787318720777100831 +0 +0 +361 +349605011617414033395053481789 +245857331472368514819046594566028058751 +16196520401421423385786338368215415982698439852342927927980513551465948892989 +25448670785549471741073803593965176921136178751681542787519830340854942519101 +208746275861806526568796522022506082930013066308764940459575687169043802837726 +1405046333573254154362728566205440659065789596162373947677922992002779706150301916091557545001891022758808422492046510466274149060187173986171371114301 +4109950494713993893142341968876859588899697995149574488387185284937507905151071268229544837244462536429462991654059099118254521939414590134998340719446475 +844468128021093833521017258842640197099986073495355910940365822372902152436005754957689228609364360833723273104884193579513808541852965164830299937335266 +4841490524461293458775865719630252706317774131797304941603107709106391551373400827563106022147424343461775948749633172375219539070706909069136692738510653 +7273173343143062730116325603650929579289657910222550340667872300408581237430197382410051906687144077202863842569199267502562443871512075909613158282763060439777587356925584672588460920490499485650537891223823337073005846524449165906099576249848470870580763810627114753982636643198831102678792829914941 +28046651509673296558629424584063249731669578718145238261130675472681779110268140721442904856558473621167727640615713345067811595168883183810857635560068796253449136272338112002671317203041266904678503071806393932350113469015095445921306266450082664767442783548486830460889239098543969021176454257806145698621983814164824010062639366791567674987083305882183188142795298379711201433370817683665471805353684719806585009665707704695044458674998071553291930 +0 +0 +625 +268138222663085878899055263745 +24352877979184920020466043837322220276 +34834821705580047870320807590104282154881192418891909778995311440625022271489 +107743694625338367548278288079708411290661245510293131426406157730911501680641 +118236082284243482508848267847953427609046466568857110070954823921881387042791 +314573941438267599881423465112523804707482828315168316649965301003974020258305280672271797781262619454377248842022918324247905069090181693176119558145 +1855138457669725370795603609175257635850787505475418783821961151316324964106211402480574231460442281436102848418947738954752184731638654925034081955953702 +540244355168038810439245856412365092477075663815074675095751794574495975677637107674742162091364766891790053303512224504116561928038681836474597949011431 +22981118609480295020302390537085998300920429526471726567398293023445956296114258286587907654003543675558782486527003079440548040281611791112262372611325953 +6951084942072485004602792642768728173731086340286788608361716458550264564967198485402397629024961093884371645054422216571333979237852755889053521204926773487912585360977600077358240969038752377614031729154197921202596341838056184283438478913472604440906205314054471964590715571751484579200485577195521 +33110177016061425855873050546700017053104395816945007989361323145125706671247445069352845357430211170094709814842881235921295997550815440918489134011703431383697905373158706778267396782608658244538288231998579363509402374934461434235027334113339168112113235815389810790459912467851237692233387577938141749136860402850772218835907235676691685574301095898691939348359786379380091090548413315980192736618829302554133559996331787700989395178469522588716520 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +5 +0 +908 +908 +908 +908 +908 +908 +908 +908 +908 +908 +908 +0 +20 +0 +444539926163396060618371891200 +265738677898336061407141787570363252093 +131765835135960660552807451524089028158233849469678584969822208 +131765835135960660552807451524089028158233849469678584969822208 +131765835135960660552807451524089028158233849469678584969822208 +131765835135960660552807451524089028158233849469678584969822208 +131765835135960660552807451524089028158233849469678584969822208 +131765835135960660552807451524089028158233849469678584969822208 +131765835135960660552807451524089028158233849469678584969822208 +131765835135960660552807451524089028158233849469678584969822208 +131765835135960660552807451524089028158233849469678584969822208 +0 +4 +0 +458477653689271929750159360000 +25471671292789986475502298488957923576 +39622934661811821553763744630506213929196932096668444518123439737845028225024 +11662422067291787594026815204283885427659195788081136348012846295902003920896 +196850617542733211416217278410575369737876420896781853126317893743949824168141 +2683172422101341871005722746258376340307644953044191751444605309114182348157085796971409744620711498580309302182985308212586435414886374286350975238144 +3484767657771443762420853002633790658478025026595023030399445962591501743459655114168018705061836715787328457528577115561192630399480939905028160741471812 +826369288885297875981086985856579353870084500166446900173411432842694716669231467968748002518734902939451616083284004742033317955616293179658208664891021 +22202087655311450647135419149250531087927146350676835345655785380157598138557194753184373294689489916297473124960377821312544654416163136210039001929744384 +5867290145612847972373997073309915340902862989135230389100858222930181445218524888102172986857355110271349287326639814908840476463002707271202642441777343076399506363351555575169003649515921567023847735339868023560115487675698958077623452675911334000167018425794800395206246266829715066932889888227328 +6613183629137681279087117062720950270493246965665653353814545527865422606963860172688377962562995370224937823909402574900579151120138866568996446233013596125260317722731462888479963743727090415264356847381807593700110142796538796057208396283278444005900325957636550564820775653606338375016287872257899328947954420594292130424139307631549548532332505581708062755002798299585128036685598543159971540741219646857517061331622628267531564244017650020495747 +0 +16 +0 +491348889049443876707510517760 +26309649457780133338343455840727251651 +12836249910756408599207651670402691470189457253048470571408310293697570799616 +89957821137359056393801843026144645477720961240687064113356371611922523488256 +186628143002875342454100646575613221588500043779267673627434610024013060416436 +57810819572866260801492155256759413876483749626656973452292976127618654522846001818070108358802224938885657621123322444739974859616822961140014252032 +3586935919752527353984027215088868451772937854013928716747601409083300019440067660008036473811750553056666280422401084064457379199486614970622678033275267 +11435172354316143741773241295887896087133672859698695578907055835282817586890921066517171600518967766241323412371609567006600523639894522363112407210324509 +15149040910228070805694652326182650730845401534077532391632591405118117144643051256922675471878552887101021773709591676502861584900921169634374950540279808 +4352157484305171917414400736736974322230700579288245632185873247491184195730898991437344106792548923888580847271187361373793947913900504263300740461685586606358268444829299316120497158281612307205034189058550655426163375786508423319573157431875873496129188997627673849109716799860744235677774874935296 +24655669188850607011881278212500400404795975111909544352042335778191251712079013936428534764805902649880208931889745231758199080159268053714657146238568540885026847910322826747799581068534312565470606227666766265055047378610529765358823154325332792516751882522879055713682140011583363538951298044003038164972718406208736221386819603161486554136555558914468701937507614273119563961498468609340048830696861579728696267046957787891673696324284268296592010 +0 +20 +0 +995158961158262555374402928640 +134121906180378853498930390838142450437 +6919681730812989105961680682293875199438003339556752544938537021004054528000 +111415284413375575279069783743044849713138799010818236990829948938800785784832 +2671371225382503991550810752302543668307773911036096851249073522360117594907 +3196717805164369921128204528085730572110803813535280667544983013152498020676968653158980718912649444544541678773084521623843027455344890340658923962368 +1238216679956500444264616028232887647747940490327785007262817775307688862239704307927037312429375849475227131933476467593816834523153314124523020288669761 +11027839566584582470519059073521721670466350661122931561173065258823257321580571220589430064206794766082774897831215317085884716390531116370426677289293467 +2022634134337910980433929460688286697109516578140587883097911933500075648632085115589857581520940210394331242638360018211669767050461136520845948293742592 +10563633569776338863997290139173141475448369840952853889830314442522523629045149771574493906944834062931170774068081579834010118509008087930549452650473545745495642812824093639365842736796360564731533873032609439082530461159518786091690259460722677617446344350444358408993792066302845337558798580056064 +12824372483412385861669199400205004566724858538474303800494747762440269818404951059835352877380356415578282393020015717678870100435248949572316256128400151457357751827937645568676301032707345577683626030686702589840795543017433728119877924868065460364994171679438527788229515928801213836621134264837100427090704057536254578168099404041165838330491183445948965724854110273982983705590693431410760655261855587976233430383255504302646591767978918856150863 +0 +16 +0 +1074929557660986703509960261632 +310308103079793704575757950092990989086 +45830377016999964195415645114843325971494172471228418297876829545637299093504 +101060401631390047762632218125084929475187708866471415222687033363449381912576 +130474939331530224408995396282441784260419370120207375947563617259552477561186 +2355941672152922857080918796873312219472407301725598088408859346047953344326591361786096096705419672944173727217808802505470853131296892573634755821568 +1316454184270635300204354290028403652975569924791362044247281669809677739990181839549155145392827806973474851174980544451539377747682379975465127356763282 +1438923259930704879657001108769207409876637192084506601145086731796010515496862959970405934371385188574753305943073462813023599491372378876317837370133527 +3751312292780009820304966556683277538490745683704566160236438372682961982986048670343223416367070064938538731816396930813426231559274819821553090255912960 +1940812635972614747466109277992726340848630072707912304640929127912329064087768370597314351590495738864766600213011565689114652892971392013558976325205708385347610787529794002191911334996478270010718764337052847791754345043741034784083083057127201125434592632894903882614831512194082202201086343774208 +18021429550902313767357511567759601756356647595430959756983217203030344977480124379576430774082535283607744829695070380577186356624450300463936384113907659808083311741619551253897275613952178963423684191041978549151808016907300923588567042148170623295160006737511147422878843457848402746737171046772562256330802876792353279038296767776587843369343160581335263159088902098345089167246852603087883635586088364841422928542822495523562426663120058625130224 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +1 +160 +0 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +0 +1 +312 +0 +305764342221524799935332959201681860527 +43179616752915754651548109831528453372307533305539601542967080491130306953216 +17577324162381258630474635337405333643146914114762554675606397827067886436352 +24302243256145833886805174285503224697924343810958724170274784478667392432942 +2455073261000987918671945239574537486815749129964150471432702836905807585811396531610253905941293957332101512899044268740293992626007607127083491262464 +1077242566599992264249169571444336551411248487528972966637628471569432402384081668659908518747150256909990581460430565820193233307152827275575539899170758 +13073126603118771003805243197447306343271660677454831683154753707889268850436361661628016500641989777790467968280342772010149753216162050495370020985042625 +20998284069276981893190892536141895412205721732777582241948778013718640245971369156599887283883776856426273476192138787335689583588114031186267728857006080 +9895687224941938536992396259410735585498593485949826080868857632522617767715344081138466212990213054852400162837201310103538489800752934384336855267244623540847988822661005638222750684585548680702427543946047149085737687298331380026993105619948605279977576581565502199750299350287074957960820551581696 +20330471440166965706846550975654713890652417870226965905923146732405275304116721701265925830155132264142742283294001589707864787012405943213404119056019767248830063561795881859861133225475226440778669219796000363700993800365618586534090055278009338085683400928935050079339354878794718829630509418239605013719652286315425501679172072558159972643172621667859406242995437705040600030465945478758984414424005354845660305153595541783513391622742931412397213 +0 +1 +104 +0 +308509185836607975341692036936651238716 +55518020932873470218319288289245721296726991639699521321270937184899723952128 +112628490590563884833405386435939751658584809004247538619207709896844158959616 +5922841801814876533914360761483372163277450765372489528717658348886181069591 +2564817866139487541320504390805327358442199437592476952716613284652304314970931783459808490723737608880437784464822337666800292869999879039669023801344 +398463165885851265042497914635418511071393473395199568610621293995767308754233006664812655610002899538162554806154059048581305437649155727562069976883240 +11845528388829065193137342380492024118612741433871500160171557205928409375950091328760923663375034610212896359622832576619866946421226527978810823517767195 +14358105553296630195074581259093482904061967322039003650287242246847189245898106579740731184467142158444184654938258232190794449000467281976153220954718208 +8724046093635123581045526611633144774030370511834937151107124782757791671626741053594651970417496109952491903631645243345303037829497694196648996824200842520327610130549622341880795147265298435073802163280558766387420771897374896142381275499545438532579692773311139765116038449092364593363996255453184 +7405751147045042170442233630583323728853684512846881489652126352481138580343808254155794109418214211938178940574968048906922983783473775456657957578956020062439863911134378708160968666080910153080712910213618483308281268671163181505833074812656056876069748103205570600234366976045578890131475420080402034328956554170169080621020401502037844882798216390950223171848402002782939936087102304599378409563146797567777945011228369651410924564026853389623899 +0 +1 +820 +0 +92377192736350021881806334564236622586 +30966933304654384056562480896427815565136977421206545694335698204395214733312 +82119970857858981914834549178898483174623261423734314091990446749364630061056 +17335345295685259772267515166522970642719156121663286480022840319361908909536 +2314109225631884097329071519390891278705119245506353961085436228554532183298397816728391508885600113143907388260489256179338412441709786163323932246016 +4631405091549513365618104032938964387036004178571962489969520427453823044584554995003585135178458975230639830757208179222570849484879646249622084312888560 +3444397905407459769678888603161852413323651620442902175963208412202586537665061311535470334927067187735566811052881866689633902610439151941964220310971721 +11022665256141102472940378463699540949238908279778600071282259749712264960911250408144499157327170064963756957223649027433072458668570655608803856874471424 +1149493853622624808951893133000311601994554292143458692563726487021442743023464156391272602913618081421849882373383362805133207036962919354651311719256865291542887462144185133870512659168195548443958858491083766172641138569350640961793151838633119997925593177565959971136032627767125937725101431586816 +33826235027620277221304225387441637043664748422971678909986538422912010422112157161893624219767292791117193745224367096503738217947106120516761159479154541434507081629430040858090956433405889392516115304242345520261752268880565405366762142190916629498630348949119250396008683103444433062400285561745138697466209715485695816216568719770239333912527091815214766386375891923409276947021071960719444492160160428059721106325731604292930332234337842204147864 +0 +1 +556 +0 +132190390248470898896680912765144782208 +26118405364148793884093212339004353321168506206731428575114534916913543249920 +57371932048380839143645765917598495087491748880125189544237269309841806983168 +21907868082798520198592834325003250611892002016702940923441999346792832444518 +1983010347367670533586158746720918426725859238638826101738778473039940830888567731427474683445100376144146431698278643920358008341796317600412673769472 +2606640266791684811701307747992020704987556721798189736831558708134786779427826595516656788456057404569214323026273791700577064277010116095681833143649967 +13236721874325271723025473459287198396620022329708721480674722710511848773677038674125983763343329458361710367424043866874114509274517527946107266648826241 +2194764262264585667059858125941452105865892742975859841108712998947329687982788884647082000066632025028061458492389933022294535208755309187928296471396352 +204309344949056669756457560943541502699162518130681389120968275752795085274348261696673034188427085066909553427932479215637901119300398120607913517490261871972031537818140203177045230095689669755307530773417745785587153318345703950240765166902545254968306769674012995910371703479321012180805203525632 +10264690826749513230358184346151757544435920255861917426522952736046646856221133004608608156420505462277842900802805838197750732768067254277504971522375036317591854497981434809048391519641178668320883274044427240323533445722232511793549340418570864089915044452302975506872587143937799291446332426997988486186420527441812688737993113263455373353444533552218632449194597995340604827994474495437980620590990737309478013598033891846127947111075468737667005 +0 +1 +340 +0 +998905004448329441454522467488976926 +4927413081688125725138099137632369118723706439675800220006419132836783063040 +84352496855087273591478468036086052663893064063467212113548648838828702826496 +107903726561082941806970174768933557491971859433891364382659859844852394460986 +2319608449060187999684790351453024136538626650066803987926996295704247719880909540662904401039557482146640056079214446055684288473572080013990468517888 +3229174536762564836328011009025477898799910197080321024421312234854337921760217907684033379377552188666880062823173769265434474194314757844200157057703739 +1423443399352876324872592588473564301454095472277230446652620290446968276830664095418889947537872334002573975742103104497418388304230155249816071500187318 +13271987893729173924722826693052254951121133786126776376721905614595108288958742926463506237918989779603882913708829786515628223071604050168421092211818496 +4601804950488826494167685270760036664893236871832882663322149997831635784436681349022970436277158840767511957327023782099178816414168280990846944956415328077143836700852459969097230280911772452313608645578171031885121285719728944681182534906015347671757933737842458574792144739909126764366189368967168 +857479341893762723161505496595417165049229108770456259194779683064981414515307526837194732925160817384742675728910002446344631831783238186297049084225178616281383135711434226661298337670136802627018979396403252157951565007991996142431686702381810961834168285921445713777780679851079387977357401452731948432492393075599084080144393344786427912661179463547435908489113931675491545959285551896625752610448451638448866450487107364387582471184159571074175 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +3 +827 +633825295391748780828659810303 +0 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +0 +6 +883 +1151402479073526177054249189375 +0 +46236487016914252810359942606653565611806735985113905556189104784313205915647 +10141063897320778511376522974043618320650062159021091584566880470490557710335 +78190442020038551706136595408815344419350554279639655464038299447602848702950 +5264101363851496851433282540836956541101368807777991293344941388857765825339723752116476539712642325105142882152577944513410405922445245546495 +4274984277410983807532089925150768740931153586735292491383528412859129258433112273099949231101888023707157602612028830310955239728286706980227996295680904 +4270974226494341897280469825731968602385022467387106892501039803249858350601697035152008485439522684257776791254316572547412071137653017182505839419643661 +13396349486729820333578617551105577176007659045388305976467765207187599750765003306881228272040491956095560694041316948995285357929407282941862450720407551 +7272107039633935551591400893562218992924676126105717460127870788013015797432989950658439810996946118473016444182279548084821341534588106843981486932573866517856077154029000374861836839944939375168692527383494491021504979898639557323084128794258468279454347871141949852954622679013053097034606228537343 +4024681230464577896473641062977638052721373802614679861781599094800123563495932827294337297078407941193782141971643023681636515761542479169594195464691208343312685562380387487284859733536618386758347477945214430213026727223935953464725954742778965827480842612641410510935813810716514672572547641952771526945317395473564193078364064275666028733643505934945383834412116242058173431754061071146756970189972698298803191543547137198977609076610984071659602 +0 +9 +257 +148913685258606776538030407681 +0 +15737081446634197346448238543290111090647984834849920547563580853437339795457 +17796349368611048392083206935955698801625485975991150886750776582747396767745 +87042183171820405426823900509602437553981065786933287231059322442248803404950 +1872579959911606123270219006911173139292436983412774739613566899721054729108647438934586909747652198625290890899088832075544795394544595455034418790401 +1412681115817651652595578657596182058840351787817337255523617847758399731969803154217604617416738018019082279140815098858103221944816565427541047989874575 +4658367006324170812599422256080523502806559591300942419231897265664273942632706886970881430455450954648568107656318501922464893981721336262565505150036230 +14176910549874618607407657930219555895908368234965503682114333452984200436110890119648814677868732070859714001297650338292337460853941658691514163789824001 +10406141366637179727319354575345523585198131445101199614041074944321283006099873985593501657875961054722659983805551437203724122242706464697758320434979188004227317962713115722036138880945569626619984608791769942492732939213456452058202944264921993463328233802720857330376187422666409410692321365721089 +10395612500766716889498607750936120296402196259538392550447369284462443521703220089793251095458371323061297217472250908800671528775762556075103359185483070524957305359923584052804148040373365959462663236012867000124244297047788081721144621971838346991977347509145949856725062202597193816565726641315796367190832625962761358471335171016260228986247896685407131636015822155281779300035844200755378496158753851995591046914832248761433986938772195242877368 +0 +18 +33 +501502021891302937219905355777 +0 +3229040287801688211109538153528907359157521678782897421936034456493449281537 +43674379635609232592374808570316762057057239464140599073454048485319171375105 +206574116687852983759940670284339037133974987477578735810964428283965343595925 +992419486452661222145984173974299929589195994084254138342964889584701966790230864615423021215758227245793655600475560820231442393114209491163228930049 +867054567978498531065761454390276935399048293801759280371014301861063097032842313817626802406894612171009202210526526325159367606967184116106222709354994 +1139630468367775490336631812613571548165746938068725127033848437473514644842035232747054391798198457303514508910901267746988126523368144746838663920634335 +23229321847788976756725283113649930370792069582610592470231250035730463613494249923319913356844479204498929051652932802538286625056745478043326957712572417 +9736393711512156676697476147793419950291123704462141453822865116456122510755024608271599163197384361427364997715319701954677607307667967970314752567786721165005692082957947082637259982017311319355343061387874272954404686630047193927081844593179586832512413662625777018863736941974537158057318938574849 +29060966502289446762773527309129862532230651461433207672335349512468314509838153919700009183613587271911577714742576064666717735555966747507902189346161650683338259890112722032957837515796161015553488353420265757652831337573527786397820733107579265093849101520705267722311390949184609843752198524487159831619663983822993580005359239978622465631388243890591655090541561296753761373713020979145034193471076120681878728773637249747647754915387598872616720 +0 +6 +515 +140262897948655524553823354879 +0 +51292049059523452610506083592610024599583816874803914322375719502751486443519 +27936184963965071766976378876421641742859886164075202272073313001233759338495 +13449010363647692703508349667378797433516756740069562881064298383864033242575 +3007865154522879628838942692472346158555510514358321404385880396123667658951604878264737502736736088022367734668256726008347601098598257350026528292863 +4592124389902639952157884879500633941880823326525745966966661569784155220592348399170518240885296517746840773500441608980855453698091666787607843899145829 +2534000532084385254011173048792691142730414486367806853286959714601853302234763393270798424710144792599095332446397093107565422159020315343985501774159892 +15542028513463832582045168836396386001625310864606581833373826691519685781220976702479707834361513658452848273358428791133185408252751328679278502490406911 +8412092699337531037787046468081884678528099171920466557150153840517555441701513747481625075399369031563363890720070512929533552898722630769019938157826781770070834212210476738149888508884995219178808489342005439633046794302879951435958690454691212867490392351796728559169919328744714016812403628441599 +33830106619343559855814362535589211924203444187711545573142435195593086511328847987971132905556265209639736610793615201190028737913698317064723958072416856829114676871668002147741395866264126547513200446705626505358831619201264825403452572963238108829829155602404009157481163421152595415563917960605621467418213148184629070795051181898610631600475141956877575705748780551030079535279390822434842453037166286438591706030638299501460332593582408355701860 +0 +18 +793 +197025322184063122457151668225 +0 +2920290130103280979299916267396345225782651892499153454132172827501589954561 +13539515947035890751742634672716012403055571371579065400912721307212126879745 +158307368218366335347174104263331952261761856873568291783365034272918926713725 +1815215034323212852396070290108011856137567892027865591453387561513196098766849400352437123459701948446227688759510102669983999161585665721657907478529 +1313998427018914497731975785557000192540482097274033470133500010806607846954570954898528158955314391602627353029912678650049483923494107529991028097123237 +3558766711272482011504448167665545486379425587311683496485361619290623375415884515332307272266520310480366471739749365076632262898225547952923293595733728 +12553285567146229581143238572266763310070996960196734618418238189114111487087176302379917708160855599798506766652438515952406574783180790667512374443900929 +7334817924922815993844247909475070087281744359403537502526299289084906210615638233675595384256475356219608076645306747447902878463733829119335042011404584250731670549991672963716637969622660364460577985065151746629898564582075539489021571565895740532432194811300868623563387061791622447110534725632001 +23782765486299170619653377638001085226491596574584464898704365460889585549109410835130873109130617681428671842761358877647827448636728589051462502446489865488918684639573926641287700719325755142839567735191800755724523772975690463187286534957742763295127666200814136161150077106827630178598134515070629372319788894871157470118252128383759870860296840401062420257746959094446951505893201604983152709936368275205715331071029074242829807922867113197544311 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +13 +120 +145483342680740634262446800896 +170141183460469231436539398536531279872 +0 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +0 +13 +588 +242981830122332196998498746368 +141543884952374228579411301124356217882 +0 +110892457497452005403581430237946183767136503117162566153549053970000476372992 +189155222634588421211288058609537932434095476696578287565656039885444474631257 +2273620924019535126443377586964826655364563651525119527623848142652704686460888155148600115764101538394624015930243455367013584122475807191504328327168 +4718242244578560577933620411853546035676043730739668011742858611491785678155178214146108560032528947886096115390359535573786208426628238424552910518225609 +5354055707309912886614410393569876624773886934053676926684306993550773407750553762949175437211369217571333055727536737153756343047932603108461352921558471 +25365469084896632438831937795363726978720559453448504867481253590410035300967847867532559492662554029011867176416570131146842894254418120377083085899956224 +3757578315429890131235493992649120836389777957623924867570462633554550213501972098599500200214418806050260619389176706179192857127356531256489639401245300261047944289856878017480929565003165920312519588880225017152460044735034054827437950584392201188531715789576969371957511327370055692497232100065280 +15253647830407583141547363309274688061512324567554978156617633130357138545424717528865172974543531851717065650176201323923438841684204225724333600965120694028156933393649297273989140526164630013338776321111358526273453216724232977621477413581907629724731139256634361519074694441451017597636834753579301989604484256575167632226812528730857727215779131743352342648896678763239802119364145369163238668734832577049562494126042421431166789603595812731097644 +0 +1 +40 +447233008701926529533965500416 +293158325512187360695470417449441151016 +0 +80370191198978495857548168233658974342470488197481929432131097469881528877056 +57378722967569161858531872288267370459698099854972954033385237027489681458401 +1266685019038549670156131957936105569332778969355417709861995585153701875900859319531983550779488151228898464900331805671022343202096261388828403564544 +4007316844468480444786209097240877242135343232573279363036730296408578470321526904806238868824798952651885510964017728127623908601645102032546751410140438 +10809419853862469069424671860661466104583061712836069230246390212316112130066125544420392691125603322947467815628376833408555549515946984480656880021651380 +1850019664799561828446887689859810128523634383437118940053115370804552962470182093340221950762057683211340120378944062888849213207787569638787758996586496 +10601990121875444106767485014957569656736374682760746624229897705443065241696873816254196776531479775231519679842263077569364013222740741226981954932170832015958461515448934122357561377336766895492078707171525168572538566552146347786295929420700117193632141413315523494643262931844585426006586863648768 +28508439658852678107665155972792842206287661263432505699726272954607239927480675380840437519995918207158667265234219975518214394765767765060644972734142492559569055673270149098731414835043509095821925810223271993800625817447425850539568468486314744453634053786991467939161412382560926663037539162059349437789487898945599562092125838900291727653251158883415512092048307124528711465011479916269612248338449949978973514357464893125428777863416659679547856 +0 +1 +412 +442771250107780063583096799232 +154158747942568048877474815599350831266 +0 +83509925808939041219467836468971382374645162274742749382395185649452566183936 +130737775035935455315064283330339683168756409303633081183629254780389959201676 +1434569753988477104238938016621393717922537334575046291954564311951618243596601987643360144150294172150115473086916074540367171462792383909655650238464 +1628053801365026402929640374014765553703071179544257678606217838338537677419257865674757673512650450839264317003577960931228650240349967706184064403237564 +9528330235712431695508651348872596587940214388314172729001944199117139203073649460506789237728120154262303033791074115687461447137304611451019062450033166 +4143685306341548231504887338288660968707624803700705709343351955022110657856432837240377395875927501705908299984063250507069218496972459859740452129341440 +7458796787007837004712235977661789416985633116148918114280732607368491371782197880736806507445402383850766124164590251775004743970419719155659219708540227384445648790605201658248003617820791276119099869395011354078111731072541949883562883648840249249510616061917989297687935201755531527627290779320320 +32562067415072239193840246016716096268985518768069377976952382448190013331748839889139882498448289400400757853808819969655477710609459023410834554011819177127950022030097667847290699738778525902043243023637500887645421123275436342796803206335835309725086671594130477830499317959884237607103504253659374293236168368765551370942719124768927841271066850440350466143929412219292019549741670650796223584473716652795660385114766444013731211424652116447263871 +0 +13 +172 +791101013288846030830655504384 +153476591093627709272587559525863637788 +0 +16620630689278877851873420518904814002737213549417357007588250730268341567488 +135713742926877628027400301750580746786742856540376082400065882631878268256343 +2763703332326056666675771568612443973251095331788999459280007079557401109082037332230846287789955462113928953782310527076648915665904957779729505583104 +2824436745521083250434559952136747236272578919613634664272602203887075383079538439468738841849895882276490589513884561192461063598286468221544075155317742 +5573805721606072201024464091196637283572352485715830551875562715416314364897955988150179092473897788638830452265884540199145584775259028641318262487547968 +4057677748936070618844094810747404761610038515502652344029344965685330894561953958031306249055086692013728933315233447834639061360828462307224389794398208 +5784796441501303882265576458065577676796946906096587650440461985290957058829054847129274276669244130440701590711328886296578934710291199277222000695005904568910944144582690667672945892139302539970077461280831973659874645207539604298268246794000404198399473879519441764495134256354634643900506642055168 +27926326319599679689321531260972663838094871826824944182829437453915195129091090522882499755811750977000485175430688110045958476439969398119085050907218285133398254355136892348358892640344189516520338960373270419222146816179324538294913966113727777599048121837592524129719217066985421105982471108005619786655759673241565670064548335049859971927753583710716463045164399494432220069188699341199218886010208466355717064435978272444257082416306333129756637 +0 +1 +316 +71681696331238174643235848192 +237948749361170373273798232100232473131 +0 +83778207020986728476145484258908144082269934037053254715152909632561590829056 +221509419269785716227233899606918240392102327497753358712085651922766861983551 +79315321146264542418544101067771002872575912085812381774279752184308118738724006743714953988893825146071572131840361116250475308904572550776268783616 +3141911224089662508005439140547996848411545433412668670184330989833051246389721569721933639157984163331306326586989550527910321306108944965118472936437373 +7056836934790078890629897242686908388561326030807269602244791722619134700685270860402176255162872248124156286310896170748542196945067054699971451991857017 +19653627676393504480845906820110557077219860495796321885850081681411361274754697849285945541928921052518914208933686885858752894441356909201046802838585344 +9683163169799910671354293907568672381107851254294002957127298074004784481037839670632521780649121780401926430183897832969166328037150107405373952334255388250551814999528496252119738140300795402325170176550137471892883221550198049424126188627968546323114246254076277484385665176149283033551751023165440 +16624156320060803479105655673708019093724859687856669901597323414016554716036267842673966767033477560761233327486461318339447602081002795923903537066139452947433702150477385673218681847304679734427371239598965310386307842392299911576146706135987880533258592628104184356529185963203696378503916725011966153849031868468134727041450767305498104186987445591841485782186937410888737747186818628076918609180767095586934198055427262999789790553748249680495030 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +1 +296 +920477174324206192629261533184 +9284550294641477953059815425 +57896044618447473228882389021020048158893283581286713298429387432951596187648 +0 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +0 +1 +576 +394649121464702711197113253888 +330655358119337089933926862882373999920 +19171508671161797156614710182257630792593514679646789380628699765537557708800 +0 +83428280595193522049620352001877162940388365577102322638744416599597810157500 +2383427170914810336472146115059610133938440685431786051901133872674812685256214433004766571822808713024702089068992214313240618263661712821448505032704 +3543131743813569641335946273683240931826614024019546282265784836005828417893383322228810942263163410646159776819689834231870373605456177912242267705525812 +3201888256116239379504709172928241207634570507519243666267842079354934745091409880730742354222322722404797424377578771802961012486596039415971972097760189 +4721437724763666216912653616574178996088489462586407187533602132486864388960603129501403388719024042140502457650359696753171122610737975161314352895623168 +4837005771188282971935407089657043487019168586830902406943047384547231889109685650839979581515180335872804870881921663586570464571734302300526117404207560436370497430406529093043461008746914986949167798918225893839078999027089145630276892534029320307629830535688150128766532774699466359036038881476608 +14649538351459906058741226567249552783659862553950272384082762918585814063949755926925837749924987768515640556340283222177993507623584971708636450851372760248421615193323790004038285247571226256925988926564345592560305885533717028697892048480537531768156992921912334188996185887209116041579498773878589854193709529378983879403351880522010001304035516272695800246073052875655027404371065192473535905888797416623200692032732055359224565770757807776402248 +0 +1 +36 +459149829216013907374855159808 +212514946886893049623689635030161573600 +30121405346709427309695531890582421791203074728165296179965859962342252478464 +0 +42435402933391614285072618340065308663204835805291910450325661435301593697950 +2723474109035793261196285209480520006576094880312369272827686699655845402902440783445003022414244095338650103254192634946547862282922709256827062714368 +2366345409847035124374650448074879585773647708631341355179263252964806807879670158353217088899380315556678858307117619065167384939975455280949447515369567 +13191762144369989130760985435688757812828881793396707694471183793997116204175863881278765015080350072806582669305591779418584954819749146010893985699341570 +13301718048073450430547712527884367748161420561064642294015103641915503834019416126543999762601710015216018615418920000282926562454589067268249095837319168 +9391084627976509998795459430240744148278054341930566001679916095435726828423076214248815541128823696135595365039592549569884022180775653333743792501900544596968163878667412922650434328739761497861462359470427289461508215509253714046614049256486535514319610185904255475081934449011049104472856091164672 +7354519734624006876179435352514087233297298809165790925922795673494116116655759843604125047003991533731435264281192336103815636919140214933167210447579405287498010619153112075099093006295245714725499708200955637344617781547142646463544824911616543471784407538549422907647454757217835547791373749159887064306770673576013161274312701154428403688789455533688700894782342280314573076414570285083813175010660748552095076178542404200729953294305533949916369 +0 +1 +440 +111480890522555005842506121216 +169821875159927040016519827500463371995 +2219279707535425826019993588723715376924609733291444929791090369095624818688 +0 +125210688265252194710996471277583934881834379414003707914695928587186801398100 +2487150548049686483577986346486345896197470598544823109842683510353284256291612496904302366730404150860292761990843784069916754136788389949069787660288 +4665596396220733640168649174535027159196397070342267963244347648666006311146611981668674060621225920926771133113452576288300091774874699771692345174655000 +3321497911172409553001804903171022673679565313946048256955779288266740305599386551480119034076080803092083102364750364882135550956683614114559617436903767 +12793018574047350137248079672509016968931556367756809163171704828712247163091906244764359814474025125944855607579655662889196220595429789208504167192068096 +53376332098238942237058265874185808937843825750519948116793606680215516009579250363703665595580229234392378617881585484051555178971860102930997202131537779988926409286598509132127582039147943382149262722075187323524856262926753691304631056792968823860069761025941851259838112955696975940302445477888 +19923611385063419051384812211007230050060207617704483913568487020386612675099470773370717657374861044992939563075540978208277455783654511878538950291808744228334204522554009216806163343973548097843046243549174022328700851586804159313601461216565391487177684815873717679059019796761667669491458419882506144601791158476320022142436392910265642137030624038589331580844312683788761159106773836049440285100183481918534526738945630197824116914691687618255349 +0 +1 +192 +973066898438133470773494415360 +61333559381831070683658258698802878545 +53535005721204496876936515275724889845817409334527168350061458281042045566976 +0 +35340054082346922390131417025011886439703502295343037882213639103251549897900 +1009118888395535762047061721180456806194166614565541999396274651526674300640202434640874659775936931364083317600665242264448090018723165449003588386816 +2392526284157188505188392690013448960986950491375028571859495919060981215979514074503662055648827708202314679184721591212604079491336362235307206391833426 +4218798631160832202661168847672965043016773529025064083427701368151868437320716279368190139450621334670500868570495563594616568204374854957138784941027870 +483959849385694416988953239395437763233014877575377690428602005170645490229330810160206389562974522706669622381302406569004289640692782430642495811485696 +5378187878649244049653816422966231411527819255785030355895748698860605699359864142748498411935665392420582096163286983444186194198233107257177496094195107895074872712441771334893808547355079651652051885242856910759791626223884287793085982216148604993192657336251775590261767563683353789243163725004800 +32818464130850205246467682789169918339482637627874185171064672905340879331577799944668821853359894806536530578739275748702344346513314541480359830789085211784100573835252933274724858360731614753176374779056545876405547001284878778829435612577133895639650041742079621450894836820613872672377867785376695923853094317140137484881752383755066269670040095376107209776772131790659671001065420513961226520376690403010625950002651054751819424823637290081472387 +0 +1 +532 +1054096356549212854433844559872 +295167673194252499689312720648542539285 +18569052254320792886536065199102429830591425911674802887337142847422563614720 +0 +97896720708781798801687131335879227111506109430789223376551280139659913587350 +1634009508410887242647804687779058371050929112656850452045994095398157878806417902701340267267910135426243622542827304902620893278343438781078703177728 +862159323782353319562779470318789629705961090965297342320245925680889441369443314188948203254697918300615698372425403937959274851949640461887703447193841 +7173051967940195554257280536479042043827601659905799457098258573897554700956880589901442356513658795342086705483095145011273200575189131337241532322688171 +14778026829432832620717758207920676238440861869481283376192906681351851826811501922740289231253685732115671799215873523794595875524613727991318894568538112 +9743687940329798123999941212290764982687335446528161500746427614131976390988057307286128146303396660476408358788140586545951034783015956845304363388199684637129690259093248015713809461202981476094156748203762337562483089253099990690430154929727318541968412839173701447769414174975320032013797193416704 +11665082978646551184396197271822834154968679459301162080769250076458812934480608734582177152703187939426687223961976274547227366150916137584109379949067630208858792329939845114289322648585580755616610302258512584989884644997352747262852786631806253344305668062922039579812843505258327167494097412319071183014601014647063034669866001123270058546336028496149434886023941746932012392894414262845484462335477059377413559348424920746843432610014073597213636 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +4 +771 +891784777631246170114448424959 +1327929446201306785262743695648620545 +57895602960811796650871631801676582813791887579127636891104569893774562426879 +115791647579680518644692972256970658065423327120836162316857392245886991466495 +0 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +0 +1 +43 +597446603600272666897934188543 +335986975837048587653674597853034419125 +4960875119562861993119998040929006214931859756877807299872704131313015193599 +83869314384839239184918994159181415456293389193220202757469792852202756243455 +0 +446851339107039186419289111745794461503166996177271801631416983378126123568718875224988495884755883200400258616355472950696139342262717961597794385919 +2457416883750494183832570853589468397031071769924709837931117427688509339888648917495080941417107639148560803684251898538275596934697939251488325371868124 +4104295260045454815975181617904063417540583687524096503951973213007375671429493052370291608008405377354342405201451646421020861407202042797591936611216757 +5398900427668751217850873803494875937404578551752982184373461962988643267134263496913051856036153441820443871129747572123078186712219756428262779956232191 +1007218583726087024268446200406511915539475815058077584580036382202886749107233498655574150289262240696650047786995708501433958989054102047792490904760349592902261758650729430923763743863222004063022441814082480599888346140582423150899204609625387915667741403853025291774074147108688932055983390195711 +23380145599663018538794334849478795685367611191421527490464557496763254711125422173670092394177895709559935294769976819952372348766078401488089491379204849818544542158134496224979987816433965631446790943462305235568068590323956450149969681186862262029930095126068867520361231472357215498730835672433665458819876311608479695607535070166435960898021320714467950701155806239822554229659277947203115399804129178780683995750006285527204806890220566457893817 +0 +16 +417 +51915870197464503363519381505 +252258564697022016064972069604476995730 +49219110417420231511113764378238860427237875311237523872333835875498405658625 +102059959947892163134217117691190804610012473033509494849327043219849901768705 +0 +294741958829571476136926871256484717091819171292816858794352010629523393545452840612410539842221513608737007525936314033110034418127477704314176143361 +3610022075817249902604614007613923579547402226882542852635039392814912818785402413253274269359316403441885507203823787712636067696281764519975647585808036 +3482683400560148150354019097545843271463498486574340530929160498845628623564983594731900657921818042087045491261078134766035389271551015123919424955561779 +2250865723942111784039421608251851432625547218473942867505887413831061852377508665133755951631672797483190995230665622102487996363019684093932899173138433 +10365393947735305013406914790529970011789937562186538656086799243490315444313309044458058836146192026472268081854266767322163579707977712683519957790124192466318755078159491340837738702367012687896445047003782661660364048868352982928925323993821529472941240126796375997530714377580986794001906926616577 +14333822648693704865076879128906075720499136539069158690685854059407099164825884209184916036182302301395671457986593271682838667112004613576105840990149035878508820984562415792148035482874225110645395684214966452961820472792442602064243527154948068695736851229344379321130087114111462740896607157184206550890192589389891097286967351231550279425607394341507476319668354155045448922078367672145026743791767604387213710928364307934410387263608077250700922 +0 +4 +857 +1131685075580794109740493832193 +5591051640426086522729162377581522820 +49306867245429292665712135123169680084542437782148851479415184718925278478337 +25169675183049498057756995668265957449819867477380947926503567596715595792385 +0 +1542102799772537760963096697799266983934002048485565532539213661192226994429815251647197396526306187090160124800082409862575273365902118268755683311617 +2878686104109625229862354165402805665509620736230260577444969531934998053988812440085505116849926944621437581036715525742444317675163909046866434002617548 +1408524625048880495289336975458683532829516256219036238078109087870567897704916529748103852417398524574297919263661719753670147382638802928308999469587009 +4742693590966914277133482345622645931210627503968707620206733070482049794927860629080377711683265908227819055370520162972241526589942916768449868513411073 +5553130642134937791530098743023191297911732972994212582055485264717254209908250004950803382001574291176411334745038178232430168856024215688613524818989709760819986306959630308890022984882592785783047391490235914166320765169341522983194375620252621448545812049279764384555916944408353668680790336077825 +4723927638618295083690092755463316838498918330240796682728223697622545893312048720733281849001727094418300588431465926349278460120916795941753250274668142622894086165783902042659225253028435298371078758268910795425148305403592272806883261778790469890737429382002305486407398555872939312784693343967014010596526975636760014820772215746889139520167274303379900890377661917715485803657804374133841224806618394107058611468658108088260131560551896063029806 +0 +1 +339 +813911142051622544908469927935 +4998080979218566999874015281917916555 +36694329931173559945696159169023191810080707655034316545018050435414281420799 +28634157081599137704071405870600522487246030369305940433755254306653996056575 +0 +1843618193774705784137956843790595835260885788482623306691425639970821561161960610834735278405087149627169615102857943696661773073162375892056240291839 +1170950137596410394079556452052007744667922551742356085549311726107104621063174324321159198410238181081409377899289339696505183364108241398143346683397274 +6266577599180715272643179829794667116364415231701874317566806045550798989424764451453171897199722686363150830763178386494247478884029147366386550475745174 +19499454418662965629802092201099350207580257918576731805737028058666848388525076659636862212534884659279639848323707620894715396779028548909594207393415167 +7491310775427379205451275241696534198775207876533479087995103252323137907742560676206102526955127596768143236592364563919391365130622631807244861360530642258721353802216367646769792844931749654022069462592705831533949527241530587573297737411586728906086303832296331156380881819739166686878092144672767 +18796502162760160226250152204618694839807906286113092800003110777883789218842243583036064249900793594494008242546403509188567430371285061255161460873411492857908336448904619340775306266718509033743784612836222680866203517611201799111354771581380221437368528919952566186512228630174278700984373922250123310919722657324347467475261738175114760435522588005390001769791388961028828314032397203388180386644894795950381375883062194583758183135747713996158476 +0 +4 +729 +828471727968036044453779079169 +246763246873648168750114309847746005595 +14797796466515082470342263148884814370442076847061299435927018837432355258369 +53523753874056411494904927181451501266586517086289761739581598242912772030465 +0 +1610256322768663008681400364814073486033869865214932600830364116109232945229182624979010068028626424299039929917408136658184480247613110744087848288257 +4982989173773022649022397963184917180752190882657662748886552370901797910421968943370653256257967628629024664151919676967847090084950251857702290490980262 +12148110333218384648436139282566844904693423767379435822469549432550659540325752661673352721491851141598081552703324243494124595306618572675953315479573797 +11028869767950066853862903870251721369434866526464337153519928986032553183047292589177288689002878431824162808354999536746934113300550015294401283448897537 +5564677243506565432840796326485830517108613266274939211083439123715117854386689205611896780808790236784879267345611559615161743402643098893029929273758889773892627347825037932396714085133601074675261736569510119123888317868706628104410262093816075912392494216258946925258732634257705061191794611453953 +12832448199509312748037695466110344603691973686346158577275697531431038398255234604164046550781119126216534644040340178530673012471457078814611960997016443056894042854161746711315668268536386219382705407726308690881678952673969590544355499320160817266809347245168990155961021732027075310147074025336573553132150745598676058388830602694665869887746332618578258133919549090512076129869049818309689542631433818773293308811803158552451157660610127239822650 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +10 +348 +734763819450510610632565325824 +83076749736557242049732541826465792 +56086793224325083479877516880625996376700331315327416568653997679101469523968 +43066253535244233026187978142387001755402803069145978156050831917314998272 +201496559500976655734260440277137434576370058288390243702942488773257463333742 +0 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +0 +13 +684 +887995200883511538239500451840 +185744035486811956755421374818265305947 +28022724762678085694347421423886262818477620187692930983847526359050708058112 +60066058720019429804858835809980860963604546002890479581904231770820593057792 +140726188198724864302983488206145216978022023086026367060204697866126599261742 +0 +1306435882293703054785864617754127645947981008635081515972982328252373992773175682602366698784049948578438144756464452476167658757197266011674411590215624 +3418924933199934873321329948743314146142040692630731923496865500679236033474734183436540120875605867521473258874285532970466381831296084581446997731696468 +3109273453047763295057753183837237869395959180214923717206774456268927599702732452171437824488600294111292564013762251960507352853270412970588497512497152 +286731836186446095857785724442739726555989697273304519023165182400415887707383423935925307951900182657313805119211164740403675553245412634677881978590896153075228565724249371402865963565486212287922871904886718220392004596796756145262329924195978312198219275306469037658944155791679821415216932978688 +23705763208580774588928458369265619438916460021945211232193047627926603512005878931377912938311419163243403002660952903410656586223538662133420783063393034282975381898012298576963467515440532649689328334345780681671723172171010972029952896075198416960048234210840439701334495379764884464832012212719290831505340271260696067947540265478850247171084561966330905870702345126530017405343636921534310353745046761481665427795564834777302251191884558790364186 +0 +16 +284 +923020903585570222185243475968 +134595118892137229728955299113857603251 +12517788472856075617475369492923779675790060603142796585343152963486180442112 +21278317616479394781203625492118767183546382422255138071596449473207327522816 +37333224946615587454531558429668776609410791968643457941551824417764439077616 +0 +4365216629959533172982077795378474518196312747569830926192625581814797043834797277039496659650371970445843961712911189437934023902885370155197127447599587 +7786275362280256985096504919805326940788214494037837259488750879599254096754641518066648702992692840392471672645638933505566197966897842107066681649920912 +8618362445903795498495298150872761763162723533326999016941555427533106887247180867507912332927251479902784257469217137485980295377407380260430728522629120 +7982146058423899625168899480055973629935142133954608148082398488598972256455265091746814757927002125120326401286119392678755814780700585901254416951099507381124434116044162971886485060919796269087997434118497014919733636378546760466317072097028651097132741041399433702808164954962506455701888258015232 +21989330961427482320873414443063015928257919942443821711178892798696487896352353009088507622971045148342817299121972243674879166058756712149437499808420544292407293376143293804754263654378017796839550542953209140796361828649433680420247205870246799908001987021274080200394165262473622337823240257874872815088714497275294574219657771744609557582141606487864476140423350129460552762119376149626806864803509401361323064126501267414575167852478576633701103 +0 +4 +192 +132781846299563114295034118144 +287795638097315923177133982791898021661 +41260134549646540530567879497450034797936197027784201139228793125077872803840 +26725487537631090553213382951117408090775065651640692466752663021330299355136 +17991000660342902270761827603753917202037974525700770708412111282505637002686 +0 +3944008675763809747015020665178678882677044257366818833894853057097872891661745300374363390097768393910140535804055885471681266094856681311889793405842943 +10432168002169925309120503644722046609224368185326214525537866102657473676610157919783033661419495704812662343601179229565468596161053474859566232729971168 +4434125550755468286273915949559378521845137875362780075693690876557539422008078027298618389135234122502995076657800647221775819541243724097410850717958144 +10544028428859860647631953921720386323000119376125885681800950423087768127297571058267839503395689317829039753434382369495774320720145371495400808557366564483951610047346873818659355869536197251947067485092374284236784198628790721882722429857933128554802811282519317048898934233902279839985805232701440 +18440345941730146769481994533733567141044993718475504938583318912857102648847047027910392382495051573769813528456979411954962447707741851707281536897396641672916772895898381890381674089051912642497004147872377088851984352979390381063683748636451983558056315085668918214320300476071304869797011014426609032047214117423653962127333957708782154126828418118548172708012943197384144043383315600410200355075913830695186216882152046505722142344944887793337854 +0 +13 +848 +582024649450436441833425862656 +96569028480694229617495306964621095513 +51864362273957721702450812674007399695894707256635407766080228745350205145088 +42338700632985114555032701713036006818320082283349136714641228033327395504128 +215954730055182411688222939177706107427072066045627310771072503279957579162468 +0 +564120810776501871547030068641973310984074415468950923614458445915309234305596816720344025395793468749961903973331424982658487492675732875715746581881639 +9512030017005233270085163286414408214444876161604376761868292912053847917535106665754020297449298958739630340441868032179720694634048588859831514895174004 +3424474661482523359099400350868558228999347406743051468541630110333927244078257761445483195343636488588952518919760460591527948463291377508337491634028544 +1908744027142267160255992222033230928186240062062564360139414061079951535468660083714712566829573866331135382316682210055579103865954047482673249785878901884126518352007886346248743951305036458287883359238321077240214116300549133893047140060961188058073853208070901174162050948796606119057608052572160 +533753182221943739411515817506559992144353474201345586358967700583566469936103300520749166184587887860573873190047587658861707366381179609208438444812890854907402119224883354291361848266886930865694292240182736475266290660159879661714355945901578730736360959787897025448543671196789177297617755152629881870393271660514425363164245734715462258579427757199028980848704112940977349320451917649697374845997311260177033885249436939940782382383929118269489 +0 +4 +524 +580845881975944426787514089472 +247672215531302623220114886854143351291 +37388457217608581848439794961125547405280755409544281555421884293853562798080 +6867524968084435742227914739535272191184841314026237436198416499210501226496 +37084585770552631634036071894836390875870489411136211932476363892010270509161 +0 +2060718003102261095469378358151405280518660285538331953442371394551388847723544748074563153067316177877347237081738459763835643097859427740490945401065896 +2427597878315108052588416153186371822454229878691660809974423528713640874637568365876246285814256304894224389434236414966957500210729605332124313726402355 +17899117585006203601483637166090154016991728785619486538375724587636009980913873117460186227173247676970981855052572465455831400785016798907992702502043648 +1871601166577895913665863813882743743306248246207644360499054669218177312807383799762174801630805340092267502315367248573627278277545825513989809282952455822056852517152157679111824332559476177533337546335447972701488371422446112963735366800940695179512495443184058856851596498196420939445759478071296 +10550306778399659975487897356875358924973318622498728253620155978576923389364488120390171602550388451242602890206431322088607185746985283921168954364764596976217073705682936664824865112089874261838527911965608302408800742105060068062502398384764473486663935558909957592004243003066730197686300227260257298269425658277997389598475973630768006422518890534069851801433726348188900604318019697404931564408067035791107685741964005839508900413176154475821036 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +1 +455 +12835319081690733822122917887 +127603331931914074262646774143133941767 +57894298449951398757252466847559442906950400042978305056517893187912714944511 +82474589191995733226059000413673369947276401483368126437014470136553367666687 +1725367873614246661397681099761093360336884063153660970896243052915304594387 +762145642166990121634319750876330910924084988636669303246807590962648009181396757661856053558136824594202566053704052044355748404436481867775 +0 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +0 +1 +455 +346299262836863942390852878335 +124566106711135523024142034815609358702 +44045214583669272699005754870852537422943743579723467162109618579770773078015 +47191182087471614723727659086024420134442459808826251007744893899083683463167 +149345394318679384540349467866290540580664685942593858325103856164763257832712 +328659738499559851395369286572775271201389799649696769367887874387602713649950541005767198083760164244451135081042951771979928777420726556841593536511 +0 +6499574949616620637580116906143754514426259529884439117780273025054849187451370731789917263550769050214853609122367946205434263410894715910936878759479861 +10124369117566771149603816821574722189892029783289052707167197978669109873476852672835440349606345261291423564961708638702389275798144171277206026719330303 +5383941699543092305623443842804493263947292181555684893992973883142751498900796716464867906615276957493629319704781718428057228609756150862864742004037399095952297373496665788422781648005837085478113966408640459815231657886564133913536806437981143729147690610590905694337501640066370356251688307785727 +6310918068059471764026319883889981132676900864298663494645342741409042787564204104397616974568887642296873516370780274089671686771704841938229887196137460632598595783254274133337225772320128927921843666172747542030026661734330465262950674563868305274037519191385934219987327624738988091242143029337066541173427000341834616390107777280313836624864077607937735030229348205663463578720868333899592726387334113240438244508441849656170478117348105420506878 +0 +1 +1 +1081180894199368861240340250625 +276904095316794738679647588766540076161 +18514213011776190595773191080849496970028811091221965026218765069756819046401 +95073983698370028065196578355547349954385319767423967546472360718799690792961 +6693017956846532764960681557697229863590470801886832055562479247632768202596 +2629164625513944344764393375912545052754690348620826079674933659671918850737622014550902801880361819290452858809500518180554683024947040651570430607361 +0 +4137577240563885180314014646510639308253117303602681600936018963727274657401877961996913350454564200277844605264306113013779943962820037004955398417119598 +6012634743225204725211101132320048969685865768619552174466530181728480133292301029875548285114373185900664580122272341980596861811413330588763908353294337 +254535129586580270548521975414349752244526806343151862080007760571223205791187472902044998439332623334230660834529731711989369170257700618020245017747639011641677093780420045542350067272071826391827216607645254644193288995966198490603503031365625040118877912466523642200661116519635298806043651342337 +8385908846676081908370043980559351677127770716607791744592576475690297800091571658800512758412511961004663163941376701719082333294800426334317916965716031020176657167014768130949406498916053374967901129501825532754676652724685176412371614884225185706503174134155152063944407927152995929183429819648489312242513817944158673167844009257444561330167132349514611454316120198401977968656265677200605323359155355731762973826116236680898629609918324923846369 +0 +1 +1 +324956523760712896376838553601 +47627363697928134504927977366887218436 +33434307187530355896632894137563272179790850372650630159758741607677205413889 +104315921941200306811166882397908923183277873670404242656007610443530523115521 +205533708257112897495155981027938658151590718760836138711462112141640293797081 +1107909686739446306967869518645944435031236156727422752526394105581762893921951275569530192146029955926564787705997591876292833451590952315825059528705 +0 +308755345928398507077827126197262399264414124207949539753718673573534243084848112587571000480595914906260398850382596175138781946603416961836963870626141 +18244350893087399850665188670118991037975220133032205465990746245721929325028153136705422106519390226837480732385191993725441112016188775082810504002928641 +3665588193601842217160462892006519794441699353581412583510916962644156398320556835171594452576616053963810443333586339255795973680000246325868129939290031865642638045425971867009672427500503914468057445618838753197439907968265469989645596428647594500319536081932047598179754671610950943455199214174209 +22186396831654097227986496390728371980330693530332007779166541519242688898973938381447063194690736625552685027691280623961530978041318772892810396870809949339891780432739513792778708087762348742046586160063394433346940941101035727747372800903757578028991776450199349428475680885800121505072160076081825165777670772329510069207190667831629973354820426821121553497181841257104073871622072935426694421062659417600761519902665044177543487193516620418169098 +0 +1 +455 +1168225574662879022832991338495 +57044890746169261651982104206166026733 +24779217388362851886903530808112954986166879528618678581940026232185554993151 +55591006844159235471682881367005599231961414654778243528698592315005808410623 +196546087471840559446390920880856282064404926864490466841380522742929941658568 +1917639872072259012937469746034134309612115999398820982521714520910586889626920621215182691543587130631234794290116996439471618261125269461687047553023 +0 +560629320288680383605194363023384807151678143098424596613421718363041709472766750167486947243276747104145109416759625120625677741081131727837587049341019 +21759673470171209133072662941401074809641596506044027427359195245599749269615278218888544963788731822407161900052925229605030503595641862078189438914002943 +8222674955398877316557535473602868565827602242812253563419515952040766275770537334852962079852348771177051126858608391846792829268299315517383515972974712379197466243571886838842455021350337318953242740755305732748699335134286099636570483789761728214215928903659103496254292223405306563391980052676607 +6704878406080177707560203655054736070477248576489688306407842672251903096919006312415980371154994403260429964471609192482935456676801001230508899453034708688807610209409717279310365716437632450197121589568242633422750297260272378736694314947182768068352565076127017290514776717356480481674630872849763970700450069226388331363736946106411055783778057065098928098706626638969150760900186745176895660013716070551573583271188993227435662677589978033750659 +0 +1 +1 +87563840629716667648756940801 +32581458921182292884541920892394116196 +36836091762090661553341041736371299478161889753078991612037085885874369986561 +103386798190572160839245264014111757730316335866975469301775408799589041438721 +230979096632485379690874166782108500616204584679462971821585472432375012098081 +1175849592681947186381704220573745682736611171788630769140595898826048744669637879095677970676093415500222347357756142334095120061003014283574860840961 +0 +11889537611764019713474395414522017738805331131412830425961734413527746223621889642851856767739924676858324754442498238690013743634420772752231361918208575 +10100837533498068062116682421711269237464416549039194254318934545331492474511664814492105364025928254622293940722169331634657785497327849544082846163927041 +1369148440215267019286304149733761118056665924873961991411630969747965209899998790716499635578218937487656801015714762781120580385002698505340071100124982713842184248347860416733386896580942622009293934979960183456583184237569483817916647944103549712738217905254990813029611090034738596009778303991809 +14470891946382593133261871975556948917962250576470186541215002308627316792841475378647804951570288535703522370652296694295712464047904010907340184090003647914959531499893292863053894273874528256748420135416037596722727653113848255103464219786106388140414129037919023044763659100696777268559628822671794913188044005920185870352459166957980274030642096976079120265889000691672667107327976040012293388052690990946304488345186187456257606086924331607962389 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +20 +595 +182776107722364003135434784767 +281466386776064 +57894277771803943810359491595023458960167522338927730828258057680034478424063 +89555305827206481420887328961785203324625996138257453019240897699860153630719 +31072229483910585358509303280765563029411398133731077240605874038996845471709 +3273390607896141870013189358366943131609359382662427080975450085374873026606564249289725539410814263596351691407518053929870103702401568479817676881919 +3351951982484124983609172268969732236347481510662869536744042230485685559782341996467619926017805728755414692283401971053259449792684445385138897718083585 +0 +13407807929942597099574024997867385471458758537929012740010782671329620832395834992528134114986407662672821420428107228756016346166874193365792884690780159 +13407807929942597099574024997867385471458758537929012740010782671329620832395834992528134114986407662672821420428107228756016346166874193365792884690780159 +13407807929942597099574024997867385471458758537929012740010782671329620832395834992528134114986407662672821420428107228756016346166874193365792884690780159 +0 +20 +99 +959889322504300279480128110591 +226336563431145028687618637822844548759 +8191728281812111000214169178820381725838839982899041198234467802159092072447 +89010858809825214210137289255494412179471657721652615002925377757309556490239 +28296599574001589588954577695238704244097106391390255507549917926893049677184 +1143685232425095012373289446686042380253702819534317091382577237068099768813347351859388607019602275279637030972001139645555685678576527645905260642303 +2104386984118747727716517063913738816025890811467756992449715776590348174368338808503581044664946651173257522380822233775261192222343142632013731451133938 +0 +3245766926972643552330628549049705392854964955772154252338528686239084242071182385973867724746592501989847967320150395945141828002524173519974765401473023 +6907648306248975720047253807553315878303563975921476580151692887533957733952838913222178155862261045104101262891677093360305327510435202370854866877221225386828546336285443261625103246327521271905514699410432996107397381514692809796698965099058352936055010684764360915671953963860003695683345510825983 +26447750664679572972311511491346762878392092007822795854735091849389623944255827031514453721868656369736370805514656452589804235525013818434397127292257036933491312808959509859350482891134824058764033024690355796359079598096947363393151627873770672958867270537674600576785634138230894329775351387231396268146781903236645159728891454367132969379219264931998221585031609847512363429272555066238888068880222596086485264677276997340726172359858551867347999 +0 +1 +853 +801006859139436247401554247681 +142225711339612348039388698959539597716 +35410378673742450051313678883687618704562356389379983514233123876029687922689 +38091574202374902858714012832961735959144676797295175057041826999843956981761 +35509638606720435404002212308149594900713246317816589861892489724156349420746 +947006889763449443971526094184752460089916877997363377410340189611125125701316093754306776646584059092783200306323088027637258553889934093760610697217 +4220939006243733889354999574941943865608293932174863319944209124029612039884827143990223224550002012724043690083235647740267932838159837905350721905177008 +0 +9819440398814080363130785191409752685155104538075120057014007750225191492119731772827023591993721591147390320845851382883568011993500439254883415399333889 +9655632408759825233958611797456496067063588648590435065602226373676034823927066598142456746083088436655720971023229982832504728539123316354948596655920694029523232211427760301619988760938379731840724545418059474244039925314243108598463317618776112331037188490273232491842485947576029350960119525933057 +19168469482771522387361980195401090898697209536327388812153014901529211406007624393592650590928364242770484062532946351666565045957764391288622530585296240046291185627706970869937489824896647625260613504074528292679224168776865581606886288126591395731294608037126460284763239262254718080804765957557128258706900873267005249160304719047478911756155253168469506131790620297150118426293519712473869983955423743730285845904324583142963587786011293140146359 +0 +1 +673 +715561516884788010108823011329 +286119718739330631910267662147206086291 +4077367256260361378876724861054846658815066802262232907668922921382880215041 +100388196731105783095258894359755309057443209346921752384716203296701221437441 +161978619973690354040532742933073207830461397640286489633556474311275198068706 +295808498796001041580957434812431144336907268953236122391222657342664931238894722072411794573977944314328249736260072780418263762201867190982817087489 +97407145078903878701182151565338220720952838018650765330450334535905937357373611965592469739325221569980257894281512858606923275277875824669884901395310 +0 +25619912338425179981237074026942021799265536991310528535894660424287880718210785582129672576271686161615856398250702958965821900733894974363009685894725633 +7671522909468965446688811864997649775732139334764200965671339202409525004787427756456574114546598384573443159084990772200209956297641268137668960261240194749599773379609102037525886640588454985746187171015912121459949370747421414640087855414458925160365198194096646399383154836512890554710890718953473 +10293884923205428378666956554848182142244715690619212169171170546179865224723565444900771453248701102868483061985574173559709761183179067864659447677846955231286308377671525004854738789280605580119191885659203370511449399894078589757295087079227410959307116809855467581150399434097595488801159507371338585214103760300181569615667928415747705672332480417684601788700985353510796076482470500651763753290405004222433976439506565358025254851862958596926224 +0 +20 +319 +798574734973800499883498536959 +119319092661737199044961145581817753859 +41294191017998785012725086702072135678398504724859270409452353997253994610687 +110624822424825875387330825570332783320826449688572761060969648171618999992319 +60004897054289201390963390115257285329375358987352500183853788324442296431274 +2150478234121502140094205664847123566690038384648319032584399902322112031029827710253123600637285764878597164636106830261747369442317038978555055177727 +2286371016578508441121921294709678407693328940913329697268533575124016682365838296403222603898047913087019704067878310158113313849417316810388464204629572 +0 +25671226303654754146969894507457657987204391426702541645624778236755811429128127378887919394161592482970532540809070418766878887011243610093297304929828863 +4785525495332916713108346669310355883208597124913721653495570548939574646651963675833362058107793696545444101958156033302876198568608530737409310207901760770957083322440752303097212064072393248697788251227338207068162143919875155956848187111766304706403350196933167632508223394324726953817363397476351 +32094431582633234807734495384819130272063712020829901878525215417797644447839755174060744776726644205182311880852974878748451402374419467270518797046912443530456212016605470991508907045276371141670695248538943422952924891445929100158107096854447459717681547826391098044944416207597160685051923871604127853310380648807504003049978615375745963324507225789653536595005326797804437482047876186051782235982636836244442075633553513047827811973923415770476767 +0 +1 +337 +1188247491006021359695801876481 +11358522768134003317334293217035462861 +6973218261549576848638199934276587054115075947565903430900153448684127780865 +45591291715308727736165915509600830342618838112033396612024233841157189140481 +40977506359948200822020517638847374989428006593590887799032148830447784766831 +3158526125081113331509898514788313887509900397230108802808242305275074329114995683632326747175671847567894522724549111521860848666266947552987433664513 +4584447565436503172316825244033692918247702864479587471557460110462846155092582971475613387484731203139053010262859517492416070493565968167184179196803079 +0 +17855886664960195299137683256225599460539695469189441741138167148311674787837063586188982923974069115198316431121434733749422291458227574255634138536083457 +1374356246318253574025982110729726842105081842171225422931088363015788466146368528015009583509706677602458662747215994780981399824925913453782201779377138318045172999325810798864144189015648497899487658934661306497156780183553405477807924063800170898266248650878103340616913829333509130538752749338625 +1640563579891112614924709605958688587289742793630758509110339884654417246046905788570037457484399424416760895124676877531011891636277126802773558750473620855831931500866708684883937438953118514443126192930877064490752020898747438980089537975395182532494013272495476219349907646220024050095700438285617434068609057901263757996869152424637406600611987744170919997651080917069478242122542753946615128758176926986841759042912203967255896726167421198572976 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +3 +780 +899245128272588436190215012352 +79382824738944801807794176002 +57892510978869681736730162220291002611042557329170362915611609916721313349632 +63318549916452990938470040291368379201286383559458191806845672058759835287552 +174649700752953765434988902296252491183916410461948522823307150782111144039507 +3273390607896141870013189019906287111002076719299707330406074198757955051929170942113619750485120149822099821188584330248544763114365430245700361256960 +1675975991239013909235918173490637855139324507692685389812651662983087942796182042459207730713681429512584287523480954202975430917613169254383951955361797 +17917957937422433684459538244547554224973162370938960458267029029640947834979519339152474433150005542914 +0 +26815615859885194199148049995734770942917517075858043397979502765092926124329914532610493203135186264306101107885244098459867671853087539206018919387103232 +26815615859885194199148049995734770942917517075858043397979502765092926124329914532610493203135186264306101107885244098459867671853087539206018919387103232 +0 +6 +704 +1177162594896717752709689638912 +96077425054455585888525548032358255307 +32860001485564213363245573215878063920603649509172460851204817722599339458560 +60109254545096573330255392159285415923549233358667844961269905663499962417152 +3073211245680220492517146661351308979695018043393915095083610251485928253557 +1196437601768571072681596644798276004178149983088278508148600069149523733201731793704103372368213233390444497494452110276684749064047644093326087421952 +2038636880556966905914764363156480651959910168504797327228316486248128297682164213768446666903998086070536989636186162862522556977670168122610463846604180 +10761508670374291972420269797715021028414464448240558938464987728552613552119689435329519427607648808039987095579973579961133046464353196386286909020663497 +0 +40984697395123061397847385885955617731982529976694509690496120168455541366383914951564162858485528121548558319374726064139914899078481865279546572464299479360080901581918627814605543248487499283343493082927078480873799428963538897690536507270633025904660571444960128829640263091486837879144125038592 +8909946412269299572792850981460782799532037067275283441188867265579333027637974855653738811158117573684759311560589042257190296847643010765802475698723405320867966475350089536733110413273085947267298794710610764685212306019986582674496969299883756072077594732387268624852957690791194886450004295782387045096350267854332914068470074912878717285439467272539570799182006042059497909029848272463040589609458879066125823035788194404021371601097559221551987 +0 +9 +692 +76435178552732951009197817856 +231982479817395379926203139743231669376 +47577898445412852300055548317787946557302802230354890877227185969553614045184 +94970241355010768267008081913617218797759253919929280496382103858739366854656 +14056327310363451370485055691408505290446120500764073466549198485574965172326 +2766964662182057386500329725111256292868978381151632013212396637813257618816895179949288796855976654014890661438562190344471725761340854297277946134528 +1329225061763580875918533781650822376275620990297295670554223160059148641553029627129765204098380667668821227128123235735809087554397139852326517131173276 +11097141842847614394079602992178709247589894415852402133624794662338776078636709858667481909108996684238974927213647046033793578164937980468332310219323018 +0 +8071735877529897797164814472711670751575699750650911010717417970127274646674179517149969617423521215633934503699616678817716843715742637948946050252837432727686220974468561142882832356080149399758341834298569043889563654149450777405007560189562518343814488242871896319575202397519320214473602582446080 +6694616185800266287626591614740434614172450545677003882600376830829359762042179214842368391192674719407443643400544441630973206517018113283369936295245057174712933556994499956071283288989464799795553730151588182776157104143243273082778860642399792205046014812501849329466277700807982917596823152488508302015315461955865789728769054751228692423119905880893937895064193158759226982592756051890511086607781198053342618530824939847343739509034244875431247 +0 +18 +856 +672949534961130560651949768704 +232952537159279159427935901397589147661 +53562723566230157237791876909273765997707933576810908258367261806129122902016 +31550994824562540598335530352687292695019428977242991470692369974431355764736 +152032362650815553704368562568087238407459967027457421226225849525712097091101 +45958219062793756897818223297329408371898301258718170247988696901754793869347716750803095228248960915336985565984017868792052415880945925312017858560 +2138965005429346794405216904139045984058362385566693925431000008613749092589355018622253069902180893858672397449645385554064735573191661559383999731945459 +5599082768478558353474373621584847716101862099962719911376003810521845817678124356992801556560959828813284665370289254359505555309567567683413487963442538 +0 +8505562198751426520419753868937928657815376861050869644650730877638862873089958249260761602153572619531088220914388128107806730704564885365227693238095778773347289827488140170092404396918489146978219366997692666431664422833499810391011971777952027507988195640695475217721220156144534273026766902657024 +13258845752058319557761867621646364193350685009107763072613748715545508884518792435165640060432501692620709571169303323832489898753595064750109814688579187658973115795780901167999045757923357842908980476028181042805278133908688854546483149229843751393689435259677649157449342132761603805685178078740303455039238350459994854784015714248007648831119423734010949858462504093063563879993972734732657191983776886556653813278840564588343475007599515963220807 +0 +6 +528 +754710143931888045283579265024 +287963055808859601191421471911256637338 +31470892304589511166080140750820995558894235651868644947081847455352142954496 +20368885260017261654021615802767195047009744205269123887896635371822470135808 +142720835682631691219581295413272156653298972135487346569310533961626415868843 +634034310188921143352280112839185376851989590898296042925196037660929073594178058676330909116314511976492745895031863182439397264248057241967936929792 +3536260655104985228570598047629889621504635464480007413999695872026244668858612074261286775235489798011926649959578184502755418831731290347207977473778761 +2287281553939530956352194620419013279616295380484047525310562106105104280173822770723063903213369365468416110828105561770407010047970222328014275531881062 +0 +8975406365256287079502146141544330687925839285578604542063444104478512627003244297195048898182515489030820157009675126108192822666606148894492389023997343919294064572180355360315826219274413911422788253153439868196680254069763329891225781141566431534338291820281857844001159772664584722309392818503680 +7627895627796776336034103253504663513973127224674837000702424659700877395432210192501491531145025624704509245843631295415207650789564811514832835249177414395254574557066114110734069582082204595410051869299928733226428505155385671730599432801289079265733997957718465603964310879479766099831516659589939704922842510148318960095699074620514977940993795465684303075866898594805143270298319852548800656967084658804532267409910838781960922542128682794059262 +0 +18 +884 +269006938810274604690777833472 +101610588522779797032951766648409694306 +40658360805639445426216385690775372728200090304603522756100519340351932071936 +91802138973420634587973914099224098988335694649088995732701581040017689542656 +160395547580151362819010763928022387697275046750539372389069219756723503990401 +2233124152381198796145991717823834504772859747063952845191626176084833539989086207836671472551515196170555448158422751623837827519669626403644933931008 +1919252284176976160011289332010981490746074225906227007498726993112622893994450491566696784468278809972885041734059388168593055735985280406694325759910450 +2289668776080774022092664264319203559647600991451909561040327250000009538496148645073308529369889500343496260137733562205719817974360067449226154885838315 +0 +8759003555859924455289792006122150340086642892965675685066523367563039345030166298894450331668432839835781802150906003659255941165890838655350310430355795467012027286822624520715979773959322702857888683940335230551215550420172560712753155144372559458294216901317555971294843609695973013254603739758592 +10233986988627486160165893250925551838419499341074966949334890607408070394472982377098453235058445034249828511040640776640636214044010669184255119316736950277091273009417324454157384181382413000016000601683912644163946480527308355567900081185611244964219361614299468279593357197464317206904586553970296516293220670021691347612227687198102745489374326883191094857906024566921950771760071555266307078912566589261856641951389747392777294648176011723094938 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +11 +372 +21559839277448701880456708096 +5316932265549267143283400319839567616 +16282337714987120045892153486177165723161016453744476162789802658371874062336 +88537159989150876890408569427587371627685568624275408353614000822051296772096 +117153649598454680903779921606971322936867216714956963589387307178373077018966 +2451846285358576582757929577719947826359368522202829009982370031469538161149259226929244677345525601309596834316982200231651181236759995889790497062912 +3757219424385931343692363754866841943466352992489416825487678472853020775555494604110835156534238535884545156565469882173219151445924025758587329876446051 +1637494313049913248505508525988843145443777840250318553676797222770022673451141317105487157651955800518089884835975451904017985829916792949984404185120 +10058766516776922387083424546997939506014390161211981301999104219673036875504700741486695698194962976600388399803269774949866748354955056527082238634885120 +0 +10715086071862672019870723708373567867164049597134887969429342556289689092328893032953381579589338312602609246283412714238525362926688916032991604094856600340922050198587112063568778839323187143820237543594206457218073322356882436956454658807341118763364007714359232059366253413058442519879029375369216 +0 +8 +788 +946214455905379764424855781376 +249640706902979523796329170594729366801 +16258878864784814636110793294682776772576083739386883456710601266131116228608 +94078769493157252401658832572786963194593512892920809466055866983486739972096 +195490272915595318817582071325338439133008656712282569735706902622916446459266 +774359154233456237796402928872914317257521270747766957039349342659625972382672493574510375099070233552293990548180408226281598743426255631871050252288 +3324275818746059767372921081282057650219072022078335429667273973120625111543946446086475227802464005339069654858828935205186959839930518363496383948716964 +9690305591136628284730559742274731850602666195501871310082095979151178872403510613019650261986889225542227473459970356781573066183889915340294060566934540 +18854688550460679120040977419238299860098014817785306576788948091134630080082228033258246996685817245124205310980844728342008317740737273944965604408557568 +0 +21535908620540850229409686341283386471970416340429967737238370022240247758101364064839301635897318433287340370763594753912136240228661108354045783804012930997208048017799043921041828011421457343668782820520536104076035026053782745857307697762578688266768524636747474268145327146906132830376635108519593754580661809442020459403107922707419305832717345589771811762862349427813533987428011905051344117484841279401140909699065164456004599224024146858711124 +0 +16 +132 +980393085630777633795127377920 +43821595176334581224008514546980603456 +52058795012750249675444812857939886156709846064922449115753994933360369074176 +14561123691201700806224839696324937581522964314772521776090379875080644591616 +175349175863053101686937135303271674300289639455959650994302374762982917881921 +1131906497036762609639522228534153459919865408591834031873180959858521631664870050151451799898073343006753689509175537114042334594659610848703981551616 +1350536895369391632569184447114500324766670158350291610958967597949326028999359576936432279782089126385784555900383659506910365560510605065726285256239859 +9451728608924473583394143032579162808176109643324961089109032935808751128466005303662886867241622116000970585797391055402890609702666479416682290459195799 +9869891012844468185531924549366273911251756943322915384954636117410087675117010026464336911857990363996496352787552233421136612436976661888444063719358464 +0 +29160913186613439708872461352513122879764789952607298290885068203114782142216922372207081593038688735241042977627651978016800109665004648282579021506383793652512992091245080903136500261598244223396601485010319512598372184283395628393048826477026318554363070339145452721174808395510502917485184825084502201409114714736758473035605478534635042521922391709556430295750595675343883087393107990838077832220859144502660929828804609103025888309324882798051740 +0 +4 +484 +1089134261820156880321423343616 +145538748117878092352760460206159211126 +33511658511802278583722924194874647566922276789108093402830459143321542459392 +101058486350009815877613019026909063961257758922502987153303461721695947063296 +55893599922312747075336422508333078260508029486824190273117160196130533025956 +2458978570716352272715788097961829640376943254320968964331207836957962374258773872920562816268264474274565514907090130109741585328325854023827972947968 +2334497061062585013441347827924568919650652349786907365392347487262095082662967762597898425035389335443705851967166882197635071826354135997079594483994794 +4739636748710839604647340865523976068039985893121701111166740470358505579292913487988032483975449672818248784390230013345327930989784690681998862554218456 +9268358303535012104892996424126494308898855298485453509135477774190853103484671018397846744502851397110775756567946279667738536399988345534648240817831936 +0 +1823333014513972248453863033569237311230812126130506337878885326530740596368720446811271380284232373400475839583564476423453964756030828084801793759122506966503712459173121792772565318978814203256490836178101826827909880676810922045422401824859785223968311017274407457720180425066972434143458217681896098086428204645340725330308523442939629221459319570158112385542686278442818549344024940355939362383436777208099871277202253431959816109988249138938651 +0 +8 +268 +345705300287849490539146641408 +28619945476059463819047280294135199591 +50097187803714017428498902612256509194829161297911658170445563991107297083392 +85421690222206289410508936520273729553730897899163659208114955446435945906176 +23541147492225259737409530414900909030720627244427625246343510574225863591276 +811358695156145842831903450818927915525548089569942629196406351050494125902340038663677284364719310507462367292228961985914579995483031930887980711936 +2753993259413215653375383555168520262036721258923608032707398699340884867309124328134824761429544678847308130542242013461361725575679679273117130844404184 +6291784738152052628532475385001151529792773731941954632670769788526762258081592087250332058353673371670605911117825763975584603160350868362121314372190208 +8246304950196854775397532690840382052681504659869650088188493089155770401666344769741621508722408724512112431250395089366004560986597746949833784645648384 +0 +33536828490723711025794383275603096340930562958525566355063509107668073876964224976171882248532778409771216997252213433993697133630589947644361952834437975121876157813462137576683247086121046784363938117600983461647174331186404053947864440728674994199031341263900784628270176815603173354730641751334159968196129982738215961466145470666104403167324840397876006086216517663581877927694551780431366423367588590449610474198496508322115190229617947779491804 +0 +4 +744 +285597678780049650206757617664 +183060435302525962072268027628016111021 +7217761771929207302500684142267832220669089126781480397245769148255541657600 +79477460217247376097886641006546273302212937742057604494280155910320628432896 +158450537078399418888641617303234395161356907531049363529305739478391665140056 +560479410674256955928059381764241238133905670084218664847601259116454401923250286188028355182665809615792144602857372046658783886046707955042334277632 +3683866358503387723371342100656401419267927238139401708364406415400694153274197402996715954111156399475059634029565264927949827386724995677572872987734714 +12590844567997964881164942256818297297627752677819872355996517914899426206584352337319457485189429758905990389059981412286350729613199131538807367459067873 +14260854143752552717856629622964902246009611015390566846603377483401216738344769373127606724470825630558473764635392820940186579136492501381274523880390656 +0 +21800320263537007047472351208796015562335481192952840431265409041550951526374116630066499902549548119697525627775845229207308993284066362779188144732297218576386880741913758964084484707758910160792538754632482272801417299710417022721348611414238310143561872419421028837234898971823910500714741024986033307017463050796451118315775556231911389073082154651438223368297410117325974472883309213628390772734914681877034242596184674973753688803388293273496715 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +303 +1157847834746177602004396802047 +339617671798359351079692875821060456446 +57867775067306645753843239588701162944294645608219998114893217643713234206719 +26369455828243150957066923597651481411694301395220676885210503666274163228671 +11817720390503827648781894443752171196964219125141796458180108788425643579396 +7804371375807015860240250407429415282553584425143433436919818048882206801446222314107580658597196283229772192970700820967091727381696957189718015 +941081632068259047813718693871170463934954812652267338340003979702879896717377687462914527089361639645292415086148993612559161291073345891219533759743345 +13407795142668967188561258511782701242040321017549139392778624385515507058390936234830335193232662892196414947249258255251754028773259240421675666352640010 +18030219496951436955703469321804144806589781292361309272091751131804808417784938468039344100394760314581363716192040882359255669821551713959394630176866303 +20764409093138106714694669222174000783080657450980639056024872831998438690744740872244449057340558976478438798965361453061982147397763104606367603575189606869434278459569124428885756214636676791959099839519692515219337740131125546138808227180751694999895383762073154332479036368513723304712662417407 +0 +0 +0 +131 +1049832718450901370153113485311 +123743968547971240881793449350717343096 +54247495121211160361188037929436149205783261053517263337868798039971357261823 +43780720696046181429968922798344646336098289195769104725971763934578188746751 +8569638876184228017621190554815028317573269823425357131497263831998166914171 +2590756693431741009163041429286398894656679441703939344261083891915266425352426310916864582943630782192228522635328133722758329149109900984640654540799 +1922792972978790663157142765037754247364399993465703829196794167418278912188407110331170404215500826901691954309618913442459626285713809675553469719932485 +2247688179853902828346517371756160939505222414700682406758025105256274372769418491926470116598950917484231339173818993910715883012571037685660436398094565 +14071886071206496987190907766460338856608548573141424962453698818757002916637223518158300237915282267942872621643500179521389478132153075114062917306155007 +6980263492707976602733081771294983285805560539203752519918453497642718603261557999924227728869489680883742630490486041372040492077056076650919876897423133050548479425912646008193088180932733170859088326636344779595580028567634175375390724080269085084386954408009560789015111093719791523327272483291135 +0 +0 +0 +213 +624277807757669988326564691969 +308806362863810512481109604679086238721 +7575495667463650924420531623779877444872078518414758729895107613392445112321 +71383655898197942633634404834290712896942744228408684751177316467115735121921 +47122958114890946067870921450228790803155389424276201823055498825762056188186 +1994424534807216528160042697004302546045534768650260352155667756798588514332350607215428085715884919952309860849179354235231346459029751145877699821569 +3146301561202581022604671318145679315132240673197187143392208577019128708207517211248787901932425426040980775091796171281106110880987357700982231152858994 +13344055815468537346229177929721616555294581393221545616480099523908865321613366395170905103332895603014771880154289842243792973144146321750132365948266313 +25653689183378345635977168873503678049300684399452321461457658485062084019322850001321503409853791883406838755199097647132019767454780407950907465283928065 +229130338950058715207075928314567718431940966481184952335048896861640341691504660128894140126073639123936931770837384336344695028165941321264091705246687393301105660309858229907321110227251032801854835879822879826073555284111211015122519313114936258162164556856278990251776549227306961333644609716225 +0 +0 +0 +141 +119107286127314199610661011457 +208956661746708815346102549108455455236 +9304183766217687257009318351289386378056338413009755635813258086246793609217 +37346116786925829034687685788004865887841441332555982208115369087891606077441 +142686669406791276574941284020696419378508583519717415488223479096553530067216 +1022103513376169960952043514852766564406369544025973264953283529967298973963692347373601150129718093616182401830320452020826518193269025639232195002369 +1255461492445777082599853012891109353852057873636592494368775587155748628015369099916821369435584805024717479183629939627196544920025710945751532635492024 +1189975803267431345957974690102770165991401096160981798863264688637086156816693253154715236752646520545321786646254224097289874096394507609482395432557936 +2038989167013368656643873390716729359930711113157962588962483025137830789336536213929010174321600155153011333126258568329562186707136497102974740273823745 +9084986068063143759355885696834360372551159629320665871137722600252611748073183150082604901064288041886108395689572588307893872058553059179847191635406482453723540265118257106957652545879445444515005992515527078762521603272600432053705760074646655367876806955197570127991703691485644599174058580377601 +0 +0 +0 +243 +699092340274526400217322881023 +38592925135126088279952503537704324536 +24069098860725904074101863281316659899407559169599337507189559069499782594559 +31845123066004062045091085308083188950704500797090491164647969353944050696191 +118305855347934305358536379357165472350660178373988900770159391774566491848801 +2008713282085666284652556551621962437401356361830493232520690122524894627206383197505895885671920146557265344301589773021846167435240002500658026512383 +323133594322353610393135271506551759249338578228327732110434346721529507354177413565941533352573023280770193553578703771044066939448141422832699655754215 +8866309339762256938205367118241359468285084241706741644373897192876383324845891938408677922953893394868024823096760328985859074426231649039808204582908518 +10592335116562605574859104705966049302824382333355134511227046941609708791279611163990078774097256277263081299114817404233848814642481057406588005371609087 +7409638199867804511590556491020804147437821443902201231464956650918710757587485835871076220513184441280932875327658339055507870288640330135470374231086564968802510793220658631244921907134557333508582119960035628956742572301380943132749810700571732870307187030378399921152414041403031737491047579647999 +0 +0 +0 +361 +1098223571363824020337471782913 +73118673265328369333869451006373159426 +12612570963041677221068251937087603519725683816332068400361871614991377891329 +44757643964492500248872741260097920363273353321461345189639693578247602176001 +3942245179751587580113754740041160627070588205547869974769586858647333898741 +2612294559420208791815554010100531022826670009294237097218906452805851976960451833971257091500484048552506300644536870798907627346813539746460119072769 +4886652767199484464651425905879582096234981128410546139257549524800652233964932550117395659883947428238070691107034177061699574595056075593731862734910922 +476948687153533538165001293464509838331769398407122530531483520520031422134660870238181672367938291384232556352408026637315514098467464396275313797141550 +4019828793218805646023303231154957746362032987800527539184202417766187717897646394634196457153911354739604912893653289014782783880263859608454097188945921 +4075360670358372722795335962773428342675661975784760871564112696474315403655585860035546105060954687834105799318439691150952278271480480434794674741133762365172004076850361918268011359368504306942773658004160938910939812513459072944161883845284706441576028699349927725653931250854074869857900046581761 +0 diff --git a/evm/src/cpu/kernel/tests/bignum/test_data/modmul_outputs b/evm/src/cpu/kernel/tests/bignum/test_data/modmul_outputs new file mode 100644 index 00000000..5233592c --- /dev/null +++ b/evm/src/cpu/kernel/tests/bignum/test_data/modmul_outputs @@ -0,0 +1,3150 @@ +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +0 +5 +0 +908 +908 +908 +908 +908 +908 +908 +908 +908 +908 +908 +0 +1 +160 +0 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +0 +3 +827 +633825295391748780828659810303 +0 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +0 +13 +120 +145483342680740634262446800896 +170141183460469231436539398536531279872 +0 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +0 +1 +296 +920477174324206192629261533184 +9284550294641477953059815425 +57896044618447473228882389021020048158893283581286713298429387432951596187648 +0 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +0 +4 +771 +891784777631246170114448424959 +1327929446201306785262743695648620545 +57895602960811796650871631801676582813791887579127636891104569893774562426879 +115791647579680518644692972256970658065423327120836162316857392245886991466495 +0 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +0 +10 +348 +734763819450510610632565325824 +83076749736557242049732541826465792 +56086793224325083479877516880625996376700331315327416568653997679101469523968 +43066253535244233026187978142387001755402803069145978156050831917314998272 +201496559500976655734260440277137434576370058288390243702942488773257463333742 +0 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +0 +1 +455 +12835319081690733822122917887 +127603331931914074262646774143133941767 +57894298449951398757252466847559442906950400042978305056517893187912714944511 +82474589191995733226059000413673369947276401483368126437014470136553367666687 +1725367873614246661397681099761093360336884063153660970896243052915304594387 +762145642166990121634319750876330910924084988636669303246807590962648009181396757661856053558136824594202566053704052044355748404436481867775 +0 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +0 +20 +595 +182776107722364003135434784767 +281466386776064 +57894277771803943810359491595023458960167522338927730828258057680034478424063 +89555305827206481420887328961785203324625996138257453019240897699860153630719 +31072229483910585358509303280765563029411398133731077240605874038996845471709 +3273390607896141870013189358366943131609359382662427080975450085374873026606564249289725539410814263596351691407518053929870103702401568479817676881919 +3351951982484124983609172268969732236347481510662869536744042230485685559782341996467619926017805728755414692283401971053259449792684445385138897718083585 +0 +13407807929942597099574024997867385471458758537929012740010782671329620832395834992528134114986407662672821420428107228756016346166874193365792884690780159 +13407807929942597099574024997867385471458758537929012740010782671329620832395834992528134114986407662672821420428107228756016346166874193365792884690780159 +13407807929942597099574024997867385471458758537929012740010782671329620832395834992528134114986407662672821420428107228756016346166874193365792884690780159 +0 +3 +780 +899245128272588436190215012352 +79382824738944801807794176002 +57892510978869681736730162220291002611042557329170362915611609916721313349632 +63318549916452990938470040291368379201286383559458191806845672058759835287552 +174649700752953765434988902296252491183916410461948522823307150782111144039507 +3273390607896141870013189019906287111002076719299707330406074198757955051929170942113619750485120149822099821188584330248544763114365430245700361256960 +1675975991239013909235918173490637855139324507692685389812651662983087942796182042459207730713681429512584287523480954202975430917613169254383951955361797 +17917957937422433684459538244547554224973162370938960458267029029640947834979519339152474433150005542914 +0 +26815615859885194199148049995734770942917517075858043397979502765092926124329914532610493203135186264306101107885244098459867671853087539206018919387103232 +26815615859885194199148049995734770942917517075858043397979502765092926124329914532610493203135186264306101107885244098459867671853087539206018919387103232 +0 +11 +372 +21559839277448701880456708096 +5316932265549267143283400319839567616 +16282337714987120045892153486177165723161016453744476162789802658371874062336 +88537159989150876890408569427587371627685568624275408353614000822051296772096 +117153649598454680903779921606971322936867216714956963589387307178373077018966 +2451846285358576582757929577719947826359368522202829009982370031469538161149259226929244677345525601309596834316982200231651181236759995889790497062912 +3757219424385931343692363754866841943466352992489416825487678472853020775555494604110835156534238535884545156565469882173219151445924025758587329876446051 +1637494313049913248505508525988843145443777840250318553676797222770022673451141317105487157651955800518089884835975451904017985829916792949984404185120 +10058766516776922387083424546997939506014390161211981301999104219673036875504700741486695698194962976600388399803269774949866748354955056527082238634885120 +0 +10715086071862672019870723708373567867164049597134887969429342556289689092328893032953381579589338312602609246283412714238525362926688916032991604094856600340922050198587112063568778839323187143820237543594206457218073322356882436956454658807341118763364007714359232059366253413058442519879029375369216 +0 +0 +303 +1157847834746177602004396802047 +339617671798359351079692875821060456446 +57867775067306645753843239588701162944294645608219998114893217643713234206719 +26369455828243150957066923597651481411694301395220676885210503666274163228671 +11817720390503827648781894443752171196964219125141796458180108788425643579396 +7804371375807015860240250407429415282553584425143433436919818048882206801446222314107580658597196283229772192970700820967091727381696957189718015 +941081632068259047813718693871170463934954812652267338340003979702879896717377687462914527089361639645292415086148993612559161291073345891219533759743345 +13407795142668967188561258511782701242040321017549139392778624385515507058390936234830335193232662892196414947249258255251754028773259240421675666352640010 +18030219496951436955703469321804144806589781292361309272091751131804808417784938468039344100394760314581363716192040882359255669821551713959394630176866303 +20764409093138106714694669222174000783080657450980639056024872831998438690744740872244449057340558976478438798965361453061982147397763104606367603575189606869434278459569124428885756214636676791959099839519692515219337740131125546138808227180751694999895383762073154332479036368513723304712662417407 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +0 +0 +441 +441 +441 +441 +441 +441 +441 +441 +441 +441 +441 +441 +0 +0 +0 +19068 +19068 +19068 +19068 +19068 +19068 +19068 +19068 +19068 +19068 +19068 +0 +0 +636 +0 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +0 +0 +115 +633825224556262620861210558443 +0 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +0 +0 +704 +519849000561460964203253727232 +170141183460469225533581294949474762762 +0 +57896044620764341436046621909527197168953141363606679998708279488336176873472 +57898252907889602413753029420559456162614731473347531717023779886319263547397 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +0 +0 +768 +315261692802637380403524009984 +194975556187471037014256123925 +57896044614234985579492874678279777231511723977068592025195038241343267667968 +0 +115796505811356092795647068781241627851478825362266036097151493121449782149130 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +0 +0 +755 +980371960117523085246513283051 +27886518370227442490517617608621031445 +57886769803885777441266973072067004984382407931727987471373869918625558691819 +115782814431179474733867342212841622090776966681872755443595390653954644770795 +0 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +0 +0 +44 +218233034056168691435097292800 +1744611744467702083044383378355781632 +19901765337664800850390559730004689805459726391923360699911853410490607730688 +904391324240128893549947540990127036863458864452065541277067470263614963712 +62920486818360159690779177529226303371349723311026208168990341953735925188632 +0 +68741202765818979270276983633379582196549482966904360579127216519201261330098607324506894304856394094406282403777947234369674236221393804088784959045632 +68741202765818979270276983633379582196549482966904360579127216519201261330098607324506894304856394094406282403777947234369674236221393804088784959045632 +68741202765818979270276983633379582196549482966904360579127216519201261330098607324506894304856394094406282403777947234369674236221393804088784959045632 +68741202765818979270276983633379582196549482966904360579127216519201261330098607324506894304856394094406282403777947234369674236221393804088784959045632 +68741202765818979270276983633379582196549482966904360579127216519201261330098607324506894304856394094406282403777947234369674236221393804088784959045632 +0 +0 +475 +269541700715505410264581275627 +297693402123626315271960004983435296922 +57859375075817421675264509035607066940711169672592018945053659095526761562091 +110877123712432405983959456058661230794625399151749997930016980310850197782507 +36232725345899179889351303094982960567074565326226880388821104111221396482127 +16005058485506792554320714768402949129405784761370055368182959410215608192809331910898977124720873316478253887127785092931470716493166119223275 +0 +11731831938715777520612778668353660668457099020791414454225295929553974535670831510938460179265466667423020702522654604586832988760873000236316670377852914 +25139639868658374620186803666221046139915857558720373440362266333582541989451932860803919374764761513214467321863672910499344396369729736178810105052004331 +105586487448313957217630953653425358968668408786294503634300774628861320362441676458635398984170320306132770645519405205878947411928992353796866863213314027 +105586487448313957217630953653425358968668408786294503634300774628861320362441676458635398984170320306132770645519405205878947411928992353796866863213314027 +0 +0 +691 +35346468568505532881936842731 +5910794122297344 +57858940834720867790512028732351404058270737887529960151597113430083794632683 +27987994577646976394885848050655511990655596618857190835730974489325485424619 +189349345528550113558840916863781287758481416281111632097967585676192554370339 +3273390607896141870013182589153822719463706115049672910839483679347322768167747021268146513478152778945973706436024623603772905158629315134471253524459 +5027927973686555902021074910529630935073811046690329450391073974713817483441477451426676218078007733400564805010857217050528619214139991213665936757227554 +0 +13407807929942597099574024997867385471458758537928833560431408446992776237013389516985884383362698273068238750137810819277666550973482668621461384635351019 +281563966528794539091054524955215094900633929296509267540226436097922037480312534843090816414714560916129249828990251803876343269504358060681650578506383339 +281563966528794539091054524955215094900633929296509267540226436097922037480312534843090816414714560916129249828990251803876343269504358060681650578506383339 +0 +0 +36 +1137039323585710672837611618304 +1667039319517840837963677696042 +57821838183101364244296111862969820726646472682625233986021710400507328069632 +55976566637351530465294054767787754721301958177994368678033697653636844224512 +193887663560237731860858557979085795918560035746611554628781897853775020813022 +3273390607896141870013175481480046286710770184432558148882590060392045299942487570569924946038576389686684431838416426295940752809870412218007625400320 +5027927973643875746059723456610435252591983579747963576265463600113040980879343903461819778081504218012049853558984265154213360147307310400101030144508015 +376277116685871107373650303135498638724436409789718169623607609622459904534569906122201963096150116401194 +0 +563127933057589078182109049910430189801267858593018911357569558066951448610928205184820357265838911550428123265590126067657221108914838323326397307129167872 +563127933057589078182109049910430189801267858593018911357569558066951448610928205184820357265838911550428123265590126067657221108914838323326397307129167872 +0 +0 +548 +452756624826422739489590870016 +111655577576534610008951406716630919936 +52448868921439032906975899518935171660069537721145902608130331363149292240896 +6606931978479281254831897832501046354906618825234252857566140055339491393536 +144389273399687404130106093584920102378421828377891285603354605032128614720536 +2387912874087980187718675679704917070297108275613437367396044575716543291206867105152070863644327560068474660815235323172050351528107196479325467574272 +3482688306166017347803243385471281549458835137781679310740694623583921742064189215873681869954494749194897826789578092866925457557981431075429025110142766 +34387380574048178218615679045765706054319334645256689627212741678170476142473967659215230310691071810879887581555484489984377702428252651949672487887520 +23524785833119010734715565516813333025879573854445303556124669257483291515289313842947157240147918658465448640671956584728128012482443412626594575622864896 +0 +225016807509116112417285197875844925210445041539832647358016193682083470938906753692021013171376104564654794171951666999009032621460467236692823685991988607159363054170329353334944355625786930020224988415478335601579539769494531176085547834954163494030644162001543873246691321674227292917459616882753536 +0 +0 +7 +229443170195852266665106472939 +326323769346777103406058243606905356266 +57302384040277608603670736599583187724940326542667573170935472667337666068459 +90590215444683886737468380513972670188957748728496883947338607689822992596971 +16588391383794291139492557302647827206669629364357230644404399985567914899541 +163891798891947333065045258556017720933625272928012102175316179026526342830370668596259193830541121947825216052384717240308926275015636100984078315 +4678930352245731830140813477948099889967135524798399300239972912494574922144691942630433785423691531675030624592070979309607042551255641744629228495565384 +13407539397196368968305928790089016653671570609951672448135458669233231578292961080874356758157767482668285483672278785166507680900960181539331299589837030 +3215987397587457281700155817600247737540168077574887142213735056600011032864904372279321264397358905923222529639441151106221660309360444263022362294747115 +436052590955900241008588053665654016444693806470593420176522329471967212505639558317133430204151738506047214778272590514301625095353025196733719675078981744258119847650951613006600880507370212631141096629913542819606092542753636468914972770795785594997803059003536240982059763738788189398965910765547 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +5 +0 +908 +908 +908 +908 +908 +908 +908 +908 +908 +908 +908 +0 +0 +0 +19068 +19068 +19068 +19068 +19068 +19068 +19068 +19068 +19068 +19068 +19068 +0 +4 +0 +824464 +824464 +824464 +824464 +824464 +824464 +824464 +824464 +824464 +824464 +824464 +0 +5 +0 +0 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +0 +15 +0 +1267647381935974515131868511348 +0 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +0 +2 +0 +263212975939693434278982451200 +340282366920938195469076704579402334661 +0 +95623469641141975580204150051561403015751352902419726649509057396736 +100256331110318029012876581068708363797593997986020913943444717941192392931 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +0 +5 +0 +411530291995791833340936454144 +8430371667534461981378312405900 +57896044427411158329067913577748761602139555529994913557251651593513897820160 +0 +200512470973696775741802001729116624472381964469336023047436136864269992390 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +0 +20 +0 +979496649996061120625989647476 +184912836387971170628447453353642820495 +57495019294216825495300358413882228250071985569553535706317326020767243041908 +115391064295158177288750649755718876615210881213845660614425620051755068816500 +0 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +0 +8 +0 +381333582997345008331364761600 +75433688760793975781157147978430939136 +36185027886707999350496222768347471118285021760886825059748692088495240380416 +39104158210001763587778684153287397593905745186784548165694155380922018430976 +7723941625792713615971218884053930976624837598150250143250994735002495495486 +0 +2972238671969696817971976244719460030212710977807102828849881552354035489891882640507250477562362182748614496315732194705126866975667884481553178229211136 +2972238671969696817971976244719460030212710977807102828849881552354035489891882640507250477562362182748614496315732194705126866975667884481553178229211136 +2972238671969696817971976244719460030212710977807102828849881552354035489891882640507250477562362182748614496315732194705126866975667884481553178229211136 +2972238671969696817971976244719460030212710977807102828849881552354035489891882640507250477562362182748614496315732194705126866975667884481553178229211136 +2972238671969696817971976244719460030212710977807102828849881552354035489891882640507250477562362182748614496315732194705126866975667884481553178229211136 +0 +5 +0 +245614345371770711601028529268 +167820641058901852935904395164427229736 +56310523432975538089098580075519192838001302745960229901614877098209729051764 +85237339161927006470244447187006939882425784659579906112900841728046555724916 +177131608341019431639531082486186163608416895761801191709521384618872970096746 +692028243087627030443962333795708467119069169682095727348101292594084392336708255956965296630788236731535929976763279256275019551228325535939700 +0 +6703903965663326792874639644623508444541867482964682679434051891075530751941922751907842696366672689743371632139729220006073257144919838847329290738990536 +6703903965663326792874639644623508444541867482961636626584690077349172630440349667689597258763613066465466237204690258874126738857263918193693789796695156 +4565358600146146340648043138919534568740519770378829014283100160143146613766525820211473441791745277998502654577696186997051630953882145583216910085604244596 +4565358600146146340648043138919534568740519770378829014283100160143146613766525820211473441791745277998502654577696186997051630953882145583216910085604244596 +0 +16 +0 +1166128089190511751946393615476 +255571479192666112 +56291747675086446310277050772845769159148347468038830641684235944770968484980 +30171046655374400321248558358633494123141603303165813785349498983526118194292 +191952216559694677850253030981251311226493861529738242207409594273293055910997 +3273390607896141870012882374551932440803983696424025465309373572025468806406202958511116713364615934701710072950290988641362149742329879268357377621108 +1675975989397670037760469732976766982351910933877220375401361925712068316784901484293350661165516699901005329555649261275619258565077645558288068779181545 +0 +26815615859885194199148049995734770942917517075849908645075912980200181493966889942992355387418779976258047876705787108142786970073112315813368816870620276 +12174289600387878166413214698063586008084552752439543567929790665567295715815418173215545776407658157706921849748721363710462842319521767576139939299228384372 +12174289600387878166413214698063586008084552752439543567929790665567295715815418173215545776407658157706921849748721363710462842319521767576139939299228384372 +0 +15 +0 +147591445132561651497663725568 +72079604862961880041477111809816 +54687499690776483454845978515775404153680118608348765958709666856417080901632 +60367062534952635374606720010641822146836281167009160997706035914060475662336 +178652301000333807279700689952188731164083671132840159036419863339428204714256 +3273390607896141870012575052276265729391325363074491948316068523863947799333080042607060368834360627681011914158469885997952895805516362689834790158336 +3351951978795340075520939465953533964703821867770710256609903421209625894295852147822976953763845975898117121470212503185399920690105737901876342591329002 +16269505807179569785489260726049179236275631432812576096106462358913980634161403559950446785300205032965912 +0 +24348579200775756332826429396127172016169105504879103405365388510704376920891562395610327828446749127989939805959801641401559846042603485599065178803489734656 +24348579200775756332826429396127172016169105504879103405365388510704376920891562395610327828446749127989939805959801641401559846042603485599065178803489734656 +0 +13 +0 +561575095917728642643722764288 +63821360225596077614082986369572434958 +20871267450490110775349857218815741788300741818091418479909066205998432124928 +32031339597730053368408931380419192214478581749743918680291072536952960974848 +78578636492035187050572077718135746998684508179115744547225899703648410312403 +370813736211065535231062726945202826990026850884684216063072714490283444143902782007113348673056265481923913676784506940297294856753087911972659265536 +2620071154003612760581214322788037964725604937167931635387043904448806788414974868124012072732534985166121320391570652048401642048690823355593944068875722 +1486844836249321229643001741597869576062950278947289246738531878275180587493636315931782339147975866870425615431065710328848331133564447998585839000088960 +16050604872479499761412490124306950869110460588744266902155691331522600686097332182352004895063052889078290340385962178123999076249427996544240088860590080 +0 +9729298153251306194042617127203199623384957034198478276241843041111037695834634873921670474267119187843169195625338744528581029537433535757956376518129793109557221580317097753720451186105453926588775689583539463154010576700049252756460830197065735837134519004638182709904558099057065808050158672835248128 +0 +0 +0 +443488317747981344772787797108 +77021562540042882543736912340894874738 +32227291991539810993520229032200986746576275985417526906409482965081219136628 +90295509201033475928510352277060489802362767446802083703915909927316798569588 +77638221005315388787307758184174122082878241502208415068156089607436757773918 +7086369209232770401098147369945909076558654658030237560723194788385043775713169861209683238006254225172633151217396345438119288462580837128263957620 +4782294357738321615826518443171082886036061084269642536684046318902415683538782049212941629293505381904644369995691924320760708675564364862074754654096757 +13396197085486637899982055632974105159517490033004013453211059152114314035947763002926713162586156070095743774033239286885832152764496920107358633659524867 +13913628701936294298439646799953209203835997190662346291813340972081107507476264087323589245978744413156578492374221121684868367585557359458783374461631604 +8138997384706728877072035945360424843873187368355532293441241975164893238867331679044578164475889238039813183177135485141754426910479982949590179951415562696524274642701652917859487803566915383278625110689674346601085345682179558937583211472781420296541000741603192074524711609552018240800068099636340 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +160 +0 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +1267650597867046177654064545792 +0 +0 +636 +0 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +26620662555207969730735355461632 +0 +5 +0 +0 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +1151026742863277929309890607579136 +0 +1 +176 +0 +334882378198275252702386771897964707839 +1606938038272679619211255036084048932956190504430095264907264 +1606938038272679619211255036084048932956190504430095264907264 +1606938038272679619211255036084048932956190504430095264907264 +1606938038272679619211255036084048932956190504430095264907264 +1606938038272679619211255036084048932956190504430095264907264 +1606938038272679619211255036084048932956190504430095264907264 +1606938038272679619211255036084048932956190504430095264907264 +1606938038272679619211255036084048932956190504430095264907264 +1606938038272679619211255036084048932956190504430095264907264 +0 +3 +660 +0 +0 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +0 +13 +132 +0 +340277175258524197588911854800409200639 +0 +110649228791921829438857058184014440939889398729492104024303347725965983744 +83242444436937686798839045020185798417768391449818324689293403196404662888244 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +0 +1 +144 +0 +336939847389361696912547761965915701695 +56769680485161825172645874508895991003378952756364273939185366956838435684352 +0 +152120161136883904630679410835682314109137252156430170124918963201108868258135 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +0 +4 +780 +0 +86062321544974934655405918178028521480 +1701915421036549486423916534098894939525282066843008931871172149931497488384 +320684042551872460005602592720729811431853324554571705767199610066341724160 +0 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +0 +10 +292 +0 +15950735830886245879793511262675009024 +55295183545873315171593510499304639359309142595148333408350307564081396056064 +88673301847573357691787887535109587141732823026243004811042692202944186548224 +71382334957950784434776455823589545246296460825554303150898409735430888754614 +0 +503374556654131282931862970076766895496736542723035164142032759422296925049432254807648984573579824482106516024331037426413253887593584118716997617959386 +104748499257567256899349831135169132621460671660236086705487934064427347429028587580187955384662408370456791930169521510043606360268932440897712509943296 +104748499257567256899347058465480176306318788546142086208502905424473137964171226003463092917526586968944371705089437305260822371159371705523810370322432 +4149515561151917970063980879655710938513649460124350952720371065270297197065154634382680097543307069927884450339928718724097725668943949230978441358030208342019760039438410280075264 +4149515561151917970063980879655710938513649460124350952720371065270297197065154634382680097543307069927884450339928718724097725668943949230978441358030208342019760039438410280075264 +0 +1 +160 +0 +255379205689110469036436140398487013344 +21712727978259726293356856503923709634858594384551721609867559528598392012800 +78804868437368052447826264773726337899091993565064061055519163000168722202624 +126692487956834088798699213663796104822239968371597515995972949581479497637654 +3272191856449843397936528109279065189423120989381483148252736570244975246791533222321103893532128937121700575680421527659060354684671413348913870012416 +0 +13407806431527680864118905249453282443943463537493942574619644941644874674867613388388672408903771364000715917576061318747309897108671036700271413040513020 +13407806431527680864114646428811044898323062754972248613389335474203674829637362806742733003747804478536315412888860690712090962708053524257498831612018688 +6373655901930312136397229380018411440828683949391920950832693445711366448193584697763678864931677968612065262908033170282412527802037703004824976134384286640214222530054133889372258304 +6373655901930312136397229380018411440828683949391920950832693445711366448193584697763678864931677968612065262908033170282412527802037703004824976134384286640214222530054133889372258304 +0 +20 +768 +0 +339617773210407217629729401159633862623 +7010406519791895781934865720833530372990739797465297891865306283193669779456 +12209728235921518710323559633526468837955820087843857124387593282079453872128 +169951871966800283810649419399139038928050251176624833301343281456431633787453 +799167622926631891612934308861836795138629576941338685100903095647779127140015260950429312778514706312501025604542433181196096945393694423654596608 +3723667608053767842867675023364612649103089456109822250875653249116275769787555601877076944892223098697379930243317445603459059303034099481845912857059652 +0 +26815615859885194199136693140688805876096363840529017362328825455840484156274161514345456537746861803711227865957219195669584452460326767114515755500044288 +16996415738478256005382065682640742151192912704409604594012987116129634408058546371285779101609491343355313613863898166638327059654603396304113335697353121717251389843622698066460540928 +16996415738478256005382065682640742151192912704409604594012987116129634408058546371285779101609491343355313613863898166638327059654603396304113335697353121717251389843622698066460540928 +0 +3 +404 +0 +338702491610940821868309420475587008199 +14328023572559317685526112591674235629243509140269133282451074114125069025280 +86578464609153953273064023043464932375781820914327168919289930680154219085824 +45279483869291221953284779682805788559295893933395790607583424358602969434844 +1598335245853286496935960547857315896747917205953978724820311075231669760316560595231635274478219159108858101014665432801177715434970395175083311104 +2419407242378299627775637392372328814292846869244624971419290896315467839379870742253970126076794151625802980270332067936106109204494869156371160001888905 +22713710091930133642306470658052071301354618504883936111506036530073330776648921189746483856049805580566438785521544183006327774117888 +0 +33992831476956512010764131365281484302385825408819231901736066162392911122587750794642859557837487570646738733764326406607430768230396539092082721200286809873288301231428402460695199744 +33992831476956512010764131365281484302385825408819231901736066162392911122587750794642859557837487570646738733764326406607430768230396539092082721200286809873288301231428402460695199744 +0 +11 +500 +0 +303146897509458239699003654989925023487 +32736756639827299933225685485072629321729229567663511068893875767449657278464 +108940097746668219126218354657538950829059055375326097462906774176671100567552 +105141957406996918481926167015587865122928475911973508855892157417175502573997 +2455149808749324871737694767528984736302289775261104798859058407114388639278815192018708121934602436285743845105491713074908633063448335548472405000192 +4562499427405661443491300822283693488291153790729079292153765540644759467686485522209256976888988737125973966009916644323573026335699548740771640065918781 +11974395290736899579322825765453901754951747606481982721750002227664784996135932884515664533409327198618661731940390586307041084433465121132950282273424559 +10582878391618641992149234773030997029303083829182787525505648743266561935310197607787383974646115897854100240644934138582092413692188764048451304742191104 +0 +13582985265193575509847153720290630277475301176695966793104558898916525902171099726111653252346386417687634059875171486934990855171785554727726817192028731914702681172768151028934363876033198780003232825417916826555570603003610443324900765322801514628836373961563717819815659178099324514051673737887522648522145975473923735339139072 +0 +0 +356 +0 +159497014274388579608780698593857114352 +107785315756833360443652745599246659761450128680158928423717212164001366016 +8707697307478053793157872089996555339211642752348089356505163635680694239232 +117438470015262408821519431736839939113907975050128689419137692043750973261407 +2221209391926212534974417566134914959972451519200164319238141998788375520151939771003428560858041773117069334356919987508503730468005507757378633728 +2622195879240643840430956614410100176111727871855021220330072279789821003236833457966150025063799142237083045026927065925049487875866674616289389230367401 +10838798868213081376093889742061103552907660140058537670650158514072587789313088268351190762885376907745601175335770832945166703110256088823029782185916220 +18496502392531382272454270596836064792028917016576313981708381711553340991353189878658648246899858104559267375534283098234252896441286568201405948139405312 +8023149053251434330424390239980489075400259799640003038245956978737225036782755130046389361466959635606250835455657093887634358047146742300058148458943937296682605801163384099346471767498054974948940568984229726746253562492021189947972342847243200153751700399237590637919220716300341227271998607982592 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +827 +633825295391748780828659810303 +0 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +340282366920938463463374607431768211455 +0 +0 +115 +633825224556262620861210558443 +0 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +7145929705339707732730866756067132440555 +0 +15 +0 +1267647381935974515131868511348 +0 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +308976389164212124824744143548045536001140 +0 +3 +660 +0 +0 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +431359145870941220571487096504865044588697904564591140391738786447360 +0 +9 +205 +292216721734567061880326586369 +0 +200867255532373784442064696808803448388348625007985567989761 +210624583336731249510797988433774789014354452010342467565984415745 +115792089237316195423570985008687907852589419931798687112530834793049593217025 +115792089237316195423570985008687907852589419931798687112530834793049593217025 +115792089237316195423570985008687907852589419931798687112530834793049593217025 +115792089237316195423570985008687907852589419931798687112530834793049593217025 +115792089237316195423570985008687907852589419931798687112530834793049593217025 +115792089237316195423570985008687907852589419931798687112530834793049593217025 +115792089237316195423570985008687907852589419931798687112530834793049593217025 +0 +18 +268 +352965838883581655720191328256 +0 +0 +57896154828972001316191871561208954842030688974154477763010076354291706101760 +224522243723977870473546939655667008360304405123189009020455613292517041926410 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +0 +3 +540 +355044044325391863154206572544 +0 +226156212087570969245957375363711374917747764205331043944363811571683557376 +0 +58939719349598034788834787989153374973533704931055104033507141435219301294150 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +0 +12 +201 +530142478699265899132312616961 +0 +496656137810479889911783346996430981790696540282828777020061097092186113 +1385979954003213188845730955395660891569986416749169143986031551791165865985 +0 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +0 +9 +868 +5739147702547097575372095488 +0 +2713877091552199840178420005509414594154173361691187048697847208972757499904 +81362303935415148417232364154000808137283096524262229321247229438793141452800 +200007298521575553572893786526415964968717615038369762603224568413766370350860 +0 +365274778563818870578410673942542327115651568182545616551841135130206091716597190978235713154149431886591172348565386179014379218648408362061584266709978 +13404534539334700957704366709891405336608567932898539989935340808342845456223809807251372098853358563127263002410967890911834839205657225176731688399536127 +26812342469277297312995538029057334885559747174722586807584708484779441945819860598056445363795896769119485060050221372726166946816056038393356849495670784 +1113877103911668754551067286547922686738237475419584309931192581897577662915063323503306740447008536028968181678028580322422866333819711284625174374608617279642589745120484326564854874767360 +1113877103911668754551067286547922686738237475419584309931192581897577662915063323503306740447008536028968181678028580322422866333819711284625174374608617279642589745120484326564854874767360 +0 +3 +373 +663267250817584834358806577153 +0 +56110155743260739980845965626188839982990513354097487512099126177554948423681 +66666258429912423795302025160998297406283412204636264833390604129473579188225 +177994438507773838104674369561918072421924948198026690191960823057415806012035 +3273390607133996772975242796981079624647701753259790782144449701319437329708326713265031806779102708651838281996474323697106010993858402738833536843777 +0 +8386426737429153324968205650664410607248107158089641410510843662012750503977158430826944378515156355394129659501044340493857762955532974869923505951997952 +21794234667370607206078979989803643224514176633634282995495125018424131531561390135283100088614877484687692308031922838398470089333320084110908709465489409 +1710915231608582551713494414139930175751260546116444122900349352360496966554854730076753484481830650675467827629295222707109502155201699203484369755223655341193278275893163301956243837193027585 +1710915231608582551713494414139930175751260546116444122900349352360496966554854730076753484481830650675467827629295222707109502155201699203484369755223655341193278275893163301956243837193027585 +0 +18 +837 +1055049663028717702603910152193 +0 +56145099392931667494602725117889809978473099780543110806328723994744381767681 +94020940359982983746102974658635634485631399798433967904585529336909218709505 +122813165867929679368114907950462646511665206961139246511547700775532269629820 +1453677448929674437119254898402693728557812421065819075020451306758949997680185293878407872152173525219742439043086557977078210366537729 +1212366891818018736612622703605109128833655236089151046090687816762735515567219375580031566019793843481784966322613342296478137028286856502402053516577749 +0 +13407807929939548517005357036703926880414038648958573042868430206064246508364035546678488116044098549923745343892353753273525546559935574983116802679111681 +4562440617622195218641171605585119131739514871918667547682857357314343535508689562160604455918497575074715174882382908134196095677901105600185199282794955018371204524886410100925712980030521345 +4562440617622195218641171605585119131739514871918667547682857357314343535508689562160604455918497575074715174882382908134196095677901105600185199282794955018371204524886410100925712980030521345 +0 +9 +380 +521589998193582783072001064960 +0 +54281131142068578829492120775689398115089911863432918901729887943966322589696 +87063228931437267679054882381527280567353791974986020151597093229234539724800 +26411440510656131983229190397498319604014001314162142030505989681964889965410 +6097168044690820186266056327949574746284769358267195096071257642746052771416966407359752215426164404883642352301456819389505193941734761955328 +2424733783642134638362581329537135439756750250119199404424017986489904138736282190413580103086576851422180352745763276505772852789790102244589421062035368 +6097165137335922326917182089439777940897312242642352964433107601843439253516971046989164458610420100536591912816578733216389239785314028879870 +0 +9124881235244390437282343211170238263479029743837341192530852050551013988199468564099149809149237792502394782872367659707645708326849200364829008985690446628655225628506036591091211274089922560 +9124881235244390437282343211170238263479029743837341192530852050551013988199468564099149809149237792502394782872367659707645708326849200364829008985690446628655225628506036591091211274089922560 +0 +12 +740 +1105766944361955339797897674752 +0 +40666663073457098908560285583894926858884570977736712496628899075489882177536 +6937574406821791937994980945260712046755937992433195708087316793731338731520 +80322259934434364526645140508220590735304755095944269027477694810351667453580 +823941825448211091053403141520018121212799809786471885049437482634825107662178709702891406359238800860434148555858011304517982766915436234049188790272 +1429667404699267204948871302671076616887599344321904849215552824418556681505872488697278049467681761406353434390315540634737585531078670948788251814191550 +11625439539104520658533890711797855194868386980241970994181859680105840264577003778987586821796875152410687590090669235843895015251319782115307313685324767 +4012611011364738290027830363884880786616340613311963081947244935301921679145302776974417725708110952074146887700764495196805422393345600132552727271047168 +0 +3646154850295010964902624396817474390399390616036693719739415376725561063085178919082942505698777176089060633115597677023110409583667009527018497076154392047301826729011247840192495744913649306569979494349478121435366144715292958165239232610420731738086890347478323006048396719686780691510330825043607290550999833104265740262684222585569280 +0 +0 +881 +82111759186571175044015194113 +0 +28976293586122847380028336844772629234948658991570145015189074743489934131201 +72183022301677682291580123397013999783183881280283071356191234547195098169345 +2406637046295717734201709310168745488608959709590841627534368777523827570155 +3270192376506343102611379566519773667881704351629044304231346291458365652232113923427745246534084152592966234784884272774908997999646616577428097597441 +2215358573235998131874848884702814898312700633459869320330807378394889665966339455958575987405219519810470844163424203838448880979342258184452542694566999 +11572673791131936765291373228428070441513344356977752630227033953477527214083770832877643183241668103444587247814952464182468268813420651873183304946511860 +24753412486464952127871838303672650263739621747289578351238067167728759524343749186993890880512639565343382059853348185532476853433055754161685198366834689 +10715075847328263987810529469149461320386431997019495731790863105054566969900033555506363209309697962458956036917241364630652892035661693225326421884469385462600854566136062395614311464777955889879559949117718229449226545818148296831892519665180916040043014060359216829885348018201091171951617402470401 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +13 +120 +145483342680740634262446800896 +170141183460469231436539398536531279872 +0 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +57896044618658097611351864738157061705262361561497619362091104892532012613632 +0 +0 +704 +519849000561460964203253727232 +170141183460469225533581294949474762762 +0 +57896044620764341436046621909527197168953141363606679998708279488336176873472 +57898252907889602413753029420559456162614731473347531717023779886319263547397 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +1215816936991820049838389159501298295810509592791450006603913202743172264886272 +0 +2 +0 +263212975939693434278982451200 +340282366920938195469076704579402334661 +0 +95623469641141975580204150051561403015751352902419726649509057396736 +100256331110318029012876581068708363797593997986020913943444717941192392931 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +52569608513741552631107493182246612028378224297839838380778723242419067453177856 +0 +13 +132 +0 +340277175258524197588911854800409200639 +0 +110649228791921829438857058184014440939889398729492104024303347725965983744 +83242444436937686798839045020185798417768391449818324689293403196404662888244 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +73391955574979118963811141843059488536193514605218060347731553038824318137413435829926783487818828867436544 +0 +18 +268 +352965838883581655720191328256 +0 +0 +57896154828972001316191871561208954842030688974154477763010076354291706101760 +224522243723977870473546939655667008360304405123189009020455613292517041926410 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +19701003098197239571963727475337245584161626291901231402719522479678259504890677218990119895590117915143388591554560 +0 +1 +780 +265778775641081389046569107456 +85070591730234615570695746678589227264 +0 +47774745969722232427758234867243528441217837383627556618044000593694009851904 +114934625462288849574699003098335431120497043396654151768412121195303165265599 +3273390607896130240593600967117360449949302114957193475722736563312875177296082312701317728403568591421312388507522131853298460195444283083598707294208 +3351951982485649263264086660821751293167574115217012473116062855570117177114956810549394311722122195190355926629690380263290286253266199596551551712231424 +3351951982485649263264086660821751293167574115217012473116062855570117177114956810549394311722122195190355926629690380263290286253266199596551551712231424 +3351951982485649263264086660821751293167574115217012473116062855570117177114956810549394311722122195190355926629690380263290286253266199596551551712231424 +3351951982485649263264086660821751293167574115217012473116062855570117177114956810549394311722122195190355926629690380263290286253266199596551551712231424 +3351951982485649263264086660821751293167574115217012473116062855570117177114956810549394311722122195190355926629690380263290286253266199596551551712231424 +0 +13 +108 +641005755209691132345429524480 +169808879001621220577003661267706839040 +0 +0 +44595748639529370249161292540321979253045428357143603299233263197536162361810 +3273390595701799965943937691979414704769916280630990616888772670076650363814963712508765166579199284291458024917011124434848164775695410421420299124736 +1675975991229868149900516882649248261736597670897713013053681038667393868471918427266328463160422932861286193025586191261376550527451922228177417820700673 +6703903964959104207882943247098074879292236184530784614687051259089361504778664925296585557644723899819989557097938820112754998714546796218504411307048960 +6703903964959104207882943247098074879292236184530784614687051259089361504778664925296585557644723899819989557097938820112754998714546796218504411307048960 +6703903964959104207882943247098074879292236184530784614687051259089361504778664925296585557644723899819989557097938820112754998714546796218504411307048960 +6703903964959104207882943247098074879292236184530784614687051259089361504778664925296585557644723899819989557097938820112754998714546796218504411307048960 +0 +10 +812 +236535920218075649755406401536 +170805148163762844199452890793586458880 +0 +77235627923455501669801480950324656599482213698527571810732044824498206146560 +0 +3247820365520474504141328509378188149081215054974241258868837174158013735931353195652588398451957403531162347968567326435270510679101746930629801410560 +3351926412241749316243300408120743481364953366335181350921935617574468700491666785413982788876846871895349502939963020325764850199661145563589709842612226 +13407782359700221432208153137018396716476230393601324554188676058418403973105159781474496977845448805812756231084668278028521746573850893544243696815308800 +13407782359700221432208153137018396716476230393601324554188676058418403973105159781474496977845448805812756231084668278028521746573850893544243696815308800 +13407782359700221432208153137018396716476230393601324554188676058418403973105159781474496977845448805812756231084668278028521746573850893544243696815308800 +13407782359700221432208153137018396716476230393601324554188676058418403973105159781474496977845448805812756231084668278028521746573850893544243696815308800 +0 +4 +900 +875111310488789975911421181952 +2035380368545652430308519267295821824 +0 +82888806482566675458054593503965201862559685110251188150871115527867852652544 +217838252915371173020109452768367308381480947082975358825320754741163297824569 +0 +3844818501136460352282206997400046016138484010779875391722274972838788863919430361851387711731023416592441621480864497086478738067067002557314134469493887 +13303059430491444851018025632227000836103109403803071419066794694357191598196401857213029739867435168357113142017532687949685848431397385176300458413654015 +26710860967093010903451328707767612779801770867376275932886445619834101280933749715932620733029274206270726261110489293726429458417343909725911482831470592 +189516368689051383356419666365934487249694726206307462692478442160356412055175068191548410359233923189538270288357620597887942150501998384340803566981539803652861191767034299241276777771401726930027167539955532412991464793964544 +189516368689051383356419666365934487249694726206307462692478442160356412055175068191548410359233923189538270288357620597887942150501998384340803566981539803652861191767034299241276777771401726930027167539955532412991464793964544 +0 +13 +120 +564218626380911088370628689920 +233942201656969550061072941959067205379 +0 +25031101341889169304446127873801694869672305027436646693413954045557168144384 +165064675467119978329806304469495034196158211217327340109988910890598366587009 +3223038340265066352421850814896502694405790913890534440785162024059085821303576802379715024281065670685423211275932766116756343825199840534435352018944 +0 +13407757579211451638802076068759612924846096912682157704482048789996310624570651395256602779668977880231523760330028517458758478729840969627215870130389003 +26812343265274399502606909495718245988987084717537620990700517306408588619638088444509530024658803496505053000329815974901893831224981448235838474180100096 +291097142306427050053565423426590890568146840930776532405423684287884740444915857761347334012000265903675449121187612221625638517177392299309155307502337486020927127535947499456450345719682189031665783117734919052512795878316048384 +291097142306427050053565423426590890568146840930776532405423684287884740444915857761347334012000265903675449121187612221625638517177392299309155307502337486020927127535947499456450345719682189031665783117734919052512795878316048384 +0 +8 +576 +465758099028613903974183993344 +340199292706503106677777063217100488703 +0 +63322527565292422495135184712771504401404079317527680938906069764207697461248 +33634219328043204849947836966835886827823990925961402040502023813129318293738 +3273384364399040874614920955958929289600820575248783786959254747067900097257458270481819637251484144665389340236271253096323308912816041648439255105536 +1330293784850007390428494387229269593003967094877098901329361383107711576399124678199758357643942725207512746641251003704936924381303175630906145151786085 +0 +26802522297453609678208395193923639182831298274557295628307616531706906562408033942581487447261461746690211924285806443346587426535386688183750358252650496 +776259046150354466227894953415272126532120228827236797123305565388337686400499060284004070246335310139188795312112703394374362640691719752700909206017051198060493495608220461125520225112836119459965070690227765389768580522718527488 +776259046150354466227894953415272126532120228827236797123305565388337686400499060284004070246335310139188795312112703394374362640691719752700909206017051198060493495608220461125520225112836119459965070690227765389768580522718527488 +0 +18 +76 +684365645831470144534108700672 +340282230054365050593775836264159842304 +0 +15963897412190306650237099369975576841343765721507556435820338296445483352064 +132759447225495983324090510251744519265863982169783448911677742254978994593249 +3273378120901846843848851698962475229131019779252045777777029295839115754571447880452966684129870618993409677065064471065432673898932044455452686155776 +2509556964148715486845629632058434150976495148022092181360043667351572633930311684969654834869500136098220017267480404777629280818717809976634762654456925 +26187124863169041879310296789687050376151294751239194912085646467180246245385039287091804854399398837876868573183873563217432331431922121057537489895424 +0 +1552518092300708932455789906830544253064240457654474631625503351024913201337446226079742769388732571127058525201398326436194714101150988019032351961389195980792206263906993685249030935631117974530339035198582125552984050009714458624 +1552518092300708932455789906830544253064240457654474631625503351024913201337446226079742769388732571127058525201398326436194714101150988019032351961389195980792206263906993685249030935631117974530339035198582125552984050009714458624 +0 +17 +148 +450240345242768217289160392704 +3323100413057427899902215874225930112 +0 +32128284792822784994903339199193643879812144651157443822976047334286323351552 +21399706425311438129470274645609834512526586881469866045657503407040080328762 +159433945212719143010790645441202787170674053048920862244647201067119362630573280745854349563469472787838188810917861838889021573237764523468984942592 +2613373875808771403998672140838135919995120994584909205876832476647953072519054679140019492621878245598201737849936937907935929346666864089763133225143876 +12559952028652149332649304876493520745078520101115730204663594383913123396138444109637941720895076538473855709838631312376520291329776343398099754614544377 +8017856871157406767405434525273062325252187193195991171406074702436922609351041617384360871147372313079815808387436833569595297983737028164810164383252480 +0 +620361101309323186180458062143306311203234091808422651940994483172973212453462540277947848500764537416293185308049243121091077089522237714087216426627812178598932718744797175293795424927554129248204812001597295596246882084347634304130710520242400817201806901439842621734294451519310289297352148130231477204202016235965703658712648032709044435339313088432114418262153009154752512 +0 +0 +40 +43745959819122117852054683648 +168479607903394759962667067146355343357 +0 +38715528233353617672333399869957801244330607838176871550029916258713271795712 +176969206917672212723902333860838760994531076051623743859174420245776832201772 +817958506506309444344089149754156868721831281527900674165814694260381207165130129275912203117045009595571041339148072007269936892193254382249592225792 +2495012392157735608513384785636121563536148297029125165554961898046274459648386947163697616808537824603964419169205882992327425601924558527830506385578472 +12578080335425898937631034914453481580403735226890616361473931872760592191355069944068852702365841074365524729550127783372599268817147362827445181721803028 +4414537338963156055930766392922676968349794825277298431003769994668621271197649418638348577968549041479152488344038511751351114279431399223340286968070144 +3810222062618068365811717150182972227866160775529219066268690269078204923607636500488737226639216135781691347449728957827779459090610135784916509209491391739525780725489429856708513412863019815772987039494965127359929026869978738901475381609951397576604571746823630328801160385531009949957361678417920 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +296 +920477174324206192629261533184 +9284550294641477953059815425 +57896044618447473228882389021020048158893283581286713298429387432951596187648 +0 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +115792089237105570840234253759177109864155645142784332660520492325483608801280 +0 +0 +768 +315261692802637380403524009984 +194975556187471037014256123925 +57896044614234985579492874678279777231511723977068592025195038241343267667968 +0 +115796505811356092795647068781241627851478825362266036097151493121449782149130 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +2431633873979216987644919328942719307147268547998470985870930338835155784826880 +0 +5 +0 +411530291995791833340936454144 +8430371667534461981378312405900 +57896044427411158329067913577748761602139555529994913557251651593513897820160 +0 +200512470973696775741802001729116624472381964469336023047436136864269992390 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +105139217027291858322932702413332815756653325789648174055752607031539116791562240 +0 +1 +144 +0 +336939847389361696912547761965915701695 +56769680485161825172645874508895991003378952756364273939185366956838435684352 +0 +152120161136883904630679410835682314109137252156430170124918963201108868258135 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +146783911149691239803259475393272332038744581223672095908357420057841712239442615794649035123910216788213760 +0 +3 +540 +355044044325391863154206572544 +0 +226156212087570969245957375363711374917747764205331043944363811571683557376 +0 +58939719349598034788834787989153374973533704931055104033507141435219301294150 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +39402006196322807380529480735708200350692396090822410401547663254352517428719749608020233606624972587007562114662400 +0 +13 +108 +641005755209691132345429524480 +169808879001621220577003661267706839040 +0 +0 +44595748639529370249161292540321979253045428357143603299233263197536162361810 +3273390595701799965943937691979414704769916280630990616888772670076650363814963712508765166579199284291458024917011124434848164775695410421420299124736 +1675975991229868149900516882649248261736597670897713013053681038667393868471918427266328463160422932861286193025586191261376550527451922228177417820700673 +6703903964959104207882943247098074879292236184530784614687051259089361504778664925296585557644723899819989557097938820112754998714546796218504411307048960 +6703903964959104207882943247098074879292236184530784614687051259089361504778664925296585557644723899819989557097938820112754998714546796218504411307048960 +6703903964959104207882943247098074879292236184530784614687051259089361504778664925296585557644723899819989557097938820112754998714546796218504411307048960 +6703903964959104207882943247098074879292236184530784614687051259089361504778664925296585557644723899819989557097938820112754998714546796218504411307048960 +0 +1 +448 +336018158432268970572233310208 +180765273156339162810970479384136314880 +54500223008692715409863131082228309265686884403715505545748529854974007443456 +0 +159093831874227732340878009766662025143743110432323288610814215572584776947150 +3273390559118820771458899226766464161291486732778797295989297446034440432258612678334470043791768358041505796818841677335566510399466027362411515740160 +3351951982435347662510617978838131757377163638012985906959056077846345127187994044896664670522186682849859846388813294676665146199381509844021491556941826 +13407807929893819778475470707735784992488440665279129110225796518690280399801487040957178859490788616767266574533518552379422042573571257824675478529638400 +13407807929893819778475470707735784992488440665279129110225796518690280399801487040957178859490788616767266574533518552379422042573571257824675478529638400 +13407807929893819778475470707735784992488440665279129110225796518690280399801487040957178859490788616767266574533518552379422042573571257824675478529638400 +13407807929893819778475470707735784992488440665279129110225796518690280399801487040957178859490788616767266574533518552379422042573571257824675478529638400 +0 +4 +308 +1166518355282583652280114872320 +1867930864265730015797553584102471695 +29102955259148582154627179488033442743910184463810481360860886532717730070528 +0 +0 +3222250074367625581260309078639225792086900018469753120634976171874008672482650382620744449542500671237666592813739796235842586689401153234495736905728 +1675924850705485392947165293549370793820409330991855435602880564956203996416735521899714855412738810033999854295106109668962728741188204977372747331010565 +13407756789409068583285272117926118410139843361228200703758948995736421345554633019522866212847835982154695254228762025169838623509788381563214830071971841 +26815564719351665682859297115793503881598601899157213443769731667066042177950468012051000327834243644827516674656869253925854969676662574929007714762752000 +26815564719351665682859297115793503881598601899157213443769731667066042177950468012051000327834243644827516674656869253925854969676662574929007714762752000 +26815564719351665682859297115793503881598601899157213443769731667066042177950468012051000327834243644827516674656869253925854969676662574929007714762752000 +0 +10 +404 +188392123662362022344342372352 +83069143893254589701465618805239680 +53770873442306182229265486377342933660613179904900977100539981823135251955712 +0 +105392125987055312696658210115090338353428803379328229864117878030966024438835 +0 +752977616850105076380076940633351406414760104254761864889884078510546188226624617850820251430303360555185030512473520496936074745273976121366821835935470 +818747238836872411925555128391585707728035178353612801143869743193625443209700942547827054604164470018266730235382896565849803206905706026031866953728 +25978433825210775250603471147163640182647037703575393852672170191437823190873334386823991616355401393588599822282838311791233080986102609403250730944430080 +379032737377413310837469826127201516165849126556927185280268831441004642386080191344591587626743143491163530774059885949190517071683841202707214877193839283509836239507327810571115256102701286181423314856476535119531046873333760 +379032737377413310837469826127201516165849126556927185280268831441004642386080191344591587626743143491163530774059885949190517071683841202707214877193839283509836239507327810571115256102701286181423314856476535119531046873333760 +0 +1 +296 +937851138887707228635723202560 +71983759896126428559029594843447948425 +8631296002177605477020671384515986058586860067875426006234029207453268180992 +0 +126524937455879451586139547446289490007618298090847498853547995262066917814910 +461909328852694177172628852102963427766642499620477636423836056046062222974423229303007292519570049771036188762256954253356039472445656007369836986368 +0 +12981654982074150949064673360867568394481876121003306153656885506667214694877409921526304923306457555280612555616595184427145127254267331837419389850746631 +26382916729981577107547759771891963394403114106409408238867427511943648425024917427272522438481202960509647220636524403278529999467034622910615416018567168 +582194284611795095882563124181957331911668652816390808061798178917116866814434754607160150716463467811845369643570012125338680346889780167007790616300675328647243232411818768880659637664081627824716845155217383295556538120651407360 +582194284611795095882563124181957331911668652816390808061798178917116866814434754607160150716463467811845369643570012125338680346889780167007790616300675328647243232411818768880659637664081627824716845155217383295556538120651407360 +0 +20 +876 +178816467053815670676679294976 +260528687490744071814225196668552224255 +1692970775754977972396027533715957606705876841991018145249546038233761054720 +0 +181828467860701888405812140333208298279745113568339986475984061945003903302670 +1636682816191726232111652774583460805243935699557095064129709690597186770076614594127682973063911518410637341738923286963278231026430050646302719475712 +3045552175859305524398839349214018181219011839758787491368043134180477082575118427510368420050628050508519285324861985507713808320174592548749510991674891 +0 +26789430333357330553113882063869622691267025750963372291024681554553700868085895351207370848391420617790680534043234808601716445354096156366798348609388544 +1552518092297884921190276407777826343730130571016241164825192478707830380921635634356568453745503455149401263113730019700298099019902002012202155472213879518073654497303294521076488615535022163842239123103052036543841131161997803520 +1552518092297884921190276407777826343730130571016241164825192478707830380921635634356568453745503455149401263113730019700298099019902002012202155472213879518073654497303294521076488615535022163842239123103052036543841131161997803520 +0 +3 +248 +212502350661610110150999277568 +131552641820690640981991613732830315020 +46852064353518235919274685523532198947963594743216103431489805826506451058688 +0 +7645097472420881927533172642225448567010395265033633905391291186112176472435 +3270168961867742817620220960232150749713460118789595424509833186804266725716461911398439168187233942133765790497556243236366961654908249264223007277056 +1319225067735212639136382308035057590059309856444213959056608122715470491794696873946870339629603616630101618120768022446070919013133368825305188791863556 +52371053055727292068337250065143561186684042431774613097615715910894227837903200691375492620062343989956747038583170958041377999304092089877801155428864 +0 +3105036184595769842380552815555652687460261142032484404408169394138177593232526559709091771925126394796328107261127062087481484183515508524562872429687439110406240134689348936276584863546005281248676694097265868804492346319133736960 +3105036184595769842380552815555652687460261142032484404408169394138177593232526559709091771925126394796328107261127062087481484183515508524562872429687439110406240134689348936276584863546005281248676694097265868804492346319133736960 +0 +11 +244 +487467278610825971461915672576 +37219007724616326815534795495032483070 +54261526529889546426837093235106983177444977555403308095742429498729088155648 +0 +107016117482346548945132799722790195082654004276904907765013628055123622641280 +532756921246156839774884522958957381993726902395061115447006962643864665611333830690037070998783636394390002400377153551361959604547283639352680251392 +648914867617031739979557694643818049979203668057216504375276139438794885369435464053038064827480502814067006804498359154626423603962100263088399856229752 +5364093535730936147463541649596432444678219926077667883734454151057107749354453510341798218396870848298991695001682180874640712029651920116811669171520874 +1991156344814561149591525479707443429666289210206171383484367556587262040991283414287056032203739853332216309866181308381599630640701720000238883574906880 +0 +1240722202616389513973922768685786106091078788555724681396110088894901580356174059693107801547999717844793849118253907517164294570375212313898259715085141105940658891307423763778538377665051892100124228941562467259128201610076266056373405707086736336167605239314782881108716366473706926696989024480092947548903006603393526774842227227605392632574744471346260936099413707173396480 +0 +0 +704 +909145740350063529575317504000 +339617676839812128055403992765682035710 +14413099430244372787741726071480578266606634696124905686464507820541353132032 +0 +146524398017507879126999928537531295106484509790504566263346294215577739873005 +3254975840579470187367063835491635394057759998624067184757863431671954891319873665317138530989747197877058152019092707613957271443147158112429244678144 +3843711574626452538685381156156840092205919446460373936017331874304198217565605768350118518588418750150969106731407527286192635659176975773727687264432087 +4205957252106146285324136572167758103773911995097166007755650365293107620480255479665969264400061595898062331701334890614260926224653154131473051276770435 +8408484607981740863725931685258026020089701582650612125407183571331861026600781248142155638797478057210678107527105854861551567600339635902678924701728768 +7247432637346354371163106580695035004917324395155467725275783809664161137077212420767747102195383275127295776660124857944728848308128852665484048296413410766845286744067292360940573825374902097450095259142985756793464941933627257907444867237270935916576555993785848630242076423028942395099630612250624 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +771 +891784777631246170114448424959 +1327929446201306785262743695648620545 +57895602960811796650871631801676582813791887579127636891104569893774562426879 +115791647579680518644692972256970658065423327120836162316857392245886991466495 +0 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +231583736816786089484927226016147767929578972263620494977377884571370600267775 +0 +0 +755 +980371960117523085246513283051 +27886518370227442490517617608621031445 +57886769803885777441266973072067004984382407931727987471373869918625558691819 +115782814431179474733867342212841622090776966681872755443595390653954644770795 +0 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +4863258473152507879183471746339103126521158417536030394524935575998782605623275 +0 +20 +0 +979496649996061120625989647476 +184912836387971170628447453353642820495 +57495019294216825495300358413882228250071985569553535706317326020767243041908 +115391064295158177288750649755718876615210881213845660614425620051755068816500 +0 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +210278033029641769252313921222662173280057706815367409439459119190804505043139700 +0 +4 +780 +0 +86062321544974934655405918178028521480 +1701915421036549486423916534098894939525282066843008931871172149931497488384 +320684042551872460005602592720729811431853324554571705767199610066341724160 +0 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +293567262432083559770702660509494961636846893913475830448684457955877331972488384611363806317219648949452800 +0 +12 +201 +530142478699265899132312616961 +0 +496656137810479889911783346996430981790696540282828777020061097092186113 +1385979954003213188845730955395660891569986416749169143986031551791165865985 +0 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +78803862104411649792976274791681038936454943300723566886694079153850261012036590002656572187311458765011955822362625 +0 +10 +812 +236535920218075649755406401536 +170805148163762844199452890793586458880 +0 +77235627923455501669801480950324656599482213698527571810732044824498206146560 +0 +3247820365520474504141328509378188149081215054974241258868837174158013735931353195652588398451957403531162347968567326435270510679101746930629801410560 +3351926412241749316243300408120743481364953366335181350921935617574468700491666785413982788876846871895349502939963020325764850199661145563589709842612226 +13407782359700221432208153137018396716476230393601324554188676058418403973105159781474496977845448805812756231084668278028521746573850893544243696815308800 +13407782359700221432208153137018396716476230393601324554188676058418403973105159781474496977845448805812756231084668278028521746573850893544243696815308800 +13407782359700221432208153137018396716476230393601324554188676058418403973105159781474496977845448805812756231084668278028521746573850893544243696815308800 +13407782359700221432208153137018396716476230393601324554188676058418403973105159781474496977845448805812756231084668278028521746573850893544243696815308800 +0 +4 +308 +1166518355282583652280114872320 +1867930864265730015797553584102471695 +29102955259148582154627179488033442743910184463810481360860886532717730070528 +0 +0 +3222250074367625581260309078639225792086900018469753120634976171874008672482650382620744449542500671237666592813739796235842586689401153234495736905728 +1675924850705485392947165293549370793820409330991855435602880564956203996416735521899714855412738810033999854295106109668962728741188204977372747331010565 +13407756789409068583285272117926118410139843361228200703758948995736421345554633019522866212847835982154695254228762025169838623509788381563214830071971841 +26815564719351665682859297115793503881598601899157213443769731667066042177950468012051000327834243644827516674656869253925854969676662574929007714762752000 +26815564719351665682859297115793503881598601899157213443769731667066042177950468012051000327834243644827516674656869253925854969676662574929007714762752000 +26815564719351665682859297115793503881598601899157213443769731667066042177950468012051000327834243644827516674656869253925854969676662574929007714762752000 +0 +16 +609 +545306965334305070535428538369 +279140464132946334357706429686369222400 +7406843684534142392231674926942970103518516953277563631729298779229034381313 +99504290823297638334108694763431302859273071431201477680525780928285863051265 +0 +3068828863952642212954550824781949471706925652624740282997645633157401134297482162686614226600559094354652040572382157503998076312688824831378653708289 +3351747420734084318814777709463072684680568429645439170036971071607493627162331730307565640643700625157707898035813214628403945348939886654254966839967755 +13407603368198653599916966360349182445860677952189116966338325261838307493042291733025734240527487306726277277475017816874139388719266046460146247631110148 +26815411298141250699490991358216567917319436490118111788391170510734243865899882177999643382351524030438640430874095404682320755366801087351505982316347393 +53631027158026444898639041353951338860236953565976155186370673275827169990229796710610136585486710294744741538759339503142188427219888626557524901703450625 +53631027158026444898639041353951338860236953565976155186370673275827169990229796710610136585486710294744741538759339503142188427219888626557524901703450625 +0 +19 +448 +419503718805658875387206172672 +2077242944938429195137432070841712640 +15547379883828184557614956585300039279332926776310673064160034921917517398016 +76060301533772398864920633133842399024062776386463688241907828176392730705920 +0 +0 +3100499777879036046354242314465281000311356809812322648908432701931354148039845530687059083481027219222267328994049763996642543097608483388405392685683664 +13247411790161783301453076470506974877180133239863599739180652432861657397429491299831302452529607962871535551825200558366188613745877614837598770220261375 +26655194146789027576392684858551684343747483866279183444222986385128527302433530201438611541127422007099216753946031614405036472347136502580285951140954112 +758064029037559548223859302619650075474792064511873124215265408149659395559453789942397036648834306197292055977388138161024258210175532633810972040915105374809744387652086706188503922572983286780452241329985943497170267983052800 +758064029037559548223859302619650075474792064511873124215265408149659395559453789942397036648834306197292055977388138161024258210175532633810972040915105374809744387652086706188503922572983286780452241329985943497170267983052800 +0 +4 +317 +998761803804737242509890027521 +132039001590898075997904159680621457685 +2677345058813886421031534284112569580584095914017301741535579811855705571329 +60086096674039095602687907949217152706690659894880673128709412004817402855425 +0 +2714004844124354489262183477493191831493012005747958882863179807930524116686711719016251086947965968979909339785418727709907819948220584644496513302529 +0 +8405533274884546926710394653557214629954286686035689894640417053261039449975179806395580875447085555592435119970176210181270653403403863429651960501895178 +21800298814094737305815960841066827715322148914667052956623818275284251694892649734484894880644976907985921519360277878586310362568695504456731719639236609 +1164386348601867966607659549490709240641434805493466720013626865708760416816760684474263347086593403580537140168446677038569831210140531685534851163995750025031331763664446019825967919583282914146489408839507982335431232969112551425 +1164386348601867966607659549490709240641434805493466720013626865708760416816760684474263347086593403580537140168446677038569831210140531685534851163995750025031331763664446019825967919583282914146489408839507982335431232969112551425 +0 +17 +205 +314141171791122356976004104193 +340199292706503125566666675774975279115 +28964696041878609460721583118083346598086669607678005131861204748455792082945 +99957388910786315412288528953468780503360427998738617462677827481821872390145 +0 +3273365633955366159313212088482024572601269794428675433404928819417293489209545301349145972651249428525225361135543177673426309845521311956629494693889 +2190371668160050365756300375697808168184891704732002727464497057741609895764023359151357865247649911895528229907788684972491076160970752924555757567389999 +0 +13355433780100006387064008929644857372863390914834597336542712946266197713041680465273314799460842675250982197484946421191657518371278691462674567665811457 +3105030262937843909524927703451704725658035213057063685463909781308268889930827638236818973565112070382840731126979240983820442568989111483626724942061970361307566813811606244576718762256490550467423465073089242630619613999057076225 +3105030262937843909524927703451704725658035213057063685463909781308268889930827638236818973565112070382840731126979240983820442568989111483626724942061970361307566813811606244576718762256490550467423465073089242630619613999057076225 +0 +12 +284 +469455506976059516207830663168 +7983013255172082095516649800004406650 +3278348336177517342236710812605326558782498594141487069958521276783524839424 +49934227818811015946301187530148750948812049358364108430512532097940534067200 +0 +3273340660038035347812612675467311420171630095312401315302288177974137674243108506349429817414905569256600781798349855567184974503808521851120146972672 +982327148533126242072022252525591418809619347163444615270839351763368878975643860701971724697659683917532263718739457150238974028247429927345334167713733 +104748299685181425020034909109462515817741155084762579290698462017633201711683603583490202643438294700869447910072736485865669638419855454497265191747582 +0 +6210060525875687819049855406903409451316070426114131520435474836896735901928651243521579858300210079569809751772692509393442960425269123499217289079803270033146012536744468900746753485654275750950451702497211174173610068660767948800 +6210060525875687819049855406903409451316070426114131520435474836896735901928651243521579858300210079569809751772692509393442960425269123499217289079803270033146012536744468900746753485654275750950451702497211174173610068660767948800 +0 +2 +792 +908463780656071624777999056896 +261515365625536058211954562321762025570 +34363418467612574510754913120306634286074855670046492773113408281091304849408 +10298831750975224705374170392070256950455108341101642844973509149630901780480 +0 +2574028491173218120625899532721726274186853463121682997388228482942119986058323148061481093086189118448821055880517089549298918525641370835815728414720 +4120102032912485584810225493556057268029400391693494480932846592203494031076348985539608962819052881655035473708663582142166452080933667740632631826057007 +856003575715523076496369484540354031854736721527329146406504552401922587486406713440294096206322908227412081709722944295562761974115865043527354259339729 +21764966850770680808129698311404458926940461873933266305652877546331848854154464975008335516009248494361468975669230614809453688953293987972822568271872000 +0 +2481439672835455316435450222961490952467054688477443973252759241836914049418059193066289201770080478782010589768308256548437208615056252516149995383823877308087652590010038324508787501850632011084265376115191445269164718609708653219057772287156297315205415965661016801043979428655461218374679406517792258741473669803979329510535342890018189384338466515427440201885258439091814400 +0 +0 +257 +298786413494195337926333693953 +337290227426691062405101930191574138860 +1721557327184276218905921841580400523329018723867073430309901742933509406721 +43140760179084762019079083403357933038043634800552651991719281264271550316545 +0 +1722565222021586222240835395091318715753470054907533129614806861693763466404200515482815025582326808788762316564603538107574831856655144128570072236033 +2234952031666178846254667297858171395150952361837877098087851428105640476175757319358218484222203579051989090125885331901125929168491732957000222166220648 +1518988687987889548258752669937919719163485722572881415548098968240657129317428928409749883901857358027538087530548460431243184110285208539870701198734266 +7561054567803749177499530087746897215634212883033990021094138935566693847154583699959527092384199840443587272455015656435728392875020886765971239530921985 +2731552852909560361740271235103848633585430399772966278368610671996079656149041832681481179874533365237667879503570748309035396591549050138743255246745020083145958259577107779208560547563441300194243546659169188197945241464932070395298656044644609029877051203642896482946894197008303189122778822344705 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +10 +348 +734763819450510610632565325824 +83076749736557242049732541826465792 +56086793224325083479877516880625996376700331315327416568653997679101469523968 +43066253535244233026187978142387001755402803069145978156050831917314998272 +201496559500976655734260440277137434576370058288390243702942488773257463333742 +0 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +3273390607896141870013189696827599152216642046043064789482248405676250539528505110690804490707447337828870590656092725446174963629590181147084998049792 +0 +0 +44 +218233034056168691435097292800 +1744611744467702083044383378355781632 +19901765337664800850390559730004689805459726391923360699911853410490607730688 +904391324240128893549947540990127036863458864452065541277067470263614963712 +62920486818360159690779177529226303371349723311026208168990341953735925188632 +0 +68741202765818979270276983633379582196549482966904360579127216519201261330098607324506894304856394094406282403777947234369674236221393804088784959045632 +68741202765818979270276983633379582196549482966904360579127216519201261330098607324506894304856394094406282403777947234369674236221393804088784959045632 +68741202765818979270276983633379582196549482966904360579127216519201261330098607324506894304856394094406282403777947234369674236221393804088784959045632 +68741202765818979270276983633379582196549482966904360579127216519201261330098607324506894304856394094406282403777947234369674236221393804088784959045632 +68741202765818979270276983633379582196549482966904360579127216519201261330098607324506894304856394094406282403777947234369674236221393804088784959045632 +0 +8 +0 +381333582997345008331364761600 +75433688760793975781157147978430939136 +36185027886707999350496222768347471118285021760886825059748692088495240380416 +39104158210001763587778684153287397593905745186784548165694155380922018430976 +7723941625792713615971218884053930976624837598150250143250994735002495495486 +0 +2972238671969696817971976244719460030212710977807102828849881552354035489891882640507250477562362182748614496315732194705126866975667884481553178229211136 +2972238671969696817971976244719460030212710977807102828849881552354035489891882640507250477562362182748614496315732194705126866975667884481553178229211136 +2972238671969696817971976244719460030212710977807102828849881552354035489891882640507250477562362182748614496315732194705126866975667884481553178229211136 +2972238671969696817971976244719460030212710977807102828849881552354035489891882640507250477562362182748614496315732194705126866975667884481553178229211136 +2972238671969696817971976244719460030212710977807102828849881552354035489891882640507250477562362182748614496315732194705126866975667884481553178229211136 +0 +10 +292 +0 +15950735830886245879793511262675009024 +55295183545873315171593510499304639359309142595148333408350307564081396056064 +88673301847573357691787887535109587141732823026243004811042692202944186548224 +71382334957950784434776455823589545246296460825554303150898409735430888754614 +0 +503374556654131282931862970076766895496736542723035164142032759422296925049432254807648984573579824482106516024331037426413253887593584118716997617959386 +104748499257567256899349831135169132621460671660236086705487934064427347429028587580187955384662408370456791930169521510043606360268932440897712509943296 +104748499257567256899347058465480176306318788546142086208502905424473137964171226003463092917526586968944371705089437305260822371159371705523810370322432 +4149515561151917970063980879655710938513649460124350952720371065270297197065154634382680097543307069927884450339928718724097725668943949230978441358030208342019760039438410280075264 +4149515561151917970063980879655710938513649460124350952720371065270297197065154634382680097543307069927884450339928718724097725668943949230978441358030208342019760039438410280075264 +0 +9 +868 +5739147702547097575372095488 +0 +2713877091552199840178420005509414594154173361691187048697847208972757499904 +81362303935415148417232364154000808137283096524262229321247229438793141452800 +200007298521575553572893786526415964968717615038369762603224568413766370350860 +0 +365274778563818870578410673942542327115651568182545616551841135130206091716597190978235713154149431886591172348565386179014379218648408362061584266709978 +13404534539334700957704366709891405336608567932898539989935340808342845456223809807251372098853358563127263002410967890911834839205657225176731688399536127 +26812342469277297312995538029057334885559747174722586807584708484779441945819860598056445363795896769119485060050221372726166946816056038393356849495670784 +1113877103911668754551067286547922686738237475419584309931192581897577662915063323503306740447008536028968181678028580322422866333819711284625174374608617279642589745120484326564854874767360 +1113877103911668754551067286547922686738237475419584309931192581897577662915063323503306740447008536028968181678028580322422866333819711284625174374608617279642589745120484326564854874767360 +0 +4 +900 +875111310488789975911421181952 +2035380368545652430308519267295821824 +0 +82888806482566675458054593503965201862559685110251188150871115527867852652544 +217838252915371173020109452768367308381480947082975358825320754741163297824569 +0 +3844818501136460352282206997400046016138484010779875391722274972838788863919430361851387711731023416592441621480864497086478738067067002557314134469493887 +13303059430491444851018025632227000836103109403803071419066794694357191598196401857213029739867435168357113142017532687949685848431397385176300458413654015 +26710860967093010903451328707767612779801770867376275932886445619834101280933749715932620733029274206270726261110489293726429458417343909725911482831470592 +189516368689051383356419666365934487249694726206307462692478442160356412055175068191548410359233923189538270288357620597887942150501998384340803566981539803652861191767034299241276777771401726930027167539955532412991464793964544 +189516368689051383356419666365934487249694726206307462692478442160356412055175068191548410359233923189538270288357620597887942150501998384340803566981539803652861191767034299241276777771401726930027167539955532412991464793964544 +0 +10 +404 +188392123662362022344342372352 +83069143893254589701465618805239680 +53770873442306182229265486377342933660613179904900977100539981823135251955712 +0 +105392125987055312696658210115090338353428803379328229864117878030966024438835 +0 +752977616850105076380076940633351406414760104254761864889884078510546188226624617850820251430303360555185030512473520496936074745273976121366821835935470 +818747238836872411925555128391585707728035178353612801143869743193625443209700942547827054604164470018266730235382896565849803206905706026031866953728 +25978433825210775250603471147163640182647037703575393852672170191437823190873334386823991616355401393588599822282838311791233080986102609403250730944430080 +379032737377413310837469826127201516165849126556927185280268831441004642386080191344591587626743143491163530774059885949190517071683841202707214877193839283509836239507327810571115256102701286181423314856476535119531046873333760 +379032737377413310837469826127201516165849126556927185280268831441004642386080191344591587626743143491163530774059885949190517071683841202707214877193839283509836239507327810571115256102701286181423314856476535119531046873333760 +0 +19 +448 +419503718805658875387206172672 +2077242944938429195137432070841712640 +15547379883828184557614956585300039279332926776310673064160034921917517398016 +76060301533772398864920633133842399024062776386463688241907828176392730705920 +0 +0 +3100499777879036046354242314465281000311356809812322648908432701931354148039845530687059083481027219222267328994049763996642543097608483388405392685683664 +13247411790161783301453076470506974877180133239863599739180652432861657397429491299831302452529607962871535551825200558366188613745877614837598770220261375 +26655194146789027576392684858551684343747483866279183444222986385128527302433530201438611541127422007099216753946031614405036472347136502580285951140954112 +758064029037559548223859302619650075474792064511873124215265408149659395559453789942397036648834306197292055977388138161024258210175532633810972040915105374809744387652086706188503922572983286780452241329985943497170267983052800 +758064029037559548223859302619650075474792064511873124215265408149659395559453789942397036648834306197292055977388138161024258210175532633810972040915105374809744387652086706188503922572983286780452241329985943497170267983052800 +0 +16 +340 +489999298658060606770815959040 +65917831211867928874530031796224 +28969231374168613263842556329545499540109231248092360272492724547015497744384 +68303323936774140202719196442124407349064491640344301413273835245323528699904 +220582077585708131409418305801668729509895157179171750108892384250126492963439 +0 +4804945288123442010222401382109230365079788294360419184263639495544851827236040774654927416132970446792680843281670840974007791035147359089441307393725140 +3995740589390131255265030474810945587346695732799634773144861961076152108877615344840794991624367988213509285047106094674019831607362782913160546304 +20112528644247378748485207678778230522376838717178079586666155777961060521345313959113396257799770147881566663604597031528679108324303709306335886028308480 +1189613526782226450238449998519920448105001333280634552448143810423744903640583354069064306219173184942982331075095637132227052133984240969520801427024276971961154677814797680960299256016991306350726117506035295751028264478585708050339890134372768016601971372719322793491437413935874048 +10715086071862673209484250490600018105614048117055336074430675836924241540472703456698285220172692381666915465456597657220856438022326048260043738079097569861723477222864084024723456654120868104119493560585512807944190828392178187984719137393049169103254142087127248661337626132381236011316443311243264 +0 +10 +348 +523874002024118652564917977088 +338901215317800664056147458209075441279 +20015404885278470017469976725210570559655906804843243074581372998796865175552 +43274941068732512819275538703072682628533785069604029470934065279649011728384 +151466924635469551055256360824023267312984281713620934309319977921329196239204 +0 +0 +13404087018778832492634401257245418742650562079557921670746800976248311228584588308262299650079813922944058763900421125187070437820594035236042565924945791 +26698406546920616841305199515713884093627804673942214629126931437741327626828248539905171617610372257154484914410867070819728868223045327378733339376615424 +2496627633295536710441065870382453446241561054214863710921665326529331643172374721617027428678254874230352879588117492841911257615156115956910959191976693536620732271898886706126399033775592559421285971973156294900372189579993713535075264782220371887837493529329161088095671325291250112790528 +16458372206383560850154727152772241309834362634645429482097685030171884111143709030259566480970840675586286057165552281949963074948236086284290260005656649082848245798566424861913543183906541851941660459520122404258933779435071795354694349641611033685309336221143617936715894403545863381859480370679906304 +0 +11 +36 +59097216112512413701662310400 +340282365019520591560372007455816679423 +29895497284693382961837918038726436373289999003535570507137440248052571963392 +539397372001143345279173783832913095317038465503343488764756916815116894208 +43994058047115475121282498486196678252570359157229388277889413858394010898203 +0 +3274891444621295245553525375878222425626418688341503128076239321506909158791609365713742593237016516146106629422990668626267243448311183620042075794130081 +0 +608850787303864097127237682881155896480025728423916605455510274914880477289308210564971661455576995032557297687074419380448068658475227845925355707695104 +4872657005698891626244130971294875853353482202322888855972256338282628395923949326743092700819820592141121207789967023511190748555596067213433893308801964320495837037320565222597343423626118652097789780615868838966704829900803241659660193801529518775840320495759898504684544115156495368192 +43888992550349509466047490008389760228034918444740354476264789433451422494435484145605446873947256471512988292597450618642207676514741311261882165968599848430310026415377131508214755446432997138431116604680521746555008944242629428478468183278110882114932777127534190355484669739785885245968619478007676928 +0 +9 +856 +104786732573771294575085748224 +202208808855666172013483050871179179009 +18208247384094454656528310293180405432371044123060662434648593997496387108864 +105494033770685441277383922803075785930338167649609913078213878653210490568704 +70973503770577650219006804111060955590039707453059535237966473815460451376894 +0 +844360569033703606248598340834091269063135277987118651898622507491431258386488521835163613652641657086294536373967783421434176997645745172742040950152481 +11325931297285258457955557624614589968683841815173942490148987555849011164310979692749741711850895657264350824049096301947145237348941454577709986315503615 +0 +9745314011397783252488261942589751765359439629682498258594182172731326020846015217955153176479771037023708782206427041980054199788372006158023795063990197799705875528943477976666060127441354860040345913426334531070250301774693553668261371384134782207849454728022523237602477129993155510272 +87777985100699018932094980016779520456069836889480767605004803903623391638540464457280122746011077411993751425324753978750781979522477580196467009117071428016628499217023421730630965195213525748235513398478599337876370083082111993797578339643292113170849335330813036879783075982297998725326138636180127744 +0 +5 +520 +604099872677461461719763124224 +319016032279817633173454602139076657167 +25937207995432447928130425230903848811380238160577523896265360534027632640000 +28845060685139153243157308053688441659186794603444860805606738986483991969792 +153301215783503611051396286471481032939260048039658940814506725148996787175097 +0 +3149305835778308075879605336418583050818943987437860348514400116385895791740711322789057830278628831079477475379487412794197710343939864774337162678064305 +3659421921346067805224249323884195392692805978261828687014108315869866733026982892516385418585908368056386669445315625696706939840887495172401263957634672 +20207055997465600258590823136326869317265887543207831056737256668785160996102476475846643074001715697259463093105530757445235263029351945691975506286608384 +0 +35074662110434034853557842365135370752418744845644232722536724705537763948482350096800897815346751615649214933728622564185847196492435060706089044924648133026630781093917108095545664072447733261889308217617387286462129653489067160073127037621299577013488448084508231783465815261392679840044175715075506479855049458960417568692240224459402814116944692003822183536118940032489278563958573604110859792014017609258239480765944544557609136035015279952003072 +0 +0 +116 +805503763346205994314608148480 +340183520577929235344824363378070683647 +50883512962844550181662585462065381386388661208506498472907426814607210053632 +45369850654893983160918274674785697866505559719989912454419447783027986399232 +154302323811821750963079572939589834113268452193107213579317085474668962267832 +0 +4429069692833256013828033293417215715515853411462216173559663486555105143091358435961898114179716869586726330539677802025756405286834909255857771319348908 +3413964447864496376412885553514780382856915468175834848210969401153418011678718897157435214753452394983129758958670494207724335130333416367673732227946338 +16964157088706179080247287469821598064768337533310042213494946742295692399965660890951897881516503810954503600149541042117195593349934525801018052923359232 +6219124707082025502769567924616693739587312435415643801252808044792830067505770684521209436169838390705513344865384140441996828911506822132071414925409408028130637631320031048854647327652038853841213412686318991744226884295456904299892342457948750792019916788977941916623229379610287222408835093233664 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +455 +12835319081690733822122917887 +127603331931914074262646774143133941767 +57894298449951398757252466847559442906950400042978305056517893187912714944511 +82474589191995733226059000413673369947276401483368126437014470136553367666687 +1725367873614246661397681099761093360336884063153660970896243052915304594387 +762145642166990121634319750876330910924084988636669303246807590962648009181396757661856053558136824594202566053704052044355748404436481867775 +0 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +5027927973729236057982426364448826617555638513633071601633370220421967636306746498030257094484300966958703364072352628851378448187094873990326993486348287 +0 +0 +475 +269541700715505410264581275627 +297693402123626315271960004983435296922 +57859375075817421675264509035607066940711169672592018945053659095526761562091 +110877123712432405983959456058661230794625399151749997930016980310850197782507 +36232725345899179889351303094982960567074565326226880388821104111221396482127 +16005058485506792554320714768402949129405784761370055368182959410215608192809331910898977124720873316478253887127785092931470716493166119223275 +0 +11731831938715777520612778668353660668457099020791414454225295929553974535670831510938460179265466667423020702522654604586832988760873000236316670377852914 +25139639868658374620186803666221046139915857558720373440362266333582541989451932860803919374764761513214467321863672910499344396369729736178810105052004331 +105586487448313957217630953653425358968668408786294503634300774628861320362441676458635398984170320306132770645519405205878947411928992353796866863213314027 +105586487448313957217630953653425358968668408786294503634300774628861320362441676458635398984170320306132770645519405205878947411928992353796866863213314027 +0 +5 +0 +245614345371770711601028529268 +167820641058901852935904395164427229736 +56310523432975538089098580075519192838001302745960229901614877098209729051764 +85237339161927006470244447187006939882425784659579906112900841728046555724916 +177131608341019431639531082486186163608416895761801191709521384618872970096746 +692028243087627030443962333795708467119069169682095727348101292594084392336708255956965296630788236731535929976763279256275019551228325535939700 +0 +6703903965663326792874639644623508444541867482964682679434051891075530751941922751907842696366672689743371632139729220006073257144919838847329290738990536 +6703903965663326792874639644623508444541867482961636626584690077349172630440349667689597258763613066465466237204690258874126738857263918193693789796695156 +4565358600146146340648043138919534568740519770378829014283100160143146613766525820211473441791745277998502654577696186997051630953882145583216910085604244596 +4565358600146146340648043138919534568740519770378829014283100160143146613766525820211473441791745277998502654577696186997051630953882145583216910085604244596 +0 +1 +160 +0 +255379205689110469036436140398487013344 +21712727978259726293356856503923709634858594384551721609867559528598392012800 +78804868437368052447826264773726337899091993565064061055519163000168722202624 +126692487956834088798699213663796104822239968371597515995972949581479497637654 +3272191856449843397936528109279065189423120989381483148252736570244975246791533222321103893532128937121700575680421527659060354684671413348913870012416 +0 +13407806431527680864118905249453282443943463537493942574619644941644874674867613388388672408903771364000715917576061318747309897108671036700271413040513020 +13407806431527680864114646428811044898323062754972248613389335474203674829637362806742733003747804478536315412888860690712090962708053524257498831612018688 +6373655901930312136397229380018411440828683949391920950832693445711366448193584697763678864931677968612065262908033170282412527802037703004824976134384286640214222530054133889372258304 +6373655901930312136397229380018411440828683949391920950832693445711366448193584697763678864931677968612065262908033170282412527802037703004824976134384286640214222530054133889372258304 +0 +3 +373 +663267250817584834358806577153 +0 +56110155743260739980845965626188839982990513354097487512099126177554948423681 +66666258429912423795302025160998297406283412204636264833390604129473579188225 +177994438507773838104674369561918072421924948198026690191960823057415806012035 +3273390607133996772975242796981079624647701753259790782144449701319437329708326713265031806779102708651838281996474323697106010993858402738833536843777 +0 +8386426737429153324968205650664410607248107158089641410510843662012750503977158430826944378515156355394129659501044340493857762955532974869923505951997952 +21794234667370607206078979989803643224514176633634282995495125018424131531561390135283100088614877484687692308031922838398470089333320084110908709465489409 +1710915231608582551713494414139930175751260546116444122900349352360496966554854730076753484481830650675467827629295222707109502155201699203484369755223655341193278275893163301956243837193027585 +1710915231608582551713494414139930175751260546116444122900349352360496966554854730076753484481830650675467827629295222707109502155201699203484369755223655341193278275893163301956243837193027585 +0 +13 +120 +564218626380911088370628689920 +233942201656969550061072941959067205379 +0 +25031101341889169304446127873801694869672305027436646693413954045557168144384 +165064675467119978329806304469495034196158211217327340109988910890598366587009 +3223038340265066352421850814896502694405790913890534440785162024059085821303576802379715024281065670685423211275932766116756343825199840534435352018944 +0 +13407757579211451638802076068759612924846096912682157704482048789996310624570651395256602779668977880231523760330028517458758478729840969627215870130389003 +26812343265274399502606909495718245988987084717537620990700517306408588619638088444509530024658803496505053000329815974901893831224981448235838474180100096 +291097142306427050053565423426590890568146840930776532405423684287884740444915857761347334012000265903675449121187612221625638517177392299309155307502337486020927127535947499456450345719682189031665783117734919052512795878316048384 +291097142306427050053565423426590890568146840930776532405423684287884740444915857761347334012000265903675449121187612221625638517177392299309155307502337486020927127535947499456450345719682189031665783117734919052512795878316048384 +0 +1 +296 +937851138887707228635723202560 +71983759896126428559029594843447948425 +8631296002177605477020671384515986058586860067875426006234029207453268180992 +0 +126524937455879451586139547446289490007618298090847498853547995262066917814910 +461909328852694177172628852102963427766642499620477636423836056046062222974423229303007292519570049771036188762256954253356039472445656007369836986368 +0 +12981654982074150949064673360867568394481876121003306153656885506667214694877409921526304923306457555280612555616595184427145127254267331837419389850746631 +26382916729981577107547759771891963394403114106409408238867427511943648425024917427272522438481202960509647220636524403278529999467034622910615416018567168 +582194284611795095882563124181957331911668652816390808061798178917116866814434754607160150716463467811845369643570012125338680346889780167007790616300675328647243232411818768880659637664081627824716845155217383295556538120651407360 +582194284611795095882563124181957331911668652816390808061798178917116866814434754607160150716463467811845369643570012125338680346889780167007790616300675328647243232411818768880659637664081627824716845155217383295556538120651407360 +0 +4 +317 +998761803804737242509890027521 +132039001590898075997904159680621457685 +2677345058813886421031534284112569580584095914017301741535579811855705571329 +60086096674039095602687907949217152706690659894880673128709412004817402855425 +0 +2714004844124354489262183477493191831493012005747958882863179807930524116686711719016251086947965968979909339785418727709907819948220584644496513302529 +0 +8405533274884546926710394653557214629954286686035689894640417053261039449975179806395580875447085555592435119970176210181270653403403863429651960501895178 +21800298814094737305815960841066827715322148914667052956623818275284251694892649734484894880644976907985921519360277878586310362568695504456731719639236609 +1164386348601867966607659549490709240641434805493466720013626865708760416816760684474263347086593403580537140168446677038569831210140531685534851163995750025031331763664446019825967919583282914146489408839507982335431232969112551425 +1164386348601867966607659549490709240641434805493466720013626865708760416816760684474263347086593403580537140168446677038569831210140531685534851163995750025031331763664446019825967919583282914146489408839507982335431232969112551425 +0 +10 +348 +523874002024118652564917977088 +338901215317800664056147458209075441279 +20015404885278470017469976725210570559655906804843243074581372998796865175552 +43274941068732512819275538703072682628533785069604029470934065279649011728384 +151466924635469551055256360824023267312984281713620934309319977921329196239204 +0 +0 +13404087018778832492634401257245418742650562079557921670746800976248311228584588308262299650079813922944058763900421125187070437820594035236042565924945791 +26698406546920616841305199515713884093627804673942214629126931437741327626828248539905171617610372257154484914410867070819728868223045327378733339376615424 +2496627633295536710441065870382453446241561054214863710921665326529331643172374721617027428678254874230352879588117492841911257615156115956910959191976693536620732271898886706126399033775592559421285971973156294900372189579993713535075264782220371887837493529329161088095671325291250112790528 +16458372206383560850154727152772241309834362634645429482097685030171884111143709030259566480970840675586286057165552281949963074948236086284290260005656649082848245798566424861913543183906541851941660459520122404258933779435071795354694349641611033685309336221143617936715894403545863381859480370679906304 +0 +1 +1 +1241060280638922538398643126273 +223107749314796826962584252670127175984 +37426377577435691661688826510960246067884784188204265749528164919729924866049 +9094069612766502477615976059819999205719984916420114506692488266649035603969 +3380611435722827550596800218965089112417919202169043851920848313612545048694 +1664815596802569074693189778674696904124995874607176724972727327974860890963436416434523283587337601895433614890072030760067154716436803630431767363585 +0 +5026379062749122967384141319640742832082429726007228978085493989865528045961662210976446288998254740248728104766675876130693513073515674327757412823465985 +18631546706693366379985337373654708162934588015371887548718390108226073979961939305072220762985923906599359456912063191643353388948502368005581210117996545 +7666833439049186440719686713438138111752796508797184433364211618118049443528439839182907766570695724955741264553761512695357483049605308096343230024550531616749580571202626675398897041388144580063394461398121571858194591602410925543646216736039567657824018701113172610876571443952867447178002433 +25280059709008981479231968148711644861442111696433705443231567360117402528393306066518309787037990431336656280044426224316649696164180810324022564882675140987960579876942528723700768267175237032707899300231700312150169638715161500573218061631068318350665689512114702779435677385026007774824467356638267834369 +0 +20 +141 +486322689729062157054589796353 +5233832698719648034352645296049093138 +27877848636933271899195252835832934260926934447655424254310367380191336988673 +95046404405893116989598089438620745282296913815862276271716035282978715205633 +10841566652186130506277177706281856862358509613184422194022722527294938334508 +156434328106533251561339638441017247952143366970355853257183610685433013344346228490597502025103483349050029645755110902306747038242560335594425155585 +0 +0 +9662133425425935480096041513586603904206372855623860335152003830393861922520465132980695412533788401921809758413865008548781612626086595943461642943070209 +10226186785978516664210805392326593786462345638665902695628517775117882756746916394520605503809745503417957883518194096545736577938472828035527628923176465229393070640145365178809018733067849187814952270541749630550256615957994079654887183103510976798785535680840409779747058642514043499117019137 +67413492557347065242233762416053344604668789415978336070232719704519730695842285928289497175591340668357371303688672579355774019833840277487199698360245654983419254719431470785652320406511710713843764264258846732773932462012692405900266395961054012873582577495350462230973011642886763600990552681342023237633 +0 +3 +780 +740317960503384010933160378368 +316507402868367164525185572856543168929 +40944587918560512242849087391658885933299065666179689123736656251983650357248 +53237017879751543050172096634393803827800675748632110441734097441394601754624 +132470015928546996419857333379835247542469691948112962947775617810494227864559 +12381248203704069044821113079836417493113102715524505752538680624995272774705373241736873135446865373915002606486008774642271568665461550394720124928 +0 +7489725100210230830056017797355917611388687018068692527647069379107719450592925731141813143964045960148998275654062617196447019140695139546528776055701583 +0 +20452373571957033328421610784653187573014781479277475450110247980520397649467016471081241044022090207387138993173997495512406464502494422419429757329144085539684125779893891001040429996115472381316500865902248751448570530371710095556107777628203078382948159704011898603287476828183374436962926592 +134826985114694130484467524832106689209337578831956762230667385079098314604114856488714967534864721366751145206577896381937685648970101488283024945486839684466321300593943839555804243973666843820217508302523380061872683673515732869098988513858354359158586336115486301550288354364817320561524260650122775363584 +0 +11 +372 +144551572086744903187712442368 +253202426808241135906467029640487192367 +29680470818121163968957353650459808483467973521537669013305160691127391617024 +63848746629419255316830265708104138899454095951935912495751338301473488371712 +209179562285481528286524049750565802502654182439978651496342336317521325724342 +829324642730741957628232762455280255995410668556934354798600131375360370313925839584716822046061062812974125513273022383261764817641491685689738133504 +0 +10836405946081245422742336274313850195167725364810465218531215713913733992452962410563926301612533486724610590860754949426288686136633692982939049606026404 +15887885497553844866770022409478037710567337044667622956829665017046764846823120909657790652833375698308583354385844777461147565338510949008545557338128384 +0 +8160474863985113685413960163730584223719357599028623408776979120151702813402137032877800155396033891808446883844651711571976485904937817619793465524297057901468757849014724833218607197896257643791218077720889294851053074003636817287341102356113265918596060624586091608267779758392456426930790953644841698561311367516692847963980681340876468289861231297504400770481454056706129830004757201411809017347700323276069106007745871452840572171060736 +0 +0 +757 +684792255765091403806850154497 +187838498585952187882913144128949314842 +17880804947835988471289056186186828981571763627604504410978695443865690701825 +73844297609558392021902368753050990125982306435322133697955932525026812624897 +94126279577000071487888075124472770168590198066457285629539552899453239919702 +397557122057289471646406389446737856415741637101452044100444345939109374880449993641098520778717953204989669069789407806036305996388182260507211726849 +0 +2707983572801101648847089953010363517264777469603935668937876318086482354961489015923724138040887781936287836173917247739006658581124406484336614660459035 +7693080372738418372562538145926343985101781270464320587350012492765027537754950396945540360958485453885260344064936191173890891093385965677925002802888705 +778559862303730584584607440255252490793391466369614533225223492586012662394527783524384957495858401288387266400498759442518012862732395452853782993747936084285564333054556373460085077607372150007252189634712684068883939412024299532578569222291919966589108225297068060127971290200979371023459277602817 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +20 +595 +182776107722364003135434784767 +281466386776064 +57894277771803943810359491595023458960167522338927730828258057680034478424063 +89555305827206481420887328961785203324625996138257453019240897699860153630719 +31072229483910585358509303280765563029411398133731077240605874038996845471709 +3273390607896141870013189358366943131609359382662427080975450085374873026606564249289725539410814263596351691407518053929870103702401568479817676881919 +3351951982484124983609172268969732236347481510662869536744042230485685559782341996467619926017805728755414692283401971053259449792684445385138897718083585 +0 +13407807929942597099574024997867385471458758537929012740010782671329620832395834992528134114986407662672821420428107228756016346166874193365792884690780159 +13407807929942597099574024997867385471458758537929012740010782671329620832395834992528134114986407662672821420428107228756016346166874193365792884690780159 +13407807929942597099574024997867385471458758537929012740010782671329620832395834992528134114986407662672821420428107228756016346166874193365792884690780159 +0 +0 +691 +35346468568505532881936842731 +5910794122297344 +57858940834720867790512028732351404058270737887529960151597113430083794632683 +27987994577646976394885848050655511990655596618857190835730974489325485424619 +189349345528550113558840916863781287758481416281111632097967585676192554370339 +3273390607896141870013182589153822719463706115049672910839483679347322768167747021268146513478152778945973706436024623603772905158629315134471253524459 +5027927973686555902021074910529630935073811046690329450391073974713817483441477451426676218078007733400564805010857217050528619214139991213665936757227554 +0 +13407807929942597099574024997867385471458758537928833560431408446992776237013389516985884383362698273068238750137810819277666550973482668621461384635351019 +281563966528794539091054524955215094900633929296509267540226436097922037480312534843090816414714560916129249828990251803876343269504358060681650578506383339 +281563966528794539091054524955215094900633929296509267540226436097922037480312534843090816414714560916129249828990251803876343269504358060681650578506383339 +0 +16 +0 +1166128089190511751946393615476 +255571479192666112 +56291747675086446310277050772845769159148347468038830641684235944770968484980 +30171046655374400321248558358633494123141603303165813785349498983526118194292 +191952216559694677850253030981251311226493861529738242207409594273293055910997 +3273390607896141870012882374551932440803983696424025465309373572025468806406202958511116713364615934701710072950290988641362149742329879268357377621108 +1675975989397670037760469732976766982351910933877220375401361925712068316784901484293350661165516699901005329555649261275619258565077645558288068779181545 +0 +26815615859885194199148049995734770942917517075849908645075912980200181493966889942992355387418779976258047876705787108142786970073112315813368816870620276 +12174289600387878166413214698063586008084552752439543567929790665567295715815418173215545776407658157706921849748721363710462842319521767576139939299228384372 +12174289600387878166413214698063586008084552752439543567929790665567295715815418173215545776407658157706921849748721363710462842319521767576139939299228384372 +0 +20 +768 +0 +339617773210407217629729401159633862623 +7010406519791895781934865720833530372990739797465297891865306283193669779456 +12209728235921518710323559633526468837955820087843857124387593282079453872128 +169951871966800283810649419399139038928050251176624833301343281456431633787453 +799167622926631891612934308861836795138629576941338685100903095647779127140015260950429312778514706312501025604542433181196096945393694423654596608 +3723667608053767842867675023364612649103089456109822250875653249116275769787555601877076944892223098697379930243317445603459059303034099481845912857059652 +0 +26815615859885194199136693140688805876096363840529017362328825455840484156274161514345456537746861803711227865957219195669584452460326767114515755500044288 +16996415738478256005382065682640742151192912704409604594012987116129634408058546371285779101609491343355313613863898166638327059654603396304113335697353121717251389843622698066460540928 +16996415738478256005382065682640742151192912704409604594012987116129634408058546371285779101609491343355313613863898166638327059654603396304113335697353121717251389843622698066460540928 +0 +18 +837 +1055049663028717702603910152193 +0 +56145099392931667494602725117889809978473099780543110806328723994744381767681 +94020940359982983746102974658635634485631399798433967904585529336909218709505 +122813165867929679368114907950462646511665206961139246511547700775532269629820 +1453677448929674437119254898402693728557812421065819075020451306758949997680185293878407872152173525219742439043086557977078210366537729 +1212366891818018736612622703605109128833655236089151046090687816762735515567219375580031566019793843481784966322613342296478137028286856502402053516577749 +0 +13407807929939548517005357036703926880414038648958573042868430206064246508364035546678488116044098549923745343892353753273525546559935574983116802679111681 +4562440617622195218641171605585119131739514871918667547682857357314343535508689562160604455918497575074715174882382908134196095677901105600185199282794955018371204524886410100925712980030521345 +4562440617622195218641171605585119131739514871918667547682857357314343535508689562160604455918497575074715174882382908134196095677901105600185199282794955018371204524886410100925712980030521345 +0 +8 +576 +465758099028613903974183993344 +340199292706503106677777063217100488703 +0 +63322527565292422495135184712771504401404079317527680938906069764207697461248 +33634219328043204849947836966835886827823990925961402040502023813129318293738 +3273384364399040874614920955958929289600820575248783786959254747067900097257458270481819637251484144665389340236271253096323308912816041648439255105536 +1330293784850007390428494387229269593003967094877098901329361383107711576399124678199758357643942725207512746641251003704936924381303175630906145151786085 +0 +26802522297453609678208395193923639182831298274557295628307616531706906562408033942581487447261461746690211924285806443346587426535386688183750358252650496 +776259046150354466227894953415272126532120228827236797123305565388337686400499060284004070246335310139188795312112703394374362640691719752700909206017051198060493495608220461125520225112836119459965070690227765389768580522718527488 +776259046150354466227894953415272126532120228827236797123305565388337686400499060284004070246335310139188795312112703394374362640691719752700909206017051198060493495608220461125520225112836119459965070690227765389768580522718527488 +0 +20 +876 +178816467053815670676679294976 +260528687490744071814225196668552224255 +1692970775754977972396027533715957606705876841991018145249546038233761054720 +0 +181828467860701888405812140333208298279745113568339986475984061945003903302670 +1636682816191726232111652774583460805243935699557095064129709690597186770076614594127682973063911518410637341738923286963278231026430050646302719475712 +3045552175859305524398839349214018181219011839758787491368043134180477082575118427510368420050628050508519285324861985507713808320174592548749510991674891 +0 +26789430333357330553113882063869622691267025750963372291024681554553700868085895351207370848391420617790680534043234808601716445354096156366798348609388544 +1552518092297884921190276407777826343730130571016241164825192478707830380921635634356568453745503455149401263113730019700298099019902002012202155472213879518073654497303294521076488615535022163842239123103052036543841131161997803520 +1552518092297884921190276407777826343730130571016241164825192478707830380921635634356568453745503455149401263113730019700298099019902002012202155472213879518073654497303294521076488615535022163842239123103052036543841131161997803520 +0 +17 +205 +314141171791122356976004104193 +340199292706503125566666675774975279115 +28964696041878609460721583118083346598086669607678005131861204748455792082945 +99957388910786315412288528953468780503360427998738617462677827481821872390145 +0 +3273365633955366159313212088482024572601269794428675433404928819417293489209545301349145972651249428525225361135543177673426309845521311956629494693889 +2190371668160050365756300375697808168184891704732002727464497057741609895764023359151357865247649911895528229907788684972491076160970752924555757567389999 +0 +13355433780100006387064008929644857372863390914834597336542712946266197713041680465273314799460842675250982197484946421191657518371278691462674567665811457 +3105030262937843909524927703451704725658035213057063685463909781308268889930827638236818973565112070382840731126979240983820442568989111483626724942061970361307566813811606244576718762256490550467423465073089242630619613999057076225 +3105030262937843909524927703451704725658035213057063685463909781308268889930827638236818973565112070382840731126979240983820442568989111483626724942061970361307566813811606244576718762256490550467423465073089242630619613999057076225 +0 +11 +36 +59097216112512413701662310400 +340282365019520591560372007455816679423 +29895497284693382961837918038726436373289999003535570507137440248052571963392 +539397372001143345279173783832913095317038465503343488764756916815116894208 +43994058047115475121282498486196678252570359157229388277889413858394010898203 +0 +3274891444621295245553525375878222425626418688341503128076239321506909158791609365713742593237016516146106629422990668626267243448311183620042075794130081 +0 +608850787303864097127237682881155896480025728423916605455510274914880477289308210564971661455576995032557297687074419380448068658475227845925355707695104 +4872657005698891626244130971294875853353482202322888855972256338282628395923949326743092700819820592141121207789967023511190748555596067213433893308801964320495837037320565222597343423626118652097789780615868838966704829900803241659660193801529518775840320495759898504684544115156495368192 +43888992550349509466047490008389760228034918444740354476264789433451422494435484145605446873947256471512988292597450618642207676514741311261882165968599848430310026415377131508214755446432997138431116604680521746555008944242629428478468183278110882114932777127534190355484669739785885245968619478007676928 +0 +20 +141 +486322689729062157054589796353 +5233832698719648034352645296049093138 +27877848636933271899195252835832934260926934447655424254310367380191336988673 +95046404405893116989598089438620745282296913815862276271716035282978715205633 +10841566652186130506277177706281856862358509613184422194022722527294938334508 +156434328106533251561339638441017247952143366970355853257183610685433013344346228490597502025103483349050029645755110902306747038242560335594425155585 +0 +0 +9662133425425935480096041513586603904206372855623860335152003830393861922520465132980695412533788401921809758413865008548781612626086595943461642943070209 +10226186785978516664210805392326593786462345638665902695628517775117882756746916394520605503809745503417957883518194096545736577938472828035527628923176465229393070640145365178809018733067849187814952270541749630550256615957994079654887183103510976798785535680840409779747058642514043499117019137 +67413492557347065242233762416053344604668789415978336070232719704519730695842285928289497175591340668357371303688672579355774019833840277487199698360245654983419254719431470785652320406511710713843764264258846732773932462012692405900266395961054012873582577495350462230973011642886763600990552681342023237633 +0 +1 +813 +45071397778386282833495719937 +79223326884772855371683332096 +30064000136008847467610977278449545131856789547954749300842716042281091073 +47481800796242493701011224877673450824539887746013036166395443280909340508161 +54157550229285718465004690895357292888716023226777486213199274714961136165506 +818341408476952279648221140163715789549897935288622536894945939243943778448242598308927351092346187094151421640908013117684957061336895645328259153921 +2482049033302423024636121117027511919147101564783075942011293794333730722477081753627970658004775337881648218209979066720442151086313712570440590284651662 +0 +51146728248376854009350675334529289286007270165566930302861632246924015978522782117829380865101254993439196691732003758250424073760232713310443667457 +19958403095338122085628193786479237329997442708307584904483704091804803849695408757200216428509421792133342328792453788297992349608708721951932439381822315292254947801152823242445226929207389231565784328163754082126708473023000571426917955750604503480854336945972830926696168848653425651482625 +179769313486231590772930519069826442426264354005082326596360185112449176958549873259557850386600277367825925997915804457268344327753240407083712876794615624877762257166854166161646934596377646965522119647578649647126703396773127858133295428017635762092566594653974618708449402594449637475763618354340068065281 +0 +18 +112 +514367322948399470595574595584 +316356952598867061911922717515644469373 +7293516171214693095994040481591203674140336388851356962934636744469142044672 +32168719419553521126381348517134497442891825101604991549835256987305375694848 +17971033741324285370848719732885538533017442019292722212631856707833117719013 +843908553492555440461456712712792961310926726449234669737815334741161663581434956136120425892313305072448311249427561305380916961526632833575236403200 +1987159726477906926480106742200993388672969577973820652993709385070847538717450919815518154185973289833754703858163650459518129052975801260401038083579075 +0 +0 +39916806190676244171256387572958474900235423938365577168044454433841303463317458684539623736033909906352541410387606389752863508317732324267453159028957650595214293380229123627941993873878917982253053083577235260430657717424267222556465147677697709664344844735910306680957072990830612317208576 +359538626972463181545861038139652884852528708010164893433258891975305712994145996750811464699841724874842731010897931000393441458205293971046234853904111613343804779646728343027691647116232436982584254759296818415737834043273351893507362234301351226814369365796651940053069649153544102516262530232441150373888 +0 +10 +696 +63686986775670542563280945152 +340282366287113163957929847168792788479 +20821682061037147931036251650445879572012829156925512449007428546569783214080 +25601876446080871661169789388095460981655785026634060440120544542909439934464 +46283051732920571920660553002376350134344620740408867024246119461520606057344 +866122526761241437267861069508391876570186472078175495527865085403608259792507543050734579496604017172579797485513755153244749481961395145194250174464 +751887818320028821005993828455893384336758898230218749149055282685783130973133321426891964359199525788718707578879513764058378266511916633326134896279766 +0 +3604618761161597206342350970913574830294233311288308625456005962609440682103556011303416761181780744251205047679242944742588136174508865995314329397755904 +0 +35074662110418088637949626617730057226421936600416036348376934414485375457507498005829987619930255909681071425174751723949400452853556137093441769597080466171349184338243707744904582316746564809238360330702316984594788071319980528356364662139411447217586668974101390062027509809569485429840519136697767119848670374358890937563379457324918923934982963321305895999319544761333153673280222818219235010124705215046496087159771444404027458888031487607705599 +0 +0 +501 +566596565891779443770567688193 +297747721340733346357341714763372042239 +51359594683295705627160736875920391224771401002889258517037659597857844363265 +102373118558924839957330237483174298027903126318578007347934548864993903771649 +36691334835498136477362251073079490846730566134092461259856543443113747864664 +3255972356450126473367269507262012034771303233154406275900353518426269324152998622154947912079887019154967753855758652434103601805140721100074954784769 +1871705776278248879396484688509131256000830153477129182065775246470064636917070070521484000777436210886966790871882875760627093515239202937263621093957970 +0 +14537918423071330571316124318525036093070741242523364509933761893317940689672532870214776228434171755763504198262702582936752520446579624047220655990505473 +2231145649723506021153228184702309227849416613571515961923155876896496547807580652010734720048413104124530251069253785706943018637185107546734040714409749571116423316614742963894337402654119736587425733433625423343298072444077468715756898217058657745332650905736779877862268124403573045045696512655361 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +780 +899245128272588436190215012352 +79382824738944801807794176002 +57892510978869681736730162220291002611042557329170362915611609916721313349632 +63318549916452990938470040291368379201286383559458191806845672058759835287552 +174649700752953765434988902296252491183916410461948522823307150782111144039507 +3273390607896141870013189019906287111002076719299707330406074198757955051929170942113619750485120149822099821188584330248544763114365430245700361256960 +1675975991239013909235918173490637855139324507692685389812651662983087942796182042459207730713681429512584287523480954202975430917613169254383951955361797 +17917957937422433684459538244547554224973162370938960458267029029640947834979519339152474433150005542914 +0 +26815615859885194199148049995734770942917517075858043397979502765092926124329914532610493203135186264306101107885244098459867671853087539206018919387103232 +26815615859885194199148049995734770942917517075858043397979502765092926124329914532610493203135186264306101107885244098459867671853087539206018919387103232 +0 +0 +36 +1137039323585710672837611618304 +1667039319517840837963677696042 +57821838183101364244296111862969820726646472682625233986021710400507328069632 +55976566637351530465294054767787754721301958177994368678033697653636844224512 +193887663560237731860858557979085795918560035746611554628781897853775020813022 +3273390607896141870013175481480046286710770184432558148882590060392045299942487570569924946038576389686684431838416426295940752809870412218007625400320 +5027927973643875746059723456610435252591983579747963576265463600113040980879343903461819778081504218012049853558984265154213360147307310400101030144508015 +376277116685871107373650303135498638724436409789718169623607609622459904534569906122201963096150116401194 +0 +563127933057589078182109049910430189801267858593018911357569558066951448610928205184820357265838911550428123265590126067657221108914838323326397307129167872 +563127933057589078182109049910430189801267858593018911357569558066951448610928205184820357265838911550428123265590126067657221108914838323326397307129167872 +0 +15 +0 +147591445132561651497663725568 +72079604862961880041477111809816 +54687499690776483454845978515775404153680118608348765958709666856417080901632 +60367062534952635374606720010641822146836281167009160997706035914060475662336 +178652301000333807279700689952188731164083671132840159036419863339428204714256 +3273390607896141870012575052276265729391325363074491948316068523863947799333080042607060368834360627681011914158469885997952895805516362689834790158336 +3351951978795340075520939465953533964703821867770710256609903421209625894295852147822976953763845975898117121470212503185399920690105737901876342591329002 +16269505807179569785489260726049179236275631432812576096106462358913980634161403559950446785300205032965912 +0 +24348579200775756332826429396127172016169105504879103405365388510704376920891562395610327828446749127989939805959801641401559846042603485599065178803489734656 +24348579200775756332826429396127172016169105504879103405365388510704376920891562395610327828446749127989939805959801641401559846042603485599065178803489734656 +0 +3 +404 +0 +338702491610940821868309420475587008199 +14328023572559317685526112591674235629243509140269133282451074114125069025280 +86578464609153953273064023043464932375781820914327168919289930680154219085824 +45279483869291221953284779682805788559295893933395790607583424358602969434844 +1598335245853286496935960547857315896747917205953978724820311075231669760316560595231635274478219159108858101014665432801177715434970395175083311104 +2419407242378299627775637392372328814292846869244624971419290896315467839379870742253970126076794151625802980270332067936106109204494869156371160001888905 +22713710091930133642306470658052071301354618504883936111506036530073330776648921189746483856049805580566438785521544183006327774117888 +0 +33992831476956512010764131365281484302385825408819231901736066162392911122587750794642859557837487570646738733764326406607430768230396539092082721200286809873288301231428402460695199744 +33992831476956512010764131365281484302385825408819231901736066162392911122587750794642859557837487570646738733764326406607430768230396539092082721200286809873288301231428402460695199744 +0 +9 +380 +521589998193582783072001064960 +0 +54281131142068578829492120775689398115089911863432918901729887943966322589696 +87063228931437267679054882381527280567353791974986020151597093229234539724800 +26411440510656131983229190397498319604014001314162142030505989681964889965410 +6097168044690820186266056327949574746284769358267195096071257642746052771416966407359752215426164404883642352301456819389505193941734761955328 +2424733783642134638362581329537135439756750250119199404424017986489904138736282190413580103086576851422180352745763276505772852789790102244589421062035368 +6097165137335922326917182089439777940897312242642352964433107601843439253516971046989164458610420100536591912816578733216389239785314028879870 +0 +9124881235244390437282343211170238263479029743837341192530852050551013988199468564099149809149237792502394782872367659707645708326849200364829008985690446628655225628506036591091211274089922560 +9124881235244390437282343211170238263479029743837341192530852050551013988199468564099149809149237792502394782872367659707645708326849200364829008985690446628655225628506036591091211274089922560 +0 +18 +76 +684365645831470144534108700672 +340282230054365050593775836264159842304 +0 +15963897412190306650237099369975576841343765721507556435820338296445483352064 +132759447225495983324090510251744519265863982169783448911677742254978994593249 +3273378120901846843848851698962475229131019779252045777777029295839115754571447880452966684129870618993409677065064471065432673898932044455452686155776 +2509556964148715486845629632058434150976495148022092181360043667351572633930311684969654834869500136098220017267480404777629280818717809976634762654456925 +26187124863169041879310296789687050376151294751239194912085646467180246245385039287091804854399398837876868573183873563217432331431922121057537489895424 +0 +1552518092300708932455789906830544253064240457654474631625503351024913201337446226079742769388732571127058525201398326436194714101150988019032351961389195980792206263906993685249030935631117974530339035198582125552984050009714458624 +1552518092300708932455789906830544253064240457654474631625503351024913201337446226079742769388732571127058525201398326436194714101150988019032351961389195980792206263906993685249030935631117974530339035198582125552984050009714458624 +0 +3 +248 +212502350661610110150999277568 +131552641820690640981991613732830315020 +46852064353518235919274685523532198947963594743216103431489805826506451058688 +0 +7645097472420881927533172642225448567010395265033633905391291186112176472435 +3270168961867742817620220960232150749713460118789595424509833186804266725716461911398439168187233942133765790497556243236366961654908249264223007277056 +1319225067735212639136382308035057590059309856444213959056608122715470491794696873946870339629603616630101618120768022446070919013133368825305188791863556 +52371053055727292068337250065143561186684042431774613097615715910894227837903200691375492620062343989956747038583170958041377999304092089877801155428864 +0 +3105036184595769842380552815555652687460261142032484404408169394138177593232526559709091771925126394796328107261127062087481484183515508524562872429687439110406240134689348936276584863546005281248676694097265868804492346319133736960 +3105036184595769842380552815555652687460261142032484404408169394138177593232526559709091771925126394796328107261127062087481484183515508524562872429687439110406240134689348936276584863546005281248676694097265868804492346319133736960 +0 +12 +284 +469455506976059516207830663168 +7983013255172082095516649800004406650 +3278348336177517342236710812605326558782498594141487069958521276783524839424 +49934227818811015946301187530148750948812049358364108430512532097940534067200 +0 +3273340660038035347812612675467311420171630095312401315302288177974137674243108506349429817414905569256600781798349855567184974503808521851120146972672 +982327148533126242072022252525591418809619347163444615270839351763368878975643860701971724697659683917532263718739457150238974028247429927345334167713733 +104748299685181425020034909109462515817741155084762579290698462017633201711683603583490202643438294700869447910072736485865669638419855454497265191747582 +0 +6210060525875687819049855406903409451316070426114131520435474836896735901928651243521579858300210079569809751772692509393442960425269123499217289079803270033146012536744468900746753485654275750950451702497211174173610068660767948800 +6210060525875687819049855406903409451316070426114131520435474836896735901928651243521579858300210079569809751772692509393442960425269123499217289079803270033146012536744468900746753485654275750950451702497211174173610068660767948800 +0 +9 +856 +104786732573771294575085748224 +202208808855666172013483050871179179009 +18208247384094454656528310293180405432371044123060662434648593997496387108864 +105494033770685441277383922803075785930338167649609913078213878653210490568704 +70973503770577650219006804111060955590039707453059535237966473815460451376894 +0 +844360569033703606248598340834091269063135277987118651898622507491431258386488521835163613652641657086294536373967783421434176997645745172742040950152481 +11325931297285258457955557624614589968683841815173942490148987555849011164310979692749741711850895657264350824049096301947145237348941454577709986315503615 +0 +9745314011397783252488261942589751765359439629682498258594182172731326020846015217955153176479771037023708782206427041980054199788372006158023795063990197799705875528943477976666060127441354860040345913426334531070250301774693553668261371384134782207849454728022523237602477129993155510272 +87777985100699018932094980016779520456069836889480767605004803903623391638540464457280122746011077411993751425324753978750781979522477580196467009117071428016628499217023421730630965195213525748235513398478599337876370083082111993797578339643292113170849335330813036879783075982297998725326138636180127744 +0 +3 +780 +740317960503384010933160378368 +316507402868367164525185572856543168929 +40944587918560512242849087391658885933299065666179689123736656251983650357248 +53237017879751543050172096634393803827800675748632110441734097441394601754624 +132470015928546996419857333379835247542469691948112962947775617810494227864559 +12381248203704069044821113079836417493113102715524505752538680624995272774705373241736873135446865373915002606486008774642271568665461550394720124928 +0 +7489725100210230830056017797355917611388687018068692527647069379107719450592925731141813143964045960148998275654062617196447019140695139546528776055701583 +0 +20452373571957033328421610784653187573014781479277475450110247980520397649467016471081241044022090207387138993173997495512406464502494422419429757329144085539684125779893891001040429996115472381316500865902248751448570530371710095556107777628203078382948159704011898603287476828183374436962926592 +134826985114694130484467524832106689209337578831956762230667385079098314604114856488714967534864721366751145206577896381937685648970101488283024945486839684466321300593943839555804243973666843820217508302523380061872683673515732869098988513858354359158586336115486301550288354364817320561524260650122775363584 +0 +18 +112 +514367322948399470595574595584 +316356952598867061911922717515644469373 +7293516171214693095994040481591203674140336388851356962934636744469142044672 +32168719419553521126381348517134497442891825101604991549835256987305375694848 +17971033741324285370848719732885538533017442019292722212631856707833117719013 +843908553492555440461456712712792961310926726449234669737815334741161663581434956136120425892313305072448311249427561305380916961526632833575236403200 +1987159726477906926480106742200993388672969577973820652993709385070847538717450919815518154185973289833754703858163650459518129052975801260401038083579075 +0 +0 +39916806190676244171256387572958474900235423938365577168044454433841303463317458684539623736033909906352541410387606389752863508317732324267453159028957650595214293380229123627941993873878917982253053083577235260430657717424267222556465147677697709664344844735910306680957072990830612317208576 +359538626972463181545861038139652884852528708010164893433258891975305712994145996750811464699841724874842731010897931000393441458205293971046234853904111613343804779646728343027691647116232436982584254759296818415737834043273351893507362234301351226814369365796651940053069649153544102516262530232441150373888 +0 +9 +40 +888846870654399541026800795648 +143482146854237819476935345763042525404 +57081193366483196042719382409159372256144104676078398008505091648468224573440 +114395766977069725950433431832947109769631375895653248371844490916724740194304 +76683728808117611343679768926517760481973038840157260737743824104456148997924 +204562036559167079530065527319219679632890724123975675460457785758037047119878176949411406189670571930446333377724771404241790991901801347760290529280 +802137782523454342979007031051565319673311845595383846648820509821467014315763391764416287066988487192983357684422811427862593841641642759639983545182786 +204586912993507416037413532079109816519356519304585293253957198114703293337099790607326333051861102317300881004677310304033452329931030113527401545220 +0 +79833612381352488342512775145916950280951924920231969054243001368145998454488199709357950283314599696470744140704516663672606603760614212434767697879481924503085776089335544299108415792005484658584236033962830081560638467608223040601306884583644159167581710543549233353963456867137670558515200 +719077253944926363091722076279305769705057416020330267347594827451426144142384493965014457252965790028388273268575745766448202845714472108972056832957787126548989380860079998712572623109761917189596553766242330909605534894906264486337757228291297942005327959842043718998160370035708197081835945941328224845824 +0 +12 +508 +682119343286724555858841174016 +180785746917974735173281714194813183472 +5580224303111442529144190824250128399011214808680123220308726439587289759744 +17515932956706260988612620612193590854953640142730013998213746538449020649472 +9907659893672398453699179009332720595687058981623531639980926043720794275887 +3184888035370039058932907606064617684917571849344562184675716803601698363355196380950800709154896679240574015331206027838214015803667188966671205269504 +1939277412313910453923860576024263353915990343780420167100598244605807128360981219313745050560191239583084621187461028223430162008675508756516321033825953 +7544913367357988624324327418946969851430820484554794210102692898204924870041052270614682468020351324034119781305690108157765024705315031670841334136761032 +0 +0 +35074662110402138528271665275179256459319857320693236334209567133960895549163137483507987803016808302684056470332523040304974402229876505917218722980389688882912590974423582656638710685279885141901775655476694920569196059922042520886245076198361066013800570532010333824987228784598797064323901995346025826169147094870809135589836258762705579827219567252284956034887883311295478937617923515174929544803288635466681019026754787765599275517274090540900351 +0 +0 +260 +1150353400223286785695195070464 +232614738005118298378871055549980366307 +45914987571294562618885391000426099066127147173061261158053815643543682678784 +9569712348825214221479561079764339151873872589857025114776692020553231368192 +211318984418980660719515851833230980412973699079543743262439772344023095592422 +234544158960971249369204990932617363388429151281731167641912793995080736229449905117680762908260619808068871667768771987742765263413118331700270596096 +3261048926869246197614171688872921244377276606862369969053710013018569059589860033341776493183825115231316522373635165226613047961168692039060337222141976 +6177808343254419424305538794190808827588752291948002891198342429196741356936483631524785345634116296590873366080588084683919843713525117596040803781187142 +0 +1244991193137117952846157937025143570362432662590599290360149373303239443080491255301509550176958928885332124568019988033187164346281378990556622407311466824177344146655391099723319760271743904382662218341941576791410880342566702310623956919116180818445686624258025155723557685769130435612651017994240 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +11 +372 +21559839277448701880456708096 +5316932265549267143283400319839567616 +16282337714987120045892153486177165723161016453744476162789802658371874062336 +88537159989150876890408569427587371627685568624275408353614000822051296772096 +117153649598454680903779921606971322936867216714956963589387307178373077018966 +2451846285358576582757929577719947826359368522202829009982370031469538161149259226929244677345525601309596834316982200231651181236759995889790497062912 +3757219424385931343692363754866841943466352992489416825487678472853020775555494604110835156534238535884545156565469882173219151445924025758587329876446051 +1637494313049913248505508525988843145443777840250318553676797222770022673451141317105487157651955800518089884835975451904017985829916792949984404185120 +10058766516776922387083424546997939506014390161211981301999104219673036875504700741486695698194962976600388399803269774949866748354955056527082238634885120 +0 +10715086071862672019870723708373567867164049597134887969429342556289689092328893032953381579589338312602609246283412714238525362926688916032991604094856600340922050198587112063568778839323187143820237543594206457218073322356882436956454658807341118763364007714359232059366253413058442519879029375369216 +0 +0 +548 +452756624826422739489590870016 +111655577576534610008951406716630919936 +52448868921439032906975899518935171660069537721145902608130331363149292240896 +6606931978479281254831897832501046354906618825234252857566140055339491393536 +144389273399687404130106093584920102378421828377891285603354605032128614720536 +2387912874087980187718675679704917070297108275613437367396044575716543291206867105152070863644327560068474660815235323172050351528107196479325467574272 +3482688306166017347803243385471281549458835137781679310740694623583921742064189215873681869954494749194897826789578092866925457557981431075429025110142766 +34387380574048178218615679045765706054319334645256689627212741678170476142473967659215230310691071810879887581555484489984377702428252651949672487887520 +23524785833119010734715565516813333025879573854445303556124669257483291515289313842947157240147918658465448640671956584728128012482443412626594575622864896 +0 +225016807509116112417285197875844925210445041539832647358016193682083470938906753692021013171376104564654794171951666999009032621460467236692823685991988607159363054170329353334944355625786930020224988415478335601579539769494531176085547834954163494030644162001543873246691321674227292917459616882753536 +0 +13 +0 +561575095917728642643722764288 +63821360225596077614082986369572434958 +20871267450490110775349857218815741788300741818091418479909066205998432124928 +32031339597730053368408931380419192214478581749743918680291072536952960974848 +78578636492035187050572077718135746998684508179115744547225899703648410312403 +370813736211065535231062726945202826990026850884684216063072714490283444143902782007113348673056265481923913676784506940297294856753087911972659265536 +2620071154003612760581214322788037964725604937167931635387043904448806788414974868124012072732534985166121320391570652048401642048690823355593944068875722 +1486844836249321229643001741597869576062950278947289246738531878275180587493636315931782339147975866870425615431065710328848331133564447998585839000088960 +16050604872479499761412490124306950869110460588744266902155691331522600686097332182352004895063052889078290340385962178123999076249427996544240088860590080 +0 +9729298153251306194042617127203199623384957034198478276241843041111037695834634873921670474267119187843169195625338744528581029537433535757956376518129793109557221580317097753720451186105453926588775689583539463154010576700049252756460830197065735837134519004638182709904558099057065808050158672835248128 +0 +11 +500 +0 +303146897509458239699003654989925023487 +32736756639827299933225685485072629321729229567663511068893875767449657278464 +108940097746668219126218354657538950829059055375326097462906774176671100567552 +105141957406996918481926167015587865122928475911973508855892157417175502573997 +2455149808749324871737694767528984736302289775261104798859058407114388639278815192018708121934602436285743845105491713074908633063448335548472405000192 +4562499427405661443491300822283693488291153790729079292153765540644759467686485522209256976888988737125973966009916644323573026335699548740771640065918781 +11974395290736899579322825765453901754951747606481982721750002227664784996135932884515664533409327198618661731940390586307041084433465121132950282273424559 +10582878391618641992149234773030997029303083829182787525505648743266561935310197607787383974646115897854100240644934138582092413692188764048451304742191104 +0 +13582985265193575509847153720290630277475301176695966793104558898916525902171099726111653252346386417687634059875171486934990855171785554727726817192028731914702681172768151028934363876033198780003232825417916826555570603003610443324900765322801514628836373961563717819815659178099324514051673737887522648522145975473923735339139072 +0 +12 +740 +1105766944361955339797897674752 +0 +40666663073457098908560285583894926858884570977736712496628899075489882177536 +6937574406821791937994980945260712046755937992433195708087316793731338731520 +80322259934434364526645140508220590735304755095944269027477694810351667453580 +823941825448211091053403141520018121212799809786471885049437482634825107662178709702891406359238800860434148555858011304517982766915436234049188790272 +1429667404699267204948871302671076616887599344321904849215552824418556681505872488697278049467681761406353434390315540634737585531078670948788251814191550 +11625439539104520658533890711797855194868386980241970994181859680105840264577003778987586821796875152410687590090669235843895015251319782115307313685324767 +4012611011364738290027830363884880786616340613311963081947244935301921679145302776974417725708110952074146887700764495196805422393345600132552727271047168 +0 +3646154850295010964902624396817474390399390616036693719739415376725561063085178919082942505698777176089060633115597677023110409583667009527018497076154392047301826729011247840192495744913649306569979494349478121435366144715292958165239232610420731738086890347478323006048396719686780691510330825043607290550999833104265740262684222585569280 +0 +17 +148 +450240345242768217289160392704 +3323100413057427899902215874225930112 +0 +32128284792822784994903339199193643879812144651157443822976047334286323351552 +21399706425311438129470274645609834512526586881469866045657503407040080328762 +159433945212719143010790645441202787170674053048920862244647201067119362630573280745854349563469472787838188810917861838889021573237764523468984942592 +2613373875808771403998672140838135919995120994584909205876832476647953072519054679140019492621878245598201737849936937907935929346666864089763133225143876 +12559952028652149332649304876493520745078520101115730204663594383913123396138444109637941720895076538473855709838631312376520291329776343398099754614544377 +8017856871157406767405434525273062325252187193195991171406074702436922609351041617384360871147372313079815808387436833569595297983737028164810164383252480 +0 +620361101309323186180458062143306311203234091808422651940994483172973212453462540277947848500764537416293185308049243121091077089522237714087216426627812178598932718744797175293795424927554129248204812001597295596246882084347634304130710520242400817201806901439842621734294451519310289297352148130231477204202016235965703658712648032709044435339313088432114418262153009154752512 +0 +11 +244 +487467278610825971461915672576 +37219007724616326815534795495032483070 +54261526529889546426837093235106983177444977555403308095742429498729088155648 +0 +107016117482346548945132799722790195082654004276904907765013628055123622641280 +532756921246156839774884522958957381993726902395061115447006962643864665611333830690037070998783636394390002400377153551361959604547283639352680251392 +648914867617031739979557694643818049979203668057216504375276139438794885369435464053038064827480502814067006804498359154626423603962100263088399856229752 +5364093535730936147463541649596432444678219926077667883734454151057107749354453510341798218396870848298991695001682180874640712029651920116811669171520874 +1991156344814561149591525479707443429666289210206171383484367556587262040991283414287056032203739853332216309866181308381599630640701720000238883574906880 +0 +1240722202616389513973922768685786106091078788555724681396110088894901580356174059693107801547999717844793849118253907517164294570375212313898259715085141105940658891307423763778538377665051892100124228941562467259128201610076266056373405707086736336167605239314782881108716366473706926696989024480092947548903006603393526774842227227605392632574744471346260936099413707173396480 +0 +2 +792 +908463780656071624777999056896 +261515365625536058211954562321762025570 +34363418467612574510754913120306634286074855670046492773113408281091304849408 +10298831750975224705374170392070256950455108341101642844973509149630901780480 +0 +2574028491173218120625899532721726274186853463121682997388228482942119986058323148061481093086189118448821055880517089549298918525641370835815728414720 +4120102032912485584810225493556057268029400391693494480932846592203494031076348985539608962819052881655035473708663582142166452080933667740632631826057007 +856003575715523076496369484540354031854736721527329146406504552401922587486406713440294096206322908227412081709722944295562761974115865043527354259339729 +21764966850770680808129698311404458926940461873933266305652877546331848854154464975008335516009248494361468975669230614809453688953293987972822568271872000 +0 +2481439672835455316435450222961490952467054688477443973252759241836914049418059193066289201770080478782010589768308256548437208615056252516149995383823877308087652590010038324508787501850632011084265376115191445269164718609708653219057772287156297315205415965661016801043979428655461218374679406517792258741473669803979329510535342890018189384338466515427440201885258439091814400 +0 +5 +520 +604099872677461461719763124224 +319016032279817633173454602139076657167 +25937207995432447928130425230903848811380238160577523896265360534027632640000 +28845060685139153243157308053688441659186794603444860805606738986483991969792 +153301215783503611051396286471481032939260048039658940814506725148996787175097 +0 +3149305835778308075879605336418583050818943987437860348514400116385895791740711322789057830278628831079477475379487412794197710343939864774337162678064305 +3659421921346067805224249323884195392692805978261828687014108315869866733026982892516385418585908368056386669445315625696706939840887495172401263957634672 +20207055997465600258590823136326869317265887543207831056737256668785160996102476475846643074001715697259463093105530757445235263029351945691975506286608384 +0 +35074662110434034853557842365135370752418744845644232722536724705537763948482350096800897815346751615649214933728622564185847196492435060706089044924648133026630781093917108095545664072447733261889308217617387286462129653489067160073127037621299577013488448084508231783465815261392679840044175715075506479855049458960417568692240224459402814116944692003822183536118940032489278563958573604110859792014017609258239480765944544557609136035015279952003072 +0 +11 +372 +144551572086744903187712442368 +253202426808241135906467029640487192367 +29680470818121163968957353650459808483467973521537669013305160691127391617024 +63848746629419255316830265708104138899454095951935912495751338301473488371712 +209179562285481528286524049750565802502654182439978651496342336317521325724342 +829324642730741957628232762455280255995410668556934354798600131375360370313925839584716822046061062812974125513273022383261764817641491685689738133504 +0 +10836405946081245422742336274313850195167725364810465218531215713913733992452962410563926301612533486724610590860754949426288686136633692982939049606026404 +15887885497553844866770022409478037710567337044667622956829665017046764846823120909657790652833375698308583354385844777461147565338510949008545557338128384 +0 +8160474863985113685413960163730584223719357599028623408776979120151702813402137032877800155396033891808446883844651711571976485904937817619793465524297057901468757849014724833218607197896257643791218077720889294851053074003636817287341102356113265918596060624586091608267779758392456426930790953644841698561311367516692847963980681340876468289861231297504400770481454056706129830004757201411809017347700323276069106007745871452840572171060736 +0 +10 +696 +63686986775670542563280945152 +340282366287113163957929847168792788479 +20821682061037147931036251650445879572012829156925512449007428546569783214080 +25601876446080871661169789388095460981655785026634060440120544542909439934464 +46283051732920571920660553002376350134344620740408867024246119461520606057344 +866122526761241437267861069508391876570186472078175495527865085403608259792507543050734579496604017172579797485513755153244749481961395145194250174464 +751887818320028821005993828455893384336758898230218749149055282685783130973133321426891964359199525788718707578879513764058378266511916633326134896279766 +0 +3604618761161597206342350970913574830294233311288308625456005962609440682103556011303416761181780744251205047679242944742588136174508865995314329397755904 +0 +35074662110418088637949626617730057226421936600416036348376934414485375457507498005829987619930255909681071425174751723949400452853556137093441769597080466171349184338243707744904582316746564809238360330702316984594788071319980528356364662139411447217586668974101390062027509809569485429840519136697767119848670374358890937563379457324918923934982963321305895999319544761333153673280222818219235010124705215046496087159771444404027458888031487607705599 +0 +12 +508 +682119343286724555858841174016 +180785746917974735173281714194813183472 +5580224303111442529144190824250128399011214808680123220308726439587289759744 +17515932956706260988612620612193590854953640142730013998213746538449020649472 +9907659893672398453699179009332720595687058981623531639980926043720794275887 +3184888035370039058932907606064617684917571849344562184675716803601698363355196380950800709154896679240574015331206027838214015803667188966671205269504 +1939277412313910453923860576024263353915990343780420167100598244605807128360981219313745050560191239583084621187461028223430162008675508756516321033825953 +7544913367357988624324327418946969851430820484554794210102692898204924870041052270614682468020351324034119781305690108157765024705315031670841334136761032 +0 +0 +35074662110402138528271665275179256459319857320693236334209567133960895549163137483507987803016808302684056470332523040304974402229876505917218722980389688882912590974423582656638710685279885141901775655476694920569196059922042520886245076198361066013800570532010333824987228784598797064323901995346025826169147094870809135589836258762705579827219567252284956034887883311295478937617923515174929544803288635466681019026754787765599275517274090540900351 +0 +16 +368 +834152975168131183109883297792 +2731153852327718723642764315351640056 +16739345702318154238468390120664842988923487568550402381597989018513369464832 +26192847372642984316493130988730774078076196015632139922330970610388567064576 +104723168010174221329114934225821991910793576870554554426099931685475302321381 +653922625519279168710728508282959717574466941571571942643038627955030290090421817577902989875684705528942667503338750102009083326094076109973771780096 +186190712750209308613922069017064352951759692473158908687555524327905273430597973826862816449453775210658767117383914522170327568071347324740763469658896 +8514554361885317577690191823659571610507469059802094070771568440358941323502767221956336550299182555302795202787986875783648471851574051008502057414069492 +11833661586052332638708107440826226981195435085476685424422655780400433674433173003695842384585033186629182554430905981693347634778306555757794509457457152 +0 +35074662110434038747397340153515397959083397646635472623346269044001699659166492053837664748628512113832781775758233367100322901717652040469021952229078800851746673632207665259952100994382714318608499234127623361556318825050908217829532854192232468821284169836658542344679746921635369271191749836604148403822116788109294291805412513613991164094354391878717457753446781292365337428058331236571214709561469663140595145329285885214502847991934657427931135 +0 +0 +124 +645776086430913674123709251584 +159512843152379287437155296564366721151 +37666767247444293394418691343023257558894789271851834370123820338381311705088 +80875413624778233697934918483499353310630131199204877857291824167164015804416 +8629254921654409097470166752178700453582150003113870357684330220966921426411 +2904466608754129848706649256486733305790060880925161433940664496153952298197563316148752865089704089457726747125749981121845234247076084305222904578048 +1519636082375093377009006113600844217813181186233326309253633670185518917147244780749625773892695777404234520414310928477021665313548887544553248312197793 +8236195114918708792553106022372502777707407609963091055128846764757013023089399340055634197487570935890166639564669252984893194439683590472008916671435989 +14509393776357103763423267386297242187260543661154981367335031195064380877173387136138957262037470360482300982321646561928409250601513458954265358443216896 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +303 +1157847834746177602004396802047 +339617671798359351079692875821060456446 +57867775067306645753843239588701162944294645608219998114893217643713234206719 +26369455828243150957066923597651481411694301395220676885210503666274163228671 +11817720390503827648781894443752171196964219125141796458180108788425643579396 +7804371375807015860240250407429415282553584425143433436919818048882206801446222314107580658597196283229772192970700820967091727381696957189718015 +941081632068259047813718693871170463934954812652267338340003979702879896717377687462914527089361639645292415086148993612559161291073345891219533759743345 +13407795142668967188561258511782701242040321017549139392778624385515507058390936234830335193232662892196414947249258255251754028773259240421675666352640010 +18030219496951436955703469321804144806589781292361309272091751131804808417784938468039344100394760314581363716192040882359255669821551713959394630176866303 +20764409093138106714694669222174000783080657450980639056024872831998438690744740872244449057340558976478438798965361453061982147397763104606367603575189606869434278459569124428885756214636676791959099839519692515219337740131125546138808227180751694999895383762073154332479036368513723304712662417407 +0 +0 +0 +7 +229443170195852266665106472939 +326323769346777103406058243606905356266 +57302384040277608603670736599583187724940326542667573170935472667337666068459 +90590215444683886737468380513972670188957748728496883947338607689822992596971 +16588391383794291139492557302647827206669629364357230644404399985567914899541 +163891798891947333065045258556017720933625272928012102175316179026526342830370668596259193830541121947825216052384717240308926275015636100984078315 +4678930352245731830140813477948099889967135524798399300239972912494574922144691942630433785423691531675030624592070979309607042551255641744629228495565384 +13407539397196368968305928790089016653671570609951672448135458669233231578292961080874356758157767482668285483672278785166507680900960181539331299589837030 +3215987397587457281700155817600247737540168077574887142213735056600011032864904372279321264397358905923222529639441151106221660309360444263022362294747115 +436052590955900241008588053665654016444693806470593420176522329471967212505639558317133430204151738506047214778272590514301625095353025196733719675078981744258119847650951613006600880507370212631141096629913542819606092542753636468914972770795785594997803059003536240982059763738788189398965910765547 +0 +0 +0 +0 +443488317747981344772787797108 +77021562540042882543736912340894874738 +32227291991539810993520229032200986746576275985417526906409482965081219136628 +90295509201033475928510352277060489802362767446802083703915909927316798569588 +77638221005315388787307758184174122082878241502208415068156089607436757773918 +7086369209232770401098147369945909076558654658030237560723194788385043775713169861209683238006254225172633151217396345438119288462580837128263957620 +4782294357738321615826518443171082886036061084269642536684046318902415683538782049212941629293505381904644369995691924320760708675564364862074754654096757 +13396197085486637899982055632974105159517490033004013453211059152114314035947763002926713162586156070095743774033239286885832152764496920107358633659524867 +13913628701936294298439646799953209203835997190662346291813340972081107507476264087323589245978744413156578492374221121684868367585557359458783374461631604 +8138997384706728877072035945360424843873187368355532293441241975164893238867331679044578164475889238039813183177135485141754426910479982949590179951415562696524274642701652917859487803566915383278625110689674346601085345682179558937583211472781420296541000741603192074524711609552018240800068099636340 +0 +0 +0 +356 +0 +159497014274388579608780698593857114352 +107785315756833360443652745599246659761450128680158928423717212164001366016 +8707697307478053793157872089996555339211642752348089356505163635680694239232 +117438470015262408821519431736839939113907975050128689419137692043750973261407 +2221209391926212534974417566134914959972451519200164319238141998788375520151939771003428560858041773117069334356919987508503730468005507757378633728 +2622195879240643840430956614410100176111727871855021220330072279789821003236833457966150025063799142237083045026927065925049487875866674616289389230367401 +10838798868213081376093889742061103552907660140058537670650158514072587789313088268351190762885376907745601175335770832945166703110256088823029782185916220 +18496502392531382272454270596836064792028917016576313981708381711553340991353189878658648246899858104559267375534283098234252896441286568201405948139405312 +8023149053251434330424390239980489075400259799640003038245956978737225036782755130046389361466959635606250835455657093887634358047146742300058148458943937296682605801163384099346471767498054974948940568984229726746253562492021189947972342847243200153751700399237590637919220716300341227271998607982592 +0 +0 +0 +881 +82111759186571175044015194113 +0 +28976293586122847380028336844772629234948658991570145015189074743489934131201 +72183022301677682291580123397013999783183881280283071356191234547195098169345 +2406637046295717734201709310168745488608959709590841627534368777523827570155 +3270192376506343102611379566519773667881704351629044304231346291458365652232113923427745246534084152592966234784884272774908997999646616577428097597441 +2215358573235998131874848884702814898312700633459869320330807378394889665966339455958575987405219519810470844163424203838448880979342258184452542694566999 +11572673791131936765291373228428070441513344356977752630227033953477527214083770832877643183241668103444587247814952464182468268813420651873183304946511860 +24753412486464952127871838303672650263739621747289578351238067167728759524343749186993890880512639565343382059853348185532476853433055754161685198366834689 +10715075847328263987810529469149461320386431997019495731790863105054566969900033555506363209309697962458956036917241364630652892035661693225326421884469385462600854566136062395614311464777955889879559949117718229449226545818148296831892519665180916040043014060359216829885348018201091171951617402470401 +0 +0 +0 +40 +43745959819122117852054683648 +168479607903394759962667067146355343357 +0 +38715528233353617672333399869957801244330607838176871550029916258713271795712 +176969206917672212723902333860838760994531076051623743859174420245776832201772 +817958506506309444344089149754156868721831281527900674165814694260381207165130129275912203117045009595571041339148072007269936892193254382249592225792 +2495012392157735608513384785636121563536148297029125165554961898046274459648386947163697616808537824603964419169205882992327425601924558527830506385578472 +12578080335425898937631034914453481580403735226890616361473931872760592191355069944068852702365841074365524729550127783372599268817147362827445181721803028 +4414537338963156055930766392922676968349794825277298431003769994668621271197649418638348577968549041479152488344038511751351114279431399223340286968070144 +3810222062618068365811717150182972227866160775529219066268690269078204923607636500488737226639216135781691347449728957827779459090610135784916509209491391739525780725489429856708513412863019815772987039494965127359929026869978738901475381609951397576604571746823630328801160385531009949957361678417920 +0 +0 +0 +704 +909145740350063529575317504000 +339617676839812128055403992765682035710 +14413099430244372787741726071480578266606634696124905686464507820541353132032 +0 +146524398017507879126999928537531295106484509790504566263346294215577739873005 +3254975840579470187367063835491635394057759998624067184757863431671954891319873665317138530989747197877058152019092707613957271443147158112429244678144 +3843711574626452538685381156156840092205919446460373936017331874304198217565605768350118518588418750150969106731407527286192635659176975773727687264432087 +4205957252106146285324136572167758103773911995097166007755650365293107620480255479665969264400061595898062331701334890614260926224653154131473051276770435 +8408484607981740863725931685258026020089701582650612125407183571331861026600781248142155638797478057210678107527105854861551567600339635902678924701728768 +7247432637346354371163106580695035004917324395155467725275783809664161137077212420767747102195383275127295776660124857944728848308128852665484048296413410766845286744067292360940573825374902097450095259142985756793464941933627257907444867237270935916576555993785848630242076423028942395099630612250624 +0 +0 +0 +257 +298786413494195337926333693953 +337290227426691062405101930191574138860 +1721557327184276218905921841580400523329018723867073430309901742933509406721 +43140760179084762019079083403357933038043634800552651991719281264271550316545 +0 +1722565222021586222240835395091318715753470054907533129614806861693763466404200515482815025582326808788762316564603538107574831856655144128570072236033 +2234952031666178846254667297858171395150952361837877098087851428105640476175757319358218484222203579051989090125885331901125929168491732957000222166220648 +1518988687987889548258752669937919719163485722572881415548098968240657129317428928409749883901857358027538087530548460431243184110285208539870701198734266 +7561054567803749177499530087746897215634212883033990021094138935566693847154583699959527092384199840443587272455015656435728392875020886765971239530921985 +2731552852909560361740271235103848633585430399772966278368610671996079656149041832681481179874533365237667879503570748309035396591549050138743255246745020083145958259577107779208560547563441300194243546659169188197945241464932070395298656044644609029877051203642896482946894197008303189122778822344705 +0 +0 +0 +116 +805503763346205994314608148480 +340183520577929235344824363378070683647 +50883512962844550181662585462065381386388661208506498472907426814607210053632 +45369850654893983160918274674785697866505559719989912454419447783027986399232 +154302323811821750963079572939589834113268452193107213579317085474668962267832 +0 +4429069692833256013828033293417215715515853411462216173559663486555105143091358435961898114179716869586726330539677802025756405286834909255857771319348908 +3413964447864496376412885553514780382856915468175834848210969401153418011678718897157435214753452394983129758958670494207724335130333416367673732227946338 +16964157088706179080247287469821598064768337533310042213494946742295692399965660890951897881516503810954503600149541042117195593349934525801018052923359232 +6219124707082025502769567924616693739587312435415643801252808044792830067505770684521209436169838390705513344865384140441996828911506822132071414925409408028130637631320031048854647327652038853841213412686318991744226884295456904299892342457948750792019916788977941916623229379610287222408835093233664 +0 +0 +0 +757 +684792255765091403806850154497 +187838498585952187882913144128949314842 +17880804947835988471289056186186828981571763627604504410978695443865690701825 +73844297609558392021902368753050990125982306435322133697955932525026812624897 +94126279577000071487888075124472770168590198066457285629539552899453239919702 +397557122057289471646406389446737856415741637101452044100444345939109374880449993641098520778717953204989669069789407806036305996388182260507211726849 +0 +2707983572801101648847089953010363517264777469603935668937876318086482354961489015923724138040887781936287836173917247739006658581124406484336614660459035 +7693080372738418372562538145926343985101781270464320587350012492765027537754950396945540360958485453885260344064936191173890891093385965677925002802888705 +778559862303730584584607440255252490793391466369614533225223492586012662394527783524384957495858401288387266400498759442518012862732395452853782993747936084285564333054556373460085077607372150007252189634712684068883939412024299532578569222291919966589108225297068060127971290200979371023459277602817 +0 +0 +0 +501 +566596565891779443770567688193 +297747721340733346357341714763372042239 +51359594683295705627160736875920391224771401002889258517037659597857844363265 +102373118558924839957330237483174298027903126318578007347934548864993903771649 +36691334835498136477362251073079490846730566134092461259856543443113747864664 +3255972356450126473367269507262012034771303233154406275900353518426269324152998622154947912079887019154967753855758652434103601805140721100074954784769 +1871705776278248879396484688509131256000830153477129182065775246470064636917070070521484000777436210886966790871882875760627093515239202937263621093957970 +0 +14537918423071330571316124318525036093070741242523364509933761893317940689672532870214776228434171755763504198262702582936752520446579624047220655990505473 +2231145649723506021153228184702309227849416613571515961923155876896496547807580652010734720048413104124530251069253785706943018637185107546734040714409749571116423316614742963894337402654119736587425733433625423343298072444077468715756898217058657745332650905736779877862268124403573045045696512655361 +0 +0 +0 +260 +1150353400223286785695195070464 +232614738005118298378871055549980366307 +45914987571294562618885391000426099066127147173061261158053815643543682678784 +9569712348825214221479561079764339151873872589857025114776692020553231368192 +211318984418980660719515851833230980412973699079543743262439772344023095592422 +234544158960971249369204990932617363388429151281731167641912793995080736229449905117680762908260619808068871667768771987742765263413118331700270596096 +3261048926869246197614171688872921244377276606862369969053710013018569059589860033341776493183825115231316522373635165226613047961168692039060337222141976 +6177808343254419424305538794190808827588752291948002891198342429196741356936483631524785345634116296590873366080588084683919843713525117596040803781187142 +0 +1244991193137117952846157937025143570362432662590599290360149373303239443080491255301509550176958928885332124568019988033187164346281378990556622407311466824177344146655391099723319760271743904382662218341941576791410880342566702310623956919116180818445686624258025155723557685769130435612651017994240 +0 +0 +0 +124 +645776086430913674123709251584 +159512843152379287437155296564366721151 +37666767247444293394418691343023257558894789271851834370123820338381311705088 +80875413624778233697934918483499353310630131199204877857291824167164015804416 +8629254921654409097470166752178700453582150003113870357684330220966921426411 +2904466608754129848706649256486733305790060880925161433940664496153952298197563316148752865089704089457726747125749981121845234247076084305222904578048 +1519636082375093377009006113600844217813181186233326309253633670185518917147244780749625773892695777404234520414310928477021665313548887544553248312197793 +8236195114918708792553106022372502777707407609963091055128846764757013023089399340055634197487570935890166639564669252984893194439683590472008916671435989 +14509393776357103763423267386297242187260543661154981367335031195064380877173387136138957262037470360482300982321646561928409250601513458954265358443216896 +0 +0 +0 +0 +101 +207168185181127192104916746241 +6668390089268912624007510659545825281 +7392501221610052037831838960183063187938375774631636401628501937882774110209 +38026175163071874838805499329493802282417735205548075568597458066193409638401 +27115525541627581254244701722304401192786928921452957799270526453608608017866 +78987678596506322875930617159547621292696460537660610821634608467472622976648818522866145789310763062187654478521495420694971228490978312743324483585 +4053875392434894222602240814071875993431182939882351675772072986442918242597468387233771257670847063960183350051500946180997166333232802487389361981648970 +850525959840592625281286805594153401834851520276436404150377105009802771490702947106459729853684800259058796419640436047592545322828029446280706426269812 +24822032730919654179630912014483181694785612618577272870052909691681757080115622405795650637501816464411130630991049613540142767661070926162190722618359809 +5980147341549944839171394575473711669305217586234872794681557732495920877555939181217702261799375726098506547210273244879426757432133511899699597944613836454358060166562881498108768497035056190526685259548739450204860349461542132307353618525041387175591587130200688094247732159967740384726635113349121 +0 diff --git a/evm/src/generation/prover_input.rs b/evm/src/generation/prover_input.rs index ea834164..28380f7e 100644 --- a/evm/src/generation/prover_input.rs +++ b/evm/src/generation/prover_input.rs @@ -3,6 +3,7 @@ use std::str::FromStr; use anyhow::{bail, Error}; use ethereum_types::{BigEndianHash, H256, U256, U512}; +use itertools::Itertools; use plonky2::field::types::Field; use crate::extension_tower::{FieldExt, Fp12, BLS381, BN254}; @@ -11,7 +12,9 @@ use crate::generation::prover_input::EvmField::{ }; use crate::generation::prover_input::FieldOp::{Inverse, Sqrt}; use crate::generation::state::GenerationState; +use crate::memory::segments::Segment; use crate::memory::segments::Segment::BnPairing; +use crate::util::{biguint_to_mem_vec, mem_vec_to_biguint}; use crate::witness::util::{kernel_peek, stack_peek}; /// Prover input function represented as a scoped function name. @@ -35,6 +38,7 @@ impl GenerationState { "mpt" => self.run_mpt(), "rlp" => self.run_rlp(), "account_code" => self.run_account_code(input_fn), + "bignum_modmul" => self.run_bignum_modmul(), _ => panic!("Unrecognized prover input function."), } } @@ -140,6 +144,69 @@ impl GenerationState { _ => panic!("Invalid prover input function."), } } + + // Bignum modular multiplication. + // On the first call, calculates the remainder and quotient of the given inputs. + // These are stored, as limbs, in self.bignum_modmul_result_limbs. + // Subsequent calls return one limb at a time, in order (first remainder and then quotient). + fn run_bignum_modmul(&mut self) -> U256 { + if self.bignum_modmul_result_limbs.is_empty() { + let len = stack_peek(self, 1) + .expect("Stack does not have enough items") + .try_into() + .unwrap(); + let a_start_loc = stack_peek(self, 2) + .expect("Stack does not have enough items") + .try_into() + .unwrap(); + let b_start_loc = stack_peek(self, 3) + .expect("Stack does not have enough items") + .try_into() + .unwrap(); + let m_start_loc = stack_peek(self, 4) + .expect("Stack does not have enough items") + .try_into() + .unwrap(); + + let (remainder, quotient) = + self.bignum_modmul(len, a_start_loc, b_start_loc, m_start_loc); + + self.bignum_modmul_result_limbs = remainder + .iter() + .cloned() + .pad_using(len, |_| 0.into()) + .chain(quotient.iter().cloned().pad_using(2 * len, |_| 0.into())) + .collect(); + self.bignum_modmul_result_limbs.reverse(); + } + + self.bignum_modmul_result_limbs.pop().unwrap() + } + + fn bignum_modmul( + &mut self, + len: usize, + a_start_loc: usize, + b_start_loc: usize, + m_start_loc: usize, + ) -> (Vec, Vec) { + let a = &self.memory.contexts[0].segments[Segment::KernelGeneral as usize].content + [a_start_loc..a_start_loc + len]; + let b = &self.memory.contexts[0].segments[Segment::KernelGeneral as usize].content + [b_start_loc..b_start_loc + len]; + let m = &self.memory.contexts[0].segments[Segment::KernelGeneral as usize].content + [m_start_loc..m_start_loc + len]; + + let a_biguint = mem_vec_to_biguint(a); + let b_biguint = mem_vec_to_biguint(b); + let m_biguint = mem_vec_to_biguint(m); + + let prod = a_biguint * b_biguint; + let quo = &prod / &m_biguint; + let rem = prod - m_biguint * &quo; + + (biguint_to_mem_vec(rem), biguint_to_mem_vec(quo)) + } } enum EvmField { diff --git a/evm/src/generation/state.rs b/evm/src/generation/state.rs index 26a0ac81..49c11611 100644 --- a/evm/src/generation/state.rs +++ b/evm/src/generation/state.rs @@ -39,6 +39,11 @@ pub(crate) struct GenerationState { /// useful to see the actual addresses for debugging. Here we store the mapping for all known /// addresses. pub(crate) state_key_to_address: HashMap, + + /// Prover inputs containing the result of a MODMUL operation, in little-endian order (so that + /// inputs are obtained in big-endian order via `pop()`). Contains both the remainder and the + /// quotient, in that order. + pub(crate) bignum_modmul_result_limbs: Vec, } impl GenerationState { @@ -54,6 +59,7 @@ impl GenerationState { log::debug!("Input contract_code: {:?}", &inputs.contract_code); let mpt_prover_inputs = all_mpt_prover_inputs_reversed(&inputs.tries); let rlp_prover_inputs = all_rlp_prover_inputs_reversed(&inputs.signed_txns); + let bignum_modmul_result_limbs = Vec::new(); Self { inputs, @@ -64,6 +70,7 @@ impl GenerationState { mpt_prover_inputs, rlp_prover_inputs, state_key_to_address: HashMap::new(), + bignum_modmul_result_limbs, } } diff --git a/evm/src/util.rs b/evm/src/util.rs index fba97372..3ad88778 100644 --- a/evm/src/util.rs +++ b/evm/src/util.rs @@ -145,11 +145,11 @@ pub(crate) fn biguint_to_u256(x: BigUint) -> U256 { U256::from_little_endian(&bytes) } -#[cfg(test)] -pub(crate) fn le_limbs_to_biguint(x: &[u128]) -> BigUint { +pub(crate) fn mem_vec_to_biguint(x: &[U256]) -> BigUint { BigUint::from_slice( &x.iter() - .flat_map(|&a| { + .map(|&n| n.try_into().unwrap()) + .flat_map(|a: u128| { [ (a % (1 << 32)) as u32, ((a >> 32) % (1 << 32)) as u32, @@ -161,28 +161,15 @@ pub(crate) fn le_limbs_to_biguint(x: &[u128]) -> BigUint { ) } -#[cfg(test)] -pub(crate) fn mem_vec_to_biguint(x: &[U256]) -> BigUint { - le_limbs_to_biguint(&x.iter().map(|&n| n.try_into().unwrap()).collect_vec()) -} - -#[cfg(test)] -pub(crate) fn biguint_to_le_limbs(x: BigUint) -> Vec { - let mut digits = x.to_u32_digits(); - - // Pad to a multiple of 4. - digits.resize((digits.len() + 3) / 4 * 4, 0); - - digits - .chunks(4) - .map(|c| (c[3] as u128) << 96 | (c[2] as u128) << 64 | (c[1] as u128) << 32 | c[0] as u128) - .collect() -} - -#[cfg(test)] pub(crate) fn biguint_to_mem_vec(x: BigUint) -> Vec { - biguint_to_le_limbs(x) - .into_iter() - .map(|n| n.into()) - .collect() + let num_limbs = ((x.bits() + 127) / 128) as usize; + + let mut digits = x.iter_u64_digits(); + + let mut mem_vec = Vec::with_capacity(num_limbs); + while let Some(lo) = digits.next() { + let hi = digits.next().unwrap_or(0); + mem_vec.push(U256::from(lo as u128 | (hi as u128) << 64)); + } + mem_vec } diff --git a/evm/src/witness/transition.rs b/evm/src/witness/transition.rs index be6aba94..65b7ddcf 100644 --- a/evm/src/witness/transition.rs +++ b/evm/src/witness/transition.rs @@ -309,10 +309,11 @@ pub(crate) fn transition(state: &mut GenerationState) -> anyhow::Re if state.registers.is_kernel { let offset_name = KERNEL.offset_name(state.registers.program_counter); bail!( - "{:?} in kernel at pc={}, stack={:?}", + "{:?} in kernel at pc={}, stack={:?}, memory={:?}", e, offset_name, - state.stack() + state.stack(), + state.memory.contexts[0].segments[Segment::KernelGeneral as usize].content, ); } state.rollback(checkpoint);