From aa90f6ed7bfae06bdf6990816d154bbd24993689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Rodr=C3=ADguez?= Date: Wed, 13 Mar 2024 18:05:29 +0100 Subject: [PATCH] chore: Pull noir (#5193) --- noir/noir-repo/.aztec-sync-commit | 2 +- noir/noir-repo/.gitrepo | 4 +- .../src/brillig/brillig_gen/brillig_block.rs | 208 +++++++------- .../brillig_gen/brillig_block_variables.rs | 19 +- .../src/brillig/brillig_gen/brillig_fn.rs | 14 +- .../brillig/brillig_gen/brillig_slice_ops.rs | 88 ++++-- .../noirc_evaluator/src/brillig/brillig_ir.rs | 272 +++++++++++------- .../brillig/brillig_ir/brillig_variable.rs | 12 + .../src/brillig/brillig_ir/debug_show.rs | 22 +- .../src/brillig/brillig_ir/entry_point.rs | 22 +- .../src/ssa/function_builder/data_bus.rs | 2 +- .../src/hir/def_collector/dc_crate.rs | 10 +- .../src/parser/parser/function.rs | 2 +- .../global_consts/src/main.nr | 17 ++ .../tooling/debugger/ignored-tests.txt | 1 + .../__snapshots__/contract_class.test.ts.snap | 10 +- .../__snapshots__/index.test.ts.snap | 10 +- 17 files changed, 407 insertions(+), 308 deletions(-) diff --git a/noir/noir-repo/.aztec-sync-commit b/noir/noir-repo/.aztec-sync-commit index 78e53d61647..5a1cd9c70bd 100644 --- a/noir/noir-repo/.aztec-sync-commit +++ b/noir/noir-repo/.aztec-sync-commit @@ -1 +1 @@ -73d640a4a033f0c865d45da470ef40c1fb03a844 +58e15edf7fd3d32267b0aed883fc84f6cee327c9 diff --git a/noir/noir-repo/.gitrepo b/noir/noir-repo/.gitrepo index 24317f85d26..12e4bdc68a3 100644 --- a/noir/noir-repo/.gitrepo +++ b/noir/noir-repo/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/noir-lang/noir branch = master - commit = 5f57ebb7ff4b810802f90699a10f4325ef904f2e - parent = 8307dadd853d5091841e169c841ab6b09c223efb + commit = a6016b46abf6da6de4566cf6d35a675d805dd9b5 + parent = 6c7062443ae23cc75ac06b7ac1492d12f803d0e5 method = merge cmdver = 0.4.6 diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs index 5b227372396..911f4c1924e 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs @@ -1,7 +1,9 @@ use crate::brillig::brillig_ir::brillig_variable::{ type_to_heap_value_type, BrilligArray, BrilligVariable, BrilligVector, SingleAddrVariable, }; -use crate::brillig::brillig_ir::{BrilligBinaryOp, BrilligContext}; +use crate::brillig::brillig_ir::{ + BrilligBinaryOp, BrilligContext, BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, +}; use crate::ssa::ir::dfg::CallStack; use crate::ssa::ir::instruction::ConstrainError; use crate::ssa::ir::{ @@ -23,7 +25,7 @@ use num_bigint::BigUint; use super::brillig_black_box::convert_black_box_call; use super::brillig_block_variables::BlockVariables; -use super::brillig_fn::{get_bit_size_from_ssa_type, FunctionContext}; +use super::brillig_fn::FunctionContext; /// Generate the compilation artifacts for compiling a function into brillig bytecode. pub(crate) struct BrilligBlock<'block> { @@ -282,8 +284,8 @@ impl<'block> BrilligBlock<'block> { condition, ); - self.brillig_context.constrain_instruction(condition.address, assert_message); - self.brillig_context.deallocate_register(condition.address); + self.brillig_context.constrain_instruction(condition, assert_message); + self.brillig_context.deallocate_single_addr(condition); } Instruction::Allocate => { let result_value = dfg.instruction_results(instruction_id)[0]; @@ -496,10 +498,10 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.mov_instruction(target_len.address, limb_count.address); self.brillig_context.radix_instruction( - source.address, + source, target_vector, - radix.address, - limb_count.address, + radix, + limb_count, matches!(endianness, Endian::Big), ); } @@ -530,22 +532,20 @@ impl<'block> BrilligBlock<'block> { BrilligVariable::SingleAddr(..) => unreachable!("ICE: ToBits on non-array"), }; - let radix = self - .brillig_context - .make_constant(2_usize.into(), FieldElement::max_num_bits()); + let radix = self.brillig_context.make_constant(2_usize.into(), 32); // Update the user-facing slice length self.brillig_context.mov_instruction(target_len.address, limb_count.address); self.brillig_context.radix_instruction( - source.address, + source, target_vector, radix, - limb_count.address, + limb_count, matches!(endianness, Endian::Big), ); - self.brillig_context.deallocate_register(radix); + self.brillig_context.deallocate_single_addr(radix); } _ => { unreachable!("unsupported function call type {:?}", dfg[*func]) @@ -597,7 +597,7 @@ impl<'block> BrilligBlock<'block> { self.validate_array_index(array_variable, index_variable); self.retrieve_variable_from_array( array_pointer, - index_variable.address, + index_variable, destination_variable, ); } @@ -641,22 +641,20 @@ impl<'block> BrilligBlock<'block> { ); // Check if lte max - let brillig_binary_op = BrilligBinaryOp::Integer { - op: BinaryIntOp::LessThanEquals, - bit_size: FieldElement::max_num_bits(), - }; - let condition = self.brillig_context.allocate_register(); + let brillig_binary_op = BrilligBinaryOp::Integer(BinaryIntOp::LessThanEquals); + let condition = + SingleAddrVariable::new(self.brillig_context.allocate_register(), 1); self.brillig_context.binary_instruction( - left.address, + left, right, condition, brillig_binary_op, ); self.brillig_context.constrain_instruction(condition, assert_message.clone()); - self.brillig_context.deallocate_register(condition); - self.brillig_context.deallocate_register(left.address); - self.brillig_context.deallocate_register(right); + self.brillig_context.deallocate_single_addr(condition); + self.brillig_context.deallocate_single_addr(left); + self.brillig_context.deallocate_single_addr(right); } } Instruction::IncrementRc { value } => { @@ -751,16 +749,18 @@ impl<'block> BrilligBlock<'block> { BrilligVariable::BrilligArray(BrilligArray { size, .. }) => { (self.brillig_context.make_usize_constant(size.into()), true) } - BrilligVariable::BrilligVector(BrilligVector { size, .. }) => (size, false), + BrilligVariable::BrilligVector(BrilligVector { size, .. }) => { + (SingleAddrVariable::new_usize(size), false) + } _ => unreachable!("ICE: validate array index on non-array"), }; - let condition = self.brillig_context.allocate_register(); + let condition = SingleAddrVariable::new(self.brillig_context.allocate_register(), 1); self.brillig_context.memory_op( index_register.address, - size_as_register, - condition, + size_as_register.address, + condition.address, BinaryIntOp::LessThan, ); @@ -768,28 +768,28 @@ impl<'block> BrilligBlock<'block> { .constrain_instruction(condition, Some("Array index out of bounds".to_owned())); if should_deallocate_size { - self.brillig_context.deallocate_register(size_as_register); + self.brillig_context.deallocate_single_addr(size_as_register); } - self.brillig_context.deallocate_register(condition); + self.brillig_context.deallocate_single_addr(condition); } pub(crate) fn retrieve_variable_from_array( &mut self, array_pointer: MemoryAddress, - index_register: MemoryAddress, + index_var: SingleAddrVariable, destination_variable: BrilligVariable, ) { match destination_variable { BrilligVariable::SingleAddr(destination_register) => { self.brillig_context.array_get( array_pointer, - index_register, + index_var, destination_register.address, ); } BrilligVariable::BrilligArray(..) | BrilligVariable::BrilligVector(..) => { let reference = self.brillig_context.allocate_register(); - self.brillig_context.array_get(array_pointer, index_register, reference); + self.brillig_context.array_get(array_pointer, index_var, reference); self.brillig_context.load_variable_instruction(destination_variable, reference); self.brillig_context.deallocate_register(reference); } @@ -834,7 +834,12 @@ impl<'block> BrilligBlock<'block> { // Here we want to compare the reference count against 1. let one = self.brillig_context.make_usize_constant(1_usize.into()); let condition = self.brillig_context.allocate_register(); - self.brillig_context.memory_op(reference_count, one, condition, BinaryIntOp::Equals); + self.brillig_context.memory_op( + reference_count, + one.address, + condition, + BinaryIntOp::Equals, + ); self.brillig_context.branch_instruction(condition, |ctx, cond| { if cond { // Reference count is 1, we can mutate the array directly @@ -846,7 +851,10 @@ impl<'block> BrilligBlock<'block> { ctx.copy_array_instruction( source_pointer, destination_pointer, - source_size_as_register, + SingleAddrVariable::new( + source_size_as_register, + BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, + ), ); } }); @@ -867,17 +875,20 @@ impl<'block> BrilligBlock<'block> { } // Then set the value in the newly created array - self.store_variable_in_array(destination_pointer, index_register, value_variable); + self.store_variable_in_array( + destination_pointer, + SingleAddrVariable::new_usize(index_register), + value_variable, + ); self.brillig_context.deallocate_register(source_size_as_register); - self.brillig_context.deallocate_register(one); self.brillig_context.deallocate_register(condition); } pub(crate) fn store_variable_in_array_with_ctx( ctx: &mut BrilligContext, destination_pointer: MemoryAddress, - index_register: MemoryAddress, + index_register: SingleAddrVariable, value_variable: BrilligVariable, ) { match value_variable { @@ -904,13 +915,13 @@ impl<'block> BrilligBlock<'block> { pub(crate) fn store_variable_in_array( &mut self, destination_pointer: MemoryAddress, - index_register: MemoryAddress, + index_variable: SingleAddrVariable, value_variable: BrilligVariable, ) { Self::store_variable_in_array_with_ctx( self.brillig_context, destination_pointer, - index_register, + index_variable, value_variable, ); } @@ -1076,9 +1087,9 @@ impl<'block> BrilligBlock<'block> { let converted_index = self.brillig_context.make_usize_constant(element_size.into()); self.brillig_context.memory_op( - converted_index, + converted_index.address, user_index.address, - converted_index, + converted_index.address, BinaryIntOp::Mul, ); @@ -1089,7 +1100,7 @@ impl<'block> BrilligBlock<'block> { self.update_slice_length(target_len.address, arguments[0], dfg, BinaryIntOp::Add); self.slice_insert_operation(target_vector, source_vector, converted_index, &items); - self.brillig_context.deallocate_register(converted_index); + self.brillig_context.deallocate_single_addr(converted_index); } Value::Intrinsic(Intrinsic::SliceRemove) => { let target_len = match self.variables.define_variable( @@ -1118,9 +1129,9 @@ impl<'block> BrilligBlock<'block> { let converted_index = self.brillig_context.make_usize_constant(element_size.into()); self.brillig_context.memory_op( - converted_index, + converted_index.address, user_index.address, - converted_index, + converted_index.address, BinaryIntOp::Mul, ); @@ -1142,7 +1153,7 @@ impl<'block> BrilligBlock<'block> { &removed_items, ); - self.brillig_context.deallocate_register(converted_index); + self.brillig_context.deallocate_single_addr(converted_index); } _ => unreachable!("ICE: Slice operation not supported"), } @@ -1195,12 +1206,7 @@ impl<'block> BrilligBlock<'block> { let (brillig_binary_op, is_signed) = convert_ssa_binary_op_to_brillig_binary_op(binary.operator, &binary_type); - self.brillig_context.binary_instruction( - left.address, - right.address, - result_variable.address, - brillig_binary_op, - ); + self.brillig_context.binary_instruction(left, right, result_variable, brillig_binary_op); self.add_overflow_check(brillig_binary_op, left, right, result_variable, is_signed); } @@ -1213,77 +1219,83 @@ impl<'block> BrilligBlock<'block> { result: SingleAddrVariable, is_signed: bool, ) { - let (op, bit_size) = if let BrilligBinaryOp::Integer { op, bit_size } = binary_operation { - (op, bit_size) + let (op, bit_size) = if let BrilligBinaryOp::Integer(op) = binary_operation { + // Bit size is checked at compile time to be equal for left and right + (op, left.bit_size) } else { return; }; match (op, is_signed) { (BinaryIntOp::Add, false) => { - let condition = self.brillig_context.allocate_register(); + let condition = + SingleAddrVariable::new(self.brillig_context.allocate_register(), 1); // Check that lhs <= result self.brillig_context.binary_instruction( - left.address, - result.address, + left, + result, condition, - BrilligBinaryOp::Integer { op: BinaryIntOp::LessThanEquals, bit_size }, + BrilligBinaryOp::Integer(BinaryIntOp::LessThanEquals), ); self.brillig_context.constrain_instruction( condition, Some("attempt to add with overflow".to_string()), ); - self.brillig_context.deallocate_register(condition); + self.brillig_context.deallocate_single_addr(condition); } (BinaryIntOp::Sub, false) => { - let condition = self.brillig_context.allocate_register(); + let condition = + SingleAddrVariable::new(self.brillig_context.allocate_register(), 1); // Check that rhs <= lhs self.brillig_context.binary_instruction( - right.address, - left.address, + right, + left, condition, - BrilligBinaryOp::Integer { op: BinaryIntOp::LessThanEquals, bit_size }, + BrilligBinaryOp::Integer(BinaryIntOp::LessThanEquals), ); self.brillig_context.constrain_instruction( condition, Some("attempt to subtract with overflow".to_string()), ); - self.brillig_context.deallocate_register(condition); + self.brillig_context.deallocate_single_addr(condition); } (BinaryIntOp::Mul, false) => { // Multiplication overflow is only possible for bit sizes > 1 if bit_size > 1 { - let is_right_zero = self.brillig_context.allocate_register(); + let is_right_zero = + SingleAddrVariable::new(self.brillig_context.allocate_register(), 1); let zero = self.brillig_context.make_constant(0_usize.into(), bit_size); self.brillig_context.binary_instruction( zero, - right.address, + right, is_right_zero, - BrilligBinaryOp::Integer { op: BinaryIntOp::Equals, bit_size }, + BrilligBinaryOp::Integer(BinaryIntOp::Equals), ); - self.brillig_context.if_not_instruction(is_right_zero, |ctx| { - let condition = ctx.allocate_register(); + self.brillig_context.if_not_instruction(is_right_zero.address, |ctx| { + let condition = SingleAddrVariable::new(ctx.allocate_register(), 1); + let division = SingleAddrVariable::new(ctx.allocate_register(), bit_size); // Check that result / rhs == lhs ctx.binary_instruction( - result.address, - right.address, - condition, - BrilligBinaryOp::Integer { op: BinaryIntOp::UnsignedDiv, bit_size }, + result, + right, + division, + BrilligBinaryOp::Integer(BinaryIntOp::UnsignedDiv), ); ctx.binary_instruction( + division, + left, condition, - left.address, - condition, - BrilligBinaryOp::Integer { op: BinaryIntOp::Equals, bit_size }, + BrilligBinaryOp::Integer(BinaryIntOp::Equals), ); ctx.constrain_instruction( condition, Some("attempt to multiply with overflow".to_string()), ); - ctx.deallocate_register(condition); + ctx.deallocate_single_addr(condition); + ctx.deallocate_single_addr(division); }); - self.brillig_context.deallocate_register(is_right_zero); - self.brillig_context.deallocate_register(zero); + self.brillig_context.deallocate_single_addr(is_right_zero); + self.brillig_context.deallocate_single_addr(zero); } } _ => {} @@ -1301,7 +1313,7 @@ impl<'block> BrilligBlock<'block> { // converted to registers so we fetch from the cache. self.variables.get_allocation(self.function_context, value_id, dfg) } - Value::NumericConstant { constant, typ } => { + Value::NumericConstant { constant, .. } => { // Constants might have been converted previously or not, so we get or create and // (re)initialize the value inside. if let Some(variable) = self.variables.get_constant(value_id, dfg) { @@ -1309,13 +1321,9 @@ impl<'block> BrilligBlock<'block> { } else { let new_variable = self.variables.allocate_constant(self.brillig_context, value_id, dfg); - let register_index = new_variable.extract_single_addr(); - self.brillig_context.const_instruction( - register_index.address, - (*constant).into(), - get_bit_size_from_ssa_type(typ), - ); + self.brillig_context + .const_instruction(new_variable.extract_single_addr(), (*constant).into()); new_variable } } @@ -1360,13 +1368,13 @@ impl<'block> BrilligBlock<'block> { self.store_variable_in_array(pointer, iterator_register, element_variable); // Increment the iterator self.brillig_context.usize_op_in_place( - iterator_register, + iterator_register.address, BinaryIntOp::Add, 1, ); } - self.brillig_context.deallocate_register(iterator_register); + self.brillig_context.deallocate_single_addr(iterator_register); new_variable } @@ -1378,12 +1386,10 @@ impl<'block> BrilligBlock<'block> { // value. let new_variable = self.variables.allocate_constant(self.brillig_context, value_id, dfg); - let register_index = new_variable.extract_single_addr(); self.brillig_context.const_instruction( - register_index.address, + new_variable.extract_single_addr(), value_id.to_usize().into(), - 32, ); new_variable } @@ -1532,18 +1538,18 @@ pub(crate) fn convert_ssa_binary_op_to_brillig_binary_op( fn binary_op_to_field_op(op: BinaryOp) -> BrilligBinaryOp { match op { - BinaryOp::Add => BrilligBinaryOp::Field { op: BinaryFieldOp::Add }, - BinaryOp::Sub => BrilligBinaryOp::Field { op: BinaryFieldOp::Sub }, - BinaryOp::Mul => BrilligBinaryOp::Field { op: BinaryFieldOp::Mul }, - BinaryOp::Div => BrilligBinaryOp::Field { op: BinaryFieldOp::Div }, - BinaryOp::Eq => BrilligBinaryOp::Field { op: BinaryFieldOp::Equals }, + BinaryOp::Add => BrilligBinaryOp::Field(BinaryFieldOp::Add), + BinaryOp::Sub => BrilligBinaryOp::Field(BinaryFieldOp::Sub), + BinaryOp::Mul => BrilligBinaryOp::Field(BinaryFieldOp::Mul), + BinaryOp::Div => BrilligBinaryOp::Field(BinaryFieldOp::Div), + BinaryOp::Eq => BrilligBinaryOp::Field(BinaryFieldOp::Equals), _ => unreachable!( "Field type cannot be used with {op}. This should have been caught by the frontend" ), } } - fn binary_op_to_int_op(op: BinaryOp, bit_size: u32, is_signed: bool) -> BrilligBinaryOp { + fn binary_op_to_int_op(op: BinaryOp, is_signed: bool) -> BrilligBinaryOp { let operation = match op { BinaryOp::Add => BinaryIntOp::Add, BinaryOp::Sub => BinaryIntOp::Sub, @@ -1555,9 +1561,7 @@ pub(crate) fn convert_ssa_binary_op_to_brillig_binary_op( BinaryIntOp::UnsignedDiv } } - BinaryOp::Mod => { - return BrilligBinaryOp::Modulo { is_signed_integer: is_signed, bit_size } - } + BinaryOp::Mod => return BrilligBinaryOp::Modulo { is_signed_integer: is_signed }, BinaryOp::Eq => BinaryIntOp::Equals, BinaryOp::Lt => BinaryIntOp::LessThan, BinaryOp::And => BinaryIntOp::And, @@ -1567,14 +1571,12 @@ pub(crate) fn convert_ssa_binary_op_to_brillig_binary_op( BinaryOp::Shr => BinaryIntOp::Shr, }; - BrilligBinaryOp::Integer { op: operation, bit_size } + BrilligBinaryOp::Integer(operation) } // If bit size is available then it is a binary integer operation match bit_size_signedness { - Some((bit_size, is_signed)) => { - (binary_op_to_int_op(ssa_op, *bit_size, is_signed), is_signed) - } + Some((_, is_signed)) => (binary_op_to_int_op(ssa_op, is_signed), is_signed), None => (binary_op_to_field_op(ssa_op), false), } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block_variables.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block_variables.rs index f463bd4de4d..dc9900daee3 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block_variables.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block_variables.rs @@ -3,7 +3,7 @@ use fxhash::{FxHashMap as HashMap, FxHashSet as HashSet}; use crate::{ brillig::brillig_ir::{ brillig_variable::{BrilligArray, BrilligVariable, BrilligVector, SingleAddrVariable}, - BrilligContext, BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, + BrilligContext, }, ssa::ir::{ basic_block::BasicBlockId, @@ -13,7 +13,7 @@ use crate::{ }, }; -use super::brillig_fn::FunctionContext; +use super::brillig_fn::{get_bit_size_from_ssa_type, FunctionContext}; #[derive(Debug, Default)] pub(crate) struct BlockVariables { @@ -189,21 +189,10 @@ pub(crate) fn allocate_value( let typ = dfg.type_of_value(value_id); match typ { - Type::Numeric(numeric_type) => BrilligVariable::SingleAddr(SingleAddrVariable { - address: brillig_context.allocate_register(), - bit_size: numeric_type.bit_size(), - }), - Type::Reference(_) => BrilligVariable::SingleAddr(SingleAddrVariable { - address: brillig_context.allocate_register(), - bit_size: BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, - }), - Type::Function => { - // NB. function references are converted to a constant when - // translating from SSA to Brillig (to allow for debugger - // instrumentation to work properly) + Type::Numeric(_) | Type::Reference(_) | Type::Function => { BrilligVariable::SingleAddr(SingleAddrVariable { address: brillig_context.allocate_register(), - bit_size: 32, + bit_size: get_bit_size_from_ssa_type(&typ), }) } Type::Array(item_typ, elem_count) => { diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_fn.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_fn.rs index b5da8296ba5..42765d10ce2 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_fn.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_fn.rs @@ -1,4 +1,3 @@ -use acvm::FieldElement; use iter_extended::vecmap; use crate::{ @@ -11,7 +10,7 @@ use crate::{ basic_block::BasicBlockId, function::{Function, FunctionId}, post_order::PostOrder, - types::{NumericType, Type}, + types::Type, value::ValueId, }, }; @@ -116,11 +115,12 @@ impl FunctionContext { pub(crate) fn get_bit_size_from_ssa_type(typ: &Type) -> u32 { match typ { - Type::Numeric(num_type) => match num_type { - NumericType::Signed { bit_size } | NumericType::Unsigned { bit_size } => *bit_size, - NumericType::NativeField => FieldElement::max_num_bits(), - }, + Type::Numeric(num_type) => num_type.bit_size(), Type::Reference(_) => BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, - _ => unreachable!("ICE bitwise not on a non numeric type"), + // NB. function references are converted to a constant when + // translating from SSA to Brillig (to allow for debugger + // instrumentation to work properly) + Type::Function => 32, + _ => unreachable!("ICE bit size not on a non numeric type"), } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_slice_ops.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_slice_ops.rs index 3fc0e981165..969f95cff20 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_slice_ops.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_slice_ops.rs @@ -1,6 +1,8 @@ -use acvm::brillig_vm::brillig::{BinaryIntOp, MemoryAddress}; +use acvm::brillig_vm::brillig::BinaryIntOp; -use crate::brillig::brillig_ir::brillig_variable::{BrilligVariable, BrilligVector}; +use crate::brillig::brillig_ir::brillig_variable::{ + BrilligVariable, BrilligVector, SingleAddrVariable, +}; use super::brillig_block::BrilligBlock; @@ -26,19 +28,19 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.copy_array_instruction( source_vector.pointer, target_vector.pointer, - source_vector.size, + SingleAddrVariable::new_usize(source_vector.size), ); for (index, variable) in variables_to_insert.iter().enumerate() { let target_index = self.brillig_context.make_usize_constant(index.into()); self.brillig_context.memory_op( - target_index, + target_index.address, source_vector.size, - target_index, + target_index.address, BinaryIntOp::Add, ); self.store_variable_in_array(target_vector.pointer, target_index, *variable); - self.brillig_context.deallocate_register(target_index); + self.brillig_context.deallocate_single_addr(target_index); } } @@ -72,14 +74,14 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.copy_array_instruction( source_vector.pointer, destination_copy_pointer, - source_vector.size, + SingleAddrVariable::new_usize(source_vector.size), ); // Then we write the items to insert at the start for (index, variable) in variables_to_insert.iter().enumerate() { let target_index = self.brillig_context.make_usize_constant(index.into()); self.store_variable_in_array(target_vector.pointer, target_index, *variable); - self.brillig_context.deallocate_register(target_index); + self.brillig_context.deallocate_single_addr(target_index); } self.brillig_context.deallocate_register(destination_copy_pointer); @@ -115,13 +117,13 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.copy_array_instruction( source_copy_pointer, target_vector.pointer, - target_vector.size, + SingleAddrVariable::new_usize(target_vector.size), ); for (index, variable) in removed_items.iter().enumerate() { let target_index = self.brillig_context.make_usize_constant(index.into()); self.retrieve_variable_from_array(source_vector.pointer, target_index, *variable); - self.brillig_context.deallocate_register(target_index); + self.brillig_context.deallocate_single_addr(target_index); } self.brillig_context.deallocate_register(source_copy_pointer); @@ -148,19 +150,19 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.copy_array_instruction( source_vector.pointer, target_vector.pointer, - target_vector.size, + SingleAddrVariable::new_usize(target_vector.size), ); for (index, variable) in removed_items.iter().enumerate() { let target_index = self.brillig_context.make_usize_constant(index.into()); self.brillig_context.memory_op( - target_index, + target_index.address, target_vector.size, - target_index, + target_index.address, BinaryIntOp::Add, ); self.retrieve_variable_from_array(source_vector.pointer, target_index, *variable); - self.brillig_context.deallocate_register(target_index); + self.brillig_context.deallocate_single_addr(target_index); } } @@ -168,7 +170,7 @@ impl<'block> BrilligBlock<'block> { &mut self, target_vector: BrilligVector, source_vector: BrilligVector, - index: MemoryAddress, + index: SingleAddrVariable, items: &[BrilligVariable], ) { // First we need to allocate the target vector incrementing the size by items.len() @@ -193,7 +195,7 @@ impl<'block> BrilligBlock<'block> { let source_pointer_at_index = self.brillig_context.allocate_register(); self.brillig_context.memory_op( source_vector.pointer, - index, + index.address, source_pointer_at_index, BinaryIntOp::Add, ); @@ -202,7 +204,7 @@ impl<'block> BrilligBlock<'block> { let target_pointer_after_index = self.brillig_context.allocate_register(); self.brillig_context.memory_op( target_vector.pointer, - index, + index.address, target_pointer_after_index, BinaryIntOp::Add, ); @@ -214,21 +216,31 @@ impl<'block> BrilligBlock<'block> { // Compute the number of elements to the right of the index let item_count = self.brillig_context.allocate_register(); - self.brillig_context.memory_op(source_vector.size, index, item_count, BinaryIntOp::Sub); + self.brillig_context.memory_op( + source_vector.size, + index.address, + item_count, + BinaryIntOp::Sub, + ); // Copy the elements to the right of the index self.brillig_context.copy_array_instruction( source_pointer_at_index, target_pointer_after_index, - item_count, + SingleAddrVariable::new_usize(item_count), ); // Write the items to insert starting at the index for (subitem_index, variable) in items.iter().enumerate() { let target_index = self.brillig_context.make_usize_constant(subitem_index.into()); - self.brillig_context.memory_op(target_index, index, target_index, BinaryIntOp::Add); + self.brillig_context.memory_op( + target_index.address, + index.address, + target_index.address, + BinaryIntOp::Add, + ); self.store_variable_in_array(target_vector.pointer, target_index, *variable); - self.brillig_context.deallocate_register(target_index); + self.brillig_context.deallocate_single_addr(target_index); } self.brillig_context.deallocate_register(source_pointer_at_index); @@ -240,7 +252,7 @@ impl<'block> BrilligBlock<'block> { &mut self, target_vector: BrilligVector, source_vector: BrilligVector, - index: MemoryAddress, + index: SingleAddrVariable, removed_items: &[BrilligVariable], ) { // First we need to allocate the target vector decrementing the size by removed_items.len() @@ -265,7 +277,7 @@ impl<'block> BrilligBlock<'block> { let source_pointer_after_index = self.brillig_context.allocate_register(); self.brillig_context.memory_op( source_vector.pointer, - index, + index.address, source_pointer_after_index, BinaryIntOp::Add, ); @@ -279,29 +291,39 @@ impl<'block> BrilligBlock<'block> { let target_pointer_at_index = self.brillig_context.allocate_register(); self.brillig_context.memory_op( target_vector.pointer, - index, + index.address, target_pointer_at_index, BinaryIntOp::Add, ); // Compute the number of elements to the right of the index let item_count = self.brillig_context.allocate_register(); - self.brillig_context.memory_op(source_vector.size, index, item_count, BinaryIntOp::Sub); + self.brillig_context.memory_op( + source_vector.size, + index.address, + item_count, + BinaryIntOp::Sub, + ); self.brillig_context.usize_op_in_place(item_count, BinaryIntOp::Sub, removed_items.len()); // Copy the elements to the right of the index self.brillig_context.copy_array_instruction( source_pointer_after_index, target_pointer_at_index, - item_count, + SingleAddrVariable::new_usize(item_count), ); // Get the removed items for (subitem_index, variable) in removed_items.iter().enumerate() { let target_index = self.brillig_context.make_usize_constant(subitem_index.into()); - self.brillig_context.memory_op(target_index, index, target_index, BinaryIntOp::Add); + self.brillig_context.memory_op( + target_index.address, + index.address, + target_index.address, + BinaryIntOp::Add, + ); self.retrieve_variable_from_array(source_vector.pointer, target_index, *variable); - self.brillig_context.deallocate_register(target_index); + self.brillig_context.deallocate_single_addr(target_index); } self.brillig_context.deallocate_register(source_pointer_after_index); @@ -592,7 +614,10 @@ mod tests { address: context.allocate_register(), bit_size: BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, }; - let index_to_insert = context.allocate_register(); + let index_to_insert = SingleAddrVariable::new( + context.allocate_register(), + BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, + ); // Cast the source array to a vector let source_vector = context.array_to_vector(&array_variable); @@ -710,7 +735,10 @@ mod tests { size: array.len(), rc: context.allocate_register(), }; - let index_to_insert = context.allocate_register(); + let index_to_insert = SingleAddrVariable::new( + context.allocate_register(), + BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, + ); // Cast the source array to a vector let source_vector = context.array_to_vector(&array_variable); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs index b66efa4da27..2a96965171b 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs @@ -122,8 +122,8 @@ impl BrilligContext { ) { // debug_show handled by allocate_array_instruction let size_register = self.make_usize_constant(size.into()); - self.allocate_array_instruction(pointer_register, size_register); - self.deallocate_register(size_register); + self.allocate_array_instruction(pointer_register, size_register.address); + self.deallocate_single_addr(size_register); } /// Allocates an array of size contained in size_register and stores the @@ -171,11 +171,11 @@ impl BrilligContext { }); self.memory_op( ReservedRegisters::stack_pointer(), - size_register, + size_register.address, ReservedRegisters::stack_pointer(), BinaryIntOp::Add, ); - self.deallocate_register(size_register); + self.deallocate_single_addr(size_register); } pub(crate) fn allocate_single_addr_reference_instruction( @@ -206,13 +206,14 @@ impl BrilligContext { pub(crate) fn array_get( &mut self, array_ptr: MemoryAddress, - index: MemoryAddress, + index: SingleAddrVariable, result: MemoryAddress, ) { - self.debug_show.array_get(array_ptr, index, result); + assert!(index.bit_size == BRILLIG_MEMORY_ADDRESSING_BIT_SIZE); + self.debug_show.array_get(array_ptr, index.address, result); // Computes array_ptr + index, ie array[index] let index_of_element_in_memory = self.allocate_register(); - self.memory_op(array_ptr, index, index_of_element_in_memory, BinaryIntOp::Add); + self.memory_op(array_ptr, index.address, index_of_element_in_memory, BinaryIntOp::Add); self.load_instruction(result, index_of_element_in_memory); // Free up temporary register self.deallocate_register(index_of_element_in_memory); @@ -222,20 +223,18 @@ impl BrilligContext { pub(crate) fn array_set( &mut self, array_ptr: MemoryAddress, - index: MemoryAddress, + index: SingleAddrVariable, value: MemoryAddress, ) { - self.debug_show.array_set(array_ptr, index, value); + assert!(index.bit_size == BRILLIG_MEMORY_ADDRESSING_BIT_SIZE); + self.debug_show.array_set(array_ptr, index.address, value); // Computes array_ptr + index, ie array[index] let index_of_element_in_memory = self.allocate_register(); self.binary_instruction( - array_ptr, + SingleAddrVariable::new_usize(array_ptr), index, - index_of_element_in_memory, - BrilligBinaryOp::Integer { - op: BinaryIntOp::Add, - bit_size: BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, - }, + SingleAddrVariable::new_usize(index_of_element_in_memory), + BrilligBinaryOp::Integer(BinaryIntOp::Add), ); self.store_instruction(index_of_element_in_memory, value); @@ -249,17 +248,18 @@ impl BrilligContext { &mut self, source_pointer: MemoryAddress, destination_pointer: MemoryAddress, - num_elements_register: MemoryAddress, + num_elements_variable: SingleAddrVariable, ) { + assert!(num_elements_variable.bit_size == BRILLIG_MEMORY_ADDRESSING_BIT_SIZE); self.debug_show.copy_array_instruction( source_pointer, destination_pointer, - num_elements_register, + num_elements_variable.address, ); let value_register = self.allocate_register(); - self.loop_instruction(num_elements_register, |ctx, iterator| { + self.loop_instruction(num_elements_variable.address, |ctx, iterator| { ctx.array_get(source_pointer, iterator, value_register); ctx.array_set(destination_pointer, iterator, value_register); }); @@ -271,7 +271,7 @@ impl BrilligContext { /// The body of the loop should be issued by the caller in the on_iteration closure. pub(crate) fn loop_instruction(&mut self, iteration_count: MemoryAddress, on_iteration: F) where - F: FnOnce(&mut BrilligContext, MemoryAddress), + F: FnOnce(&mut BrilligContext, SingleAddrVariable), { let iterator_register = self.make_usize_constant(0_u128.into()); @@ -285,7 +285,7 @@ impl BrilligContext { SingleAddrVariable { address: self.allocate_register(), bit_size: 1 }; self.memory_op( - iterator_register, + iterator_register.address, iteration_count, iterator_less_than_iterations.address, BinaryIntOp::LessThan, @@ -301,7 +301,7 @@ impl BrilligContext { on_iteration(self, iterator_register); // Increment the iterator register - self.usize_op_in_place(iterator_register, BinaryIntOp::Add, 1); + self.usize_op_in_place(iterator_register.address, BinaryIntOp::Add, 1); self.jump_instruction(loop_label); @@ -309,8 +309,8 @@ impl BrilligContext { self.enter_section(exit_loop_section); // Deallocate our temporary registers - self.deallocate_register(iterator_less_than_iterations.address); - self.deallocate_register(iterator_register); + self.deallocate_single_addr(iterator_less_than_iterations); + self.deallocate_single_addr(iterator_register); } /// This instruction will issue an if-then branch that will check if the condition is true @@ -426,11 +426,14 @@ impl BrilligContext { } /// Push a register to the deallocation list, ready for reuse. - /// TODO(AD): currently, register deallocation is only done with immediate values. - /// TODO(AD): See https://github.com/noir-lang/noir/issues/1720 pub(crate) fn deallocate_register(&mut self, register_index: MemoryAddress) { self.registers.deallocate_register(register_index); } + + /// Deallocates the address where the single address variable is stored + pub(crate) fn deallocate_single_addr(&mut self, var: SingleAddrVariable) { + self.deallocate_register(var.address); + } } impl BrilligContext { @@ -438,12 +441,16 @@ impl BrilligContext { /// is false. pub(crate) fn constrain_instruction( &mut self, - condition: MemoryAddress, + condition: SingleAddrVariable, assert_message: Option, ) { - self.debug_show.constrain_instruction(condition); + assert!(condition.bit_size == 1); + self.debug_show.constrain_instruction(condition.address); let (next_section, next_label) = self.reserve_next_section_label(); - self.add_unresolved_jump(BrilligOpcode::JumpIf { condition, location: 0 }, next_label); + self.add_unresolved_jump( + BrilligOpcode::JumpIf { condition: condition.address, location: 0 }, + next_label, + ); self.push_opcode(BrilligOpcode::Trap); if let Some(assert_message) = assert_message { self.obj.add_assert_message_to_last_opcode(assert_message); @@ -522,48 +529,82 @@ impl BrilligContext { }); } + fn binary_result_bit_size(operation: BrilligBinaryOp, arguments_bit_size: u32) -> u32 { + match operation { + BrilligBinaryOp::Field(BinaryFieldOp::Equals) + | BrilligBinaryOp::Integer(BinaryIntOp::Equals) + | BrilligBinaryOp::Integer(BinaryIntOp::LessThan) + | BrilligBinaryOp::Integer(BinaryIntOp::LessThanEquals) => 1, + _ => arguments_bit_size, + } + } + /// Processes a binary instruction according `operation`. /// /// This method will compute lhs rhs /// and store the result in the `result` register. pub(crate) fn binary_instruction( &mut self, - lhs: MemoryAddress, - rhs: MemoryAddress, - result: MemoryAddress, + lhs: SingleAddrVariable, + rhs: SingleAddrVariable, + result: SingleAddrVariable, operation: BrilligBinaryOp, ) { - self.debug_show.binary_instruction(lhs, rhs, result, operation); + assert!( + lhs.bit_size == rhs.bit_size, + "Not equal bit size for lhs and rhs: lhs {}, rhs {}", + lhs.bit_size, + rhs.bit_size + ); + let expected_result_bit_size = + BrilligContext::binary_result_bit_size(operation, lhs.bit_size); + assert!( + result.bit_size == expected_result_bit_size, + "Expected result bit size to be {}, got {} for operation {:?}", + expected_result_bit_size, + result.bit_size, + operation + ); + self.debug_show.binary_instruction(lhs.address, rhs.address, result.address, operation); match operation { - BrilligBinaryOp::Field { op } => { - let opcode = BrilligOpcode::BinaryFieldOp { op, destination: result, lhs, rhs }; + BrilligBinaryOp::Field(op) => { + let opcode = BrilligOpcode::BinaryFieldOp { + op, + destination: result.address, + lhs: lhs.address, + rhs: rhs.address, + }; self.push_opcode(opcode); } - BrilligBinaryOp::Integer { op, bit_size } => { - let opcode = - BrilligOpcode::BinaryIntOp { op, destination: result, bit_size, lhs, rhs }; + BrilligBinaryOp::Integer(op) => { + let opcode = BrilligOpcode::BinaryIntOp { + op, + destination: result.address, + bit_size: lhs.bit_size, + lhs: lhs.address, + rhs: rhs.address, + }; self.push_opcode(opcode); } - BrilligBinaryOp::Modulo { is_signed_integer, bit_size } => { - self.modulo_instruction(result, lhs, rhs, bit_size, is_signed_integer); + BrilligBinaryOp::Modulo { is_signed_integer } => { + self.modulo_instruction(result, lhs, rhs, is_signed_integer); } } } /// Stores the value of `constant` in the `result` register - pub(crate) fn const_instruction( - &mut self, - result: MemoryAddress, - constant: Value, - bit_size: u32, - ) { - self.debug_show.const_instruction(result, constant); + pub(crate) fn const_instruction(&mut self, result: SingleAddrVariable, constant: Value) { + self.debug_show.const_instruction(result.address, constant); - self.push_opcode(BrilligOpcode::Const { destination: result, value: constant, bit_size }); + self.push_opcode(BrilligOpcode::Const { + destination: result.address, + value: constant, + bit_size: result.bit_size, + }); } pub(crate) fn usize_const(&mut self, result: MemoryAddress, constant: Value) { - self.const_instruction(result, constant, BRILLIG_MEMORY_ADDRESSING_BIT_SIZE); + self.const_instruction(SingleAddrVariable::new_usize(result), constant); } /// Processes a not instruction. @@ -580,15 +621,16 @@ impl BrilligContext { let u_max = FieldElement::from(2_i128).pow(&FieldElement::from(input.bit_size as i128)) - FieldElement::one(); let max = self.make_constant(Value::from(u_max), input.bit_size); + let opcode = BrilligOpcode::BinaryIntOp { destination: result.address, op: BinaryIntOp::Sub, bit_size: input.bit_size, - lhs: max, + lhs: max.address, rhs: input.address, }; self.push_opcode(opcode); - self.deallocate_register(max); + self.deallocate_single_addr(max); } /// Processes a foreign call instruction. @@ -757,17 +799,17 @@ impl BrilligContext { } /// Returns a register which holds the value of a constant - pub(crate) fn make_constant(&mut self, constant: Value, bit_size: u32) -> MemoryAddress { - let register = self.allocate_register(); - self.const_instruction(register, constant, bit_size); - register + pub(crate) fn make_constant(&mut self, constant: Value, bit_size: u32) -> SingleAddrVariable { + let var = SingleAddrVariable::new(self.allocate_register(), bit_size); + self.const_instruction(var, constant); + var } /// Returns a register which holds the value of an usize constant - pub(crate) fn make_usize_constant(&mut self, constant: Value) -> MemoryAddress { + pub(crate) fn make_usize_constant(&mut self, constant: Value) -> SingleAddrVariable { let register = self.allocate_register(); self.usize_const(register, constant); - register + SingleAddrVariable::new_usize(register) } /// Computes left % right by emitting the necessary Brillig opcodes. @@ -781,16 +823,22 @@ impl BrilligContext { /// to other binary instructions. pub(crate) fn modulo_instruction( &mut self, - result_register: MemoryAddress, - left: MemoryAddress, - right: MemoryAddress, - bit_size: u32, + result: SingleAddrVariable, + left: SingleAddrVariable, + right: SingleAddrVariable, signed: bool, ) { // no debug_show, shown in binary instruction let scratch_register_i = self.allocate_register(); let scratch_register_j = self.allocate_register(); + assert!( + left.bit_size == right.bit_size, + "Not equal bitsize: lhs {}, rhs {}", + left.bit_size, + right.bit_size + ); + let bit_size = left.bit_size; // i = left / right self.push_opcode(BrilligOpcode::BinaryIntOp { op: match signed { @@ -799,8 +847,8 @@ impl BrilligContext { }, destination: scratch_register_i, bit_size, - lhs: left, - rhs: right, + lhs: left.address, + rhs: right.address, }); // j = i * right @@ -809,15 +857,15 @@ impl BrilligContext { destination: scratch_register_j, bit_size, lhs: scratch_register_i, - rhs: right, + rhs: right.address, }); // result_register = left - j self.push_opcode(BrilligOpcode::BinaryIntOp { op: BinaryIntOp::Sub, - destination: result_register, + destination: result.address, bit_size, - lhs: left, + lhs: left.address, rhs: scratch_register_j, }); // Free scratch registers @@ -900,9 +948,9 @@ impl BrilligContext { constant: usize, ) { let const_register = self.make_usize_constant(Value::from(constant)); - self.memory_op(operand, const_register, destination, op); + self.memory_op(operand, const_register.address, destination, op); // Mark as no longer used for this purpose, frees for reuse - self.deallocate_register(const_register); + self.deallocate_single_addr(const_register); } /// Utility method to perform a binary instruction with a memory address @@ -914,10 +962,16 @@ impl BrilligContext { op: BinaryIntOp, ) { self.binary_instruction( - lhs, - rhs, - destination, - BrilligBinaryOp::Integer { op, bit_size: BRILLIG_MEMORY_ADDRESSING_BIT_SIZE }, + SingleAddrVariable::new_usize(lhs), + SingleAddrVariable::new_usize(rhs), + SingleAddrVariable::new( + destination, + BrilligContext::binary_result_bit_size( + BrilligBinaryOp::Integer(op), + BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, + ), + ), + BrilligBinaryOp::Integer(op), ); } @@ -974,7 +1028,7 @@ impl BrilligContext { /// Utility method to transform a HeapArray to a HeapVector by making a runtime constant with the size. pub(crate) fn array_to_vector(&mut self, array: &BrilligArray) -> BrilligVector { let size_register = self.make_usize_constant(array.size.into()); - BrilligVector { size: size_register, pointer: array.pointer, rc: array.rc } + BrilligVector { size: size_register.address, pointer: array.pointer, rc: array.rc } } /// Issues a blackbox operation. @@ -987,47 +1041,48 @@ impl BrilligContext { /// And the radix register limb_count times to the target vector. pub(crate) fn radix_instruction( &mut self, - source: MemoryAddress, + source_field: SingleAddrVariable, target_vector: BrilligVector, - radix: MemoryAddress, - limb_count: MemoryAddress, + radix: SingleAddrVariable, + limb_count: SingleAddrVariable, big_endian: bool, ) { - self.mov_instruction(target_vector.size, limb_count); + assert!(source_field.bit_size == FieldElement::max_num_bits()); + assert!(radix.bit_size == 32); + assert!(limb_count.bit_size == 32); + let radix_as_field = + SingleAddrVariable::new(self.allocate_register(), FieldElement::max_num_bits()); + self.cast_instruction(radix_as_field, radix); + + self.cast_instruction(SingleAddrVariable::new_usize(target_vector.size), limb_count); self.usize_const(target_vector.rc, 1_usize.into()); self.allocate_array_instruction(target_vector.pointer, target_vector.size); - let shifted_register = self.allocate_register(); - self.mov_instruction(shifted_register, source); + let shifted_field = + SingleAddrVariable::new(self.allocate_register(), FieldElement::max_num_bits()); + self.mov_instruction(shifted_field.address, source_field.address); - let modulus_register: MemoryAddress = self.allocate_register(); + let modulus_field = + SingleAddrVariable::new(self.allocate_register(), FieldElement::max_num_bits()); self.loop_instruction(target_vector.size, |ctx, iterator_register| { // Compute the modulus - ctx.modulo_instruction( - modulus_register, - shifted_register, - radix, - FieldElement::max_num_bits(), - false, - ); + ctx.modulo_instruction(modulus_field, shifted_field, radix_as_field, false); // Write it - ctx.array_set(target_vector.pointer, iterator_register, modulus_register); + ctx.array_set(target_vector.pointer, iterator_register, modulus_field.address); // Integer div the field ctx.binary_instruction( - shifted_register, - radix, - shifted_register, - BrilligBinaryOp::Integer { - op: BinaryIntOp::UnsignedDiv, - bit_size: FieldElement::max_num_bits(), - }, + shifted_field, + radix_as_field, + shifted_field, + BrilligBinaryOp::Integer(BinaryIntOp::UnsignedDiv), ); }); // Deallocate our temporary registers - self.deallocate_register(shifted_register); - self.deallocate_register(modulus_register); + self.deallocate_single_addr(shifted_field); + self.deallocate_single_addr(modulus_field); + self.deallocate_single_addr(radix_as_field); if big_endian { self.reverse_vector_in_place_instruction(target_vector); @@ -1052,16 +1107,24 @@ impl BrilligContext { ctx.usize_op_in_place(index_at_end_of_array, BinaryIntOp::Sub, 1); ctx.memory_op( index_at_end_of_array, - iterator_register, + iterator_register.address, index_at_end_of_array, BinaryIntOp::Sub, ); - ctx.array_get(vector.pointer, index_at_end_of_array, end_value_register); + ctx.array_get( + vector.pointer, + SingleAddrVariable::new_usize(index_at_end_of_array), + end_value_register, + ); // Write both values ctx.array_set(vector.pointer, iterator_register, end_value_register); - ctx.array_set(vector.pointer, index_at_end_of_array, start_value_register); + ctx.array_set( + vector.pointer, + SingleAddrVariable::new_usize(index_at_end_of_array), + start_value_register, + ); }); self.deallocate_register(iteration_count); @@ -1077,13 +1140,12 @@ impl BrilligContext { } /// Type to encapsulate the binary operation types in Brillig -#[derive(Clone, Copy)] +#[derive(Clone, Copy, Debug)] pub(crate) enum BrilligBinaryOp { - Field { op: BinaryFieldOp }, - Integer { op: BinaryIntOp, bit_size: u32 }, - // Modulo operation requires more than one opcode - // Brillig. - Modulo { is_signed_integer: bool, bit_size: u32 }, + Field(BinaryFieldOp), + Integer(BinaryIntOp), + // Modulo operation requires more than one brillig opcode + Modulo { is_signed_integer: bool }, } #[cfg(test)] diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/brillig_variable.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/brillig_variable.rs index 48ad3c5bae4..b94f8140ddd 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/brillig_variable.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/brillig_variable.rs @@ -5,12 +5,24 @@ use serde::{Deserialize, Serialize}; use crate::ssa::ir::types::Type; +use super::BRILLIG_MEMORY_ADDRESSING_BIT_SIZE; + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Copy)] pub(crate) struct SingleAddrVariable { pub(crate) address: MemoryAddress, pub(crate) bit_size: u32, } +impl SingleAddrVariable { + pub(crate) fn new(address: MemoryAddress, bit_size: u32) -> Self { + SingleAddrVariable { address, bit_size } + } + + pub(crate) fn new_usize(address: MemoryAddress) -> Self { + SingleAddrVariable { address, bit_size: BRILLIG_MEMORY_ADDRESSING_BIT_SIZE } + } +} + /// The representation of a noir array in the Brillig IR #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Copy)] pub(crate) struct BrilligArray { diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs index dd57f0c4426..e32ce6f6b92 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs @@ -1,7 +1,7 @@ //! This module contains functions for producing a higher level view disassembler of Brillig. use super::BrilligBinaryOp; -use crate::brillig::brillig_ir::{ReservedRegisters, BRILLIG_MEMORY_ADDRESSING_BIT_SIZE}; +use crate::brillig::brillig_ir::ReservedRegisters; use acvm::acir::brillig::{ BinaryFieldOp, BinaryIntOp, BlackBoxOp, HeapArray, HeapVector, MemoryAddress, Value, ValueOrArray, @@ -83,23 +83,11 @@ impl DebugToString for BinaryIntOp { impl DebugToString for BrilligBinaryOp { fn debug_to_string(&self) -> String { match self { - BrilligBinaryOp::Field { op } => op.debug_to_string(), - BrilligBinaryOp::Integer { op, bit_size } => { - // rationale: if there's >= 64 bits, we should not bother with this detail - if *bit_size >= BRILLIG_MEMORY_ADDRESSING_BIT_SIZE { - op.debug_to_string() - } else { - format!("i{}::{}", bit_size, op.debug_to_string()) - } - } - BrilligBinaryOp::Modulo { is_signed_integer, bit_size } => { + BrilligBinaryOp::Field(op) => op.debug_to_string(), + BrilligBinaryOp::Integer(op) => op.debug_to_string(), + BrilligBinaryOp::Modulo { is_signed_integer } => { let op = if *is_signed_integer { "%" } else { "%%" }; - // rationale: if there's >= 64 bits, we should not bother with this detail - if *bit_size >= BRILLIG_MEMORY_ADDRESSING_BIT_SIZE { - op.into() - } else { - format!("{op}:{bit_size}") - } + op.into() } } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/entry_point.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/entry_point.rs index 9d186f9bc60..83440e4a51d 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/entry_point.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/entry_point.rs @@ -79,9 +79,9 @@ impl BrilligContext { let rc_register = self.make_usize_constant(1_usize.into()); let flattened_size = BrilligContext::flattened_size(argument); let var = BrilligVariable::BrilligArray(BrilligArray { - pointer: pointer_to_the_array_in_calldata, + pointer: pointer_to_the_array_in_calldata.address, size: flattened_size, - rc: rc_register, + rc: rc_register.address, }); current_calldata_pointer += flattened_size; @@ -218,7 +218,7 @@ impl BrilligContext { self.mov_instruction(nested_array_pointer, flattened_array_pointer); self.memory_op( nested_array_pointer, - source_index, + source_index.address, nested_array_pointer, acvm::brillig_vm::brillig::BinaryIntOp::Add, ); @@ -253,8 +253,8 @@ impl BrilligContext { BrilligParameter::Slice(..) => unreachable!("ICE: Cannot deflatten slices"), } - self.deallocate_register(source_index); - self.deallocate_register(target_index); + self.deallocate_single_addr(source_index); + self.deallocate_single_addr(target_index); } } @@ -323,11 +323,11 @@ impl BrilligContext { self.flatten_array( item_type, *item_count, - pointer_to_return_data, + pointer_to_return_data.address, returned_pointer, ); - self.deallocate_register(pointer_to_return_data); + self.deallocate_single_addr(pointer_to_return_data); return_data_index += BrilligContext::flattened_size(return_param); } BrilligParameter::Slice(..) => { @@ -412,7 +412,7 @@ impl BrilligContext { self.memory_op( flattened_nested_array_pointer, - target_index, + target_index.address, flattened_nested_array_pointer, acvm::brillig_vm::brillig::BinaryIntOp::Add, ); @@ -436,8 +436,8 @@ impl BrilligContext { BrilligParameter::Slice(..) => unreachable!("ICE: Cannot flatten slices"), } - self.deallocate_register(source_index); - self.deallocate_register(target_index); + self.deallocate_single_addr(source_index); + self.deallocate_single_addr(target_index); } } @@ -449,7 +449,7 @@ impl BrilligContext { flattened_array_pointer, item_count, ); - self.deallocate_register(item_count); + self.deallocate_single_addr(item_count); } } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs index cbaeb2477d6..e785212f8d2 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs @@ -92,7 +92,7 @@ impl FunctionBuilder { let index = self .current_function .dfg - .make_constant(FieldElement::from(i as i128), Type::field()); + .make_constant(FieldElement::from(i as i128), Type::length_type()); let element = self.insert_array_get(value, index, typ[0].clone()); self.add_to_data_bus(element, databus); } diff --git a/noir/noir-repo/compiler/noirc_frontend/src/hir/def_collector/dc_crate.rs b/noir/noir-repo/compiler/noirc_frontend/src/hir/def_collector/dc_crate.rs index 8ea9d475539..0c53bff4a54 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/hir/def_collector/dc_crate.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/hir/def_collector/dc_crate.rs @@ -328,11 +328,6 @@ impl DefCollector { // Must resolve structs before we resolve globals. errors.extend(resolve_structs(context, def_collector.collected_types, crate_id)); - // We must wait to resolve non-integer globals until after we resolve structs since struct - // globals will need to reference the struct type they're initialized to to ensure they are valid. - resolved_globals.extend(resolve_globals(context, other_globals, crate_id)); - errors.extend(resolved_globals.errors); - // Bind trait impls to their trait. Collect trait functions, that have a // default implementation, which hasn't been overridden. errors.extend(collect_trait_impls( @@ -350,6 +345,11 @@ impl DefCollector { // over trait methods if there are name conflicts. errors.extend(collect_impls(context, crate_id, &def_collector.collected_impls)); + // We must wait to resolve non-integer globals until after we resolve structs since struct + // globals will need to reference the struct type they're initialized to to ensure they are valid. + resolved_globals.extend(resolve_globals(context, other_globals, crate_id)); + errors.extend(resolved_globals.errors); + // Resolve each function in the crate. This is now possible since imports have been resolved let mut functions = Vec::new(); functions.extend(resolve_free_functions( diff --git a/noir/noir-repo/compiler/noirc_frontend/src/parser/parser/function.rs b/noir/noir-repo/compiler/noirc_frontend/src/parser/parser/function.rs index 7c365e7eb5a..06e1a958eb1 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/parser/parser/function.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/parser/parser/function.rs @@ -66,7 +66,7 @@ fn visibility_modifier() -> impl NoirParser { /// function_modifiers: 'unconstrained'? (visibility)? /// -/// returns (is_unconstrained, visibility, is_open) for whether each keyword was present +/// returns (is_unconstrained, visibility) for whether each keyword was present fn function_modifiers() -> impl NoirParser<(bool, ItemVisibility)> { keyword(Keyword::Unconstrained) .or_not() diff --git a/noir/noir-repo/test_programs/execution_success/global_consts/src/main.nr b/noir/noir-repo/test_programs/execution_success/global_consts/src/main.nr index 3c8ecc67a0c..52ffe3e823b 100644 --- a/noir/noir-repo/test_programs/execution_success/global_consts/src/main.nr +++ b/noir/noir-repo/test_programs/execution_success/global_consts/src/main.nr @@ -107,3 +107,20 @@ mod my_submodule { x } } + +struct Foo { + a: Field, +} + +struct Bar {} + +impl Bar { + fn get_a() -> Field { + 1 + } +} + +// Regression for #1440 +global foo = Foo { + a: Bar::get_a(), +}; diff --git a/noir/noir-repo/tooling/debugger/ignored-tests.txt b/noir/noir-repo/tooling/debugger/ignored-tests.txt index 231d4d897a9..854e284dd43 100644 --- a/noir/noir-repo/tooling/debugger/ignored-tests.txt +++ b/noir/noir-repo/tooling/debugger/ignored-tests.txt @@ -6,6 +6,7 @@ brillig_to_bytes_integration debug_logs double_verify_nested_proof double_verify_proof +double_verify_proof_recursive modulus references scalar_mul diff --git a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap b/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap index 96808f69b15..b633b08695d 100644 --- a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap +++ b/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap @@ -9,18 +9,18 @@ exports[`ContractClass creates a contract class from a contract compilation arti "selector": { "value": 2381782501 }, - "bytecode": "0x1f8b08000000000000ffed9d07741d45b6ae5bb61ce0481893b3450e06a3e49c64724ec6608c31b62c0b1b0739623298e8886d72b041ce39639cb331cc0c732727263030c3a47b67eeacb7dedcf7ee5befb15ed739b5977e95ab8f754497fc1fa97aad92aaf7a9eefdd5dfbbab5375d73f8320c8095253f3305d101c3ec9ef65fa7fe1b79b8a625c57a14bce9c2ce16c96259ccdb38433374b385b640967cb2ce16c95259cadb384f3981839155bb3a0f61437efb10e748d9b3191659ae66581a6f959a6e97159a0699b203bdaa8e3b384b36d96709e90259c276609e74959c2797296709e92259ca76609e76959c2797a96709e91259c676609e75959c2797696709e93259cedb284b3204b38cfcd12cef3b284f3fc2ce1bc204b382fcc12ce8b62e46c0f9c17ebff97e8ff97eaff97e9ff52f672fdff0afdbf83ae63ae9ebf527185493da429367e2b095369983a86a993f15be730750953d73075d3bf15e8dfba87a947987a86a957987a6b0dfa84e9aa305d1da66bc2746d98ae0bd3f561ba214c3786e9a630dd1ca65bc2746b986e0bd3ed61ba234c7786e9ae30f50dd3dd61ea17a67bc2746f98fa87e9be300d3058ee0fd3c0303d10a641617a304c83c334244ce5611a1aa68a300d0b5365981e0ad3f0308d08d3c3611a19a651611a1da63161aa0ad3d8308d0bd3f8304d08d3c4304d0ad323619a1ca647c3f458981e37347b224c4f86e9a9303d6d703e13a667c334254ccf85e9f930bd10a617c3f452985e0ed3d4304d0bd3f430cd08d3cc30cd0ad32b619a1da639619a1ba657c3f45a985e0fd31b617a334c6f85e9ed30bd13a677c3f45e98e685697e98ded72cb2237c10a6ea302d08d3c2302d0ad3e2302d09d3d2302d0bd3f230ad08d3ca30ad0ad3ea30ad09d3da30ad0bd3fa306d08d3c6306d0ad38761da1ca68fc2b4254c5bc3b42d4cdbc3b4234c3bc3b42b4cbbc3b4274c7bc3b42f4cfbc374204c07c3f471980e85e993307d1aa6ef84e9bb61fa5e983e0bd3f7c3f46f86e63f08d30fc3f4a330fd58db7ea2ffff549795fb773f0bd3cf75fe17faff2ff5ff5fe9ff9f1bcbfc3a4cbf316cbf0dd3ef0cdb1761fabdce7fa9ff7fa5ffff41ffffa3feffb5feff27fdffcffaff5ff4ffbfeaff7fd3ffff5dffff0ffdffeffaff3ff4ffffd4ffff19a6070a52f9d641cd5416c4d4469556269ffd88f81707b527a54573fd9bfc2fd0f65c3d2fff45bb167abe85616fa9e75b1aeb69ade75b1bf6b67abead613f51cf9f68d84fd6f3271bf653f5fca986fd023d7f01d81301dc1bd676656bae4d396093786d06b616dad61c6c2d6575606ba56d2dc026dbb725d88ed1b656603b56db5a832da16dc7889661cad3b6b220ae58291ca2d69b1ff77af5f3b2e3e2e71daad6dbc611eff1f1f30e53eb6deb8057c5c7097a5dc743dc9ca86d6dc17692b69d00b693b5ed44b09da26d2781ed546d3b196ca769db29603b5ddb4e05db19da761ad8ced4b6d3c17696b69d01b6b3b5ed4cb09da36d6781ad9db69d0db6026d3b076ce76a5b3bb09da76d05603b5fdbce05db05da761ed82ed4b6f3c17691b65d0036697f2f049b9c2f5ea46daaed38260796d17669b792cb489b0db64ba5bd06db65d25683adbdb4d360bb1c7c8bed0a686bc4d641dba4dd52bf75d3f9b220aefda4b852adb77bdceb0dd7acd6db33fef5269f39f60a6a742d033fdd41abde3a1f63bfa622f49da393f8117b2ee46f82b2524ef490638fb0ab634c0f9def9d66b96ec672f950a687a5fe6541bcf5ef69f0f434985b40de4dcc9694f898adf39471ccf687b266ecc97950638cd95b81c341cc76f6315be729e398ad84b266ecc9b970638cd9fb81c341cc96bb89d9e2421fb3a9fb6641608f3db91e6a8c313b0238e28fd98e3e66eb3e651cb3cf415933f6e49ab831c6ec64e0883f663b97fb73833a4f19c7ec1c286bc69edc9f698c31fb22703888d94adfced679ca3866df87b266ecc9bdc2c618b3af0147fc31dbd551cc96f8980d52cf4083c01e7b72dfba31c6ec02e0883f6687fafbb3759f328ed9ed50d68c3d7986d21863769dceabe70c3fd1cf19ce02db4fb5ed6ce08d3fb62b3a3a8aed621fdba9be2141608f51799ed718637b8fceab38fe05f44710db2fb5ed5cb0fd4adbce03dbe7da763ed4cbc13e50eef7813a4f19ef03bf81b2662ccbb3e5c6b80ffc08381cc46c858fd93a4f19c7ecdfa0ac197bd2cfa131c6ec17c0e120662b7dccd679ca3866ff37943563ef129d6f8c312b7d4dd5f9c297fa7ce132b07da56dedc1f6076dbb1c6c7fd4b62bc0f6b5b67500db9fb4ed4ab0fd59db0ac1f6176d2b02db5fb5ad186c7fd3b612b0fdbbb69582ed3fb4ad23d8feae6d9dc0f60f6deb0cb6ffd4b62e60fba7b675d536f5bc4bfa5ec9796b6b602d0be2dbb609d045a61c63be0cf2c56e790af381077d95c6efab44d5bd24a87bdd4b81a7a383ba27c0475d783a024fa7f879927d513bc7bfdee4362e31344d80af12a8571707f5ca015fb26e99177ff960c3fdbc8b85b16bfc8cc539e04bd62df35d81516cd8eec8fb3fb2ffa8b6f9dc9c1a5e07fb52f2f88cfeca8043fce542997fb5ab297ba166cb83dfb10dee64d81cc565322ec497ac5be6c55f1ed4a753c33316d795b1a3c1e8aa8dc8015fb26ed3771ee48bdcea9396a733896f07e7ddd6364d34efde00bebb1abe4b0ddfd876ca94eed8d6159863bffed1c7b61ef1afb710cf95e53a45fce0f9035e4fc45527f42dd729e247ecb990bf21a7a6ac94133da41d1676b50fcbb6447673b92ec672f950a6bba5fe6541bcf5ef61f0f43098d5f1a6271c0b1dec0fc918e86e70c87c2968d72342bbeea09d94b904b47370ee99d4ae9bc123f31d8147da6f6ccf8a1a98a788c0379ec3e2b59cfc8ee701aeb65791c128f3b6edd515183b5a181d9c1316a73b1e9602a3d8ba014f8923cda2b66b09896f17d79539e043cecdcd6b9b5c28737bf39ab215394ed98af1dc59a6ba5ef3c6bf9d8a0b71ffa80b8fe37da8c8513c16e2fd9b6f827863cd6c97ccf626ea1e8fabb6bcc4e09179f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f59f1c8f304ecb725e53a91309afddf5cdde74f7e8b4faf0b9f01fdcb697fb0e2427cf627fd202e33ea9c0b654e6c56c3f6dfd01fccec4b14b52d5df48d4db72dc51ff6076b886788a5068fe93bcfa20f3e9746cd5cf58132db0c99c7fe69a25f11f0b8da1f8b0d1ed337b61925a49a45b5b3aefaf445c599ad3f61416cbe8b87ba7aaeabbe7ba6be1d6a1ebf3a199a26bf496ad8549b7457f39a7abb78ce9be973673c6e483ecee7b8d82f037dc5dfce16d7ea9fd02ca87dacc05877d5574bf62be91bd1ddf09d0b65ce6d56b36d7ac0ef65c1e1c7062c23eb96f9cb60d91ec6badbb8ab6fda7e28dd815bf22d8dba75066e2973111cbb7fa6f38e8e81c599be2381c7e4f88f2fa9fe222519f0e0f1cec5398ba3e36821c663dcfd45cc7e90b6f36529837d481df4df4d7b2c167f9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec99f999158ff90c1d9ffd96923036501f9be4f30cf93e1b3e17dbd2acc6afeb6780f2cca9bd51677c473917de51dea1d9b0ef037e57cab62d5d3d5b8bda96e28fadef439e451fa5590f8b660ebeeb98f69b1df88d44d1af07f0b8da1fa3bedd616b338a48358b6a675df45d481767b67e0a05b1f94ef51771f15c57fa8b98c72ff3bb46d84f426cf81c3cea7b61c586ed68b701b67e6d92c76f2eb818e306e3d9ec2b28feb09fc4175a5be927117f3b505ce8f21821fba8f40929b1d455cafcb1594dd93fe93cf6152a8575fdcbf2bb4ce9fa24609beae0fbb1c9ed2beb92ed6bfb766d1f608dc97711ae2b47a73e8606b990ff9fcd6aca4a39292b5a0bbbda47e4bb52c86e2ed7d1582e1fcaf4b2d4bf2c88b7fee6b7847b1bcc2a76fe0a71f62f38d773d526f58ad0e832d048cae039afab7eb5661b69f699c63e91ad8c32787e2a65fe1fb451517dd26d7d2a5d9d2f44f5e7c4f305db398d5947b3ef7853ef0f98afaf435cf4079475b7096af7c90b8cf5b787f50b57ab20fad82265dac2fa8fe677af6cd77ec28bfd0da5cc2970ed7783ce6772ed77b4aee36dd77eb85c54ddb15d88fbd888f1882cf8bd48295360c4638f08eeae9665cf8f5856b432bf7d88d7a5788e10ff772353ed4d6fa32eb24fe1f7fda5cca5c67e13ff3953eafcd3d53732655dd206155bea2a653ac0be56a8f309d84ef84e516fcbef32a53bff14fd549daf8abfcec9ed7bb55e976cdfab2cbeaf01d6987c17a16f39ff143f62cf857c2f389e4839d143b41676b58fc8391cb29bcb753796cb87327d2cf52f0be2adff5506cf5506b38a9d1288b3def0ae85abb6ba4f8446ed41232983f7ae6ddf35b6ddeb68a8f354f37be9f9c1e1dfeec5e3a49b7336fbbb72e6fd5bdbf9497b831fcf4f6e85763661296bde9796e5e2ec9f8eef03e17921be0fe4ea1a293fa8ad67bec1e1d2771bc3779b06f4ddd6f0ddb6017d7bcdbde64c9a338df983cf219b01a38b631d1e57ebc2683bfe35074657ef6c9664c088dfbcc6e39d30baf84e787dc714c2739d16c0e8e27de34cef57770246fcc68030ba78473bd3ef54e37bdbb25c2b607431ae118ea1541746db5847ade1bf83718d8aea3b0e088e75740c30ba181b2411d41ecfe4488cdd8051963b16185d3c474a04b5efab1d89119f57ca7209c78ce98eed8efbfe14677a0fa221fa15449d6ba06f07f7ff8bb16f425db4e8e99627edb90ffa7670ff2ba9058e6579242df0f99c8bb1351341ed676147e2c16788b2dc09c058e688b177068c65c028cb9d088c7d1c319665c0d80718c57e12303ab80f9964ec930123deaf93e54e06c6ab1d315e9501e3d5c028cb9d028c2eee2926c06f5d18af014659ee5460bcd611e33519305e0b8cb2dc69c0789d23c66b3360bc0e1865b9d381f17a478cd765c0783d30ca726700e30d8e18afcf80f1066094e5ce04c61b1d31de9001e38dc028cb9d058c373962bc3103c69b8051963b1b186f76c47853068c3703a32c770e30dee288f1e60c186f014659ae1d30deea88f1960c186f054659ae00186f73c4786b068cb701a32c772e30deee88f1b60c186f074659ee3c60bcc311e3ed1930de018cb2dcf9c078a723c63b3260bc131865b90b80f12e478c7766c0781730ca721702635f478c7765c0d8171865b98b80f16e478c7d3360bc1b18fb5a18fb3962bc3b03c67ec028cb5d0e8cf7c4cf98bc96ee9701e33dc0736ffc3c49cdeec980e75eb73cc96f28de63f1755ffcbe92dba27f50f7badf073c03e2e7496e8bfb32e011867c580e35bb3f7ec6a466033260bc1f7806c6cf93d4ecfe0c78068266f75b347b207ec6a4660333607c007806c5cf93d4ec810c780681660f58347b307ec6a4668332607c107806c7cf93d4ecc10c780607359a3d68d16c48fc8c49cd0667c0380478cae3e7496a3624039e72d06c8845b3a1f13326352bcf807128f054c4cf93d46c68063c15a0d9508b66c3e2674c6a569101e330e0a98c9f27a9d9b00c782a41b36116cd1e8a9f31a95965068c0f01cff0f879929a3d9401cf70d0ec218b6623e2674c6a363c03c611c0f370fc3c49cd4664c0f3306836c2a2d948478c0f67c038d2c213f737d11fb6f81aeda8eea382bad75d18f26139ec2731c611e3e80c18c700a32c87fd24aa1c318ec980b10a1865b98463c674fd24aac0f7d8f87d27dba5aaa0eefa8c75cb93b69f04fa1ee7488bb141ddb518e796276d3f09f43dde9116e382ba6b311e782638d022013eeac2230cf9b01cf69398e8887142068c13815196c37e12931c314ecc80711230ca72d84fe211478c9332607c04186539ec2731d911e32319304e0646590efb493cea887172068c8f02a32c87fd241e73c4f868068c8f01a32c87fd241e77c4f858068c8f03a32c87fd249e70c4f878068c4f00a32c87fd249e74c4f844068c4f02a32c87fd249e72c4f864068c4f01a32c87fd249e76c4f854068c4f03a32c87fd249e71c4f874068ccf00a32c87fd249e75c4f84c068ccf02a32c87fd24a638627c3603c629c028cb8d74cc98eefa654a23f71d75add2d87d475d973476df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c33f97ece81ef04f89029c7982f83bc30e4c372233d63a366449e82f8780ab1eee8eb7982ba3f6fe1c9715477f4f50241dd8521db189fcb02c69159c0e8754cf541ac0fa3e279d111cf0b19f0bc083c2f39e27931039e9780e7e5f8799231f552063cc2900fcb8dcc02c6e7b280d1ebe8756462f43a361d1d3da367f48c9ef1683066431bee19b3221e8bebcba878a6c6cf93d4ece50c78a68266b2dcbd6e198bebcba878a6c5cf93d46c6a063cd340b3a916cd1c3016d79751f14c8f9f27a9d9b40c78a68366d32c9a39602cae2fa3e299113f4f52b3e919f0cc00cda65b3473c0585c5f46c533337e9ea4663332e099099acdb068e680b1b8be8c8a6756fc3c49cd6666c0330b349b69d1cc0163717d1915cf2bf1f324359b9501cf2ba0d92c8b660e188bebcba87866c7cf93d4ec950c78668366af583473c0585c5f46c533277e9ea466b333e099039acdb668c6ca38320b189fcb0246c73a16d79751f1cc75c43327039eb9c0f3aa239eb919f0bc0a3cafc5cf938ca95733e011867c586e6416303e97058c5e47af2313a3d7b1e9e8e8193da367cc8cf1f92c60f4dbda33b2323ab8be4afb0ecdab8ddc77d43b348ddd77d43b348dddb78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74cbe5f8fdf7771a6efb0be0e3c2edea97554cf42b5de37f4babe89513fa5d59b8656af1a5ae543993740bf371de897037e65dd322ffe3265be9880d991efe2e3c2751c03f5171fcf197a28ff6f39aa7b545bff5623f71dd5d63776df516d7d63f7ede3dcc77953f0ede3dcc77953f0ede3dcc7398b6fcce70635e7edf27d25b58eb775be859e97f2cfc37252a65fabd4ff3681df875cf8f6fb903f563405df3ece7d9c3705df3ece7d9c3705df3ecef9e21ce3e1ea06e0090c9e200dcf93643c9dc978c692f10c25e3b9878ce726329e5e643c93c9788ac9786692f13c4cc6f31219cf20329e3bc978ae25e3b9828ce769329eae643ce3c9788691f1dc47c6730b194f1919cf63643ca5643cb3c8784693f1bc4cc633988ca72f19cf0b643cd793f13c4bc6d39d8c673619cfa5643c13c9782e21e379888ca7908ce77e329ee3c878da90f1dc46c6731519cf13643c9dc8785e21e3a922e3994ac6534ec6d38f8ce74a329e1bc9787a92f1cc25e379848ca7888c670419cf03643c7790f13427e3b9868ce729329e2e643ce3c878da93f15490f14c23e3e94fc67333194f6f329e47c9784ac8784691f13c48c67317194f437c8f23139e29643cd791f13c43c6d38d8c670219cf74329e8bc9782ac9780690f1e491f1e493f17420e3b9958ca70f19cfe3643c1dc978c690f10c21e3b99b8ce745329e1bc8787a90f1cc21e39944c633838c673819cf40329ecbc8788e27e3694bc6733b194f0e014f2238fc1bc909f8fd75b0353396559f95ea5650f3fb3bdade0c967957e79b5bd6fd0ed8e45b55ef5a96459dde81ba94e97ce1b79b923aa1af3298177f79c0f12e09cfed643c6dc9788e27e3b98c8c672019cf70329e19643c93c878e690f1f420e3b9818ce745329ebbc9788690f18c21e3e948c6f338194f1f329e5bc9783a90f1e493f1e491f10c20e3a924e3b9988c673a19cf04329e6e643ccf90f15c47c633858ce775329ebbc8781e24e31945c65342c6f328194f6f329e9bc978fa93f14c23e3a920e3694fc6338e8ca70b19cf53643cd790f13427e3b9838ce701329e11643c45643c8f90f1cc25e3e949c6732319cf95643cfdc878cac978a692f15491f1bc42c6d3898ce709329eabc8786e23e36943c6731c19cffd643c85643c0f91f15c42c633918ce752329ed9643cddc9789e25e3b99e8ce705329ebe643c83c9785e26e3194dc6338b8ca7948ce731329e32329e5bc878ee23e31946c6339e8ca72b19cfd3643c5790f15c4bc6732719cf20329e97c8781e26e39949c6534cc633998ca71719cf4d643cf790f10c25e3194bc6d3998ce749329eab2d3caf3be291f7dd65dd32ff3a896f07dba150adf73d47759aa7d7d552af57f8c55f2e94293a36f55f3d1fc26585cbfc3e01f6fd9e071abdeda82ee6989832ff7623f7ddc6f0dda689f86e6bf86edb447cfb38f771cee47b5efcbe8bf1db3632e518f36590c7e38b8b6f0239aa67ad63fb3731eaa7b49a6f68f5b6a1553e94790ff49bef403fdbf982cc8bbf4c992f2660c6b82808e28d8bf7e3af53b1ea4b730ce8fabea12fd6eb03479a461d433e68e4bea38e218ddd77d431a4b1fbf671eee3bc29f8f671eee3bc29f8f671eee39cc977b5cec778dd58883ed4bd5fb91ea806bf0b753e2746bf6a5d0bf4ba5ae8750bc742e09132afc2bd68bfcffb7d3e2edffed8e6e3bc29f8668e73332fcf102f013657cf78a362b1219e2f1f4ddf51b1d8d87d47c56263f7ede3dcc73993ef45f1fb4e3e437c3da83da57b86b808781638d0c2513d93d74e8b8d3abd6ed4291fca54433d173ba8670ef89575cbfc62d80ed9c6ac78a6e83c8eef22e5a690308a6d815b9ee4fe3525a83da5dbbf16038f83fda0c8513d93fbd712a34e532cba4b996aa8e71207f5b4ed3b32bf04b643b6312b1e797757581350ee051246b12d72cb93dcbf5e086a4fe9f6af25c0e3a2fd7154cfe4feb5d4a8d30b16dda54c35d473a9837adaf61d995f0adb21db98158f8c6522ac0928f72209a3d816bbe5294d409d654ab77f2d051e17ed8fa37a26f7af65469d5eb4e82e65aaa19ecb1cd4d3b6efc8fc32d80e9ed933db98158fbc3329ac0928f71209a3d89638e5292d4c409d654ad78e2d031e17edbc23dd93edd872a34e2f59749732d550cfe50eea69db77647e396c874c98e76521737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc0c3a2b9e97755e581350ee651246b12d75cb937c7fe7e5a0f69463cc97417e39f02c73a08fa37a26fbbdaf30eaf4b2457729530df55ce1a09eb67d47e657c076c884795e16325767213383ce8a67aace0b6b02ca4d256114db32b73cc9766c6a507b4ad78ead001e17edbca37a26dbb195469da65a749732d550cf950eea69db77647e256c07cfec996dcc8a679ace0b6b02ca4d236114db72a73cc5c9f710a705b5a774edd84ae071d1ce3bd23dd98ead32ea34cda2bb94a9867aae72504fdbbe23f3ab603b64c23c2f0b99abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c6466d059f14cd779614d40b9e9248c625be194a724f9dc617a507b4af7dc6115f0b8782ee348f7e47387d5469da65b749732d550cfd50eea69db77647e356c87c6ce3c2f0b99ab3d738330fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c731433436c289e193a2fac0928378384516c2bddf224bf7b3023a83da5ebb7b31a785639d0c7513d93fd76d618759a61d15dca54433dd738a8a76ddf91f935b01d3cb367b6312b9e993a2fac0928379384516cabdcf224dbb19941ed295d3bb606785cb4f38eea996cc7d61a759a69d15dca54433dd73aa8a76ddf91f9b5b01d3cb367b6312b9e593a2fac0928378b84516cabddf224dbb15941ed295d3bb616785cb4f38eea996cc7d619759a65d15dca54433dd739a8a76ddf91f975b01d3cb367b6312b9e57745e581350ee151246b1ad71cb539c803acb94ae1d5b073c2eda7947f54cb663eb8d3abd62d15dca54433dd73ba8a76ddf91f9f5b01db28d59f1ccd679614d40b9d9248c625beb9627b97fcd0e6a4fe9f6aff5c0e3a2fd7154cfe4feb5c1a8d36c8bee52a61aeab9c1413d6dfb8ecc6f80ed906dcc8a678ece0b6b02cacd216114db3ab73cc9fd6b4e507b4ab77f6d001e17ed8fa37a26f7af8d469de658749732d550cf8d0eea69db77647e236c876c63563c73755e5813506e2e09a3d8d63be649409d654ab77f6d041e17ed8fa37a26f7af4d469de65a7497321f403d3739a8a76ddf91f94dc023d3d5c0e32a2e038327b0e823d393643c9dc978c692f10c25e3b9878ce726329e5e643c93c9788ac9781e26e31944c6732719cfb5643c5790f13c4dc6d3958c673c19cf30329efbc8786e21e32923e3798c8ca7948c673419cf60329ebe643cd793f13c4bc6d39d8ce752329e89643c0f91f11492f1dc4fc6f30119cf71643c6dc8786e23e3b98a8ce709329e4e643c55643ce5643cfdc878ae24e3b9918ca72719cf23643c45643c23c8781e20e3b9838ca73919cf35643c4f91f17421e31947c6d39e8ca7828ca73f19cf7c329e9bc9787a93f13c4ac65342c6338a8ce741329ebbc878ae23e379868ca71b19cf04329e8bc9782ac9780690f1e491f1e493f17420e3b9958ca70f19cfe3643c1dc978c690f10c21e3b99b8ce706329e1e643c93c8788693f10c24e3b98c8ce778329eb6643cb793f1e410f02482c3dfc54bc0eff3c126ef8ccd05db873abf016ccd2c3ee459c426b0e5eabcaca35598ae2d387cdda893abf7e4d05719cc8bbf3ce0f89084e776329eb6643cc793f15c46c633908c673819cf24329e1e643c3790f1dc4dc633848c670c194f47329ec7c978fa90f1dc4ac6d3818c279f8c278f8c6700194f2519cfc5643c13c878ba91f13c43c6731d19cf5d643c0f92f18c22e32921e379948ca73719cfcd643cf3c978fa93f15490f1b427e31947c6d3858ce729329e6bc8789a93f1dc41c6f30019cf08329e22329e47c8787a92f1dc48c67325194f3f329e72329e2a329e4e643c4f90f15c45c6731b194f1b329ee3c8783e20e3b99f8ca7908ce721329e89643c9792f17427e379968ce77a329ebe643c83c9784693f19492f13c46c65346c6730b19cf7d643cc3c878c693f17425e3799a8ce70a329e6bc978ee24e31944c6f330194f3119cf64329e5e643c3791f1dc43c633948c672c194f67329e27c978aeb6f0cc77c4638e9b20f3f3097cabf9eea08b9a12f03b7e67fd03478cf30d4699ff001891d7b5666d0c9e36866647d3b7aabfbcab23f7c0717be17be70cdbab4d0368d6d6e0696b6876347d2b2de4d9b6bc3388db0bbf53cbb0bdf0bd6a07ed7369c2e051538e315f06f94d8ef57154cf427ceffa9b18d7abb4da6c6835dfd02a1fca6c04fd363bd02f07fccaba655efc7966cf1cc5ac78a42f89ed7b00fd4818c586e3627c143f4f69c2e05153baf6f123c7fa38aa67b21ddb12d875ff0874973218ab5b1cd43307fccaba657e8bc5774110af165beba0c5560bcfd606d642fc65cabc310b991974563cf2ae81b026a05c7f1246b16d069e6df1f394260c1e35a56b1fb739d6c7513d936dc2f6c0aefb36d05dcae0feb5dd413d73c0afac5be6b7c376c884794b16327b9debc7ac78e41d6d614d40b901248c62db0a3c3b62e7292e4c183c6a4ad78eed70ac8f9b7aa6dab19d815df71da0bb94c1fd6ba7837ae6805f59b7ccef84ede0993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999b59f10cd479614d40b981248c62db0e3cbb62e7493d77401e35a57beeb0cbb13e6eea997aeeb03bb0ebbe0b74973218abbb1dd43307fccaba657e376c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a6790ce0b6b02ca0d226114db4ee0d9133f4f69c2e05153bae70e7b1cebe3a89ec9e70e7b03bbee7b40772983b1bad7413d73c0afac5be6f7c276d8eb993db38559f10cd679614d40b9c1248c62db0d3cfb62e7493d3f451e35a56bc7f639d6c74d3d53edd8fec0aefb3ed05dca60acee7750cf1cf02beb96f9fdb01d3261de9285cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7b9e9e8ac78ca755e581350ae9c84516c7b81e740ec3c25850983474d39c67c19e40f38d6c74d3d53cf1d0e0676dd0f80ee5206f7af830eea99037e65dd327f10b6436367de9285cc3e361a86d9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a398196243f154e8bcb026a05c0509a3d8f603cfc7f1f394260c1e35e518f36590ffd8b13e8eea99ecb77328b0ebfe31e82e6570ff3ae4a09e39e057d62df387603b7866cf6c63563c953a2fac09285749c228b683c0f349fc3cc50983474de9dab14f1cebe3a89ec976ecd3c0aefb27a0bb94c158fdd4413d73c0afac5be63f85ed906dcc8a67b8ce0b6b02ca0d276114db21e0711077499e7c8347e63f21f0ade6ab743e4fffc7ed55058c0cdb2bbf01346b63f0b431343b9abe55fdc7eafc71fa3f6eafb1c0c8b0bdda3480666d0d9eb6866647d3b7d2629cce1fafffe3f61a078c0cdbabad5b9ee284c1a3a674e71b9f02cf77e3e7495ec77d9a01cf7781e73bf1f31439aa67a15aeff7803daef52aad3e33b4fad4d02a1fca20c3670ef4cb01bfb26e99177f9ed9334731635b28ac0928f70909a3d8be033c2eda0d55f72bf4ba64fd2dc2f4c3136bfcbab8bf86f7165aeaf50a87f8cb853267b7ab61fba966cb83df65bba9fa1c346c8ede792bb2dde79579f19717d8aff55ddd438dbaf77010780e5a34db6fd16c9f23c6fd06a3ccef0346db7ddefd8e78a2ee3b8b3f6c330e926a86ef011f001e57e7c55171e67a9fcbf4fcf28085e79bf8780a3136d0978b58c5b6ad2e75b7ed3b31d6bd089f61a12f07fb40f238d541af4bd6af8e05ff75a253cd4bb17d90e35407a3ceb950e6bfcfa961fb3f698e53cd82c3ef0b1768bb9491dfbfd176731d057add32df5dffc738119b3f06d67e8ed8ddd0924d33dcb73eb6e8d8c3c2dd83801be3b121b675d4bd0fdcd63d0c1dd934c36dfd8945c79e16ee9e04dc8cfb754f434736cd8eb45ff7b370f723e066dcaffb193ab26976a4fdbabf85bb3f0137e37edddfd0914db323edd7032cdc0308b819f7eb01868e6c9a1d69bf1e68e11e48c0cdb85f0f347464d3ec48fbf5200bf720026ec6fd7a90a1239b6647daaf075bb807137033eed78383da3ab26976a4fdbadcc25d4ec0cdb85f971b3ab26976a4fdbac2c25d41c0cdb85f57183ab26976a4fdbad2c25d49c0cdb85f571a3ab26976a4fd7ab8857b380137e37e3ddcd0914db323edd75516ee2a026ec6fdbacad0914db323edd7632ddc6309b819f7ebb1868e6c9a1d69bf1e67e11e47c0cdb85f8f337464d3ccb65f3bea5f96713fe48f9dea931a7f3693f7b0b02f898b98721407858efa9a24fb21ef33b4fad8d00abfebbf1ff473d5272baadf98f8f3cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccf8cef79e2f31529d710ef00d785516cf84ccac57d7e55f72bf5ba64fd2dc274fbc9357ee37f6e519c7c0e20facbfb98571a75ce8532dbcfae61ebabd9f0f9223e17b56dcbfdb1d7a16eef9ce37bfaf82ce8683eef3c60d16c9f45b3bd8e18cd3643e6f702a3e8b70f785ced8ffb0d1ed3b7eddd7036cda2da5957711f156736df05b1f92e1eeae65b08c585ea1b6dc70487b7275207dc775dc461a6df04c0fdc2c173f72257efffab3aed35ea74d0a8533e94b918eab9d7413debba6fc97435f0b86a8f028327b0e8235333329e27c9783a93f18c25e3194ac6730119cf3d643ca791f1dc44c6730c194f2f329ec9643cc5643c0f93f10c22e36947c6732719cf89643cd792f1e492f15c41c6f334194f57329ef1643cc3c8782e22e33944c6733919cf7d643c6790f1dc42c69320e32923e3798c8ca7948c673419cf60329e73c978fa92f19c4cc6733d194f4b329e67c978ba93f14c24e3b9948ce721329e4bc8780ac978ee27e3398b8ce736329ee3c878da90f15c45c6f304194f27329e2a329e72329ef3c978fa91f19c4ac6732519cf8d643cadc9787a92f13c42c65344c633828ce701329e73c878ee20e339818ce71a329ee6643c4f91f17421e31947c6d39e8ca7828ce742329efe643ca793f1dc4cc6732c194f6f329e47c9784ac8784691f13c48c65340c6731719cf49643cd791f1b420e371fd1e60a63ccf90f17423e39940c65349c6733119cf00329e33c9786e25e3c923e3c927e3e940c6d3878ce771329e8e643c63c8788690f19c47c6733719cf29643c3790f1b422e3e941c633898c673819cf40329eb3c9782e23e3b99d8ce778329eb6643c39043c89e0f06f31e1f7bf0e826dafcee3b7059b59d627cf85a5bc3a0edd5a70f8ba9b59d6bdcfc2803aed096aea52a6f385df6e4aea84beca605efce501c73e129eb6643cc793f1dc4ec6731919cfd9643c03c9788693f14c22e3e941c6d38a8ce706329e53c878ee26e3398f8c670819cf18329e8e643c8f93f1f421e3e940c6934fc69347c6732b19cf99643c03c8782e26e3a924e39940c6d38d8ce719329e03643c2dc878ae23e339898ce72e329e02329e07c9784691f19490f13c4ac6d39b8ce758329e9bc9784e27e3e94fc67321194f05194f7b329e71643c5dc8789e22e3694ec6730d19cf09643c7790f19c43c6f30019cf08329e22329e47c8787a92f1b426e3b9918ce74a329e53c978fa91f19c4fc6534ec65345c6d3898ce709329eabc878da90f11c47c6731b19cf59643cf793f11492f15c42c6f31019cfa5643c13c978ba93f13c4bc6d3928ce77a329e93c978fa92f19c4bc633988c6734194f2919cf63643c65643c09329e5bc878ce20e3b98f8ce772329e43643c1791f10c23e3194fc6d3958ce769329e2bc87872c978ae25e339918ce74e329e76643c83c8781e26e32926e3994cc6d38b8ce718329e9bc8784e23e3b9878ce702329ea1643c63c9783a93f13c49c6d38c8ce76a83077f57e7d6f27ed85eb0c9efcfeac6ab8d5e9794916722eaded26ec3a6eabbcb517d7707355319ccef82fa0afb6ee0d9ed88678fc163face837c0fd06ca761538c3b1c31ee3418657e07308a7e3b8167a7239e5d068fe93b0ff23d41b3ed864d316e73c4b8dd6094f96dc028fa6d079eed8e7876183ca6ef3cc8f703cdb61a36c5b8c511e3568351e6b700a3e8b71578b63ae2d966f098bef320df1f34fbc8b029c6cd8e183f3218657e33308a7e1f01cf478e78b6183ca6ef3cc80f00cd3e346c8a719323c60f0d4699df048ca2df87c0f3a1239ecd068fe93b0ff20341b38d864d316e70c4b8d16094f90dc028fa6d049e8d8e7836193ca6ef3cc80f02cdd61b36c5b8ce11e37a8351e6d701a3e8b71e78d63be2d960f098bef3203f18345b6bd814e31a478c6b0d46995f038ca2df5ae059eb88679dc163face837c3968b6dab029c6558e18571b8c32bf0a1845bfd5c0b3da11cf1a83c7f49d07f90ad06ca561538c2b1c31ae3418657e05308a7e2b8167a5239e55068fe93b0ff295a0d972c3a6189739625c6e30cafc326014fd9603cf72473c2b0c1ed3771ee48783664b0d9b625ce28871a9c128f34b8051f45b0a3c4b1df12c33784cdf7990af02cd161b36c5b8c811e3628351e61701a3e8b71878163be25962f098bef3203f16345b68d814e302478c0b0d46995f008ca2df42e059e8886791c163face83fc38d0acdab029c60f1c31561b8c32ff01308a7ed5c053ed886781c163face837c5fb0096f11d8ded7f962b0cdd7f912b0cdd3f952b0bda7f31dc1f6aece7702db3b3adf196c6feb7c17b0bda5f35dc1f6a6ce7703db1b3adf0b6cafeb7c6fb0bda6f365607b55e7fb806daece5f05b6393a7f35d866ebfc35607b45e7af05db2c9dbf0e6c3375fe7ab0cdd0f91bc0365de76f04db349dbf096c5375fe66b0bdacf3b780ed259dbf156c2feafc6d607b41e76f07dbf33a7f07d89ed3f93bc13645e7ef02db489dbf1b6cf7eafc3d60fb54e7ef03db7774fe7eb07d57e71f00dbf774fe41b07da6f343c0f67d9d1f0ab67fd3f96160fb81ce3f04b61feafc08b0fd48e71f06db8f757e14d87ea2f3a3c1f6539d1f03b69fe9fc78b0fd5ce72780ed173a3f116cbfd4f94960fb95ce3f02b6cf757e32d87eadf38f82ed373aff18d87eabf38f83ed773aff04d8bed0f927c1f67b9d7f0a6c5feafcd360fb4ae79f01db1f74fe59b0fd51e7a55d53edec9f74be2088b79dfd3aa8990ac0b7f85365feacf3ad8c32b26c2e9429d51ff451cf38d4b74ca51d967659d9a41d7e1f6cd20ecf079bb4c3f3c026edf07b609376f85db0493bfc0ed8a41d7e1b6cd20ebf05366987df049bb4c36f804ddae1d7c156a6f3af814ddae157c126edf05cb0493b3c076cd20ecf069bb4c3af804ddae1596093767826d8a41d9e01366987a7834ddae169609376782ad8a41d7e196cd20ebf043669875f049bb4c32f804ddae1e7c126edf073609376780ad8647ff91a6cd2368f049bb4cdf7824ddae64fc1266df377c0266df377c1266df3f7c0266df3676093b6f9fb6093b6f9dfc0266df30fc0266df30fc1266df38fc0266df38fc1365ae77f0236699b7f0a36699b7f0636699b7f0e36699b7f0136699b7f0936699b7f0536699b3f079bb4cdbf069bb4cdbf019bb4cdbf059bb4cdbf039bb4cd5f804ddae6df834ddae62fc1266df357607b56e7a5ad6e0d367956aca6c26f39e1383ccdc097309505f1b6fd389541fe19a8bb4cd3c878c692f1bc41c6730119cf72329e65643ca791f17c48c6b3898ce718329ebd643c7bc8785e21e379978c6710194f3b329e13c97872c978ae20e3a926e3798d8ce722329e43643c9793f19c41c6b3918c670319cf52329e25643c09329edd643cbbc8783e20e39949c6f33619cf60329e73c9784e26e36949c6d39d8ce752329eb9643c9790f12c26e35944c65348c6731619cf7a329e75643cf3c9788e23e36943c6b3938c670719cf74329eafc978aac878de24e32927e3399f8ca71f19cfa9643c5792f1b426e3e949c6339b8c672119cf02329ef7c878ce21e3594bc6b3868ce704329eed643cdbc8789a93f14c25e31947c6f33a194f7b329e0a329e0bc978fa93f19c4ec6732c19cf14329e59643cef90f1fc818ca7808c673519cf2a329e93c878b692f16c21e36941c673808ce755329e4a329ef7c9780690f19c49c69347c6934fc6d3818c672419cf0c329eb7c878ce23e35949c6b3828ce714329e8fc8783693f1b4d2ff59787a90f1cc21e3194ec6338f8c672019cfd9643c9791f11c4fc6d3968c27878027011c01d8e4f7e660fb4ae70f814dbed773006c5fea7c35d87eaff3cf82ed298bad99854f18be029bbc6bfd34d8e4fecc97609377387e0f36392e8a7f35dfb7e070fe66b08cf8696ee1477fbfb770491eb7b72c5316c4bbbdd1575970f8f794f280e369129eb6643cc793f15c46c6733619cf40329e79643cc3c978e690f1f420e36945c6b3998ce723329e53c8785690f1ac24e3398f8ce72d329e19643c23c9783a90f1e493f1e491f19c49c633808ce77d329e4a329e57c9780e90f1b420e3d942c6b3958ce724329e55643cabc9780ac878fe40c6f30e19cf2c329e29643cc792f19c4ec6d39f8ce742329e0a329ef6643caf93f18c23e3994ac6d39c8c671b19cf76329e13c878d690f1ac25e339878ce73d329e05643c0bc9786693f1f424e3694dc6732519cfa9643cfdc878ce27e32927e379938ca78a8ce76b329ee9643c3bc8787692f1b421e3398e8c673e19cf3a329ef5643c6791f11492f12c22e3594cc6730919cf5c329e4bc978ba93f1b424e339998ce75c329ec1643c6f93f1cc24e3f9808c671719cf6e329e0419cf12329ea5643c1bc8783692f19c41c6733919cf21329e8bc8785e23e3a926e3b9828c27978ce744329e76643c83c878de25e379858c670f19cf5e329e63c8783691f17c48c6731a19cf32329ee5643c1790f1bc41c633968c671a194f330bcf21473c72ac9475cbfc2102dfea3d5cb917bf57ff4fc0ef387e73b523c64306a3cc5703a3d8f6004f77473cbb0c9e5d162d8e966fa5857cfb63b7fe9f80dff17b85ae62aabbc128f3b698da053c3d1cf1ec30787658b4385abe9516d2f751fa9024e0771c0fcf554cf5301865de1653389e6b4f473cdb0c9e6d162d8e966fa585f435943efc09f81dc7bf7415533d0d4699b7c5148ed7d5cf11cf1683678b458ba3e55b6921ef9ec93bcb09f81dc713721553fd0c4699b7c5148e0fd1df11cf668367b3458ba3e55b6921df92906f2225e077fcbebfab98ea6f30cabc2da6f0fbc8031cf16c32783659b4385abe9516f2ad3ab9664fc0eff87d5b573135c06094795b4c6d029e818e7836183c1b2c5a1c2ddf4a8b413a2fcfe012f0fb2060741553030d4699b7c5d406e019e488679dc1b3cea2c5d1f2adb418acf3d2273301bf0f0646573135c86094795b4cad039ec18e78d6183c6b2c5a1c2ddf4a8b729d97770613f07b3930ba8aa9c106a3ccdb620ac7df2d77c4b3cae05965d1e268f9565ac8bbf7abf5ff04fc8ee3710e76c4586e30cafc6060141b8ef756e1886785c1b3c2a2c5d1f2adb4906f69c9371813f03b8e8fe52aa62a0c4699b7c5148e7752e9886799c1b3cca2c5d1f2adb418aef3cbf5ff04fc3e1c185dc554a5c128f3b6985a063ccb1cf12c31789610f9565ac8bb70d2872d01bf5701e372478c5131b51c18c5b604789638e25964f02c22f2adb4906739f2ce45027e1f0b8c4b1d3146c5d4526014db22e019eb886781c1b3c0a2c5d1f2adb4906fc72cd4ff13f03b8ed7bec811e3588351e61701a3d81600cf02473c51f7f01ac277d4fda886f01d756fa5217c47dd276808df51f7d81bc277d4f55b43f88eba166908df51f7191ac277d4397d43f88e7abedd10bea39ed53684efa8e78e8d7dfff6c792a6752c399aed5a533d96f8f69cb33d1f17bfefe24450fb9a464d39c67c19e4f1fa65a1032d1cd5b310af09bf8971bdb66bf8058656f95006af515d5dff8d3378645efc652333c6454e7cbe0b13e043de515636b9d7f23ed8e41ec77cb0c93d907960937b68ef814dee67bd0b36b9dff50ed886ebfc48b0c9bd4bec8f24f736b781ad5ce7b11fcc609ddf0236794e84fd2fe459df66b0c9f35a7cee2fcfdc37814dfa4de0f366e9fbb2016cd27f099f734a1fb47560937e84f87cad5ae7d7804dc694c0e73a5feafc2ab07da5f3f83c41c6ea5c01b627757e0ad8bed0f9afc1f684ce2f00dbef741eeff93caef363c1f65b9d7f1b6cbfd1f9b7c0f698cebf09b647757e2fd87eadf37bc03659e7b17fe8e73abf0b6c8fe83cf64bfc95ceef00db2f75fe0db04dd2f9d7c13651e75f03db2f74fe55b04dd0f9b960fbb9cecf01db789d9f0db69fe9fc2b60fba9cecf02db189d9f09b69fe8fc0cb08dd6f9e9601ba5f3d3c0f6639d9f0ab68775fe0f60fb91ce8f035b339d5f0436f97e32ded395771697804dc629c17bf5f2ad922ab0c9f87bcbc0d65ae7f1b98cbc97341c6cf26dfb4ab0c9fbff1560933192cac126e3380d069b7c0b6c10d8e47b6503c12663960e009b8cabda1f6cf2ede27e6093f7297b824dc608e90136f98e4a77b0c9d8773826b07cefb21a6cf24e108e132cdfddff126cf26ef9576093f19b704c60f9c6d59360937149bf00db393aff04d8e47dcddf81ad40e71f07dbb93aff5bb09da7f3bf019b7cbff231b0c93b358f824dbea3ff6bb0c9bbd993c176b1ce7f0eb64b74fe11b0c977887e0536192bf697606baff393c026efcc4f04db153aff0bb0c9586713c026df57fd39d8e41b5fe3c156a4f33f035bb1ceff146c253a3f066ca53aff13b075d4f9d160eba4f3a3c0d659e77f0cb62e3aff30d8baeabcb4336a7f56fbf9413d5f16c4775ea6fc7d1cd49ed25d1b0803f2c479ae9d0f3ce86b7fec752f4e9ed7cb7edf4caf5762683ff8de1bbbefd435c53ebdae167abd7b0ddfb950e653dd88e0f573ae5eee80b11c969175cbfc95b0ec1e63dd6d747df739aaef5e8349b8f7019394f9ecec9ab24fe8c6b2352c13235bf2fa58622d000d712a83bc30b8d1aab810cf7bebc2b30f78e2df4f52d7eb2e6202f7adb8afd7cd7b4c66ace54399bda0df1e07fae1be2eeb9679f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f59f1c8f3047cae2ce50e92308a6d3ff0ec8b9fa7109fc3cafad5739d07e0b9cefed8fdd67ebed752afb7d0a8732e9459794e0ddb109dcf83df65bb456dcbbdb1d721fdb6147f79509f7dc0e3605b2679f61b3ca6ef3c8b3e4ab33d16cd763b6234db0c99df0d8c7b757e0ff0b8da1ff71a3ca66f6c33f6916a16d5cebae897902ece6c7d100a62f35d3cd4d5735dd5674af5e5308f5f070d4db10f84d8f039781e2cf389fe9f007d3e017d8e661b60f64bc076ea6360dc1b3b6371ad67c0d2f65f69688a7d205ed4da4a1f88f8db81e24297c708d947cdbe15585729331d8e7333751efb011d8475bd67f95da61c63be0cf2d8a6ee8cbfcec9ed2bfd5765fbeeb4f8de0eac31f9aef52e478e4ee247ecb9907ff79c9ab2524ef410ad851dc7ad427673b98f8de5f2a1cc2e4bfdcb8278ebbfd3e0d96930abd8990d71f61e9cebb96a937645687425682465f09cd7419f226b1b291ce24f9591eddfca2883e7a7526611b451aa2ed2ce4b3db11f131e035c9d2f1c34ea27f378be603ba731eba8e2e3f6936b785d5f0b340bec5ab3f4f5db04edc51ef8bd2cf8f67dfd36410cd9ce4b65fd85b07ee16a15441f5ba4cc16e338eae27a12b7a5a9e73e6092323ba01dfa1ff5b8ae3b5ad7e851d775bb1cf0e0b5864ce98eef788c71d1be38aa67a1edd8b5c7a8533e94b918eae9e03c26ed3ba93bc1b78b6d8e5ac839d45e438b5c28f37da3ed88d251d681f701dcd6a5d87a3e5868a98b94f989d14eed70c0e472bbe179965aef7e4b5da5cc2fa1fdfb1ccee7f7eadfb12dfdabe57799d2b507f84df9adf1d739b97de5fd46d9be5b2dbe3f02d6987cd7fa26859cef8b1fb1e742fe2f70fc9672a287682dec6a1f91f73b91dd5c6eafb15c3e94d966a97f59106ffdb71a3c5b0d66153bbf8538fb2b9cefbb6a37b7456854081a49197c5660de6fc17b2778dc6fa8eb02993f008c62db09fafe0fa7f7cb536c070c36f37eb9ed7cb0d0e0c7f3c1ff05ed6cc252d6fd7380d4b90dd64bea1118750d8cba3a3a7f2dcd31f42c033f1dc0be57e74567f90dcf71a54c4ebbd47f77f7af6adfc7166ea9073eafdb6d70ef3174c57b512d815bc5bd796d81e7e98eaf694bf15ccc3c1fda0dec52260fd86de771872c75318fd3cd82c3af05bf31cae27576bae5ccfc016319bc67b0dfc2646bfb627b2fa7a8b0d0e4b7b57b070d669baeb21f60ccc9bacc7d05cf87a4cc99b0dd1296b2aa4dfaaf136bf491ed88f7da6df7595c1d2fa2eeb3883fc5687b67d2c5338ca6f86e5aebd8d6dbb5dcf69c8dbd3f436b231f8fefe20a3c56a4d362b785c7d53dcd282d765b7cc7a745a7a1b676cea6c52e0b8fab6bcc282d76597cc7a845a5edde824d8b9d161e57d71a515aecb4f88e4f8bceb5ee6ba4d362878527fe7b1ae9b5c067629930ef22606e6de4e3f15d5a6e7b7667d362bb85c7d5b3bb282db65b7cc7a7455127db35bb4d8b6d169e6d0dacc5368beff8b4e8d2d5764fc5a6c5560b8f83fb6b69b5d86af11d635c0cc3fb6be9b4d862e1d9d2c05a6cb1f88ef1fcb053ba7b86a8c547161e57f7fea2b4f8c8e23b462d8628df9beba0c5660bcfe606d662b3c5777c5a947754be3fac83161f5a783e6c602d3eb4f88e4f8b215d94ef4d75d06293856753036bb1c9e23bc66ba8645c6cac83161b2d3c1b1b588b8d16dff16951913cd7da50072d3658783634b0161b2cbee3d3a230794c5d5f072dd65b78d637b016eb2dbe638c8be4f5e4ba3a68b1cec2b3ae81b55867f11de3712419176beba0c55a0bcfda06d662adc5777c5a5426ef3fada983166b2c3c6b1a588b3516df31de7349c6c5ea3a68b1dac2b3ba81b5586df11d9f1625c963eaaa3a68b1cac2b3aa81b55865f11d9f16c392cfc456d6418b95169e950dacc54a8bef18cf3b93edc58a3a68b1c2c2b3a281b55861f11de37967f2fec5f23a68b1dcc2b3bc81b5586ef11d63db993cef5c56072d9659785c8d1119a5856d7cca18cf3b935a2cad83164b2d3caec6368cd262a9c5778ce79dc9e3c8923a68b1c4c2e36a2cca282d6ce360c61817c9b673711db4586ce159dcc05a2cb6f88ef1be56b2ed5c54072d1659785c8dcd11a5c5228bef18af4792f7f816d6418b85169e850dacc5428bef189f1525cfc117d4418b05169e050dacc502f0bd2f76dfa9fedce243fa625d6168910b65be6bf4c58ad251d681efd0625daa63af4baa5fd9071175a986ba48991f1a7df93e70c0e4a8aec998795faf4bfaa67f6ca9ab94f959bb9ab2bfd0f9046c9343b0ae3f597e9729c7982f83bce8a7ea3c2ffe3a276355c60192ed3bcfe2fb5d608dc97711faced149fc883d17f25fb7ab292be5440fd15ad8d53e325fe791dd5c6e81b15c3e94996fa97f59106ffde7193cf30ce6e47b0f106712476edaae14d3fc088dae008da40cf6d93be488e763834738c45f4e70f8bba8524696c57751ff61f4db957e9052cfa83e92ef3baa5f541f49f117f52eaa5947151f3f84be9f322e888c19a26c32064809aca7b3615375ede2a8aee24bd62df35d8051c624e9dcf08cc57565ec64302a9e6e0e34c37156644a77bce8063c5d1df038aa67f238d4dda85317a34ef95006df6deceea09e39e057d62df3ddc1b78b6d8e5ac831f952438b5c28935790fa2fe78f513aca3a54fc76b6d4c5958e9d0c9e4e16dfbd1ceb28eb9636b15703f8ee61f8ee68f856fb36c6989ad2eddb3d80b9a70366b5dedef1afb710cf19259ec54f47a8531fd020ae3ae1bae41cb38fa16d2ee4cf2fa8292be5a4ac1c3b855ded47b22d91dd5cae9bb15c3e94e965a97f59106ffd7b1b3cbd0d6675de705a410d8783fd211903bd0c0e99ef08daf58ed0ae17682765f0d8dbc991763d0d1e99ef043c727ed51d6c729e22fc09f8bda401b8cd76afbb855b6c381e61270b63c7f8198bd31d173a02a3d87a024f0f479a99dbfa52431f3c27686594916573a14c9782d47f7957cb2cabf6bb73736aead55cdb637b6f4db7e92d1de885e38106a04f6068289330b40e6ac60c8d93e7d8a0664cd00913abc60f7968d85dc3528f3d052dd7c0c4ff39966a34031be69b5b6c41507be8d35cb0c9d0a72dc0d6cc9005875c95f23274a20bb9500f5977aec1d91a58e2f48dc3c6ca942e745a018f8b5056a12343c7ead0b977fc8889c3303e5a189cf5891df55bf334e5a2d6257190eba0eec824eb9679f1a7f4c9d7f9b143868eec33fea149a3878d99380161cd9d0bf3398608e67fdb321824b833c97a5a18e21c1bbf38a53846b1c917803f9984a17550338e718c3cc94095b186870e1935ea8e49e5a3460cbd6ed298a11347548d41455b1bca45a92dbfb7049bada9c3b26ac2dd17976d65b1d9261cd5b935d8a4053f066cc2732cd89a435eca9b5bc6c93e7231ac5fc25afda6c469a12bde2aa80901392ca9f645ed43ea33aaea74400d2dad8692569b53ddb1534343abafc8a9a19fd550cf6a68673594b31aba590dd5ac86663e3b480dbdacee5e1604a9a194cf0b5243255f10a48642be08f8be0bcc9704a9d30f359471fb203554b1ba7da85e1f579f5a53efb7abd3587579ac4efdd4a58e3a0d53a75fea345bdd4250b793d4a98d3a6d54a744ea34469d96f7d65af709d35561ba3a4cd784e9da305d17a6ebc37443986e0cd34d61ba394cb784e9d630dd16a6dbc3744798ee0cd35d61ea1ba6bb83d470daf784e9de2035dcf67d416a28eefb83d430dd0f04a921bc1f0c52c37b0f0952437f0f0d52c3820f0b5243863f14a486131f11a4862a1e19a486361e1da4864756c3948f0d5243a2aba196d5b0cc6a086735b4b31a1a5a0d23ad869c564351aba1ac9f085243643f15a6a783d410dacf86694a989e0bd3f3617a214c2f86e9a530bd1ca4866557c3b5ab61dc6704a961df6705a961e2d5f0f16a587935dcbc1a865e0d4faf86ad57c3d9bf19a6b7c2f47698de09528f05d4e310f59840dd8257b788d5639aea2075fb7a61907accac1ebbab6e08aa5b86eaa6b23c48756352ddba543737d5ed4f758354dd42553759d56d5875a356ddca55377bf5da817a0d43bd96a25ed351af2da9d7b8d46b6dea353ff5aaa67af551bdcaab5e6dde1ba46e4def0f528f2bd5ed6a755b5adda257b7d03f0dd37782544c7e2f4c9f85e9fb61fab730fd204c3f0c524346abe1a5d5f0d46a286b35c4b51a0e5b0d9dad86de5643727f1ea486fa564385ff36480d37fe45987e1fa4863cff2a480d77ffc7307d1da63f85e9cf61fa4b98fe1aa6bf85e9dfc3f41f61fa7b98fe11a6ff0cd33f839a61cdb12129d0adcfb97a7ec8c489c3468f9d5830b1aa60f4a45113478c1df558c1e411138717543d326c7ce5a8aac9b8f0eff4c232267b9ff1e3873c5630624cc5b0470baa264d2ca8aa2c28af9a34a6a2d681f4ffea85ce3adce3908a8a686779cdbf05e9f1cdebe7b49d5e4e46bbbf317dddce6b5e0f412ea9cf42b7d4b34277eb23985cf2f54d9d0f164c185535b1a0b0604cf8373cf0564d1e56d1a1007f9b108a3c6162c1848943c64f2ca81c5f35baa0a803aeb7f0d87a5462eeb16e604a4eaf9f389f9c9dfa5faf107be19c7a28b0f09cfa916e3ce75b907e544fa79fd5a7863faecf42ff554fc2a05da42c1326954f1c3f64e8c4e8855b7c9b8513edea51cd33dad5af9adfa98fb31fd467a1bfd7933051500f679d0beaee2cf8ffd731cc2cb0020600", + "bytecode": "0x1f8b08000000000000ffed9d07741d45b6ae5bb61ce0481893b3450e06a3e49c64724ec6608c31b62c0b1b0739623298e81cc8c10639e78c718e18c3cc30393381811926dd3b7367ddf5e6be77df7a8f75bbcea9bdf4ab5c7daca3e992ff2355af5552f53ed5bdbffa7b7775aaeefa47100439416a6a1ea60b82c327f9bd4cff2ffcd7a6a218d755e89233274b389b650967f32ce1cccd12ce1659c2d9324b385b650967eb2ce13c26464ec5d62ca83dc5cd7bac035de3664c6499a67959a0697e96697a5c1668da26c88e36eaf82ce16c9b259c276409e78959c2795296709e9c259ca76409e7a959c2795a96709e9e259c676409e79959c2795696709e9d259ce7640967bb2ce12cc812ce73b384f3bc2ce13c3f4b382fc812ce0bb384f3a21839db03e7c5faff25faffa5faff65fabf94bd5cffbf42ffefa0eb98abe7af545c61520f698a8ddf4ac2541aa68e61ea64fcd6394c5dc2d4354cddf46f05fab7ee61ea11a69e61ea15a6de5a833e61ba2a4c5787e99a305d1ba6ebc2747d986e08d38d61ba294c3787e99630dd1aa6dbc2747b98ee08d39d61ba2b4c7dc3747798fa85e99e30dd1ba6fe61ba2f4c030c96fbc334304c0f846950981e0cd3e0300d095379988686a9224cc3c25419a687c2343c4c23c2f4709846866954984687694c98aac234364ce3c2343e4c13c234314c93c2f448982687e9d1303d16a6c70dcd9e08d393617a2a4c4f1b9ccf84e9d9304d09d373617a3e4c2f84e9c530bd14a697c334354cd3c2343d4c33c234334cb3c2343b4c73c234374cf3c2f44a985e0dd36b617a3d4c6f84e9cd30bd15a6b7c3f44e98de0dd3fc302d08d37b9a457684f7c3541da685615a14a6c5615a12a6a5615a16a6e5615a11a695615a15a6d5615a13a6b5615a17a6f561da10a68d61da14a6cd61fa204c5bc2f46198b686695b98b68769479876866957987687694f98f686695f98f687e940983e0ad3c1307d1ca64361fa244c9f86e95b61fa7698be13a6cfc2f4dd307dcfd0fcfb61fa41987e18a61f69db8ff5ff9fe8b272ffeea761fa99ceff5cffff85feff4bfdff7363995f85e9d786ed3761faad61fb224cbfd3f92ff5ffaff4ffdfebff7fd0ffbfd6ffffa8ffff49ffffb3feff17fdffaffaffbfe9ffffaeffff4dffffbbfeff1ffaff3fc2f440412adf3aa899ca8298daa8d2cae4b31f11ffe2a0f6a4b468ae7f93ff05da9eabe7e5bf68d742cfb730ec2df57c4b633dadf57c6bc3de56cfb735ec27eaf9130dfbc97afe64c37eaa9e3fd5b05fa0e72f007b22807bc3daae6ccdb529076c12afcdc0d642db9a83ada5ac0e6cadb4ad05d864fbb604db31dad60a6cc76a5b6bb025b4ed18d1324c79da5616c4152b8543d47af3e35eaf7e5e765cfcbc43d57adb38e23d3e7ede616abd6d1df0aaf83841afeb78889b13b5ad2dd84ed2b613c076b2b69d08b653b4ed24b09daa6d2783ed346d3b056ca76bdba9603b43db4e03db99da763ad8ced2b633c076b6b69d09b673b4ed2cb0b5d3b6b3c156a06de780ed5c6d6b07b6f3b4ad006ce76bdbb960bb40dbce03db85da763ed82ed2b60bc026edef856093f3c58bb44db51dc7e4c032da2eed56721969b3c176a9b4d760bb4cda6ab0b597761a6c97836fb15d016d8dd83a689bb45beab76e3a5f16c4b59f1457aaf5768f7bbde19ad57a7bc6bfdee433c75e418dae65e0a73b68d55be763ecd75484be7374123f62cf85fc4d5056ca891e72ec1176758ce9a1f3bdd32cd7cd582e1fcaf4b0d4bf2c88b7fe3d0d9e9e06730bc8bb89d992121fb3759e328ed9fe50d68c3d390f6a8c317b2b703888d9ce3e66eb3c651cb39550d68c3d39176e8c317b3f703888d97237315b5ce8633675df2c08ecb127d7438d3166470047fc31dbd1c76cdda78c63f639286bc69e5c1337c6989d0c1cf1c76ce7727f6e50e729e3989d0b65cdd893fb338d31665f040e07315be9dbd93a4f19c7ec7b50d68c3db957d81863f655e0883f66bb3a8ad9121fb341ea196810d8634fee5b37c6985d081cf1c7ec507f7fb6ee53c631bb03ca9ab127cf501a63ccaed779f59ce1c7fa39c35960fb89b69d0dbcf1c776454747b15dec633bd5372408ec312acff31a636cefd57915c73f87fe0862fb85b69d0bb65f6adb7960fb5cdbce877a39d807cafd3e50e729e37de0d750d68c6579b6dc18f7811f02878398adf0315be729e398fd2b9435634ffa3934c698fd02381cc46ca58fd93a4f19c7ecff81b266ec5da2f38d3166a5afa93a5ff8529f2f5c06b6afb4ad3dd87eaf6d9783ed0fda7605d8bed6b60e60fba3b65d09b63f695b21d8feac6d4560fb8bb61583edafda5602b67fd3b652b0fdbbb67504dbdfb4ad13d8feae6d9dc1f61fdad6056cffd0b6aedaa69e7749df2b396f6d0dac65417cdb3601bac89463cc9741bed82d4f613ef0a0afd2f87d95a8ba970475af7b29f0747450f704f8a80b4f47e0e9143f4fb22f6ae7f8d79bdcc62586a609f05502f5eae2a05e39e04bd62df3e22f1f6cb89f77b130768d9fb138077cc9ba65be2b308a0ddb1d79ff47f61fd5369f9b53c3eb605f4a1e9fd15f197088bf5c28f3cf7635652fd46c79f03bb6c19d0c9ba3b84cc685f89275cbbcf8cb83fa746a78c6e2ba327634185db51139e04bd66dface837c915b7dd2f27426f1ede0bcdbdaa689e6dd1bc07757c377a9e11bdb4e99d21ddbba0273ecd73ffad8d623fef516e2b9b25ca7881f3c7fc0eb89b8ea84bee53a45fc883d17f237e4d4949572a287b4c3c2aef661d996c86e2ed7c5582e1fca74b7d4bf2c88b7fe3d0c9e1e06b33adef48463a183fd211903dd0d0e992f05ed7a4468d71db493329780760ece3d93da75337864be23f048fb8ded595103f31411f8c67358bc9693dff13cc0d5f62a321865deb6bdba0263470ba38373c2e274c7c35260145b37e02971a459d4762d21f1ede2ba32077cc8b9b9796d930b656e6f5e53b622c7295b319e3bcb54d76bdef8b7537121ee1f75e171bc0f15398ac742bc7ff34d106fac99ed92d9de44dde371d59697183c322ffe3cb367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed933f3332b1e799e80fdb6a45c271246b3ff9babfbfcc96ff1e975e133a07f3aed0f565c88cffea41fc465469d73a1cc89cd6ad8fe1bfa83997d89a2b6a58bbeb1e9b6a5f8c3fe600df10cb1d4e0317de759f4c1e7d2a899ab3e50669b21f3d83f4df42b021e57fb63b1c163fac636a38454b3a876d6559fbea838b3f5272c88cd77f15057cf75d577cfd4b743cde3572743d3e437490d9b6a93ee6a5e536f17cf79337dee8cc70dc9c7f91c17fb65a0aff8dbd9e25afd139a05b58f1518ebaefa6ac97e257d23ba1bbe73a1ccb9cd6ab60df6a92b0b0e3f36601f2f59b72c73192cdbc358771b77f54ddb0fa53b704bbea551b7cec02d652e8263f74f75ded131b038d37724f0981cfff125d55fa424031e3cdeb9386771741c2dc4788cbbbf88d90fd276be2c65b00fa983febb698fc5e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333fb3e2319fa1e3b3df5212c606ea63937c9e21df67c3e7625b9bd5f875fd0c509e39b537ea8cef28e7c23bca3b351bf67dc0ef4ad9b6a5ab676b51db52fcb1f57dc8b3e8a334eb61d1ccc1771dd37eb303bf9128faf5001e57fb63d4b73b6c6d4611a96651edac8bbe0be9e2ccd64fa12036dfa9fe222e9eeb4a7f11f3f8657ed708fb49880d9f83477d2facd8b01ded36c0d6af4df2f8cd051763dc603c9b7d05c51ff693f8426b2bfd24e26f078a0b5d1e23641f953e212596ba4a993f34ab29fb479dc7be42a5b0ae7f5a7e97295d9f046c531d7c3f36b97d655db27d6ddfaeed03ac31f92ec275e5e8d4c7d02017f2ffab594d59292765456b6157fb887c570ad9cde53a1acbe543995e96fa9705f1d6dffc96706f8359c5ce5f20cefe09e77aaedaa45e111a5d061a49193ce775d5afd66c23cd3ed3d827b2955106cf4fa5ccff87362aaa4fbaad4fa5abf385a8fe9c78be603ba731eb68f61d6feafd01f3f575888bfe80b2ee3641ed3e7981b1fef6b07ee16a15441f5ba44c5b58ffd1fcee95edda4f78b1bfa1943905aefd6ed0f94caefd8ed675bcedda0f978baa3bb60b711f1b311e91056359ca1418f1d82382bbab65d9f3239615adcc6f1fe275299e23c4ffddc8547bd3dba88bec53f87d7f2973a9b1dfc47fce943aff74f58d4c5997b441c596ba4a990eb0af15ea7c02b613be53d4dbf2bb4ce9ce3f453f55e7abe2af7372fb5eadd725dbf72a8bef6b803526df45e85bce3fc58fd87321df0b8e27524ef410ad855ded23720e87ece672dd8de5f2a14c1f4bfdcb8278eb7f95c17395c1ac62a704e2ac37bc6be1aaadee13a1517bd048cae0bd6bdb778d6df73a1aea3cd5fc5e7a7e70f8b77bf138e9e69ccdfeae9c79ffd6767ed2dee0c7f3935ba19d4d58ca9af7a565b938fba7e3fb40785e88ef03b9ba46ca0f6aeb996f70b8f4ddc6f0dda6017db7357cb76d40df5e73af3993e64c63fee073c866c0e8e25887c7d5ba30da8e7fcd81d1d53b9b251930e237aff178278c2ebe135edf3185f05ca70530ba78df38d3fbd59d8011bf31208c2eded1cef43bd5f8deb62cd70a185d8c6b846328d585d136d6516bf8ef605ca3a2fa8e0382631d1d038c2ec6064904b5c733391263376094e58e054617cf911241edfb6a4762c4e795b25cc23163ba63bbe3be3fc599de8368887e0551e71ae8dbc1fdff62ec9b50172d7abae5497bee83be1ddcff4a6a8163591e490b7c3ee7626ccd4450fb59d89178f019a22c770230963962ec9d01631930ca722702631f478c651930f60146b19f048c0eee432619fb64c088f7eb64b99381f16a478c5765c0783530ca72a700a38b7b8a09f05b17c66b8051963b1518af75c4784d068cd702a32c771a305ee788f1da0c18af034659ee7460bcde11e37519305e0f8cb2dc19c0788323c6eb3360bc011865b93381f146478c3764c0782330ca726701e34d8e186fcc80f1266094e5ce06c69b1d31de9401e3cdc028cb9d038cb73862bc3903c65b8051966b078cb73a62bc2503c65b8151962b00c6db1c31de9a01e36dc028cb9d0b8cb73b62bc2d03c6db8151963b0f18ef70c4787b068c7700a32c773e30dee988f18e0c18ef044659ee0260bccb11e39d1930de058cb2dc85c0d8d711e35d1930f6054659ee2260bcdb1163df0c18ef06c6be16c67e8e18efce80b11f30ca729703e33df13326afa5fb65c0780ff0dc1b3f4f52b37b32e0b9d72d4ff21b8af7587cdd17bfafe4b6e81fd4bdeef701cf80f87992dbe2be0c7884211f9643cdee8f9f31a9d9800c18ef079e81f1f32435bb3f039e81a0d9fd16cd1e889f31a9d9c00c181f009e41f1f324357b20039e41a0d90316cd1e8c9f31a9d9a00c181f049ec1f1f324357b30039ec1418d660f5a341b123f6352b3c119300e019ef2f879929a0dc980a71c341b62d16c68fc8c49cdca33601c0a3c15f1f324351b9a014f056836d4a2d9b0f819939a5564c0380c782ae3e7496a362c039e4ad06c9845b387e2674c6a569901e343c0333c7e9ea4660f65c0331c347bc8a2d988f819939a0dcf807104f03c1c3f4f52b31119f03c0c9a8db06836d211e3c319308eb4f0c4fd4df4872dbe463baafba8a0ee7517867c580efb498c71c4383a03c631c028cb613f892a478c633260ac0246592ee198315d3f892af03d367edfc976a92aa8bb3e63ddf2a4ed2781bec739d2626c50772dc6b9e549db4f027d8f77a4c5b8a0ee5a8c079e090eb448808fbaf008433e2c87fd24263a629c9001e3446094e5b09fc424478c1333609c048cb21cf69378c411e3a40c181f0146590efb494c76c4f848068c93815196c37e128f3a629c9c01e3a3c028cb613f89c71c313e9a01e363c028cb613f89c71d313e9601e3e3c028cb613f89271c313e9e01e313c028cb613f89271d313e9101e393c028cb613f89a71c313e9901e353c028cb613f89a71d313e9501e3d3c028cb613f89671c313e9d01e333c028cb613f89671d313e9301e3b3c028cb613f89298e189fcd80710a30ca72231d33a6bb7e99d2c87d475dab3476df51d7258dddb78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74cbe9f73e03b013e64ca31e6cb202f0cf9b0dc48cfd8a81991a7203e9e42ac3bfa7a9ea0eecf5b78721cd51d7dbd40507761c836c6e7b280716416307a1d537d10ebc3a8785e74c4f342063c2f02cf4b8e785ecc80e725e079397e9e644cbd94018f30e4c37223b380f1b92c60f43a7a1d9918bd8e4d4747cfe8193da3673c1a8cd9d0867bc6ac88c7e2fa322a9ea9f1f324357b39039ea9a0992c77af5bc6e2fa322a9e69f1f324359b9a01cf34d06caa4533078cc5f565543cd3e3e7496a362d039ee9a0d9348b660e188bebcba87866c4cf93d46c7a063c3340b3e916cd1c3016d79751f1cc8c9f27a9d98c0c78668266332c9a39602cae2fa3e299153f4f52b39919f0cc02cd665a3473c0585c5f46c5333b7e9ea466b332e0990d9acdb268e680b1b8be8c8a674efc3c49cd6667c03307349b6dd1cc0163717d1915cfdcf879929acdc980672e6836c7a2192be3c82c607c2e0b181deb585c5f46c533cf11cfdc0c78e601cf2b8e78e665c0f30af0bc1a3f4f32a65ec9804718f261b99159c0f85c16307a1dbd8e4c8c5ec7a6a3a367f48c9e3133c6e7b380d16f6bcfc8cae8e0fa2aed3b34af3472df51efd03476df51efd03476df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c33f97e2d7edfc599bec3fa1af0b878a7d6513d0bd57a5fd7ebfa2646fd94566f185abd6268950f655e07fdde70a05f0ef89575cbbcf8cb94f962026647be8b8f0bd7710cd45f7c3c67e8a1fcbfe9a8ee516dfd9b8ddc77545bdfd87d47b5f58dddb78f731fe74dc1b78f731fe74dc1b78f731fe72cbe319f1bd49cb7cbf795d43aded2f9167a5eca3f0fcb49997ead52ffdb047e1f72e1dbef43fe58d1147cfb38f771de147cfb38f771de147cfb38e78b738c87ab1b8027307882343c4f92f17426e3194bc633948ce71e329e9bc8787a91f14c26e32926e39949c6f33019cf4b643c83c878ee24e3b9968ce70a329ea7c978ba92f18c27e31946c6731f19cf2d643c65643c8f91f19492f1cc22e3194dc6f33219cf60329ebe643c2f90f15c4fc6f32c194f77329e39643c9792f14c24e3b9848ce721329e42329efbc9788e23e36943c6731b19cf55643c4f90f17422e3994dc65345c633958ca79c8ca71f19cf95643c3792f1f424e39947c6f308194f1119cf08329e07c878ee20e3694ec6730d19cf53643c5dc878c691f1b427e3a920e39946c6d39f8ce766329ede643c8f92f19490f18c22e379908ce72e329e86f81e47263c53c878ae23e379868ca71b19cf04329ee9643c1793f15492f10c20e3c923e3c927e3e940c6732b194f1f329ec7c9783a92f18c21e31942c6733719cf8b643c3790f1f420e3994bc633898c670619cf70329e81643c9791f11c4fc6d3968ce776329e1c029e4470f8379213f0fb6b606b662cab3e2bd5ada0e6f7b7b5bd192cf38ece37b7acfb6db0c9b7aadeb12c8b3abd0d7529d3f9c27f6d4aea84beca605efce501c73b243cb793f1b425e3399e8ce732329e81643cc3c9786690f14c22e3994bc6d3838ce706329e17c978ee26e31942c633868ca72319cfe3643c7dc8786e25e3e940c6934fc69347c633808ca7928ce762329ee9643c13c878ba91f13c43c6731d19cf14329ed7c878ee22e379908c6714194f0919cfa3643cbdc9786e26e3e94fc6338d8ca7828ca73d19cf38329e2e643c4f91f15c43c6d39c8ce70e329e07c8784690f11491f13c42c6338f8ca72719cf8d643c5792f1f423e32927e3994ac65345c6339b8ca71319cf13643c5791f1dc46c6d3868ce738329efbc9780ac9781e22e3b9848c672219cfa5643c73c878ba93f13c4bc6733d19cf0b643c7dc9780693f1bc4cc6339a8c6716194f2919cf63643c65643cb790f1dc47c6338c8c673c194f57329ea7c978ae20e3b9968ce74e329e41643c2f91f13c4cc633938ca7988c6732194f2f329e9bc878ee21e3194ac633968ca73319cf93643c575b785e73c423efbbcbba65fe3512df0eb643a15aefbb8eea345fafaba55eaff08bbf5c2853746ceabf7a3e84cb0a97f97d02ecfb3d1f347acb515dcc313165fead46eebb8de1bb4d13f1ddd6f0ddb689f8f671eee39cc9f7fcf87d17e3b76d64ca31e6cb208fc71717df047254cf5ac7f66f62d44f69b5c0d0ea2d43ab7c28f32ee8b7c0817eb6f30599177f99325f4cc08c715110c41b17efc55fa762d597e618d0f53d435facd7fb8e348d3a86bcdfc87d471d431abbefa8634863f7ede3dcc77953f0ede3dcc77953f0ede3dcc73993ef6a9d8ff1bab1107da87bbf723d500d7e17e97c4e8c7ed5ba16ea75b5d0eb168e45c023655e817bd17e9ff7fb7c5cbefdb1cdc77953f0cd1ce7665e9e215e026cae9ef146c562433c5f3e9abea362b1b1fb8e8ac5c6eedbc7b98f7326df8be3f79d7c86f85a507b4af70c7131f02c74a085a37a26af9d9618757acda8533e94a9867a2e7150cf1cf02beb96f925b01db28d59f14cd1791cdf45ca4d216114db42b73cc9fd6b4a507b4ab77f2d011e07fb4191a37a26f7afa5469da658749732d550cfa50eea69db77647e296c876c63563cf2eeaeb026a0dc0b248c625bec9627b97fbd10d49ed2ed5f4b81c745fbe3a89ec9fd6b9951a7172cba4b996aa8e73207f5b4ed3b32bf0cb643b6312b1e19cb44581350ee451246b12d71cb539a803acb946eff5a063c2eda1f47f54cee5fcb8d3abd68d15dca54433d973ba8a76ddf91f9e5b01d3cb367b6312b1e796752581350ee251246b12d75ca535a98803acb94ae1d5b0e3c2eda7947ba27dbb115469d5eb2e82e65aaa19e2b1cd4d3b6efc8fc0ad80e9930cfcf42e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b991974563c2febbcb026a0dccb248c625be69627f9fececb41ed29c7982f83fc0ae059ee401f47f54cf67b5f69d4e9658bee52a61aeab9d2413d6dfb8eccaf84ed9009f3fc2c64aece4266069d15cf549d17d604949b4ac228b6e56e7992edd8d4a0f694ae1d5b093c2eda7947f54cb663ab8c3a4db5e82e65aaa19eab1cd4d3b6efc8fc2ad80e9ed933db9815cf349d17d604949b46c228b6154e798a93ef214e0b6a4fe9dab155c0e3a29d77a47bb21d5b6dd4699a457729530df55ceda09eb67d47e657c376c884797e1632576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8cca0b3e299aef3c29a8072d34918c5b6d2294f49f2b9c3f4a0f694eeb9c36ae071f15cc691eec9e70e6b8c3a4db7e82e65aaa19e6b1cd4d3b6efc8fc1ad80e8d9d797e1632577be60661f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e6286686d8503c33745e5813506e0609a3d856b9e5497ef76046507b4ad76f670df0ac76a08fa37a26fbedac35ea34c3a2bb94a9867aae75504fdbbe23f36b613b7866cf6c63563c33755e5813506e2609a3d856bbe549b6633383da53ba766c2df0b868e71dd533d98ead33ea34d3a2bb94a9867aae73504fdbbe23f3eb603b7866cf6c63563cb3745e5813506e1609a3d8d6b8e549b663b382da53ba766c1df0b868e71dd533d98ead37ea34cba2bb94a9867aae77504fdbbe23f3eb613b7866cf6c63563cb3755e5813506e3609a3d8d6bae5294e409d654ad78ead071e17edbca37a26dbb10d469d665b749732d550cf0d0eea69db77647e036c876c63563c73745e5813506e0e09a3d8d6b9e549ee5f7382da53bafd6b03f0b8687f1cd533b97f6d34ea34c7a2bb94a9867a6e74504fdbbe23f31b613b641bb3e299abf3c29a8072734918c5b6de2d4f72ff9a1bd49ed2ed5f1b81c745fbe3a89ec9fd6b9351a7b916dda54c35d47393837adaf61d99df04db21db9815cf3c9d17d604949b47c228b60d8e7912506799d2ed5f9b80c745fbe3a89ec9fd6bb351a77916dda5ccfb50cfcd0eea69db77647e33f0c87435f0b88acbc0e0092cfac8f424194f67329eb1643c43c978ee21e3b9898ca71719cf64329e62329e87c9780691f1dc49c6732d19cf15643c4f93f17425e3194fc6338c8ce73e329e5bc878cac8781e23e32925e3194dc633988ca72f19cff5643ccf92f17427e3b9948c672219cf43643c85643cf793f1bc4fc6731c194f1b329edbc878ae22e379828ca713194f15194f39194f3f329e2bc9786e24e3e949c6f308194f1119cf08329e07c878ee20e3694ec6730d19cf53643c5dc878c691f1b427e3a920e3e94fc6b3808ce766329ede643c8f92f19490f18c22e379908ce72e329eebc8789e21e3e946c633818ce762329e4a329e01643c79643cf9643c1dc8786e25e3e943c6f338194f47329e31643c43c878ee26e3b9818ca70719cf24329ee1643c03c9782e23e3399e8ca72d19cfed643c39043c89e0f077f112f0fb02b0c93b63f3c0f681ce6f045b338b0f7916b1196cb93a2feb6815a66b0b0e5f37eae4ea3d39f45506f3e22f0f383e20e1b99d8ca72d19cff1643c9791f10c24e3194ec633898ca70719cf0d643c7793f10c21e31943c6d3918ce771329e3e643cb792f17420e3c927e3c923e31940c65349c6733119cf04329e6e643ccf90f15c47c6731719cf83643ca3c8784ac8781e25e3e94dc6733319cf02329efe643c15643cedc978c691f17421e3798a8ce71a329ee6643c7790f13c40c633828ca7888ce711329e9e643c3792f15c49c6d38f8ca79c8ca78a8ca71319cf13643c5791f1dc46c6d3868ce738329ef7c978ee27e32924e379888c672219cfa5643cddc9789e25e3b99e8ca72f19cf60329ed1643ca5643c8f91f19491f1dc42c6731f19cf30329ef1643c5dc9789e26e3b9828ce75a329e3bc9780691f13c4cc6534cc633998ca71719cf4d643cf790f10c25e3194bc6d3998ce749329eab2d3c0b1cf198e326c8fc0202df6abe3be8a2a604fc8edf597fdf11e3028351e6df0746e475ad591b83a78da1d9d1f4adea2fefeac83d70dc5ef8de39c3f66ad3009ab53578da1a9a1d4ddf4a0b79b62def0ce2f6c2efd4326c2f7cafda41fb5c9a3078d49463cc97417eb3637d1cd5b310dfbbfe26c6f52aadb6185a2d30b4ca87329b40bf2d0ef4cb01bfb26e99177f9ed93347312b1ee94b62fb1e403f1246b1e1b8181fc6cf539a3078d494ae7dfcd0b13e8eea996cc7b60676dd3f04dda50cc6ea5607f5cc01bfb26e99df6af15d10c4abc5b63a68b1cdc2b3ad81b5107f99326fca4266069d158fbc6b20ac0928d79f84516c5b80677bfc3ca50983474de9dac7ed8ef57154cf649bb023b0ebbe1d749732b87fed7050cf1cf02beb96f91db01d3261de9a85cc5ee7fa312b1e79475b5813506e0009a3d8b601cfced8798a0b13068f9ad2b5633b1debe3a69ea9766c5760d77d27e82e6570ffdae5a09e39e057d62df3bb603b7866cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e666563c03755e5813506e2009a3d87600cfeed87952cf1d90474de99e3bec76ac8f9b7aa69e3bec09ecbaef06dda50cc6ea1e07f5cc01bfb26e99df03dbc1337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d3337b3e219a4f3c29a8072834818c5b60b78f6c6cf539a3078d494eeb9c35ec7fa38aa67f2b9c3bec0aefb5ed05dca60acee7350cf1cf02beb96f97db01df67966cf6c61563c83755e5813506e3009a3d8f600cffed87952cf4f91474de9dab1fd8ef57153cf543b7620b0ebbe1f74973218ab071cd43307fccaba65fe006c874c98b76621b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec756e3a3a2b9e729d17d604942b276114db3ee0f928769e92c284c1a3a61c63be0cf21f39d6c74d3d53cf1d0e0676dd3f02dda50cee5f071dd43307fccaba65fe206c87c6cebc350b997d6c340cb38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c333473133c486e2a9d079614d40b90a1246b11d009e8fe3e7294d183c6aca31e6cb20ffb1637d1cd533d96fe75060d7fd63d05dcae0fe75c8413d73c0afac5be60fc176f0cc9ed9c6ac782a755e581350ae9284516c0781e793f8798a13068f9ad2b5639f38d6c7513d93edd8a7815df74f40772983b1faa9837ae6805f59b7cc7f0adb21db9815cf709d17d604941b4ec228b643c0e320ee923cf9068fcc7f42e05bcd57e97c9efe8fdbab0a1819b6577e0368d6c6e069636876347dabfa8fd5f9e3f47fdc5e638191617bb56900cdda1a3c6d0dcd8ea66fa5c5389d3f5effc7ed350e1819b6575bb73cc50983474de9ce373e059e6fc7cf93bc8efb34039e6f03cfb7e2e7297254cf42b5deef007b5ceb555a7d6668f5a9a1553e944186cf1ce897037e65dd322ffe3cb3678e62c6b650581350ee131246b17d0b785cb41baaee57e875c9fa5b84e90727d6f875717f0def2db4d4eb150ef1970b65ce6e57c3f613cd9607bfcb7653f53968d81cbdf35664bbcf2bf3e22f2fb05febbbba871a75efe120f01cb46876c0a2d97e478c070c4699df0f8cb6fbbc071cf144dd77167fd8661c24d50cdf03fe08785c9d1747c599eb7d2ed3f3cb8f2c3cdfc4c75388b181be5cc42ab66d75a9bb6ddf89b1ee45f80c0b7d39d80792c7a90e7a5db27e752cf8af139d6a5e8aed831ca73a1875ce8532ff7d4e0ddbff4d739c6a161c7e5fb840dba58cfcfe8db69beb28d0eb96f9eefa3fc689d8fc31b0f673c4ee86966c9ae1bef5b145c71e16ee1e04dc188f0db1ada3ee7de0b6ee61e8c8a6196eeb4f2c3af6b470f724e066dcaf7b1a3ab26976a4fdba9f85bb1f0137e37eddcfd0914db323edd7fd2ddcfd09b819f7ebfe868e6c9a1d69bf1e60e11e40c0cdb85f0f307464d3ec48fbf5400bf740026ec6fd7aa0a1239b6647daaf0759b807117033eed7830c1dd9343bd27e3dd8c23d98809b71bf1e1cd4d6914db323edd7e516ee72026ec6fdbadcd0914db323edd71516ee0a026ec6fdbac2d0914db323edd79516ee4a026ec6fdbad2d0914db323edd7c32ddcc309b819f7ebe1868e6c9a1d69bfaeb27057117033eed755868e6c9a1d69bf1e6be11e4bc0cdb85f8f357464d3ec48fbf5380bf738026ec6fd7a9ca1239b66b6fdda51ffb28cfb217fec549fd4f8b399bc87857d495cc494a3382874d4d724d90f79bfa1d5c78656f85dff03a09fab3e5951fdc6c49f67f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b667e667ccf139faf48b9867807b82e8c62c367522eeef3abba5fa9d725eb6f11a6db4faef11bff738be2e47300d15fdec7bcd2a8732e94d971760d5b5fcd86cf17f1b9a86d5b1e88bd0e757be71cdfd3c7674147f379e74716cdf65b34dbe788d16c33647e1f308a7efb81c7d5fe78c0e0317ddbde0d67d32caa9d7515f7517166f35d109befe2a16ebe85505ca8bed1764c70787b2275c07dd7451c66fa4d00dc2f1c3c772f72f5febfaad33ea34e078d3ae543998ba19efb1cd4b3aefb964c57038fabf6283078028b3e323523e379928ca73319cf58329ea1643c1790f1dc43c6731a19cf4d643cc790f1f422e3994cc6534cc6f33019cf20329e76643c7792f19c48c6732d194f2e19cf15643c4f93f17425e3194fc6338c8ce722329e43643c9793f1dc47c6730619cf2d643c09329e32329ec7c8784ac9784693f10c26e339978ca72f19cfc9643cd793f1b424e379968ca73b19cf44329e4bc9781e22e3b9848ca7908ce77e329eb3c8786e23e3398e8ca70d19cf55643c4f90f17422e3a922e32927e3399f8ca71f19cfa9643c5792f1dc48c6d39a8ca72719cf23643c45643c23c8781e20e339878ce70e329e13c878ae21e3694ec6f314194f17329e71643cedc9782ac8782e24e3e94fc6733a19cfcd643cc792f1f426e379948ca7848c671419cf83643c05643c7791f19c44c6731d194f0b321ed7ef0166caf30c194f37329e09643c95643c1793f10c20e339938ce756329e3c329e7c329e0e643c7dc8781e27e3e948c633868c670819cf79643c7793f19c42c67303194f2b329e1e643c93c8788693f10c24e3399b8ce732329edbc9788e27e3694bc69343c093080eff16137effeb20d8f6e93c7e5bb099657df25c58caabe3d0ad0587afbb9965ddfb2d0ca8d3dea0a62e653a5ff8af4d499dd05719cc8bbf3ce0d84fc2d3968ce778329edbc9782e23e3399b8c672019cf70329e49643c3dc8785a91f1dc40c6730a19cfdd643ce791f10c21e31943c6d3918ce771329e3e643c1dc878f2c978f2c8786e25e339938c670019cfc5643c95643c13c878ba91f13c43c6f311194f0b329eebc8784e22e3b98b8ca7808ce741329e51643c25643c8f92f1f426e339968ce766329ed3c978fa93f15c48c65341c6d39e8c671c194f17329ea7c8789a93f15c43c6730219cf1d643ce790f13c40c633828ca7888ce711329e9e643cadc9786e24e3b9928ce754329e7e643ce793f19493f15491f17422e379828ce72a329e36643cc791f1dc46c6731619cffd643c85643c9790f13c44c6732919cf44329eee643ccf92f1b424e3b99e8ce764329ebe643ce792f10c26e3194dc6534ac6f318194f19194f828ce716329e33c878ee23e3b99c8ce71019cf45643cc3c878c693f17425e3799a8ce70a329e5c329e6bc9784e24e3b9938ca71d19cf20329e87c9788ac9782693f1f422e339868ce726329ed3c878ee21e3b9808c672819cf58329ece643c4f92f13423e3b9dae0c1dfd5b9b5bc1fb60f6cf2fbb3baf16aa3d72565e49988bab7b4c7b0a9faee7654df3d41cd5406f3bba1bec2be0778f638e2d96bf098bef320df0334db65d814e34e478cbb0c4699df098ca2df2ee0d9e58867b7c163face837c4fd06c8761538cdb1d31ee3018657e3b308a7e3b806787239e9d068fe93b0ff2fd40b36d864d316e75c4b8cd6094f9adc028fa6d039e6d8e78b61b3ca6ef3cc8f707cd3e346c8a718b23c60f0d4699df028ca2df87c0f3a1239ead068fe93b0ff20340b30f0c9b62dcec88f1038351e63703a3e8f701f07ce088678bc163face83fc40d06c9361538c1b1d316e3218657e23308a7e9b806793239ecd068fe93b0ff28340b30d864d31ae77c4b8c16094f9f5c028fa6d009e0d8e78361a3ca6ef3cc80f06cdd61936c5b8d611e33a8351e6d702a3e8b70e78d639e2596ff098bef3205f0e9aad316c8a71b523c63506a3ccaf0646d16f0df0ac71c4b3d6e0317de741be02345b65d814e34a478cab0c46995f098ca2df2ae059e58867b5c163face837c2568b6c2b029c6e58e1857188c32bf1c1845bf15c0b3c211cf4a83c7f49d07f9e1a0d932c3a618973a625c6630cafc526014fd9601cf32473ccb0d1ed3771ee4ab40b325864d312e76c4b8c46094f9c5c028fa2d019e258e78961a3ca6ef3cc88f05cd161936c5b8d011e3228351e61702a3e8b708781639e2596cf098bef3203f0e34ab366c8af17d478cd506a3ccbf0f8ca25f35f0543be25968f098bef320df176cc25b04b6f774be186c0b74be046cf375be146cefea7c47b0bda3f39dc0f6b6ce7706db5b3adf056c6fea7c57b0bda1f3ddc0f6bacef702db6b3adf1b6cafea7c19d85ed1f93e609ba7f357816daece5f0db6393a7f0dd866ebfcb5609ba5f3d7816da6ce5f0fb6193a7f03d8a6ebfc8d609ba6f337816daacedf0cb69775fe16b0bda4f3b782ed459dbf0d6c2fe8fced607b5ee7ef00db733a7f27d8a6e8fc5d601ba9f37783ed5e9dbf076c9feafc7d60fb96cedf0fb66febfc0360fb8ece3f08b6cf747e08d8beabf343c1f63d9d1f06b6efebfc4360fb81ce8f00db0f75fe61b0fd48e74781edc73a3f1a6c3fd1f93160fba9ce8f07dbcf747e02d87eaef313c1f60b9d9f04b65feafc2360fb5ce72783ed573aff28d87eadf38f81ed373aff38d87eabf34f80ed0b9d7f126cbfd3f9a7c0f6a5ce3f0db6af74fe19b0fd5ee79f05db1f745eda35d5cefe51e70b8278dbd9af839aa9007c8b3f55e64f3adfca2823cbe6429952fd411ff58c437dcb54da616997954ddae1f7c026edf002b0493b3c1f6cd20ebf0b366987df019bb4c36f834ddae1b7c026edf09b609376f80db0493bfc3ad8a41d7e0d6c653aff2ad8a41d7e056cd20ecf039bb4c373c126edf01cb0493b3c1b6cd20ecf029bb4c333c126edf00cb0493b3c1d6cd20e4f039bb4c353c126edf0cb609376f825b0493bfc22d8a41d7e016cd20e3f0f3669879f039bb4c353c026fbcbd76093b67924d8a46dbe176cd2367f0a36699bbf0536699bbf0d36699bbf0336699b3f039bb4cddf059bb4cddf039bb4cddf079bb4cd3f009bb4cd3f049bb4cd3f02db689dff31d8a46dfe09d8a46dfe29d8a46dfe19d8a46dfe39d8a46dfe05d8a46dfe25d8a46dfe1c6cd236ff0a6cd236ff1a6cd236ff066cd236ff166cd2367f0136699b7f0736699bbf049bb4cd5f81ed599d97b6ba35d8e459b19a0affc509c7e16906be84a92c88b7edc7a90cf2cf40dd659a46c633968ce775329e0bc8785690f12c27e3398d8ce703329ecd643cc790f1ec23e3d94bc6339b8ce71d329e41643cedc8784e24e3c925e3b9828ca79a8ce755329e8bc8780e91f15c4ec6730619cf26329e8d643ccbc8789692f124c878f690f1ec26e3799f8c672619cf5b643c83c978ce25e339998ca725194f77329e4bc978e691f15c42c6b3848c6731194f2119cf59643c1bc878d693f12c20e3398e8ca70d19cf2e329e9d643cd3c978be26e3a922e379838ca79c8ce77c329e7e643ca792f15c49c6d39a8ca72719cf1c329e45643c0bc978de25e339878c671d19cf5a329e13c8787690f16c27e3694ec633958c671c19cf6b643cedc9782ac8782e24e3e94fc6733a19cfb1643c53c8786691f1bc4dc6f37b329e02329e35643cabc9784e22e3d946c6b3958ca70519cf47643caf90f15492f1bc47c633808ce74c329e3c329e7c329e0e643c23c9786690f1bc49c6731e19cf2a329e95643ca790f17c48c6b3858ca795fecfc2d3838c672e19cf70329ef9643c03c978ce26e3b98c8ce778329eb6643c39043c09e008c026bf3707db573a7f086cf2bd9e8fc0f6a5ce5783ed773aff2cd89eb2d89a59f884e12bb0c9bbd64f834deecf7c09367987e3776093e3a2f857f37d0b0ee76f06cb889fe6167ef4f73b0b97e4717bcb326541bcdb1b7d9505877f4f290f389e26e1694bc6733c19cf65643c6793f10c24e3994fc6339c8c672e194f0f329e56643c5bc8783e24e339858c672519cf2a329ef3c878de24e39941c633928ca703194f3e194f1e19cf99643c03c878de23e3a924e379858ce723329e16643c5bc978b691f19c44c6b39a8c670d194f0119cfefc978de26e39945c633858ce758329ed3c978fa93f15c48c65341c6d39e8ce735329e71643c53c9789a93f16c27e3d941c6730219cf5a329e75643ce790f1bc4bc6b3908c671119cf1c329e9e643cadc978ae24e339958ca71f19cff9643ce5643c6f90f15491f17c4dc6339d8c672719cf2e329e36643cc791f12c20e3594fc6b3818ce72c329e42329ec5643c4bc8782e21e39947c67329194f77329e96643c2793f19c4bc633988ce72d329e99643cef93f1ec26e3d943c69320e3594ac6b38c8c672319cf26329e33c8782e27e33944c6731119cfab643cd5643c5790f1e492f19c48c6d38e8c671019cf3b643cb3c978f692f1ec23e339868c673319cf07643ca791f12c27e35941c6730119cfeb643c63c978a691f134b3f01c72c423c74a59b7cc1f22f0addec3957bf1fbf4ff04fc8ee337573b623c6430ca7c35308a6d2ff07477c4b3dbe0d96dd1e268f9565ac8b73ff6e8ff09f81dbf57e82aa6ba1b8c326f8ba9ddc0d3c311cf4e8367a7458ba3e55b69217d1fa50f49027ec7f1f05cc5540f8351e66d3185e3b9f674c4b3dde0d96ed1e268f9565a485f43e9c39f80df71fc4b5731d5d36094795b4ce1785dfd1cf16c3578b65ab4385abe9516f2ee99bcb39c80df713c215731d5cf6094795b4ce1f810fd1df16c3178b658b4385abe9516f22d09f92652027ec7effbbb8aa9fe06a3ccdb620abf8f3cc011cf668367b3458ba3e55b6921dfaa936bf604fc8edfb7751553030c4699b7c5d466e019e88867a3c1b3d1a2c5d1f2adb418a4f3f20c2e01bf0f0246573135d06094795b4c6d049e418e78d61b3ceb2d5a1c2ddf4a8bc13a2f7d3213f0fb6060741553830c4699b7c5d47ae019ec8867adc1b3d6a2c5d1f2adb428d77979673001bf9703a3ab981a6c30cabc2da670fcdd72473cab0d9ed5162d8e966fa585bc7bbf46ff4fc0ef381ee760478ce506a3cc0f0646b1e1786f158e78561a3c2b2d5a1c2ddf4a0bf996967c833101bfe3f858ae62aac26094795b4ce17827958e78961b3ccb2d5a1c2ddf4a8be13abf42ff4fc0efc381d1554c551a8c326f8ba9e5c0b3dc11cf52836729916fa585bc0b277dd812f07b1530ae70c41815532b80516c4b8167a9239ec506cf6222df4a0b799623ef5c24e0f7b1c0b8cc1163544c2d0346b12d069eb18e78161a3c0b2d5a1c2ddf4a0bf976cc22fd3f01bfe378ed8b1d318e3518657e31308a6d21f02c74c413750faf217c47dd8f6a08df51f7561ac277d47d8286f01d758fbd217c475dbf3584efa86b9186f01d759fa1217c479dd33784efa8e7db0de13bea596d43f88e7aeed8d8f76f7f2c695ac792a3d9ae35d563896fcf39dbf371f1fb2e4e04b5af69d49463cc97411eaf5f1639d0c2513d0bf19af09b18d76bbb865f6868950f65f01ad5d5f5df388347e6c55f3632635ce4c4e7bb30013ee41d6565937b2def814dee712c009bdc03990f36b987f62ed8e47ed63b6093fb5d6f836db8ce8f049bdcbbc4fe48726f733bd8ca751efbc10cd6f9ad6093e744d8ff429ef56d019b3cafc5e7fef2cc7d33d8a4df043e6f96be2f1bc126fd97f039a7f4415b0f36e94788cfd7aa757e2dd8644c097caef3a5ceaf06db573a8fcf1364acce95607b52e7a780ed0b9dff1a6c4fe8fc42b0fd56e7f19ecfe33a3f166cbfd1f9b7c0f66b9d7f136c8fe9fc1b607b54e7f781ed573abf176c93751efb877eaef3bbc1f688ce63bfc45feafc4eb0fd42e75f07db249d7f0d6c1375fe55b0fd5ce75f01db049d9f07b69fe9fc5cb08dd7f93960fba9cecf06db4f747e16d8c6e8fc4cb0fd58e767806db4ce4f07db289d9f06b61fe9fc54b03dacf3bf07db0f757e1cd89ae9fc62b0c9f793f19eaebcb3b8146c324e09deab976f9554814dc6df5b0eb6d63a8fcf65e4bda4e160936fdb57824ddeffaf009b8c91540e3619c76930d8e45b6083c026df2b1b083619b37400d8645cd5fe60936f17f7039bbc4fd9136c3246480fb0c97754ba834dc6bec33181e57b97d560937782709c60f9eefe97609377cbbf029b8cdf846302cb37ae9e049b8c4bfa05d8ced1f927c026ef6bfe166c053aff38d8ced5f9df80ed3c9dff35d8e4fb958f814ddea979146cf21dfd5f814ddecd9e0cb68b75fe73b05da2f38f804dbe43f44bb0c958b1bf005b7b9d9f043679677e22d8aed0f99f834dc63a9b0036f9beeacfc026dff81a0fb6229dff29d88a75fe27602bd1f931602bd5f91f83ada3ce8f065b279d1f05b6ce3aff23b075d1f987c1d655e7a59d51fbb3dacf0feaf9b220bef332e5efe3a0f694eeda40189027ce73ed7ce0415f0762af7b71f2bc5ef6fb667abd124307c0f7bed87da7ae29f6eb75b5d0ebdd67f8ce85329fea46442db7077e2f833ac872788d2deb9665ae8465f71aeb6ea3ebbbdf517df7194cc2bd1f98a4cc6767d7947d423796ad619918d992d7c7126b0168885319e485c18d56c58578de5b179efdc013ff7e92ba5e771113b86fc57dbd6ede6332632d1fcaec03fdf63ad00ff77559b7cc8b3fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfccc8a479e27e0736529779084516c0780677ffc3c85f81c56d6af9eeb3c00cf750ec4eeb7f6f3bd967abd85469d73a1ccaa736ad886e87c1efc2edb2d6a5bee8bbd0ee9b7a5f8cb83faec071e07db32c973c0e0317de759f4519aedb568b6c711a3d966c8fc1e60dca7f37b81c7d5feb8cfe0317d639bb19f54b3a876d645bf84747166eb8350109befe2a1ae9eebaa3e53aa2f8779fc3a68688a7d20c486cfc1f360994ff4ff04e8f309e87334db00b35f02b6531f03e3bed8198b6b3d0396b6ff4a4353ec03f1a2d656fa40c4df0e1417ba3c46c83e6af6adc0ba4a99e9709c9ba9f3d80fe820aceb5dcbef32e518f36590c7367557fc754e6e5fe9bf2adb7797c5f70e608dc977ad77397274123f62cf85fc3be7d4949572a287682dec386e15b29bcb7d6c2c970f65765bea5f16c45bff5d06cf2e8359c5ce1c88b377e15ccf559bb43b42a32b41232983e7bc0efa1459db48e1107faa8c6cff5646193c3f95328ba18d527591765eea89fd98f018e0ea7ce1a0513f99c7f305db398d5947151fb79f5cc3ebfa5aa05960d79aa5afdf66682fe2eeebb71962c8765e2aeb2f84f50b57ab20fad82265b61ac75117d793b82d4d3df7039394d909edd07fd6e3baee685da3475dd7ed76c083d71a32a53bbee331c645fbe2a89e85b663d75ea34ef950e662a8a783f398b4efa4ee02df2eb6396a21e750fb0c2d72a1cc778db6234a475907de07705b9762ebf960a1a52e52e6c7463bb5d30193cbed86e7596abd072c759532bf80f6ef73389fdfa77fc7b6f42f96df654ad71ee037e5b7c55fe7e4f695f71b65fb6eb3f8fe105863f25deb9b1472be2f7ec49e0bf93fc3f15bca891ea2b5b0ab7d44deef447673b97dc672f95066bba5fe6541bcf5df66f06c339855ecfc06e2ec2f70beefaadddc1ea15121682465f0598179bf05ef9de071bfa1ae0b64fe236014db2ed0f73f9dde2f4fb17d64b099f7cb6de78385063f9e0ffe6f68671396b2ee9f03a4ce6db05e528fc0a86b60d4d5d1f96b698ea16719f8e900f67d3a2f3acb6f788e2b6572daa5febbbb7f55fb3eb6704b3df079dd1e837bafa12bde8b6a09dc2aeecd6b0b3c4f777c4d5b8ae762e6f9105e8749993c60b79dc71db2d4c53c4e370b0ebf16fcc6288bd7d9e99633f31f19cbe03d830316265bdb17db7b3945858526bfaddd3b6830db7495fd00634ed665ee2b783e2465ce84ed96b094556dd27f9d58a38f6c47bcd76ebbcfe2ea7811759f45fc2946db3b932e9e6134c577d35ac7b6deaee5b6e76cecfd195a1bf9787c1757e0b1229d167b2c3caeee694669b1c7e23b3e2d3a0db5b573362d765b785c5d634669b1dbe23b462d2a6df7166c5aecb2f0b8bad688d26297c5777c5a74ae755f239d163b2d3cf1dfd348af053e13cb84793701736b231f8fefd272dbb33b9b163b2c3cae9edd4569b1c3e23b3e2d8a3ad9aed96d5a6cb7f06c6f602db65b7cc7a74597aeb67b2a362db659781cdc5f4babc5368bef18e36218de5f4ba7c5560bcfd606d662abc5778ce7879dd2dd33442d3eb4f0b8baf717a5c58716df316a3144f9de52072db65878b634b0165b2cbee3d3a2bca3f2fd411db4f8c0c2f341036bf181c5777c5a0ce9a27c6fae83169b2d3c9b1b588bcd16df315e4325e362531db4d864e1d9d4c05a6cb2f88e4f8b8ae4b9d6c63a68b1d1c2b3b181b5d868f11d9f1685c963ea863a68b1c1c2b3a181b5d860f11d635c24af27d7d7418bf5169ef50dacc57a8bef188f23c9b85857072dd65978d635b016eb2cbee3d3a23279ff696d1db4586be159dbc05aacb5f88ef19e4b322ed6d4418b35169e350dacc51a8beff8b428491e5357d7418bd5169ed50dacc56a8beff8b418967c26b6aa0e5aacb2f0ac6a602d56597cc778de996c2f56d6418b95169e950dacc54a8bef18cf3b93f72f56d4418b15169e150dacc50a8bef18dbcee479e7f23a68b1dcc2e36a8cc8282d6ce353c678de99d462591db45866e17135b6619416cb2cbe633cef4c1e4796d6418ba5161e5763514669611b0733c6b848b69d4beaa0c5120bcf9206d66289c5778cf7b5926de7e23a68b1d8c2e36a6c8e282d165b7cc7783d92bcc7b7a80e5a2cb2f02c6a602d16597cc7f8ac28790ebeb00e5a2cb4f02c6c602d1682effdb1fb4ef5e7161fd217eb0a438b5c28f36da32f56948eb20e7c8716eb521d7b5d52fdcade8fa84b35d445cafcc0e8cbf7be032647754dc6cc7b7a5dd237fd634b5da5cc4fdbd594fdb9ce27609b1c8275fdd1f2bb4c39c67c19e4453f55e7f9f1d73919ab320e906cdff916dfef006b4cbe8bd0778e4ee247ecb990ffba5d4d5929277a88d6c2aef691053a8fece6720b8de5f2a1cc024bfdcb8278eb3fdfe0996f3027df7b8038933872d376a5981644687405682465b0cfde21473c1f1b3cc221fe7282c3df459532b22cbe8bfa77a3dfaef483947a46f5917ccf51fda2fa488abfa87751cd3aaaf8f801f4fd94714164cc10659331404a603d9d0d9baa6b174775155fb26e99ef028c322649e786672cae2b63278351f17473a0198eb32253bae34537e0e9ea80c7513d93c7a1ee469dba1875ca8732f86e637707f5cc01bfb26e99ef0ebe5d6c73d4428ec9971a5ae44299bc82d47f397f8cd251d6a1e2b7b3a52eae74ec64f074b2f8eee5584759b7b489bd1ac0770fc37747c3b7dab731c6d4946edfee01cc3d1d30abf5f68e7fbd8578ce28f12c7e3a429dfa800671d509d725e7987d0c6d73217f7e414d59292765e5d829ec6a3f926d89ece672dd8ce5f2a14c2f4bfdcb8278ebdfdbe0e96d30abf386d30a6a381cec0fc918e86570c87c47d0ae778476bd403b2983c7de4e8eb4eb69f0c87c27e091f3abee6093f314e14fc0ef250dc06db67bdd2ddc62c3f1083b59183bc6cf589ceeb8d01118c5d613787a38d2ccdcd6971afae039412ba38c2c9b0b65ba14a4fecbbb5a6659b5df9d9b5353afe6da1edb7b6bba4d6fe9402f1c0f34007d0243439984a175503366689c3cc7063563824e9858357ec843c3ee1a967aec2968b90626fecfb154a319d830dfdc620b82da439fe6824d863e6d01b666862c38e4aa9497a1135dc8857ac8ba730dced6c012a76f1c3656a674a1d30a785c84b20a1d193a5687cebde3474c1c86f1d1c2e0ac4feca8df9aa72917b52e89835c0775472659b7cc8b3fa54fbece8f1d3274649ff10f4d1a3d6cccc409086bee5c98cf314430ffdb96c120c19d49d6d3c210e7d8f8c529c5318a4dbe00fcc9240cad839a718c63e44906aa8c353c74c8a851774c2a1f3562e87593c60c9d38a26a0c2adada502e4a6df9bd25d86c4d1d965513eebeb86c2b8bcd36e1a8ceadc1262df83160139e63c1d61cf252dedc324ef6918b61fd12d6ea37254e0b5df156414d08c86149b52f6a1f529f5155a7036a68693594b4da9cea8e9d1a1a5a7d454e0dfdac867a56433baba19cd5d0cd6aa8663534f3d9416ae86575f7b220480da57c5e901a2af982203514f245c0f76d60be24489d7ea8a18cdb07a9a18ad5ed43f5fab8fad49a7abf5d9dc6aacb6375eaa72e75d469983afd52a7d9ea1682ba9da44e6dd469a33a2552a731eab4bcb7d6ba4f98ae0ad3d561ba264cd786e9ba305d1fa61bc27463986e0ad3cd61ba254cb786e9b630dd1ea63bc2746798ee0a53df30dd1da486d3be274cf706a9e1b6ef0b524371df1fa486e97e20480de1fd60901ade7b48901afa7b68901a167c58901a32fca120359cf888203554f1c82035b4f1e820353cb21aa67c6c901a125d0db5ac8665564338aba19dd5d0d06a186935e4b41a8a5a0d65fd44901a22fba9303d1da486d07e364c53c2f45c989e0fd30b617a314c2f85e9e520352cbb1aae5d0de33e23480dfb3e2b480d13af868f57c3caabe1e6d530f46a787a356cbd1acefe8d30bd19a6b7c2f476907a2ca01e87a8c704ea16bcba45ac1ed35407a9dbd78b82d46366f5d85d754350dd325437951541aa1b93ead6a5bab9a96e7faa1ba4ea16aabac9aa6ec3aa1bb5ea56aebad9abd70ed46b18eab514f59a8e7a6d49bdc6a55e6b53aff9a95735d5ab8fea555ef56af3be20756bfa40907a5ca96e57abdbd2ea16bdba85fe6998be15a462f23b61fa2c4cdf0dd3f7c2f4fd30fd20480d19ad869756c353aba1acd510d76a386c3574b61a7a5b0dc9fd79901aea5b0d15fe9b2035dcf81761fa5d901af2fcab2035dcfd1fc2f47598fe18a63f85e9cf61fa4b98fe1aa67f0bd3bf87e96f61fa7b98fe234cff086a8635c786a440b73ee7eaf92113270e1b3d7662c1c4aa82d193464d1c3176d4630593474c1c5e50f5c8b0f195a3aa26e3c2bfd50bcb98ec7dc68f1ff258c1883115c31e2da89a34b1a0aab2a0bc6ad2988a5a07d2ffa7173aeb708f432a2aa29de535ff17488f6f5e3fa7edf47232dafd8de9eb765ef37a0872497d16baa59e15ba5b1fc1e492af6fea7cb060c2a8aa8905850563c2bfe181b76af2b08a0e05f8db8450e409130b264c1c327e6241e5f8aad105451d70bd85c7d6a312f38e750353727afdc4f9e4ecd4ff7a85d80be7d4438145e7d48f74d339ff02e987f574fa597d6af8a3fa2cf45ff5240cda45ca326152f9c4f143864e8c5eb8c5bfb270a25d3daa7946bbfa55f35bf571f6fdfa2cf4b77a12260aeae1ac7341dd9d05ff035566efd0b0020600", "isInternal": false }, { "selector": { "value": 2603445359 }, - "bytecode": "0x1f8b08000000000000ffed9d777c1dc5b5c7f74ab22cfbfa5a967bb768c64df2d555b3e42603ee85988e69966d196c6ccbd8a285d04942421212d20b8184978434d20be9bdf7de484202494848f8e7e5f3defbbccf87cf9bd93be7e9a76176d1bdec11b3ba673f9fe33b7b3477cff79c3d33bb776676fd54100499a0b8552b392978e6467fef319ff9e7b6b52478ac3c276726259c5529e1ac4e09674d4a38c7a484b336259c6353c2599712ce7109726ab6aa60e89634ef7886b826cd984d594c27a420a6b994c574620a625a1fa4a38f9a9412ce8694704e4e09e79494704e4d09e7b494704e4f09e78c9470ce4c09e7ac9470ce4e09e79c9470ce4d09e7bc9470ce4f09e782947036a684f38494709e9812ce9352c279724a384f49907329702e349fa79acf45e673b1f95c623ee93bcbcc6793f1b1c6ec372b59aed994b4587f2b286955d2a6a4ddfa5b87924e252b947499bf359abf752b59a9649592d54ad628596be2b04ec9694a4e57728692f54a3628d9a8649392cd4ab628d9aa649b92ed4a76283953c90b94ec54729692b3959ca3e45c25e729395fc9054a2eb4587629b948c9c54a2e5172a992cb94ec56d2ab648f92bd4af629e953b25fc9e54aae507240c94125572a39a4e4b092234afa951c55729592634a8e2b195072b5926b945cabe43a25d75b317ba1921b94bc48c98d16e74d4a6e56728b925b95dca6e47625772879b192972879a9923b95bc4cc9cb95dca5e4154a5ea9e4554aee56f26a25af51728f92d72a799d92d72b798392372a799392372b798b92b72a799b927b0d0b3584b72bb94fc9fd4adea1e49d4a1e50f21f4adea5e4dd4adea3e44125ef55f23e25ef57f201251f54f290920f29f9b0928f28f9a8928f29f9b8924f28f9a4924f29f9b49287957c46c967957c4ec9e7957c41c917957c49c997957c45c957957c4dc9d7957c43c937957c4bc9b7957c47c977957c4fc9f7ad98ff40c90f95fc48c98f8dee27e6f3a7a62e8d8bfd4cc9cf4df917e6f397e6f357e6f3d7d6777ea3e4b796ee774a1eb174bf57f20753fea3f97cd47cfec97cfed97c3e663e1f379f7f319f7f359f7f339f4f98cfbf9bcf7f98cf27cde73fcde7bfcce7534a6e9d5a2cd705835b4f90501fd5b63fafe75428f80b83a19b8e45b5f91b7d361a7d8dd9a74f8add18b33fc6d2d79afd5aeb387566bfced23798fd064b3fc5ec4fb1f4d3ccfe344b3fc3eccfb0f4279bfd93419f0d60ccd5e8b5aedaa832a0a37cad02dd18a3ab065d2d1d0e74638d6e0ce8e8fcd6826e9cd18d05dd78a3ab035dd6e8c6512c954c30ba9e20a95cc9f7eae3e6923eae99879a983cef5e7ddc7a26de49c9f3f6e9e33630f0eafc986c8e3509f2668ad13580ce7437c164d04d33ba29a09b6e74534137c3e8a6816ea6d14d07dd2ca39b01bad946371374738c6e16e8e61add6cd0cd33ba39a09b6f747341b7c0e8e681aed1e8e683ee04a35b00ba138dae1174b4c6e504d09d6c742782ee14a33b0974d4d79e0c3aba373cc5e8743f519781ef183df551e177a87f06dd22ea9b41b798fa65d02da13e19744bc136e99641bf42ba26a3a33e4affaddb947b82a4da44216c132b933eae3ab23eeeeae48f1bcedbad0906e3da03765642acd69a72826b835ad076c608d9217d0d9437435daa47f1a0eb0cb1ebebc92a535e1bf3bd6eeb7b39a8b3cae17f4f90acffab2d9ed516f318f09f27675b0b92b3c3de4aced9f3a1ae9d7b74cf331a73761b7030e46c87e4ecb0b79273b60feadab947f7bda3316777010743cef6f2e46c212f395b1c230b0277eed16f9fd198b3570047f239db2e393bfcade49cbd15eadab947bf7f4763ce5e031cc9e76c67afdc1b0c7b2b3967ef86ba76eed158cc68ccd93b80832167fba49f1df65672cede0b75eddca371c1d198b3f70047f239dbc594b3ad92b34171be3308dcb94763d4a33167ef078ee47376af8ccf0e7f2b39671f86ba76eed17cc968ccd9874c59cf33fcc4cc33cc05dd4f8d6e1ef0269fdbfbda9872bb20b95d5c071204ee1ca5b9bbd198db5f30659dc7bf80b507a4fba5d19d00ba5f19dd89a0fbb5d19d047e31b4815e6903c3de4a6e03bf85ba762ed33cf2686c033f020e869cdd2b393becade49c7d02eadab9476b1a4663cefe1e381872b64f7276d85bc939fb5f50d7cebd45a63c1a7396d695eafb853f9afb8525a07bd4e89682ee4f46b70c747f36ba26d03d6674cda07bdce89683ee2f469707dd5f8dae05747f33ba02e89e30ba56d0fddde8da40f70fa36b07dd9346d701ba7f1a5d27e8fe65742b40f794d175199d9eefa2b557df313a7d6e291e3d4172e7365c6f150cdd32d67e0f949b7879f2b960e8b308646b79f2b65ab5efcdc1f07d5f0e3c7906dfb36063383c79e069499e275c775a48feb8e1396eb6629a055bcde0572b835f19b045c7a67db297031df625ad0ec6b6e4190b19b045c7a6fd3660241df66d748da1f6a3fbe6c6cc202f435b0aafcf68af0738c85e0dd4993775b0eec9866d02fc9dfa800950c6bebfc5d231e56a982b648b8e4dfb0560241f5b469eb1305cc6bcc5c8d56f64c0161ddbb63dc1111f1db33647ccda9918db2c46da6f07468a5fdbc8331686cb68f70b4c7d52cb70fb248a4bcbc8c76c58e735073abcff6b77307624cf189ed7768b91f63b809174adc0c3753d8c6aafbed8e6b80fc17ca66b165d7fc85e0dd4e9ac1eacbb0daea70c7d68a1d47b53ecd3933f4f853c5ecf86c3c37cee5a98f2318f7de7d341b2b966b7f9162b56d8e6b12fe7ea27a3fa72b227ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccfe3347cdcbb9d6333c9f8ca42b000fc7387ff88e2a732c9c037a04e675929fb728e471ae9ed6312eb67cae813aff9b19647bd4b14e02e7ce975b3aa6754ae1b9c4754a3db04ff670dd06ae9b62587b12f22cb3786cdb131cf1f1711d894f6b34a2d669f914b31ce8703d5c33134f549e353b6c372666bbb097a7ed14f2fa7d40fa9d7ad49fd86d04d7be2db574ba4feaae1ef49b23074a9d77c6eb0695939cc7c57c435bc9afb7290c599f50150cbd56e03d05c31a9521f3d5b436a2c3b25d0375c65505ff7f6e3ae1ef3dc133d708611d3a36ed2f86ef765ac7aee7f337b63fec006e2ad75abe350137d5995835e8e3e74d99e97ea680eb6703e00d2c9f68c3f519c9dfef15d78bb496c0d30e3c1c6bd798ee6bf3988f49af17e9b462e5ba5fa63a1d10bf4e86f8c5ad59237bc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2ec3f33beff8258f119e982278c23b4c6269ccfa07719e1bcd87d558376b9e70069ce6989e5333ea3fc64d520db03a68cef08703def8ee7926b6e2dea5c92bd09c1339fd3673a97c37ef743bb23669d8e98ad6062b4fb0cda5f018c14bf4ee0e16a8f1d168f6d1bfb8c764f6316d5cf72ad5f89ca33d73a85c6c46c17d78b70ccebd27a11fbfa55b0628aeb244887f3e0f86e159fdfff62af5dc07e0ad76825df6f1686cc01db6b05c91eae93f8a6892dad9348be1f28e439af11d446694d48abc357aaf33db8cefdc09471ad50018ef588e3efb4c5ad49c03e35f17770e68b73fcf4ee4a3abfdd0edbab803521db2d683b6384ec90be06cabfab1aac4bf5281e146b62d76d84de6588ecf6f75aacefe5a04e97c3ff9e2059ffbb2d9e6e8b59e7ce8f21cf1e817b3dae3ea92b22468b21465407ef79b9ae5ff69a6d7bad32f6a363ad3af4dd1aa8f338f451a5bc2b8aeb7e21ea1a80f70bf67561386bc72b7d3de0bfa1bfe884bff704cf7d3de0bf21875cf7a574fc25707ce21a1b445f5ba8ceff58d75186f57ac37aef95ebb71ff1e27a43aaf334f45579b32e37ea778ceb390baedf0d51cf7d903dbca72ac577ec1792be36623e220bd9c37cac33b1a67cec8ce05eeef86e36e2bb142b5a5f8ebf93edf8e93874c1777a128943b1bfe9b67ca136d505be509d06f085e79ea978ff99bcaf43ef87a80f6a73f84a75a6c3bbe0669a7216ce13f695a73afe4e5bdcfd27c54ffb3cd2ef5447db3ebc537d61f5605dfbdde814eb52dfa9de617dcfc777aacf813c3b159eb5e0eaab5745c46809c488eae0b38ef6efffa86bccf3f95e52bbdfc4ebe448b2d9e3b7aefb13aa83f7d054a71dfad9aca3ae3d2e4dd79024d7a7e3f340cbc02e3e0fb48c299eb960683c731607a7ed7acb76fd08da6eb06c378ca06d89b9c4dca79833fcdf1365ff5f18f87f5654a580b13a058c3529601c9302c6da14308e4d01635d0a18c7a580717c0a18b3c0f87c5edb19e253f0ecff7b8abdd740db0cef730863d1140c3f16cdbc3cb1f73e689be11d2a25ff7f03ccff17564bb9ff17560ebe3739058c5352c03835058cd352c0383d058c3352c03833058cb352c0383b058c7352c03837058cf352c0383f058c0b52c0d89802c61352c078620a184f4a01e3c929603c25058c0b853111c6a5bc8c05dffe1fe76c3074add9b3f130bf7b347c87a2eb3da71cff376ea9be33bf77b8a5dcf7f4e11a0bdeffebf1b9bd4b90630d45a9ef128cfbffb199180be53272ad25c775d4c3e1c1e7505dcfb7303016ca65e47a06059f891c0e8febffeae57d26a818b37218b9d68c95baa6119f15ec70c48c81b1502e23d77307f84ce470785ccf2eb6f03216ca65e45a9f9b051bc3e1e98298ad70c48c81b1502e23d3f36561ccba4ae0c1e7b0ba1c3163602c94cba8795632c5acbb049e9510b36e47cc7c62449ea4df89deedb0c5f1dc5ea9be1303328e4b01e3f81430e23a098efe2b6e9d44376f7c0ae5c687eb7cc5ad9340db0ccf8984b1c0e7029e2d16ab797962d749a0ed354cb1c0e7369e2d166b8087e339922cd8180e0f31e4e07b9353c03825058c5353c0382d058cd353c03823058c3353c0382b058cb353c03827058c7353c0382f058cf353c0b820058cf85b95e15e31f6f7cb9a516e3beab7ca68b71df5bb64b4db963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf7db29d86317e611c7d8cc8d3981c4f1e7d475b3d1ef8dee3e0c930f98eb6d679e03b31a48d716d0a1857a68051e2585c83580ea3e6398d89675d093ca701cfe94c3ca795c0733af09c913c4f9853a797c0430c39f8deca1430ae4d01a3c451e2e813a3c4b172e2288cc2288cc2f87c30a6a10f17c654e463a15c46cdb33e799e30666794c0b31e6246df6be1652c94cba8793624cf13c66c7d093c1b2066eb1d3163602c94cba8793626cf13c66c43093c1b21661b1c3163602c94cba8793625cf13c66c63093c9b20661b1d3163602c94cba8793627cf13c66c53093c9b21669b1c3163602c94cba879b624cf13c66c73093c5b20669b1d3163602c94cba879b626cf13c66c4b093c5b21665b1c3163602c94cba879b625cf13c66c6b093cdb20665b1d3163602c94cba879b627cf13c66c5b093cdb2166db1c31f39571650a18d7a68091398e85721935cf0e269eed25f0ec009e3399787694c07326f0bc20799e30a7ce2c81871872f0bd9529605c9b024689a3c4d127468963e5c451188551184b63ec4901a39c6b61f49591e1f755ec3334678e72dbf596edfa0ab11df50ccd68b72d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e4b94fb677266fbb50ea33ac3b8187e3995a263ff3fab86799633d9d60fc74acceb66275a615ab1cd4390be2773643fc3260978e4dfb64af54e6533d6066b25d98a88e310efc271b6bad7868fbe730f91ed5d79f33ca6d47f5f5a3dd76545f3fda6d4b9e4b9e57826dc973c9f34ab02d792e79ee8b6d2cd70483f7edf47e257d8c734d798cd94756fa1ed5593db6f8591f481be2b02d6d48ae1595605bf25cf2bc126c4b9e4b9e57826dc9733ff3fcbce46d877363f8fb426f717363e701cfb90cb160f233af7d3adff2e91ccba71cd4c177d69ecfe06706ecd2b169ff7c380f6963d63c6b4c9958b3506f8d278ca43b9797276c5f6b82a15b5cfb3a1f7818da410b939f61fbbac0f2698d23ee540773f502063f5d6d87f62f80f3903666cdb3ce9489350bf5d679c248baf37879c2f6b52e18bac5b5af0b8087a3ff61f2336c5f175a3ead73c49dea60ae5ec8e0a7abedd0fe85701ed2c6ac794e336562cd42bdd33c6124ddf9bc3c6d59f099b6b8f67521f070f43f4c7e86ed6b97e5d3698eb8531dccd55d0c7ebada0eedef82f320ccc2ec62d63cf47fca136b16ea9dee0923e92e60e569cb67c167dae2fab15dc0c3d1cf33c53decc72eb27c3add1177aa83b97a11839faeb643fb17c1792885796d0a9925ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825cee5316b9e334c9958b350ef0c4f184977212f4ff8fcce19c1d02d63edf740f922e0d9c5101f263fc375ef175b3e9de1883bd5c1f67531839faeb643fb17c3792885796d0a9925cee5316b9ef5a64cac59a8b7de1346d2ede2e509fbb1f5c1d02dae1fbb187838fa79263fc37eec12cba7f58eb8531d6c5f9730f8e96a3bb47f099c0761166617b3e6d960cac49a857a1b3c6124dd45ac3c85f039c40dc1d02dae1fbb047838fa79a6b887fdd8a5964f1b1c71a73a98ab9732f8e96a3bb47f299c875298d7a69059e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e629638574e9c35cf465326d62cd4dbe80923e92e66e5690de71d360643b7b879874b8187635e8629eee1bcc365964f1b1d71a73ad8be2e63f0d3d57668ff32380fa39d796d0a992537468659724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398ad987dcd03c9b4c9958b3506f93278ca4bb8497277cefc1a660e816b76ee732e0b994213e4c7e86eb76765b3e6d72c49dea60fbdacde0a7abedd0fe6e380fbb8559981dcc9a67b329136b16ea6df684917497f2f284fdd8e660e816d78fed061e8e7e9ec9cfb01febb57cdaec883bd5c15ced65f0d3d576689fec09b33047316b9e2da64cac59a8b7c51346d25dc6cb13f6635b82a15b5c3fd60b3cbb19e2c3e467d88fedb17cdae2883bd5c15cddc3e0a7abedd0fe1e380fc22ccc2e66cdb3d59489350bf5b67ac248baddbc3c852cf84c5b5c3fb6077838fa79263fc37e6cafe5d35647dca90ee6ea5e063f5d6d87f6f7c279481bb3e6d966cac49a857adb3c61245d2f2f4fd8beb60543b7b8f6b5177838fa1f263fc3f6b5cff2699b23ee540773751f839faeb643fbfbe03ca48d59f36c376562cd42bded9e30926e0f2f4fd8beb60743b7b8f6b50f7838fa1f263fc3f6d567f9b4dd1177aa83b9dac7e0a7abedd07e1f9c87b4316b9e1da64cac59a8b7c31346d2613f455b1530ee60620c2cc6c08a0ff2ccf78c67a7673c333de399ec19cf38cf78167bc653ed19cf0acf78da3de32978c6b3c0339e599ef14cf18c67bc673ccb3ce3a9f18c67a1673c4b3ce399ed19cf54cf78b29ef13479c633c6339e6ecf78ba3ce359e4194f87673cad9ef12cf78c678e673cd33ce359ea19cf04cf78729ef1347bc653eb19cf2acf78e67ac633dd339e899ef1d47bc633d6339ed59ef1747ac6d3e6194fde339e799ef1ccf08c6792673c0d9ef1d479c693f180271b3c731d4316febe137455d677f5f565cfd4c1bfd3bc71157c67bf29573b8edd073a9a67deeff82ec6896b2e1c6df5c03ed99b001cfb3de1a9f38ca7c1339e499ef1ccf08c679e673c79cf78da3ce3e9f48c67b5673c633de3a9f78c67a2673cd33de399eb19cf2acf786a3de369f68c27e719cf04cf78967ac633cd339e399ef12cf78ca7d5339e0ecf781679c6d3e5194fb7673c633ce369f28c27eb19cf54cf78667bc6b3c4339e859ef1d478c6b3cc339ef19ef14cf18c6796673c0b3ce32978c6d3ee19cf0acf78aa3de359ec19cf38cf78267bc633d3339e9d9ef1ccf78ca7cac1b3938927ead9e69d9ed866380f797ddccb997cbac21cabd61c97f8c95e0dd439c90c3ceaf90ffc2e71d9f3ffd876ae801871bd572267f1d0febe516ebbdeb25d5f21b61b2cdb0d15625bf25cf2bc126c4b9e4b9e57826dc973c9731f6d3f9d9ced7679bfd4f079e47d4ef13cf23ea7781e799f533c8fbccf299e47dee714cf23ef738ae791f739c5f32cf48c47dee714cf23ef738ae769f28c678c673cf23ea7789e459ef1c8fb9ce279e47d4ef13cf23ea7789e099ef1c8fb9ce2796a3de3f1ed7d4ebebd0f5ede2f15cf33d1331e79bf543c8fbc5f2a9e47de2f15cf23ef978ae791f74bc5f3d479c693f180e7d9de2f85ef85bac294f7818ed697c6bd872a0bc7b90274349e4bc7d0d7abc3539fc95005df39e0e0badc618fec1c707c7724e28eb67a609fece1fbaa0e78c253e7194f83673c933ce399e119cf3ccf78f29ef1b479c6d3e919cf6acf78c67ac653ef19cf44cf78a67bc633d7339e9d9ef1acf28ca7d6339e66cf78729ef14cf08c67a9673cd33ce399e319cf72cf785a3de3e9f08c6791673c5d9ef1747bc633c6339e26cf78b29ef14cf58c67b6673c4b3ce359e8194f8d673ccb3ce319ef19cf14cf786679c6b3c0339e82673ced9ef1acf08ca7da339ec59ef18cf38c67b2673c333de399ef194f958387eb9d5151cfd78fc4fbaa9ecdb6de5f0671d15b16fe3e12cf71edb418691fd73d202ff12c63e2897a2fc0320f6c6bffe9b7e844f39985bfe373385c39b5cc62a47d574ee1bac626269ea8f7193479605bc7a2d994690d4016fede0c8c5c39d56431d2be2ba71a7879dab2e0336d716b8db0cd719c43263ff3d8fe127c87465ec76a8715ab662b5639a83312ebd2a3fa03b227ccc21cc5ac79682e8558f17a3612cf990d87d1757d65e009fbc7e5c1d02dae7fdc013c1cd70f263fc37eeca0e5d37247dca90ee6ea41063f5d6d87f60f3a6c3706c9c6e2ca61c4e24a07cf95231c0bb2572af3ce1432fb1067cd436b118915d737e73d6124dd325e9eb07fcc0743b7b8fef14ae0e1b87e30f919f609872c9ff28eb8531d6c5f8718fc74b51dda3f04e7a114e6832964963897c7ac79680e8258b350afe00923e976b0f214f259f099b6b87eec10f070f4f34c710ffbb1c3964f0547dca90eb6afc30c7ebada0eed1f86f320ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22ccc7e336b1e7a369658b350afd51346d25dc9ca539c77680d866e71f30e878187635e8629eee1bcc311cba75647dca90ee6ea11063f5d6d87f68fc0791066611666611666611666611666611666611666611666611666611666611666bf99350fbdb39d58b350afcd1346d21de2e5099fdb6a0b866e71f30e4780e730437c98fc0ce71dfa2d9fda1c71a73a98abfd0c7ebada0eedf7c37910666176316b1e7a571bb166a15ebb278ca43bccca539c3f6d0f866e71fd583ff070f4f34c710ffbb1a3964fed8eb8531dccd5a30c7ebada0eed1f85f3500af3c114324b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc12e79161f621ce9a87fe0f4162cd42bd0e4f1849778495a7359c77e808866e71f30e478187635e8629eee1bcc355964f1d8eb8531d6c5f5731f8e96a3bb47f159c87d1ce7c3085cc921b23c32cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc5ec436e689e4e5326d62cd4ebf4849174fdbc3ce17b0f3a83a15bdcba9dab80e728437c98fc0cd7ed1cb37cea74c49dea60fb3ac6e0a7abedd0fe31380fc22ccc2e66cdb3c29489350bf55678c248baa3bc3c852cf84c5b5c3f760c7838fa79263fc37eecb8e5d30a47dca90ee6ea71063f5d6d87f68fc379481bb3e6e9326562cd42bd2e4f184987d7e52e269e9cc59373c4e2f9b2adf7bb4d7982f9ccc2dfbb8191ab3fecb218691f731c7989a79b89a7dee2a977c4e2f9b2adfd5f65ca13cd6716febe0a18b972aadb62a47d574ed503cf2a269e068ba7c1118be7cbb68ec56a539e643eb3f0f7d5c0c89553ab2c46da77e55403f0ac66e289ea93568f80eda8f63512b6a37265246c4bcca363ced0eec2f181d5c1d02deebe1aaf2d1c7d15939f79d7f57bb5e5135ebff11ef5f9ba3e09b330473133dde7b6652ddb149fc0e2a1ed18732c46f27776b7e5531a7e67c7311f4c21b3c4b93c666d7b2079db6d59cb36c527b078681b608e05939f617f7075e08e31d9cb411dccd3ab19fccc805d3a36ed5f0de7a114e6832964963897c7ac6d5f93b8ede2fb87d136c527b07868bb8639163c7e16fb836b03778cc95e0eea609e5ecbe06706ecd2b169ff5a380fc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2ec37b3b67d5de2b68be3f7689be213583cb45dc71c0b1e3f8be3f7d707ee1893bd1cd4c1737e3d839f19b04bc7a6fdebe13c08b3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3dfccdaf60b93b71d3e8f83b6293e81c543db0b9963c1e467387e7f43e08e31d9cb411d3ce73730f89901bb746cdabf01ce83300bb38b59db7e51e2b68bf379689be213583cb4bd8839163c7e16fb831b03778cc95e0eeae039bf91c1cf0cd8a563d3fe8d701e4a613e98426689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e25c3971d6b66f4adc766b387e8fb6293e81c543db4dccb1e0f1b3387e7f73e08e31d9cb411dccd39b19fccc805d3a36eddf0ce761b4331f4c21b3e4c6c8304b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e486304731fb901bdaf62dc9db0e9f6747db149fc0e2a1ed16e65830f919ae7fb93570c798ece5a00ee6e9ad0c7e66c02e1d9bf6c99e300b7314b3b67d5bf2b60b59cb36c527b07868bb8d39164c7e86fdc1ed813bc6642f0775f09cdfcee06706ecd2b169ff76380f6963c6f39749ce76b86e936c54994fadbbc394ab41f76253ae01dd4b4c790ce85e6acab5a0bbd394c782ee65e01be95e6eca4b41779729af06dd2b4c7915e85e69cadda07b95297781ee6e533e06ba579bf271d0bdc6940740778f295f0dbad79af235a07b9d295f0bbad79bf275a07b83295f0fba379af20b41f72653be01746f36e51781ee2da67c23e8de6aca3781ee6da67c33e8ee35e585a07bbb43779f29df02bafb4df956d0bdc3947782ee9da63c0e740f98f278d0fd0794e9f35da63c0174ef36e51ce8de63ca1341f7a029d783eebda63c0974ef33e506d0bddf942783ee03a63c05741f34e5a9a07bc894a781ee43a63c1d741f36e519a0fb8829cf04dd474d7916e83e66cab341f771539e03ba4f98f25cd07dd294e781ee53a63c1f749f36e505a07bd894f1fc7ec6946f031df52bb7838efa953b4047fdca8b4147fdca4b4047fdca4b4147fdca9da0a37ee565a0a3bc7b39e828efee021de5dd2b404779f74ad051debd0a74947777838ef2eed5a0a3bc7b0de828efee011de5dd6b414779f73ad051debd1e7494776f001de5dd1b414779f726d051debd197494776f011de5dd5b414779f736d051dedd0b3acabbb7838ef2ee3ed051dedd0fba46537e07e84e30e57782ee44537e0074279932f633279bf2bb40778a29bf1b74d417be0774a79af283a05b64caef05dd62537e1fe89698f2fb41b7d4943f00ba65a6fc41d03599f243a06b36e50f816eb9297f18747953fe08e85a4cf9a3a02b98f2c740d76aca1f075d9b297f0274eda6fc49d07598f2a740d769ca9f06dd0a537e1874741da77e46b767dd2e290e1423ad239f9b1dbe90ae0e7ce90992bda7235b746cda6f05463a078591672c0c97b1c562d43ced0c31c3bca22dee37533bf0b431f030f919fe66eab07c6ab57cca419d53c1cf0e063f3360978e4dfb1d609be39c632c6acd711759b1a8813a6de622a7afa77171a463e8fc2d387ce18a638bc5d3e2b0ddc51c473a36f5895d2360bbd3b29db76ce3b580b6b8b6dd09cc2b1898f571bb933f6ed8b6579a63513e939d3cf8b40a6290944f683b6384ec90be06ca5ba70ed6a57a140fba7612bb6e47742e91ddfe5ebbf5bd1cd4e972f8df1324eb7fb7c5d36d31ebdf133d53073918da4398035d1607ede72176dd11b1eb82d8511dbcf63631c56e85c543fb4dc043f7571da0a3fb14e2c77bbce611e0b6fbbd0e0737e93a81b1c9c158489e31bccf6ab21869bf008ca45b013c9d4c31b3cff5222b3e784f30d6aa43dfad813abbe1ba9c75d4d5edae3133e817fdfe7f3a48b64faf6588178e4d04109fc08a216dc450170c8e5f24c9333e181c9f383ed07facf7f2beb3fa7af76500adc6c2c4cf8cc38d2ad061b9daa10b82a1c330381c4cc330381c5c658505877fa8befe19a7dda2a18ebec30706ce3dd27764efb1eb8f0ef4eddbd67f39528fb1e89134ca0324451d6d75c1e080514f90ec4450ad652b2e79eae0736cf23c2d4c7e8617bd71964fb5964f39a83306fe368ec1cf0cd8a563d3fe3887ed043ba23016e387118bf10e9ef1231c0b1c74271db654fa3b4edc5459be608b469fec3c4fd42132b8108e9f3170fa6fbab18f31ce8c0d064f36f59efa8e569f043d5aabaf5a7a34568fbeea2e488faeea0b9a1e3dd5a3a57a74548f86ead14f3ddaa94737f568a61ebdd4a3957a74b231288e3eead1463dbaa847134f01b6ef00affe45afaf907a34508ffee9d13e7d67a5ef00f4dd88befbd6778afad7a3be43d0bf6af50887bedaea3b197d95d657567da7a8ef10f51dbdbec3d533646b94ac35b15ea7e43425a72b3943c97a251b946c54b249c966255b946c55b24dc976253b949ca9e405417164ff2c25672b3947c9b94ace5372be920b945ca86497928b945cace41225972ab94cc96e25bd4af628d9ab649f923e25fb955caee40a250782e2aaa02b951c527258c91125fd4a8e2ab92a28ced2e959393d0ba767ddf42c9b9e55d3b3687ad64ccf92e959313d0ba667bdf42c979ed5ba2528ce46e999083df3a0671af4cc829e49d033077706c599013d137057501ce9d723fb7a245f8fdceb917a3d32af47e2f5c8bb1e69d723eb7a245d8f9ceb91723d32ae47c2f5c8b71ee9d623db7a245b8f5cdf1f1447a6f548b41e79d623cd7a64598f24eb91e30783e2c8b01e09d623bf7aa4578fecea915c3d72ab476af5c8ac1e89d523af7aa4558facea91543d72aa474af5c8a81e09fdac92cf29f9bc922f28f9a2922f29f9b292af28f9aa92af29f9ba926f28f9a6926f29f97650cccbef2af99e92ef2bf981921f2af991921f2bf989929f2af999929f2bf985925f2af995925f2bf98d92df2af99d924794fc5ec91f94fc51c9a34afea4e4cf4a1e53f2b892bf28f9ab92bf297942c9df95fc43c9934afea9e45f4a9e0a066756b013a9333d0f8df2f70e0cf41d3e3ad038d0df78f8ea4303078e1ebabef1da03035734f65fd3776cffa1fe6bf1cbdf305fa6298c75c78ef55edf78e0c8bebeeb1afbaf1e68ecdfdfb8a7ffea23fb8ee3971e335f9afb4c8bbdfbf6451bfbcfe742fadf651a1d6bfa449a1cda1cefdbf8ea320232a99c2fb55597e7d02a73d5a15fef6717ef761b8f1fea1f68cc371e51fff61e52dfe9dbd7dc887f3bae827c7ca0f1f840efb181c6fdc7fa0f37b634e3714f9c508613ad53cbf8d2655387ef79f07f5ef0c7e5f1d90300", + "bytecode": "0x1f8b08000000000000ffed9d67701cc7b1c7f700100cc72308e64c28514c000f8744800994c41c642a8b4a0449502245121409e51c6ccb966dd9720eb264cb414e720e72ce39e724dbb225dbb265ebcb73bdf7ea55a9deccdeb4f1c76876853b6f83b3b8deaae6cd36e6b67fdddb33bb3733bb7c2608824c50dcaa959c143c77a3bf779bcffc7fb6352778ac3c276726259c5529e1ac4e09674d4a3847a584b336259ca353c23926259c6313e4d46c55c1e02d69de710c714d9a319bb2988e4f414c73298be98414c4b42e48471f3531259cf529e19c9412cec929e19c9212cea929e19c9612cee929e19c9112ce9929e19c9512ced929e19c9312ceb929e19c9712cef929e16c4809e70929e13c31259c27a584f3e494709e9220e712e05c603e4f359f0bcde722f3b9d87cd277969acf46e3638dd96f52b24cb32969b6fe5650d2a2a455499bf5b776251d4a962be9347f6b307feb52b242c94a25ab94ac56b2c6c461ad92d3949caee40c25eb94ac57b241c946259b946c56b245c95625db946c5772a6921728d9a1e42c25672b3947c9b94ace5372be920b945c68b1ec547291928b955ca2e452259729d9a5a447c96e257b94ec55d2ab649f92cb955ca164bf92034aae547250c921258795f42939a2e42a2547951c53d2afe46a25d728b956c9754aaeb7627683921b95dca4e4668bf31625b72ab94dc9ed4aee5072a792bb94bc50c98b94bc58c9dd4a5ea2e4a54aee51f232252f57f20a25f72a79a5925729b94fc9ab95bc46c96b95bc4ec9eb95bc41c91b95bc49c99b95bc45c9fd86851ac25b953ca0e441256f53f276250f29798792772a799792772b7958c97b94bc57c9fb94bc5fc907943ca2e4834a3ea4e4c34a3ea2e4a34a3ea6e4e34a3ea1e4934a3ea5e451259f56f219259f55f239259f57f205255f54f225255f56f215255f55f235255f57f20d25df54f22d25df56f21d25df55f23d2be6df57f203253f54f223a3fbb1f9fc89a94be3623f55f23353feb9f9fc85f9fca5f9fc95f59d5f2bf98da5fbad92c72cddef94fcde94ff603e1f379f7f349f7f329f4f98cf27cde79fcde75fcce75fcde753e6f36fe6f3efe6f369f3f90ff3f94ff3f98c92dba714cb638281ad3b48a88f6add97d7732a14fc05c1e04dc7a2dafc8d3e1b8cbec6ecd327c56e94d91f65e96bcd7ead759c31667f8ca5af37fbf5967eb2d99f6ce9a79afda9967ebad99f6ee94f36fb27833e1bc098abd16b5db551654047f95a05ba5146570dba5a3a1ce8461bdd28d0d1f9ad05dd58a31b0dba714637067459a31b4bb15432dee8ba83a47225dfa38f9b4bfab8661e6a42f2bc7bf471eb98782726cfdbab8f5bcfc0abf3639239d644c89bc946570f3ad3dd04934037d5e826836e9ad14d01dd74a39b0aba1946370d74338d6e3ae86619dd0cd0cd36ba99a09b6374b34037d7e866836e9ed1cd01dd7ca39b0bba06a39b07ba138c6e3ee84e34ba06d0d11a97134077b2d19d08ba538cee24d0515f7b32e8e8def014a3d3fdc4980c7cc7e8a98f0abf43fd33e81652df0cba45d42f836e31f5c9a05b02b649b714fa15d2351a1df551fa6f5da6dc1d24d5260a619b5891f471d591f57157257fdc70de6e753010d76eb0b30262b5c694135c1bd48cb63346c80ee96ba0bc09ea523d8a075d67885d5f4f569af29a98ef7559dfcb419d950effbb8364fd5f65f1acb2984781ff3c39db52909c1df25672ce9e0f75eddca37b9e9198b35b81832167db256787bc959cb3bd50d7ce3dbaef1d8939bb13381872b68727670b79c9d9e2185910b8738f7efb8cc49cbd023892cfd936c9d9a16f25e7eced50d7ce3dfafd3b1273f61ae0483e673b7ae4de60c85bc9397b2fd4b5738fc6624662cede051c0c39db2bfdec90b79273f67ea86be71e8d0b8ec49cbd0f3892cfd94ea69c6d919c0d8af39d41e0ce3d1aa31e8939fb2070249fb37b647c76e85bc939fb28d4b5738fe64b4662ce3e62ca7a9ee1c7669e610ee87e6274738137f9dcdedbca94db05c9ede23a902070e728cddd8dc4dcfebc29eb3cfe39ac3d20dd2f8cee04d0fdd2e84e04ddaf8cee24f08ba10df4481b18f256721bf80dd4b57399e69147621bf8217030e4ec1ec9d9216f25e7ec5350d7ce3d5ad3301273f677c0c190b3bd92b343de4aced9ff86ba76ee2d34e59198b3b4ae54df2ffcc1dc2f2c06dde346b704747f34baa5a0fb93d13582ee09a36b02dd9346b70c747f36ba3ce8fe6274cda0fbabd11540f794d1b580ee6f46d70ababf1b5d1be89e36ba76d0fdc3e83a40f74fa35b0eba678caed3e8f47c17adbdfab6d1e9734bf1e80e923bb7e17aab60f096b1f6bba1dcc8cb93cf05839f45205bcb92b7d5a27d6f0a86eefb32e0c933f89e051b43e1c9034f73f23ce1bad342f2c70dcf719315d32cd86a02bf5a18fcca802d3a36ed93bd1ce8b02f697130b626cf58c8802d3a36edb70223e9b06fa36b0cb51fdd373764067819da52787d467bddc041f66aa0cedc2903754f366ce3e1efd4078c8732f6fdcd968e2957c35c215b746cda2f0023f9d83cfc8c85a132e62d46ae7e2303b6e8d8b6edf18ef8e898b53a62d6c6c4d86a31d27e1b3052fc5a879fb1305446bb5f60ea939a87da27515c9a873f66433aaf39d0e1fd5f9b83b13d79c6f0bcb6598cb4df0e8ca46b011eaeeb61547bf5c536c77d08e6335db3e8fa43f66aa04e47f540ddad703d65e8430ba5de9b629f9efc792ae4f17a36141ee673d7cc948f79ec3b9f0d92cd35bbcd375bb1c2368f7d39573f19d597933d61166661166661166661166661166661166661166661166661166661166661f69f396a5eceb59ee1783292ae003c1ce3fce13baaccb1700ee83198d7497edea290c7b97a5ac7b8c8f2b906eafc5f6680ed71c73a099c3b5f66e998d62985e712d72975c33ed9c3751bb86e8a61ed49c8b3d4e2b16d8f77c4c7c775243eadd1885aa7e553cc72a0c3f5704d4c3c5179d6e4b0dd9098edc21e9eb653c8ebf701e977ea517f62b7115cfbb6c4d2e93ea9ab7ac06f8e1c2875de19af1b544e721e17f30d6d25bfdea630687d425530f85a81f7140c6b5406cd57d3da8876cb760dd4195b15fcfbdc2c87bf7707cf5d23a4eb7458c7a6ef2c82ef7658c7aee3f337b63f6c076e2ad75abe350237d5995035e0e3e74c99e97ea680eb6703e00d2c9f68c3f519c9dfef15d78bb494c0d3063c1c6bd798ee6bf3988f49af17e9b062e5ba5fa63aed10bf0e86f8c5ad59237bc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2ec3f33beff8258f119e982278cc3b4c6269ccfa07719e1bcd803550376b9e70069ce69b1e5333ea3fc74d500db43a68cef08703def8ee7926b6e2dea5c92bdf1c1739fd3673a97437ef7439b23661d8e982d6762b4fb0cda5f0e8c14bf0ee0e16a8fed168f6d1bfb8c364f6316d5cf72ad5f89ca33d73a8586c46c17d78b70ccebd27a11fbfa55b0628aeb244887f3e0f86e159fdfff62af5dc07e0ad76825df6f1606cd01db6b05c91eae93f886892dad9348be1f28e439af11d446694d488bc357aaf35db8ce7ddf9471ad50018ef598e3efb4c5ad49c03e35f17770e68b73fcf4ee4a3abf5d0edb2b813521dbcd683b6384ec90be06cabfad1aa84bf5281e146b62d76d84de6588ecf6f79aadefe5a04ea7c3ffee2059ffbb2c9e2e8b59e7ce8f20cf1e837b3dae3ea93322468b20465407ef79b9ae5ff69a6d7bad32f6a3a3ad3af4dd1aa8f324f451a5bc2b8aeb7e21ea1a80f70bf67561286bc72b7d3de0bfa0bf487a3de0bf20875cf7a574fcc5707ce21a1d445f5ba8ceff5ad75186f57a437aef95ebb71ff1e27a43aaf32cf45579b32e37ea778ceb390baedf0d51cf7d903dbca72ac577ec1792be36623e220be6f2bfafd126d6948f1d11dccb1cdfcd467c976245ebcbf177b21d3f1d874ef84e77227128f6375d962fd4a63ac117aa530fbef0dc3315ef3f93f775f0fd10f541ad0e5fa9ce347817dc0c53cec279c2bef254c7df698bbbffa4f8699f87fb9dea68db8777aa2fa81ea86bbf1b9d625dea3bd5dbadeff9f84ef5d99067a7c2b3165c7df5ca88182d8618511d7cd6d1fefd1f758d399eef25b5fb4dbc4e0e279b3d7eebba3fa13a780f4d75daa09fcd3aeadae3d2740d49727d3a3e0fb414ece2f3404b99e2990b06c733677170daaeb36cd70da3ed7acb76fd30da96984bcc7d8a39c3ff3d51f6ff8581ff6745550a18ab53c0589302c6512960ac4d01e3e814308e4901e3d814308e4b016316188fe7b59d213e05cffebfa7d87b0db4cdf03e8730168dc1d063d1c4cb137bef83b619dea152f2ff37c0fc7f613597fb7f61e5e07b9352c03839058c5352c03835058cd352c0383d058c3352c03833058cb352c0383b058c7352c03837058cf352c0383f058c0d29603c21058c27a680f1a414309e9c02c65352c0b8401813615cc2cb58f0edff71ce0683d79a3d1f0ff3bb47c37728bade73caf17fe396ea3bf37b879bcb7d4f1faeb1e0fdbf1effb3770972aca128f55d8271ff3f361363a15c46aeb5e4b88e7a283cf81caaebf91606c642b98c5ccfa0e0339143e171fd5fbdbccf041563560e23d79ab152d734e2b382ed8e98313016ca65e47aee009f891c0a8febd9c5665ec642b98c5ceb73b36063283c9d10b3e58e98313016ca65647abe2c8c5967093cf81c56a723660c8c85721935cf0aa6987595c0b30262d6e588994f8cc893f43bd1bb1cb6389edb2bd5776240c6b129601c9702465c27c1d17fc5ad93e8e28d4fa1dcf8709dafb87512689be139913016f85cc0f3c562152f4fec3a09b4bd9a2916f8dcc6f3c56235f0703c4792051b43e121861c7c6f520a1827a780714a0a18a7a680715a0a18a7a78071460a1867a68071560a1867a780714e0a18e7a680715e0a18e7a780117fab32dc2bc6fe7e593dc26d47fd5619e9b6a37e978c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e4b94fb6d330c62f8c238f11791a92e3c9a3ef68abdb03dfbb1d3c1926dfd1d65a0f7c2786b431ae4901e38a14304a1c8b6b10cb61d43ca731f1ac2d81e734e0399d89e7b412784e079e3392e70973eaf41278882107df5b9102c635296094384a1c7d629438564e1c8551188551188f07631afa70614c453e16ca65d43ceb92e709637646093ceb2066f4bd665ec642b98c9a677df23c61ccd695c0b31e62b6ce113306c642b98c9a6743f23c61ccd697c0b30162b6de113306c642b98c9a6763f23c61cc3694c0b31162b6c1113306c642b98c9a6753f23c61cc3696c0b30962b6d1113306c642b98c9a6773f23c61cc3695c0b31962b6c9113306c642b98c9a674bf23c61cc3697c0b30562b6d9113306c642b98c9a676bf23c61ccb694c0b31562b6c5113306c642b98c9a675bf23c61ccb696c0b30d62b6d511335f1957a480714d0a1899e358289751f36c67e2d95602cf76e0399389677b093c6702cf0b92e70973eacc1278882107df5b9102c635296094384a1c7d629438564e1c85511885b134c6ee1430cab916465f19197e5fc53e4373e608b75d67d9aeab10db51cfd08c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9efb647b47f2b60ba53ec3ba0378389ea965f233af8f7b9639d6b309c64fc7ea6c2b56675ab1ca419db3207e6733c42f0376e9d8b44ff64a653ed5036626db8509ea1863c17fb2b1c68a87b67f0e93ef517dfd3923dc76545f3fd26d47f5f523ddb6e4b9e47925d8963c973caf04db92e792e7bed8c6724d3070df4eef57d2c738d79447997d64a5ef519d55a38b9f7581b4210edbd286e45a5109b625cf25cf2bc1b6e4b9e47925d8963cf733cfcf4bde76383786bf2ff4163737761ef09ccb100b263ff3daa7f32d9fceb17cca411d7c67edf90c7e66c02e1d9bf6cf87f3903666cdb3da9489350bf5567bc248ba737979c2f6b53a18bcc5b5aff38187a11d3433f919b6af0b2c9f563be24e7530572f60f0d3d57668ff02380f6963d63c6b4d9958b3506fad278ca43b8f97276c5f6b83c15b5cfbba007838fa1f263fc3f675a1e5d35a47dca90ee6ea850c7ebada0eed5f08e7216dcc9ae7345326d62cd43bcd1346d29dcfcbd39a059f698b6b5f17020f47ffc3e467d8be765a3e9de6883bd5c15cddc9e0a7abedd0fe4e380fc22ccc2e66cd43ffa73cb166a1dee99e3092ee02569ed67c167ca62dae1fdb093c1cfd3c53dcc37eec22cba7d31d71a73a98ab1731f8e96a3bb47f119c875298d7a49059e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e25c1eb3e639c39489350bf5cef084917417f2f284cfef9c110cde32d67e37942f029e9d0cf161f2335cf77eb1e5d3198eb8531d6c5f1733f8e96a3bb47f319c875298d7a49059e25c1eb3e65967cac49a857aeb3c6124dd4e5e9eb01f5b170cdee2fab18b8187a39f67f233ecc72eb17c5ae7883bd5c1f67509839faeb643fb97c07910666176316b9ef5a64cac59a8b7de1346d25dc4ca53089f435c1f0cdee2fab14b8087a39f678a7bd88f5d6af9b4de1177aa83b97a29839faeb643fb97c2792885794d0a9925ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e728668973e5c459f36c306562cd42bd0d9e3092ee62569e9670de614330788b9b77b8147838e66598e21ece3b5c66f9b4c11177aa83edeb32063f5d6d87f62f83f330d299d7a4905972637898253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a3987dc80dcdb3d19489350bf5367ac248ba4b7879c2f71e6c0c066f71eb762e039e4b19e2c3e467b86e6797e5d34647dca90eb6af5d0c7ebada0eedef82f3b04b9885d9c1ac79369932b166a1de264f184977292f4fd88f6d0a066f71fdd82ee0e1e8e799fc0cfbb11ecba74d8eb8531dccd51e063f5d6d87f6c99e300b7314b3e6d96ccac49a857a9b3d6124dd65bc3c613fb63918bcc5f5633dc0b38b213e4c7e86fdd86ecba7cd8eb8531dccd5dd0c7ebada0eedef86f320ccc2ec62d63c5b4c9958b3506f8b278ca4dbc5cb53c882cfb4c5f563bb8187a39f67f233ecc7f6583e6d71c49dea60aeee61f0d3d576687f0f9c87b4316b9eada64cac59a8b7d51346d2f5f0f284ed6b6b30788b6b5f7b8087a3ff61f2336c5f7b2d9fb63ae24e753057f732f8e96a3bb4bf17ce43da9835cf365326d62cd4dbe60923e976f3f284ed6b5b30788b6b5f7b8187a3ff61f2336c5fbd964fdb1c71a73a98abbd0c7ebada0eedf7c279481bb3e6d96ecac49a857adb3d61241df653b45501e37626c6c0620cacf820cf3ccf787678c633c3339e499ef18cf58c6791673cd59ef12cf78ca7cd339e82673cf33de399e919cf64cf78c679c6b3d4339e1acf781678c6b3d8339e599ef14cf18c27eb194fa3673ca33ce3e9f28ca7d3339e859ef1b47bc6d3e219cf32cf78667bc633d5339e259ef18cf78c27e7194f93673cb59ef1acf48c678e673cd33ce399e0194f9d673ca33de359e5194f87673cad9ef1e43de399eb19cf74cf78267ac653ef19cf18cf78321ef06483e7ae63c8c2df7780aecafaaebebeec9e32f0779a37ae82efec33e56ac7b17b4147f3ccfb1cdfc53871cd85a3ad6ed8277be381639f273c633ce3a9f78c67a2673cd33de399eb194fde339e56cf783a3ce359e519cf68cf78ea3ce399e019cf34cf78e678c6b3d2339e5acf789a3ce3c979c633de339e259ef14cf58c67b6673ccb3ce369f18ca7dd339e859ef1747ac6d3e519cf28cf781a3de3c97ac633c5339e599ef12cf68c6781673c359ef12cf58c679c673c933de399e919cf7ccf780a9ef1b479c6b3dc339e6acf781679c633d6339e499ef1ccf08c6787673cf33ce3a972f0ec60e2897ab6798727b619ce435e1ff772269fae30c7aa35c7257eb25703754e32038f7afe03bf4b5cf6fc3fb69d2b20465cef95c8593cb4bf7784dbaeb36cd75588ed7acb767d85d8963c973caf04db92e792e795605bf25cf2dc47dbcf2667bb4dde2f35741e799f533c8fbccf299e47dee714cf23ef738ae791f739c5f3c8fb9ce279e47d4ef13c0b3ce391f739c5f3c8fb9ce2791a3de319e5198fbccf299e67a1673cf23ea7781e799f533c8fbccf299e67bc673cf23ea7789e5acf787c7b9f936fef8397f74bc5f34cf08c47de2f15cf23ef978ae791f74bc5f3c8fba5e279e4fd52f13c633ce3c978c0f37cef97c2f7425d61ca7b4147eb4be3de439585e35c013a1acfa563e8ebd5a129cf65a882efec77705deeb04776f63bbe3b1c71475bddb04ff6f07d55fb3de119e3194fbd673c133de399ee19cf5ccf78f29ef1b47ac6d3e119cf2acf78467bc653e719cf04cf78a679c633c7339e1d9ef1acf48ca7d6339e26cf78729ef18cf78c6789673c533de399ed19cf32cf785a3ce369f78c67a1673c9d9ef17479c633ca339e46cf78b29ef14cf18c6796673c8b3de359e0194f8d673c4b3de319e719cf64cf78667ac633df339e82673c6d9ef12cf78ca7da339e459ef18cf58c6792673c333ce399e7194f958387eb9d5151cfd70fc7fbaa9ecfb6de5f0a71d15b16fe3e1ccf71edb018691fd73d202ff12c65e2897a2fc0520f6c6bffe9b7e804f39985bfe373385c39b5d462a47d574ee1bac646269ea8f719347a605bc7a2c994690d4016fede048c5c39d56831d2be2ba7ea79795ab3e0336d716b8db0cd719c43263ff3d8fe127c87465ec76abb15ab262b5639a8331cebd2a3fa03b227ccc21cc5ac79682e8558f17a361ccf990d85d1757d65e009fbc765c1e02dae7fdc0e3c1cd70f263fc37eec80e5d33247dca90ee6ea01063f5d6d87f60f386c3704c9c6e2ca21c4e24a07cf95c31c0bb2572af38e1432fb1067cd436b118915d737e73d6124dd525e9eb07fcc0783b7b8fef14ae0e1b87e30f919f609072d9ff28eb8531d6c5f0719fc74b51dda3f08e7a114e6032964963897c7ac79680e8258b350afe00923e9b6b3f214f259f099b6b87eec20f070f4f34c710ffbb143964f0547dca90eb6af430c7ebada0eed1f82f320ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22ccc7e336b1e7a369658b350afc51346d25dc9ca539c776809066f71f30e878087635e8629eee1bcc361cba71647dca90ee6ea61063f5d6d87f60fc3791066611666611666611666611666611666611666611666611666611666611666bf99350fbdb39d58b350afd51346d21de4e5099fdb6a0d066f71f30e8781e710437c98fc0ce71dfa2c9f5a1d71a73a98ab7d0c7ebada0eedf7c17910666176316b1e7a571bb166a15e9b278ca43bc4ca539c3f6d0b066f71fd581ff070f4f34c710ffbb123964f6d8eb8531dccd5230c7ebada0eed1f81f3500af38114324b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc12e7e161f621ce9a87fe0f4162cd42bd764f1849779895a7259c77680f066f71f30e478087635e8629eee1bcc355964fed8eb8531d6c5f5731f8e96a3bb47f159c8791ce7c2085cc921bc3c32cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc5ec436e689e0e5326d62cd4ebf08491747dbc3ce17b0f3a82c15bdcba9dab80e708437c98fc0cd7ed1cb57cea70c49dea60fb3acae0a7abedd0fe51380fc22ccc2e66cdb3dc9489350bf5967bc248ba23bc3c852cf84c5b5c3f76147838fa79263fc37eec98e5d37247dca90ee6ea31063f5d6d87f68fc179481bb3e6e9346562cd42bd4e4f184987d7e54e269e9cc59373c4e278d9d6fb5da63cde7c66e1ef5dc0c8d51f765a8cb48f398ebcc4d3c5c45367f1d4396271bc6c6bff579af204f39985bfaf0446ae9ceab21869df955375c0b39289a7dee2a977c4e278d9d6b15865ca13cd6716febe0a18b9726aa5c548fbae9caa079e554c3c517dd2aa61b01dd5be86c37654ae0c876d897974cc19da5d383eb02a18bcc5dd57e3b585a3af62f233efba7eafb27cc2eb37dea31eafeb93300b731433d37d6e6bd6b24df1092c1eda8e32c762387f6777593ea5e177761cf38114324b9ccb63d6b6fb93b7dd9ab56c537c028b87b67ee65830f919f6075707ee1893bd1cd4c13cbd9ac1cf0cd8a563d3fed5701e4a613e904266897379ccdaf63589db2ebe7f186d537c028b87b66b9863c1e367b13fb83670c798ece5a00ee6e9b50c7e66c02e1d9bf6af85f320ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22ccc7e336bdbd7256ebb387e8fb6293e81c543db75ccb1e0f1b3387e7f7de08e31d9cb411d3ce7d733f89901bb746cdabf1ece83300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb330fbcdac6ddf90bcedf0791cb44df1092c1eda6e608e05939fe1f8fd8d813bc6642f0775f09cdfc8e06706ecd2b169ff46380fc22ccc2e666dfba6c46d17e7f3d036c527b07868bb8939163c7e16fb839b03778cc95e0eeae039bf99c1cf0cd8a563d3fecd701e4a613e90426689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e25c3971d6b66f49dc764b387e8fb6293e81c543db2dccb1e0f1b3387e7f6be08e31d9cb411dccd35b19fccc805d3a36eddf0ae761a4331f4821b3e4c6f0304b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e486304731fb901bdaf66dc9db0e9f6747db149fc0e2a1ed36e65830f919ae7fb93d70c798ece5a00ee6e9ed0c7e66c02e1d9bf6c99e300b7314b3b67d47f2b60b59cb36c527b07868bb8339164c7e86fdc19d813bc6642f0775f09cdfc9e06706ecd2b169ff4e380f6963c6f39749ce76b86e936c54994fadbbcb94ab41f74253ae01dd8b4c7914e85e6ccab5a0bbdb944783ee25e01be95e6aca4b40778f29af02ddcb4c7925e85e6eca5da07b85297782ee5e533e0aba579af231d0bdca94fb41779f295f0dba579bf235a07b8d295f0bbad79af275a07b9d295f0fbad79bf20da07b8329df08ba379af24da07b9329df0cba379bf22da07b8b29df0abafb4d7901e8deead03d60cab781ee4153be1d746f33e51da07bbb298f05dd43a63c0e74ef80327dbed394c783ee5da69c03ddbb4d7902e81e36e53ad0bdc7942782eebda65c0fbaf799f224d0bddf942783ee03a63c05748f98f254d07dd094a781ee43a63c1d741f36e519a0fb8829cf04dd474d7916e83e66cab341f771539e03ba4f98f25cd07dd294e781ee53a63c1f748f9a329edf4f9bf21da0a37ee54ed051bf7217e8a85f7921e8a85f7911e8a85f7931e8a85fb91b74d4afbc047494772f051de5dd3da0a3bc7b19e828ef5e0e3acabb57808ef2ee5ed051debd12749477af021de5dd7da0a3bc7b35e828ef5e033acabbd7828ef2ee75a0a3bc7b3de828efde003acabb37828ef2ee4da0a3bc7b33e828efde023acabbfb414779f756d051de3d003acabb0741d760ca6f03dd09a6fc76d09d68ca0f81ee2453c67ee664537e27e84e31e577818efac27783ee54537e18740b4df93da05b64caef05dd62537e1fe89698f2fb41b7d4943f00ba46537e04744da6fc41d02d33e50f812e6fca1f065db3297f04740553fe28e85a4cf963a06b35e58f83aecd943f01ba7653fe24e83a4cf953a05b6eca8f828eaee3d4cfe8f6acdb25c58162a475e47393c317d28d015fba8364efe9c8161d9bf65b8091ce4161f8190b43656cb618354f1b43cc30af688bfbcdd4063cad0c3c4c7e86bf99da2d9f5a2c9f7250e754f0b39dc1cf0cd8a563d37e3bd8e638e7188b5a73dc85562c6aa04eabb9c8e9eb695c1ce9183a7f0b0e5fb8e2d86cf1343b6c7732c7918e4d7d62e730d8eeb06ce72ddb782da02dae6d7700f37206667ddcaee48f1bb6ed15e65894cf64270f3ead841824e513dace18213ba4af81f296290375a91ec583ae9dc4aedb119d4b64b7bfd7667d2f07753a1dfe7707c9fadf65f17459ccfaf744f794010e86f610e640a7c541fb79885d5744ec3a21765407afbd8d4cb15b6ef1d07e23f0d0fd553be8e83e85f8f11eaf6918b8ed7eafddc14dba0e606c74301692670cefb31a2d46da2f0023e996034f0753ccec73bdd08a0fde138cb6ead0776ba0ce2eb82e671d7575bb6bc80cf845bfff9f0d92edd36b19e285631301c427b062481b318c0906c62f92e419170c8c4f1cebef3bda7379ef59bd3d7b3380566361e267c6e14615e8b05cedd005c1e061181c0ea661181c0eaeb2c282c33f545fff8cd36ed15047efa1fdfde71eee3dbce7e8f547fa7bf76eedbb1ca94759f4481ae50192a28eb631c1c080517790ec4450ad652b2e79c6c0e7e8e4799a99fc0c2f7a632d9f6a2d9f72506714fc6d2c839f19b04bc7a6fdb10edb097644612cc60d2116e31c3ce386391638e84e3a6ca9f4779cb8a9b27cc1168d3ed9799ea8436470011c3f63e0f4df74631f659c191d0c9c6cea3df51dad3e097ab4565fb5f468ac1e7dd55d901e5dd517343d7aaa474bf5e8a81e0dd5a39f7ab4538f6eead14c3d7aa9472bf5e86443501c7dd4a38d7a74518f269e026cdf065efd8b5e5f21f568a01efdd3a37dface4adf01e8bb117df7adef14f5af477d87a07fd5ea110e7db5d57732fa2aadafacfa4e51df21ea3b7a7d87ab67c8562b596362bd56c9694a4e57728692754ad62bd9a064a3924d4a362bd9a264ab926d4ab62b3953c90b82e2c8fe594ace56728e9273959ca7e47c251728b950c94e251729b958c9254a2e557299925d4a7a94ec56b247c95e25bd4af629b95cc9154af607c55541572a39a8e49092c34afa941c517255509ca5d3b3727a164ecfbae959363daba667d1f4ac999e25d3b3627a164ccf7ae9592e3dab755b509c8dd233117ae641cf34e899053d93a0670eee0e8a33037a26e09ea038d2af47f6f548be1eb9d723f57a645e8fc4eb91773dd2ae47d6f548ba1e39d723e57a645c8f84eb916f3dd2ad47b6f548b61eb97e30288e4ceb91683df2ac479af5c8b21e49d623c70f07c591613d12ac477ef548af1ed9d523b97ae4568fd4ea91593d12ab475ef548ab1e59d523a97ae4548f94ea91513d12fa19259f55f239259f57f205255f54f225255f56f215255f55f235255f57f20d25df54f2ada09897df51f25d25df53f27d253f50f243253f52f263253f51f253253f53f27325bf50f24b25bf52f26b25bf51f25b258f29f99d92df2bf98392c795fc51c99f943ca1e449257f56f217257f55f29492bf29f9bb92a795fc43c93f953c130cccac602732c6f43c34cadfd3dfdf7be8487f437f5fc3a1ab0ff6ef3f72f0fa866bf7f75fd1d0774defd17d07fbaec52f7fdd7c99a630d61e3dda737dc3fec37b7baf6be8bbbabfa16f5fc3eebeab0fef3d865f7ac27c69ce732df6ecdd1b6decbffe13d2ff29d3e868d327d2e4d0a678dfc65597119089e57ca9b5ba3c87569aab0efd7a3fbb78b7db70ec605f7f43bee1b0fab7e7a0fa4eefdea606fcdb3115e463fd0dc7fa7b8ef637ec3bda77a8a1b9098f7be2f8329c689952c6972e9b3274cf83ff07e76a99f7f1d90300", "isInternal": false } ], - "packedBytecode": "0x000000028df71de5000000468b1f8b08000000000000ffed9d07741d45b6ae5bb61ce0481893b3450e06a3e49c64724ec6608c31b62c0b1b0739623298e8886d72b041ce39639cb331cc0c732727263030c3a47b67eeacb7dedcf7ee5befb15ed739b5977e95ab8f754497fc1fa97aad92aaf7a9eefdd5dfbbab5375d73f8320c8095253f3305d101c3ec9ef65fa7fe1b79b8a625c57a14bce9c2ce16c96259ccdb38433374b385b640967cb2ce16c95259cadb384f3981839155bb3a0f61437efb10e748d9b3191659ae66581a6f959a6e97159a0699b203bdaa8e3b384b36d96709e90259c276609e74959c2797296709e92259ca76609e76959c2797a96709e91259c676609e75959c2797696709e93259cedb284b3204b38cfcd12cef3b284f3fc2ce1bc204b382fcc12ce8b62e46c0f9c17ebff97e8ff97eaff97e9ff52f672fdff0afdbf83ae63ae9ebf527185493da429367e2b095369983a86a993f15be730750953d73075d3bf15e8dfba87a947987a86a957987a6b0dfa84e9aa305d1da66bc2746d98ae0bd3f561ba214c3786e9a630dd1ca65bc2746b986e0bd3ed61ba234c7786e9ae30f50dd3dd61ea17a67bc2746f98fa87e9be300d3058ee0fd3c0303d10a641617a304c83c334244ce5611a1aa68a300d0b5365981e0ad3f0308d08d3c3611a19a651611a1da63161aa0ad3d8308d0bd3f8304d08d3c4304d0ad323619a1ca647c3f458981e37347b224c4f86e9a9303d6d703e13a667c334254ccf85e9f930bd10a617c3f452985e0ed3d4304d0bd3f430cd08d3cc30cd0ad32b619a1da639619a1ba657c3f45a985e0fd31b617a334c6f85e9ed30bd13a677c3f45e98e685697e98ded72cb2237c10a6ea302d08d3c2302d0ad3e2302d09d3d2302d0bd3f230ad08d3ca30ad0ad3ea30ad09d3da30ad0bd3fa306d08d3c6306d0ad38761da1ca68fc2b4254c5bc3b42d4cdbc3b4234c3bc3b42b4cbbc3b4274c7bc3b42f4cfbc374204c07c3f471980e85e993307d1aa6ef84e9bb61fa5e983e0bd3f7c3f46f86e63f08d30fc3f4a330fd58db7ea2ffff549795fb773f0bd3cf75fe17faff2ff5ff5fe9ff9f1bcbfc3a4cbf316cbf0dd3ef0cdb1761fabdce7fa9ff7fa5ffff41ffffa3feffb5feff27fdffcffaff5ff4ffbfeaff7fd3ffff5dffff0ffdffeffaff3ff4ffffd4ffff19a6070a52f9d641cd5416c4d4469556269ffd88f81707b527a54573fd9bfc2fd0f65c3d2fff45bb167abe85616fa9e75b1aeb69ade75b1bf6b67abead613f51cf9f68d84fd6f3271bf653f5fca986fd023d7f01d81301dc1bd676656bae4d396093786d06b616dad61c6c2d6575606ba56d2dc026dbb725d88ed1b656603b56db5a832da16dc7889661cad3b6b220ae58291ca2d69b1ff77af5f3b2e3e2e71daad6dbc611eff1f1f30e53eb6deb8057c5c7097a5dc743dc9ca86d6dc17692b69d00b693b5ed44b09da26d2781ed546d3b196ca769db29603b5ddb4e05db19da761ad8ced4b6d3c17696b69d01b6b3b5ed4cb09da36d6781ad9db69d0db6026d3b076ce76a5b3bb09da76d05603b5fdbce05db05da761ed82ed4b6f3c17691b65d0036697f2f049b9c2f5ea46daaed38260796d17669b792cb489b0db64ba5bd06db65d25683adbdb4d360bb1c7c8bed0a686bc4d641dba4dd52bf75d3f9b220aefda4b852adb77bdceb0dd7acd6db33fef5269f39f60a6a742d033fdd41abde3a1f63bfa622f49da393f8117b2ee46f82b2524ef490638fb0ab634c0f9def9d66b96ec672f950a687a5fe6541bcf5ef69f0f434985b40de4dcc9694f898adf39471ccf687b266ecc97950638cd95b81c341cc76f6315be729e398ad84b266ecc9b970638cd9fb81c341cc96bb89d9e2421fb3a9fb6641608f3db91e6a8c313b0238e28fd98e3e66eb3e651cb3cf415933f6e49ab831c6ec64e0883f663b97fb73833a4f19c7ec1c286bc69edc9f698c31fb22703888d94adfced679ca3866df87b266ecc9bdc2c618b3af0147fc31dbd551cc96f8980d52cf4083c01e7b72dfba31c6ec02e0883f6687fafbb3759f328ed9ed50d68c3d7986d21863769dceabe70c3fd1cf19ce02db4fb5ed6ce08d3fb62b3a3a8aed621fdba9be2141608f51799ed718637b8fceab38fe05f44710db2fb5ed5cb0fd4adbce03dbe7da763ed4cbc13e50eef7813a4f19ef03bf81b2662ccbb3e5c6b80ffc08381cc46c858fd93a4f19c7ecdfa0ac197bd2cfa131c6ec17c0e120662b7dccd679ca3866ff37943563ef129d6f8c312b7d4dd5f9c297fa7ce132b07da56dedc1f6076dbb1c6c7fd4b62bc0f6b5b67500db9fb4ed4ab0fd59db0ac1f6176d2b02db5fb5ad186c7fd3b612b0fdbbb69582ed3fb4ad23d8feae6d9dc0f60f6deb0cb6ffd4b62e60fba7b675d536f5bc4bfa5ec9796b6b602d0be2dbb609d045a61c63be0cf2c56e790af381077d95c6efab44d5bd24a87bdd4b81a7a383ba27c0475d783a024fa7f879927d513bc7bfdee4362e31344d80af12a8571707f5ca015fb26e99177ff960c3fdbc8b85b16bfc8cc539e04bd62df35d81516cd8eec8fb3fb2ffa8b6f9dc9c1a5e07fb52f2f88cfeca8043fce542997fb5ab297ba166cb83dfb10dee64d81cc565322ec497ac5be6c55f1ed4a753c33316d795b1a3c1e8aa8dc8015fb26ed3771ee48bdcea9396a733896f07e7ddd6364d34efde00bebb1abe4b0ddfd876ca94eed8d6159863bffed1c7b61ef1afb710cf95e53a45fce0f9035e4fc45527f42dd729e247ecb990bf21a7a6ac94133da41d1676b50fcbb6447673b92ec672f950a6bba5fe6541bcf5ef61f0f43098d5f1a6271c0b1dec0fc918e86e70c87c2968d72342bbeea09d94b904b47370ee99d4ae9bc123f31d8147da6f6ccf8a1a98a788c0379ec3e2b59cfc8ee701aeb65791c128f3b6edd515183b5a181d9c1316a73b1e9602a3d8ba014f8923cda2b66b09896f17d79539e043cecdcd6b9b5c28737bf39ab215394ed98af1dc59a6ba5ef3c6bf9d8a0b71ffa80b8fe37da8c8513c16e2fd9b6f827863cd6c97ccf626ea1e8fabb6bcc4e09179f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f59f1c8f304ecb725e53a91309afddf5cdde74f7e8b4faf0b9f01fdcb697fb0e2427cf627fd202e33ea9c0b654e6c56c3f6dfd01fccec4b14b52d5df48d4db72dc51ff6076b886788a5068fe93bcfa20f3e9746cd5cf58132db0c99c7fe69a25f11f0b8da1f8b0d1ed337b61925a49a45b5b3aefaf445c599ad3f61416cbe8b87ba7aaeabbe7ba6be1d6a1ebf3a199a26bf496ad8549b7457f39a7abb78ce9be973673c6e483ecee7b8d82f037dc5dfce16d7ea9fd02ca87dacc05877d5574bf62be91bd1ddf09d0b65ce6d56b36d7ac0ef65c1e1c7062c23eb96f9cb60d91ec6badbb8ab6fda7e28dd815bf22d8dba75066e2973111cbb7fa6f38e8e81c599be2381c7e4f88f2fa9fe222519f0e0f1cec5398ba3e36821c663dcfd45cc7e90b6f36529837d481df4df4d7b2c167f9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec99f999158ff90c1d9ffd96923036501f9be4f30cf93e1b3e17dbd2acc6afeb6780f2cca9bd51677c473917de51dea1d9b0ef037e57cab62d5d3d5b8bda96e28fadef439e451fa5590f8b660ebeeb98f69b1df88d44d1af07f0b8da1fa3bedd616b338a48358b6a675df45d481767b67e0a05b1f94ef51771f15c57fa8b98c72ff3bb46d84f426cf81c3cea7b61c586ed68b701b67e6d92c76f2eb818e306e3d9ec2b28feb09fc4175a5be927117f3b505ce8f21821fba8f40929b1d455cafcb1594dd93fe93cf6152a8575fdcbf2bb4ce9fa24609beae0fbb1c9ed2beb92ed6bfb766d1f608dc97711ae2b47a73e8606b990ff9fcd6aca4a39292b5a0bbbda47e4bb52c86e2ed7d1582e1fcaf4b2d4bf2c88b7fee6b7847b1bcc2a76fe0a71f62f38d773d526f58ad0e832d048cae039afab7eb5661b69f699c63e91ad8c32787e2a65fe1fb451517dd26d7d2a5d9d2f44f5e7c4f305db398d5947b3ef7853ef0f98afaf435cf4079475b7096af7c90b8cf5b787f50b57ab20fad82265dac2fa8fe677af6cd77ec28bfd0da5cc2970ed7783ce6772ed77b4aee36dd77eb85c54ddb15d88fbd888f1882cf8bd48295360c4638f08eeae9665cf8f5856b432bf7d88d7a5788e10ff772353ed4d6fa32eb24fe1f7fda5cca5c67e13ff3953eafcd3d53732655dd206155bea2a653ac0be56a8f309d84ef84e516fcbef32a53bff14fd549daf8abfcec9ed7bb55e976cdfab2cbeaf01d6987c17a16f39ff143f62cf857c2f389e4839d143b41676b58fc8391cb29bcb753796cb87327d2cf52f0be2adff5506cf5506b38a9d1288b3def0ae85abb6ba4f8446ed41232983f7ae6ddf35b6ddeb68a8f354f37be9f9c1e1dfeec5e3a49b7336fbbb72e6fd5bdbf9497b831fcf4f6e85763661296bde9796e5e2ec9f8eef03e17921be0fe4ea1a293fa8ad67bec1e1d2771bc3779b06f4ddd6f0ddb6017d7bcdbde64c9a338df983cf219b01a38b631d1e57ebc2683bfe35074657ef6c9664c088dfbcc6e39d30baf84e787dc714c2739d16c0e8e27de34cef57770246fcc68030ba78473bd3ef54e37bdbb25c2b607431ae118ea1541746db5847ade1bf83718d8aea3b0e088e75740c30ba181b2411d41ecfe4488cdd8051963b16185d3c474a04b5efab1d89119f57ca7209c78ce98eed8efbfe14677a0fa221fa15449d6ba06f07f7ff8bb16f425db4e8e99627edb90ffa7670ff2ba9058e6579242df0f99c8bb1351341ed676147e2c16788b2dc09c058e688b177068c65c028cb9d088c7d1c319665c0d80718c57e12303ab80f9964ec930123deaf93e54e06c6ab1d315e9501e3d5c028cb9d028c2eee2926c06f5d18af014659ee5460bcd611e33519305e0b8cb2dc69c0789d23c66b3360bc0e1865b9d381f17a478cd765c0783d30ca726700e30d8e18afcf80f1066094e5ce04c61b1d31de9001e38dc028cb9d058c373962bc3103c69b8051963b1b186f76c47853068c3703a32c770e30dee288f1e60c186f014659ae1d30deea88f1960c186f054659ae00186f73c4786b068cb701a32c772e30deee88f1b60c186f074659ee3c60bcc311e3ed1930de018cb2dcf9c078a723c63b3260bc131865b90b80f12e478c7766c0781730ca721702635f478c7765c0d8171865b98b80f16e478c7d3360bc1b18fb5a18fb3962bc3b03c67ec028cb5d0e8cf7c4cf98bc96ee9701e33dc0736ffc3c49cdeec980e75eb73cc96f28de63f1755ffcbe92dba27f50f7badf073c03e2e7496e8bfb32e011867c580e35bb3f7ec6a466033260bc1f7806c6cf93d4ecfe0c78068266f75b347b207ec6a4660333607c007806c5cf93d4ec810c780681660f58347b307ec6a4668332607c107806c7cf93d4ecc10c780607359a3d68d16c48fc8c49cd0667c0380478cae3e7496a3624039e72d06c8845b3a1f13326352bcf807128f054c4cf93d46c68063c15a0d9508b66c3e2674c6a569101e330e0a98c9f27a9d9b00c782a41b36116cd1e8a9f31a95965068c0f01cff0f879929a3d9401cf70d0ec218b6623e2674c6a363c03c611c0f370fc3c49cd4664c0f3306836c2a2d948478c0f67c038d2c213f737d11fb6f81aeda8eea382bad75d18f26139ec2731c611e3e80c18c700a32c87fd24aa1c318ec980b10a1865b98463c674fd24aac0f7d8f87d27dba5aaa0eefa8c75cb93b69f04fa1ee7488bb141ddb518e796276d3f09f43dde9116e382ba6b311e782638d022013eeac2230cf9b01cf69398e8887142068c13815196c37e12931c314ecc80711230ca72d84fe211478c9332607c04186539ec2731d911e32319304e0646590efb493cea887172068c8f02a32c87fd241e73c4f868068c8f01a32c87fd241e77c4f858068c8f03a32c87fd249e70c4f878068c4f00a32c87fd249e74c4f844068c4f02a32c87fd249e72c4f864068c4f01a32c87fd249e76c4f854068c4f03a32c87fd249e71c4f874068ccf00a32c87fd249e75c4f84c068ccf02a32c87fd24a638627c3603c629c028cb8d74cc98eefa654a23f71d75add2d87d475d973476df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c33f97ece81ef04f89029c7982f83bc30e4c372233d63a366449e82f8780ab1eee8eb7982ba3f6fe1c9715477f4f50241dd8521db189fcb02c69159c0e8754cf541ac0fa3e279d111cf0b19f0bc083c2f39e27931039e9780e7e5f8799231f552063cc2900fcb8dcc02c6e7b280d1ebe8756462f43a361d1d3da367f48c9ef1683066431bee19b3221e8bebcba878a6c6cf93d4ece50c78a68266b2dcbd6e198bebcba878a6c5cf93d46c6a063cd340b3a916cd1c3016d79751f14c8f9f27a9d9b40c78a68366d32c9a39602cae2fa3e299113f4f52b3e919f0cc00cda65b3473c0585c5f46c533337e9ea4663332e099099acdb068e680b1b8be8c8a6756fc3c49cd6666c0330b349b69d1cc0163717d1915cf2bf1f324359b9501cf2ba0d92c8b660e188bebcba87866c7cf93d4ec950c78668366af583473c0585c5f46c533277e9ea466b333e099039acdb668c6ca38320b189fcb0246c73a16d79751f1cc75c43327039eb9c0f3aa239eb919f0bc0a3cafc5cf938ca95733e011867c586e6416303e97058c5e47af2313a3d7b1e9e8e8193da367cc8cf1f92c60f4dbda33b2323ab8be4afb0ecdab8ddc77d43b348ddd77d43b348dddb78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74cbe5f8fdf7771a6efb0be0e3c2edea97554cf42b5de37f4babe89513fa5d59b8656af1a5ae543993740bf371de897037e65dd322ffe3265be9880d991efe2e3c2751c03f5171fcf197a28ff6f39aa7b545bff5623f71dd5d63776df516d7d63f7ede3dcc77953f0ede3dcc77953f0ede3dcc7398b6fcce70635e7edf27d25b58eb775be859e97f2cfc37252a65fabd4ff3681df875cf8f6fb903f563405df3ece7d9c3705df3ece7d9c3705df3ecef9e21ce3e1ea06e0090c9e200dcf93643c9dc978c692f10c25e3b9878ce726329e5e643c93c9788ac9786692f13c4cc6f31219cf20329e3bc978ae25e3b9828ce769329eae643ce3c9788691f1dc47c6730b194f1919cf63643ca5643cb3c8784693f1bc4cc633988ca72f19cf0b643cd793f13c4bc6d39d8c673619cfa5643c13c9782e21e379888ca7908ce77e329ee3c878da90f1dc46c6731519cf13643c9dc8785e21e3a922e3994ac6534ec6d38f8ce74a329e1bc9787a92f1cc25e379848ca7888c670419cf03643c7790f13427e3b9868ce729329e2e643ce3c878da93f15490f14c23e3e94fc67333194f6f329e47c9784ac8784691f13c48c67317194f437c8f23139e29643cd791f13c43c6d38d8c670219cf74329e8bc9782ac9780690f1e491f1e493f17420e3b9958ca70f19cfe3643c1dc978c690f10c21e3b99b8ce745329e1bc8787a90f1cc21e39944c633838c673819cf40329ecbc8788e27e3694bc6733b194f0e014f2238fc1bc909f8fd75b0353396559f95ea5650f3fb3bdade0c967957e79b5bd6fd0ed8e45b55ef5a96459dde81ba94e97ce1b79b923aa1af3298177f79c0f12e09cfed643c6dc9788e27e3b98c8c672019cf70329e19643c93c878e690f1f420e3b9818ce745329ebbc9788690f18c21e3e948c6f338194f1f329e5bc9783a90f1e493f1e491f10c20e3a924e3b9988c673a19cf04329e6e643ccf90f15c47c633858ce775329ebbc8781e24e31945c65342c6f328194f6f329e9bc978fa93f14c23e3a920e3694fc6338e8ca70b19cf53643cd790f13427e3b9838ce701329e11643c45643c8f90f1cc25e3e949c6732319cf95643cfdc878cac978a692f15491f1bc42c6d3898ce709329eabc8786e23e36943c6731c19cffd643c85643c0f91f15c42c633918ce752329ed9643cddc9789e25e3b99e8ce705329ebe643c83c9785e26e3194dc6338b8ca7948ce731329e32329e5bc878ee23e31946c6339e8ca72b19cfd3643c5790f15c4bc6732719cf20329e97c8781e26e39949c6534cc633998ca71719cf4d643cf790f10c25e3194bc6d3998ce749329eab2d3caf3be291f7dd65dd32ff3a896f07dba150adf73d47759aa7d7d552af57f8c55f2e94293a36f55f3d1fc26585cbfc3e01f6fd9e071abdeda82ee6989832ff7623f7ddc6f0dda689f86e6bf86edb447cfb38f771cee47b5efcbe8bf1db3632e518f36590c7e38b8b6f0239aa67ad63fb3731eaa7b49a6f68f5b6a1553e94790ff49bef403fdbf982cc8bbf4c992f2660c6b82808e28d8bf7e3af53b1ea4b730ce8fabea12fd6eb03479a461d433e68e4bea38e218ddd77d431a4b1fbf671eee3bc29f8f671eee3bc29f8f671eee39cc977b5cec778dd58883ed4bd5fb91ea806bf0b753e2746bf6a5d0bf4ba5ae8750bc742e09132afc2bd68bfcffb7d3e2edffed8e6e3bc29f8668e73332fcf102f013657cf78a362b1219e2f1f4ddf51b1d8d87d47c56263f7ede3dcc73993ef45f1fb4e3e437c3da83da57b86b808781638d0c2513d93d74e8b8d3abd6ed4291fca54433d173ba8670ef89575cbfc62d80ed9c6ac78a6e83c8eef22e5a690308a6d815b9ee4fe3525a83da5dbbf16038f83fda0c8513d93fbd712a34e532cba4b996aa8e71207f5b4ed3b32bf04b643b6312b1e797757581350ee051246b12d72cb93dcbf5e086a4fe9f6af25c0e3a2fd7154cfe4feb5d4a8d30b16dda54c35d473a9837adaf61d995f0adb21db98158f8c6522ac0928f72209a3d816bbe5294d409d654ab77f2d051e17ed8fa37a26f7af65469d5eb4e82e65aaa19ecb1cd4d3b6efc8fc32d80e9ed933db98158fbc3329ac0928f71209a3d89638e5292d4c409d654ad78e2d031e17edbc23dd93edd872a34e2f59749732d550cfe50eea69db77647e396c874c98e76521737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc0c3a2b9e97755e581350ee651246b12d75cb937c7fe7e5a0f69463cc97417e39f02c73a08fa37a26fbbdaf30eaf4b2457729530df55ce1a09eb67d47e657c076c884795e16325767213383ce8a67aace0b6b02ca4d256114db32b73cc9766c6a507b4ad78ead001e17edbca37a26dbb195469da65a749732d550cf950eea69db77647e256c07cfec996dcc8a679ace0b6b02ca4d236114db72a73cc5c9f710a705b5a774edd84ae071d1ce3bd23dd98ead32ea34cda2bb94a9867aae72504fdbbe23f3ab603b64c23c2f0b99abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c6466d059f14cd779614d40b9e9248c625be194a724f9dc617a507b4af7dc6115f0b8782ee348f7e47387d5469da65b749732d550cfd50eea69db77647e356c87c6ce3c2f0b99ab3d738330fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c731433436c289e193a2fac0928378384516c2bddf224bf7b3023a83da5ebb7b31a785639d0c7513d93fd76d618759a61d15dca54433dd738a8a76ddf91f935b01d3cb367b6312b9e993a2fac0928379384516cabdcf224dbb19941ed295d3bb606785cb4f38eea996cc7d61a759a69d15dca54433dd73aa8a76ddf91f9b5b01d3cb367b6312b9e593a2fac0928378b84516cabddf224dbb15941ed295d3bb616785cb4f38eea996cc7d619759a65d15dca54433dd739a8a76ddf91f975b01d3cb367b6312b9e57745e581350ee151246b1ad71cb539c803acb94ae1d5b073c2eda7947f54cb663eb8d3abd62d15dca54433dd73ba8a76ddf91f9f5b01db28d59f1ccd679614d40b9d9248c625beb9627b97fcd0e6a4fe9f6aff5c0e3a2fd7154cfe4feb5c1a8d36c8bee52a61aeab9c1413d6dfb8ecc6f80ed906dcc8a678ece0b6b02cacd216114db3ab73cc9fd6b4e507b4ab77f6d001e17ed8fa37a26f7af8d469de658749732d550cf8d0eea69db77647e236c876c63563c73755e5813506e2e09a3d8d63be649409d654ab77f6d041e17ed8fa37a26f7af4d469de65a7497321f403d3739a8a76ddf91f94dc023d3d5c0e32a2e038327b0e823d393643c9dc978c692f10c25e3b9878ce726329e5e643c93c9788ac9781e26e31944c6732719cfb5643c5790f13c4dc6d3958c673c19cf30329efbc8786e21e32923e3798c8ca7948c673419cf60329ebe643cd793f13c4bc6d39d8ce752329e89643c0f91f11492f1dc4fc6f30119cf71643c6dc8786e23e3b98a8ce709329e4e643c55643ce5643cfdc878ae24e3b9918ca72719cf23643c45643c23c8781e20e3b9838ca73919cf35643c4f91f17421e31947c6d39e8ca7828ca73f19cf7c329e9bc9787a93f13c4ac65342c6338a8ce741329ebbc878ae23e379868ca71b19cf04329e8bc9782ac9780690f1e491f1e493f17420e3b9958ca70f19cfe3643c1dc978c690f10c21e3b99b8ce706329e1e643c93c8788693f10c24e3b98c8ce778329eb6643cb793f1e410f02482c3dfc54bc0eff3c126ef8ccd05db873abf016ccd2c3ee459c426b0e5eabcaca35598ae2d387cdda893abf7e4d05719cc8bbf3ce0f89084e776329eb6643cc793f15c46c633908c673819cf24329e1e643c3790f1dc4dc633848c670c194f47329ec7c978fa90f1dc4ac6d3818c279f8c278f8c6700194f2519cfc5643c13c878ba91f13c43c6731d19cf5d643c0f92f18c22e32921e379948ca73719cfcd643cf3c978fa93f15490f1b427e31947c6d3858ce729329e6bc8789a93f1dc41c6f30019cf08329e22329e47c8787a92f1dc48c67325194f3f329e72329e2a329e4e643c4f90f15c45c6731b194f1b329ee3c8783e20e3b99f8ca7908ce721329e89643c9792f17427e379968ce77a329ebe643c83c9784693f19492f13c46c65346c6730b19cf7d643cc3c878c693f17425e3799a8ce70a329e6bc978ee24e31944c6f330194f3119cf64329e5e643c3791f1dc43c633948c672c194f67329e27c978aeb6f0cc77c4638e9b20f3f3097cabf9eea08b9a12f03b7e67fd03478cf30d4699ff001891d7b5666d0c9e36866647d3b7aabfbcab23f7c0717be17be70cdbab4d0368d6d6e0696b6876347d2b2de4d9b6bc3388db0bbf53cbb0bdf0bd6a07ed7369c2e051538e315f06f94d8ef57154cf427ceffa9b18d7abb4da6c6835dfd02a1fca6c04fd363bd02f07fccaba655efc7966cf1cc5ac78a42f89ed7b00fd4818c586e3627c143f4f69c2e05153baf6f123c7fa38aa67b21ddb12d875ff0874973218ab5b1cd43307fccaba657e8bc5774110af165beba0c5560bcfd606d642fc65cabc310b991974563cf2ae81b026a05c7f1246b16d069e6df1f394260c1e35a56b1fb739d6c7513d936dc2f6c0aefb36d05dcae0feb5dd413d73c0afac5be6b7c376c884794b16327b9debc7ac78e41d6d614d40b901248c62db0a3c3b62e7292e4c183c6a4ad78eed70ac8f9b7aa6dab19d815df71da0bb94c1fd6ba7837ae6805f59b7ccef84ede0993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999b59f10cd479614d40b981248c62db0e3cbb62e7493d77401e35a57beeb0cbb13e6eea997aeeb03bb0ebbe0b74973218abbb1dd43307fccaba657e376c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a6790ce0b6b02ca0d226114db4ee0d9133f4f69c2e05153bae70e7b1cebe3a89ec9e70e7b03bbee7b40772983b1bad7413d73c0afac5be6f7c276d8eb993db38559f10cd679614d40b9c1248c62db0d3cfb62e7493d3f451e35a56bc7f639d6c74d3d53edd8fec0aefb3ed05dca60acee7750cf1cf02beb96f9fdb01d3261de9285cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7b9e9e8ac78ca755e581350ae9c84516c7b81e740ec3c25850983474d39c67c19e40f38d6c74d3d53cf1d0e0676dd0f80ee5206f7af830eea99037e65dd327f10b6436367de9285cc3e361a86d9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a398196243f154e8bcb026a05c0509a3d8f603cfc7f1f394260c1e35e518f36590ffd8b13e8eea99ecb77328b0ebfe31e82e6570ff3ae4a09e39e057d62df387603b7866cf6c63563c953a2fac09285749c228b683c0f349fc3cc50983474de9dab14f1cebe3a89ec976ecd3c0aefb27a0bb94c158fdd4413d73c0afac5be63f85ed906dcc8a67b8ce0b6b02ca0d276114db21e0711077499e7c8347e63f21f0ade6ab743e4fffc7ed55058c0cdb2bbf01346b63f0b431343b9abe55fdc7eafc71fa3f6eafb1c0c8b0bdda3480666d0d9eb6866647d3b7d2629cce1fafffe3f61a078c0cdbabad5b9ee284c1a3a674e71b9f02cf77e3e7495ec77d9a01cf7781e73bf1f31439aa67a15aeff7803daef52aad3e33b4fad4d02a1fca20c3670ef4cb01bfb26e99177f9ed9334731635b28ac0928f70909a3d8be033c2eda0d55f72bf4ba64fd2dc2f4c3136bfcbab8bf86f7165aeaf50a87f8cb853267b7ab61fba966cb83df65bba9fa1c346c8ede792bb2dde79579f19717d8aff55ddd438dbaf77010780e5a34db6fd16c9f23c6fd06a3ccef0346db7ddefd8e78a2ee3b8b3f6c330e926a86ef011f001e57e7c55171e67a9fcbf4fcf28085e79bf8780a3136d0978b58c5b6ad2e75b7ed3b31d6bd089f61a12f07fb40f238d541af4bd6af8e05ff75a253cd4bb17d90e35407a3ceb950e6bfcfa961fb3f698e53cd82c3ef0b1768bb9491dfbfd176731d057add32df5dffc738119b3f06d67e8ed8ddd0924d33dcb73eb6e8d8c3c2dd83801be3b121b675d4bd0fdcd63d0c1dd934c36dfd8945c79e16ee9e04dc8cfb754f434736cd8eb45ff7b370f723e066dcaffb193ab26976a4fdbabf85bb3f0137e37edddfd0914db323edd7032cdc0308b819f7eb01868e6c9a1d69bf1e68e11e48c0cdb85f0f347464d3ec48fbf5200bf720026ec6fd7a90a1239b6647daaf075bb807137033eed78383da3ab26976a4fdbadcc25d4ec0cdb85f971b3ab26976a4fdbac2c25d41c0cdb85f57183ab26976a4fdbad2c25d49c0cdb85f571a3ab26976a4fd7ab8857b380137e37e3ddcd0914db323edd75516ee2a026ec6fdbacad0914db323edd7632ddc6309b819f7ebb1868e6c9a1d69bf1e67e11e47c0cdb85f8f337464d3ccb65f3bea5f96713fe48f9dea931a7f3693f7b0b02f898b98721407858efa9a24fb21ef33b4fad8d00abfebbf1ff473d5272baadf98f8f3cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccf8cef79e2f31529d710ef00d785516cf84ccac57d7e55f72bf5ba64fd2dc274fbc9357ee37f6e519c7c0e20facbfb98571a75ce8532dbcfae61ebabd9f0f9223e17b56dcbfdb1d7a16eef9ce37bfaf82ce8683eef3c60d16c9f45b3bd8e18cd3643e6f702a3e8b70f785ced8ffb0d1ed3b7eddd7036cda2da5957711f156736df05b1f92e1eeae65b08c585ea1b6dc70487b7275207dc775dc461a6df04c0fdc2c173f72257efffab3aed35ea74d0a8533e94b918eab9d7413debba6fc97435f0b86a8f028327b0e8235333329e27c9783a93f18c25e3194ac6730119cf3d643ca791f1dc44c6730c194f2f329ec9643cc5643c0f93f10c22e36947c6732719cf89643cd792f1e492f15c41c6f334194f57329ef1643cc3c8782e22e33944c6733919cf7d643c6790f1dc42c69320e32923e3798c8ca7948c673419cf60329e73c978fa92f19c4cc6733d194f4b329e67c978ba93f14c24e3b9948ce721329e4bc8780ac978ee27e3398b8ce736329ee3c878da90f15c45c6f304194f27329e2a329e72329ef3c978fa91f19c4ac6732519cf8d643cadc9787a92f13c42c65344c633828ce701329e73c878ee20e339818ce71a329ee6643c4f91f17421e31947c6d39e8ca7828ce742329efe643ca793f1dc4cc6732c194f6f329e47c9784ac8784691f13c48c65340c6731719cf49643cd791f1b420e371fd1e60a63ccf90f17423e39940c65349c6733119cf00329e33c9786e25e3c923e3c927e3e940c6d3878ce771329e8e643c63c8788690f19c47c6733719cf29643c3790f1b422e3e941c633898c673819cf40329eb3c9782e23e3b99d8ce778329eb6643c39043c89e0f06f31e1f7bf0e826dafcee3b7059b59d627cf85a5bc3a0edd5a70f8ba9b59d6bdcfc2803aed096aea52a6f385df6e4aea84beca605efce501c73e129eb6643cc793f1dc4ec6731919cfd9643c03c9788693f14c22e3e941c6d38a8ce706329e53c878ee26e3398f8c670819cf18329e8e643c8f93f1f421e3e940c6934fc69347c6732b19cf99643c03c8782e26e3a924e39940c6d38d8ce719329e03643c2dc878ae23e339898ce72e329e02329e07c9784691f19490f13c4ac6d39b8ce758329e9bc9784e27e3e94fc67321194f05194f7b329e71643c5dc8789e22e3694ec6730d19cf09643c7790f19c43c6f30019cf08329e22329e47c8787a92f1b426e3b9918ce74a329e53c978fa91f19c4fc6534ec65345c6d3898ce709329eabc878da90f11c47c6731b19cf59643cf793f11492f15c42c6f31019cfa5643c13c978ba93f13c4bc6d3928ce77a329e93c978fa92f19c4bc633988c6734194f2919cf63643c65643c09329e5bc878ce20e3b98f8ce772329e43643c1791f10c23e3194fc6d3958ce769329e2bc87872c978ae25e339918ce74e329e76643c83c8781e26e32926e3994cc6d38b8ce718329e9bc8784e23e3b9878ce702329ea1643c63c9783a93f13c49c6d38c8ce76a83077f57e7d6f27ed85eb0c9efcfeac6ab8d5e9794916722eaded26ec3a6eabbcb517d7707355319ccef82fa0afb6ee0d9ed88678fc163face837c0fd06ca761538c3b1c31ee3418657e07308a7e3b8167a7239e5d068fe93b0ff23d41b3ed864d316e73c4b8dd6094f96dc028fa6d079eed8e7876183ca6ef3cc8f703cdb61a36c5b8c511e3568351e6b700a3e8b71578b63ae2d966f098bef320df1f34fbc8b029c6cd8e183f3218657e33308a7e1f01cf478e78b6183ca6ef3cc80f00cd3e346c8a719323c60f0d4699df048ca2df87c0f3a1239ecd068fe93b0ff20341b38d864d316e70c4b8d16094f90dc028fa6d049e8d8e7836193ca6ef3cc80f02cdd61b36c5b8ce11e37a8351e6d701a3e8b71e78d63be2d960f098bef3203f18345b6bd814e31a478c6b0d46995f038ca2df5ae059eb88679dc163face837c3968b6dab029c6558e18571b8c32bf0a1845bfd5c0b3da11cf1a83c7f49d07f90ad06ca561538c2b1c31ae3418657e05308a7e2b8167a5239e55068fe93b0ff295a0d972c3a6189739625c6e30cafc326014fd9603cf72473c2b0c1ed3771ee48783664b0d9b625ce28871a9c128f34b8051f45b0a3c4b1df12c33784cdf7990af02cd161b36c5b8c811e3628351e61701a3e8b71878163be25962f098bef3203f16345b68d814e302478c0b0d46995f008ca2df42e059e8886791c163face83fc38d0acdab029c60f1c31561b8c32ff01308a7ed5c053ed886781c163face837c5fb0096f11d8ded7f962b0cdd7f912b0cdd3f952b0bda7f31dc1f6aece7702db3b3adf196c6feb7c17b0bda5f35dc1f6a6ce7703db1b3adf0b6cafeb7c6fb0bda6f365607b55e7fb806daece5f05b6393a7f35d866ebfc35607b45e7af05db2c9dbf0e6c3375fe7ab0cdd0f91bc0365de76f04db349dbf096c5375fe66b0bdacf3b780ed259dbf156c2feafc6d607b41e76f07dbf33a7f07d89ed3f93bc13645e7ef02db489dbf1b6cf7eafc3d60fb54e7ef03db7774fe7eb07d57e71f00dbf774fe41b07da6f343c0f67d9d1f0ab67fd3f96160fb81ce3f04b61feafc08b0fd48e71f06db8f757e14d87ea2f3a3c1f6539d1f03b69fe9fc78b0fd5ce72780ed173a3f116cbfd4f94960fb95ce3f02b6cf757e32d87eadf38f82ed373aff18d87eabf38f83ed773aff04d8bed0f927c1f67b9d7f0a6c5feafcd360fb4ae79f01db1f74fe59b0fd51e7a55d53edec9f74be2088b79dfd3aa8990ac0b7f85365feacf3ad8c32b26c2e9429d51ff451cf38d4b74ca51d967659d9a41d7e1f6cd20ecf079bb4c3f3c026edf07b609376f85db0493bfc0ed8a41d7e1b6cd20ebf05366987df049bb4c36f804ddae1d7c156a6f3af814ddae157c126edf05cb0493b3c076cd20ecf069bb4c3af804ddae1596093767826d8a41d9e01366987a7834ddae169609376782ad8a41d7e196cd20ebf043669875f049bb4c32f804ddae1e7c126edf073609376780ad8647ff91a6cd2368f049bb4cdf7824ddae64fc1266df377c0266df377c1266df3f7c0266df3676093b6f9fb6093b6f9dfc0266df30fc0266df30fc1266df38fc0266df38fc1365ae77f0236699b7f0a36699b7f0636699b7f0e36699b7f0136699b7f0936699b7f0536699b3f079bb4cdbf069bb4cdbf019bb4cdbf059bb4cdbf039bb4cd5f804ddae6df834ddae62fc1266df357607b56e7a5ad6e0d367956aca6c26f39e1383ccdc097309505f1b6fd389541fe19a8bb4cd3c878c692f1bc41c6730119cf72329e65643ca791f17c48c6b3898ce718329ebd643c7bc8785e21e379978c6710194f3b329e13c97872c978ae20e3a926e3798d8ce722329e43643c9793f19c41c6b3918c670319cf52329e25643c09329edd643cbbc8783e20e39949c6f33619cf60329e73c9784e26e36949c6d39d8ce752329eb9643c9790f12c26e35944c65348c6731619cf7a329e75643cf3c9788e23e36943c6b3938c670719cf74329eafc978aac878de24e32927e3399f8ca71f19cfa9643c5792f1b426e3e949c6339b8c672119cf02329ef7c878ce21e3594bc6b3868ce704329eed643cdbc8789a93f14c25e31947c6f33a194f7b329e0a329e0bc978fa93f19c4ec6732c19cf14329e59643cef90f1fc818ca7808c673519cf2a329e93c878b692f16c21e36941c673808ce755329e4a329ef7c9780690f19c49c69347c6934fc6d3818c672419cf0c329eb7c878ce23e35949c6b3828ce714329e8fc8783693f1b4d2ff59787a90f1cc21e3194ec6338f8c672019cfd9643c9791f11c4fc6d3968c27878027011c01d8e4f7e660fb4ae70f814dbed773006c5fea7c35d87eaff3cf82ed298bad99854f18be029bbc6bfd34d8e4fecc97609377387e0f36392e8a7f35dfb7e070fe66b08cf8696ee1477fbfb770491eb7b72c5316c4bbbdd1575970f8f794f280e369129eb6643cc793f15c46c6733619cf40329e79643cc3c978e690f1f420e36945c6b3998ce723329e53c8785690f1ac24e3398f8ce72d329e19643c23c9783a90f1e493f1e491f19c49c633808ce77d329e4a329e57c9780e90f1b420e3d942c6b3958ce724329e55643cabc9780ac878fe40c6f30e19cf2c329e29643cc792f19c4ec6d39f8ce742329e0a329ef6643caf93f18c23e3994ac6d39c8c671b19cf76329e13c878d690f1ac25e339878ce73d329e05643c0bc9786693f1f424e3694dc6732519cfa9643cfdc878ce27e32927e379938ca78a8ce76b329ee9643c3bc8787692f1b421e3398e8c673e19cf3a329ef5643c6791f11492f12c22e3594cc6730919cf5c329e4bc978ba93f1b424e339998ce75c329ec1643c6f93f1cc24e3f9808c671719cf6e329e0419cf12329ea5643c1bc8783692f19c41c6733919cf21329e8bc8785e23e3a926e3b9828c27978ce744329e76643c83c878de25e379858c670f19cf5e329e63c8783691f17c48c6731a19cf32329ee5643c1790f1bc41c633968c671a194f330bcf21473c72ac9475cbfc2102dfea3d5cb917bf57ff4fc0ef387e73b523c64306a3cc5703a3d8f6004f77473cbb0c9e5d162d8e966fa5857cfb63b7fe9f80dff17b85ae62aabbc128f3b698da053c3d1cf1ec30787658b4385abe9516d2f751fa9024e0771c0fcf554cf5301865de1653389e6b4f473cdb0c9e6d162d8e966fa585f435943efc09f81dc7bf7415533d0d4699b7c5148ed7d5cf11cf1683678b458ba3e55b6921ef9ec93bcb09f81dc713721553fd0c4699b7c5148e0fd1df11cf668367b3458ba3e55b6921df92906f2225e077fcbebfab98ea6f30cabc2da6f0fbc8031cf16c32783659b4385abe9516f2ad3ab9664fc0eff87d5b573135c06094795b4c6d029e818e7836183c1b2c5a1c2ddf4a8b413a2fcfe012f0fb2060741553030d4699b7c5d406e019e488679dc1b3cea2c5d1f2adb418acf3d2273301bf0f0646573135c86094795b4cad039ec18e78d6183c6b2c5a1c2ddf4a8b729d97770613f07b3930ba8aa9c106a3ccdb620ac7df2d77c4b3cae05965d1e268f9565ac8bbf7abf5ff04fc8ee3710e76c4586e30cafc6060141b8ef756e1886785c1b3c2a2c5d1f2adb4906f69c9371813f03b8e8fe52aa62a0c4699b7c5148e7752e9886799c1b3cca2c5d1f2adb418aef3cbf5ff04fc3e1c185dc554a5c128f3b6985a063ccb1cf12c31789610f9565ac8bb70d2872d01bf5701e372478c5131b51c18c5b604789638e25964f02c22f2adb4906739f2ce45027e1f0b8c4b1d3146c5d4526014db22e019eb886781c1b3c0a2c5d1f2adb4906fc72cd4ff13f03b8ed7bec811e3588351e61701a3d81600cf02473c51f7f01ac277d4fda886f01d756fa5217c47dd276808df51f7d81bc277d4f55b43f88eba166908df51f7191ac277d4397d43f88e7abedd10bea39ed53684efa8e78e8d7dfff6c792a6752c399aed5a533d96f8f69cb33d1f17bfefe24450fb9a464d39c67c19e4f1fa65a1032d1cd5b310af09bf8971bdb66bf8058656f95006af515d5dff8d3378645efc652333c6454e7cbe0b13e043de515636b9d7f23ed8e41ec77cb0c93d907960937b68ef814dee67bd0b36b9dff50ed886ebfc48b0c9bd4bec8f24f736b781ad5ce7b11fcc609ddf0236794e84fd2fe459df66b0c9f35a7cee2fcfdc37814dfa4de0f366e9fbb2016cd27f099f734a1fb47560937e84f87cad5ae7d7804dc694c0e73a5feafc2ab07da5f3f83c41c6ea5c01b627757e0ad8bed0f9afc1f684ce2f00dbef741eeff93caef363c1f65b9d7f1b6cbfd1f9b7c0f698cebf09b647757e2fd87eadf37bc03659e7b17fe8e73abf0b6c8fe83cf64bfc95ceef00db2f75fe0db04dd2f9d7c13651e75f03db2f74fe55b04dd0f9b960fbb9cecf01db789d9f0db69fe9fc2b60fba9cecf02db189d9f09b69fe8fc0cb08dd6f9e9601ba5f3d3c0f6639d9f0ab68775fe0f60fb91ce8f035b339d5f0436f97e32ded395771697804dc629c17bf5f2ad922ab0c9f87bcbc0d65ae7f1b98cbc97341c6cf26dfb4ab0c9fbff1560933192cac126e3380d069b7c0b6c10d8e47b6503c12663960e009b8cabda1f6cf2ede27e6093f7297b824dc608e90136f98e4a77b0c9d8773826b07cefb21a6cf24e108e132cdfddff126cf26ef9576093f19b704c60f9c6d59360937149bf00db393aff04d8e47dcddf81ad40e71f07dbb93aff5bb09da7f3bf019b7cbff231b0c93b358f824dbea3ff6bb0c9bbd993c176b1ce7f0eb64b74fe11b0c977887e0536192bf697606baff393c026efcc4f04db153aff0bb0c9586713c026df57fd39d8e41b5fe3c156a4f33f035bb1ceff146c253a3f066ca53aff13b075d4f9d160eba4f3a3c0d659e77f0cb62e3aff30d8baeabcb4336a7f56fbf9413d5f16c4775ea6fc7d1cd49ed25d1b0803f2c479ae9d0f3ce86b7fec752f4e9ed7cb7edf4caf5762683ff8de1bbbefd435c53ebdae167abd7b0ddfb950e653dd88e0f573ae5eee80b11c969175cbfc95b0ec1e63dd6d747df739aaef5e8349b8f7019394f9ecec9ab24fe8c6b2352c13235bf2fa58622d000d712a83bc30b8d1aab810cf7bebc2b30f78e2df4f52d7eb2e6202f7adb8afd7cd7b4c66ace54399bda0df1e07fae1be2eeb9679f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f59f1c8f3047cae2ce50e92308a6d3ff0ec8b9fa7109fc3cafad5739d07e0b9cefed8fdd67ebed752afb7d0a8732e9459794e0ddb109dcf83df65bb456dcbbdb1d721fdb6147f79509f7dc0e3605b2679f61b3ca6ef3c8b3e4ab33d16cd763b6234db0c99df0d8c7b757e0ff0b8da1ff71a3ca66f6c33f6916a16d5cebae897902ece6c7d100a62f35d3cd4d5735dd5674af5e5308f5f070d4db10f84d8f039781e2cf389fe9f007d3e017d8e661b60f64bc076ea6360dc1b3b6371ad67c0d2f65f69688a7d205ed4da4a1f88f8db81e24297c708d947cdbe15585729331d8e7333751efb011d8475bd67f95da61c63be0cf2d8a6ee8cbfcec9ed2bfd5765fbeeb4f8de0eac31f9aef52e478e4ee247ecb9907ff79c9ab2524ef410ad851dc7ad427673b98f8de5f2a1cc2e4bfdcb8278ebbfd3e0d96930abd8990d71f61e9cebb96a937645687425682465f09cd7419f226b1b291ce24f9591eddfca2883e7a7526611b451aa2ed2ce4b3db11f131e035c9d2f1c34ea27f378be603ba731eba8e2e3f6936b785d5f0b340bec5ab3f4f5db04edc51ef8bd2cf8f67dfd36410cd9ce4b65fd85b07ee16a15441f5ba4cc16e338eae27a12b7a5a9e73e6092323ba01dfa1ff5b8ae3b5ad7e851d775bb1cf0e0b5864ce98eef788c71d1be38aa67a1edd8b5c7a8533e94b918eae9e03c26ed3ba93bc1b78b6d8e5ac839d45e438b5c28f37da3ed88d251d681f701dcd6a5d87a3e5868a98b94f989d14eed70c0e472bbe179965aef7e4b5da5cc2fa1fdfb1ccee7f7eadfb12dfdabe57799d2b507f84df9adf1d739b97de5fd46d9be5b2dbe3f02d6987cd7fa26859cef8b1fb1e742fe2f70fc9672a287682dec6a1f91f73b91dd5c6eafb15c3e94d966a97f59106ffdb71a3c5b0d66153bbf8538fb2b9cefbb6a37b7456854081a49197c5660de6fc17b2778dc6fa8eb02993f008c62db09fafe0fa7f7cb536c070c36f37eb9ed7cb0d0e0c7f3c1ff05ed6cc252d6fd7380d4b90dd64bea1118750d8cba3a3a7f2dcd31f42c033f1dc0be57e74567f90dcf71a54c4ebbd47f77f7af6adfc7166ea9073eafdb6d70ef3174c57b512d815bc5bd796d81e7e98eaf694bf15ccc3c1fda0dec52260fd86de771872c75318fd3cd82c3af05bf31cae27576bae5ccfc016319bc67b0dfc2646bfb627b2fa7a8b0d0e4b7b57b070d669baeb21f60ccc9bacc7d05cf87a4cc99b0dd1296b2aa4dfaaf136bf491ed88f7da6df7595c1d2fa2eeb3883fc5687b67d2c5338ca6f86e5aebd8d6dbb5dcf69c8dbd3f436b231f8fefe20a3c56a4d362b785c7d53dcd282d765b7cc7a745a7a1b676cea6c52e0b8fab6bcc282d76597cc7a845a5edde824d8b9d161e57d71a515aecb4f88e4f8bceb5ee6ba4d362878527fe7b1ae9b5c067629930ef22606e6de4e3f15d5a6e7b7667d362bb85c7d5b3bb282db65b7cc7a7455127db35bb4d8b6d169e6d0dacc5368beff8b4e8d2d5764fc5a6c5560b8f83fb6b69b5d86af11d635c0cc3fb6be9b4d862e1d9d2c05a6cb1f88ef1fcb053ba7b86a8c547161e57f7fea2b4f8c8e23b462d8628df9beba0c5660bcfe606d662b3c5777c5a947754be3fac83161f5a783e6c602d3eb4f88e4f8b215d94ef4d75d06293856753036bb1c9e23bc66ba8645c6cac83161b2d3c1b1b588b8d16dff16951913cd7da50072d3658783634b0161b2cbee3d3a230794c5d5f072dd65b78d637b016eb2dbe638c8be4f5e4ba3a68b1cec2b3ae81b55867f11de3712419176beba0c55a0bcfda06d662adc5777c5a5426ef3fada983166b2c3c6b1a588b3516df31de7349c6c5ea3a68b1dac2b3ba81b5586df11d9f1625c963eaaa3a68b1cac2b3aa81b55865f11d9f16c392cfc456d6418b95169e950dacc54a8bef18cf3b93edc58a3a68b1c2c2b3a281b55861f11de37967f2fec5f23a68b1dcc2b3bc81b5586ef11d63db993cef5c56072d9659785c8d1119a5856d7cca18cf3b935a2cad83164b2d3caec6368cd262a9c5778ce79dc9e3c8923a68b1c4c2e36a2cca282d6ce360c61817c9b673711db4586ce159dcc05a2cb6f88ef1be56b2ed5c54072d1659785c8dcd11a5c5228bef18af4792f7f816d6418b85169e850dacc5428bef189f1525cfc117d4418b05169e050dacc502f0bd2f76dfa9fedce243fa625d6168910b65be6bf4c58ad251d681efd0625daa63af4baa5fd9071175a986ba48991f1a7df93e70c0e4a8aec998795faf4bfaa67f6ca9ab94f959bb9ab2bfd0f9046c9343b0ae3f597e9729c7982f83bce8a7ea3c2ffe3a276355c60192ed3bcfe2fb5d608dc97711faced149fc883d17f25fb7ab292be5440fd15ad8d53e325fe791dd5c6e81b15c3e94996fa97f59106ffde7193cf30ce6e47b0f106712476edaae14d3fc088dae008da40cf6d93be488e763834738c45f4e70f8bba8524696c57751ff61f4db957e9052cfa83e92ef3baa5f541f49f117f52eaa5947151f3f84be9f322e888c19a26c32064809aca7b3615375ede2a8aee24bd62df35d8051c624e9dcf08cc57565ec64302a9e6e0e34c37156644a77bce8063c5d1df038aa67f238d4dda85317a34ef95006df6deceea09e39e057d62df3ddc1b78b6d8e5ac831f952438b5c28935790fa2fe78f513aca3a54fc76b6d4c5958e9d0c9e4e16dfbd1ceb28eb9636b15703f8ee61f8ee68f856fb36c6989ad2eddb3d80b9a70366b5dedef1afb710cf19259ec54f47a8531fd020ae3ae1bae41cb38fa16d2ee4cf2fa8292be5a4ac1c3b855ded47b22d91dd5cae9bb15c3e94e965a97f59106ffd7b1b3cbd0d6675de705a410d8783fd211903bd0c0e99ef08daf58ed0ae17682765f0d8dbc991763d0d1e99ef043c727ed51d6c729e22fc09f8bda401b8cd76afbb855b6c381e61270b63c7f8198bd31d173a02a3d87a024f0f479a99dbfa52431f3c27686594916573a14c9782d47f7957cb2cabf6bb73736aead55cdb637b6f4db7e92d1de885e38106a04f6068289330b40e6ac60c8d93e7d8a0664cd00913abc60f7968d85dc3528f3d052dd7c0c4ff39966a34031be69b5b6c41507be8d35cb0c9d0a72dc0d6cc9005875c95f23274a20bb9500f5977aec1d91a58e2f48dc3c6ca942e745a018f8b5056a12343c7ead0b977fc8889c3303e5a189cf5891df55bf334e5a2d6257190eba0eec824eb9679f1a7f4c9d7f9b143868eec33fea149a3878d99380161cd9d0bf3398608e67fdb321824b833c97a5a18e21c1bbf38a53846b1c917803f9984a17550338e718c3cc94095b186870e1935ea8e49e5a3460cbd6ed298a11347548d41455b1bca45a92dbfb7049bada9c3b26ac2dd17976d65b1d9261cd5b935d8a4053f066cc2732cd89a435eca9b5bc6c93e7231ac5fc25afda6c469a12bde2aa80901392ca9f645ed43ea33aaea74400d2dad8692569b53ddb1534343abafc8a9a19fd550cf6a68673594b31aba590dd5ac86663e3b480dbdacee5e1604a9a194cf0b5243255f10a48642be08f8be0bcc9704a9d30f359471fb203554b1ba7da85e1f579f5a53efb7abd3587579ac4efdd4a58e3a0d53a75fea345bdd4250b793d4a98d3a6d54a744ea34469d96f7d65af709d35561ba3a4cd784e9da305d17a6ebc37443986e0cd34d61ba394cb784e9d630dd16a6dbc3744798ee0cd35d61ea1ba6bb83d470daf784e9de2035dcf67d416a28eefb83d430dd0f04a921bc1f0c52c37b0f0952437f0f0d52c3820f0b5243863f14a486131f11a4862a1e19a486361e1da4864756c3948f0d5243a2aba196d5b0cc6a086735b4b31a1a5a0d23ad869c564351aba1ac9f085243643f15a6a783d410dacf86694a989e0bd3f3617a214c2f86e9a530bd1ca4866557c3b5ab61dc6704a961df6705a961e2d5f0f16a587935dcbc1a865e0d4faf86ad57c3d9bf19a6b7c2f47698de09528f05d4e310f59840dd8257b788d5639aea2075fb7a61907accac1ebbab6e08aa5b86eaa6b23c48756352ddba543737d5ed4f758354dd42553759d56d5875a356ddca55377bf5da817a0d43bd96a25ed351af2da9d7b8d46b6dea353ff5aaa67af551bdcaab5e6dde1ba46e4def0f528f2bd5ed6a755b5adda257b7d03f0dd37782544c7e2f4c9f85e9fb61fab730fd204c3f0c524346abe1a5d5f0d46a286b35c4b51a0e5b0d9dad86de5643727f1ea486fa564385ff36480d37fe45987e1fa4863cff2a480d77ffc7307d1da63f85e9cf61fa4b98fe1aa6bf85e9dfc3f41f61fa7b98fe11a6ff0cd33f839a61cdb12129d0adcfb97a7ec8c489c3468f9d5830b1aa60f4a45113478c1df558c1e411138717543d326c7ce5a8aac9b8f0eff4c232267b9ff1e3873c5630624cc5b0470baa264d2ca8aa2c28af9a34a6a2d681f4ffea85ce3adce3908a8a686779cdbf05e9f1cdebe7b49d5e4e46bbbf317dddce6b5e0f412ea9cf42b7d4b34277eb23985cf2f54d9d0f164c185535b1a0b0604cf8373cf0564d1e56d1a1007f9b108a3c6162c1848943c64f2ca81c5f35baa0a803aeb7f0d87a5462eeb16e604a4eaf9f389f9c9dfa5faf107be19c7a28b0f09cfa916e3ce75b907e544fa79fd5a7863faecf42ff554fc2a05da42c1326954f1c3f64e8c4e8855b7c9b8513edea51cd33dad5af9adfa98fb31fd467a1bfd7933051500f679d0beaee2cf8ffd731cc2cb00206009b2d6c6f00000027631f8b08000000000000ffed9d777c1dc5b5c7f74ab22cfbfa5a967bb768c64df2d555b3e42603ee85988e69966d196c6ccbd8a285d04942421212d20b8184978434d20be9bdf7de484202494848f8e7e5f3defbbccf87cf9bd93be7e9a76176d1bdec11b3ba673f9fe33b7b3477cff79c3d33bb776676fd54100499a0b8552b392978e6467fef319ff9e7b6b52478ac3c276726259c5529e1ac4e09674d4a38c7a484b336259c6353c2599712ce7109726ab6aa60e89634ef7886b826cd984d594c27a420a6b994c574620a625a1fa4a38f9a9412ce8694704e4e09e79494704e4d09e7b494704e4f09e78c9470ce4c09e7ac9470ce4e09e79c9470ce4d09e7bc9470ce4f09e782947036a684f38494709e9812ce9352c279724a384f49907329702e349fa79acf45e673b1f95c623ee93bcbcc6793f1b1c6ec372b59aed994b4587f2b286955d2a6a4ddfa5b87924e252b947499bf359abf752b59a9649592d54ad628596be2b04ec9694a4e57728692f54a3628d9a8649392cd4ab628d9aa649b92ed4a76283953c90b94ec54729692b3959ca3e45c25e729395fc9054a2eb4587629b948c9c54a2e5172a992cb94ec56d2ab648f92bd4af629e953b25fc9e54aae507240c94125572a39a4e4b092234afa951c55729592634a8e2b195072b5926b945cabe43a25d75b317ba1921b94bc48c98d16e74d4a6e56728b925b95dca6e47625772879b192972879a9923b95bc4cc9cb95dca5e4154a5ea9e4554aee56f26a25af51728f92d72a799d92d72b798392372a799392372b798b92b72a799b927b0d0b3584b72bb94fc9fd4adea1e49d4a1e50f21f4adea5e4dd4adea3e44125ef55f23e25ef57f201251f54f290920f29f9b0928f28f9a8928f29f9b8924f28f9a4924f29f9b49287957c46c967957c4ec9e7957c41c917957c49c997957c45c957957c4dc9d7957c43c937957c4bc9b7957c47c977957c4fc9f7ad98ff40c90f95fc48c98f8dee27e6f3a7a62e8d8bfd4cc9cf4df917e6f397e6f357e6f3d7d6777ea3e4b796ee774a1eb174bf57f20753fea3f97cd47cfec97cfed97c3e663e1f379f7f319f7f359f7f339f4f98cfbf9bcf7f98cf27cde73fcde7bfcce7534a6e9d5a2cd705835b4f90501fd5b63fafe75428f80b83a19b8e45b5f91b7d361a7d8dd9a74f8add18b33fc6d2d79afd5aeb387566bfced23798fd064b3fc5ec4fb1f4d3ccfe344b3fc3eccfb0f4279bfd93419f0d60ccd5e8b5aedaa832a0a37cad02dd18a3ab065d2d1d0e74638d6e0ce8e8fcd6826e9cd18d05dd78a3ab035dd6e8c6512c954c30ba9e20a95cc9f7eae3e6923eae99879a983cef5e7ddc7a26de49c9f3f6e9e33630f0eafc986c8e3509f2668ad13580ce7437c164d04d33ba29a09b6e74534137c3e8a6816ea6d14d07dd2ca39b01bad946371374738c6e16e8e61add6cd0cd33ba39a09b6f747341b7c0e8e681aed1e8e683ee04a35b00ba138dae1174b4c6e504d09d6c742782ee14a33b0974d4d79e0c3aba373cc5e8743f519781ef183df551e177a87f06dd22ea9b41b798fa65d02da13e19744bc136e99641bf42ba26a3a33e4affaddb947b82a4da44216c132b933eae3ab23eeeeae48f1bcedbad0906e3da03765642acd69a72826b835ad076c608d9217d0d9437435daa47f1a0eb0cb1ebebc92a535e1bf3bd6eeb7b39a8b3cae17f4f90acffab2d9ed516f318f09f27675b0b92b3c3de4aced9f3a1ae9d7b74cf331a73761b7030e46c87e4ecb0b79273b60feadab947f7bda3316777010743cef6f2e46c212f395b1c230b0277eed16f9fd198b3570047f239db2e393bfcade49cbd15eadab947bf7f4763ce5e031cc9e76c67afdc1b0c7b2b3967ef86ba76eed158cc68ccd93b80832167fba49f1df65672cede0b75eddca371c1d198b3f70047f239dbc594b3ad92b34171be3308dcb94763d4a33167ef078ee47376af8ccf0e7f2b39671f86ba76eed17cc968ccd9874c59cf33fcc4cc33cc05dd4f8d6e1ef0269fdbfbda9872bb20b95d5c071204ee1ca5b9bbd198db5f30659dc7bf80b507a4fba5d19d00ba5f19dd89a0fbb5d19d047e31b4815e6903c3de4a6e03bf85ba762ed33cf2686c033f020e869cdd2b393becade49c7d02eadab9476b1a4663cefe1e381872b64f7276d85bc939fb5f50d7cebd45a63c1a7396d695eafb853f9afb8525a07bd4e89682ee4f46b70c747f36ba26d03d6674cda07bdce89683ee2f469707dd5f8dae05747f33ba02e89e30ba56d0fddde8da40f70fa36b07dd9346d701ba7f1a5d27e8fe65742b40f794d175199d9eefa2b557df313a7d6e291e3d4172e7365c6f150cdd32d67e0f949b7879f2b960e8b308646b79f2b65ab5efcdc1f07d5f0e3c7906dfb36063383c79e069499e275c775a48feb8e1396eb6629a055bcde0572b835f19b045c7a67db297031df625ad0ec6b6e4190b19b045c7a6fd3660241df66d748da1f6a3fbe6c6cc202f435b0aafcf68af0738c85e0dd4993775b0eec9866d02fc9dfa800950c6bebfc5d231e56a982b648b8e4dfb0560241f5b469eb1305cc6bcc5c8d56f64c0161ddbb63dc1111f1db33647ccda9918db2c46da6f07468a5fdbc8331686cb68f70b4c7d52cb70fb248a4bcbc8c76c58e735073abcff6b77307624cf189ed7768b91f63b809174adc0c3753d8c6aafbed8e6b80fc17ca66b165d7fc85e0dd4e9ac1eacbb0daea70c7d68a1d47b53ecd3933f4f853c5ecf86c3c37cee5a98f2318f7de7d341b2b966b7f9162b56d8e6b12fe7ea27a3fa72b227ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccfe3347cdcbb9d6333c9f8ca42b000fc7387ff88e2a732c9c037a04e675929fb728e471ae9ed6312eb67cae813aff9b19647bd4b14e02e7ce975b3aa6754ae1b9c4754a3db04ff670dd06ae9b62587b12f22cb3786cdb131cf1f1711d894f6b34a2d669f914b31ce8703d5c33134f549e353b6c372666bbb097a7ed14f2fa7d40fa9d7ad49fd86d04d7be2db574ba4feaae1ef49b23074a9d77c6eb0695939cc7c57c435bc9afb7290c599f50150cbd56e03d05c31a9521f3d5b436a2c3b25d0375c65505ff7f6e3ae1ef3dc133d708611d3a36ed2f86ef765ac7aee7f337b63fec006e2ad75abe350137d5995835e8e3e74d99e97ea680eb6703e00d2c9f68c3f519c9dfef15d78bb496c0d30e3c1c6bd798ee6bf3988f49af17e9b462e5ba5fa63a1d10bf4e86f8c5ad59237bc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2ec3f33beff8258f119e982278c23b4c6269ccfa07719e1bcd87d558376b9e70069ce6989e5333ea3fc64d520db03a68cef08703def8ee7926b6e2dea5c92bd09c1339fd3673a97c37ef743bb23669d8e98ad6062b4fb0cda5f018c14bf4ee0e16a8f1d168f6d1bfb8c764f6316d5cf72ad5f89ca33d73a85c6c46c17d78b70ccebd27a11fbfa55b0628aeb244887f3e0f86e159fdfff62af5dc07e0ad76825df6f1686cc01db6b05c91eae93f8a6892dad9348be1f28e439af11d446694d48abc357aaf33db8cefdc09471ad50018ef588e3efb4c5ad49c03e35f17770e68b73fcf4ee4a3abfdd0edbab803521db2d683b6384ec90be06cabfab1aac4bf5281e146b62d76d84de6588ecf6f75aacefe5a04e97c3ff9e2059ffbb2d9e6e8b59e7ce8f21cf1e817b3dae3ea92b22468b21465407ef79b9ae5ff69a6d7bad32f6a363ad3af4dd1aa8f338f451a5bc2b8aeb7e21ea1a80f70bf67561386bc72b7d3de0bfa1bfe884bff704cf7d3de0bf21875cf7a574fc25707ce21a1b445f5ba8ceff58d75186f57ac37aef95ebb71ff1e27a43aaf334f45579b32e37ea778ceb390baedf0d51cf7d903dbca72ac577ec1792be36623e220bd9c37cac33b1a67cec8ce05eeef86e36e2bb142b5a5f8ebf93edf8e93874c1777a128943b1bfe9b67ca136d505be509d06f085e79ea978ff99bcaf43ef87a80f6a73f84a75a6c3bbe0669a7216ce13f695a73afe4e5bdcfd27c54ffb3cd2ef5447db3ebc537d61f5605dfbdde814eb52dfa9de617dcfc777aacf813c3b159eb5e0eaab5745c46809c488eae0b38ef6efffa86bccf3f95e52bbdfc4ebe448b2d9e3b7aefb13aa83f7d054a71dfad9aca3ae3d2e4dd79024d7a7e3f340cbc02e3e0fb48c299eb960683c731607a7ed7acb76fd08da6eb06c378ca06d89b9c4dca79833fcdf1365ff5f18f87f5654a580b13a058c3529601c9302c6da14308e4d01635d0a18c7a580717c0a18b3c0f87c5edb19e253f0ecff7b8abdd740db0cef730863d1140c3f16cdbc3cb1f73e689be11d2a25ff7f03ccff17564bb9ff17560ebe3739058c5352c03835058cd352c0383d058c3352c03833058cb352c0383b058c7352c03837058cf352c0383f058c0b52c0d89802c61352c078620a184f4a01e3c929603c25058c0b853111c6a5bc8c05dffe1fe76c3074add9b3f130bf7b347c87a2eb3da71cff376ea9be33bf77b8a5dcf7f4e11a0bdeffebf1b9bd4b90630d45a9ef128cfbffb199180be53272ad25c775d4c3e1c1e7505dcfb7303016ca65e47a06059f891c0e8febffeae57d26a818b37218b9d68c95baa6119f15ec70c48c81b1502e23d77307f84ce470785ccf2eb6f03216ca65e45a9f9b051bc3e1e98298ad70c48c81b1502e23d3f36561ccba4ae0c1e7b0ba1c3163602c94cba8795632c5acbb049e9510b36e47cc7c62449ea4df89deedb0c5f1dc5ea9be1303328e4b01e3f81430e23a098efe2b6e9d44376f7c0ae5c687eb7cc5ad9340db0ccf8984b1c0e7029e2d16ab797962d749a0ed354cb1c0e7369e2d166b8087e339922cd8180e0f31e4e07b9353c03825058c5353c0382d058cd353c03823058c3353c0382b058cb353c03827058c7353c0382f058cf353c0b820058cf85b95e15e31f6f7cb9a516e3beab7ca68b71df5bb64b4db963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf7db29d86317e611c7d8cc8d3981c4f1e7d475b3d1ef8dee3e0c930f98eb6d679e03b31a48d716d0a1857a68051e2585c83580ea3e6398d89675d093ca701cfe94c3ca795c0733af09c913c4f9853a797c0430c39f8deca1430ae4d01a3c451e2e813a3c4b172e2288cc2288cc2f87c30a6a10f17c654e463a15c46cdb33e799e30666794c0b31e6246df6be1652c94cba8793624cf13c66c7d093c1b2066eb1d3163602c94cba8793626cf13c66c43093c1b21661b1c3163602c94cba8793625cf13c66c63093c9b20661b1d3163602c94cba8793627cf13c66c53093c9b21669b1c3163602c94cba879b624cf13c66c73093c5b20669b1d3163602c94cba879b626cf13c66c4b093c5b21665b1c3163602c94cba879b625cf13c66c6b093cdb20665b1d3163602c94cba879b627cf13c66c5b093cdb2166db1c31f39571650a18d7a68091398e85721935cf0e269eed25f0ec009e3399787694c07326f0bc20799e30a7ce2c81871872f0bd9529605c9b024689a3c4d127468963e5c451188551184b63ec4901a39c6b61f49591e1f755ec3334678e72dbf596edfa0ab11df50ccd68b72d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e4b94fb677266fbb50ea33ac3b8187e3995a263ff3fab86799633d9d60fc74acceb66275a615ab1cd4390be2773643fc3260978e4dfb64af54e6533d6066b25d98a88e310efc271b6bad7868fbe730f91ed5d79f33ca6d47f5f5a3dd76545f3fda6d4b9e4b9e57826dc973c9f34ab02d792e79ee8b6d2cd70483f7edf47e257d8c734d798cd94756fa1ed5593db6f8591f481be2b02d6d48ae1595605bf25cf2bc126c4b9e4b9e57826dc9733ff3fcbce46d877363f8fb426f717363e701cfb90cb160f233af7d3adff2e91ccba71cd4c177d69ecfe06706ecd2b169ff7c380f6963d63c6b4c9958b3506f8d278ca43b9797276c5f6b82a15b5cfb3a1f7818da410b939f61fbbac0f2698d23ee540773f502063f5d6d87f62f80f3903666cdb3ce9489350bf5d679c248baf37879c2f6b52e18bac5b5af0b8087a3ff61f2336c5f175a3ead73c49dea60ae5ec8e0a7abedd0fe85701ed2c6ac794e336562cd42bdd33c6124ddf9bc3c6d59f099b6b8f67521f070f43f4c7e86ed6b97e5d3698eb8531dccd55d0c7ebada0eedef82f320ccc2ec62d63cf47fca136b16ea9dee0923e92e60e569cb67c167dae2fab15dc0c3d1cf33c53decc72eb27c3add1177aa83b97a11839faeb643fb17c1792885796d0a9925ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825cee5316b9e334c9958b350ef0c4f184977212f4ff8fcce19c1d02d63edf740f922e0d9c5101f263fc375ef175b3e9de1883bd5c1f67531839faeb643fb17c3792885796d0a9925cee5316b9ef5a64cac59a8b7de1346d2ede2e509fbb1f5c1d02dae1fbb187838fa79263fc37eec12cba7f58eb8531d6c5f9730f8e96a3bb47f099c0761166617b3e6d960cac49a857a1b3c6124dd45ac3c85f039c40dc1d02dae1fbb047838fa79a6b887fdd8a5964f1b1c71a73a98ab9732f8e96a3bb47f299c875298d7a69059e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e629638574e9c35cf465326d62cd4dbe80923e92e66e5690de71d360643b7b879874b8187635e8629eee1bcc365964f1b1d71a73ad8be2e63f0d3d57668ff32380fa39d796d0a992537468659724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398ad987dcd03c9b4c9958b3506f93278ca4bb8497277cefc1a660e816b76ee732e0b994213e4c7e86eb76765b3e6d72c49dea60fbdacde0a7abedd0fe6e380fbb8559981dcc9a67b329136b16ea6df684917497f2f284fdd8e660e816d78fed061e8e7e9ec9cfb01febb57cdaec883bd5c15ced65f0d3d576689fec09b33047316b9e2da64cac59a8b7c51346d25dc6cb13f6635b82a15b5c3fd60b3cbb19e2c3e467d88fedb17cdae2883bd5c15cddc3e0a7abedd0fe1e380fc22ccc2e66cdb3d59489350bf5b67ac248baddbc3c852cf84c5b5c3fb6077838fa79263fc37e6cafe5d35647dca90ee6ea5e063f5d6d87f6f7c279481bb3e6d966cac49a857adb3c61245d2f2f4fd8beb60543b7b8f6b5177838fa1f263fc3f6b5cff2699b23ee540773751f839faeb643fbfbe03ca48d59f36c376562cd42bded9e30926e0f2f4fd8beb60743b7b8f6b50f7838fa1f263fc3f6d567f9b4dd1177aa83b9dac7e0a7abedd07e1f9c87b4316b9e1da64cac59a8b7c31346d2613f455b1530ee60620c2cc6c08a0ff2ccf78c67a7673c333de399ec19cf38cf78167bc653ed19cf0acf78da3de32978c6b3c0339e599ef14cf18c67bc673ccb3ce3a9f18c67a1673c4b3ce399ed19cf54cf78b29ef13479c633c6339e6ecf78ba3ce359e4194f87673cad9ef12cf78c678e673cd33ce359ea19cf04cf78729ef1347bc653eb19cf2acf78e67ac633dd339e899ef1d47bc633d6339ed59ef1747ac6d3e6194fde339e799ef1ccf08c6792673c0d9ef1d479c693f180271b3c731d4316febe137455d677f5f565cfd4c1bfd3bc71157c67bf29573b8edd073a9a67deeff82ec6896b2e1c6df5c03ed99b001cfb3de1a9f38ca7c1339e499ef1ccf08c679e673c79cf78da3ce3e9f48c67b5673c633de3a9f78c67a2673cd33de399eb19cf2acf786a3de369f68c27e719cf04cf78967ac633cd339e399ef12cf78ca7d5339e0ecf781679c6d3e5194fb7673c633ce369f28c27eb19cf54cf78667bc6b3c4339e859ef1d478c6b3cc339ef19ef14cf18c6796673c0b3ce32978c6d3ee19cf0acf78aa3de359ec19cf38cf78267bc633d3339e9d9ef1ccf78ca7cac1b3938927ead9e69d9ed866380f797ddccb997cbac21cabd61c97f8c95e0dd439c90c3ceaf90ffc2e71d9f3ffd876ae801871bd572267f1d0febe516ebbdeb25d5f21b61b2cdb0d15625bf25cf2bc126c4b9e4b9e57826dc973c9731f6d3f9d9ced7679bfd4f079e47d4ef13cf23ea7781e799f533c8fbccf299e47dee714cf23ef738ae791f739c5f32cf48c47dee714cf23ef738ae769f28c678c673cf23ea7789e459ef1c8fb9ce279e47d4ef13cf23ea7789e099ef1c8fb9ce2796a3de3f1ed7d4ebebd0f5ede2f15cf33d1331e79bf543c8fbc5f2a9e47de2f15cf23ef978ae791f74bc5f3d479c693f180e7d9de2f85ef85bac294f7818ed697c6bd872a0bc7b90274349e4bc7d0d7abc3539fc95005df39e0e0badc618fec1c707c7724e28eb67a609fece1fbaa0e78c253e7194f83673c933ce399e119cf3ccf78f29ef1b479c6d3e919cf6acf78c67ac653ef19cf44cf78a67bc633d7339e9d9ef1acf28ca7d6339e66cf78729ef14cf08c67a9673cd33ce399e319cf72cf785a3de3e9f08c6791673c5d9ef1747bc633c6339e26cf78b29ef14cf58c67b6673c4b3ce359e8194f8d673ccb3ce319ef19cf14cf786679c6b3c0339e82673ced9ef1acf08ca7da339ec59ef18cf38c67b2673c333de399ef194f958387eb9d5151cfd78fc4fbaa9ecdb6de5f0671d15b16fe3e12cf71edb418691fd73d202ff12c63e2897a2fc0320f6c6bffe9b7e844f39985bfe373385c39b5cc62a47d574ee1bac626269ea8f7193479605bc7a2d994690d4016fede0c8c5c39d56431d2be2ba71a7879dab2e0336d716b8db0cd719c43263ff3d8fe127c87465ec76a8715ab662b5639a83312ebd2a3fa03b227ccc21cc5ac79682e8558f17a3612cf990d87d1757d65e009fbc7e5c1d02dae7fdc013c1cd70f263fc37eeca0e5d37247dca90ee6ea41063f5d6d87f60f3a6c3706c9c6e2ca61c4e24a07cf95231c0bb2572af3ce1432fb1067cd436b118915d737e73d6124dd325e9eb07fcc0743b7b8fef14ae0e1b87e30f919f609872c9ff28eb8531d6c5f8718fc74b51dda3f04e7a114e6832964963897c7ac79680e8258b350afe00923e976b0f214f259f099b6b87eec10f070f4f34c710ffbb1c3964f0547dca90eb6afc30c7ebada0eed1f86f320ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22ccc7e336b1e7a369658b350afd51346d25dc9ca539c77680d866e71f30e878187635e8629eee1bcc311cba75647dca90ee6ea11063f5d6d87f68fc0791066611666611666611666611666611666611666611666611666611666611666bf99350fbdb39d58b350afcd1346d21de2e5099fdb6a0b866e71f30e4780e730437c98fc0ce71dfa2d9fda1c71a73a98abfd0c7ebada0eedf7c37910666176316b1e7a571bb166a15ebb278ca43bccca539c3f6d0f866e71fd583ff070f4f34c710ffbb1a3964fed8eb8531dccd5a30c7ebada0eed1f85f3500af3c114324b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc12e79161f621ce9a87fe0f4162cd42bd0e4f1849778495a7359c77e808866e71f30e478187635e8629eee1bcc355964f1d8eb8531d6c5f5731f8e96a3bb47f159c87d1ce7c3085cc921b23c32cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc5ec436e689e4e5326d62cd4ebf4849174fdbc3ce17b0f3a83a15bdcba9dab80e728437c98fc0cd7ed1cb37cea74c49dea60fb3ac6e0a7abedd0fe31380fc22ccc2e66cdb3c29489350bf55678c248baa3bc3c852cf84c5b5c3f760c7838fa79263fc37eecb8e5d30a47dca90ee6ea71063f5d6d87f68fc379481bb3e6e9326562cd42bd2e4f184987d7e52e269e9cc59373c4e2f9b2adf7bb4d7982f9ccc2dfbb8191ab3fecb218691f731c7989a79b89a7dee2a977c4e2f9b2adfd5f65ca13cd6716febe0a18b972aadb62a47d574ed503cf2a269e068ba7c1118be7cbb68ec56a539e643eb3f0f7d5c0c89553ab2c46da77e55403f0ac66e289ea93568f80eda8f63512b6a37265246c4bcca363ced0eec2f181d5c1d02deebe1aaf2d1c7d15939f79d7f57bb5e5135ebff11ef5f9ba3e09b330473133dde7b6652ddb149fc0e2a1ed18732c46f27776b7e5531a7e67c7311f4c21b3c4b93c666d7b2079db6d59cb36c527b078681b608e05939f617f7075e08e31d9cb411dccd3ab19fccc805d3a36ed5f0de7a114e6832964963897c7ac6d5f93b8ede2fb87d136c527b07868bb8639163c7e16fb836b03778cc95e0eea609e5ecbe06706ecd2b169ff5a380fc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2ec37b3b67d5de2b68be3f7689be213583cb45dc71c0b1e3f8be3f7d707ee1893bd1cd4c1737e3d839f19b04bc7a6fdebe13c08b3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3dfccdaf60b93b71d3e8f83b6293e81c543db0b9963c1e467387e7f43e08e31d9cb411d3ce73730f89901bb746cdabf01ce83300bb38b59db7e51e2b68bf379689be213583cb4bd8839163c7e16fb831b03778cc95e0eeae039bf91c1cf0cd8a563d3fe8d701e4a613e98426689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e25c3971d6b66f4adc766b387e8fb6293e81c543db4dccb1e0f1b3387e7f73e08e31d9cb411dccd39b19fccc805d3a36eddf0ce761b4331f4c21b3e4c6c8304b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e486304731fb901bdaf62dc9db0e9f6747db149fc0e2a1ed16e65830f919ae7fb93570c798ece5a00ee6e9ad0c7e66c02e1d9bf6c99e300b7314b3b67d5bf2b60b59cb36c527b07868bb8d39164c7e86fdc1ed813bc6642f0775f09cdfcee06706ecd2b169ff76380f6963c6f39749ce76b86e936c54994fadbbc394ab41f76253ae01dd4b4c790ce85e6acab5a0bbd394c782ee65e01be95e6eca4b41779729af06dd2b4c7915e85e69cadda07b95297781ee6e533e06ba579bf271d0bdc6940740778f295f0dbad79af235a07b9d295f0bbad79bf275a07b83295f0fba379af20b41f72653be01746f36e51781ee2da67c23e8de6aca3781ee6da67c33e8ee35e585a07bbb43779f29df02bafb4df956d0bdc3947782ee9da63c0e740f98f278d0fd0794e9f35da63c0174ef36e51ce8de63ca1341f7a029d783eebda63c0974ef33e506d0bddf942783ee03a63c05741f34e5a9a07bc894a781ee43a63c1d741f36e519a0fb8829cf04dd474d7916e83e66cab341f771539e03ba4f98f25cd07dd294e781ee53a63c1f749f36e505a07bd894f1fc7ec6946f031df52bb7838efa953b4047fdca8b4147fdca4b4047fdca4b4147fdca9da0a37ee565a0a3bc7b39e828efee021de5dd2b404779f74ad051debd0a74947777838ef2eed5a0a3bc7b0de828efee011de5dd6b414779f73ad051debd1e7494776f001de5dd1b414779f726d051debd197494776f011de5dd5b414779f736d051dedd0b3acabbb7838ef2ee3ed051dedd0fba46537e07e84e30e57782ee44537e0074279932f633279bf2bb40778a29bf1b74d417be0774a79af283a05b64caef05dd62537e1fe89698f2fb41b7d4943f00ba65a6fc41d03599f243a06b36e50f816eb9297f18747953fe08e85a4cf9a3a02b98f2c740d76aca1f075d9b297f0274eda6fc49d07598f2a740d769ca9f06dd0a537e1874741da77e46b767dd2e290e1423ad239f9b1dbe90ae0e7ce90992bda7235b746cda6f05463a078591672c0c97b1c562d43ced0c31c3bca22dee37533bf0b431f030f919fe66eab07c6ab57cca419d53c1cf0e063f3360978e4dfb1d609be39c632c6acd711759b1a8813a6de622a7afa77171a463e8fc2d387ce18a638bc5d3e2b0ddc51c473a36f5895d2360bbd3b29db76ce3b580b6b8b6dd09cc2b1898f571bb933f6ed8b6579a63513e939d3cf8b40a6290944f683b6384ec90be06ca5ba70ed6a57a140fba7612bb6e47742e91ddfe5ebbf5bd1cd4e972f8df1324eb7fb7c5d36d31ebdf133d53073918da4398035d1607ede72176dd11b1eb82d8511dbcf63631c56e85c543fb4dc043f7571da0a3fb14e2c77bbce611e0b6fbbd0e0737e93a81b1c9c158489e31bccf6ab21869bf008ca45b013c9d4c31b3cff5222b3e784f30d6aa43dfad813abbe1ba9c75d4d5edae3133e817fdfe7f3a48b64faf6588178e4d04109fc08a216dc450170c8e5f24c9333e181c9f383ed07facf7f2beb3fa7af76500adc6c2c4cf8cc38d2ad061b9daa10b82a1c330381c4cc330381c5c658505877fa8befe19a7dda2a18ebec30706ce3dd27764efb1eb8f0ef4eddbd67f39528fb1e89134ca0324451d6d75c1e080514f90ec4450ad652b2e79eae0736cf23c2d4c7e8617bd71964fb5964f39a83306fe368ec1cf0cd8a563d3fe3887ed043ba23016e387118bf10e9ef1231c0b1c74271db654fa3b4edc5459be608b469fec3c4fd42132b8108e9f3170fa6fbab18f31ce8c0d064f36f59efa8e569f043d5aabaf5a7a34568fbeea2e488faeea0b9a1e3dd5a3a57a74548f86ead14f3ddaa94737f568a61ebdd4a3957a74b231288e3eead1463dbaa847134f01b6ef00affe45afaf907a34508ffee9d13e7d67a5ef00f4dd88befbd6778afad7a3be43d0bf6af50887bedaea3b197d95d657567da7a8ef10f51dbdbec3d533646b94ac35b15ea7e43425a72b3943c97a251b946c54b249c966255b946c55b24dc976253b949ca9e405417164ff2c25672b3947c9b94ace5372be920b945ca86497928b945cace41225972ab94cc96e25bd4af628d9ab649f923e25fb955caee40a250782e2aaa02b951c527258c91125fd4a8e2ab92a28ced2e959393d0ba767ddf42c9b9e55d3b3687ad64ccf92e959313d0ba667bdf42c979ed5ba2528ce46e999083df3a0671af4cc829e49d033077706c599013d137057501ce9d723fb7a245f8fdceb917a3d32af47e2f5c8bb1e69d723eb7a245d8f9ceb91723d32ae47c2f5c8b71ee9d623db7a245b8f5cdf1f1447a6f548b41e79d623cd7a64598f24eb91e30783e2c8b01e09d623bf7aa4578fecea915c3d72ab476af5c8ac1e89d523af7aa4558facea91543d72aa474af5c8a81e09fdac92cf29f9bc922f28f9a2922f29f9b292af28f9aa92af29f9ba926f28f9a6926f29f97650cccbef2af99e92ef2bf981921f2af991921f2bf989929f2af999929f2bf985925f2af995925f2bf98d92df2af99d924794fc5ec91f94fc51c9a34afea4e4cf4a1e53f2b892bf28f9ab92bf297942c9df95fc43c9934afea9e45f4a9e0a066756b013a9333d0f8df2f70e0cf41d3e3ad038d0df78f8ea4303078e1ebabef1da03035734f65fd3776cffa1fe6bf1cbdf305fa6298c75c78ef55edf78e0c8bebeeb1afbaf1e68ecdfdfb8a7ffea23fb8ee3971e335f9afb4c8bbdfbf6451bfbcfe742fadf651a1d6bfa449a1cda1cefdbf8ea320232a99c2fb55597e7d02a73d5a15fef6717ef761b8f1fea1f68cc371e51fff61e52dfe9dbd7dc887f3bae827c7ca0f1f840efb181c6fdc7fa0f37b634e3714f9c508613ad53cbf8d2655387ef79f07f5ef0c7e5f1d90300", + "packedBytecode": "0x000000028df71de500000046871f8b08000000000000ffed9d07741d45b6ae5bb61ce0481893b3450e06a3e49c64724ec6608c31b62c0b1b0739623298e81cc8c10639e78c718e18c3cc30393381811926dd3b7367ddf5e6be77df7a8f75bbcea9bdf4ab5c7daca3e992ff2355af5552f53ed5bdbffa7b7775aaeefa47100439416a6a1ea60b82c327f9bd4cff2ffcd7a6a218d755e89233274b389b650967f32ce1cccd12ce1659c2d9324b385b650967eb2ce13c26464ec5d62ca83dc5cd7bac035de3664c6499a67959a0697e96697a5c1668da26c88e36eaf82ce16c9b259c276409e78959c2795296709e9c259ca76409e7a959c2795a96709e9e259c676409e79959c2795696709e9d259ce7640967bb2ce12cc812ce73b384f3bc2ce13c3f4b382fc812ce0bb384f3a21839db03e7c5faff25faffa5faff65fabf94bd5cffbf42ffefa0eb98abe7af545c61520f698a8ddf4ac2541aa68e61ea64fcd6394c5dc2d4354cddf46f05fab7ee61ea11a69e61ea15a6de5a833e61ba2a4c5787e99a305d1ba6ebc2747d986e08d38d61ba294c3787e99630dd1aa6dbc2747b98ee08d39d61ba2b4c7dc3747798fa85e99e30dd1ba6fe61ba2f4c030c96fbc334304c0f846950981e0cd3e0300d095379988686a9224cc3c25419a687c2343c4c23c2f4709846866954984687694c98aac234364ce3c2343e4c13c234314c93c2f448982687e9d1303d16a6c70dcd9e08d393617a2a4c4f1b9ccf84e9d9304d09d373617a3e4c2f84e9c530bd14a697c334354cd3c2343d4c33c234334cb3c2343b4c73c234374cf3c2f44a985e0dd36b617a3d4c6f84e9cd30bd15a6b7c3f44e98de0dd3fc302d08d37b9a457684f7c3541da685615a14a6c5615a12a6a5615a16a6e5615a11a695615a15a6d5615a13a6b5615a17a6f561da10a68d61da14a6cd61fa204c5bc2f46198b686695b98b68769479876866957987687694f98f686695f98f687e940983e0ad3c1307d1ca64361fa244c9f86e95b61fa7698be13a6cfc2f4dd307dcfd0fcfb61fa41987e18a61f69db8ff5ff9fe8b272ffeea761fa99ceff5cffff85feff4bfdff7363995f85e9d786ed3761faad61fb224cbfd3f92ff5ffaff4ffdfebff7fd0ffbfd6ffffa8ffff49ffffb3feff17fdffaffaffbfe9ffffaeffff4dffffbbfeff1ffaff3fc2f440412adf3aa899ca8298daa8d2cae4b31f11ffe2a0f6a4b468ae7f93ff05da9eabe7e5bf68d742cfb730ec2df57c4b633dadf57c6bc3de56cfb735ec27eaf9130dfbc97afe64c37eaa9e3fd5b05fa0e72f007b22807bc3daae6ccdb529076c12afcdc0d642db9a83ada5ac0e6cadb4ad05d864fbb604db31dad60a6cc76a5b6bb025b4ed18d1324c79da5616c4152b8543d47af3e35eaf7e5e765cfcbc43d57adb38e23d3e7ede616abd6d1df0aaf83841afeb78889b13b5ad2dd84ed2b613c076b2b69d08b653b4ed24b09daa6d2783ed346d3b056ca76bdba9603b43db4e03db99da763ad8ced2b633c076b6b69d09b673b4ed2cb0b5d3b6b3c156a06de780ed5c6d6b07b6f3b4ad006ce76bdbb960bb40dbce03db85da763ed82ed2b60bc026edef856093f3c58bb44db51dc7e4c032da2eed56721969b3c176a9b4d760bb4cda6ab0b597761a6c97836fb15d016d8dd83a689bb45beab76e3a5f16c4b59f1457aaf5768f7bbde19ad57a7bc6bfdee433c75e418dae65e0a73b68d55be763ecd75484be7374123f62cf85fc4d5056ca891e72ec1176758ce9a1f3bdd32cd7cd582e1fcaf4b0d4bf2c88b7fe3d0d9e9e06730bc8bb89d992121fb3759e328ed9fe50d68c3d390f6a8c317b2b703888d9ce3e66eb3c651cb39550d68c3d39176e8c317b3f703888d97237315b5ce8633675df2c08ecb127d7438d3166470047fc31dbd1c76cdda78c63f639286bc69e5c1337c6989d0c1cf1c76ce7727f6e50e729e3989d0b65cdd893fb338d31665f040e07315be9dbd93a4f19c7ec7b50d68c3db957d81863f655e0883f66bb3a8ad9121fb341ea196810d8634fee5b37c6985d081cf1c7ec507f7fb6ee53c631bb03ca9ab127cf501a63ccaed779f59ce1c7fa39c35960fb89b69d0dbcf1c776454747b15dec633bd5372408ec312acff31a636cefd57915c73f87fe0862fb85b69d0bb65f6adb7960fb5cdbce877a39d807cafd3e50e729e37de0d750d68c6579b6dc18f7811f02878398adf0315be729e398fd2b9435634ffa3934c698fd02381cc46ca58fd93a4f19c7ecff81b266ec5da2f38d3166a5afa93a5ff8529f2f5c06b6afb4ad3dd87eaf6d9783ed0fda7605d8bed6b60e60fba3b65d09b63f695b21d8feac6d4560fb8bb61583edafda5602b67fd3b652b0fdbbb67504dbdfb4ad13d8feae6d9dc1f61fdad6056cffd0b6aedaa69e7749df2b396f6d0dac65417cdb3601bac89463cc9741bed82d4f613ef0a0afd2f87d95a8ba970475af7b29f0747450f704f8a80b4f47e0e9143f4fb22f6ae7f8d79bdcc62586a609f05502f5eae2a05e39e04bd62df3e22f1f6cb89f77b130768d9fb138077cc9ba65be2b308a0ddb1d79ff47f61fd5369f9b53c3eb605f4a1e9fd15f197088bf5c28f3cf7635652fd46c79f03bb6c19d0c9ba3b84cc685f89275cbbcf8cb83fa746a78c6e2ba327634185db51139e04bd66dface837c915b7dd2f27426f1ede0bcdbdaa689e6dd1bc07757c377a9e11bdb4e99d21ddbba0273ecd73ffad8d623fef516e2b9b25ca7881f3c7fc0eb89b8ea84bee53a45fc883d17f237e4d4949572a287b4c3c2aef661d996c86e2ed7c5582e1fca74b7d4bf2c88b7fe3d0c9e1e06b33adef48463a183fd211903dd0d0e992f05ed7a4468d71db493329780760ece3d93da75337864be23f048fb8ded595103f31411f8c67358bc9693dff13cc0d5f62a321865deb6bdba0263470ba38373c2e274c7c35260145b37e02971a459d4762d21f1ede2ba32077cc8b9b9796d930b656e6f5e53b622c7295b319e3bcb54d76bdef8b7537121ee1f75e171bc0f15398ac742bc7ff34d106fac99ed92d9de44dde371d59697183c322ffe3cb367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed933f3332b1e799e80fdb6a45c271246b3ff9babfbfcc96ff1e975e133a07f3aed0f565c88cffea41fc465469d73a1cc89cd6ad8fe1bfa83997d89a2b6a58bbeb1e9b6a5f8c3fe600df10cb1d4e0317de759f4c1e7d2a899ab3e50669b21f3d83f4df42b021e57fb63b1c163fac636a38454b3a876d6559fbea838b3f5272c88cd77f15057cf75d577cfd4b743cde3572743d3e437490d9b6a93ee6a5e536f17cf79337dee8cc70dc9c7f91c17fb65a0aff8dbd9e25afd139a05b58f1518ebaefa6ac97e257d23ba1bbe73a1ccb9cd6ab60df6a92b0b0e3f36601f2f59b72c73192cdbc358771b77f54ddb0fa53b704bbea551b7cec02d652e8263f74f75ded131b038d37724f0981cfff125d55fa424031e3cdeb9386771741c2dc4788cbbbf88d90fd276be2c65b00fa983febb698fc5e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333fb3e2319fa1e3b3df5212c606ea63937c9e21df67c3e7625b9bd5f875fd0c509e39b537ea8cef28e7c23bca3b351bf67dc0ef4ad9b6a5ab676b51db52fcb1f57dc8b3e8a334eb61d1ccc1771dd37eb303bf9128faf5001e57fb63d4b73b6c6d4611a96651edac8bbe0be9e2ccd64fa12036dfa9fe222e9eeb4a7f11f3f8657ed708fb49880d9f83477d2facd8b01ded36c0d6af4df2f8cd051763dc603c9b7d05c51ff693f8426b2bfd24e26f078a0b5d1e23641f953e212596ba4a993f34ab29fb479dc7be42a5b0ae7f5a7e97295d9f046c531d7c3f36b97d655db27d6ddfaeed03ac31f92ec275e5e8d4c7d02017f2ffab594d59292765456b6157fb887c570ad9cde53a1acbe543995e96fa9705f1d6dffc96706f8359c5ce5f20cefe09e77aaedaa45e111a5d061a49193ce775d5afd66c23cd3ed3d827b2955106cf4fa5ccff87362aaa4fbaad4fa5abf385a8fe9c78be603ba731eb68f61d6feafd01f3f575888bfe80b2ee3641ed3e7981b1fef6b07ee16a15441f5ba44c5b58ffd1fcee95edda4f78b1bfa1943905aefd6ed0f94caefd8ed675bcedda0f978baa3bb60b711f1b311e91056359ca1418f1d82382bbab65d9f3239615adcc6f1fe275299e23c4ffddc8547bd3dba88bec53f87d7f2973a9b1dfc47fce943aff74f58d4c5997b441c596ba4a990eb0af15ea7c02b613be53d4dbf2bb4ce9ce3f453f55e7abe2af7372fb5eadd725dbf72a8bef6b803526df45e85bce3fc58fd87321df0b8e27524ef410ad855ded23720e87ece672dd8de5f2a14c1f4bfdcb8278eb7f95c17395c1ac62a704e2ac37bc6be1aaadee13a1517bd048cae0bd6bdb778d6df73a1aea3cd5fc5e7a7e70f8b77bf138e9e69ccdfeae9c79ffd6767ed2dee0c7f3935ba19d4d58ca9af7a565b938fba7e3fb40785e88ef03b9ba46ca0f6aeb996f70b8f4ddc6f0dda6017db7357cb76d40df5e73af3993e64c63fee073c866c0e8e25887c7d5ba30da8e7fcd81d1d53b9b251930e237aff178278c2ebe135edf3185f05ca70530ba78df38d3fbd59d8011bf31208c2eded1cef43bd5f8deb62cd70a185d8c6b846328d585d136d6516bf8ef605ca3a2fa8e0382631d1d038c2ec6064904b5c733391263376094e58e054617cf911241edfb6a4762c4e795b25cc23163ba63bbe3be3fc599de8368887e0551e71ae8dbc1fdff62ec9b50172d7abae5497bee83be1ddcff4a6a8163591e490b7c3ee7626ccd4450fb59d89178f019a22c770230963962ec9d01631930ca722702631f478c651930f60146b19f048c0eee432619fb64c088f7eb64b99381f16a478c5765c0783530ca72a700a38b7b8a09f05b17c66b8051963b1518af75c4784d068cd702a32c771a305ee788f1da0c18af034659ee7460bcde11e37519305e0f8cb2dc19c0788323c6eb3360bc011865b93381f146478c3764c0782330ca726701e34d8e186fcc80f1266094e5ce06c69b1d31de9401e3cdc028cb9d038cb73862bc3903c65b8051966b078cb73a62bc2503c65b8151962b00c6db1c31de9a01e36dc028cb9d0b8cb73b62bc2d03c6db8151963b0f18ef70c4787b068c7700a32c773e30dee988f18e0c18ef044659ee0260bccb11e39d1930de058cb2dc85c0d8d711e35d1930f6054659ee2260bcdb1163df0c18ef06c6be16c67e8e18efce80b11f30ca729703e33df13326afa5fb65c0780ff0dc1b3f4f52b37b32e0b9d72d4ff21b8af7587cdd17bfafe4b6e81fd4bdeef701cf80f87992dbe2be0c7884211f9643cdee8f9f31a9d9800c18ef079e81f1f32435bb3f039e81a0d9fd16cd1e889f31a9d9c00c181f009e41f1f324357b20039e41a0d90316cd1e8c9f31a9d9a00c181f049ec1f1f324357b30039ec1418d660f5a341b123f6352b3c119300e019ef2f879929a0dc980a71c341b62d16c68fc8c49cdca33601c0a3c15f1f324351b9a014f056836d4a2d9b0f819939a5564c0380c782ae3e7496a362c039e4ad06c9845b387e2674c6a569901e343c0333c7e9ea4660f65c0331c347bc8a2d988f819939a0dcf807104f03c1c3f4f52b31119f03c0c9a8db06836d211e3c319308eb4f0c4fd4df4872dbe463baafba8a0ee7517867c580efb498c71c4383a03c631c028cb613f892a478c633260ac0246592ee198315d3f892af03d367edfc976a92aa8bb3e63ddf2a4ed2781bec739d2626c50772dc6b9e549db4f027d8f77a4c5b8a0ee5a8c079e090eb448808fbaf008433e2c87fd24263a629c9001e3446094e5b09fc424478c1333609c048cb21cf69378c411e3a40c181f0146590efb494c76c4f848068c93815196c37e128f3a629c9c01e3a3c028cb613f89c71c313e9a01e363c028cb613f89c71d313e9601e3e3c028cb613f89271c313e9e01e313c028cb613f89271d313e9101e393c028cb613f89a71c313e9901e353c028cb613f89a71d313e9501e3d3c028cb613f89671c313e9d01e333c028cb613f89671d313e9301e3b3c028cb613f89298e189fcd80710a30ca72231d33a6bb7e99d2c87d475dab3476df51d7258dddb78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74dc1b78f731fe74cbe9f73e03b013e64ca31e6cb202f0cf9b0dc48cfd8a81991a7203e9e42ac3bfa7a9ea0eecf5b78721cd51d7dbd40507761c836c6e7b280716416307a1d537d10ebc3a8785e74c4f342063c2f02cf4b8e785ecc80e725e079397e9e644cbd94018f30e4c37223b380f1b92c60f43a7a1d9918bd8e4d4747cfe8193da3673c1a8cd9d0867bc6ac88c7e2fa322a9ea9f1f324357b39039ea9a0992c77af5bc6e2fa322a9e69f1f324359b9a01cf34d06caa4533078cc5f565543cd3e3e7496a362d039ee9a0d9348b660e188bebcba87866c4cf93d46c7a063c3340b3e916cd1c3016d79751f1cc8c9f27a9d98c0c78668266332c9a39602cae2fa3e299153f4f52b39919f0cc02cd665a3473c0585c5f46c5333b7e9ea466b332e0990d9acdb268e680b1b8be8c8a674efc3c49cd6667c03307349b6dd1cc0163717d1915cfdcf879929acdc980672e6836c7a2192be3c82c607c2e0b181deb585c5f46c533cf11cfdc0c78e601cf2b8e78e665c0f30af0bc1a3f4f32a65ec9804718f261b99159c0f85c16307a1dbd8e4c8c5ec7a6a3a367f48c9e3133c6e7b380d16f6bcfc8cae8e0fa2aed3b34af3472df51efd03476df51efd03476df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c3705df3ece7d9c33f97e2d7edfc599bec3fa1af0b878a7d6513d0bd57a5fd7ebfa2646fd94566f185abd6268950f655e07fdde70a05f0ef89575cbbcf8cb94f962026647be8b8f0bd7710cd45f7c3c67e8a1fcbfe9a8ee516dfd9b8ddc77545bdfd87d47b5f58dddb78f731fe74dc1b78f731fe74dc1b78f731fe72cbe319f1bd49cb7cbf795d43aded2f9167a5eca3f0fcb49997ead52ffdb047e1f72e1dbef43fe58d1147cfb38f771de147cfb38f771de147cfb38e78b738c87ab1b8027307882343c4f92f17426e3194bc633948ce71e329e9bc8787a91f14c26e32926e39949c6f33019cf4b643c83c878ee24e3b9968ce70a329ea7c978ba92f18c27e31946c6731f19cf2d643c65643c8f91f19492f1cc22e3194dc6f33219cf60329ebe643c2f90f15c4fc6f32c194f77329e39643c9792f14c24e3b9848ce721329e42329efbc9788e23e36943c6731b19cf55643c4f90f17422e3994dc65345c633958ca79c8ca71f19cf95643c3792f1f424e39947c6f308194f1119cf08329e07c878ee20e3694ec6730d19cf53643c5dc878c691f1b427e3a920e39946c6d39f8ce766329ede643c8f92f19490f18c22e379908ce72e329e86f81e47263c53c878ae23e379868ca71b19cf04329ee9643c1793f15492f10c20e3c923e3c927e3e940c6732b194f1f329ec7c9783a92f18c21e31942c6733719cf8b643c3790f1f420e3994bc633898c670619cf70329e81643c9791f11c4fc6d3968ce776329e1c029e4470f8379213f0fb6b606b662cab3e2bd5ada0e6f7b7b5bd192cf38ece37b7acfb6db0c9b7aadeb12c8b3abd0d7529d3f9c27f6d4aea84beca605efce501c73b243cb793f1b425e3399e8ce732329e81643cc3c9786690f14c22e3994bc6d3838ce706329e17c978ee26e31942c633868ca72319cfe3643c7dc8786e25e3e940c6934fc69347c633808ca7928ce762329ee9643c13c878ba91f13c43c6731d19cf14329ed7c878ee22e379908c6714194f0919cfa3643cbdc9786e26e3e94fc6338d8ca7828ca73d19cf38329e2e643c4f91f15c43c6d39c8ce70e329e07c8784690f11491f13c42c6338f8ca72719cf8d643c5792f1f423e32927e3994ac65345c6339b8ca71319cf13643c5791f1dc46c6d3868ce738329efbc9780ac9781e22e3b9848c672219cfa5643c73c878ba93f13c4bc6733d19cf0b643c7dc9780693f1bc4cc6339a8c6716194f2919cf63643c65643cb790f1dc47c6338c8c673c194f57329ea7c978ae20e3b9968ce74e329e41643c2f91f13c4cc633938ca7988c6732194f2f329e9bc878ee21e3194ac633968ca73319cf93643c575b785e73c423efbbcbba65fe3512df0eb643a15aefbb8eea345fafaba55eaff08bbf5c2853746ceabf7a3e84cb0a97f97d02ecfb3d1f347acb515dcc313165fead46eebb8de1bb4d13f1ddd6f0ddb689f8f671eee39cc9f7fcf87d17e3b76d64ca31e6cb208fc71717df047254cf5ac7f66f62d44f69b5c0d0ea2d43ab7c28f32ee8b7c0817eb6f30599177f99325f4cc08c715110c41b17efc55fa762d597e618d0f53d435facd7fb8e348d3a86bcdfc87d471d431abbefa8634863f7ede3dcc77953f0ede3dcc77953f0ede3dcc73993ef6a9d8ff1bab1107da87bbf723d500d7e17e97c4e8c7ed5ba16ea75b5d0eb168e45c023655e817bd17e9ff7fb7c5cbefdb1cdc77953f0cd1ce7665e9e215e026cae9ef146c562433c5f3e9abea362b1b1fb8e8ac5c6eedbc7b98f7326df8be3f79d7c86f85a507b4af70c7131f02c74a085a37a26af9d9618757acda8533e94a9867a2e7150cf1cf02beb96f925b01db28d59f14cd1791cdf45ca4d216114db42b73cc9fd6b4a507b4ab77f2d011e07fb4191a37a26f7afa5469da658749732d550cfa50eea69db77647e296c876c63563cf2eeaeb026a0dc0b248c625bec9627b97fbd10d49ed2ed5f4b81c745fbe3a89ec9fd6b9951a7172cba4b996aa8e73207f5b4ed3b32bf0cb643b6312b1e19cb44581350ee451246b12d71cb539a803acb946eff5a063c2eda1f47f54cee5fcb8d3abd68d15dca54433d973ba8a76ddf91f9e5b01d3cb367b6312b1e796752581350ee251246b12d75ca535a98803acb94ae1d5b0e3c2eda7947ba27dbb115469d5eb2e82e65aaa19e2b1cd4d3b6efc8fc0ad80e9930cfcf42e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b99bdce5ee728e6ea2c64f63a7b9da398abb390d9ebec758e62aece4266afb3d7398ab93a0b991974563c2febbcb026a0dccb248c625be69627f9fececb41ed29c7982f83fc0ae059ee401f47f54cf67b5f69d4e9658bee52a61aeab9d2413d6dfb8eccaf84ed9009f3fc2c64aece4266069d15cf549d17d604949b4ac228b6e56e7992edd8d4a0f694ae1d5b093c2eda7947f54cb663ab8c3a4db5e82e65aaa19eab1cd4d3b6efc8fc2ad80e9ed933db9815cf349d17d604949b46c228b6154e798a93ef214e0b6a4fe9dab155c0e3a29d77a47bb21d5b6dd4699a457729530df55ceda09eb67d47e657c376c884797e1632576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8ec75f63a4731576721b3d7d9eb1cc55c9d85cc5e67af7314737516327b9dbdce51ccd559c8cca0b3e299aef3c29a8072d34918c5b6d2294f49f2b9c3f4a0f694eeb9c36ae071f15cc691eec9e70e6b8c3a4db7e82e65aaa19e6b1cd4d3b6efc8fc1ad80e8d9d797e1632577be60661f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e6286686d8503c33745e5813506e0609a3d856b9e5497ef76046507b4ad76f670df0ac76a08fa37a26fbedac35ea34c3a2bb94a9867aae75504fdbbe23f36b613b7866cf6c63563c33755e5813506e2609a3d856bbe549b6633383da53ba766c2df0b868e71dd533d98ead33ea34d3a2bb94a9867aae73504fdbbe23f3eb603b7866cf6c63563cb3745e5813506e1609a3d8d6b8e549b663b382da53ba766c1df0b868e71dd533d98ead37ea34cba2bb94a9867aae77504fdbbe23f3eb613b7866cf6c63563cb3755e5813506e3609a3d8d6bae5294e409d654ad78ead071e17edbca37a26dbb10d469d665b749732d550cf0d0eea69db77647e036c876c63563c73745e5813506e0e09a3d8d6b9e549ee5f7382da53bafd6b03f0b8687f1cd533b97f6d34ea34c7a2bb94a9867a6e74504fdbbe23f31b613b641bb3e299abf3c29a8072734918c5b6de2d4f72ff9a1bd49ed2ed5f1b81c745fbe3a89ec9fd6b9351a7b916dda54c35d47393837adaf61d99df04db21db9815cf3c9d17d604949b47c228b60d8e7912506799d2ed5f9b80c745fbe3a89ec9fd6bb351a77916dda5ccfb50cfcd0eea69db77647e33f0c87435f0b88acbc0e0092cfac8f424194f67329eb1643c43c978ee21e3b9898ca71719cf64329e62329e87c9780691f1dc49c6732d19cf15643c4f93f17425e3194fc6338c8ce73e329e5bc878cac8781e23e32925e3194dc633988ca72f19cff5643ccf92f17427e3b9948c672219cf43643c85643cf793f1bc4fc6731c194f1b329edbc878ae22e379828ca713194f15194f39194f3f329e2bc9786e24e3e949c6f308194f1119cf08329e07c878ee20e3694ec6730d19cf53643c5dc878c691f1b427e3a920e3e94fc6b3808ce766329ede643c8f92f19490f18c22e379908ce72e329eebc8789e21e3e946c633818ce762329e4a329e01643c79643cf9643c1dc8786e25e3e943c6f338194f47329e31643c43c878ee26e3b9818ca70719cf24329ee1643c03c9782e23e3399e8ca72d19cfed643c39043c89e0f077f112f0fb02b0c93b63f3c0f681ce6f045b338b0f7916b1196cb93a2feb6815a66b0b0e5f37eae4ea3d39f45506f3e22f0f383e20e1b99d8ca72d19cff1643c9791f10c24e3194ec633898ca70719cf0d643c7793f10c21e31943c6d3918ce771329e3e643cb792f17420e3c927e3c923e31940c65349c6733119cf04329e6e643ccf90f15c47c6731719cf83643ca3c8784ac8781e25e3e94dc6733319cf02329efe643c15643cedc978c691f17421e3798a8ce71a329ee6643c7790f13c40c633828ca7888ce711329e9e643c3792f15c49c6d38f8ca79c8ca78a8ca71319cf13643c5791f1dc46c6d3868ce738329ef7c978ee27e32924e379888c672219cfa5643cddc9789e25e3b99e8ca72f19cf60329ed1643ca5643c8f91f19491f1dc42c6731f19cf30329ef1643c5dc9789e26e3b9828ce75a329e3bc9780691f13c4cc6534cc633998ca71719cf4d643cf790f10c25e3194bc6d3998ce749329eab2d3c0b1cf198e326c8fc0202df6abe3be8a2a604fc8edf597fdf11e3028351e6df0746e475ad591b83a78da1d9d1f4adea2fefeac83d70dc5ef8de39c3f66ad3009ab53578da1a9a1d4ddf4a0b79b62def0ce2f6c2efd4326c2f7cafda41fb5c9a3078d49463cc97417eb3637d1cd5b310dfbbfe26c6f52aadb6185a2d30b4ca87329b40bf2d0ef4cb01bfb26e99177f9ed93347312b1ee94b62fb1e403f1246b1e1b8181fc6cf539a3078d494ae7dfcd0b13e8eea996cc7b60676dd3f04dda50cc6ea5607f5cc01bfb26e99df6af15d10c4abc5b63a68b1cdc2b3ad81b5107f99326fca4266069d158fbc6b20ac0928d79f84516c5b80677bfc3ca50983474de9dac7ed8ef57154cf649bb023b0ebbe1d749732b87fed7050cf1cf02beb96f91db01d3261de9a85cc5ee7fa312b1e79475b5813506e0009a3d8b601cfced8798a0b13068f9ad2b5633b1debe3a69ea9766c5760d77d27e82e6570ffdae5a09e39e057d62df3bb603b7866cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e666563c03755e5813506e2009a3d87600cfeed87952cf1d90474de99e3bec76ac8f9b7aa69e3bec09ecbaef06dda50cc6ea1e07f5cc01bfb26e99df03dbc1337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d3337b3e219a4f3c29a8072834818c5b60b78f6c6cf539a3078d494eeb9c35ec7fa38aa67f2b9c3bec0aefb5ed05dca60acee7350cf1cf02beb96f97db01df67966cf6c61563c83755e5813506e3009a3d8f600cffed87952cf4f91474de9dab1fd8ef57153cf543b7620b0ebbe1f74973218ab071cd43307fccaba65fe006c874c98b76621b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec756e3a3a2b9e729d17d604942b276114db3ee0f928769e92c284c1a3a61c63be0cf21f39d6c74d3d53cf1d0e0676dd3f02dda50cee5f071dd43307fccaba65fe206c87c6cebc350b997d6c340cb38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c333473133c486e2a9d079614d40b90a1246b11d009e8fe3e7294d183c6aca31e6cb20ffb1637d1cd533d96fe75060d7fd63d05dcae0fe75c8413d73c0afac5be60fc176f0cc9ed9c6ac782a755e581350ae9284516c0781e793f8798a13068f9ad2b5639f38d6c7513d93edd8a7815df74f40772983b1faa9837ae6805f59b7cc7f0adb21db9815cf709d17d604941b4ec228b643c0e320ee923cf9068fcc7f42e05bcd57e97c9efe8fdbab0a1819b6577e0368d6c6e069636876347dabfa8fd5f9e3f47fdc5e638191617bb56900cdda1a3c6d0dcd8ea66fa5c5389d3f5effc7ed350e1819b6575bb73cc50983474de9ce373e059e6fc7cf93bc8efb34039e6f03cfb7e2e7297254cf42b5deef007b5ceb555a7d6668f5a9a1553e944186cf1ce897037e65dd322ffe3cb3678e62c6b650581350ee131246b17d0b785cb41baaee57e875c9fa5b84e90727d6f875717f0def2db4d4eb150ef1970b65ce6e57c3f613cd9607bfcb7653f53968d81cbdf35664bbcf2bf3e22f2fb05febbbba871a75efe120f01cb46876c0a2d97e478c070c4699df0f8cb6fbbc071cf144dd77167fd8661c24d50cdf03fe08785c9d1747c599eb7d2ed3f3cb8f2c3cdfc4c75388b181be5cc42ab66d75a9bb6ddf89b1ee45f80c0b7d39d80792c7a90e7a5db27e752cf8af139d6a5e8aed831ca73a1875ce8532ff7d4e0ddbff4d739c6a161c7e5fb840dba58cfcfe8db69beb28d0eb96f9eefa3fc689d8fc31b0f673c4ee86966c9ae1bef5b145c71e16ee1e04dc188f0db1ada3ee7de0b6ee61e8c8a6196eeb4f2c3af6b470f724e066dcaf7b1a3ab26976a4fdba9f85bb1f0137e37eddcfd0914db323edd7fd2ddcfd09b819f7ebfe868e6c9a1d69bf1e60e11e40c0cdb85f0f307464d3ec48fbf5400bf740026ec6fd7aa0a1239b6647daaf0759b807117033eed7830c1dd9343bd27e3dd8c23d98809b71bf1e1cd4d6914db323edd7e516ee72026ec6fdbadcd0914db323edd71516ee0a026ec6fdbac2d0914db323edd79516ee4a026ec6fdbad2d0914db323edd7c32ddcc309b819f7ebe1868e6c9a1d69bfaeb27057117033eed755868e6c9a1d69bf1e6be11e4bc0cdb85f8f357464d3ec48fbf5380bf738026ec6fd7a9ca1239b66b6fdda51ffb28cfb217fec549fd4f8b399bc87857d495cc494a3382874d4d724d90f79bfa1d5c78656f85dff03a09fab3e5951fdc6c49f67f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b667e667ccf139faf48b9867807b82e8c62c367522eeef3abba5fa9d725eb6f11a6db4faef11bff738be2e47300d15fdec7bcd2a8732e94d971760d5b5fcd86cf17f1b9a86d5b1e88bd0e757be71cdfd3c7674147f379e74716cdf65b34dbe788d16c33647e1f308a7efb81c7d5fe78c0e0317ddbde0d67d32caa9d7515f7517166f35d109befe2a16ebe85505ca8bed1764c70787b2275c07dd7451c66fa4d00dc2f1c3c772f72f5febfaad33ea34e078d3ae543998ba19efb1cd4b3aefb964c57038fabf6283078028b3e323523e379928ca73319cf58329ea1643c1790f1dc43c6731a19cf4d643cc790f1f422e3994cc6534cc6f33019cf20329e76643c7792f19c48c6732d194f2e19cf15643c4f93f17425e3194fc6338c8ce722329e43643c9793f1dc47c6730619cf2d643c09329e32329ec7c8784ac9784693f10c26e339978ca72f19cfc9643cd793f1b424e379968ca73b19cf44329e4bc9781e22e3b9848ca7908ce77e329eb3c8786e23e3398e8ca70d19cf55643c4f90f17422e3a922e32927e3399f8ca71f19cfa9643c5792f1dc48c6d39a8ca72719cf23643c45643c23c8781e20e339878ce70e329e13c878ae21e3694ec6f314194f17329e71643cedc9782ac8782e24e3e94fc6733a19cfcd643cc792f1f426e379948ca7848c671419cf83643c05643c7791f19c44c6731d194f0b321ed7ef0166caf30c194f37329e09643c95643c1793f10c20e339938ce756329e3c329e7c329e0e643c7dc8781e27e3e948c633868c670819cf79643c7793f19c42c67303194f2b329e1e643c93c8788693f10c24e3399b8ce732329edbc9788e27e3694bc69343c093080eff16137effeb20d8f6e93c7e5bb099657df25c58caabe3d0ad0587afbb9965ddfb2d0ca8d3dea0a62e653a5ff8af4d499dd05719cc8bbf3ce0d84fc2d3968ce778329edbc9782e23e3399b8c672019cf70329e49643c3dc8785a91f1dc40c6730a19cfdd643ce791f10c21e31943c6d3918ce771329e3e643c1dc878f2c978f2c8786e25e339938c670019cfc5643c95643c13c878ba91f13c43c6f311194f0b329eebc8784e22e3b98b8ca7808ce741329e51643c25643c8f92f1f426e339968ce766329ed3c978fa93f15c48c65341c6d39e8c671c194f17329ea7c8789a93f15c43c6730219cf1d643ce790f13c40c633828ca7888ce711329e9e643cadc9786e24e3b9928ce754329e7e643ce793f19493f15491f17422e379828ce72a329e36643cc791f1dc46c6731619cffd643c85643c9790f13c44c6732919cf44329eee643ccf92f1b424e3b99e8ce764329ebe643ce792f10c26e3194dc6534ac6f318194f19194f828ce716329e33c878ee23e3b99c8ce71019cf45643cc3c878c693f17425e3799a8ce70a329e5c329e6bc9784e24e3b9938ca71d19cf20329e87c9788ac9782693f1f422e339868ce726329ed3c878ee21e3b9808c672819cf58329ece643c4f92f13423e3b9dae0c1dfd5b9b5bc1fb60f6cf2fbb3baf16aa3d72565e49988bab7b4c7b0a9faee7654df3d41cd5406f3bba1bec2be0778f638e2d96bf098bef320df0334db65d814e34e478cbb0c4699df098ca2df2ee0d9e58867b7c163face837c4fd06c8761538cdb1d31ee3018657e3b308a7e3b806787239e9d068fe93b0ff2fd40b36d864d316e75c4b8cd6094f9adc028fa6d039e6d8e78b61b3ca6ef3cc8f707cd3e346c8a718b23c60f0d4699df028ca2df87c0f3a1239ead068fe93b0ff20340b30f0c9b62dcec88f1038351e63703a3e8f701f07ce088678bc163face83fc40d06c9361538c1b1d316e3218657e23308a7e9b806793239ecd068fe93b0ff28340b30d864d31ae77c4b8c16094f9f5c028fa6d009e0d8e78361a3ca6ef3cc80f06cdd61936c5b8d611e33a8351e6d702a3e8b70e78d639e2596ff098bef3205f0e9aad316c8a71b523c63506a3ccaf0646d16f0df0ac71c4b3d6e0317de741be02345b65d814e34a478cab0c46995f098ca2df2ae059e58867b5c163face837c2568b6c2b029c6e58e1857188c32bf1c1845bf15c0b3c211cf4a83c7f49d07f9e1a0d932c3a618973a625c6630cafc526014fd9601cf32473ccb0d1ed3771ee4ab40b325864d312e76c4b8c46094f9c5c028fa2d019e258e78961a3ca6ef3cc88f05cd161936c5b8d011e3228351e61702a3e8b708781639e2596cf098bef3203f0e34ab366c8af17d478cd506a3ccbf0f8ca25f35f0543be25968f098bef320df176cc25b04b6f774be186c0b74be046cf375be146cefea7c47b0bda3f39dc0f6b6ce7706db5b3adf056c6fea7c57b0bda1f3ddc0f6bacef702db6b3adf1b6cafea7c19d85ed1f93e609ba7f357816daece5f0db6393a7f0dd866ebfcb5609ba5f3d7816da6ce5f0fb6193a7f03d8a6ebfc8d609ba6f337816daacedf0cb69775fe16b0bda4f3b782ed459dbf0d6c2fe8fced607b5ee7ef00db733a7f27d8a6e8fc5d601ba9f37783ed5e9dbf076c9feafc7d60fb96cedf0fb66febfc0360fb8ece3f08b6cf747e08d8beabf343c1f63d9d1f06b6efebfc4360fb81ce8f00db0f75fe61b0fd48e74781edc73a3f1a6c3fd1f93160fba9ce8f07dbcf747e02d87eaef313c1f60b9d9f04b65feafc2360fb5ce72783ed573aff28d87eadf38f81ed373aff38d87eabf34f80ed0b9d7f126cbfd3f9a7c0f6a5ce3f0db6af74fe19b0fd5ee79f05db1f745eda35d5cefe51e70b8278dbd9af839aa9007c8b3f55e64f3adfca2823cbe6429952fd411ff58c437dcb54da616997954ddae1f7c026edf002b0493b3c1f6cd20ebf0b366987df019bb4c36f834ddae1b7c026edf09b609376f80db0493bfc3ad8a41d7e0d6c653aff2ad8a41d7e056cd20ecf039bb4c373c126edf01cb0493b3c1b6cd20ecf029bb4c333c126edf00cb0493b3c1d6cd20e4f039bb4c353c126edf0cb609376f825b0493bfc22d8a41d7e016cd20e3f0f3669879f039bb4c353c026fbcbd76093b67924d8a46dbe176cd2367f0a36699bbf0536699bbf0d36699bbf0336699b3f039bb4cddf059bb4cddf039bb4cddf079bb4cd3f009bb4cd3f049bb4cd3f02db689dff31d8a46dfe09d8a46dfe29d8a46dfe19d8a46dfe39d8a46dfe05d8a46dfe25d8a46dfe1c6cd236ff0a6cd236ff1a6cd236ff066cd236ff166cd2367f0136699b7f0736699bbf049bb4cd5f81ed599d97b6ba35d8e459b19a0affc509c7e16906be84a92c88b7edc7a90cf2cf40dd659a46c633968ce775329e0bc8785690f12c27e3398d8ce703329ecd643cc790f1ec23e3d94bc6339b8ce71d329e41643cedc8784e24e3c925e3b9828ca79a8ce755329e8bc8780e91f15c4ec6730619cf26329e8d643ccbc8789692f124c878f690f1ec26e3799f8c672619cf5b643c83c978ce25e339998ca725194f77329e4bc978e691f15c42c6b3848c6731194f2119cf59643c1bc878d693f12c20e3398e8ca70d19cf2e329e9d643cd3c978be26e3a922e379838ca79c8ce77c329e7e643ca792f15c49c6d39a8ca72719cf1c329e45643c0bc978de25e339878c671d19cf5a329e13c8787690f16c27e3694ec633958c671c19cf6b643cedc9782ac8782e24e3e94fc6733a19cfb1643c53c8786691f1bc4dc6f37b329e02329e35643cabc9784e22e3d946c6b3958ca70519cf47643caf90f15492f1bc47c633808ce74c329e3c329e7c329e0e643c23c9786690f1bc49c6731e19cf2a329e95643ca790f17c48c6b3858ca795fecfc2d3838c672e19cf70329ef9643c03c978ce26e3b98c8ce778329eb6643c39043c09e008c026bf3707db573a7f086cf2bd9e8fc0f6a5ce5783ed773aff2cd89eb2d89a59f884e12bb0c9bbd64f834deecf7c09367987e3776093e3a2f857f37d0b0ee76f06cb889fe6167ef4f73b0b97e4717bcb326541bcdb1b7d9505877f4f290f389e26e1694bc6733c19cf65643c6793f10c24e3994fc6339c8c672e194f0f329e56643c5bc8783e24e339858c672519cf2a329ef3c878de24e39941c633928ca703194f3e194f1e19cf99643c03c878de23e3a924e379858ce723329e16643c5bc978b691f19c44c6b39a8c670d194f0119cfefc978de26e39945c633858ce758329ed3c978fa93f15c48c65341c6d39e8ce735329e71643c53c9789a93f16c27e3d941c6730219cf5a329e75643ce790f1bc4bc6b3908c671119cf1c329e9e643cadc978ae24e339958ca71f19cff9643ce5643c6f90f15491f17c4dc6339d8c672719cf2e329e36643cc791f12c20e3594fc6b3818ce72c329e42329ec5643c4bc8782e21e39947c67329194f77329e96643c2793f19c4bc633988ce72d329e99643cef93f1ec26e3d943c69320e3594ac6b38c8c672319cf26329e33c8782e27e33944c6731119cfab643cd5643c5790f1e492f19c48c6d38e8c671019cf3b643cb3c978f692f1ec23e339868c673319cf07643ca791f12c27e35941c6730119cfeb643c63c978a691f134b3f01c72c423c74a59b7cc1f22f0addec3957bf1fbf4ff04fc8ee337573b623c6430ca7c35308a6d2ff07477c4b3dbe0d96dd1e268f9565ac8b73ff6e8ff09f81dbf57e82aa6ba1b8c326f8ba9ddc0d3c311cf4e8367a7458ba3e55b69217d1fa50f49027ec7f1f05cc5540f8351e66d3185e3b9f674c4b3dde0d96ed1e268f9565a485f43e9c39f80df71fc4b5731d5d36094795b4ce1785dfd1cf16c3578b65ab4385abe9516f2ee99bcb39c80df713c215731d5cf6094795b4ce1f810fd1df16c3178b658b4385abe9516f22d09f92652027ec7effbbb8aa9fe06a3ccdb620abf8f3cc011cf668367b3458ba3e55b6921dfaa936bf604fc8edfb7751553030c4699b7c5d466e019e88867a3c1b3d1a2c5d1f2adb418a4f3f20c2e01bf0f0246573135d06094795b4c6d049e418e78d61b3ceb2d5a1c2ddf4a8bc13a2f7d3213f0fb6060741553830c4699b7c5d47ae019ec8867adc1b3d6a2c5d1f2adb428d77979673001bf9703a3ab981a6c30cabc2da670fcdd72473cab0d9ed5162d8e966fa585bc7bbf46ff4fc0ef381ee760478ce506a3cc0f0646b1e1786f158e78561a3c2b2d5a1c2ddf4a0bf996967c833101bfe3f858ae62aac26094795b4ce17827958e78961b3ccb2d5a1c2ddf4a8be13abf42ff4fc0efc381d1554c551a8c326f8ba9e5c0b3dc11cf52836729916fa585bc0b277dd812f07b1530ae70c41815532b80516c4b8167a9239ec506cf6222df4a0b799623ef5c24e0f7b1c0b8cc1163544c2d0346b12d069eb18e78161a3c0b2d5a1c2ddf4a0bf976cc22fd3f01bfe378ed8b1d318e3518657e31308a6d21f02c74c413750faf217c47dd8f6a08df51f7561ac277d47d8286f01d758fbd217c475dbf3584efa86b9186f01d759fa1217c479dd33784efa8e7db0de13bea596d43f88e7aeed8d8f76f7f2c695ac792a3d9ae35d563896fcf39dbf371f1fb2e4e04b5af69d49463cc97411eaf5f1639d0c2513d0bf19af09b18d76bbb865f6868950f65f01ad5d5f5df388347e6c55f3632635ce4c4e7bb30013ee41d6565937b2def814dee712c009bdc03990f36b987f62ed8e47ed63b6093fb5d6f836db8ce8f049bdcbbc4fe48726f733bd8ca751efbc10cd6f9ad6093e744d8ff429ef56d019b3cafc5e7fef2cc7d33d8a4df043e6f96be2f1bc126fd97f039a7f4415b0f36e94788cfd7aa757e2dd8644c097caef3a5ceaf06db573a8fcf1364acce95607b52e7a780ed0b9dff1a6c4fe8fc42b0fd56e7f19ecfe33a3f166cbfd1f9b7c0f66b9d7f136c8fe9fc1b607b54e7f781ed573abf176c93751efb877eaef3bbc1f688ce63bfc45feafc4eb0fd42e75f07db249d7f0d6c1375fe55b0fd5ce75f01db049d9f07b69fe9fc5cb08dd7f93960fba9cecf06db4f747e16d8c6e8fc4cb0fd58e767806db4ce4f07db289d9f06b61fe9fc54b03dacf3bf07db0f757e1cd89ae9fc62b0c9f793f19eaebcb3b8146c324e09deab976f9554814dc6df5b0eb6d63a8fcf65e4bda4e160936fdb57824ddeffaf009b8c91540e3619c76930d8e45b6083c026df2b1b083619b37400d8645cd5fe60936f17f7039bbc4fd9136c3246480fb0c97754ba834dc6bec33181e57b97d560937782709c60f9eefe97609377cbbf029b8cdf846302cb37ae9e049b8c4bfa05d8ced1f927c026ef6bfe166c053aff38d8ced5f9df80ed3c9dff35d8e4fb958f814ddea979146cf21dfd5f814ddecd9e0cb68b75fe73b05da2f38f804dbe43f44bb0c958b1bf005b7b9d9f043679677e22d8aed0f99f834dc63a9b0036f9beeacfc026dff81a0fb6229dff29d88a75fe27602bd1f931602bd5f91f83ada3ce8f065b279d1f05b6ce3aff23b075d1f987c1d655e7a59d51fbb3dacf0feaf9b220bef332e5efe3a0f694eeda40189027ce73ed7ce0415f0762af7b71f2bc5ef6fb667abd124307c0f7bed87da7ae29f6eb75b5d0ebdd67f8ce85329fea46442db7077e2f833ac872788d2deb9665ae8465f71aeb6ea3ebbbdf517df7194cc2bd1f98a4cc6767d7947d423796ad619918d992d7c7126b0168885319e485c18d56c58578de5b179efdc013ff7e92ba5e771113b86fc57dbd6ede6332632d1fcaec03fdf63ad00ff77559b7cc8b3fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfccc8a479e27e0736529779084516c0780677ffc3c85f81c56d6af9eeb3c00cf750ec4eeb7f6f3bd967abd85469d73a1ccaa736ad886e87c1efc2edb2d6a5bee8bbd0ee9b7a5f8cb83faec071e07db32c973c0e0317de759f4519aedb568b6c711a3d966c8fc1e60dca7f37b81c7d5feb8cfe0317d639bb19f54b3a876d645bf84747166eb8350109befe2a1ae9eebaa3e53aa2f8779fc3a68688a7d20c486cfc1f360994ff4ff04e8f309e87334db00b35f02b6531f03e3bed8198b6b3d0396b6ff4a4353ec03f1a2d656fa40c4df0e1417ba3c46c83e6af6adc0ba4a99e9709c9ba9f3d80fe820aceb5dcbef32e518f36590c7367557fc754e6e5fe9bf2adb7797c5f70e608dc977ad77397274123f62cf85fc3be7d4949572a287682dec386e15b29bcb7d6c2c970f65765bea5f16c45bff5d06cf2e8359c5ce1c88b377e15ccf559bb43b42a32b41232983e7bc0efa1459db48e1107faa8c6cff5646193c3f95328ba18d527591765eea89fd98f018e0ea7ce1a0513f99c7f305db398d5947151fb79f5cc3ebfa5aa05960d79aa5afdf66682fe2eeebb71962c8765e2aeb2f84f50b57ab20fad82265b61ac75117d793b82d4d3df7039394d909edd07fd6e3baee685da3475dd7ed76c083d71a32a53bbee331c645fbe2a89e85b663d75ea34ef950e662a8a783f398b4efa4ee02df2eb6396a21e750fb0c2d72a1cc778db6234a475907de07705b9762ebf960a1a52e52e6c7463bb5d30193cbed86e7596abd072c759532bf80f6ef73389fdfa77fc7b6f42f96df654ad71ee037e5b7c55fe7e4f695f71b65fb6eb3f8fe105863f25deb9b1472be2f7ec49e0bf93fc3f15bca891ea2b5b0ab7d44deef447673b97dc672f95066bba5fe6541bcf5df66f06c339855ecfc06e2ec2f70beefaadddc1ea15121682465f0598179bf05ef9de071bfa1ae0b64fe236014db2ed0f73f9dde2f4fb17d64b099f7cb6de78385063f9e0ffe6f68671396b2ee9f03a4ce6db05e528fc0a86b60d4d5d1f96b698ea16719f8e900f67d3a2f3acb6f788e2b6572daa5febbbb7f55fb3eb6704b3df079dd1e837bafa12bde8b6a09dc2aeecd6b0b3c4f777c4d5b8ae762e6f9105e8749993c60b79dc71db2d4c53c4e370b0ebf16fcc6288bd7d9e99633f31f19cbe03d830316265bdb17db7b3945858526bfaddd3b6830db7495fd00634ed665ee2b783e2465ce84ed96b094556dd27f9d58a38f6c47bcd76ebbcfe2ea7811759f45fc2946db3b932e9e6134c577d35ac7b6deaee5b6e76cecfd195a1bf9787c1757e0b1229d167b2c3caeee694669b1c7e23b3e2d3a0db5b573362d765b785c5d634669b1dbe23b462d2a6df7166c5aecb2f0b8bad688d26297c5777c5a74ae755f239d163b2d3cf1dfd348af053e13cb84793701736b231f8fefd272dbb33b9b163b2c3cae9edd4569b1c3e23b3e2d8a3ad9aed96d5a6cb7f06c6f602db65b7cc7a74597aeb67b2a362db659781cdc5f4babc5368bef18e36218de5f4ba7c5560bcfd606d662abc5778ce7879dd2dd33442d3eb4f0b8baf717a5c58716df316a3144f9de52072db65878b634b0165b2cbee3d3a2bca3f2fd411db4f8c0c2f341036bf181c5777c5a0ce9a27c6fae83169b2d3c9b1b588bcd16df315e4325e362531db4d864e1d9d4c05a6cb2f88e4f8b8ae4b9d6c63a68b1d1c2b3b181b5d868f11d9f1685c963ea863a68b1c1c2b3a181b5d860f11d635c24af27d7d7418bf5169ef50dacc57a8bef188f23c9b85857072dd65978d635b016eb2cbee3d3a23279ff696d1db4586be159dbc05aacb5f88ef19e4b322ed6d4418b35169e350dacc51a8beff8b428491e5357d7418bd5169ed50dacc56a8beff8b418967c26b6aa0e5aacb2f0ac6a602d56597cc778de996c2f56d6418b95169e950dacc54a8bef18cf3b93f72f56d4418b15169e150dacc50a8bef18dbcee479e7f23a68b1dcc2e36a8cc8282d6ce353c678de99d462591db45866e17135b6619416cb2cbe633cef4c1e4796d6418ba5161e5763514669611b0733c6b848b69d4beaa0c5120bcf9206d66289c5778cf7b5926de7e23a68b1d8c2e36a6c8e282d165b7cc7783d92bcc7b7a80e5a2cb2f02c6a602d16597cc7f8ac28790ebeb00e5a2cb4f02c6c602d1682effdb1fb4ef5e7161fd217eb0a438b5c28f36da32f56948eb20e7c8716eb521d7b5d52fdcade8fa84b35d445cafcc0e8cbf7be032647754dc6cc7b7a5dd237fd634b5da5cc4fdbd594fdb9ce27609b1c8275fdd1f2bb4c39c67c19e4453f55e7f9f1d73919ab320e906cdff916dfef006b4cbe8bd0778e4ee247ecb990ffba5d4d5929277a88d6c2aef691053a8fece6720b8de5f2a1cc024bfdcb8278eb3fdfe0996f3027df7b8038933872d376a5981644687405682465b0cfde21473c1f1b3cc221fe7282c3df459532b22cbe8bfa77a3dfaef483947a46f5917ccf51fda2fa488abfa87751cd3aaaf8f801f4fd94714164cc10659331404a603d9d0d9baa6b174775155fb26e99ef028c322649e786672cae2b63278351f17473a0198eb32253bae34537e0e9ea80c7513d93c7a1ee469dba1875ca8732f86e637707f5cc01bfb26e99ef0ebe5d6c73d4428ec9971a5ae44299bc82d47f397f8cd251d6a1e2b7b3a52eae74ec64f074b2f8eee5584759b7b489bd1ac0770fc37747c3b7dab731c6d4946edfee01cc3d1d30abf5f68e7fbd8578ce28f12c7e3a429dfa800671d509d725e7987d0c6d73217f7e414d59292765e5d829ec6a3f926d89ece672dd8ce5f2a14c2f4bfdcb8278ebdfdbe0e96d30abf386d30a6a381cec0fc918e86570c87c47d0ae778476bd403b2983c7de4e8eb4eb69f0c87c27e091f3abee6093f314e14fc0ef250dc06db67bdd2ddc62c3f1083b59183bc6cf589ceeb8d01118c5d613787a38d2ccdcd6971afae039412ba38c2c9b0b65ba14a4fecbbb5a6659b5df9d9b5353afe6da1edb7b6bba4d6fe9402f1c0f34007d0243439984a175503366689c3cc7063563824e9858357ec843c3ee1a967aec2968b90626fecfb154a319d830dfdc620b82da439fe6824d863e6d01b666862c38e4aa9497a1135dc8857ac8ba730dced6c012a76f1c3656a674a1d30a785c84b20a1d193a5687cebde3474c1c86f1d1c2e0ac4feca8df9aa72917b52e89835c0775472659b7cc8b3fa54fbece8f1d3274649ff10f4d1a3d6cccc409086bee5c98cf314430ffdb96c120c19d49d6d3c210e7d8f8c529c5318a4dbe00fcc9240cad839a718c63e44906aa8c353c74c8a851774c2a1f3562e87593c60c9d38a26a0c2adada502e4a6df9bd25d86c4d1d965513eebeb86c2b8bcd36e1a8ceadc1262df83160139e63c1d61cf252dedc324ef6918b61fd12d6ea37254e0b5df156414d08c86149b52f6a1f529f5155a7036a68693594b4da9cea8e9d1a1a5a7d454e0dfdac867a56433baba19cd5d0cd6aa8663534f3d9416ae86575f7b220480da57c5e901a2af982203514f245c0f76d60be24489d7ea8a18cdb07a9a18ad5ed43f5fab8fad49a7abf5d9dc6aacb6375eaa72e75d469983afd52a7d9ea1682ba9da44e6dd469a33a2552a731eab4bcb7d6ba4f98ae0ad3d561ba264cd786e9ba305d1fa61bc27463986e0ad3cd61ba254cb786e9b630dd1ea63bc2746798ee0a53df30dd1da486d3be274cf706a9e1b6ef0b524371df1fa486e97e20480de1fd60901ade7b48901afa7b68901a167c58901a32fca120359cf888203554f1c82035b4f1e820353cb21aa67c6c901a125d0db5ac8665564338aba19dd5d0d06a186935e4b41a8a5a0d65fd44901a22fba9303d1da486d07e364c53c2f45c989e0fd30b617a314c2f85e9e520352cbb1aae5d0de33e23480dfb3e2b480d13af868f57c3caabe1e6d530f46a787a356cbd1acefe8d30bd19a6b7c2f476907a2ca01e87a8c704ea16bcba45ac1ed35407a9dbd78b82d46366f5d85d754350dd325437951541aa1b93ead6a5bab9a96e7faa1ba4ea16aabac9aa6ec3aa1bb5ea56aebad9abd70ed46b18eab514f59a8e7a6d49bdc6a55e6b53aff9a95735d5ab8fea555ef56af3be20756bfa40907a5ca96e57abdbd2ea16bdba85fe6998be15a462f23b61fa2c4cdf0dd3f7c2f4fd30fd20480d19ad869756c353aba1acd510d76a386c3574b61a7a5b0dc9fd79901aea5b0d15fe9b2035dcf81761fa5d901af2fcab2035dcfd1fc2f47598fe18a63f85e9cf61fa4b98fe1aa67f0bd3bf87e96f61fa7b98fe234cff086a8635c786a440b73ee7eaf92113270e1b3d7662c1c4aa82d193464d1c3176d4630593474c1c5e50f5c8b0f195a3aa26e3c2bfd50bcb98ec7dc68f1ff258c1883115c31e2da89a34b1a0aab2a0bc6ad2988a5a07d2ffa7173aeb708f432a2aa29de535ff17488f6f5e3fa7edf47232dafd8de9eb765ef37a0872497d16baa59e15ba5b1fc1e492af6fea7cb060c2a8aa8905850563c2bfe181b76af2b08a0e05f8db8450e409130b264c1c327e6241e5f8aad105451d70bd85c7d6a312f38e750353727afdc4f9e4ecd4ff7a85d80be7d4438145e7d48f74d339ff02e987f574fa597d6af8a3fa2cf45ff5240cda45ca326152f9c4f143864e8c5eb8c5bfb270a25d3daa7946bbfa55f35bf571f6fdfa2cf4b77a12260aeae1ac7341dd9d05ff035566efd0b00206009b2d6c6f000000275e1f8b08000000000000ffed9d67701cc7b1c7f700100cc72308e64c28514c000f8744800994c41c642a8b4a0449502245121409e51c6ccb966dd9720eb264cb414e720e72ce39e724dbb225dbb265ebcb73bdf7ea55a9deccdeb4f1c76876853b6f83b3b8deaae6cd36e6b67fdddb33bb3733bb7c2608824c50dcaa959c143c77a3bf779bcffc7fb6352778ac3c276726259c5529e1ac4e09674d4a3847a584b336259ca353c23926259c6313e4d46c55c1e02d69de710c714d9a319bb2988e4f414c73298be98414c4b42e48471f3531259cf529e19c9412cec929e19c9212cea929e19c9612cee929e19c9112ce9929e19c9512ced929e19c9312ceb929e19c9712cef929e16c4809e70929e13c31259c27a584f3e494709e9220e712e05c603e4f359f0bcde722f3b9d87cd277969acf46e3638dd96f52b24cb32969b6fe5650d2a2a455499bf5b776251d4a962be9347f6b307feb52b242c94a25ab94ac56b2c6c461ad92d3949caee40c25eb94ac57b241c946259b946c56b245c95625db946c5772a6921728d9a1e42c25672b3947c9b94ace5372be920b945c68b1ec547291928b955ca2e452259729d9a5a447c96e257b94ec55d2ab649f92cb955ca164bf92034aae547250c921258795f42939a2e42a2547951c53d2afe46a25d728b956c9754aaeb7627683921b95dca4e4668bf31625b72ab94dc9ed4aee5072a792bb94bc50c98b94bc58c9dd4a5ea2e4a54aee51f232252f57f20a25f72a79a5925729b94fc9ab95bc46c96b95bc4ec9eb95bc41c91b95bc49c99b95bc45c9fd86851ac25b953ca0e441256f53f276250f29798792772a799792772b7958c97b94bc57c9fb94bc5fc907943ca2e4834a3ea4e4c34a3ea2e4a34a3ea6e4e34a3ea1e4934a3ea5e451259f56f219259f55f239259f57f205255f54f225255f56f215255f55f235255f57f20d25df54f22d25df56f21d25df55f23d2be6df57f203253f54f223a3fbb1f9fc89a94be3623f55f23353feb9f9fc85f9fca5f9fc95f59d5f2bf98da5fbad92c72cddef94fcde94ff603e1f379f7f349f7f329f4f98cf27cde79fcde75fcce75fcde753e6f36fe6f3efe6f369f3f90ff3f94ff3f98c92dba714cb638281ad3b48a88f6add97d7732a14fc05c1e04dc7a2dafc8d3e1b8cbec6ecd327c56e94d91f65e96bcd7ead759c31667f8ca5af37fbf5967eb2d99f6ce9a79afda9967ebad99f6ee94f36fb27833e1bc098abd16b5db551654047f95a05ba5146570dba5a3a1ce8461bdd28d0d1f9ad05dd58a31b0dba714637067459a31b4bb15432dee8ba83a47225dfa38f9b4bfab8661e6a42f2bc7bf471eb98782726cfdbab8f5bcfc0abf3639239d644c89bc946570f3ad3dd04934037d5e826836e9ad14d01dd74a39b0aba1946370d74338d6e3ae86619dd0cd0cd36ba99a09b6374b34037d7e866836e9ed1cd01dd7ca39b0bba06a39b07ba138c6e3ee84e34ba06d0d11a97134077b2d19d08ba538cee24d0515f7b32e8e8def014a3d3fdc4980c7cc7e8a98f0abf43fd33e81652df0cba45d42f836e31f5c9a05b02b649b714fa15d2351a1df551fa6f5da6dc1d24d5260a619b5891f471d591f57157257fdc70de6e753010d76eb0b30262b5c694135c1bd48cb63346c80ee96ba0bc09ea523d8a075d67885d5f4f569af29a98ef7559dfcb419d950effbb8364fd5f65f1acb2984781ff3c39db52909c1df25672ce9e0f75eddca37b9e9198b35b81832167db256787bc959cb3bd50d7ce3dbaef1d8939bb13381872b68727670b79c9d9e2185910b8738f7efb8cc49cbd023892cfd936c9d9a16f25e7eced50d7ce3dfafd3b1273f61ae0483e673b7ae4de60c85bc9397b2fd4b5738fc6624662cede051c0c39db2bfdec90b79273f67ea86be71e8d0b8ec49cbd0f3892cfd94ea69c6d919c0d8af39d41e0ce3d1aa31e8939fb2070249fb37b647c76e85bc939fb28d4b5738fe64b4662ce3e62ca7a9ee1c7669e610ee87e6274738137f9dcdedbca94db05c9ede23a902070e728cddd8dc4dcfebc29eb3cfe39ac3d20dd2f8cee04d0fdd2e84e04ddaf8cee24f08ba10df4481b18f256721bf80dd4b57399e69147621bf8217030e4ec1ec9d9216f25e7ec5350d7ce3d5ad3301273f677c0c190b3bd92b343de4aced9ff86ba76ee2d34e59198b3b4ae54df2ffcc1dc2f2c06dde346b704747f34baa5a0fb93d13582ee09a36b02dd9346b70c747f36ba3ce8fe6274cda0fbabd11540f794d1b580ee6f46d70ababf1b5d1be89e36ba76d0fdc3e83a40f74fa35b0eba678caed3e8f47c17adbdfab6d1e9734bf1e80e923bb7e17aab60f096b1f6bba1dcc8cb93cf05839f45205bcb92b7d5a27d6f0a86eefb32e0c933f89e051b43e1c9034f73f23ce1bad342f2c70dcf719315d32cd86a02bf5a18fcca802d3a36ed93bd1ce8b02f697130b626cf58c8802d3a36edb70223e9b06fa36b0cb51fdd373764067819da52787d467bddc041f66aa0cedc2903754f366ce3e1efd4078c8732f6fdcd968e2957c35c215b746cda2f0023f9d83cfc8c85a132e62d46ae7e2303b6e8d8b6edf18ef8e898b53a62d6c6c4d86a31d27e1b3052fc5a879fb1305446bb5f60ea939a87da27515c9a873f66433aaf39d0e1fd5f9b83b13d79c6f0bcb6598cb4df0e8ca46b011eaeeb61547bf5c536c77d08e6335db3e8fa43f66aa04e47f540ddad703d65e8430ba5de9b629f9efc792ae4f17a36141ee673d7cc948f79ec3b9f0d92cd35bbcd375bb1c2368f7d39573f19d597933d61166661166661166661166661166661166661166661166661166661166661f69f396a5eceb59ee1783292ae003c1ce3fce13baaccb1700ee83198d7497edea290c7b97a5ac7b8c8f2b906eafc5f6680ed71c73a099c3b5f66e998d62985e712d72975c33ed9c3751bb86e8a61ed49c8b3d4e2b16d8f77c4c7c775243eadd1885aa7e553cc72a0c3f5704d4c3c5179d6e4b0dd9098edc21e9eb653c8ebf701e977ea517f62b7115cfbb6c4d2e93ea9ab7ac06f8e1c2875de19af1b544e721e17f30d6d25bfdea630687d425530f85a81f7140c6b5406cd57d3da8876cb760dd4195b15fcfbdc2c87bf7707cf5d23a4eb7458c7a6ef2c82ef7658c7aee3f337b63f6c076e2ad75abe350237d5995035e0e3e74c99e97ea680eb6703e00d2c9f68c3f519c9dfef15d78bb494c0d3063c1c6bd798ee6bf3988f49af17e9b062e5ba5fa63aed10bf0e86f8c5ad59237bc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc2ec3f33beff8258f119e982278cc3b4c6269ccfa07719e1bcd803550376b9e70069ce69b1e5333ea3fc74d500db43a68cef08703def8ee7926b6e2dea5c92bdf1c1739fd3673a97437ef7439b23661d8e982d6762b4fb0cda5f0e8c14bf0ee0e16a8fed168f6d1bfb8c364f6316d5cf72ad5f89ca33d73a8586c46c17d78b70ccebd27a11fbfa55b0628aeb244887f3e0f86e159fdfff62af5dc07e0ad76825df6f1606cd01db6b05c91eae93f886892dad9348be1f28e439af11d446694d488bc357aaf35db8ce7ddf9471ad50018ef598e3efb4c5ad49c03e35f17770e68b73fcf4ee4a3abf5d0edb2b813521dbcd683b6384ec90be06cabfad1aa84bf5281e146b62d76d84de6588ecf6f79aadefe5a04ea7c3ffee2059ffbb2c9e2e8b59e7ce8f20cf1e837b3dae3ea93322468b20465407ef79b9ae5ff69a6d7bad32f6a3a3ad3af4dd1aa8f324f451a5bc2b8aeb7e21ea1a80f70bf67561286bc72b7d3de0bfa0bf487a3de0bf20875cf7a574fcc5707ce21a1d445f5ba8ceff5ad75186f57a437aef95ebb71ff1e27a43aaf32cf45579b32e37ea778ceb390baedf0d51cf7d903dbca72ac577ec1792be36623e220be6f2bfafd126d6948f1d11dccb1cdfcd467c976245ebcbf177b21d3f1d874ef84e77227128f6375d962fd4a63ac117aa530fbef0dc3315ef3f93f775f0fd10f541ad0e5fa9ce347817dc0c53cec279c2bef254c7df698bbbffa4f8699f87fb9dea68db8777aa2fa81ea86bbf1b9d625dea3bd5dbadeff9f84ef5d99067a7c2b3165c7df5ca88182d8618511d7cd6d1fefd1f758d399eef25b5fb4dbc4e0e279b3d7eebba3fa13a780f4d75daa09fcd3aeadae3d2740d49727d3a3e0fb414ece2f3404b99e2990b06c733677170daaeb36cd70da3ed7acb76fd30da96984bcc7d8a39c3ff3d51f6ff8581ff6745550a18ab53c0589302c6512960ac4d01e3e814308e4901e3d814308e4b016316188fe7b59d213e05cffebfa7d87b0db4cdf03e8730168dc1d063d1c4cb137bef83b619dea152f2ff37c0fc7f613597fb7f61e5e07b9352c03839058c5352c03835058cd352c0383d058c3352c03833058cb352c0383b058c7352c03837058cf352c0383f058c0d29603c21058c27a680f1a414309e9c02c65352c0b8401813615cc2cb58f0edff71ce0683d79a3d1f0ff3bb47c37728bade73caf17fe396ea3bf37b879bcb7d4f1faeb1e0fdbf1effb3770972aca128f55d8271ff3f361363a15c46aeb5e4b88e7a283cf81caaebf91606c642b98c5ccfa0e0339143e171fd5fbdbccf041563560e23d79ab152d734e2b382ed8e98313016ca65e47aee009f891c0a8febd9c5665ec642b98c5ceb73b36063283c9d10b3e58e98313016ca65647abe2c8c5967093cf81c56a723660c8c85721935cf0aa6987595c0b30262d6e588994f8cc893f43bd1bb1cb6389edb2bd5776240c6b129601c9702465c27c1d17fc5ad93e8e28d4fa1dcf8709dafb87512689be139913016f85cc0f3c562152f4fec3a09b4bd9a2916f8dcc6f3c56235f0703c4792051b43e121861c7c6f520a1827a780714a0a18a7a680715a0a18a7a78071460a1867a68071560a1867a780714e0a18e7a680715e0a18e7a780117fab32dc2bc6fe7e593dc26d47fd5619e9b6a37e978c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e4b94fb6d330c62f8c238f11791a92e3c9a3ef68abdb03dfbb1d3c1926dfd1d65a0f7c2786b431ae4901e38a14304a1c8b6b10cb61d43ca731f1ac2d81e734e0399d89e7b412784e079e3392e70973eaf41278882107df5b9102c635296094384a1c7d629438564e1c8551188551188f07631afa70614c453e16ca65d43ceb92e709637646093ceb2066f4bd665ec642b98c9a677df23c61ccd695c0b31e62b6ce113306c642b98c9a6743f23c61ccd697c0b30162b6de113306c642b98c9a6763f23c61cc3694c0b31162b6c1113306c642b98c9a6753f23c61cc3696c0b30962b6d1113306c642b98c9a6773f23c61cc3695c0b31962b6c9113306c642b98c9a674bf23c61cc3697c0b30562b6d9113306c642b98c9a676bf23c61ccb694c0b31562b6c5113306c642b98c9a675bf23c61ccb696c0b30d62b6d511335f1957a480714d0a1899e358289751f36c67e2d95602cf76e0399389677b093c6702cf0b92e70973eacc1278882107df5b9102c635296094384a1c7d629438564e1c85511885b134c6ee1430cab916465f19197e5fc53e4373e608b75d67d9aeab10db51cfd08c74db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9e57826dc973c9f34ab02d792e795e09b625cf25cf2bc1b6e4b9e47925d8963c973caf04db92e792e795605bf25cf2bc126c4b9e4b9efb647b47f2b60ba53ec3ba0378389ea965f233af8f7b9639d6b309c64fc7ea6c2b56675ab1ca419db3207e6733c42f0376e9d8b44ff64a653ed5036626db8509ea1863c17fb2b1c68a87b67f0e93ef517dfd3923dc76545f3fd26d47f5f523ddb6e4b9e47925d8963c973caf04db92e792e7bed8c6724d3070df4eef57d2c738d79447997d64a5ef519d55a38b9f7581b4210edbd286e45a5109b625cf25cf2bc1b6e4b9e47925d8963cf733cfcf4bde76383786bf2ff4163737761ef09ccb100b263ff3daa7f32d9fceb17cca411d7c67edf90c7e66c02e1d9bf6cf87f3903666cdb3da9489350bf5567bc248ba737979c2f6b53a18bcc5b5aff38187a11d3433f919b6af0b2c9f563be24e7530572f60f0d3d57668ff02380f6963d63c6b4d9958b3506fad278ca43b8f97276c5f6b83c15b5cfbba007838fa1f263fc3f675a1e5d35a47dca90ee6ea850c7ebada0eed5f08e7216dcc9ae7345326d62cd43bcd1346d29dcfcbd39a059f698b6b5f17020f47ffc3e467d8be765a3e9de6883bd5c15cddc9e0a7abedd0fe4e380fc22ccc2e66cd43ffa73cb166a1dee99e3092ee02569ed67c167ca62dae1fdb093c1cfd3c53dcc37eec22cba7d31d71a73a98ab1731f8e96a3bb47f119c875298d7a49059e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e25c1eb3e639c39489350bf5cef084917417f2f284cfef9c110cde32d67e37942f029e9d0cf161f2335cf77eb1e5d3198eb8531d6c5f1733f8e96a3bb47f319c875298d7a49059e25c1eb3e65967cac49a857aeb3c6124dd4e5e9eb01f5b170cdee2fab18b8187a39f67f233ecc72eb17c5ae7883bd5c1f67509839faeb643fb97c07910666176316b9ef5a64cac59a8b7de1346d25dc4ca53089f435c1f0cdee2fab14b8087a39f678a7bd88f5d6af9b4de1177aa83b97a29839faeb643fb97c2792885794d0a9925ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e728668973e5c459f36c306562cd42bd0d9e3092ee62569e9670de614330788b9b77b8147838e66598e21ece3b5c66f9b4c11177aa83edeb32063f5d6d87f62f83f330d299d7a4905972637898253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a398253784398a59724398a3987dc80dcdb3d19489350bf5367ac248ba4b7879c2f71e6c0c066f71eb762e039e4b19e2c3e467b86e6797e5d34647dca90eb6af5d0c7ebada0eedef82f3b04b9885d9c1ac79369932b166a1de264f184977292f4fd88f6d0a066f71fdd82ee0e1e8e799fc0cfbb11ecba74d8eb8531dccd51e063f5d6d87f6c99e300b7314b3e6d96ccac49a857a9b3d6124dd65bc3c613fb63918bcc5f5633dc0b38b213e4c7e86fdd86ecba7cd8eb8531dccd5dd0c7ebada0eedef86f320ccc2ec62d63c5b4c9958b3506f8b278ca4dbc5cb53c882cfb4c5f563bb8187a39f67f233ecc7f6583e6d71c49dea60aeee61f0d3d576687f0f9c87b4316b9eada64cac59a8b7d51346d2f5f0f284ed6b6b30788b6b5f7b8087a3ff61f2336c5f7b2d9fb63ae24e753057f732f8e96a3bb4bf17ce43da9835cf365326d62cd4dbe60923e976f3f284ed6b5b30788b6b5f7b8187a3ff61f2336c5fbd964fdb1c71a73a98abbd0c7ebada0eedf7c279481bb3e6d96ecac49a857adb3d61241df653b45501e37626c6c0620cacf820cf3ccf787678c633c3339e499ef18cf58c6791673cd59ef12cf78ca7cd339e82673cf33de399e919cf64cf78c679c6b3d4339e1acf781678c6b3d8339e599ef14cf18c27eb194fa3673ca33ce3e9f28ca7d3339e859ef1b47bc6d3e219cf32cf78667bc633d5339e259ef18cf78c27e7194f93673cb59ef1acf48c678e673cd33ce399e0194f9d673ca33de359e5194f87673cad9ef1e43de399eb19cf74cf78267ac653ef19cf18cf78321ef06483e7ae63c8c2df7780aecafaaebebeec9e32f0779a37ae82efec33e56ac7b17b4147f3ccfb1cdfc53871cd85a3ad6ed8277be381639f273c633ce3a9f78c67a2673cd33de399eb194fde339e56cf783a3ce359e519cf68cf78ea3ce399e019cf34cf78e678c6b3d2339e5acf789a3ce3c979c633de339e259ef14cf58c67b6673ccb3ce369f18ca7dd339e859ef1747ac6d3e519cf28cf781a3de3c97ac633c5339e599ef12cf68c6781673c359ef12cf58c679c673c933de399e919cf7ccf780a9ef1b479c6b3dc339e6acf781679c633d6339e499ef1ccf08c6787673cf33ce3a972f0ec60e2897ab6798727b619ce435e1ff772269fae30c7aa35c7257eb25703754e32038f7afe03bf4b5cf6fc3fb69d2b20465cef95c8593cb4bf7784dbaeb36cd75588ed7acb767d85d8963c973caf04db92e792e795605bf25cf2dc47dbcf2667bb4dde2f35741e799f533c8fbccf299e47dee714cf23ef738ae791f739c5f3c8fb9ce279e47d4ef13c0b3ce391f739c5f3c8fb9ce2791a3de319e5198fbccf299e67a1673cf23ea7781e799f533c8fbccf299e67bc673cf23ea7789e5acf787c7b9f936fef8397f74bc5f34cf08c47de2f15cf23ef978ae791f74bc5f3c8fba5e279e4fd52f13c633ce3c978c0f37cef97c2f7425d61ca7b4147eb4be3de439585e35c013a1acfa563e8ebd5a129cf65a882efec77705deeb04776f63bbe3b1c71475bddb04ff6f07d55fb3de119e3194fbd673c133de399ee19cf5ccf78f29ef1b47ac6d3e119cf2acf78467bc653e719cf04cf78a679c633c7339e1d9ef1acf48ca7d6339e26cf78729ef18cf78c6789673c533de399ed19cf32cf785a3ce369f78c67a1673c9d9ef17479c633ca339e46cf78b29ef14cf18c6796673c8b3de359e0194f8d673c4b3de319e719cf64cf78667ac633df339e82673c6d9ef12cf78ca7da339e459ef18cf58c6792673c333ce399e7194f958387eb9d5151cfd70fc7fbaa9ecfb6de5f0a71d15b16fe3e1ccf71edb018691fd73d202ff12c65e2897a2fc0520f6c6bffe9b7e804f39985bfe373385c39b5d462a47d574ee1bac646269ea8f719347a605bc7a2c994690d4016fede048c5c39d56831d2be2ba7ea79795ab3e0336d716b8db0cd719c43263ff3d8fe127c87465ec76abb15ab262b5639a8331cebd2a3fa03b227ccc21cc5ac79682e8558f17a361ccf990d85d1757d65e009fbc765c1e02dae7fdc0e3c1cd70f263fc37eec80e5d33247dca90ee6ea01063f5d6d87f60f386c3704c9c6e2ca21c4e24a07cf95c31c0bb2572af38e1432fb1067cd436b118915d737e73d6124dd525e9eb07fcc0783b7b8fef14ae0e1b87e30f919f609072d9ff28eb8531d6c5f0719fc74b51dda3f08e7a114e6032964963897c7ac79680e8258b350afe00923e9b6b3f214f259f099b6b87eec20f070f4f34c710ffbb143964f0547dca90eb6af430c7ebada0eed1f82f320ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22ccc7e336b1e7a369658b350afc51346d25dc9ca539c776809066f71f30e878087635e8629eee1bcc361cba71647dca90ee6ea61063f5d6d87f60fc3791066611666611666611666611666611666611666611666611666611666611666bf99350fbdb39d58b350afd51346d21de4e5099fdb6a0d066f71f30e8781e710437c98fc0ce71dfa2c9f5a1d71a73a98ab7d0c7ebada0eedf7c17910666176316b1e7a571bb166a15e9b278ca43bc4ca539c3f6d0b066f71fd581ff070f4f34c710ffbb123964f6d8eb8531dccd5230c7ebada0eed1f81f3500af38114324b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc1267897314b3c459e21cc52c71963847314b9c25ce51cc12e7e161f621ce9a87fe0f4162cd42bd764f1849779895a7259c77680f066f71f30e478087635e8629eee1bcc355964fed8eb8531d6c5f5731f8e96a3bb47f159c8791ce7c2085cc921bc3c32cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc52cb921cc51cc921bc21cc5ec436e689e0e5326d62cd4ebf08491747dbc3ce17b0f3a82c15bdcba9dab80e708437c98fc0cd7ed1cb57cea70c49dea60fb3acae0a7abedd0fe51380fc22ccc2e66cdb3dc9489350bf5967bc248ba23bc3c852cf84c5b5c3f76147838fa79263fc37eec98e5d37247dca90ee6ea31063f5d6d87f68fc179481bb3e6e9346562cd42bd4e4f184987d7e54e269e9cc59373c4e278d9d6fb5da63cde7c66e1ef5dc0c8d51f765a8cb48f398ebcc4d3c5c45367f1d4396271bc6c6bff579af204f39985bfaf0446ae9ceab21869df955375c0b39289a7dee2a977c4e278d9d6b15865ca13cd6716febe0a18b9726aa5c548fbae9caa079e554c3c517dd2aa61b01dd5be86c37654ae0c876d897974cc19da5d383eb02a18bcc5dd57e3b585a3af62f233efba7eafb27cc2eb37dea31eafeb93300b731433d37d6e6bd6b24df1092c1eda8e32c762387f6777593ea5e177761cf38114324b9ccb63d6b6fb93b7dd9ab56c537c028b87b67ee65830f919f6075707ee1893bd1cd4c13cbd9ac1cf0cd8a563d3fed5701e4a613e904266897379ccdaf63589db2ebe7f186d537c028b87b66b9863c1e367b13fb83670c798ece5a00ee6e9b50c7e66c02e1d9bf6af85f320ccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22cccc22ccc7e336bdbd7256ebb387e8fb6293e81c543db75ccb1e0f1b3387e7f7de08e31d9cb411d3ce7d733f89901bb746cdabf1ece83300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb3300bb330fbcdac6ddf90bcedf0791cb44df1092c1eda6e608e05939fe1f8fd8d813bc6642f0775f09cdfc8e06706ecd2b169ff46380fc22ccc2e666dfba6c46d17e7f3d036c527b07868bb8939163c7e16fb839b03778cc95e0eeae039bf99c1cf0cd8a563d3fecd701e4a613e90426689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e22c718e6296384b9ca39825ce12e7286689b3c4398a59e25c3971d6b66f49dc764b387e8fb6293e81c543db2dccb1e0f1b3387e7f6be08e31d9cb411dccd35b19fccc805d3a36eddf0ae761a4331f4821b3e4c6f0304b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e4863047314b6e087314b3e486304731fb901bdaf66dc9db0e9f6747db149fc0e2a1ed36e65830f919ae7fb93d70c798ece5a00ee6e9ed0c7e66c02e1d9bf6c99e300b7314b3b67d47f2b60b59cb36c527b07868bb8339164c7e86fdc19d813bc6642f0775f09cdfc9e06706ecd2b169ff4e380f6963c6f39749ce76b86e936c54994fadbbcb94ab41f74253ae01dd8b4c7914e85e6ccab5a0bbdb944783ee25e01be95e6aca4b40778f29af02ddcb4c7925e85e6eca5da07b85297782ee5e533e0aba579af231d0bdca94fb41779f295f0dba579bf235a07b8d295f0bbad79af275a07b9d295f0fbad79bf20da07b8329df08ba379af24da07b9329df0cba379bf22da07b8b29df0abafb4d7901e8deead03d60cab781ee4153be1d746f33e51da07bbb298f05dd43a63c0e74ef80327dbed394c783ee5da69c03ddbb4d7902e81e36e53ad0bdc7942782eebda65c0fbaf799f224d0bddf942783ee03a63c05748f98f254d07dd094a781ee43a63c1d741f36e519a0fb8829cf04dd474d7916e83e66cab341f771539e03ba4f98f25cd07dd294e781ee53a63c1f748f9a329edf4f9bf21da0a37ee54ed051bf7217e8a85f7921e8a85f7911e8a85f7931e8a85fb91b74d4afbc047494772f051de5dd3da0a3bc7b19e828ef5e0e3acabb57808ef2ee5ed051debd12749477af021de5dd7da0a3bc7b35e828ef5e033acabbd7828ef2ee75a0a3bc7b3de828efde003acabb37828ef2ee4da0a3bc7b33e828efde023acabbfb414779f756d051de3d003acabb0741d760ca6f03dd09a6fc76d09d68ca0f81ee2453c67ee664537e27e84e31e577818efac27783ee54537e18740b4df93da05b64caef05dd62537e1fe89698f2fb41b7d4943f00ba46537e04744da6fc41d02d33e50f812e6fca1f065db3297f04740553fe28e85a4cf963a06b35e58f83aecd943f01ba7653fe24e83a4cf953a05b6eca8f828eaee3d4cfe8f6acdb25c58162a475e47393c317d28d015fba8364efe9c8161d9bf65b8091ce4161f8190b43656cb618354f1b43cc30af688bfbcdd4063cad0c3c4c7e86bf99da2d9f5a2c9f7250e754f0b39dc1cf0cd8a563d37e3bd8e638e7188b5a73dc85562c6aa04eabb9c8e9eb695c1ce9183a7f0b0e5fb8e2d86cf1343b6c7732c7918e4d7d62e730d8eeb06ce72ddb782da02dae6d7700f37206667ddcaee48f1bb6ed15e65894cf64270f3ead841824e513dace18213ba4af81f296290375a91ec583ae9dc4aedb119d4b64b7bfd7667d2f07753a1dfe7707c9fadf65f17459ccfaf744f794010e86f610e640a7c541fb79885d5744ec3a21765407afbd8d4cb15b6ef1d07e23f0d0fd553be8e83e85f8f11eaf6918b8ed7eafddc14dba0e606c74301692670cefb31a2d46da2f0023e996034f0753ccec73bdd08a0fde138cb6ead0776ba0ce2eb82e671d7575bb6bc80cf845bfff9f0d92edd36b19e285631301c427b062481b318c0906c62f92e419170c8c4f1cebef3bda7379ef59bd3d7b3380566361e267c6e14615e8b05cedd005c1e061181c0ea661181c0eaeb2c282c33f545fff8cd36ed15047efa1fdfde71eee3dbce7e8f547fa7bf76eedbb1ca94759f4481ae50192a28eb631c1c080517790ec4450ad652b2e79c6c0e7e8e4799a99fc0c2f7a632d9f6a2d9f72506714fc6d2c839f19b04bc7a6fdb10edb097644612cc60d2116e31c3ce386391638e84e3a6ca9f4779cb8a9b27cc1168d3ed9799ea8436470011c3f63e0f4df74631f659c191d0c9c6cea3df51dad3e097ab4565fb5f468ac1e7dd55d901e5dd517343d7aaa474bf5e8a81e0dd5a39f7ab4538f6eead14c3d7aa9472bf5e86443501c7dd4a38d7a74518f269e026cdf065efd8b5e5f21f568a01efdd3a37dface4adf01e8bb117df7adef14f5af477d87a07fd5ea110e7db5d57732fa2aadafacfa4e51df21ea3b7a7d87ab67c8562b596362bd56c9694a4e57728692754ad62bd9a064a3924d4a362bd9a264ab926d4ab62b3953c90b82e2c8fe594ace56728e9273959ca7e47c251728b950c94e251729b958c9254a2e557299925d4a7a94ec56b247c95e25bd4af629b95cc9154af607c55541572a39a8e49092c34afa941c517255509ca5d3b3727a164ecfbae959363daba667d1f4ac999e25d3b3627a164ccf7ae9592e3dab755b509c8dd233117ae641cf34e899053d93a0670eee0e8a33037a26e09ea038d2af47f6f548be1eb9d723f57a645e8fc4eb91773dd2ae47d6f548ba1e39d723e57a645c8f84eb916f3dd2ad47b6f548b61eb97e30288e4ceb91683df2ac479af5c8b21e49d623c70f07c591613d12ac477ef548af1ed9d523b97ae4568fd4ea91593d12ab475ef548ab1e59d523a97ae4548f94ea91513d12fa19259f55f239259f57f205255f54f225255f56f215255f55f235255f57f20d25df54f2ada09897df51f25d25df53f27d253f50f243253f52f263253f51f253253f53f27325bf50f24b25bf52f26b25bf51f25b258f29f99d92df2bf98392c795fc51c99f943ca1e449257f56f217257f55f29492bf29f9bb92a795fc43c93f953c130cccac602732c6f43c34cadfd3dfdf7be8487f437f5fc3a1ab0ff6ef3f72f0fa866bf7f75fd1d0774defd17d07fbaec52f7fdd7c99a630d61e3dda737dc3fec37b7baf6be8bbbabfa16f5fc3eebeab0fef3d865f7ac27c69ce732df6ecdd1b6decbffe13d2ff29d3e868d327d2e4d0a678dfc65597119089e57ca9b5ba3c87569aab0efd7a3fbb78b7db70ec605f7f43bee1b0fab7e7a0fa4eefdea606fcdb3115e463fd0dc7fa7b8ef637ec3bda77a8a1b9098f7be2f8329c689952c6972e9b3274cf83ff07e76a99f7f1d90300", "privateFunctions": [ { "selector": { @@ -44,8 +44,8 @@ exports[`ContractClass creates a contract class from a contract compilation arti "isInternal": false } ], - "id": "0x1d35332467bbe78e156cd11544acc91cd65393045b1dcacbcf065bdd6ad70e83", + "id": "0x02dc42f5fd77ab2b01b47ead12ab4b22ca490c9b337d5a37954da383778551f9", "privateFunctionsRoot": "0x05fa82a96814b6294d557d507151f7ccc12f70522ec4d9d0395a90e87e8087c6", - "publicBytecodeCommitment": "0x279e2e435f2257d069c01cbbcc162c99e31cdb13aad3cc2268b99016f87aa75e" + "publicBytecodeCommitment": "0x00b38e2fc3eb0f8520f32355d7195aaa2a137dc2f8d2a69748830a05da2e5e5a" }" `; diff --git a/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap b/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap index de75383807b..797645eae84 100644 --- a/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap +++ b/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap @@ -2,10 +2,10 @@ exports[`GasToken returns canonical protocol contract 1`] = ` { - "address": AztecAddress<0x3031fab05a85bdca590affa67854fd9fe2fd2f87118bc25f664e2fb0443a8ed8>, + "address": AztecAddress<0x0d73a39da86016c0ef7a2fdad3c3bf2c47d46c89ed2f0b823e21a2ad7461d043>, "instance": { - "address": AztecAddress<0x3031fab05a85bdca590affa67854fd9fe2fd2f87118bc25f664e2fb0443a8ed8>, - "contractClassId": Fr<0x2126f223ecb60919e889e0192822d017db6fa0e46791f5b5cda3757701fecfc5>, + "address": AztecAddress<0x0d73a39da86016c0ef7a2fdad3c3bf2c47d46c89ed2f0b823e21a2ad7461d043>, + "contractClassId": Fr<0x1463ccb41e0b69bc648f16f413a5d993d70c05f7b11a5b7b9300bdcfd8b3d31f>, "initializationHash": Fr<0x0bf6e812f14bb029f7cb9c8da8367dd97c068e788d4f21007fd97014eba8cf9f>, "portalContractAddress": EthAddress<0x0000000000000000000000000000000000000000>, "publicKeysHash": Fr<0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed>, @@ -18,7 +18,7 @@ exports[`GasToken returns canonical protocol contract 1`] = ` exports[`GasToken returns canonical protocol contract 2`] = ` { "artifactHash": Fr<0x076fb6d7493b075a880eeed90fec7c4c01e0a24d442522449e4d56c26357205f>, - "id": Fr<0x2126f223ecb60919e889e0192822d017db6fa0e46791f5b5cda3757701fecfc5>, + "id": Fr<0x1463ccb41e0b69bc648f16f413a5d993d70c05f7b11a5b7b9300bdcfd8b3d31f>, "privateFunctions": [ { "isInternal": false, @@ -27,7 +27,7 @@ exports[`GasToken returns canonical protocol contract 2`] = ` }, ], "privateFunctionsRoot": Fr<0x13b29c3f4a96eb14d5d3539a6308ff9736ad5d67e3f61ffbb7da908e14980828>, - "publicBytecodeCommitment": Fr<0x1c220315e672398f017b49ceb31dcfe39aafe9965998ee57f5f58ccc0cd04623>, + "publicBytecodeCommitment": Fr<0x079241a3e691f43ee2832dedbb09a1a1780622509a2e020dba561104758f5e01>, "version": 1, } `;